summaryrefslogtreecommitdiff
path: root/scripting
diff options
context:
space:
mode:
authorRüdiger Timm <rt@openoffice.org>2004-02-10 15:12:36 +0000
committerRüdiger Timm <rt@openoffice.org>2004-02-10 15:12:36 +0000
commitd9c5b3035eca8592b97d39263877be061f99ae4b (patch)
treec6d9007d497e4d7bd30c035b5b0dc950d1caa38f /scripting
parentf2d4c6d48accd281baff71616371c7b1445e44d7 (diff)
INTEGRATION: CWS scriptingf3 (1.1.2); FILE ADDED
2004/01/07 16:19:28 tbe 1.1.2.1: #i22565# creation of dialogs via a UNO service
Diffstat (limited to 'scripting')
-rw-r--r--scripting/source/dlgprov/dlgevtatt.cxx428
1 files changed, 428 insertions, 0 deletions
diff --git a/scripting/source/dlgprov/dlgevtatt.cxx b/scripting/source/dlgprov/dlgevtatt.cxx
new file mode 100644
index 000000000000..4c56a8f97a77
--- /dev/null
+++ b/scripting/source/dlgprov/dlgevtatt.cxx
@@ -0,0 +1,428 @@
+/*************************************************************************
+ *
+ * $RCSfile: dlgevtatt.cxx,v $
+ *
+ * $Revision: 1.2 $
+ *
+ * last change: $Author: rt $ $Date: 2004-02-10 16:12:36 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+#ifndef SCRIPTING_DLGEVTATT_HXX
+#include "dlgevtatt.hxx"
+#endif
+
+#ifndef SCRIPTING_DLGPROV_HXX
+#include "dlgprov.hxx"
+#endif
+
+#ifndef _COM_SUN_STAR_AWT_XCONTROL_HPP_
+#include <com/sun/star/awt/XControl.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SCRIPT_SCRIPTEVENTDESCRIPTOR_HPP_
+#include <com/sun/star/script/ScriptEventDescriptor.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SCRIPT_XSCRIPTEVENTSSUPPLIER_HPP_
+#include <com/sun/star/script/XScriptEventsSupplier.hpp>
+#endif
+#ifndef _DRAFTS_COM_SUN_STAR_SCRIPT_PROVIDER_XSCRIPTPROVIDER_HPP_
+#include <drafts/com/sun/star/script/provider/XScriptProvider.hpp>
+#endif
+#ifndef _DRAFTS_COM_SUN_STAR_SCRIPT_PROVIDER_XSCRIPTPROVIDERSUPPLIER_HPP_
+#include <drafts/com/sun/star/script/provider/XScriptProviderSupplier.hpp>
+#endif
+
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::awt;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::script;
+using namespace ::com::sun::star::uno;
+using namespace ::drafts::com::sun::star::script;
+
+
+//.........................................................................
+namespace dlgprov
+{
+//.........................................................................
+
+ // =============================================================================
+ // DialogEventsAttacherImpl
+ // =============================================================================
+
+ DialogEventsAttacherImpl::DialogEventsAttacherImpl( const Reference< XComponentContext >& rxContext )
+ :m_xContext( rxContext )
+ {
+ }
+
+ // -----------------------------------------------------------------------------
+
+ DialogEventsAttacherImpl::~DialogEventsAttacherImpl()
+ {
+ }
+
+ // -----------------------------------------------------------------------------
+ // XScriptEventsAttacher
+ // -----------------------------------------------------------------------------
+
+ void SAL_CALL DialogEventsAttacherImpl::attachEvents( const Sequence< Reference< XInterface > >& Objects,
+ const Reference< XScriptListener >& xListener, const Any& Helper )
+ throw (IllegalArgumentException, IntrospectionException, CannotCreateAdapterException,
+ ServiceNotRegisteredException, RuntimeException)
+ {
+ // get EventAttacher
+ {
+ ::osl::MutexGuard aGuard( getMutex() );
+
+ if ( !m_xEventAttacher.is() )
+ {
+ Reference< XMultiComponentFactory > xSMgr( m_xContext->getServiceManager() );
+ if ( xSMgr.is() )
+ {
+ m_xEventAttacher = Reference< XEventAttacher >( xSMgr->createInstanceWithContext(
+ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.script.EventAttacher" ) ), m_xContext ), UNO_QUERY );
+
+ if ( !m_xEventAttacher.is() )
+ throw ServiceNotRegisteredException();
+ }
+ else
+ {
+ throw RuntimeException();
+ }
+
+ }
+ }
+
+ // go over all objects
+ 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 );
+ if ( !xControl.is() )
+ throw IllegalArgumentException();
+
+ // get XEventsSupplier from control model
+ Reference< XControlModel > xControlModel = xControl->getModel();
+ Reference< XScriptEventsSupplier > xEventsSupplier( xControlModel, UNO_QUERY );
+ if ( xEventsSupplier.is() )
+ {
+ Reference< container::XNameContainer > xEventCont = xEventsSupplier->getEvents();
+ if ( xEventCont.is() )
+ {
+ Sequence< ::rtl::OUString > aNames = xEventCont->getElementNames();
+ const ::rtl::OUString* pNames = aNames.getConstArray();
+ sal_Int32 nNameCount = aNames.getLength();
+
+ for ( sal_Int32 j = 0; j < nNameCount; ++j )
+ {
+ ScriptEventDescriptor aDesc;
+
+ Any aElement = xEventCont->getByName( pNames[ j ] );
+ aElement >>= aDesc;
+ Reference< XAllListener > xAllListener =
+ new DialogAllListenerImpl( xListener, aDesc.ScriptType, aDesc.ScriptCode );
+
+ // try first to attach event to the ControlModel
+ bool bSuccess = false;
+ try
+ {
+ Reference< XEventListener > xListener = m_xEventAttacher->attachSingleEventListener(
+ xControlModel, xAllListener, Helper, aDesc.ListenerType,
+ aDesc.AddListenerParam, aDesc.EventMethod );
+
+ if ( xListener.is() )
+ bSuccess = true;
+ }
+ catch ( IllegalArgumentException& )
+ {
+ }
+ catch ( IntrospectionException& )
+ {
+ }
+ catch ( CannotCreateAdapterException& )
+ {
+ }
+ catch ( ServiceNotRegisteredException& )
+ {
+ }
+
+ try
+ {
+ // if we had no success, try to attach to the control
+ if ( !bSuccess )
+ {
+ Reference< XEventListener > xListener = m_xEventAttacher->attachSingleEventListener(
+ xControl, xAllListener, Helper, aDesc.ListenerType,
+ aDesc.AddListenerParam, aDesc.EventMethod );
+ }
+ }
+ catch( IllegalArgumentException& )
+ {
+ }
+ catch( IntrospectionException& )
+ {
+ }
+ catch( CannotCreateAdapterException& )
+ {
+ }
+ catch( ServiceNotRegisteredException& )
+ {
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ // =============================================================================
+ // DialogAllListenerImpl
+ // =============================================================================
+
+ DialogAllListenerImpl::DialogAllListenerImpl( const Reference< XScriptListener >& rxListener,
+ const ::rtl::OUString& rScriptType, const ::rtl::OUString& rScriptCode )
+ :m_xScriptListener( rxListener )
+ ,m_sScriptType( rScriptType )
+ ,m_sScriptCode( rScriptCode )
+ {
+ }
+
+ // -----------------------------------------------------------------------------
+
+ DialogAllListenerImpl::~DialogAllListenerImpl()
+ {
+ }
+
+ // -----------------------------------------------------------------------------
+
+ void DialogAllListenerImpl::firing_impl( const AllEventObject& Event, Any* pRet )
+ {
+ ScriptEvent aScriptEvent;
+ aScriptEvent.Source = (OWeakObject *)this; // get correct XInterface
+ aScriptEvent.ListenerType = Event.ListenerType;
+ aScriptEvent.MethodName = Event.MethodName;
+ aScriptEvent.Arguments = Event.Arguments;
+ aScriptEvent.Helper = Event.Helper;
+ aScriptEvent.Arguments = Event.Arguments;
+ aScriptEvent.ScriptType = m_sScriptType;
+ aScriptEvent.ScriptCode = m_sScriptCode;
+
+ if ( m_xScriptListener.is() )
+ {
+ if ( pRet )
+ *pRet = m_xScriptListener->approveFiring( aScriptEvent );
+ else
+ m_xScriptListener->firing( aScriptEvent );
+ }
+ }
+
+ // -----------------------------------------------------------------------------
+ // XEventListener
+ // -----------------------------------------------------------------------------
+
+ void DialogAllListenerImpl::disposing(const EventObject& ) throw ( RuntimeException )
+ {
+ }
+
+ // -----------------------------------------------------------------------------
+ // XAllListener
+ // -----------------------------------------------------------------------------
+
+ void DialogAllListenerImpl::firing( const AllEventObject& Event ) throw ( RuntimeException )
+ {
+ ::osl::MutexGuard aGuard( getMutex() );
+
+ firing_impl( Event, NULL );
+ }
+
+ // -----------------------------------------------------------------------------
+
+ Any DialogAllListenerImpl::approveFiring( const AllEventObject& Event )
+ throw ( reflection::InvocationTargetException, RuntimeException )
+ {
+ ::osl::MutexGuard aGuard( getMutex() );
+
+ Any aReturn;
+ firing_impl( Event, &aReturn );
+ return aReturn;
+ }
+
+
+ // =============================================================================
+ // DialogScriptListenerImpl
+ // =============================================================================
+
+ DialogScriptListenerImpl::DialogScriptListenerImpl( const Reference< ::com::sun::star::frame::XModel >& rxModel )
+ : m_xModel( rxModel )
+ {
+ }
+
+ // -----------------------------------------------------------------------------
+
+ DialogScriptListenerImpl::~DialogScriptListenerImpl()
+ {
+ }
+
+ // -----------------------------------------------------------------------------
+
+ void DialogScriptListenerImpl::firing_impl( const ScriptEvent& aScriptEvent, Any* pRet )
+ {
+ ::rtl::OUString sScriptURL;
+ ::rtl::OUString sScriptCode( aScriptEvent.ScriptCode );
+
+ 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;
+ }
+
+ OSL_TRACE( "DialogScriptListenerImpl::firing_impl: processing scriptURL %s",
+ ::rtl::OUStringToOString( sScriptURL, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
+
+ try
+ {
+ Reference< provider::XScriptProviderSupplier > xSupplier( m_xModel, UNO_QUERY );
+ OSL_ENSURE( xSupplier.is(), "DialogScriptListenerImpl::firing_impl: failed to get script provider supplier" );
+
+ if ( xSupplier.is() )
+ {
+ Reference< provider::XScriptProvider > xScriptProvider( xSupplier->getScriptProvider() );
+ OSL_ENSURE( xScriptProvider.is(), "DialogScriptListenerImpl::firing_impl: failed to get script provider" );
+
+ if ( xScriptProvider.is() )
+ {
+ Reference< provider::XScript > xScript = xScriptProvider->getScript( sScriptURL );
+ OSL_ENSURE( xScript.is(), "DialogScriptListenerImpl::firing_impl: failed to get script" );
+
+ if ( xScript.is() )
+ {
+ Sequence< Any > aInParams;
+ Sequence< sal_Int16 > aOutParamsIndex;
+ Sequence< Any > aOutParams;
+
+ // get arguments for script
+ aInParams = aScriptEvent.Arguments;
+
+ Any aResult = xScript->invoke( aInParams, aOutParamsIndex, aOutParams );
+ if ( pRet )
+ *pRet = aResult;
+ }
+ }
+ }
+ }
+ catch ( RuntimeException& e )
+ {
+ OSL_TRACE( "DialogScriptListenerImpl::firing_impl: caught RuntimeException reason %s",
+ ::rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
+ }
+ catch ( Exception& e )
+ {
+ OSL_TRACE( "DialogScriptListenerImpl::firing_impl: caught Exception reason %s",
+ ::rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
+ }
+ }
+
+ // -----------------------------------------------------------------------------
+ // XEventListener
+ // -----------------------------------------------------------------------------
+
+ void DialogScriptListenerImpl::disposing(const EventObject& ) throw ( RuntimeException )
+ {
+ }
+
+ // -----------------------------------------------------------------------------
+ // XScriptListener
+ // -----------------------------------------------------------------------------
+
+ void DialogScriptListenerImpl::firing( const ScriptEvent& aScriptEvent ) throw ( RuntimeException )
+ {
+ ::osl::MutexGuard aGuard( getMutex() );
+
+ firing_impl( aScriptEvent, NULL );
+ }
+
+ // -----------------------------------------------------------------------------
+
+ Any DialogScriptListenerImpl::approveFiring( const ScriptEvent& aScriptEvent )
+ throw ( reflection::InvocationTargetException, RuntimeException )
+ {
+ ::osl::MutexGuard aGuard( getMutex() );
+
+ Any aReturn;
+ firing_impl( aScriptEvent, &aReturn );
+ return aReturn;
+ }
+
+ // -----------------------------------------------------------------------------
+
+//.........................................................................
+} // namespace dlgprov
+//.........................................................................