24#include <sfx2/strings.hrc>
31#include <com/sun/star/awt/XControl.hpp>
32#include <com/sun/star/awt/XControlContainer.hpp>
33#include <com/sun/star/awt/XDialogEventHandler.hpp>
34#include <com/sun/star/awt/XContainerWindowEventHandler.hpp>
35#include <com/sun/star/beans/XPropertySet.hpp>
36#include <com/sun/star/script/ScriptEventDescriptor.hpp>
37#include <com/sun/star/script/XScriptEventsSupplier.hpp>
38#include <com/sun/star/script/provider/XScriptProvider.hpp>
39#include <com/sun/star/script/provider/theMasterScriptProviderFactory.hpp>
40#include <com/sun/star/script/provider/XScriptProviderSupplier.hpp>
41#include <com/sun/star/script/vba/XVBACompatibility.hpp>
42#include <com/sun/star/lang/ServiceNotRegisteredException.hpp>
43#include <com/sun/star/reflection/XIdlMethod.hpp>
44#include <com/sun/star/beans/MethodConcept.hpp>
45#include <com/sun/star/beans/XMaterialHolder.hpp>
47#include <ooo/vba/XVBAToOOEventDescGen.hpp>
62 class DialogSFScriptListenerImpl :
public DialogScriptListenerImpl
66 virtual void firing_impl(
const script::ScriptEvent& aScriptEvent,
uno::Any* pRet )
override;
68 DialogSFScriptListenerImpl(
const Reference< XComponentContext >& rxContext,
const Reference< frame::XModel >& rxModel ) : DialogScriptListenerImpl( rxContext ),
m_xModel( rxModel ) {}
71 class DialogLegacyScriptListenerImpl :
public DialogSFScriptListenerImpl
74 virtual void firing_impl(
const script::ScriptEvent& aScriptEvent,
uno::Any* pRet )
override;
76 DialogLegacyScriptListenerImpl(
const Reference< XComponentContext >& rxContext,
const Reference< frame::XModel >& rxModel ) : DialogSFScriptListenerImpl( rxContext, rxModel ){}
79 class DialogUnoScriptListenerImpl :
public DialogSFScriptListenerImpl
86 virtual void firing_impl(
const script::ScriptEvent& aScriptEvent,
uno::Any* pRet )
override;
89 DialogUnoScriptListenerImpl(
const Reference< XComponentContext >& rxContext,
91 const Reference< awt::XControl >& rxControl,
92 const Reference< XInterface >& rxHandler,
93 const Reference< beans::XIntrospectionAccess >& rxIntrospectionAccess,
94 bool bDialogProviderMode );
98 class DialogVBAScriptListenerImpl :
public DialogScriptListenerImpl
104 virtual void firing_impl(
const script::ScriptEvent& aScriptEvent,
uno::Any* pRet )
override;
106 DialogVBAScriptListenerImpl(
const Reference< XComponentContext >& rxContext,
const Reference< awt::XControl >& rxControl,
const Reference< frame::XModel >& xModel, OUString sDialogLibName );
111 DialogVBAScriptListenerImpl::DialogVBAScriptListenerImpl(
const Reference< XComponentContext >& rxContext,
const Reference< awt::XControl >& rxControl,
const Reference< frame::XModel >& xModel, OUString sDialogLibName ) : DialogScriptListenerImpl( rxContext ),
msDialogLibName(
std::move( sDialogLibName ))
113 Reference< XMultiComponentFactory >
xSMgr(
m_xContext->getServiceManager() );
114 Sequence< Any >
args(1);
118 mxListener.set(
xSMgr->createInstanceWithArgumentsAndContext(
"ooo.vba.EventListener", args, m_xContext ), UNO_QUERY );
120 if ( !rxControl.is() )
125 Reference< XPropertySet > xProps( rxControl->getModel(), UNO_QUERY_THROW );
128 xProps->setPropertyValue(
"Model", args[ 0 ] );
130 catch(
const Exception& )
137 void DialogVBAScriptListenerImpl::firing_impl(
const script::ScriptEvent& aScriptEvent,
uno::Any* )
139 if ( !(aScriptEvent.ScriptType ==
"VBAInterop" &&
mxListener.is()) )
142 ScriptEvent aScriptEventCopy( aScriptEvent );
148 catch(
const Exception& )
159 :mbUseFakeVBAEvents( false ),
m_xContext( rxContext )
163 if ( rxRTLListener.is() )
166 listenersForTypes[ OUString(
"StarBasic") ] =
new DialogLegacyScriptListenerImpl( rxContext, rxModel );
168 listenersForTypes[ OUString(
"vnd.sun.star.UNO") ] =
new DialogUnoScriptListenerImpl( rxContext, rxModel, rxControl, rxHandler, rxIntrospect, bProviderMode );
169 listenersForTypes[ OUString(
"vnd.sun.star.script") ] =
new DialogSFScriptListenerImpl( rxContext, rxModel );
176 xModelProps->getPropertyValue(
"BasicLibraries"), uno::UNO_QUERY_THROW );
179 catch( uno::Exception& )
183 listenersForTypes[ OUString(
"VBAInterop") ] =
new DialogVBAScriptListenerImpl( rxContext, rxControl, rxModel, sDialogLibName );
207 if ( xVBAToOOEvtDesc.is() )
208 xEventsSupplier = xVBAToOOEvtDesc->getEventSupplier( xControl, sControlName );
211 return xEventsSupplier;
217 if ( !xEventsSupplier.is() )
223 if ( !xEventCont.is() )
228 for (
const OUString& rName : aNames )
230 ScriptEventDescriptor aDesc;
232 Any aElement = xEventCont->getByName( rName );
234 OUString sKey = aDesc.ScriptType;
235 if ( aDesc.ScriptType ==
"Script" || aDesc.ScriptType ==
"UNO" )
237 sal_Int32
nIndex = aDesc.ScriptCode.indexOf(
':' );
238 sKey = aDesc.ScriptCode.copy( 0,
nIndex );
244 bool bSuccess =
false;
248 xControlModel, xAllListener, Helper, aDesc.ListenerType,
249 aDesc.AddListenerParam, aDesc.EventMethod );
251 if ( xListener_.is() )
265 xControl, xAllListener, Helper, aDesc.ListenerType,
266 aDesc.AddListenerParam, aDesc.EventMethod );
287 if ( !xControl.is() )
288 throw IllegalArgumentException();
297 Any newHelper(xControl );
300 if ( xControlContainer.is() && !xDialog.is() )
303 sal_Int32 nControlCount = aControls.getLength();
309 for ( sal_Int32 i2 = 0; i2 < nControlCount; ++i2 )
311 pObjects2[i2].set( pControls[i2], UNO_QUERY );
323 const css::uno::Reference<css::script::XScriptListener>&,
328 ::osl::MutexGuard aGuard(
getMutex() );
337 "com.sun.star.script.EventAttacher",
m_xContext ), UNO_QUERY );
340 throw ServiceNotRegisteredException();
343 OUString sDialogCodeName;
344 sal_Int32 nObjCount =
Objects.getLength();
346 if ( xDlgControl.is() )
351 xProps->getPropertyValue(
"Name") >>= sDialogCodeName;
364 OUString sScriptType, OUString sScriptCode )
365 :m_xScriptListener( rxListener )
366 ,m_sScriptType(
std::move( sScriptType ))
367 ,m_sScriptCode(
std::move( sScriptCode ))
379 ScriptEvent aScriptEvent;
380 aScriptEvent.Source = getXWeak();
381 aScriptEvent.ListenerType = Event.ListenerType;
382 aScriptEvent.MethodName = Event.MethodName;
383 aScriptEvent.Arguments = Event.Arguments;
384 aScriptEvent.Helper = Event.Helper;
435 bool bDialogProviderMode )
436 : DialogSFScriptListenerImpl( rxContext, rxModel )
450 void DialogSFScriptListenerImpl::firing_impl(
const ScriptEvent& aScriptEvent, Any* pRet )
458 OSL_ENSURE( xSupplier.is(),
"DialogScriptListenerImpl::firing_impl: failed to get script provider supplier" );
459 if ( xSupplier.is() )
460 xScriptProvider.set( xSupplier->getScriptProvider() );
467 Reference< provider::XScriptProviderFactory >
xFactory =
468 provider::theMasterScriptProviderFactory::get( m_xContext );
471 aCtx <<= OUString(
"user");
472 xScriptProvider =
xFactory->createScriptProvider( aCtx );
476 OSL_ENSURE( xScriptProvider.is(),
"DialogScriptListenerImpl::firing_impl: failed to get script provider" );
478 if ( xScriptProvider.is() )
480 Reference< provider::XScript > xScript = xScriptProvider->getScript( aScriptEvent.ScriptCode );
481 OSL_ENSURE( xScript.is(),
"DialogScriptListenerImpl::firing_impl: failed to get script" );
485 Sequence< Any > aInParams;
486 Sequence< sal_Int16 > aOutParamsIndex;
487 Sequence< Any > aOutParams;
490 aInParams = aScriptEvent.Arguments;
492 Any aResult = xScript->invoke( aInParams, aOutParamsIndex, aOutParams );
498 catch (
const Exception& )
504 void DialogLegacyScriptListenerImpl::firing_impl(
const ScriptEvent& aScriptEvent, Any* pRet )
507 OUString sScriptCode( aScriptEvent.ScriptCode );
509 if ( aScriptEvent.ScriptType !=
"StarBasic" )
513 sal_Int32
nIndex = sScriptCode.indexOf(
':' );
514 if ( nIndex >= 0 && nIndex < sScriptCode.getLength() )
516 sScriptURL = OUString::Concat(
"vnd.sun.star.script:") +
517 sScriptCode.subView( nIndex + 1 ) +
518 "?language=Basic&location=" +
519 sScriptCode.subView( 0, nIndex );
521 ScriptEvent aSFScriptEvent( aScriptEvent );
522 aSFScriptEvent.ScriptCode = sScriptURL;
523 DialogSFScriptListenerImpl::firing_impl( aSFScriptEvent, pRet );
526 void DialogUnoScriptListenerImpl::firing_impl(
const ScriptEvent& aScriptEvent, Any* pRet )
528 OUString aMethodName = aScriptEvent.ScriptCode.copy( strlen(
"vnd.sun.star.UNO:") );
530 const Any* pArguments = aScriptEvent.Arguments.getConstArray();
531 Any aEventObject = pArguments[0];
533 bool bHandled =
false;
538 Reference< XDialogEventHandler > xDialogEventHandler(
m_xHandler, UNO_QUERY );
539 if( xDialogEventHandler.is() )
541 Reference< XDialog > xDialog(
m_xControl, UNO_QUERY );
542 bHandled = xDialogEventHandler->callHandlerMethod( xDialog, aEventObject, aMethodName );
547 Reference< XContainerWindowEventHandler > xContainerWindowEventHandler(
m_xHandler, UNO_QUERY );
548 if( xContainerWindowEventHandler.is() )
550 Reference< XWindow > xWindow(
m_xControl, UNO_QUERY );
551 bHandled = xContainerWindowEventHandler->callHandlerMethod( xWindow, aEventObject, aMethodName );
563 getMethod( aMethodName, MethodConcept::ALL - MethodConcept::DANGEROUS );
565 Reference< XMaterialHolder > xMaterialHolder =
567 Any aHandlerObject = xMaterialHolder->getMaterial();
569 Sequence< Reference< XIdlClass > > aParamTypeSeq = rxMethod->getParameterTypes();
570 sal_Int32 nParamCount = aParamTypeSeq.getLength();
571 if( nParamCount == 0 )
574 rxMethod->invoke( aHandlerObject, args );
577 else if( nParamCount == 2 )
580 Sequence<Any> Args(2);
581 Any* pArgs = Args.getArray();
584 Reference< XDialog > xDialog(
m_xControl, UNO_QUERY );
585 pArgs[0] <<= xDialog;
589 Reference< XWindow > xWindow(
m_xControl, UNO_QUERY );
590 pArgs[0] <<= xWindow;
592 pArgs[1] = aEventObject;
593 aRet = rxMethod->invoke( aHandlerObject, Args );
597 catch(
const Exception& )
610 OUString aRes(
SfxResId(STR_ERRUNOEVENTBINDUNG));
611 OUString aQuoteChar(
"\"" );
613 sal_Int32
nIndex = aRes.indexOf(
'%' );
616 aRes.subView( 0, nIndex ) +
617 aQuoteChar + aMethodName + aQuoteChar +
618 aRes.subView( nIndex + 2 );
621 VclMessageType::Warning, VclButtonsType::Ok, aOUFinal));
Reference< XComponentContext > m_xContext
static weld::MessageDialog * CreateMessageDialog(weld::Widget *pParent, VclMessageType eMessageType, VclButtonsType eButtonType, const OUString &rPrimaryMessage, const ILibreOfficeKitNotifier *pNotifier=nullptr)
virtual void SAL_CALL disposing(const css::lang::EventObject &Source) override
css::uno::Reference< css::script::XScriptListener > m_xScriptListener
DialogAllListenerImpl(const css::uno::Reference< css::script::XScriptListener > &rxListener, OUString sScriptType, OUString sScriptCode)
virtual ~DialogAllListenerImpl() override
virtual css::uno::Any SAL_CALL approveFiring(const css::script::AllEventObject &Event) override
void firing_impl(const css::script::AllEventObject &Event, css::uno::Any *pRet)
virtual void SAL_CALL firing(const css::script::AllEventObject &Event) override
css::uno::Reference< css::uno::XComponentContext > m_xContext
ListenerHash listenersForTypes
css::uno::Reference< css::script::XEventAttacher > m_xEventAttacher
virtual void SAL_CALL attachEvents(const css::uno::Sequence< css::uno::Reference< css::uno::XInterface > > &Objects, const css::uno::Reference< css::script::XScriptListener > &, const css::uno::Any &Helper) override
virtual ~DialogEventsAttacherImpl() override
css::uno::Reference< css::script::XScriptEventsSupplier > getFakeVbaEventsSupplier(const css::uno::Reference< css::awt::XControl > &xControl, OUString const &sCodeName)
css::uno::Reference< css::script::XScriptListener > const & getScriptListenerForKey(const OUString &sScriptName)
void nestedAttachEvents(const css::uno::Sequence< css::uno::Reference< css::uno::XInterface > > &Objects, const css::uno::Any &Helper, OUString &sDialogCodeName)
void attachEventsToControl(const css::uno::Reference< css::awt::XControl > &xControl, const css::uno::Reference< css::script::XScriptEventsSupplier > &events, const css::uno::Any &Helper)
virtual void SAL_CALL disposing(const css::lang::EventObject &Source) override
virtual void SAL_CALL firing(const css::script::ScriptEvent &aScriptEvent) override
virtual css::uno::Any SAL_CALL approveFiring(const css::script::ScriptEvent &aScriptEvent) override
virtual ~DialogScriptListenerImpl() override
virtual void firing_impl(const css::script::ScriptEvent &aScriptEvent, css::uno::Any *pRet)=0
#define DBG_UNHANDLED_EXCEPTION(...)
OUString msDialogCodeName
Reference< script::XScriptListener > mxListener
Reference< frame::XModel > m_xModel
Reference< awt::XControl > m_xControl
Reference< XInterface > m_xHandler
Reference< beans::XIntrospectionAccess > m_xIntrospectionAccess
bool m_bDialogProviderMode
Reference< XMultiServiceFactory > xSMgr
Reference< XSingleServiceFactory > xFactory
anonymous implementation namespace
::osl::Mutex & getMutex()
SFX2_DLLPUBLIC OUString SfxResId(TranslateId aId)
Reference< XModel > xModel