INTEGRATION: CWS ab28 (1.8.2); FILE MERGED

2006/07/12 08:44:16 ab 1.8.2.1: #i66948# XDialogProvider2 support
This commit is contained in:
Oliver Bolte
2006-07-14 06:09:20 +00:00
parent 5162d047e2
commit 797e69c3fa

View File

@@ -4,9 +4,9 @@
*
* $RCSfile: dlgevtatt.cxx,v $
*
* $Revision: 1.8 $
* $Revision: 1.9 $
*
* last change: $Author: hr $ $Date: 2006-06-19 10:18:49 $
* last change: $Author: obo $ $Date: 2006-07-14 07:09:20 $
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
@@ -40,10 +40,22 @@
#ifndef SCRIPTING_DLGPROV_HXX
#include "dlgprov.hxx"
#endif
#ifndef _SFX_HRC
#include <sfx2/sfx.hrc>
#endif
#ifndef _SFXAPP_HXX
#include <sfx2/app.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _COM_SUN_STAR_AWT_XCONTROL_HPP_
#include <com/sun/star/awt/XControl.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XDIALOGEVENTHANDLER_HPP_
#include <com/sun/star/awt/XDialogEventHandler.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif
@@ -62,6 +74,18 @@
#ifndef _COM_SUN_STAR_SCRIPT_PROVIDER_XSCRIPTPROVIDERSUPPLIER_HPP_
#include <com/sun/star/script/provider/XScriptProviderSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_NOSUCHMETHODEXCEPTION_HPP_
#include <com/sun/star/lang/NoSuchMethodException.hpp>
#endif
#ifndef _COM_SUN_STAR_REFLECTION_XIDLMETHOD_HPP_
#include <com/sun/star/reflection/XIdlMethod.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_METHODCONCEPT_HPP_
#include <com/sun/star/beans/MethodConcept.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XMATERIALHOLDER_HPP_
#include <com/sun/star/beans/XMaterialHolder.hpp>
#endif
using namespace ::com::sun::star;
@@ -71,6 +95,7 @@ using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::script;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::script;
using namespace ::com::sun::star::reflection;
//.........................................................................
@@ -239,7 +264,6 @@ namespace dlgprov
aScriptEvent.MethodName = Event.MethodName;
aScriptEvent.Arguments = Event.Arguments;
aScriptEvent.Helper = Event.Helper;
aScriptEvent.Arguments = Event.Arguments;
aScriptEvent.ScriptType = m_sScriptType;
aScriptEvent.ScriptCode = m_sScriptCode;
@@ -289,9 +313,15 @@ namespace dlgprov
// =============================================================================
DialogScriptListenerImpl::DialogScriptListenerImpl( const Reference< XComponentContext >& rxContext,
const Reference< ::com::sun::star::frame::XModel >& rxModel )
const Reference< ::com::sun::star::frame::XModel >& rxModel,
const Reference< ::com::sun::star::awt::XDialog >& rxDialog,
const Reference< ::com::sun::star::uno::XInterface >& rxHandler,
const Reference< ::com::sun::star::beans::XIntrospectionAccess >& rxIntrospectionAccess )
:m_xContext( rxContext )
,m_xModel( rxModel )
,m_xDialog( rxDialog )
,m_xHandler( rxHandler )
,m_xIntrospectionAccess( rxIntrospectionAccess )
{
}
@@ -305,25 +335,37 @@ namespace dlgprov
void DialogScriptListenerImpl::firing_impl( const ScriptEvent& aScriptEvent, Any* pRet )
{
static ::rtl::OUString aVndSunStarUNO =
::rtl::OUString::createFromAscii( "vnd.sun.star.UNO:" );
::rtl::OUString sScriptURL;
::rtl::OUString sScriptCode( aScriptEvent.ScriptCode );
if ( aScriptEvent.ScriptType.compareToAscii( "StarBasic" ) == 0 )
bool bUNO = (sScriptCode.indexOf( aVndSunStarUNO ) == 0);
if( bUNO )
{
// StarBasic script: convert ScriptCode to scriptURL
sal_Int32 nIndex = sScriptCode.indexOf( ':' );
if ( nIndex >= 0 && nIndex < sScriptCode.getLength() )
{
sScriptURL = ::rtl::OUString::createFromAscii( "vnd.sun.star.script:" );
sScriptURL += sScriptCode.copy( nIndex + 1 );
sScriptURL += ::rtl::OUString::createFromAscii( "?language=Basic&location=" );
sScriptURL += sScriptCode.copy( 0, nIndex );
}
handleUnoScript( aScriptEvent, pRet );
return;
}
else
{
// scripting framework script: ScriptCode contains scriptURL
sScriptURL = sScriptCode;
if ( aScriptEvent.ScriptType.compareToAscii( "StarBasic" ) == 0 )
{
// StarBasic script: convert ScriptCode to scriptURL
sal_Int32 nIndex = sScriptCode.indexOf( ':' );
if ( nIndex >= 0 && nIndex < sScriptCode.getLength() )
{
sScriptURL = ::rtl::OUString::createFromAscii( "vnd.sun.star.script:" );
sScriptURL += sScriptCode.copy( nIndex + 1 );
sScriptURL += ::rtl::OUString::createFromAscii( "?language=Basic&location=" );
sScriptURL += sScriptCode.copy( 0, nIndex );
}
}
else
{
// scripting framework script: ScriptCode contains scriptURL
sScriptURL = sScriptCode;
}
}
try
@@ -389,6 +431,91 @@ namespace dlgprov
}
}
void DialogScriptListenerImpl::handleUnoScript( const ScriptEvent& aScriptEvent, Any* pRet )
{
static ::rtl::OUString sUnoURLScheme = ::rtl::OUString::createFromAscii( "vnd.sun.star.UNO:" );
::rtl::OUString sScriptCode( aScriptEvent.ScriptCode );
::rtl::OUString aMethodName = aScriptEvent.ScriptCode.copy( sUnoURLScheme.getLength() );
const Any* pArguments = aScriptEvent.Arguments.getConstArray();
Any aEventObject = pArguments[0];
Reference< XDialogEventHandler > xDialogEventHandler( m_xHandler, UNO_QUERY );
bool bHandled = false;
if( xDialogEventHandler.is() )
{
bHandled = xDialogEventHandler->callHandlerMethod( m_xDialog, aEventObject, aMethodName );
}
Any aRet;
if( !bHandled && m_xIntrospectionAccess.is() )
{
try
{
// Methode ansprechen
const Reference< XIdlMethod >& rxMethod = m_xIntrospectionAccess->
getMethod( aMethodName, MethodConcept::ALL - MethodConcept::DANGEROUS );
Reference< XMaterialHolder > xMaterialHolder =
Reference< XMaterialHolder >::query( m_xIntrospectionAccess );
Any aHandlerObject = xMaterialHolder->getMaterial();
Sequence< Reference< XIdlClass > > aParamTypeSeq = rxMethod->getParameterTypes();
sal_Int32 nParamCount = aParamTypeSeq.getLength();
if( nParamCount == 0 )
{
Sequence<Any> args;
rxMethod->invoke( aHandlerObject, args );
bHandled = true;
}
else if( nParamCount == 2 )
{
// Signature check automatically done by reflection
Sequence<Any> Args(2);
Any* pArgs = Args.getArray();
pArgs[0] <<= m_xDialog;
pArgs[1] = aEventObject;
aRet = rxMethod->invoke( aHandlerObject, Args );
bHandled = true;
}
}
catch( com::sun::star::lang::IllegalArgumentException& e )
{}
catch( com::sun::star::lang::NoSuchMethodException& e )
{}
catch( com::sun::star::reflection::InvocationTargetException& e )
{}
}
if( bHandled )
{
if( pRet )
*pRet = aRet;
}
else
{
ResMgr* pResMgr = SFX_APP()->GetSfxResManager();
if( pResMgr )
{
String aRes( ResId(STR_ERRUNOEVENTBINDUNG, pResMgr) );
::rtl::OUString aQuoteChar( RTL_CONSTASCII_USTRINGPARAM( "\"" ) );
::rtl::OUString aOURes = aRes;
sal_Int32 nIndex = aOURes.indexOf( '%' );
::rtl::OUString aOUFinal;
aOUFinal += aOURes.copy( 0, nIndex );
aOUFinal += aQuoteChar;
aOUFinal += aMethodName;
aOUFinal += aQuoteChar;
aOUFinal += aOURes.copy( nIndex + 2 );
ErrorBox( NULL, WinBits( WB_OK ), aOUFinal ).Execute();
}
}
}
// -----------------------------------------------------------------------------
// XEventListener
// -----------------------------------------------------------------------------