diff options
author | Kurt Zenker <kz@openoffice.org> | 2007-10-09 14:23:05 +0000 |
---|---|---|
committer | Kurt Zenker <kz@openoffice.org> | 2007-10-09 14:23:05 +0000 |
commit | 08b69c44f2339d61483a18e3b5a1912b6a8b9014 (patch) | |
tree | 58971a73fdfd6bb38647522a9c053bfb98f46458 /basctl | |
parent | 34fd7965cd38828033fc5106e9e3102ee2fe074d (diff) |
INTEGRATION: CWS basmgr03 (1.1.2); FILE ADDED
2007/07/31 08:52:40 fs 1.1.2.2: #i73331# +onDocumentModeChanged
2007/07/30 13:38:10 fs 1.1.2.1: #i73331# wrapper for notifying document-related events, obtained from a UNO instead of an SFX source
Diffstat (limited to 'basctl')
-rw-r--r-- | basctl/source/basicide/doceventnotifier.cxx | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/basctl/source/basicide/doceventnotifier.cxx b/basctl/source/basicide/doceventnotifier.cxx new file mode 100644 index 000000000000..896a773f8fd6 --- /dev/null +++ b/basctl/source/basicide/doceventnotifier.cxx @@ -0,0 +1,271 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: doceventnotifier.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: kz $ $Date: 2007-10-09 15:23:05 $ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_basctl.hxx" + +#include "doceventnotifier.hxx" +#include "scriptdocument.hxx" + +/** === begin UNO includes === **/ +#include <com/sun/star/document/XEventBroadcaster.hpp> +/** === end UNO includes === **/ + +#include <vcl/svapp.hxx> + +#include <tools/diagnose_ex.h> + +#include <comphelper/componentcontext.hxx> +#include <comphelper/processfactory.hxx> + +#include <vos/mutex.hxx> + +#include <cppuhelper/compbase1.hxx> +#include <cppuhelper/basemutex.hxx> + +//........................................................................ +namespace basctl +{ +//........................................................................ + + /** === begin UNO using === **/ + using ::com::sun::star::document::XEventBroadcaster; + using ::com::sun::star::document::XEventListener; + using ::com::sun::star::document::EventObject; + using ::com::sun::star::uno::RuntimeException; + using ::com::sun::star::uno::Reference; + using ::com::sun::star::uno::UNO_QUERY_THROW; + using ::com::sun::star::uno::Exception; + using ::com::sun::star::frame::XModel; + using ::com::sun::star::uno::UNO_QUERY; + /** === end UNO using === **/ + namespace csslang = ::com::sun::star::lang; + + //==================================================================== + //= DocumentEventNotifier_Impl + //==================================================================== + typedef ::cppu::WeakComponentImplHelper1 < XEventListener + > DocumentEventNotifier_Impl_Base; + + enum ListenerAction + { + RegisterListener, + RemoveListener + }; + + /** impl class for DocumentEventNotifier + */ + class DocumentEventNotifier_Impl :public ::boost::noncopyable + ,public ::cppu::BaseMutex + ,public DocumentEventNotifier_Impl_Base + { + public: + DocumentEventNotifier_Impl( DocumentEventListener& _rListener, const Reference< XModel >& _rxDocument ); + + // document::XEventListener + virtual void SAL_CALL notifyEvent( const EventObject& Event ) throw (RuntimeException); + + // lang::XEventListener + virtual void SAL_CALL disposing( const csslang::EventObject& Event ) throw (RuntimeException); + + // ComponentHelper + virtual void SAL_CALL disposing(); + + protected: + ~DocumentEventNotifier_Impl(); + + private: + /// determines whether the instance is already disposed + bool impl_isDisposed_nothrow() const { return m_pListener == NULL; } + + /// disposes the instance + void impl_dispose_nothrow(); + + /// registers or revokes the instance as listener at the global event broadcaster + void impl_listenerAction_nothrow( ListenerAction _eAction ); + + private: + DocumentEventListener* m_pListener; + Reference< XModel > m_xModel; + }; + + //-------------------------------------------------------------------- + DocumentEventNotifier_Impl::DocumentEventNotifier_Impl( DocumentEventListener& _rListener, const Reference< XModel >& _rxDocument ) + :DocumentEventNotifier_Impl_Base( m_aMutex ) + ,m_pListener( &_rListener ) + ,m_xModel( _rxDocument ) + { + osl_incrementInterlockedCount( &m_refCount ); + impl_listenerAction_nothrow( RegisterListener ); + osl_decrementInterlockedCount( &m_refCount ); + } + + //-------------------------------------------------------------------- + DocumentEventNotifier_Impl::~DocumentEventNotifier_Impl() + { + if ( !impl_isDisposed_nothrow() ) + { + acquire(); + dispose(); + } + } + + //-------------------------------------------------------------------- + void SAL_CALL DocumentEventNotifier_Impl::notifyEvent( const EventObject& _rEvent ) throw (RuntimeException) + { + ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); + ::osl::MutexGuard aGuard( m_aMutex ); + + OSL_PRECOND( !impl_isDisposed_nothrow(), "DocumentEventNotifier_Impl::notifyEvent: disposed, but still getting events?" ); + if ( impl_isDisposed_nothrow() ) + return; + + Reference< XModel > xDocument( _rEvent.Source, UNO_QUERY ); + OSL_ENSURE( xDocument.is(), "DocumentEventNotifier_Impl::notifyEvent: illegal source document!" ); + if ( !xDocument.is() ) + return; + ScriptDocument aDocument( xDocument ); + + struct EventEntry + { + const sal_Char* pEventName; + void (DocumentEventListener::*listenerMethod)( const ScriptDocument& _rDocument ); + }; + EventEntry aEvents[] = { + { "OnNew", &DocumentEventListener::onDocumentCreated }, + { "OnLoad", &DocumentEventListener::onDocumentOpened }, + { "OnSave", &DocumentEventListener::onDocumentSave }, + { "OnSaveDone", &DocumentEventListener::onDocumentSaveDone }, + { "OnSaveAs", &DocumentEventListener::onDocumentSaveAs }, + { "OnSaveAsDone", &DocumentEventListener::onDocumentSaveAsDone }, + { "OnUnload", &DocumentEventListener::onDocumentClosed }, + { "OnTitleChanged", &DocumentEventListener::onDocumentTitleChanged }, + { "OnModeChanged", &DocumentEventListener::onDocumentModeChanged } + }; + + for ( size_t i=0; i < sizeof( aEvents ) / sizeof( aEvents[0] ); ++i ) + { + if ( _rEvent.EventName.equalsAscii( aEvents[i].pEventName ) ) + (m_pListener->*aEvents[i].listenerMethod)( aDocument ); + } + } + + //-------------------------------------------------------------------- + void SAL_CALL DocumentEventNotifier_Impl::disposing( const csslang::EventObject& /*Event*/ ) throw (RuntimeException) + { + ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); + ::osl::MutexGuard aGuard( m_aMutex ); + + if ( !impl_isDisposed_nothrow() ) + impl_dispose_nothrow(); + } + + //-------------------------------------------------------------------- + void SAL_CALL DocumentEventNotifier_Impl::disposing() + { + impl_listenerAction_nothrow( RemoveListener ); + impl_dispose_nothrow(); + } + + //-------------------------------------------------------------------- + void DocumentEventNotifier_Impl::impl_dispose_nothrow() + { + m_pListener = NULL; + m_xModel.clear(); + } + + //-------------------------------------------------------------------- + void DocumentEventNotifier_Impl::impl_listenerAction_nothrow( ListenerAction _eAction ) + { + try + { + Reference< XEventBroadcaster > xBroadcaster; + if ( m_xModel.is() ) + xBroadcaster.set( m_xModel, UNO_QUERY_THROW ); + else + { + ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() ); + xBroadcaster.set( + aContext.createComponent( "com.sun.star.frame.GlobalEventBroadcaster" ), + UNO_QUERY_THROW ); + } + + void ( SAL_CALL XEventBroadcaster::*listenerAction )( const Reference< XEventListener >& ) = + ( _eAction == RegisterListener ) ? &XEventBroadcaster::addEventListener : &XEventBroadcaster::removeEventListener; + (xBroadcaster.get()->*listenerAction)( this ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + } + + //==================================================================== + //= DocumentEventNotifier + //==================================================================== + //-------------------------------------------------------------------- + DocumentEventNotifier::DocumentEventNotifier( DocumentEventListener& _rListener, const Reference< XModel >& _rxDocument ) + :m_pImpl( new DocumentEventNotifier_Impl( _rListener, _rxDocument ) ) + { + } + + //-------------------------------------------------------------------- + DocumentEventNotifier::DocumentEventNotifier( DocumentEventListener& _rListener ) + :m_pImpl( new DocumentEventNotifier_Impl( _rListener, Reference< XModel >() ) ) + { + } + + //-------------------------------------------------------------------- + DocumentEventNotifier::~DocumentEventNotifier() + { + } + + //-------------------------------------------------------------------- + void DocumentEventNotifier::dispose() + { + ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); + m_pImpl->dispose(); + } + + //==================================================================== + //= DocumentEventListener + //==================================================================== + DocumentEventListener::~DocumentEventListener() + { + } + +//........................................................................ +} // namespace basctl +//........................................................................ |