/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #include "precompiled_sw.hxx" #include #include #include #include #include #include #include #include #include #include namespace css = ::com::sun::star; namespace sw { namespace sidebarwindows { // ============================================================================= // declaration and implementation of // for <::accessibiliy::AccessibleTextHelper> instance // ============================================================================= class SidebarTextEditSource : public SvxEditSource, public SfxBroadcaster { public: SidebarTextEditSource( SidebarTxtControl& rSidebarTxtControl ); virtual ~SidebarTextEditSource(); virtual SvxEditSource* Clone() const; virtual SvxTextForwarder* GetTextForwarder(); virtual SvxViewForwarder* GetViewForwarder(); virtual SvxEditViewForwarder* GetEditViewForwarder( sal_Bool bCreate = sal_False ); virtual void UpdateData(); virtual SfxBroadcaster& GetBroadcaster() const; DECL_LINK( NotifyHdl, EENotify* ); private: SidebarTxtControl& mrSidebarTxtControl; SvxOutlinerForwarder mTextForwarder; SvxDrawOutlinerViewForwarder mViewForwarder; }; SidebarTextEditSource::SidebarTextEditSource( SidebarTxtControl& rSidebarTxtControl ) : SvxEditSource() , mrSidebarTxtControl( rSidebarTxtControl ) , mTextForwarder( *(rSidebarTxtControl.GetTextView()->GetOutliner()), sal_False ) , mViewForwarder( *(rSidebarTxtControl.GetTextView()) ) { if ( mrSidebarTxtControl.GetTextView() ) { mrSidebarTxtControl.GetTextView()->GetOutliner()->SetNotifyHdl( LINK(this, SidebarTextEditSource, NotifyHdl) ); } } SidebarTextEditSource::~SidebarTextEditSource() { if ( mrSidebarTxtControl.GetTextView() ) { mrSidebarTxtControl.GetTextView()->GetOutliner()->SetNotifyHdl( Link() ); } } SvxEditSource* SidebarTextEditSource::Clone() const { return new SidebarTextEditSource( mrSidebarTxtControl ); } SvxTextForwarder* SidebarTextEditSource::GetTextForwarder() { return &mTextForwarder; } SvxViewForwarder* SidebarTextEditSource::GetViewForwarder() { return &mViewForwarder; } SvxEditViewForwarder* SidebarTextEditSource::GetEditViewForwarder( sal_Bool /*bCreate*/ ) { return &mViewForwarder; } void SidebarTextEditSource::UpdateData() { // nothing to do } SfxBroadcaster& SidebarTextEditSource::GetBroadcaster() const { return *( const_cast< SidebarTextEditSource* > (this) ); } IMPL_LINK(SidebarTextEditSource, NotifyHdl, EENotify*, pNotify) { if ( pNotify ) { ::std::auto_ptr< SfxHint > aHint( SvxEditSourceHelper::EENotification2Hint( pNotify ) ); if( aHint.get() ) { Broadcast( *aHint.get() ); } } return 0; } // ============================================================================= // declaration and implementation of accessible context for instance // ============================================================================= class SidebarTxtControlAccessibleContext : public VCLXAccessibleComponent { public: explicit SidebarTxtControlAccessibleContext( SidebarTxtControl& rSidebarTxtControl ); virtual ~SidebarTxtControlAccessibleContext(); virtual sal_Int32 SAL_CALL getAccessibleChildCount() throw (::com::sun::star::uno::RuntimeException); virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleChild( sal_Int32 i ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); using WeakAggComponentImplHelperBase::addEventListener; using WeakAggComponentImplHelperBase::removeEventListener; virtual void SAL_CALL addEventListener ( const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleEventListener >& xListener) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL removeEventListener ( const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleEventListener >& xListener) throw (::com::sun::star::uno::RuntimeException); protected: virtual void ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent ); private: SidebarTxtControl& mrSidebarTxtControl; ::accessibility::AccessibleTextHelper* mpAccessibleTextHelper; ::vos::OMutex maMutex; void defunc(); }; SidebarTxtControlAccessibleContext::SidebarTxtControlAccessibleContext( SidebarTxtControl& rSidebarTxtControl ) : VCLXAccessibleComponent( rSidebarTxtControl.GetWindowPeer() ) , mrSidebarTxtControl( rSidebarTxtControl ) , mpAccessibleTextHelper( 0 ) , maMutex() { ::std::auto_ptr pEditSource( new SidebarTextEditSource( mrSidebarTxtControl ) ); mpAccessibleTextHelper = new ::accessibility::AccessibleTextHelper( pEditSource ); mpAccessibleTextHelper->SetEventSource( mrSidebarTxtControl.GetWindowPeer() ); } SidebarTxtControlAccessibleContext::~SidebarTxtControlAccessibleContext() { defunc(); } void SidebarTxtControlAccessibleContext::defunc() { delete mpAccessibleTextHelper; mpAccessibleTextHelper = 0; } sal_Int32 SAL_CALL SidebarTxtControlAccessibleContext::getAccessibleChildCount() throw (::com::sun::star::uno::RuntimeException) { vos::OGuard aGuard( maMutex ); sal_Int32 nChildCount( 0 ); if ( mpAccessibleTextHelper ) { nChildCount = mpAccessibleTextHelper->GetChildCount(); } return nChildCount; } css::uno::Reference< css::accessibility::XAccessible > SAL_CALL SidebarTxtControlAccessibleContext::getAccessibleChild( sal_Int32 i ) throw ( css::lang::IndexOutOfBoundsException, css::uno::RuntimeException ) { vos::OGuard aGuard( maMutex ); css::uno::Reference< css::accessibility::XAccessible > xChild; if ( mpAccessibleTextHelper ) { xChild = mpAccessibleTextHelper->GetChild( i ); } return xChild; } void SAL_CALL SidebarTxtControlAccessibleContext::addEventListener ( const css::uno::Reference< css::accessibility::XAccessibleEventListener >& xListener) throw (css::uno::RuntimeException) { vos::OGuard aGuard( maMutex ); if ( mpAccessibleTextHelper ) { mpAccessibleTextHelper->AddEventListener(xListener); } } void SAL_CALL SidebarTxtControlAccessibleContext::removeEventListener ( const css::uno::Reference< css::accessibility::XAccessibleEventListener >& xListener) throw (css::uno::RuntimeException) { vos::OGuard aGuard( maMutex ); if ( mpAccessibleTextHelper ) { mpAccessibleTextHelper->RemoveEventListener(xListener); } } void SidebarTxtControlAccessibleContext::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent ) { if ( mpAccessibleTextHelper ) { switch ( rVclWindowEvent.GetId() ) { case VCLEVENT_OBJECT_DYING: { defunc(); } break; case VCLEVENT_WINDOW_GETFOCUS: case VCLEVENT_CONTROL_GETFOCUS: { mpAccessibleTextHelper->SetFocus( sal_True ); } break; case VCLEVENT_WINDOW_LOSEFOCUS: case VCLEVENT_CONTROL_LOSEFOCUS: { mpAccessibleTextHelper->SetFocus( sal_False ); } break; } } VCLXAccessibleComponent::ProcessWindowEvent( rVclWindowEvent ); } // ============================================================================= // implementaion of accessible for instance // ============================================================================= SidebarTxtControlAccessible::SidebarTxtControlAccessible( SidebarTxtControl& rSidebarTxtControl ) : VCLXWindow() , mrSidebarTxtControl( rSidebarTxtControl ) { SetWindow( &mrSidebarTxtControl ); } SidebarTxtControlAccessible::~SidebarTxtControlAccessible() { } css::uno::Reference< css::accessibility::XAccessibleContext > SidebarTxtControlAccessible::CreateAccessibleContext() { SidebarTxtControlAccessibleContext* pAccContext( new SidebarTxtControlAccessibleContext( mrSidebarTxtControl ) ); css::uno::Reference< css::accessibility::XAccessibleContext > xAcc( pAccContext ); return xAcc; } } } // end of namespace sw::sidebarwindows