summaryrefslogtreecommitdiff
path: root/scripting/source/dlgprov/dlgevtatt.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'scripting/source/dlgprov/dlgevtatt.cxx')
-rw-r--r--scripting/source/dlgprov/dlgevtatt.cxx83
1 files changed, 68 insertions, 15 deletions
diff --git a/scripting/source/dlgprov/dlgevtatt.cxx b/scripting/source/dlgprov/dlgevtatt.cxx
index 11a101454e..681793d6f0 100644
--- a/scripting/source/dlgprov/dlgevtatt.cxx
+++ b/scripting/source/dlgprov/dlgevtatt.cxx
@@ -1,3 +1,4 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -37,6 +38,7 @@
#include <tools/diagnose_ex.h>
#include <com/sun/star/awt/XControl.hpp>
+#include <com/sun/star/awt/XControlContainer.hpp>
#include <com/sun/star/awt/XDialogEventHandler.hpp>
#include <com/sun/star/awt/XContainerWindowEventHandler.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
@@ -108,13 +110,14 @@ namespace dlgprov
{
protected:
rtl::OUString msDialogCodeName;
+ rtl::OUString msDialogLibName;
Reference< script::XScriptListener > mxListener;
virtual void firing_impl( const script::ScriptEvent& aScriptEvent, uno::Any* pRet );
public:
- DialogVBAScriptListenerImpl( const Reference< XComponentContext >& rxContext, const Reference< awt::XControl >& rxControl, const Reference< frame::XModel >& xModel );
+ DialogVBAScriptListenerImpl( const Reference< XComponentContext >& rxContext, const Reference< awt::XControl >& rxControl, const Reference< frame::XModel >& xModel, const rtl::OUString& sDialogLibName );
};
- DialogVBAScriptListenerImpl::DialogVBAScriptListenerImpl( const Reference< XComponentContext >& rxContext, const Reference< awt::XControl >& rxControl, const Reference< frame::XModel >& xModel ) : DialogScriptListenerImpl( rxContext )
+ DialogVBAScriptListenerImpl::DialogVBAScriptListenerImpl( const Reference< XComponentContext >& rxContext, const Reference< awt::XControl >& rxControl, const Reference< frame::XModel >& xModel, const rtl::OUString& sDialogLibName ) : DialogScriptListenerImpl( rxContext ), msDialogLibName( sDialogLibName )
{
Reference< XMultiComponentFactory > xSMgr( m_xContext->getServiceManager() );
Sequence< Any > args(1);
@@ -142,10 +145,10 @@ namespace dlgprov
void DialogVBAScriptListenerImpl::firing_impl( const script::ScriptEvent& aScriptEvent, uno::Any* )
{
- if ( aScriptEvent.ScriptType.equals( rtl::OUString::createFromAscii("VBAInterop") ) && mxListener.is() )
+ if ( aScriptEvent.ScriptType.equals( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VBAInterop")) ) && mxListener.is() )
{
ScriptEvent aScriptEventCopy( aScriptEvent );
- aScriptEventCopy.ScriptCode = msDialogCodeName;
+ aScriptEventCopy.ScriptCode = msDialogLibName.concat( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "." ) ) ).concat( msDialogCodeName );
try
{
mxListener->firing( aScriptEventCopy );
@@ -169,7 +172,7 @@ namespace dlgprov
// key listeners by protocol when ScriptType = 'Script'
// otherwise key is the ScriptType e.g. StarBasic
if ( rxRTLListener.is() ) // set up handler for RTL_BASIC
- listernersForTypes[ rtl::OUString::createFromAscii("StarBasic") ] = rxRTLListener;
+ listernersForTypes[ rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("StarBasic")) ] = rxRTLListener;
else
listernersForTypes[ rtl::OUString::createFromAscii("StarBasic") ] = new DialogLegacyScriptListenerImpl( rxContext, rxModel );
// handler for Script & ::rtl::OUString::createFromAscii( "vnd.sun.star.UNO:" )
@@ -229,6 +232,9 @@ namespace dlgprov
Reference< container::XNameContainer > xEventCont = xEventsSupplier->getEvents();
Reference< XControlModel > xControlModel = xControl->getModel();
+ Reference< XPropertySet > xProps( xControlModel, uno::UNO_QUERY );
+ rtl::OUString sName;
+ xProps->getPropertyValue( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Name")) ) >>= sName;
if ( xEventCont.is() )
{
Sequence< ::rtl::OUString > aNames = xEventCont->getElementNames();
@@ -242,7 +248,7 @@ namespace dlgprov
Any aElement = xEventCont->getByName( pNames[ j ] );
aElement >>= aDesc;
rtl::OUString sKey = aDesc.ScriptType;
- if ( aDesc.ScriptType.equals( rtl::OUString::createFromAscii("Script" ) ) || aDesc.ScriptType.equals( rtl::OUString::createFromAscii("UNO" ) ) )
+ if ( aDesc.ScriptType.equals( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Script")) ) || aDesc.ScriptType.equals( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("UNO")) ) )
{
sal_Int32 nIndex = aDesc.ScriptCode.indexOf( ':' );
sKey = aDesc.ScriptCode.copy( 0, nIndex );
@@ -285,6 +291,51 @@ namespace dlgprov
}
}
+
+ void DialogEventsAttacherImpl::nestedAttachEvents( const Sequence< Reference< XInterface > >& Objects, const Any& Helper, rtl::OUString& sDialogCodeName )
+ {
+ const Reference< XInterface >* pObjects = Objects.getConstArray();
+ sal_Int32 nObjCount = Objects.getLength();
+
+ for ( sal_Int32 i = 0; i < nObjCount; ++i )
+ {
+ // We know that we have to do with instances of XControl.
+ // Otherwise this is not the right implementation for
+ // XScriptEventsAttacher and we have to give up.
+ Reference< XControl > xControl( pObjects[ i ], UNO_QUERY );
+ Reference< XControlContainer > xControlContainer( xControl, UNO_QUERY );
+ Reference< XDialog > xDialog( xControl, UNO_QUERY );
+ if ( !xControl.is() )
+ throw IllegalArgumentException();
+
+ // get XEventsSupplier from control model
+ Reference< XControlModel > xControlModel = xControl->getModel();
+ Reference< XScriptEventsSupplier > xEventsSupplier( xControlModel, UNO_QUERY );
+ attachEventsToControl( xControl, xEventsSupplier, Helper );
+ if ( mbUseFakeVBAEvents )
+ {
+ xEventsSupplier.set( getFakeVbaEventsSupplier( xControl, sDialogCodeName ) );
+ Any newHelper(xControl );
+ attachEventsToControl( xControl, xEventsSupplier, newHelper );
+ }
+ if ( xControlContainer.is() && !xDialog.is() )
+ {
+ Sequence< Reference< XControl > > aControls = xControlContainer->getControls();
+ sal_Int32 nControlCount = aControls.getLength();
+
+ Sequence< Reference< XInterface > > aObjects( nControlCount );
+ Reference< XInterface >* pObjectsModify = aObjects.getArray();
+ const Reference< XControl >* pControls = aControls.getConstArray();
+
+ for ( sal_Int32 j = 0; j < nControlCount; ++j )
+ {
+ pObjectsModify[j] = Reference< XInterface >( pControls[j], UNO_QUERY );
+ }
+ nestedAttachEvents( aObjects, Helper, sDialogCodeName );
+ }
+ }
+ }
+
// -----------------------------------------------------------------------------
// XScriptEventsAttacher
// -----------------------------------------------------------------------------
@@ -317,9 +368,7 @@ namespace dlgprov
}
}
-
- // go over all objects
- const Reference< XInterface >* pObjects = Objects.getConstArray();
+ rtl::OUString sDialogCodeName;
sal_Int32 nObjCount = Objects.getLength();
Reference< awt::XControl > xDlgControl( Objects[ nObjCount - 1 ], uno::UNO_QUERY ); // last object is the dialog
rtl::OUString sDialogCodeName;
@@ -352,6 +401,8 @@ namespace dlgprov
attachEventsToControl( xControl, xEventsSupplier, Helper );
}
}
+ // go over all objects
+ nestedAttachEvents( Objects, Helper, sDialogCodeName );
}
@@ -409,7 +460,7 @@ namespace dlgprov
void DialogAllListenerImpl::firing( const AllEventObject& Event ) throw ( RuntimeException )
{
- ::osl::MutexGuard aGuard( getMutex() );
+ //::osl::MutexGuard aGuard( getMutex() );
firing_impl( Event, NULL );
}
@@ -419,7 +470,7 @@ namespace dlgprov
Any DialogAllListenerImpl::approveFiring( const AllEventObject& Event )
throw ( reflection::InvocationTargetException, RuntimeException )
{
- ::osl::MutexGuard aGuard( getMutex() );
+ //::osl::MutexGuard aGuard( getMutex() );
Any aReturn;
firing_impl( Event, &aReturn );
@@ -477,7 +528,7 @@ namespace dlgprov
if ( xFactory.is() )
{
Any aCtx;
- aCtx <<= ::rtl::OUString::createFromAscii( "user" );
+ aCtx <<= ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("user"));
xScriptProvider.set( xFactory->createScriptProvider( aCtx ), UNO_QUERY );
}
}
@@ -535,7 +586,7 @@ namespace dlgprov
void DialogUnoScriptListenerImpl::firing_impl( const ScriptEvent& aScriptEvent, Any* pRet )
{
- static ::rtl::OUString sUnoURLScheme = ::rtl::OUString::createFromAscii( "vnd.sun.star.UNO:" );
+ static ::rtl::OUString sUnoURLScheme(RTL_CONSTASCII_USTRINGPARAM("vnd.sun.star.UNO:"));
::rtl::OUString sScriptCode( aScriptEvent.ScriptCode );
::rtl::OUString aMethodName = aScriptEvent.ScriptCode.copy( sUnoURLScheme.getLength() );
@@ -655,7 +706,7 @@ namespace dlgprov
void DialogScriptListenerImpl::firing( const ScriptEvent& aScriptEvent ) throw ( RuntimeException )
{
- ::osl::MutexGuard aGuard( getMutex() );
+ //::osl::MutexGuard aGuard( getMutex() );
firing_impl( aScriptEvent, NULL );
}
@@ -665,7 +716,7 @@ namespace dlgprov
Any DialogScriptListenerImpl::approveFiring( const ScriptEvent& aScriptEvent )
throw ( reflection::InvocationTargetException, RuntimeException )
{
- ::osl::MutexGuard aGuard( getMutex() );
+ //::osl::MutexGuard aGuard( getMutex() );
Any aReturn;
firing_impl( aScriptEvent, &aReturn );
@@ -677,3 +728,5 @@ namespace dlgprov
//.........................................................................
} // namespace dlgprov
//.........................................................................
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */