Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "dlgevtatt.hxx"
21 :
22 : #include "dlgprov.hxx"
23 :
24 : #include <sfx2/sfx.hrc>
25 : #include <sfx2/app.hxx>
26 : #include <vcl/msgbox.hxx>
27 : #include <tools/diagnose_ex.h>
28 :
29 : #include <com/sun/star/awt/XControl.hpp>
30 : #include <com/sun/star/awt/XControlContainer.hpp>
31 : #include <com/sun/star/awt/XDialogEventHandler.hpp>
32 : #include <com/sun/star/awt/XContainerWindowEventHandler.hpp>
33 : #include <com/sun/star/beans/XPropertySet.hpp>
34 : #include <com/sun/star/script/ScriptEventDescriptor.hpp>
35 : #include <com/sun/star/script/XScriptEventsSupplier.hpp>
36 : #include <com/sun/star/script/provider/XScriptProvider.hpp>
37 : #include <com/sun/star/script/provider/theMasterScriptProviderFactory.hpp>
38 : #include <com/sun/star/script/provider/XScriptProviderSupplier.hpp>
39 : #include <com/sun/star/script/vba/XVBACompatibility.hpp>
40 : #include <com/sun/star/lang/NoSuchMethodException.hpp>
41 : #include <com/sun/star/reflection/XIdlMethod.hpp>
42 : #include <com/sun/star/beans/MethodConcept.hpp>
43 : #include <com/sun/star/beans/XMaterialHolder.hpp>
44 :
45 : #include <ooo/vba/XVBAToOOEventDescGen.hpp>
46 :
47 : using namespace ::com::sun::star;
48 : using namespace ::com::sun::star::awt;
49 : using namespace ::com::sun::star::beans;
50 : using namespace ::com::sun::star::lang;
51 : using namespace ::com::sun::star::script;
52 : using namespace ::com::sun::star::uno;
53 : using namespace ::com::sun::star::reflection;
54 :
55 :
56 :
57 : namespace dlgprov
58 : {
59 :
60 0 : class DialogSFScriptListenerImpl : public DialogScriptListenerImpl
61 : {
62 : protected:
63 : Reference< frame::XModel > m_xModel;
64 : virtual void firing_impl( const script::ScriptEvent& aScriptEvent, uno::Any* pRet ) SAL_OVERRIDE;
65 : public:
66 0 : DialogSFScriptListenerImpl( const Reference< XComponentContext >& rxContext, const Reference< frame::XModel >& rxModel ) : DialogScriptListenerImpl( rxContext ), m_xModel( rxModel ) {}
67 : };
68 :
69 0 : class DialogLegacyScriptListenerImpl : public DialogSFScriptListenerImpl
70 : {
71 : protected:
72 : virtual void firing_impl( const script::ScriptEvent& aScriptEvent, uno::Any* pRet ) SAL_OVERRIDE;
73 : public:
74 0 : DialogLegacyScriptListenerImpl( const Reference< XComponentContext >& rxContext, const Reference< frame::XModel >& rxModel ) : DialogSFScriptListenerImpl( rxContext, rxModel ){}
75 : };
76 :
77 0 : class DialogUnoScriptListenerImpl : public DialogSFScriptListenerImpl
78 : {
79 : Reference< awt::XControl > m_xControl;
80 : Reference< XInterface > m_xHandler;
81 : Reference< beans::XIntrospectionAccess > m_xIntrospectionAccess;
82 : bool m_bDialogProviderMode;
83 :
84 : virtual void firing_impl( const script::ScriptEvent& aScriptEvent, uno::Any* pRet ) SAL_OVERRIDE;
85 :
86 : public:
87 : DialogUnoScriptListenerImpl( const Reference< XComponentContext >& rxContext,
88 : const Reference< frame::XModel >& rxModel,
89 : const Reference< awt::XControl >& rxControl,
90 : const Reference< XInterface >& rxHandler,
91 : const Reference< beans::XIntrospectionAccess >& rxIntrospectionAccess,
92 : bool bDialogProviderMode ); // false: ContainerWindowProvider mode
93 :
94 : };
95 :
96 0 : class DialogVBAScriptListenerImpl : public DialogScriptListenerImpl
97 : {
98 : protected:
99 : OUString msDialogCodeName;
100 : OUString msDialogLibName;
101 : Reference< script::XScriptListener > mxListener;
102 : virtual void firing_impl( const script::ScriptEvent& aScriptEvent, uno::Any* pRet ) SAL_OVERRIDE;
103 : public:
104 : DialogVBAScriptListenerImpl( const Reference< XComponentContext >& rxContext, const Reference< awt::XControl >& rxControl, const Reference< frame::XModel >& xModel, const OUString& sDialogLibName );
105 : };
106 :
107 0 : DialogVBAScriptListenerImpl::DialogVBAScriptListenerImpl( const Reference< XComponentContext >& rxContext, const Reference< awt::XControl >& rxControl, const Reference< frame::XModel >& xModel, const OUString& sDialogLibName ) : DialogScriptListenerImpl( rxContext ), msDialogLibName( sDialogLibName )
108 : {
109 0 : Reference< XMultiComponentFactory > xSMgr( m_xContext->getServiceManager() );
110 0 : Sequence< Any > args(1);
111 0 : if ( xSMgr.is() )
112 : {
113 0 : args[0] <<= xModel;
114 0 : mxListener = Reference< XScriptListener >( xSMgr->createInstanceWithArgumentsAndContext( OUString( "ooo.vba.EventListener" ), args, m_xContext ), UNO_QUERY );
115 : }
116 0 : if ( rxControl.is() )
117 : {
118 : try
119 : {
120 0 : Reference< XPropertySet > xProps( rxControl->getModel(), UNO_QUERY_THROW );
121 0 : xProps->getPropertyValue("Name") >>= msDialogCodeName;
122 0 : xProps.set( mxListener, UNO_QUERY_THROW );
123 0 : xProps->setPropertyValue("Model", args[ 0 ] );
124 : }
125 0 : catch( const Exception& )
126 : {
127 : DBG_UNHANDLED_EXCEPTION();
128 : }
129 0 : }
130 :
131 0 : }
132 :
133 0 : void DialogVBAScriptListenerImpl::firing_impl( const script::ScriptEvent& aScriptEvent, uno::Any* )
134 : {
135 0 : if ( aScriptEvent.ScriptType == "VBAInterop" && mxListener.is() )
136 : {
137 0 : ScriptEvent aScriptEventCopy( aScriptEvent );
138 0 : aScriptEventCopy.ScriptCode = msDialogLibName.concat( OUString( "." ) ).concat( msDialogCodeName );
139 : try
140 : {
141 0 : mxListener->firing( aScriptEventCopy );
142 : }
143 0 : catch( const Exception& )
144 : {
145 : DBG_UNHANDLED_EXCEPTION();
146 0 : }
147 : }
148 0 : }
149 :
150 :
151 :
152 :
153 : // DialogEventsAttacherImpl
154 :
155 :
156 0 : DialogEventsAttacherImpl::DialogEventsAttacherImpl( const Reference< XComponentContext >& rxContext, const Reference< frame::XModel >& rxModel, const Reference< awt::XControl >& rxControl, const Reference< XInterface >& rxHandler, const Reference< beans::XIntrospectionAccess >& rxIntrospect, bool bProviderMode, const Reference< script::XScriptListener >& rxRTLListener, const OUString& sDialogLibName )
157 0 : :mbUseFakeVBAEvents( false ), m_xContext( rxContext )
158 : {
159 : // key listeners by protocol when ScriptType = 'Script'
160 : // otherwise key is the ScriptType e.g. StarBasic
161 0 : if ( rxRTLListener.is() ) // set up handler for RTL_BASIC
162 0 : listernersForTypes[ OUString("StarBasic") ] = rxRTLListener;
163 : else
164 0 : listernersForTypes[ OUString("StarBasic") ] = new DialogLegacyScriptListenerImpl( rxContext, rxModel );
165 : // handler for Script & OUString("vnd.sun.star.UNO:")
166 0 : listernersForTypes[ OUString("vnd.sun.star.UNO") ] = new DialogUnoScriptListenerImpl( rxContext, rxModel, rxControl, rxHandler, rxIntrospect, bProviderMode );
167 0 : listernersForTypes[ OUString("vnd.sun.star.script") ] = new DialogSFScriptListenerImpl( rxContext, rxModel );
168 :
169 : // determine the VBA compatibility mode from the Basic library container
170 : try
171 : {
172 0 : uno::Reference< beans::XPropertySet > xModelProps( rxModel, uno::UNO_QUERY_THROW );
173 : uno::Reference< script::vba::XVBACompatibility > xVBACompat(
174 0 : xModelProps->getPropertyValue("BasicLibraries"), uno::UNO_QUERY_THROW );
175 0 : mbUseFakeVBAEvents = xVBACompat->getVBACompatibilityMode();
176 : }
177 0 : catch( uno::Exception& )
178 : {
179 : }
180 0 : if ( mbUseFakeVBAEvents )
181 0 : listernersForTypes[ OUString("VBAInterop") ] = new DialogVBAScriptListenerImpl( rxContext, rxControl, rxModel, sDialogLibName );
182 0 : }
183 :
184 :
185 :
186 0 : DialogEventsAttacherImpl::~DialogEventsAttacherImpl()
187 : {
188 0 : }
189 :
190 :
191 : Reference< script::XScriptListener >
192 0 : DialogEventsAttacherImpl::getScriptListenerForKey( const OUString& sKey ) throw ( RuntimeException )
193 : {
194 0 : ListenerHash::iterator it = listernersForTypes.find( sKey );
195 0 : if ( it == listernersForTypes.end() )
196 0 : throw RuntimeException(); // more text info here please
197 0 : return it->second;
198 : }
199 0 : Reference< XScriptEventsSupplier > DialogEventsAttacherImpl::getFakeVbaEventsSupplier( const Reference< XControl >& xControl, OUString& sControlName )
200 : {
201 0 : Reference< XScriptEventsSupplier > xEventsSupplier;
202 0 : Reference< XMultiComponentFactory > xSMgr( m_xContext->getServiceManager() );
203 0 : if ( xSMgr.is() )
204 : {
205 0 : Reference< ooo::vba::XVBAToOOEventDescGen > xVBAToOOEvtDesc( xSMgr->createInstanceWithContext("ooo.vba.VBAToOOEventDesc", m_xContext ), UNO_QUERY );
206 0 : if ( xVBAToOOEvtDesc.is() )
207 0 : xEventsSupplier.set( xVBAToOOEvtDesc->getEventSupplier( xControl, sControlName ), UNO_QUERY );
208 :
209 : }
210 0 : return xEventsSupplier;
211 : }
212 :
213 :
214 0 : void SAL_CALL DialogEventsAttacherImpl::attachEventsToControl( const Reference< XControl>& xControl, const Reference< XScriptEventsSupplier >& xEventsSupplier, const Any& Helper )
215 : {
216 0 : if ( xEventsSupplier.is() )
217 : {
218 0 : Reference< container::XNameContainer > xEventCont = xEventsSupplier->getEvents();
219 :
220 0 : Reference< XControlModel > xControlModel = xControl->getModel();
221 0 : Reference< XPropertySet > xProps( xControlModel, uno::UNO_QUERY );
222 0 : OUString sName;
223 0 : xProps->getPropertyValue("Name") >>= sName;
224 0 : if ( xEventCont.is() )
225 : {
226 0 : Sequence< OUString > aNames = xEventCont->getElementNames();
227 0 : const OUString* pNames = aNames.getConstArray();
228 0 : sal_Int32 nNameCount = aNames.getLength();
229 :
230 0 : for ( sal_Int32 j = 0; j < nNameCount; ++j )
231 : {
232 0 : ScriptEventDescriptor aDesc;
233 :
234 0 : Any aElement = xEventCont->getByName( pNames[ j ] );
235 0 : aElement >>= aDesc;
236 0 : OUString sKey = aDesc.ScriptType;
237 0 : if ( aDesc.ScriptType == "Script" || aDesc.ScriptType == "UNO" )
238 : {
239 0 : sal_Int32 nIndex = aDesc.ScriptCode.indexOf( ':' );
240 0 : sKey = aDesc.ScriptCode.copy( 0, nIndex );
241 : }
242 : Reference< XAllListener > xAllListener =
243 0 : new DialogAllListenerImpl( getScriptListenerForKey( sKey ), aDesc.ScriptType, aDesc.ScriptCode );
244 :
245 : // try first to attach event to the ControlModel
246 0 : bool bSuccess = false;
247 : try
248 : {
249 0 : Reference< XEventListener > xListener_ = m_xEventAttacher->attachSingleEventListener(
250 : xControlModel, xAllListener, Helper, aDesc.ListenerType,
251 0 : aDesc.AddListenerParam, aDesc.EventMethod );
252 :
253 0 : if ( xListener_.is() )
254 0 : bSuccess = true;
255 : }
256 0 : catch ( const Exception& )
257 : {
258 : DBG_UNHANDLED_EXCEPTION();
259 : }
260 :
261 : try
262 : {
263 : // if we had no success, try to attach to the control
264 0 : if ( !bSuccess )
265 : {
266 0 : Reference< XEventListener > xListener_ = m_xEventAttacher->attachSingleEventListener(
267 : xControl, xAllListener, Helper, aDesc.ListenerType,
268 0 : aDesc.AddListenerParam, aDesc.EventMethod );
269 : }
270 : }
271 0 : catch ( const Exception& )
272 : {
273 : DBG_UNHANDLED_EXCEPTION();
274 : }
275 0 : }
276 0 : }
277 : }
278 0 : }
279 :
280 :
281 0 : void DialogEventsAttacherImpl::nestedAttachEvents( const Sequence< Reference< XInterface > >& Objects, const Any& Helper, OUString& sDialogCodeName )
282 : {
283 0 : const Reference< XInterface >* pObjects = Objects.getConstArray();
284 0 : sal_Int32 nObjCount = Objects.getLength();
285 :
286 0 : for ( sal_Int32 i = 0; i < nObjCount; ++i )
287 : {
288 : // We know that we have to do with instances of XControl.
289 : // Otherwise this is not the right implementation for
290 : // XScriptEventsAttacher and we have to give up.
291 0 : Reference< XControl > xControl( pObjects[ i ], UNO_QUERY );
292 0 : Reference< XControlContainer > xControlContainer( xControl, UNO_QUERY );
293 0 : Reference< XDialog > xDialog( xControl, UNO_QUERY );
294 0 : if ( !xControl.is() )
295 0 : throw IllegalArgumentException();
296 :
297 : // get XEventsSupplier from control model
298 0 : Reference< XControlModel > xControlModel = xControl->getModel();
299 0 : Reference< XScriptEventsSupplier > xEventsSupplier( xControlModel, UNO_QUERY );
300 0 : attachEventsToControl( xControl, xEventsSupplier, Helper );
301 0 : if ( mbUseFakeVBAEvents )
302 : {
303 0 : xEventsSupplier.set( getFakeVbaEventsSupplier( xControl, sDialogCodeName ) );
304 0 : Any newHelper(xControl );
305 0 : attachEventsToControl( xControl, xEventsSupplier, newHelper );
306 : }
307 0 : if ( xControlContainer.is() && !xDialog.is() )
308 : {
309 0 : Sequence< Reference< XControl > > aControls = xControlContainer->getControls();
310 0 : sal_Int32 nControlCount = aControls.getLength();
311 :
312 0 : Sequence< Reference< XInterface > > aObjects( nControlCount );
313 0 : Reference< XInterface >* pObjects2 = aObjects.getArray();
314 0 : const Reference< XControl >* pControls = aControls.getConstArray();
315 :
316 0 : for ( sal_Int32 i2 = 0; i2 < nControlCount; ++i2 )
317 : {
318 0 : pObjects2[i2] = Reference< XInterface >( pControls[i2], UNO_QUERY );
319 : }
320 0 : nestedAttachEvents( aObjects, Helper, sDialogCodeName );
321 : }
322 0 : }
323 0 : }
324 :
325 :
326 : // XScriptEventsAttacher
327 :
328 :
329 0 : void SAL_CALL DialogEventsAttacherImpl::attachEvents( const Sequence< Reference< XInterface > >& Objects,
330 : const com::sun::star::uno::Reference<com::sun::star::script::XScriptListener>&,
331 : const Any& Helper )
332 : throw (IllegalArgumentException, IntrospectionException, CannotCreateAdapterException,
333 : ServiceNotRegisteredException, RuntimeException, std::exception)
334 : {
335 : // get EventAttacher
336 : {
337 0 : ::osl::MutexGuard aGuard( getMutex() );
338 :
339 0 : if ( !m_xEventAttacher.is() )
340 : {
341 0 : Reference< XMultiComponentFactory > xSMgr( m_xContext->getServiceManager() );
342 0 : if ( xSMgr.is() )
343 : {
344 0 : m_xEventAttacher = Reference< XEventAttacher >( xSMgr->createInstanceWithContext(
345 0 : OUString( "com.sun.star.script.EventAttacher" ), m_xContext ), UNO_QUERY );
346 :
347 0 : if ( !m_xEventAttacher.is() )
348 0 : throw ServiceNotRegisteredException();
349 : }
350 : else
351 : {
352 0 : throw RuntimeException();
353 0 : }
354 :
355 0 : }
356 : }
357 0 : OUString sDialogCodeName;
358 0 : sal_Int32 nObjCount = Objects.getLength();
359 0 : Reference< awt::XControl > xDlgControl( Objects[ nObjCount - 1 ], uno::UNO_QUERY ); // last object is the dialog
360 0 : if ( xDlgControl.is() )
361 : {
362 0 : Reference< XPropertySet > xProps( xDlgControl->getModel(), UNO_QUERY );
363 : try
364 : {
365 0 : xProps->getPropertyValue("Name") >>= sDialogCodeName;
366 : }
367 0 : catch( Exception& ){}
368 : }
369 : // go over all objects
370 0 : nestedAttachEvents( Objects, Helper, sDialogCodeName );
371 0 : }
372 :
373 :
374 :
375 : // DialogAllListenerImpl
376 :
377 :
378 0 : DialogAllListenerImpl::DialogAllListenerImpl( const Reference< XScriptListener >& rxListener,
379 : const OUString& rScriptType, const OUString& rScriptCode )
380 : :m_xScriptListener( rxListener )
381 : ,m_sScriptType( rScriptType )
382 0 : ,m_sScriptCode( rScriptCode )
383 : {
384 0 : }
385 :
386 :
387 :
388 0 : DialogAllListenerImpl::~DialogAllListenerImpl()
389 : {
390 0 : }
391 :
392 :
393 :
394 0 : void DialogAllListenerImpl::firing_impl( const AllEventObject& Event, Any* pRet )
395 : {
396 0 : ScriptEvent aScriptEvent;
397 0 : aScriptEvent.Source = (OWeakObject *)this; // get correct XInterface
398 0 : aScriptEvent.ListenerType = Event.ListenerType;
399 0 : aScriptEvent.MethodName = Event.MethodName;
400 0 : aScriptEvent.Arguments = Event.Arguments;
401 0 : aScriptEvent.Helper = Event.Helper;
402 0 : aScriptEvent.ScriptType = m_sScriptType;
403 0 : aScriptEvent.ScriptCode = m_sScriptCode;
404 :
405 0 : if ( m_xScriptListener.is() )
406 : {
407 0 : if ( pRet )
408 0 : *pRet = m_xScriptListener->approveFiring( aScriptEvent );
409 : else
410 0 : m_xScriptListener->firing( aScriptEvent );
411 0 : }
412 0 : }
413 :
414 :
415 : // XEventListener
416 :
417 :
418 0 : void DialogAllListenerImpl::disposing(const EventObject& ) throw ( RuntimeException, std::exception )
419 : {
420 0 : }
421 :
422 :
423 : // XAllListener
424 :
425 :
426 0 : void DialogAllListenerImpl::firing( const AllEventObject& Event ) throw ( RuntimeException, std::exception )
427 : {
428 : //::osl::MutexGuard aGuard( getMutex() );
429 :
430 0 : firing_impl( Event, NULL );
431 0 : }
432 :
433 :
434 :
435 0 : Any DialogAllListenerImpl::approveFiring( const AllEventObject& Event )
436 : throw ( reflection::InvocationTargetException, RuntimeException, std::exception )
437 : {
438 : //::osl::MutexGuard aGuard( getMutex() );
439 :
440 0 : Any aReturn;
441 0 : firing_impl( Event, &aReturn );
442 0 : return aReturn;
443 : }
444 :
445 :
446 :
447 : // DialogScriptListenerImpl
448 :
449 :
450 0 : DialogUnoScriptListenerImpl::DialogUnoScriptListenerImpl( const Reference< XComponentContext >& rxContext,
451 : const Reference< ::com::sun::star::frame::XModel >& rxModel,
452 : const Reference< ::com::sun::star::awt::XControl >& rxControl,
453 : const Reference< ::com::sun::star::uno::XInterface >& rxHandler,
454 : const Reference< ::com::sun::star::beans::XIntrospectionAccess >& rxIntrospectionAccess,
455 : bool bDialogProviderMode )
456 : : DialogSFScriptListenerImpl( rxContext, rxModel )
457 : ,m_xControl( rxControl )
458 : ,m_xHandler( rxHandler )
459 : ,m_xIntrospectionAccess( rxIntrospectionAccess )
460 0 : ,m_bDialogProviderMode( bDialogProviderMode )
461 : {
462 0 : }
463 :
464 :
465 :
466 0 : DialogScriptListenerImpl::~DialogScriptListenerImpl()
467 : {
468 0 : }
469 :
470 :
471 0 : void DialogSFScriptListenerImpl::firing_impl( const ScriptEvent& aScriptEvent, Any* pRet )
472 : {
473 : try
474 : {
475 0 : Reference< provider::XScriptProvider > xScriptProvider;
476 0 : if ( m_xModel.is() )
477 : {
478 0 : Reference< provider::XScriptProviderSupplier > xSupplier( m_xModel, UNO_QUERY );
479 : OSL_ENSURE( xSupplier.is(), "DialogScriptListenerImpl::firing_impl: failed to get script provider supplier" );
480 0 : if ( xSupplier.is() )
481 0 : xScriptProvider.set( xSupplier->getScriptProvider() );
482 : }
483 : else
484 : {
485 : OSL_ASSERT( m_xContext.is() );
486 0 : if ( m_xContext.is() )
487 : {
488 : Reference< provider::XScriptProviderFactory > xFactory =
489 0 : provider::theMasterScriptProviderFactory::get( m_xContext );
490 :
491 0 : Any aCtx;
492 0 : aCtx <<= OUString("user");
493 0 : xScriptProvider.set( xFactory->createScriptProvider( aCtx ), UNO_QUERY );
494 : }
495 : }
496 :
497 : OSL_ENSURE( xScriptProvider.is(), "DialogScriptListenerImpl::firing_impl: failed to get script provider" );
498 :
499 0 : if ( xScriptProvider.is() )
500 : {
501 0 : Reference< provider::XScript > xScript = xScriptProvider->getScript( aScriptEvent.ScriptCode );
502 : OSL_ENSURE( xScript.is(), "DialogScriptListenerImpl::firing_impl: failed to get script" );
503 :
504 0 : if ( xScript.is() )
505 : {
506 0 : Sequence< Any > aInParams;
507 0 : Sequence< sal_Int16 > aOutParamsIndex;
508 0 : Sequence< Any > aOutParams;
509 :
510 : // get arguments for script
511 0 : aInParams = aScriptEvent.Arguments;
512 :
513 0 : Any aResult = xScript->invoke( aInParams, aOutParamsIndex, aOutParams );
514 0 : if ( pRet )
515 0 : *pRet = aResult;
516 0 : }
517 0 : }
518 : }
519 0 : catch ( const Exception& )
520 : {
521 : DBG_UNHANDLED_EXCEPTION();
522 : }
523 0 : }
524 :
525 0 : void DialogLegacyScriptListenerImpl::firing_impl( const ScriptEvent& aScriptEvent, Any* pRet )
526 : {
527 0 : OUString sScriptURL;
528 0 : OUString sScriptCode( aScriptEvent.ScriptCode );
529 :
530 0 : if ( aScriptEvent.ScriptType.equalsAscii( "StarBasic" ) )
531 : {
532 : // StarBasic script: convert ScriptCode to scriptURL
533 0 : sal_Int32 nIndex = sScriptCode.indexOf( ':' );
534 0 : if ( nIndex >= 0 && nIndex < sScriptCode.getLength() )
535 : {
536 0 : sScriptURL = "vnd.sun.star.script:";
537 0 : sScriptURL += sScriptCode.copy( nIndex + 1 );
538 0 : sScriptURL += "?language=Basic&location=";
539 0 : sScriptURL += sScriptCode.copy( 0, nIndex );
540 : }
541 0 : ScriptEvent aSFScriptEvent( aScriptEvent );
542 0 : aSFScriptEvent.ScriptCode = sScriptURL;
543 0 : DialogSFScriptListenerImpl::firing_impl( aSFScriptEvent, pRet );
544 0 : }
545 0 : }
546 :
547 0 : void DialogUnoScriptListenerImpl::firing_impl( const ScriptEvent& aScriptEvent, Any* pRet )
548 : {
549 0 : static OUString sUnoURLScheme("vnd.sun.star.UNO:");
550 :
551 0 : OUString aMethodName = aScriptEvent.ScriptCode.copy( sUnoURLScheme.getLength() );
552 :
553 0 : const Any* pArguments = aScriptEvent.Arguments.getConstArray();
554 0 : Any aEventObject = pArguments[0];
555 :
556 0 : bool bHandled = false;
557 0 : if( m_xHandler.is() )
558 : {
559 0 : if( m_bDialogProviderMode )
560 : {
561 0 : Reference< XDialogEventHandler > xDialogEventHandler( m_xHandler, UNO_QUERY );
562 0 : if( xDialogEventHandler.is() )
563 : {
564 0 : Reference< XDialog > xDialog( m_xControl, UNO_QUERY );
565 0 : bHandled = xDialogEventHandler->callHandlerMethod( xDialog, aEventObject, aMethodName );
566 0 : }
567 : }
568 : else
569 : {
570 0 : Reference< XContainerWindowEventHandler > xContainerWindowEventHandler( m_xHandler, UNO_QUERY );
571 0 : if( xContainerWindowEventHandler.is() )
572 : {
573 0 : Reference< XWindow > xWindow( m_xControl, UNO_QUERY );
574 0 : bHandled = xContainerWindowEventHandler->callHandlerMethod( xWindow, aEventObject, aMethodName );
575 0 : }
576 : }
577 : }
578 :
579 0 : Any aRet;
580 0 : if( !bHandled && m_xIntrospectionAccess.is() )
581 : {
582 : try
583 : {
584 : // Methode ansprechen
585 0 : const Reference< XIdlMethod >& rxMethod = m_xIntrospectionAccess->
586 0 : getMethod( aMethodName, MethodConcept::ALL - MethodConcept::DANGEROUS );
587 :
588 : Reference< XMaterialHolder > xMaterialHolder =
589 0 : Reference< XMaterialHolder >::query( m_xIntrospectionAccess );
590 0 : Any aHandlerObject = xMaterialHolder->getMaterial();
591 :
592 0 : Sequence< Reference< XIdlClass > > aParamTypeSeq = rxMethod->getParameterTypes();
593 0 : sal_Int32 nParamCount = aParamTypeSeq.getLength();
594 0 : if( nParamCount == 0 )
595 : {
596 0 : Sequence<Any> args;
597 0 : rxMethod->invoke( aHandlerObject, args );
598 0 : bHandled = true;
599 : }
600 0 : else if( nParamCount == 2 )
601 : {
602 : // Signature check automatically done by reflection
603 0 : Sequence<Any> Args(2);
604 0 : Any* pArgs = Args.getArray();
605 0 : if( m_bDialogProviderMode )
606 : {
607 0 : Reference< XDialog > xDialog( m_xControl, UNO_QUERY );
608 0 : pArgs[0] <<= xDialog;
609 : }
610 : else
611 : {
612 0 : Reference< XWindow > xWindow( m_xControl, UNO_QUERY );
613 0 : pArgs[0] <<= xWindow;
614 : }
615 0 : pArgs[1] = aEventObject;
616 0 : aRet = rxMethod->invoke( aHandlerObject, Args );
617 0 : bHandled = true;
618 0 : }
619 : }
620 0 : catch( const Exception& )
621 : {
622 : DBG_UNHANDLED_EXCEPTION();
623 : }
624 : }
625 :
626 0 : if( bHandled )
627 : {
628 0 : if( pRet )
629 0 : *pRet = aRet;
630 : }
631 : else
632 : {
633 0 : ResMgr* pResMgr = SFX_APP()->GetSfxResManager();
634 0 : if( pResMgr )
635 : {
636 0 : OUString aRes( ResId(STR_ERRUNOEVENTBINDUNG, *pResMgr) );
637 0 : OUString aQuoteChar( "\"" );
638 :
639 0 : OUString aOURes = aRes;
640 0 : sal_Int32 nIndex = aOURes.indexOf( '%' );
641 :
642 0 : OUString aOUFinal;
643 0 : aOUFinal += aOURes.copy( 0, nIndex );
644 0 : aOUFinal += aQuoteChar;
645 0 : aOUFinal += aMethodName;
646 0 : aOUFinal += aQuoteChar;
647 0 : aOUFinal += aOURes.copy( nIndex + 2 );
648 :
649 0 : ErrorBox( NULL, WinBits( WB_OK ), aOUFinal ).Execute();
650 : }
651 0 : }
652 0 : }
653 :
654 :
655 : // XEventListener
656 :
657 :
658 0 : void DialogScriptListenerImpl::disposing(const EventObject& ) throw ( RuntimeException, std::exception )
659 : {
660 0 : }
661 :
662 :
663 : // XScriptListener
664 :
665 :
666 0 : void DialogScriptListenerImpl::firing( const ScriptEvent& aScriptEvent ) throw ( RuntimeException, std::exception )
667 : {
668 : //::osl::MutexGuard aGuard( getMutex() );
669 :
670 0 : firing_impl( aScriptEvent, NULL );
671 0 : }
672 :
673 :
674 :
675 0 : Any DialogScriptListenerImpl::approveFiring( const ScriptEvent& aScriptEvent )
676 : throw ( reflection::InvocationTargetException, RuntimeException, std::exception )
677 : {
678 : //::osl::MutexGuard aGuard( getMutex() );
679 :
680 0 : Any aReturn;
681 0 : firing_impl( aScriptEvent, &aReturn );
682 0 : return aReturn;
683 : }
684 :
685 :
686 :
687 :
688 : } // namespace dlgprov
689 :
690 :
691 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|