1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #ifndef _SFX_EVENTSUPPLIER_HXX_ 25*b1cdbd2cSJim Jagielski #define _SFX_EVENTSUPPLIER_HXX_ 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XTypeProvider.hpp> 28*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameReplace.hpp> 29*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XSet.hpp> 30*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XEventListener.hpp> 31*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XEventBroadcaster.hpp> 32*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XDocumentEventBroadcaster.hpp> 33*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XDocumentEventListener.hpp> 34*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XEventsSupplier.hpp> 35*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XServiceInfo.hpp> 36*b1cdbd2cSJim Jagielski #include <com/sun/star/task/XJobExecutor.hpp> 37*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Reference.hxx> 38*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Type.hxx> 39*b1cdbd2cSJim Jagielski #include <sal/types.h> 40*b1cdbd2cSJim Jagielski #include <osl/mutex.hxx> 41*b1cdbd2cSJim Jagielski #include <cppuhelper/weak.hxx> 42*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase1.hxx> 43*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase2.hxx> 44*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase3.hxx> 45*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase4.hxx> 46*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase7.hxx> 47*b1cdbd2cSJim Jagielski #include <comphelper/sequenceashashmap.hxx> 48*b1cdbd2cSJim Jagielski #include <comphelper/sequenceasvector.hxx> 49*b1cdbd2cSJim Jagielski #include <sfx2/sfxuno.hxx> 50*b1cdbd2cSJim Jagielski 51*b1cdbd2cSJim Jagielski #include <vos/mutex.hxx> 52*b1cdbd2cSJim Jagielski #include <cppuhelper/interfacecontainer.hxx> 53*b1cdbd2cSJim Jagielski #include <svl/lstner.hxx> 54*b1cdbd2cSJim Jagielski #include <unotools/eventcfg.hxx> 55*b1cdbd2cSJim Jagielski 56*b1cdbd2cSJim Jagielski namespace comphelper 57*b1cdbd2cSJim Jagielski { 58*b1cdbd2cSJim Jagielski class NamedValueCollection; 59*b1cdbd2cSJim Jagielski } 60*b1cdbd2cSJim Jagielski 61*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------------------------------- 62*b1cdbd2cSJim Jagielski 63*b1cdbd2cSJim Jagielski #define NOSUCHELEMENTEXCEPTION ::com::sun::star::container::NoSuchElementException 64*b1cdbd2cSJim Jagielski #define XNAMEREPLACE ::com::sun::star::container::XNameReplace 65*b1cdbd2cSJim Jagielski #define DOCEVENTOBJECT ::com::sun::star::document::EventObject 66*b1cdbd2cSJim Jagielski #define XEVENTBROADCASTER ::com::sun::star::document::XEventBroadcaster 67*b1cdbd2cSJim Jagielski #define XDOCEVENTLISTENER ::com::sun::star::document::XEventListener 68*b1cdbd2cSJim Jagielski #define XEVENTSSUPPLIER ::com::sun::star::document::XEventsSupplier 69*b1cdbd2cSJim Jagielski #define XJOBEXECUTOR ::com::sun::star::task::XJobExecutor 70*b1cdbd2cSJim Jagielski #define EVENTOBJECT ::com::sun::star::lang::EventObject 71*b1cdbd2cSJim Jagielski #define ILLEGALARGUMENTEXCEPTION ::com::sun::star::lang::IllegalArgumentException 72*b1cdbd2cSJim Jagielski #define WRAPPEDTARGETEXCEPTION ::com::sun::star::lang::WrappedTargetException 73*b1cdbd2cSJim Jagielski #define ANY ::com::sun::star::uno::Any 74*b1cdbd2cSJim Jagielski #define REFERENCE ::com::sun::star::uno::Reference 75*b1cdbd2cSJim Jagielski #define WEAKREFERENCE ::com::sun::star::uno::WeakReference 76*b1cdbd2cSJim Jagielski #define RUNTIMEEXCEPTION ::com::sun::star::uno::RuntimeException 77*b1cdbd2cSJim Jagielski #define SEQUENCE ::com::sun::star::uno::Sequence 78*b1cdbd2cSJim Jagielski #define UNOTYPE ::com::sun::star::uno::Type 79*b1cdbd2cSJim Jagielski #define OUSTRING ::rtl::OUString 80*b1cdbd2cSJim Jagielski #define OINTERFACECONTAINERHELPER ::cppu::OInterfaceContainerHelper 81*b1cdbd2cSJim Jagielski 82*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------------------------------- 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski class SfxObjectShell; 85*b1cdbd2cSJim Jagielski class SfxBaseModel; 86*b1cdbd2cSJim Jagielski class SvxMacro; 87*b1cdbd2cSJim Jagielski 88*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------------------------------- 89*b1cdbd2cSJim Jagielski 90*b1cdbd2cSJim Jagielski class SfxEvents_Impl : public ::cppu::WeakImplHelper2< ::com::sun::star::container::XNameReplace, ::com::sun::star::document::XEventListener > 91*b1cdbd2cSJim Jagielski { 92*b1cdbd2cSJim Jagielski SEQUENCE< OUSTRING > maEventNames; 93*b1cdbd2cSJim Jagielski SEQUENCE< ANY > maEventData; 94*b1cdbd2cSJim Jagielski REFERENCE< XEVENTBROADCASTER > mxBroadcaster; 95*b1cdbd2cSJim Jagielski ::osl::Mutex maMutex; 96*b1cdbd2cSJim Jagielski SfxObjectShell *mpObjShell; 97*b1cdbd2cSJim Jagielski 98*b1cdbd2cSJim Jagielski sal_Bool Warn_Impl( const String& ); 99*b1cdbd2cSJim Jagielski 100*b1cdbd2cSJim Jagielski public: 101*b1cdbd2cSJim Jagielski SfxEvents_Impl( SfxObjectShell* pShell, 102*b1cdbd2cSJim Jagielski REFERENCE< XEVENTBROADCASTER > xBroadcaster ); 103*b1cdbd2cSJim Jagielski ~SfxEvents_Impl(); 104*b1cdbd2cSJim Jagielski 105*b1cdbd2cSJim Jagielski // --- XNameReplace --- 106*b1cdbd2cSJim Jagielski virtual void SAL_CALL replaceByName( const OUSTRING & aName, const ANY & aElement ) 107*b1cdbd2cSJim Jagielski throw( ILLEGALARGUMENTEXCEPTION, NOSUCHELEMENTEXCEPTION, 108*b1cdbd2cSJim Jagielski WRAPPEDTARGETEXCEPTION, RUNTIMEEXCEPTION ); 109*b1cdbd2cSJim Jagielski 110*b1cdbd2cSJim Jagielski // --- XNameAccess ( parent of XNameReplace ) --- 111*b1cdbd2cSJim Jagielski virtual ANY SAL_CALL getByName( const OUSTRING& aName ) 112*b1cdbd2cSJim Jagielski throw( NOSUCHELEMENTEXCEPTION, WRAPPEDTARGETEXCEPTION, 113*b1cdbd2cSJim Jagielski RUNTIMEEXCEPTION ); 114*b1cdbd2cSJim Jagielski virtual SEQUENCE< OUSTRING > SAL_CALL getElementNames() throw ( RUNTIMEEXCEPTION ); 115*b1cdbd2cSJim Jagielski virtual sal_Bool SAL_CALL hasByName( const OUSTRING& aName ) throw ( RUNTIMEEXCEPTION ); 116*b1cdbd2cSJim Jagielski 117*b1cdbd2cSJim Jagielski // --- XElementAccess ( parent of XNameAccess ) --- 118*b1cdbd2cSJim Jagielski virtual UNOTYPE SAL_CALL getElementType() throw ( RUNTIMEEXCEPTION ); 119*b1cdbd2cSJim Jagielski virtual sal_Bool SAL_CALL hasElements() throw ( RUNTIMEEXCEPTION ); 120*b1cdbd2cSJim Jagielski 121*b1cdbd2cSJim Jagielski // --- ::document::XEventListener --- 122*b1cdbd2cSJim Jagielski virtual void SAL_CALL notifyEvent( const DOCEVENTOBJECT& aEvent ) 123*b1cdbd2cSJim Jagielski throw( RUNTIMEEXCEPTION ); 124*b1cdbd2cSJim Jagielski 125*b1cdbd2cSJim Jagielski // --- ::lang::XEventListener --- 126*b1cdbd2cSJim Jagielski virtual void SAL_CALL disposing( const EVENTOBJECT& Source ) 127*b1cdbd2cSJim Jagielski throw( RUNTIMEEXCEPTION ); 128*b1cdbd2cSJim Jagielski 129*b1cdbd2cSJim Jagielski static SvxMacro* ConvertToMacro( const ANY& rElement, SfxObjectShell* pDoc, sal_Bool bNormalizeMacro ); 130*b1cdbd2cSJim Jagielski static void NormalizeMacro( const ANY& rIn, ANY& rOut, SfxObjectShell* pDoc ); 131*b1cdbd2cSJim Jagielski static void NormalizeMacro( 132*b1cdbd2cSJim Jagielski const ::comphelper::NamedValueCollection& i_eventDescriptor, 133*b1cdbd2cSJim Jagielski ::comphelper::NamedValueCollection& o_normalizedDescriptor, 134*b1cdbd2cSJim Jagielski SfxObjectShell* i_document ); 135*b1cdbd2cSJim Jagielski }; 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski //============================================================================= 138*b1cdbd2cSJim Jagielski struct ModelCollectionMutexBase 139*b1cdbd2cSJim Jagielski { 140*b1cdbd2cSJim Jagielski public: 141*b1cdbd2cSJim Jagielski ::osl::Mutex m_aLock; 142*b1cdbd2cSJim Jagielski }; 143*b1cdbd2cSJim Jagielski 144*b1cdbd2cSJim Jagielski //============================================================================= 145*b1cdbd2cSJim Jagielski typedef ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > > TModelList; 146*b1cdbd2cSJim Jagielski 147*b1cdbd2cSJim Jagielski //============================================================================= 148*b1cdbd2cSJim Jagielski class ModelCollectionEnumeration : public ModelCollectionMutexBase 149*b1cdbd2cSJim Jagielski , public ::cppu::WeakImplHelper1< ::com::sun::star::container::XEnumeration > 150*b1cdbd2cSJim Jagielski { 151*b1cdbd2cSJim Jagielski 152*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- 153*b1cdbd2cSJim Jagielski // member 154*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- 155*b1cdbd2cSJim Jagielski private: 156*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xSMGR; 157*b1cdbd2cSJim Jagielski TModelList m_lModels; 158*b1cdbd2cSJim Jagielski TModelList::iterator m_pEnumerationIt; 159*b1cdbd2cSJim Jagielski 160*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- 161*b1cdbd2cSJim Jagielski // native interface 162*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- 163*b1cdbd2cSJim Jagielski public: 164*b1cdbd2cSJim Jagielski ModelCollectionEnumeration(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xSMGR); 165*b1cdbd2cSJim Jagielski virtual ~ModelCollectionEnumeration(); 166*b1cdbd2cSJim Jagielski void setModelList(const TModelList& rList); 167*b1cdbd2cSJim Jagielski 168*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- 169*b1cdbd2cSJim Jagielski // uno interface 170*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- 171*b1cdbd2cSJim Jagielski public: 172*b1cdbd2cSJim Jagielski 173*b1cdbd2cSJim Jagielski // css.container.XEnumeration 174*b1cdbd2cSJim Jagielski virtual sal_Bool SAL_CALL hasMoreElements() 175*b1cdbd2cSJim Jagielski throw(::com::sun::star::uno::RuntimeException); 176*b1cdbd2cSJim Jagielski 177*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Any SAL_CALL nextElement() 178*b1cdbd2cSJim Jagielski throw(::com::sun::star::container::NoSuchElementException, 179*b1cdbd2cSJim Jagielski ::com::sun::star::lang::WrappedTargetException , 180*b1cdbd2cSJim Jagielski ::com::sun::star::uno::RuntimeException ); 181*b1cdbd2cSJim Jagielski }; 182*b1cdbd2cSJim Jagielski 183*b1cdbd2cSJim Jagielski //============================================================================= 184*b1cdbd2cSJim Jagielski class SfxGlobalEvents_Impl : public ModelCollectionMutexBase 185*b1cdbd2cSJim Jagielski , public ::cppu::WeakImplHelper7< ::com::sun::star::lang::XServiceInfo 186*b1cdbd2cSJim Jagielski , ::com::sun::star::document::XEventsSupplier 187*b1cdbd2cSJim Jagielski , ::com::sun::star::document::XEventBroadcaster 188*b1cdbd2cSJim Jagielski , ::com::sun::star::document::XDocumentEventBroadcaster 189*b1cdbd2cSJim Jagielski , ::com::sun::star::document::XEventListener 190*b1cdbd2cSJim Jagielski , ::com::sun::star::document::XDocumentEventListener 191*b1cdbd2cSJim Jagielski , ::com::sun::star::container::XSet > 192*b1cdbd2cSJim Jagielski { 193*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xSMGR; 194*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameReplace > m_xEvents; 195*b1cdbd2cSJim Jagielski ::com::sun::star::uno::WeakReference< ::com::sun::star::document::XEventListener > m_xJobExecutorListener; 196*b1cdbd2cSJim Jagielski OINTERFACECONTAINERHELPER m_aLegacyListeners; 197*b1cdbd2cSJim Jagielski OINTERFACECONTAINERHELPER m_aDocumentListeners; 198*b1cdbd2cSJim Jagielski TModelList m_lModels; 199*b1cdbd2cSJim Jagielski GlobalEventConfig* pImp; 200*b1cdbd2cSJim Jagielski 201*b1cdbd2cSJim Jagielski public: 202*b1cdbd2cSJim Jagielski SfxGlobalEvents_Impl(const com::sun::star::uno::Reference < ::com::sun::star::lang::XMultiServiceFactory >& xSMGR); 203*b1cdbd2cSJim Jagielski virtual ~SfxGlobalEvents_Impl(); 204*b1cdbd2cSJim Jagielski 205*b1cdbd2cSJim Jagielski SFX_DECL_XSERVICEINFO 206*b1cdbd2cSJim Jagielski 207*b1cdbd2cSJim Jagielski // css.document.XEventBroadcaster 208*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameReplace > SAL_CALL getEvents() 209*b1cdbd2cSJim Jagielski throw(::com::sun::star::uno::RuntimeException); 210*b1cdbd2cSJim Jagielski 211*b1cdbd2cSJim Jagielski virtual void SAL_CALL addEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::document::XEventListener >& xListener) 212*b1cdbd2cSJim Jagielski throw(::com::sun::star::uno::RuntimeException); 213*b1cdbd2cSJim Jagielski 214*b1cdbd2cSJim Jagielski virtual void SAL_CALL removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::document::XEventListener >& xListener) 215*b1cdbd2cSJim Jagielski throw(::com::sun::star::uno::RuntimeException); 216*b1cdbd2cSJim Jagielski 217*b1cdbd2cSJim Jagielski // css.document.XDocumentEventBroadcaster 218*b1cdbd2cSJim Jagielski virtual void SAL_CALL addDocumentEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::document::XDocumentEventListener >& _Listener ) throw (::com::sun::star::uno::RuntimeException); 219*b1cdbd2cSJim Jagielski virtual void SAL_CALL removeDocumentEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::document::XDocumentEventListener >& _Listener ) throw (::com::sun::star::uno::RuntimeException); 220*b1cdbd2cSJim Jagielski virtual void SAL_CALL notifyDocumentEvent( const ::rtl::OUString& _EventName, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController2 >& _ViewController, const ::com::sun::star::uno::Any& _Supplement ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException); 221*b1cdbd2cSJim Jagielski 222*b1cdbd2cSJim Jagielski // css.document.XEventListener 223*b1cdbd2cSJim Jagielski virtual void SAL_CALL notifyEvent(const ::com::sun::star::document::EventObject& aEvent) 224*b1cdbd2cSJim Jagielski throw(::com::sun::star::uno::RuntimeException); 225*b1cdbd2cSJim Jagielski 226*b1cdbd2cSJim Jagielski // css.document.XDocumentEventListener 227*b1cdbd2cSJim Jagielski virtual void SAL_CALL documentEventOccured( const ::com::sun::star::document::DocumentEvent& Event ) throw (::com::sun::star::uno::RuntimeException); 228*b1cdbd2cSJim Jagielski 229*b1cdbd2cSJim Jagielski // css.container.XSet 230*b1cdbd2cSJim Jagielski virtual sal_Bool SAL_CALL has(const ::com::sun::star::uno::Any& aElement) 231*b1cdbd2cSJim Jagielski throw(::com::sun::star::uno::RuntimeException); 232*b1cdbd2cSJim Jagielski 233*b1cdbd2cSJim Jagielski virtual void SAL_CALL insert(const ::com::sun::star::uno::Any& aElement) 234*b1cdbd2cSJim Jagielski throw(::com::sun::star::lang::IllegalArgumentException , 235*b1cdbd2cSJim Jagielski ::com::sun::star::container::ElementExistException, 236*b1cdbd2cSJim Jagielski ::com::sun::star::uno::RuntimeException ); 237*b1cdbd2cSJim Jagielski 238*b1cdbd2cSJim Jagielski virtual void SAL_CALL remove(const ::com::sun::star::uno::Any& aElement) 239*b1cdbd2cSJim Jagielski throw(::com::sun::star::lang::IllegalArgumentException , 240*b1cdbd2cSJim Jagielski ::com::sun::star::container::NoSuchElementException, 241*b1cdbd2cSJim Jagielski ::com::sun::star::uno::RuntimeException ); 242*b1cdbd2cSJim Jagielski 243*b1cdbd2cSJim Jagielski // css.container.XEnumerationAccess 244*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL createEnumeration() 245*b1cdbd2cSJim Jagielski throw(::com::sun::star::uno::RuntimeException); 246*b1cdbd2cSJim Jagielski 247*b1cdbd2cSJim Jagielski // css.container.XElementAccess 248*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Type SAL_CALL getElementType() 249*b1cdbd2cSJim Jagielski throw(::com::sun::star::uno::RuntimeException); 250*b1cdbd2cSJim Jagielski 251*b1cdbd2cSJim Jagielski virtual sal_Bool SAL_CALL hasElements() 252*b1cdbd2cSJim Jagielski throw(::com::sun::star::uno::RuntimeException); 253*b1cdbd2cSJim Jagielski 254*b1cdbd2cSJim Jagielski // css.lang.XEventListener 255*b1cdbd2cSJim Jagielski virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& aEvent) 256*b1cdbd2cSJim Jagielski throw(::com::sun::star::uno::RuntimeException); 257*b1cdbd2cSJim Jagielski 258*b1cdbd2cSJim Jagielski private: 259*b1cdbd2cSJim Jagielski 260*b1cdbd2cSJim Jagielski // threadsafe 261*b1cdbd2cSJim Jagielski void implts_notifyJobExecution(const ::com::sun::star::document::EventObject& aEvent); 262*b1cdbd2cSJim Jagielski void implts_checkAndExecuteEventBindings(const ::com::sun::star::document::DocumentEvent& aEvent); 263*b1cdbd2cSJim Jagielski void implts_notifyListener(const ::com::sun::star::document::DocumentEvent& aEvent); 264*b1cdbd2cSJim Jagielski 265*b1cdbd2cSJim Jagielski // not threadsafe 266*b1cdbd2cSJim Jagielski TModelList::iterator impl_searchDoc(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& xModel); 267*b1cdbd2cSJim Jagielski }; 268*b1cdbd2cSJim Jagielski 269*b1cdbd2cSJim Jagielski #endif 270