1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2008 by Sun Microsystems, Inc. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * $RCSfile: eventhelper.cxx,v $ 10*cdf0e10cSrcweir * $Revision: 1.0 $ 11*cdf0e10cSrcweir * 12*cdf0e10cSrcweir * This file is part of OpenOffice.org. 13*cdf0e10cSrcweir * 14*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 15*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 16*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 17*cdf0e10cSrcweir * 18*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 19*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 20*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 22*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 23*cdf0e10cSrcweir * 24*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 25*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 26*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 27*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 28*cdf0e10cSrcweir * 29*cdf0e10cSrcweir ************************************************************************/ 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 32*cdf0e10cSrcweir #include "precompiled_scripting.hxx" 33*cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 34*cdf0e10cSrcweir #include <comphelper/uno3.hxx> 35*cdf0e10cSrcweir #include <comphelper/proparrhlp.hxx> 36*cdf0e10cSrcweir #include <comphelper/propertycontainer.hxx> 37*cdf0e10cSrcweir 38*cdf0e10cSrcweir #include <ooo/vba/XVBAToOOEventDescGen.hpp> 39*cdf0e10cSrcweir 40*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 41*cdf0e10cSrcweir #include <com/sun/star/beans/XIntrospection.hpp> 42*cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp> 43*cdf0e10cSrcweir 44*cdf0e10cSrcweir #include <com/sun/star/lang/XMultiComponentFactory.hpp> 45*cdf0e10cSrcweir #include <com/sun/star/lang/XServiceName.hpp> 46*cdf0e10cSrcweir #include <com/sun/star/lang/XServiceInfo.hpp> 47*cdf0e10cSrcweir #include <com/sun/star/lang/XInitialization.hpp> 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir #include <com/sun/star/frame/XModel.hpp> 50*cdf0e10cSrcweir 51*cdf0e10cSrcweir #include <com/sun/star/script/XLibraryContainer.hpp> 52*cdf0e10cSrcweir #include <com/sun/star/script/ScriptEventDescriptor.hpp> 53*cdf0e10cSrcweir #include <com/sun/star/script/provider/XScriptProviderSupplier.hpp> 54*cdf0e10cSrcweir 55*cdf0e10cSrcweir #include <com/sun/star/drawing/XControlShape.hpp> 56*cdf0e10cSrcweir 57*cdf0e10cSrcweir #include <com/sun/star/awt/XControl.hpp> 58*cdf0e10cSrcweir #include <com/sun/star/awt/XDialog.hpp> 59*cdf0e10cSrcweir #include <com/sun/star/awt/KeyEvent.hpp> 60*cdf0e10cSrcweir #include <com/sun/star/awt/MouseEvent.hpp> 61*cdf0e10cSrcweir #include <com/sun/star/awt/XFixedText.hpp> //liuchen 2009-6-5 62*cdf0e10cSrcweir #include <com/sun/star/awt/XTextComponent.hpp> //liuchen 2009-6-5 63*cdf0e10cSrcweir #include <com/sun/star/awt/XComboBox.hpp> //liuchen 2009-6-18 64*cdf0e10cSrcweir #include <com/sun/star/awt/XRadioButton.hpp> //liuchen 2009-7-30 65*cdf0e10cSrcweir 66*cdf0e10cSrcweir #include <msforms/ReturnInteger.hpp> 67*cdf0e10cSrcweir 68*cdf0e10cSrcweir #include <sfx2/objsh.hxx> 69*cdf0e10cSrcweir #include <basic/sbstar.hxx> 70*cdf0e10cSrcweir #include <basic/basmgr.hxx> 71*cdf0e10cSrcweir #include <basic/sbmeth.hxx> 72*cdf0e10cSrcweir #include <basic/sbmod.hxx> 73*cdf0e10cSrcweir #include <basic/sbx.hxx> 74*cdf0e10cSrcweir 75*cdf0e10cSrcweir 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir 78*cdf0e10cSrcweir // for debug 79*cdf0e10cSrcweir #include <comphelper/anytostring.hxx> 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir #include <com/sun/star/lang/XMultiComponentFactory.hpp> 83*cdf0e10cSrcweir #include <com/sun/star/script/XScriptListener.hpp> 84*cdf0e10cSrcweir #include <cppuhelper/implbase1.hxx> 85*cdf0e10cSrcweir #include <cppuhelper/implbase2.hxx> 86*cdf0e10cSrcweir #include <comphelper/evtmethodhelper.hxx> 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir #include <set> 89*cdf0e10cSrcweir #include <list> 90*cdf0e10cSrcweir #include <hash_map> 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir using namespace ::com::sun::star; 93*cdf0e10cSrcweir using namespace ::com::sun::star::script; 94*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 95*cdf0e10cSrcweir using namespace ::ooo::vba; 96*cdf0e10cSrcweir 97*cdf0e10cSrcweir #define MAP_CHAR_LEN(x) ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(x))//liuchen 2009-6-8 98*cdf0e10cSrcweir #define GET_TYPE(x) ::getCppuType((uno::Reference< x > *)0); 99*cdf0e10cSrcweir 100*cdf0e10cSrcweir // Some constants 101*cdf0e10cSrcweir const static rtl::OUString DELIM = rtl::OUString::createFromAscii( "::" ); 102*cdf0e10cSrcweir const static sal_Int32 DELIMLEN = DELIM.getLength(); 103*cdf0e10cSrcweir 104*cdf0e10cSrcweir #if 0 105*cdf0e10cSrcweir void dumpListeners( const Reference< beans::XIntrospection >& xIntrospection, const Reference<XInterface>& xIfc) 106*cdf0e10cSrcweir { 107*cdf0e10cSrcweir Reference< beans::XIntrospectionAccess > xIntrospectionAccess; 108*cdf0e10cSrcweir if ( xIntrospection.is() ) 109*cdf0e10cSrcweir { 110*cdf0e10cSrcweir xIntrospectionAccess = xIntrospection->inspect( 111*cdf0e10cSrcweir makeAny( xIfc ) ); 112*cdf0e10cSrcweir Sequence< Type > aControlListeners = 113*cdf0e10cSrcweir xIntrospectionAccess->getSupportedListeners(); 114*cdf0e10cSrcweir sal_Int32 nLength = aControlListeners.getLength(); 115*cdf0e10cSrcweir 116*cdf0e10cSrcweir for ( sal_Int32 i = 0; i< nLength; ++i ) 117*cdf0e10cSrcweir { 118*cdf0e10cSrcweir Type& listType = aControlListeners[ i ]; 119*cdf0e10cSrcweir rtl::OUString sFullTypeName = listType.getTypeName(); 120*cdf0e10cSrcweir rtl::OUString sTypeName = listType.getTypeName(); 121*cdf0e10cSrcweir sal_Int32 lastDotIndex = -1; 122*cdf0e10cSrcweir if ( ( lastDotIndex = sFullTypeName.lastIndexOf( '.' ) ) > -1 ) 123*cdf0e10cSrcweir { 124*cdf0e10cSrcweir sTypeName = sFullTypeName.copy( lastDotIndex + 1 ); 125*cdf0e10cSrcweir } 126*cdf0e10cSrcweir Sequence< ::rtl::OUString > sMeths = comphelper::getEventMethodsForType( listType ); 127*cdf0e10cSrcweir sal_Int32 sMethLen = sMeths.getLength(); 128*cdf0e10cSrcweir for ( sal_Int32 j=0 ; j < sMethLen; ++j ) 129*cdf0e10cSrcweir { 130*cdf0e10cSrcweir OSL_TRACE("**Listener [%d] Type[%s] Method[%s]",j, 131*cdf0e10cSrcweir rtl::OUStringToOString( sTypeName, 132*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8 ).getStr(), 133*cdf0e10cSrcweir rtl::OUStringToOString( sMeths[ j ], 134*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8 ).getStr() ); 135*cdf0e10cSrcweir } 136*cdf0e10cSrcweir } 137*cdf0e10cSrcweir 138*cdf0e10cSrcweir } 139*cdf0e10cSrcweir } 140*cdf0e10cSrcweir 141*cdf0e10cSrcweir void dumpEvent( const ScriptEvent& evt ) 142*cdf0e10cSrcweir { 143*cdf0e10cSrcweir OSL_TRACE("dumpEvent: Source %s", 144*cdf0e10cSrcweir rtl::OUStringToOString( comphelper::anyToString( makeAny(evt.Source)), 145*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8 ).getStr() ); 146*cdf0e10cSrcweir 147*cdf0e10cSrcweir OSL_TRACE("dumpEvent: ScriptType %s", 148*cdf0e10cSrcweir rtl::OUStringToOString( evt.ScriptType, 149*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8 ).getStr() ); 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir OSL_TRACE("dumpEvent: ScriptCode %s", 152*cdf0e10cSrcweir rtl::OUStringToOString( evt.ScriptCode, 153*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8 ).getStr() ); 154*cdf0e10cSrcweir 155*cdf0e10cSrcweir OSL_TRACE("dumpEvent: ListenerType %s", 156*cdf0e10cSrcweir rtl::OUStringToOString( evt.ListenerType.getTypeName(), 157*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8 ).getStr() ); 158*cdf0e10cSrcweir 159*cdf0e10cSrcweir OSL_TRACE("dumpEvent: Listener methodname %s", 160*cdf0e10cSrcweir rtl::OUStringToOString( evt.MethodName, 161*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8 ).getStr() ); 162*cdf0e10cSrcweir 163*cdf0e10cSrcweir OSL_TRACE("dumpEvent: arguments;"); 164*cdf0e10cSrcweir sal_Int32 nLen = evt.Arguments.getLength(); 165*cdf0e10cSrcweir for ( sal_Int32 index=0; index < nLen; ++index ) 166*cdf0e10cSrcweir { 167*cdf0e10cSrcweir OSL_TRACE("\t [%d] %s", index, 168*cdf0e10cSrcweir rtl::OUStringToOString( comphelper::anyToString( evt.Arguments[ index ] ), 169*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8 ).getStr() ); 170*cdf0e10cSrcweir 171*cdf0e10cSrcweir } 172*cdf0e10cSrcweir } 173*cdf0e10cSrcweir 174*cdf0e10cSrcweir #endif 175*cdf0e10cSrcweir 176*cdf0e10cSrcweir bool isKeyEventOk( awt::KeyEvent& evt, const Sequence< Any >& params ) 177*cdf0e10cSrcweir { 178*cdf0e10cSrcweir if ( !( params.getLength() > 0 ) || 179*cdf0e10cSrcweir !( params[ 0 ] >>= evt ) ) 180*cdf0e10cSrcweir return false; 181*cdf0e10cSrcweir return true; 182*cdf0e10cSrcweir } 183*cdf0e10cSrcweir 184*cdf0e10cSrcweir bool isMouseEventOk( awt::MouseEvent& evt, const Sequence< Any >& params ) 185*cdf0e10cSrcweir { 186*cdf0e10cSrcweir if ( !( params.getLength() > 0 ) || 187*cdf0e10cSrcweir !( params[ 0 ] >>= evt ) ) 188*cdf0e10cSrcweir return false; 189*cdf0e10cSrcweir return true; 190*cdf0e10cSrcweir } 191*cdf0e10cSrcweir 192*cdf0e10cSrcweir Sequence< Any > ooMouseEvtToVBADblClick( const Sequence< Any >& params ) 193*cdf0e10cSrcweir { 194*cdf0e10cSrcweir Sequence< Any > translatedParams; 195*cdf0e10cSrcweir awt::MouseEvent evt; 196*cdf0e10cSrcweir 197*cdf0e10cSrcweir if ( !( isMouseEventOk(evt, params)) || 198*cdf0e10cSrcweir (evt.ClickCount != 2) ) 199*cdf0e10cSrcweir return Sequence< Any >(); 200*cdf0e10cSrcweir // give back orig params, this will signal that the event is good 201*cdf0e10cSrcweir return params; 202*cdf0e10cSrcweir } 203*cdf0e10cSrcweir 204*cdf0e10cSrcweir Sequence< Any > ooMouseEvtToVBAMouseEvt( const Sequence< Any >& params ) 205*cdf0e10cSrcweir { 206*cdf0e10cSrcweir Sequence< Any > translatedParams; 207*cdf0e10cSrcweir awt::MouseEvent evt; 208*cdf0e10cSrcweir 209*cdf0e10cSrcweir if ( !isMouseEventOk(evt, params) ) 210*cdf0e10cSrcweir return Sequence< Any >(); 211*cdf0e10cSrcweir 212*cdf0e10cSrcweir translatedParams.realloc(4); 213*cdf0e10cSrcweir 214*cdf0e10cSrcweir // Buttons 215*cdf0e10cSrcweir translatedParams[ 0 ] <<= evt.Buttons; 216*cdf0e10cSrcweir // Shift 217*cdf0e10cSrcweir translatedParams[ 1 ] <<= evt.Modifiers; 218*cdf0e10cSrcweir // X 219*cdf0e10cSrcweir translatedParams[ 2 ] <<= evt.X; 220*cdf0e10cSrcweir // Y 221*cdf0e10cSrcweir translatedParams[ 3 ] <<= evt.Y; 222*cdf0e10cSrcweir return translatedParams; 223*cdf0e10cSrcweir } 224*cdf0e10cSrcweir 225*cdf0e10cSrcweir Sequence< Any > ooKeyPressedToVBAKeyPressed( const Sequence< Any >& params ) 226*cdf0e10cSrcweir { 227*cdf0e10cSrcweir Sequence< Any > translatedParams; 228*cdf0e10cSrcweir awt::KeyEvent evt; 229*cdf0e10cSrcweir 230*cdf0e10cSrcweir if ( !isKeyEventOk( evt, params ) ) 231*cdf0e10cSrcweir return Sequence< Any >(); 232*cdf0e10cSrcweir 233*cdf0e10cSrcweir translatedParams.realloc(1); 234*cdf0e10cSrcweir 235*cdf0e10cSrcweir msforms::ReturnInteger keyCode; 236*cdf0e10cSrcweir keyCode.Value = evt.KeyCode; 237*cdf0e10cSrcweir translatedParams[0] <<= keyCode; 238*cdf0e10cSrcweir return translatedParams; 239*cdf0e10cSrcweir } 240*cdf0e10cSrcweir 241*cdf0e10cSrcweir Sequence< Any > ooKeyPressedToVBAKeyUpDown( const Sequence< Any >& params ) 242*cdf0e10cSrcweir { 243*cdf0e10cSrcweir Sequence< Any > translatedParams; 244*cdf0e10cSrcweir awt::KeyEvent evt; 245*cdf0e10cSrcweir 246*cdf0e10cSrcweir if ( !isKeyEventOk( evt, params ) ) 247*cdf0e10cSrcweir return Sequence< Any >(); 248*cdf0e10cSrcweir 249*cdf0e10cSrcweir translatedParams.realloc(2); 250*cdf0e10cSrcweir 251*cdf0e10cSrcweir msforms::ReturnInteger keyCode; 252*cdf0e10cSrcweir sal_Int8 shift = sal::static_int_cast<sal_Int8>( evt.Modifiers ); 253*cdf0e10cSrcweir 254*cdf0e10cSrcweir // #TODO check whether values from OOO conform to values generated from vba 255*cdf0e10cSrcweir keyCode.Value = evt.KeyCode; 256*cdf0e10cSrcweir translatedParams[0] <<= keyCode; 257*cdf0e10cSrcweir translatedParams[1] <<= shift; 258*cdf0e10cSrcweir return translatedParams; 259*cdf0e10cSrcweir } 260*cdf0e10cSrcweir 261*cdf0e10cSrcweir typedef Sequence< Any > (*Translator)(const Sequence< Any >&); 262*cdf0e10cSrcweir 263*cdf0e10cSrcweir //liuchen 2009-6-23 264*cdf0e10cSrcweir //expand the "TranslateInfo" struct to support more kinds of events 265*cdf0e10cSrcweir struct TranslateInfo 266*cdf0e10cSrcweir { 267*cdf0e10cSrcweir rtl::OUString sVBAName; //vba event name 268*cdf0e10cSrcweir Translator toVBA; //the method to convert OO event parameters to VBA event parameters 269*cdf0e10cSrcweir bool (*ApproveRule)(const ScriptEvent& evt, void* pPara); //this method is used to determine which types of controls should execute the event 270*cdf0e10cSrcweir void *pPara; //Parameters for the above approve method 271*cdf0e10cSrcweir }; 272*cdf0e10cSrcweir 273*cdf0e10cSrcweir 274*cdf0e10cSrcweir typedef std::hash_map< rtl::OUString, 275*cdf0e10cSrcweir std::list< TranslateInfo >, 276*cdf0e10cSrcweir ::rtl::OUStringHash, 277*cdf0e10cSrcweir ::std::equal_to< ::rtl::OUString > > EventInfoHash; 278*cdf0e10cSrcweir 279*cdf0e10cSrcweir //liuchen 2009-6-23 280*cdf0e10cSrcweir struct TranslatePropMap 281*cdf0e10cSrcweir { 282*cdf0e10cSrcweir rtl::OUString sEventInfo; //OO event name 283*cdf0e10cSrcweir TranslateInfo aTransInfo; 284*cdf0e10cSrcweir }; 285*cdf0e10cSrcweir 286*cdf0e10cSrcweir bool ApproveAll(const ScriptEvent& evt, void* pPara); //allow all types of controls to execute the event 287*cdf0e10cSrcweir bool ApproveType(const ScriptEvent& evt, void* pPara); //certain types of controls should execute the event, those types are given by pPara 288*cdf0e10cSrcweir bool DenyType(const ScriptEvent& evt, void* pPara); //certain types of controls should not execute the event, those types are given by pPara 289*cdf0e10cSrcweir bool DenyMouseDrag(const ScriptEvent& evt, void* pPara); //used for VBA MouseMove event when "Shift" key is pressed 290*cdf0e10cSrcweir 291*cdf0e10cSrcweir struct TypeList 292*cdf0e10cSrcweir { 293*cdf0e10cSrcweir uno::Type* pTypeList; 294*cdf0e10cSrcweir int nListLength; 295*cdf0e10cSrcweir }; 296*cdf0e10cSrcweir 297*cdf0e10cSrcweir Type typeXFixedText = GET_TYPE(awt::XFixedText) 298*cdf0e10cSrcweir Type typeXTextComponent = GET_TYPE(awt::XTextComponent) 299*cdf0e10cSrcweir Type typeXComboBox = GET_TYPE(awt::XComboBox) 300*cdf0e10cSrcweir Type typeXRadioButton = GET_TYPE(awt::XRadioButton) 301*cdf0e10cSrcweir 302*cdf0e10cSrcweir 303*cdf0e10cSrcweir TypeList fixedTextList = {&typeXFixedText, 1}; 304*cdf0e10cSrcweir TypeList textCompList = {&typeXTextComponent, 1}; 305*cdf0e10cSrcweir TypeList radioButtonList = {&typeXRadioButton, 1}; 306*cdf0e10cSrcweir TypeList comboBoxList = {&typeXComboBox, 1}; 307*cdf0e10cSrcweir 308*cdf0e10cSrcweir //this array stores the OO event to VBA event translation info 309*cdf0e10cSrcweir static TranslatePropMap aTranslatePropMap_Impl[] = 310*cdf0e10cSrcweir { 311*cdf0e10cSrcweir // actionPerformed ooo event 312*cdf0e10cSrcweir { MAP_CHAR_LEN("actionPerformed"), { MAP_CHAR_LEN("_Click"), NULL, ApproveAll, NULL } }, 313*cdf0e10cSrcweir { MAP_CHAR_LEN("actionPerformed"), { MAP_CHAR_LEN("_Change"), NULL, DenyType, (void*)(&radioButtonList) } }, //liuchen 2009-7-30, OptionalButton_Change event is not the same as OptionalButton_Click event 314*cdf0e10cSrcweir 315*cdf0e10cSrcweir // itemStateChanged ooo event 316*cdf0e10cSrcweir { MAP_CHAR_LEN("itemStateChanged"), { MAP_CHAR_LEN("_Click"), NULL, ApproveType, (void*)(&comboBoxList) } }, //liuchen, add to support VBA ComboBox_Click event 317*cdf0e10cSrcweir { MAP_CHAR_LEN("itemStateChanged"), { MAP_CHAR_LEN("_Change"), NULL, ApproveType, (void*)(&radioButtonList) } }, //liuchen 2009-7-30, OptionalButton_Change event should be triggered when the button state is changed 318*cdf0e10cSrcweir 319*cdf0e10cSrcweir // changed ooo event 320*cdf0e10cSrcweir { MAP_CHAR_LEN("changed"), { MAP_CHAR_LEN("_Change"), NULL, ApproveAll, NULL } }, 321*cdf0e10cSrcweir 322*cdf0e10cSrcweir // focusGained ooo event 323*cdf0e10cSrcweir { MAP_CHAR_LEN("focusGained"), { MAP_CHAR_LEN("_GotFocus"), NULL, ApproveAll, NULL } }, 324*cdf0e10cSrcweir 325*cdf0e10cSrcweir // focusLost ooo event 326*cdf0e10cSrcweir { MAP_CHAR_LEN("focusLost"), { MAP_CHAR_LEN("_LostFocus"), NULL, ApproveAll, NULL } }, 327*cdf0e10cSrcweir { MAP_CHAR_LEN("focusLost"), { MAP_CHAR_LEN("_Exit"), NULL, ApproveType, (void*)(&textCompList) } }, //liuchen, add to support VBA TextBox_Exit event 328*cdf0e10cSrcweir 329*cdf0e10cSrcweir // adjustmentValueChanged ooo event 330*cdf0e10cSrcweir { MAP_CHAR_LEN("adjustmentValueChanged"), { MAP_CHAR_LEN("_Scroll"), NULL, ApproveAll, NULL } }, 331*cdf0e10cSrcweir { MAP_CHAR_LEN("adjustmentValueChanged"), { MAP_CHAR_LEN("_Change"), NULL, ApproveAll, NULL } }, 332*cdf0e10cSrcweir 333*cdf0e10cSrcweir // textChanged ooo event 334*cdf0e10cSrcweir { MAP_CHAR_LEN("textChanged"), { MAP_CHAR_LEN("_Change"), NULL, ApproveAll, NULL } }, 335*cdf0e10cSrcweir 336*cdf0e10cSrcweir // keyReleased ooo event 337*cdf0e10cSrcweir { MAP_CHAR_LEN("keyReleased"), { MAP_CHAR_LEN("_KeyUp"), ooKeyPressedToVBAKeyUpDown, ApproveAll, NULL } }, 338*cdf0e10cSrcweir 339*cdf0e10cSrcweir // mouseReleased ooo event 340*cdf0e10cSrcweir { MAP_CHAR_LEN("mouseReleased"), { MAP_CHAR_LEN("_Click"), ooMouseEvtToVBAMouseEvt, ApproveType, (void*)(&fixedTextList) } }, //liuchen, add to support VBA Label_Click event 341*cdf0e10cSrcweir { MAP_CHAR_LEN("mouseReleased"), { MAP_CHAR_LEN("_MouseUp"), ooMouseEvtToVBAMouseEvt, ApproveAll, NULL } }, 342*cdf0e10cSrcweir 343*cdf0e10cSrcweir // mousePressed ooo event 344*cdf0e10cSrcweir { MAP_CHAR_LEN("mousePressed"), { MAP_CHAR_LEN("_MouseDown"), ooMouseEvtToVBAMouseEvt, ApproveAll, NULL } }, 345*cdf0e10cSrcweir { MAP_CHAR_LEN("mousePressed"), { MAP_CHAR_LEN("_DblClick"), ooMouseEvtToVBADblClick, ApproveAll, NULL } }, 346*cdf0e10cSrcweir 347*cdf0e10cSrcweir // mouseMoved ooo event 348*cdf0e10cSrcweir { MAP_CHAR_LEN("mouseMoved"), { MAP_CHAR_LEN("_MouseMove"), ooMouseEvtToVBAMouseEvt, ApproveAll, NULL } }, 349*cdf0e10cSrcweir { MAP_CHAR_LEN("mouseDragged"), { MAP_CHAR_LEN("_MouseMove"), ooMouseEvtToVBAMouseEvt, DenyMouseDrag, NULL } }, //liuchen, add to support VBA MouseMove event when the "Shift" key is pressed 350*cdf0e10cSrcweir 351*cdf0e10cSrcweir // keyPressed ooo event 352*cdf0e10cSrcweir { MAP_CHAR_LEN("keyPressed"), { MAP_CHAR_LEN("_KeyDown"), ooKeyPressedToVBAKeyPressed, ApproveAll, NULL } }, 353*cdf0e10cSrcweir { MAP_CHAR_LEN("keyPressed"), { MAP_CHAR_LEN("_KeyPress"), ooKeyPressedToVBAKeyPressed, ApproveAll, NULL } } 354*cdf0e10cSrcweir }; 355*cdf0e10cSrcweir 356*cdf0e10cSrcweir EventInfoHash& getEventTransInfo() 357*cdf0e10cSrcweir { 358*cdf0e10cSrcweir static bool initialised = false; 359*cdf0e10cSrcweir static EventInfoHash eventTransInfo; 360*cdf0e10cSrcweir if ( !initialised ) 361*cdf0e10cSrcweir { 362*cdf0e10cSrcweir rtl::OUString sEventInfo = MAP_CHAR_LEN(""); 363*cdf0e10cSrcweir TranslatePropMap* pTransProp = aTranslatePropMap_Impl; 364*cdf0e10cSrcweir int nCount = sizeof(aTranslatePropMap_Impl) / sizeof(aTranslatePropMap_Impl[0]); 365*cdf0e10cSrcweir 366*cdf0e10cSrcweir int i = 0; 367*cdf0e10cSrcweir while (i < nCount) 368*cdf0e10cSrcweir { 369*cdf0e10cSrcweir sEventInfo = pTransProp->sEventInfo; 370*cdf0e10cSrcweir std::list< TranslateInfo > infoList; 371*cdf0e10cSrcweir do 372*cdf0e10cSrcweir { 373*cdf0e10cSrcweir infoList.push_back( pTransProp->aTransInfo ); 374*cdf0e10cSrcweir pTransProp++; 375*cdf0e10cSrcweir i++; 376*cdf0e10cSrcweir }while(i < nCount && sEventInfo == pTransProp->sEventInfo); 377*cdf0e10cSrcweir eventTransInfo[sEventInfo] = infoList; 378*cdf0e10cSrcweir } 379*cdf0e10cSrcweir initialised = true; 380*cdf0e10cSrcweir } 381*cdf0e10cSrcweir return eventTransInfo; 382*cdf0e10cSrcweir } 383*cdf0e10cSrcweir //liuchen 2009-6-23 end 384*cdf0e10cSrcweir 385*cdf0e10cSrcweir // Helper class 386*cdf0e10cSrcweir 387*cdf0e10cSrcweir class ScriptEventHelper 388*cdf0e10cSrcweir { 389*cdf0e10cSrcweir public: 390*cdf0e10cSrcweir ScriptEventHelper( const Reference< XInterface >& xControl ); 391*cdf0e10cSrcweir Sequence< ScriptEventDescriptor > createEvents( const rtl::OUString& sCodeName ); 392*cdf0e10cSrcweir Sequence< rtl::OUString > getEventListeners(); 393*cdf0e10cSrcweir private: 394*cdf0e10cSrcweir Reference< XComponentContext > m_xCtx; 395*cdf0e10cSrcweir Reference< XInterface > m_xControl; 396*cdf0e10cSrcweir }; 397*cdf0e10cSrcweir 398*cdf0e10cSrcweir bool 399*cdf0e10cSrcweir eventMethodToDescriptor( const ::rtl::OUString& rEventMethod, ScriptEventDescriptor& evtDesc, const ::rtl::OUString& sCodeName ) 400*cdf0e10cSrcweir { 401*cdf0e10cSrcweir // format of ControlListener is TypeName::methodname e.g. 402*cdf0e10cSrcweir // "com.sun.star.awt.XActionListener::actionPerformed" or 403*cdf0e10cSrcweir // "XActionListener::actionPerformed 404*cdf0e10cSrcweir 405*cdf0e10cSrcweir ::rtl::OUString sMethodName; 406*cdf0e10cSrcweir ::rtl::OUString sTypeName; 407*cdf0e10cSrcweir sal_Int32 nDelimPos = rEventMethod.indexOf( DELIM ); 408*cdf0e10cSrcweir if ( nDelimPos == -1 ) 409*cdf0e10cSrcweir { 410*cdf0e10cSrcweir return false; 411*cdf0e10cSrcweir } 412*cdf0e10cSrcweir sMethodName = rEventMethod.copy( nDelimPos + DELIMLEN ); 413*cdf0e10cSrcweir sTypeName = rEventMethod.copy( 0, nDelimPos ); 414*cdf0e10cSrcweir 415*cdf0e10cSrcweir EventInfoHash& infos = getEventTransInfo(); 416*cdf0e10cSrcweir 417*cdf0e10cSrcweir // Only create an ScriptEventDescriptor for an event we can translate 418*cdf0e10cSrcweir // or emulate 419*cdf0e10cSrcweir if ( sMethodName.getLength() 420*cdf0e10cSrcweir && sTypeName.getLength() 421*cdf0e10cSrcweir && ( infos.find( sMethodName ) != infos.end() ) ) 422*cdf0e10cSrcweir { 423*cdf0e10cSrcweir // just fill in CodeName, when the event fires the other 424*cdf0e10cSrcweir // info is gathered from the event source to determine what 425*cdf0e10cSrcweir // event handler we try to call 426*cdf0e10cSrcweir evtDesc.ScriptCode = sCodeName; 427*cdf0e10cSrcweir evtDesc.ListenerType = sTypeName; 428*cdf0e10cSrcweir evtDesc.EventMethod = sMethodName; 429*cdf0e10cSrcweir 430*cdf0e10cSrcweir // set this it VBAInterop, ensures that it doesn't 431*cdf0e10cSrcweir // get persisted or shown in property editors 432*cdf0e10cSrcweir evtDesc.ScriptType = rtl::OUString::createFromAscii( 433*cdf0e10cSrcweir "VBAInterop" ); 434*cdf0e10cSrcweir return true; 435*cdf0e10cSrcweir } 436*cdf0e10cSrcweir return false; 437*cdf0e10cSrcweir 438*cdf0e10cSrcweir } 439*cdf0e10cSrcweir 440*cdf0e10cSrcweir ScriptEventHelper::ScriptEventHelper( const Reference< XInterface >& xControl ) : m_xControl( xControl ) 441*cdf0e10cSrcweir { 442*cdf0e10cSrcweir Reference < beans::XPropertySet > xProps( 443*cdf0e10cSrcweir ::comphelper::getProcessServiceFactory(), UNO_QUERY_THROW ); 444*cdf0e10cSrcweir m_xCtx.set( xProps->getPropertyValue( rtl::OUString( 445*cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))), 446*cdf0e10cSrcweir uno::UNO_QUERY_THROW ); 447*cdf0e10cSrcweir } 448*cdf0e10cSrcweir 449*cdf0e10cSrcweir Sequence< rtl::OUString > 450*cdf0e10cSrcweir ScriptEventHelper::getEventListeners() 451*cdf0e10cSrcweir { 452*cdf0e10cSrcweir Reference< lang::XMultiComponentFactory > xMFac( 453*cdf0e10cSrcweir m_xCtx->getServiceManager(), UNO_QUERY ); 454*cdf0e10cSrcweir std::list< rtl::OUString > eventMethods; 455*cdf0e10cSrcweir 456*cdf0e10cSrcweir if ( xMFac.is() ) 457*cdf0e10cSrcweir { 458*cdf0e10cSrcweir Reference< beans::XIntrospection > xIntrospection( 459*cdf0e10cSrcweir xMFac->createInstanceWithContext( rtl::OUString( 460*cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.beans.Introspection" ) ), m_xCtx ), UNO_QUERY ); 461*cdf0e10cSrcweir #if 0 462*cdf0e10cSrcweir dumpListeners( xIntrospection, m_xControl ); 463*cdf0e10cSrcweir dumpListeners( xIntrospection, m_xControl->getModel() ); 464*cdf0e10cSrcweir #endif 465*cdf0e10cSrcweir Reference< beans::XIntrospectionAccess > xIntrospectionAccess; 466*cdf0e10cSrcweir if ( xIntrospection.is() ) 467*cdf0e10cSrcweir { 468*cdf0e10cSrcweir xIntrospectionAccess = xIntrospection->inspect( 469*cdf0e10cSrcweir makeAny( m_xControl ) ); 470*cdf0e10cSrcweir Sequence< Type > aControlListeners = 471*cdf0e10cSrcweir xIntrospectionAccess->getSupportedListeners(); 472*cdf0e10cSrcweir sal_Int32 nLength = aControlListeners.getLength(); 473*cdf0e10cSrcweir for ( sal_Int32 i = 0; i< nLength; ++i ) 474*cdf0e10cSrcweir { 475*cdf0e10cSrcweir Type& listType = aControlListeners[ i ]; 476*cdf0e10cSrcweir rtl::OUString sFullTypeName = listType.getTypeName(); 477*cdf0e10cSrcweir Sequence< ::rtl::OUString > sMeths = 478*cdf0e10cSrcweir comphelper::getEventMethodsForType( listType ); 479*cdf0e10cSrcweir sal_Int32 sMethLen = sMeths.getLength(); 480*cdf0e10cSrcweir for ( sal_Int32 j=0 ; j < sMethLen; ++j ) 481*cdf0e10cSrcweir { 482*cdf0e10cSrcweir rtl::OUString sEventMethod = sFullTypeName; 483*cdf0e10cSrcweir sEventMethod += DELIM; 484*cdf0e10cSrcweir sEventMethod += sMeths[ j ]; 485*cdf0e10cSrcweir eventMethods.push_back( sEventMethod ); 486*cdf0e10cSrcweir } 487*cdf0e10cSrcweir } 488*cdf0e10cSrcweir 489*cdf0e10cSrcweir } 490*cdf0e10cSrcweir } 491*cdf0e10cSrcweir 492*cdf0e10cSrcweir Sequence< rtl::OUString > sEventMethodNames( eventMethods.size() ); 493*cdf0e10cSrcweir std::list< rtl::OUString >::const_iterator it = eventMethods.begin(); 494*cdf0e10cSrcweir rtl::OUString* pDest = sEventMethodNames.getArray(); 495*cdf0e10cSrcweir 496*cdf0e10cSrcweir for ( ; it != eventMethods.end(); ++it, ++pDest ) 497*cdf0e10cSrcweir *pDest = *it; 498*cdf0e10cSrcweir 499*cdf0e10cSrcweir return sEventMethodNames; 500*cdf0e10cSrcweir } 501*cdf0e10cSrcweir 502*cdf0e10cSrcweir Sequence< ScriptEventDescriptor > 503*cdf0e10cSrcweir ScriptEventHelper::createEvents( const rtl::OUString& sCodeName ) 504*cdf0e10cSrcweir { 505*cdf0e10cSrcweir Sequence< rtl::OUString > aControlListeners = getEventListeners(); 506*cdf0e10cSrcweir rtl::OUString* pSrc = aControlListeners.getArray(); 507*cdf0e10cSrcweir sal_Int32 nLength = aControlListeners.getLength(); 508*cdf0e10cSrcweir 509*cdf0e10cSrcweir Sequence< ScriptEventDescriptor > aDest( nLength ); 510*cdf0e10cSrcweir sal_Int32 nEvts = 0; 511*cdf0e10cSrcweir for ( sal_Int32 i = 0; i< nLength; ++i, ++pSrc ) 512*cdf0e10cSrcweir { 513*cdf0e10cSrcweir // from getListeners eventName is of form 514*cdf0e10cSrcweir // "com.sun.star.awt.XActionListener::actionPerformed" 515*cdf0e10cSrcweir // we need to strip "com.sun.star.awt." from that for form 516*cdf0e10cSrcweir // controls 517*cdf0e10cSrcweir ScriptEventDescriptor evtDesc; 518*cdf0e10cSrcweir if ( eventMethodToDescriptor( *pSrc, evtDesc, sCodeName ) ) 519*cdf0e10cSrcweir { 520*cdf0e10cSrcweir sal_Int32 dIndex = nEvts; 521*cdf0e10cSrcweir ++nEvts; 522*cdf0e10cSrcweir if ( nEvts > aDest.getLength() ) 523*cdf0e10cSrcweir aDest.realloc( nEvts );// should never happen 524*cdf0e10cSrcweir aDest[ dIndex ] = evtDesc; 525*cdf0e10cSrcweir } 526*cdf0e10cSrcweir } 527*cdf0e10cSrcweir aDest.realloc( nEvts ); 528*cdf0e10cSrcweir 529*cdf0e10cSrcweir return aDest; 530*cdf0e10cSrcweir } 531*cdf0e10cSrcweir 532*cdf0e10cSrcweir 533*cdf0e10cSrcweir typedef ::cppu::WeakImplHelper1< container::XNameContainer > NameContainer_BASE; 534*cdf0e10cSrcweir 535*cdf0e10cSrcweir class ReadOnlyEventsNameContainer : public NameContainer_BASE 536*cdf0e10cSrcweir { 537*cdf0e10cSrcweir public: 538*cdf0e10cSrcweir ReadOnlyEventsNameContainer( const Sequence< rtl::OUString >& eventMethods, const rtl::OUString& sCodeName ); 539*cdf0e10cSrcweir // XNameContainer 540*cdf0e10cSrcweir 541*cdf0e10cSrcweir virtual void SAL_CALL insertByName( const ::rtl::OUString&, const Any& ) throw (lang::IllegalArgumentException, container::ElementExistException, lang::WrappedTargetException, RuntimeException) 542*cdf0e10cSrcweir { 543*cdf0e10cSrcweir throw RuntimeException( rtl::OUString::createFromAscii( "ReadOnly container" ), Reference< XInterface >() ); 544*cdf0e10cSrcweir 545*cdf0e10cSrcweir } 546*cdf0e10cSrcweir virtual void SAL_CALL removeByName( const ::rtl::OUString& ) throw (::com::sun::star::container::NoSuchElementException, lang::WrappedTargetException, RuntimeException) 547*cdf0e10cSrcweir { 548*cdf0e10cSrcweir throw RuntimeException( rtl::OUString::createFromAscii( "ReadOnly container" ), Reference< XInterface >() ); 549*cdf0e10cSrcweir } 550*cdf0e10cSrcweir 551*cdf0e10cSrcweir // XNameReplace 552*cdf0e10cSrcweir virtual void SAL_CALL replaceByName( const ::rtl::OUString&, const Any& ) throw (lang::IllegalArgumentException, container::NoSuchElementException, lang::WrappedTargetException, RuntimeException) 553*cdf0e10cSrcweir { 554*cdf0e10cSrcweir throw RuntimeException( rtl::OUString::createFromAscii( "ReadOnly container" ), Reference< XInterface >() ); 555*cdf0e10cSrcweir 556*cdf0e10cSrcweir } 557*cdf0e10cSrcweir 558*cdf0e10cSrcweir // XNameAccess 559*cdf0e10cSrcweir virtual Any SAL_CALL getByName( const ::rtl::OUString& aName ) throw (container::NoSuchElementException, lang::WrappedTargetException, RuntimeException); 560*cdf0e10cSrcweir virtual Sequence< ::rtl::OUString > SAL_CALL getElementNames( ) throw (RuntimeException); 561*cdf0e10cSrcweir virtual ::sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) throw (RuntimeException); 562*cdf0e10cSrcweir 563*cdf0e10cSrcweir // XElementAccess 564*cdf0e10cSrcweir virtual Type SAL_CALL getElementType( ) throw (RuntimeException) 565*cdf0e10cSrcweir { return getCppuType(static_cast< const rtl::OUString * >(0) ); } 566*cdf0e10cSrcweir virtual ::sal_Bool SAL_CALL hasElements( ) throw (RuntimeException) 567*cdf0e10cSrcweir { return ( ( m_hEvents.size() > 0 ? sal_True : sal_False ) ); } 568*cdf0e10cSrcweir private: 569*cdf0e10cSrcweir 570*cdf0e10cSrcweir typedef std::hash_map< rtl::OUString, Any, ::rtl::OUStringHash, 571*cdf0e10cSrcweir ::std::equal_to< ::rtl::OUString > > EventSupplierHash; 572*cdf0e10cSrcweir 573*cdf0e10cSrcweir EventSupplierHash m_hEvents; 574*cdf0e10cSrcweir }; 575*cdf0e10cSrcweir 576*cdf0e10cSrcweir ReadOnlyEventsNameContainer::ReadOnlyEventsNameContainer( const Sequence< rtl::OUString >& eventMethods, const rtl::OUString& sCodeName ) 577*cdf0e10cSrcweir { 578*cdf0e10cSrcweir const rtl::OUString* pSrc = eventMethods.getConstArray(); 579*cdf0e10cSrcweir sal_Int32 nLen = eventMethods.getLength(); 580*cdf0e10cSrcweir for ( sal_Int32 index = 0; index < nLen; ++index, ++pSrc ) 581*cdf0e10cSrcweir { 582*cdf0e10cSrcweir Any aDesc; 583*cdf0e10cSrcweir ScriptEventDescriptor evtDesc; 584*cdf0e10cSrcweir if ( eventMethodToDescriptor( *pSrc, evtDesc, sCodeName ) ) 585*cdf0e10cSrcweir { 586*cdf0e10cSrcweir aDesc <<= evtDesc; 587*cdf0e10cSrcweir m_hEvents[ *pSrc ] = aDesc; 588*cdf0e10cSrcweir } 589*cdf0e10cSrcweir } 590*cdf0e10cSrcweir } 591*cdf0e10cSrcweir 592*cdf0e10cSrcweir Any SAL_CALL 593*cdf0e10cSrcweir ReadOnlyEventsNameContainer::getByName( const ::rtl::OUString& aName ) throw (container::NoSuchElementException, lang::WrappedTargetException, RuntimeException){ 594*cdf0e10cSrcweir EventSupplierHash::const_iterator it = m_hEvents.find( aName ); 595*cdf0e10cSrcweir if ( it == m_hEvents.end() ) 596*cdf0e10cSrcweir throw container::NoSuchElementException(); 597*cdf0e10cSrcweir return it->second; 598*cdf0e10cSrcweir } 599*cdf0e10cSrcweir 600*cdf0e10cSrcweir Sequence< ::rtl::OUString > SAL_CALL 601*cdf0e10cSrcweir ReadOnlyEventsNameContainer::getElementNames( ) throw (RuntimeException) 602*cdf0e10cSrcweir { 603*cdf0e10cSrcweir Sequence< ::rtl::OUString > names(m_hEvents.size()); 604*cdf0e10cSrcweir rtl::OUString* pDest = names.getArray(); 605*cdf0e10cSrcweir EventSupplierHash::const_iterator it = m_hEvents.begin(); 606*cdf0e10cSrcweir EventSupplierHash::const_iterator it_end = m_hEvents.end(); 607*cdf0e10cSrcweir for ( sal_Int32 index = 0; it != it_end; ++index, ++pDest, ++it ) 608*cdf0e10cSrcweir *pDest = it->first; 609*cdf0e10cSrcweir return names; 610*cdf0e10cSrcweir } 611*cdf0e10cSrcweir 612*cdf0e10cSrcweir sal_Bool SAL_CALL 613*cdf0e10cSrcweir ReadOnlyEventsNameContainer::hasByName( const ::rtl::OUString& aName ) throw (RuntimeException) 614*cdf0e10cSrcweir { 615*cdf0e10cSrcweir EventSupplierHash::const_iterator it = m_hEvents.find( aName ); 616*cdf0e10cSrcweir if ( it == m_hEvents.end() ) 617*cdf0e10cSrcweir return sal_False; 618*cdf0e10cSrcweir return sal_True; 619*cdf0e10cSrcweir } 620*cdf0e10cSrcweir 621*cdf0e10cSrcweir typedef ::cppu::WeakImplHelper1< XScriptEventsSupplier > EventsSupplier_BASE; 622*cdf0e10cSrcweir 623*cdf0e10cSrcweir class ReadOnlyEventsSupplier : public EventsSupplier_BASE 624*cdf0e10cSrcweir { 625*cdf0e10cSrcweir public: 626*cdf0e10cSrcweir ReadOnlyEventsSupplier( const Sequence< ::rtl::OUString >& eventMethods, const rtl::OUString& sCodeName ) 627*cdf0e10cSrcweir { m_xNameContainer = new ReadOnlyEventsNameContainer( eventMethods, sCodeName ); } 628*cdf0e10cSrcweir 629*cdf0e10cSrcweir // XScriptEventSupplier 630*cdf0e10cSrcweir virtual Reference< container::XNameContainer > SAL_CALL getEvents( ) throw (RuntimeException){ return m_xNameContainer; } 631*cdf0e10cSrcweir private: 632*cdf0e10cSrcweir Reference< container::XNameContainer > m_xNameContainer; 633*cdf0e10cSrcweir }; 634*cdf0e10cSrcweir 635*cdf0e10cSrcweir typedef ::cppu::WeakImplHelper2< XScriptListener, lang::XInitialization > EventListener_BASE; 636*cdf0e10cSrcweir 637*cdf0e10cSrcweir #define EVENTLSTNR_PROPERTY_ID_MODEL 1 638*cdf0e10cSrcweir #define EVENTLSTNR_PROPERTY_MODEL ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Model" ) ) 639*cdf0e10cSrcweir 640*cdf0e10cSrcweir class EventListener : public EventListener_BASE 641*cdf0e10cSrcweir ,public ::comphelper::OMutexAndBroadcastHelper 642*cdf0e10cSrcweir ,public ::comphelper::OPropertyContainer 643*cdf0e10cSrcweir ,public ::comphelper::OPropertyArrayUsageHelper< EventListener > 644*cdf0e10cSrcweir 645*cdf0e10cSrcweir { 646*cdf0e10cSrcweir 647*cdf0e10cSrcweir public: 648*cdf0e10cSrcweir EventListener( const Reference< XComponentContext >& rxContext ); 649*cdf0e10cSrcweir // XEventListener 650*cdf0e10cSrcweir virtual void SAL_CALL disposing(const lang::EventObject& Source) throw( RuntimeException ); 651*cdf0e10cSrcweir using cppu::OPropertySetHelper::disposing; 652*cdf0e10cSrcweir 653*cdf0e10cSrcweir // XScriptListener 654*cdf0e10cSrcweir virtual void SAL_CALL firing(const ScriptEvent& evt) throw(RuntimeException); 655*cdf0e10cSrcweir virtual Any SAL_CALL approveFiring(const ScriptEvent& evt) throw(reflection::InvocationTargetException, RuntimeException); 656*cdf0e10cSrcweir // XPropertySet 657*cdf0e10cSrcweir virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw (::com::sun::star::uno::RuntimeException); 658*cdf0e10cSrcweir // XInitialization 659*cdf0e10cSrcweir virtual void SAL_CALL initialize( const Sequence< Any >& aArguments ) throw (Exception, RuntimeException); 660*cdf0e10cSrcweir // XInterface 661*cdf0e10cSrcweir DECLARE_XINTERFACE() 662*cdf0e10cSrcweir 663*cdf0e10cSrcweir // XTypeProvider 664*cdf0e10cSrcweir DECLARE_XTYPEPROVIDER() 665*cdf0e10cSrcweir virtual void SAL_CALL setFastPropertyValue( sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) 666*cdf0e10cSrcweir { 667*cdf0e10cSrcweir OPropertyContainer::setFastPropertyValue( nHandle, rValue ); 668*cdf0e10cSrcweir if ( nHandle == EVENTLSTNR_PROPERTY_ID_MODEL ) 669*cdf0e10cSrcweir setShellFromModel(); 670*cdf0e10cSrcweir } 671*cdf0e10cSrcweir 672*cdf0e10cSrcweir protected: 673*cdf0e10cSrcweir // OPropertySetHelper 674*cdf0e10cSrcweir virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper( ); 675*cdf0e10cSrcweir 676*cdf0e10cSrcweir // OPropertyArrayUsageHelper 677*cdf0e10cSrcweir virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const; 678*cdf0e10cSrcweir 679*cdf0e10cSrcweir private: 680*cdf0e10cSrcweir void setShellFromModel(); 681*cdf0e10cSrcweir void firing_Impl( const ScriptEvent& evt, Any *pSyncRet=NULL ) throw( RuntimeException ); 682*cdf0e10cSrcweir 683*cdf0e10cSrcweir Reference< XComponentContext > m_xContext; 684*cdf0e10cSrcweir Reference< frame::XModel > m_xModel; 685*cdf0e10cSrcweir SfxObjectShell* mpShell; 686*cdf0e10cSrcweir 687*cdf0e10cSrcweir }; 688*cdf0e10cSrcweir 689*cdf0e10cSrcweir EventListener::EventListener( const Reference< XComponentContext >& rxContext ) : 690*cdf0e10cSrcweir OPropertyContainer(GetBroadcastHelper()), m_xContext( rxContext ), mpShell( 0 ) 691*cdf0e10cSrcweir { 692*cdf0e10cSrcweir registerProperty( EVENTLSTNR_PROPERTY_MODEL, EVENTLSTNR_PROPERTY_ID_MODEL, 693*cdf0e10cSrcweir beans::PropertyAttribute::TRANSIENT, &m_xModel, ::getCppuType( &m_xModel ) ); 694*cdf0e10cSrcweir 695*cdf0e10cSrcweir } 696*cdf0e10cSrcweir 697*cdf0e10cSrcweir void 698*cdf0e10cSrcweir EventListener::setShellFromModel() 699*cdf0e10cSrcweir { 700*cdf0e10cSrcweir // reset mpShell 701*cdf0e10cSrcweir mpShell = 0; 702*cdf0e10cSrcweir SfxObjectShell* pShell = SfxObjectShell::GetFirst(); 703*cdf0e10cSrcweir while ( m_xModel.is() && pShell ) 704*cdf0e10cSrcweir { 705*cdf0e10cSrcweir if ( pShell->GetModel() == m_xModel ) 706*cdf0e10cSrcweir { 707*cdf0e10cSrcweir mpShell = pShell; 708*cdf0e10cSrcweir break; 709*cdf0e10cSrcweir } 710*cdf0e10cSrcweir pShell = SfxObjectShell::GetNext( *pShell ); 711*cdf0e10cSrcweir } 712*cdf0e10cSrcweir } 713*cdf0e10cSrcweir 714*cdf0e10cSrcweir //XEventListener 715*cdf0e10cSrcweir void 716*cdf0e10cSrcweir EventListener::disposing(const lang::EventObject&) throw( RuntimeException ) 717*cdf0e10cSrcweir { 718*cdf0e10cSrcweir } 719*cdf0e10cSrcweir 720*cdf0e10cSrcweir //XScriptListener 721*cdf0e10cSrcweir 722*cdf0e10cSrcweir void SAL_CALL 723*cdf0e10cSrcweir EventListener::firing(const ScriptEvent& evt) throw(RuntimeException) 724*cdf0e10cSrcweir { 725*cdf0e10cSrcweir firing_Impl( evt ); 726*cdf0e10cSrcweir } 727*cdf0e10cSrcweir 728*cdf0e10cSrcweir Any SAL_CALL 729*cdf0e10cSrcweir EventListener::approveFiring(const ScriptEvent& evt) throw(reflection::InvocationTargetException, RuntimeException) 730*cdf0e10cSrcweir { 731*cdf0e10cSrcweir Any ret; 732*cdf0e10cSrcweir firing_Impl( evt, &ret ); 733*cdf0e10cSrcweir return ret; 734*cdf0e10cSrcweir } 735*cdf0e10cSrcweir 736*cdf0e10cSrcweir // XInitialization 737*cdf0e10cSrcweir void SAL_CALL 738*cdf0e10cSrcweir EventListener::initialize( const Sequence< Any >& aArguments ) throw (Exception, RuntimeException) 739*cdf0e10cSrcweir { 740*cdf0e10cSrcweir if ( aArguments.getLength() == 1 ) 741*cdf0e10cSrcweir aArguments[0] >>= m_xModel; 742*cdf0e10cSrcweir OSL_TRACE("EventListener::initialize() args %d m_xModel %d", aArguments.getLength(), m_xModel.is() ); 743*cdf0e10cSrcweir } 744*cdf0e10cSrcweir 745*cdf0e10cSrcweir // XInterface 746*cdf0e10cSrcweir 747*cdf0e10cSrcweir IMPLEMENT_FORWARD_XINTERFACE2( EventListener, EventListener_BASE, OPropertyContainer ) 748*cdf0e10cSrcweir 749*cdf0e10cSrcweir // XTypeProvider 750*cdf0e10cSrcweir 751*cdf0e10cSrcweir IMPLEMENT_FORWARD_XTYPEPROVIDER2( EventListener, EventListener_BASE, OPropertyContainer ) 752*cdf0e10cSrcweir 753*cdf0e10cSrcweir // OPropertySetHelper 754*cdf0e10cSrcweir 755*cdf0e10cSrcweir ::cppu::IPropertyArrayHelper& 756*cdf0e10cSrcweir EventListener::getInfoHelper( ) 757*cdf0e10cSrcweir { 758*cdf0e10cSrcweir return *getArrayHelper(); 759*cdf0e10cSrcweir } 760*cdf0e10cSrcweir 761*cdf0e10cSrcweir // OPropertyArrayUsageHelper 762*cdf0e10cSrcweir 763*cdf0e10cSrcweir ::cppu::IPropertyArrayHelper* 764*cdf0e10cSrcweir EventListener::createArrayHelper( ) const 765*cdf0e10cSrcweir { 766*cdf0e10cSrcweir Sequence< beans::Property > aProps; 767*cdf0e10cSrcweir describeProperties( aProps ); 768*cdf0e10cSrcweir return new ::cppu::OPropertyArrayHelper( aProps ); 769*cdf0e10cSrcweir } 770*cdf0e10cSrcweir 771*cdf0e10cSrcweir // XPropertySet 772*cdf0e10cSrcweir Reference< beans::XPropertySetInfo > 773*cdf0e10cSrcweir EventListener::getPropertySetInfo( ) throw (RuntimeException) 774*cdf0e10cSrcweir { 775*cdf0e10cSrcweir Reference< beans::XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) ); 776*cdf0e10cSrcweir return xInfo; 777*cdf0e10cSrcweir } 778*cdf0e10cSrcweir 779*cdf0e10cSrcweir //liuchen 2009-6-23 780*cdf0e10cSrcweir //decide if the control should execute the event 781*cdf0e10cSrcweir bool ApproveAll(const ScriptEvent&, void* ) 782*cdf0e10cSrcweir { 783*cdf0e10cSrcweir return true; 784*cdf0e10cSrcweir } 785*cdf0e10cSrcweir 786*cdf0e10cSrcweir //for the given control type in evt.Arguments[0], look for if it appears in the type list in pPara 787*cdf0e10cSrcweir bool FindControl(const ScriptEvent& evt, void* pPara) 788*cdf0e10cSrcweir { 789*cdf0e10cSrcweir lang::EventObject aEvent; 790*cdf0e10cSrcweir evt.Arguments[ 0 ] >>= aEvent; 791*cdf0e10cSrcweir uno::Reference< uno::XInterface > xInterface( aEvent.Source, uno::UNO_QUERY ); 792*cdf0e10cSrcweir 793*cdf0e10cSrcweir TypeList* pTypeListInfo = static_cast<TypeList*>(pPara); 794*cdf0e10cSrcweir Type* pType = pTypeListInfo->pTypeList; 795*cdf0e10cSrcweir int nLen = pTypeListInfo->nListLength; 796*cdf0e10cSrcweir 797*cdf0e10cSrcweir for (int i = 0; i < nLen; i++) 798*cdf0e10cSrcweir { 799*cdf0e10cSrcweir if ( xInterface->queryInterface( *pType ).hasValue() ) 800*cdf0e10cSrcweir { 801*cdf0e10cSrcweir return true; 802*cdf0e10cSrcweir } 803*cdf0e10cSrcweir pType++; 804*cdf0e10cSrcweir } 805*cdf0e10cSrcweir 806*cdf0e10cSrcweir return false; 807*cdf0e10cSrcweir } 808*cdf0e10cSrcweir 809*cdf0e10cSrcweir //if the the given control type in evt.Arguments[0] appears in the type list in pPara, then approve the execution 810*cdf0e10cSrcweir bool ApproveType(const ScriptEvent& evt, void* pPara) 811*cdf0e10cSrcweir { 812*cdf0e10cSrcweir return FindControl(evt, pPara); 813*cdf0e10cSrcweir } 814*cdf0e10cSrcweir 815*cdf0e10cSrcweir //if the the given control type in evt.Arguments[0] appears in the type list in pPara, then deny the execution 816*cdf0e10cSrcweir bool DenyType(const ScriptEvent& evt, void* pPara) 817*cdf0e10cSrcweir { 818*cdf0e10cSrcweir return !FindControl(evt, pPara); 819*cdf0e10cSrcweir } 820*cdf0e10cSrcweir 821*cdf0e10cSrcweir //when mouse is moving, either the mouse button is pressed or some key is pressed can trigger the OO mouseDragged event, 822*cdf0e10cSrcweir //the former should be denyed, and the latter allowed, only by doing so can the VBA MouseMove event when the "Shift" key is 823*cdf0e10cSrcweir //pressed can be correctly triggered 824*cdf0e10cSrcweir bool DenyMouseDrag(const ScriptEvent& evt, void* ) 825*cdf0e10cSrcweir { 826*cdf0e10cSrcweir awt::MouseEvent aEvent; 827*cdf0e10cSrcweir evt.Arguments[ 0 ] >>= aEvent; 828*cdf0e10cSrcweir if (aEvent.Buttons == 0 ) 829*cdf0e10cSrcweir { 830*cdf0e10cSrcweir return true; 831*cdf0e10cSrcweir } 832*cdf0e10cSrcweir else 833*cdf0e10cSrcweir { 834*cdf0e10cSrcweir return false; 835*cdf0e10cSrcweir } 836*cdf0e10cSrcweir } 837*cdf0e10cSrcweir 838*cdf0e10cSrcweir 839*cdf0e10cSrcweir 840*cdf0e10cSrcweir //liuchen 2009-6-23 841*cdf0e10cSrcweir // EventListener 842*cdf0e10cSrcweir 843*cdf0e10cSrcweir void 844*cdf0e10cSrcweir EventListener::firing_Impl(const ScriptEvent& evt, Any* /*pRet*/ ) throw(RuntimeException) 845*cdf0e10cSrcweir { 846*cdf0e10cSrcweir OSL_TRACE("EventListener::firing_Impl( FAKE VBA_EVENTS )"); 847*cdf0e10cSrcweir static const ::rtl::OUString vbaInterOp = 848*cdf0e10cSrcweir ::rtl::OUString::createFromAscii("VBAInterop"); 849*cdf0e10cSrcweir 850*cdf0e10cSrcweir // let default handlers deal with non vba stuff 851*cdf0e10cSrcweir if ( !evt.ScriptType.equals( vbaInterOp ) ) 852*cdf0e10cSrcweir return; 853*cdf0e10cSrcweir lang::EventObject aEvent; 854*cdf0e10cSrcweir evt.Arguments[ 0 ] >>= aEvent; 855*cdf0e10cSrcweir OSL_TRACE("Argument[0] is %s", rtl::OUStringToOString( comphelper::anyToString( evt.Arguments[0] ), RTL_TEXTENCODING_UTF8 ).getStr() ); 856*cdf0e10cSrcweir OSL_TRACE("Getting Control"); 857*cdf0e10cSrcweir uno::Reference< awt::XControl > xControl( aEvent.Source, uno::UNO_QUERY_THROW ); 858*cdf0e10cSrcweir OSL_TRACE("Getting properties"); 859*cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps( xControl->getModel(), uno::UNO_QUERY_THROW ); 860*cdf0e10cSrcweir 861*cdf0e10cSrcweir rtl::OUString sName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("UserForm") ); 862*cdf0e10cSrcweir OSL_TRACE("Getting Name"); 863*cdf0e10cSrcweir 864*cdf0e10cSrcweir uno::Reference< awt::XDialog > xDlg( aEvent.Source, uno::UNO_QUERY ); 865*cdf0e10cSrcweir if ( !xDlg.is() ) 866*cdf0e10cSrcweir xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Name") ) ) >>= sName; 867*cdf0e10cSrcweir //dumpEvent( evt ); 868*cdf0e10cSrcweir EventInfoHash& infos = getEventTransInfo(); 869*cdf0e10cSrcweir EventInfoHash::const_iterator eventInfo_it = infos.find( evt.MethodName ); 870*cdf0e10cSrcweir EventInfoHash::const_iterator it_end = infos.end(); 871*cdf0e10cSrcweir if ( eventInfo_it == it_end ) 872*cdf0e10cSrcweir { 873*cdf0e10cSrcweir OSL_TRACE("Bogus event for %s", 874*cdf0e10cSrcweir rtl::OUStringToOString( evt.ScriptType, RTL_TEXTENCODING_UTF8 ).getStr() ); 875*cdf0e10cSrcweir return; 876*cdf0e10cSrcweir } 877*cdf0e10cSrcweir 878*cdf0e10cSrcweir uno::Reference< script::provider::XScriptProviderSupplier > xSPS( m_xModel, uno::UNO_QUERY ); 879*cdf0e10cSrcweir uno::Reference< script::provider::XScriptProvider > xScriptProvider; 880*cdf0e10cSrcweir if ( xSPS.is() ) 881*cdf0e10cSrcweir xScriptProvider = xSPS->getScriptProvider(); 882*cdf0e10cSrcweir if ( xScriptProvider.is() && mpShell ) 883*cdf0e10cSrcweir { 884*cdf0e10cSrcweir std::list< TranslateInfo > matchingMethods; 885*cdf0e10cSrcweir std::list< TranslateInfo >::const_iterator txInfo = 886*cdf0e10cSrcweir eventInfo_it->second.begin(); 887*cdf0e10cSrcweir std::list< TranslateInfo >::const_iterator txInfo_end = eventInfo_it->second.end(); 888*cdf0e10cSrcweir rtl::OUString sMacroLoc = rtl::OUString::createFromAscii("Standard.").concat( evt.ScriptCode ).concat( rtl::OUString::createFromAscii(".") ); 889*cdf0e10cSrcweir 890*cdf0e10cSrcweir StarBASIC* pBasic = mpShell->GetBasic(); 891*cdf0e10cSrcweir SbModule* pModule = pBasic->FindModule( evt.ScriptCode ); 892*cdf0e10cSrcweir for ( ; pModule && txInfo != txInfo_end; ++txInfo ) 893*cdf0e10cSrcweir { 894*cdf0e10cSrcweir // see if we have a match for the handlerextension 895*cdf0e10cSrcweir // where ScriptCode is methodname_handlerextension 896*cdf0e10cSrcweir rtl::OUString sTemp = sName.concat( (*txInfo).sVBAName ); 897*cdf0e10cSrcweir 898*cdf0e10cSrcweir OSL_TRACE("*** trying to invoke %s ", 899*cdf0e10cSrcweir rtl::OUStringToOString( sTemp, RTL_TEXTENCODING_UTF8 ).getStr() ); 900*cdf0e10cSrcweir SbMethod* pMeth = static_cast< SbMethod* >( pModule->Find( sTemp, SbxCLASS_METHOD ) ); 901*cdf0e10cSrcweir if ( pMeth ) 902*cdf0e10cSrcweir { 903*cdf0e10cSrcweir //liuchen 2009-6-8 904*cdf0e10cSrcweir if (! txInfo->ApproveRule(evt, txInfo->pPara) ) 905*cdf0e10cSrcweir { 906*cdf0e10cSrcweir continue; 907*cdf0e10cSrcweir } 908*cdf0e10cSrcweir //liuchen 2009-6-8 909*cdf0e10cSrcweir // !! translate arguments & emulate events where necessary 910*cdf0e10cSrcweir Sequence< Any > aArguments; 911*cdf0e10cSrcweir if ( (*txInfo).toVBA ) 912*cdf0e10cSrcweir aArguments = (*txInfo).toVBA( evt.Arguments ); 913*cdf0e10cSrcweir else 914*cdf0e10cSrcweir aArguments = evt.Arguments; 915*cdf0e10cSrcweir if ( aArguments.getLength() ) 916*cdf0e10cSrcweir { 917*cdf0e10cSrcweir // call basic event handlers for event 918*cdf0e10cSrcweir 919*cdf0e10cSrcweir static rtl::OUString part1 = rtl::OUString::createFromAscii( "vnd.sun.star.script:"); 920*cdf0e10cSrcweir static rtl::OUString part2 = rtl::OUString::createFromAscii("?language=Basic&location=document"); 921*cdf0e10cSrcweir 922*cdf0e10cSrcweir // create script url 923*cdf0e10cSrcweir rtl::OUString url = part1 + sMacroLoc + sTemp + part2; 924*cdf0e10cSrcweir 925*cdf0e10cSrcweir OSL_TRACE("script url = %s", 926*cdf0e10cSrcweir rtl::OUStringToOString( url, 927*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8 ).getStr() ); 928*cdf0e10cSrcweir Sequence< sal_Int16 > aOutArgsIndex; 929*cdf0e10cSrcweir Sequence< Any > aOutArgs; 930*cdf0e10cSrcweir try 931*cdf0e10cSrcweir { 932*cdf0e10cSrcweir if ( mpShell ) 933*cdf0e10cSrcweir { 934*cdf0e10cSrcweir uno::Any aRet; 935*cdf0e10cSrcweir mpShell->CallXScript( url, 936*cdf0e10cSrcweir aArguments, aRet, aOutArgsIndex, aOutArgs, false ); 937*cdf0e10cSrcweir } 938*cdf0e10cSrcweir } 939*cdf0e10cSrcweir catch ( uno::Exception& e ) 940*cdf0e10cSrcweir { 941*cdf0e10cSrcweir OSL_TRACE("event script raised %s", rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr() ); 942*cdf0e10cSrcweir } 943*cdf0e10cSrcweir } 944*cdf0e10cSrcweir } 945*cdf0e10cSrcweir } 946*cdf0e10cSrcweir } 947*cdf0e10cSrcweir } 948*cdf0e10cSrcweir 949*cdf0e10cSrcweir typedef ::cppu::WeakImplHelper1< XVBAToOOEventDescGen > VBAToOOEventDescGen_BASE; 950*cdf0e10cSrcweir 951*cdf0e10cSrcweir 952*cdf0e10cSrcweir class VBAToOOEventDescGen : public VBAToOOEventDescGen_BASE 953*cdf0e10cSrcweir { 954*cdf0e10cSrcweir public: 955*cdf0e10cSrcweir VBAToOOEventDescGen( const Reference< XComponentContext >& rxContext ); 956*cdf0e10cSrcweir 957*cdf0e10cSrcweir // XVBAToOOEventDescGen 958*cdf0e10cSrcweir virtual Sequence< ScriptEventDescriptor > SAL_CALL getEventDescriptions( const Reference< XInterface >& control, const rtl::OUString& sCodeName ) throw (RuntimeException); 959*cdf0e10cSrcweir virtual Reference< XScriptEventsSupplier > SAL_CALL getEventSupplier( const Reference< XInterface >& xControl, const rtl::OUString& sCodeName ) throw (::com::sun::star::uno::RuntimeException); 960*cdf0e10cSrcweir private: 961*cdf0e10cSrcweir Reference< XComponentContext > m_xContext; 962*cdf0e10cSrcweir 963*cdf0e10cSrcweir }; 964*cdf0e10cSrcweir 965*cdf0e10cSrcweir VBAToOOEventDescGen::VBAToOOEventDescGen( const Reference< XComponentContext >& rxContext ):m_xContext( rxContext ) {} 966*cdf0e10cSrcweir 967*cdf0e10cSrcweir Sequence< ScriptEventDescriptor > SAL_CALL 968*cdf0e10cSrcweir VBAToOOEventDescGen::getEventDescriptions( const Reference< XInterface >& xControl, const rtl::OUString& sCodeName ) throw (RuntimeException) 969*cdf0e10cSrcweir { 970*cdf0e10cSrcweir ScriptEventHelper evntHelper( xControl ); 971*cdf0e10cSrcweir return evntHelper.createEvents( sCodeName ); 972*cdf0e10cSrcweir } 973*cdf0e10cSrcweir 974*cdf0e10cSrcweir Reference< XScriptEventsSupplier > SAL_CALL 975*cdf0e10cSrcweir VBAToOOEventDescGen::getEventSupplier( const Reference< XInterface >& xControl, const rtl::OUString& sCodeName ) throw (::com::sun::star::uno::RuntimeException) 976*cdf0e10cSrcweir { 977*cdf0e10cSrcweir ScriptEventHelper evntHelper( xControl ); 978*cdf0e10cSrcweir Reference< XScriptEventsSupplier > xSupplier = 979*cdf0e10cSrcweir new ReadOnlyEventsSupplier( 980*cdf0e10cSrcweir evntHelper.getEventListeners(), sCodeName ) ; 981*cdf0e10cSrcweir return xSupplier; 982*cdf0e10cSrcweir } 983*cdf0e10cSrcweir 984*cdf0e10cSrcweir // Component related 985*cdf0e10cSrcweir 986*cdf0e10cSrcweir namespace evtlstner 987*cdf0e10cSrcweir { 988*cdf0e10cSrcweir ::rtl::OUString SAL_CALL getImplementationName() 989*cdf0e10cSrcweir { 990*cdf0e10cSrcweir static ::rtl::OUString* pImplName = 0; 991*cdf0e10cSrcweir if ( !pImplName ) 992*cdf0e10cSrcweir { 993*cdf0e10cSrcweir ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); 994*cdf0e10cSrcweir if ( !pImplName ) 995*cdf0e10cSrcweir { 996*cdf0e10cSrcweir static ::rtl::OUString aImplName( RTL_CONSTASCII_USTRINGPARAM( "ooo.vba.EventListener" ) ); 997*cdf0e10cSrcweir pImplName = &aImplName; 998*cdf0e10cSrcweir } 999*cdf0e10cSrcweir } 1000*cdf0e10cSrcweir return *pImplName; 1001*cdf0e10cSrcweir } 1002*cdf0e10cSrcweir 1003*cdf0e10cSrcweir uno::Reference< XInterface > SAL_CALL create( 1004*cdf0e10cSrcweir Reference< XComponentContext > const & xContext ) 1005*cdf0e10cSrcweir SAL_THROW( () ) 1006*cdf0e10cSrcweir { 1007*cdf0e10cSrcweir return static_cast< lang::XTypeProvider * >( new EventListener( xContext ) ); 1008*cdf0e10cSrcweir } 1009*cdf0e10cSrcweir 1010*cdf0e10cSrcweir Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() 1011*cdf0e10cSrcweir { 1012*cdf0e10cSrcweir const ::rtl::OUString strName( ::evtlstner::getImplementationName() ); 1013*cdf0e10cSrcweir return Sequence< ::rtl::OUString >( &strName, 1 ); 1014*cdf0e10cSrcweir } 1015*cdf0e10cSrcweir } 1016*cdf0e10cSrcweir namespace ooevtdescgen 1017*cdf0e10cSrcweir { 1018*cdf0e10cSrcweir ::rtl::OUString SAL_CALL getImplementationName() 1019*cdf0e10cSrcweir { 1020*cdf0e10cSrcweir static ::rtl::OUString* pImplName = 0; 1021*cdf0e10cSrcweir if ( !pImplName ) 1022*cdf0e10cSrcweir { 1023*cdf0e10cSrcweir ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); 1024*cdf0e10cSrcweir if ( !pImplName ) 1025*cdf0e10cSrcweir { 1026*cdf0e10cSrcweir static ::rtl::OUString aImplName( RTL_CONSTASCII_USTRINGPARAM( "ooo.vba.VBAToOOEventDesc" ) ); 1027*cdf0e10cSrcweir pImplName = &aImplName; 1028*cdf0e10cSrcweir } 1029*cdf0e10cSrcweir } 1030*cdf0e10cSrcweir return *pImplName; 1031*cdf0e10cSrcweir } 1032*cdf0e10cSrcweir 1033*cdf0e10cSrcweir uno::Reference< XInterface > SAL_CALL create( 1034*cdf0e10cSrcweir Reference< XComponentContext > const & xContext ) 1035*cdf0e10cSrcweir SAL_THROW( () ) 1036*cdf0e10cSrcweir { 1037*cdf0e10cSrcweir return static_cast< lang::XTypeProvider * >( new VBAToOOEventDescGen( xContext ) ); 1038*cdf0e10cSrcweir } 1039*cdf0e10cSrcweir 1040*cdf0e10cSrcweir Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() 1041*cdf0e10cSrcweir { 1042*cdf0e10cSrcweir const ::rtl::OUString strName( ::ooevtdescgen::getImplementationName() ); 1043*cdf0e10cSrcweir return Sequence< ::rtl::OUString >( &strName, 1 ); 1044*cdf0e10cSrcweir } 1045*cdf0e10cSrcweir } 1046