update ooo310-m15
[ooovba.git] / applied_patches / 0346-svx-source-form-fmundo-cxx.diff
blobb9a37a6d3623e542bdc4489061ea988000ad25cf
1 diff --git svx/source/form/fmundo.cxx svx/source/form/fmundo.cxx
2 index ee1d592..f3b5c3d 100644
3 --- svx/source/form/fmundo.cxx
4 +++ svx/source/form/fmundo.cxx
5 @@ -86,6 +86,90 @@ using namespace ::com::sun::star::reflection;
6 using namespace ::com::sun::star::form::binding;
7 using namespace ::svxform;
10 +#include <com/sun/star/script/XScriptListener.hdl>
11 +#include <comphelper/processfactory.hxx>
12 +#include <cppuhelper/implbase1.hxx>
14 +typedef cppu::WeakImplHelper1< XScriptListener > ScriptEventListener_BASE;
15 +class ScriptEventListenerWrapper : public ScriptEventListener_BASE
17 +public:
18 + ScriptEventListenerWrapper( FmFormModel& _rModel) throw ( RuntimeException ) : pModel(&_rModel)
19 + {
20 + Reference < XPropertySet > xProps(
21 + ::comphelper::getProcessServiceFactory(), UNO_QUERY );
22 + if ( xProps.is() )
23 + {
24 + Reference< XComponentContext > xCtx( xProps->getPropertyValue(
25 + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))), UNO_QUERY );
26 + if ( xCtx.is() )
27 + {
28 + Reference< XMultiComponentFactory > xMFac(
29 + xCtx->getServiceManager(), UNO_QUERY );
30 + if ( xMFac.is() )
31 + {
32 + m_vbaListener.set( xMFac->createInstanceWithContext(
33 + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
34 + "ooo.vba.EventListener" ) ), xCtx ),
35 + UNO_QUERY_THROW );
36 + }
37 + }
38 + }
39 + }
40 + // XEventListener
41 + virtual void SAL_CALL disposing(const EventObject& ) throw( RuntimeException ){}
43 + // XScriptListener
44 + virtual void SAL_CALL firing(const ScriptEvent& evt) throw(RuntimeException)
45 + {
46 + setModel();
47 + if ( m_vbaListener.is() )
48 + {
49 + m_vbaListener->firing( evt );
50 + }
51 + }
53 + virtual Any SAL_CALL approveFiring(const ScriptEvent& evt) throw( com::sun::star::reflection::InvocationTargetException, RuntimeException)
54 + {
55 + setModel();
56 + if ( m_vbaListener.is() )
57 + {
58 + return m_vbaListener->approveFiring( evt );
59 + }
60 + return Any();
61 + }
63 +private:
64 + void setModel()
65 + {
66 + Reference< XPropertySet > xProps( m_vbaListener, UNO_QUERY );
67 + if ( xProps.is() )
68 + {
69 + try
70 + {
71 + SfxObjectShellRef xObjSh = pModel->GetObjectShell();
72 + if ( xObjSh.Is() && m_vbaListener.is() )
73 + {
74 + Any aVal;
75 + aVal <<= xObjSh->GetModel();
76 + xProps->setPropertyValue(
77 + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Model" ) ),
78 + aVal );
79 + }
80 + }
81 + catch( Exception& e )
82 + {
83 + //swallow any errors
84 + }
85 + }
86 + }
87 + FmFormModel* pModel;
88 + Reference< XScriptListener > m_vbaListener;
91 +};
93 //------------------------------------------------------------------------------
94 // some helper structs for caching property infos
95 //------------------------------------------------------------------------------
96 @@ -128,6 +212,13 @@ FmXUndoEnvironment::FmXUndoEnvironment(FmFormModel& _rModel)
97 ,m_bDisposed( false )
99 DBG_CTOR(FmXUndoEnvironment,NULL);
100 + try
102 + m_vbaListener = new ScriptEventListenerWrapper( _rModel );
104 + catch( Exception& )
109 //------------------------------------------------------------------------------
110 @@ -752,9 +843,17 @@ void FmXUndoEnvironment::switchListening( const Reference< XIndexContainer >& _r
111 if ( xManager.is() )
113 if ( _bStartListening )
115 m_pScriptingEnv->registerEventAttacherManager( xManager );
116 + if ( m_vbaListener.is() )
117 + xManager->addScriptListener( m_vbaListener );
119 else
121 m_pScriptingEnv->revokeEventAttacherManager( xManager );
122 + if ( m_vbaListener.is() )
123 + xManager->removeScriptListener( m_vbaListener );
127 // also handle all children of this element