1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_sfx2.hxx" 30 #include <vcl/msgbox.hxx> 31 #include <tools/resary.hxx> 32 #include <svl/lstner.hxx> 33 #include <basic/basmgr.hxx> 34 #include <basic/sbmod.hxx> 35 #include <tools/urlobj.hxx> 36 #include <basic/sbx.hxx> 37 #include <sot/storage.hxx> 38 #include <unotools/securityoptions.hxx> 39 40 #include <rtl/ustring.h> 41 #include <com/sun/star/uno/Any.hxx> 42 #include <framework/eventsconfiguration.hxx> 43 #include <comphelper/processfactory.hxx> 44 #include <sfx2/evntconf.hxx> 45 46 #include <sfx2/docfile.hxx> 47 #include <sfx2/app.hxx> 48 #include <sfx2/objsh.hxx> 49 #include <sfx2/dispatch.hxx> 50 #include "sfx2/sfxresid.hxx" 51 #include "eventsupplier.hxx" 52 53 #include <com/sun/star/beans/PropertyValue.hpp> 54 #include <com/sun/star/container/XNameReplace.hpp> 55 #include <com/sun/star/document/XEventsSupplier.hpp> 56 #include <com/sun/star/uno/Sequence.hxx> 57 #include <com/sun/star/uno/Reference.hxx> 58 59 // ----------------------------------------------------------------------- 60 TYPEINIT1(SfxEventHint, SfxHint); 61 TYPEINIT1(SfxEventNamesItem, SfxPoolItem); 62 TYPEINIT1(SfxViewEventHint, SfxEventHint); 63 64 using namespace com::sun::star; 65 66 SfxEventNamesList& SfxEventNamesList::operator=( const SfxEventNamesList& rTbl ) 67 { 68 DelDtor(); 69 for (sal_uInt16 n=0; n<rTbl.Count(); n++ ) 70 { 71 SfxEventName* pTmp = ((SfxEventNamesList&)rTbl).GetObject(n); 72 SfxEventName *pNew = new SfxEventName( *pTmp ); 73 Insert( pNew, n ); 74 } 75 return *this; 76 } 77 78 void SfxEventNamesList::DelDtor() 79 { 80 SfxEventName* pTmp = First(); 81 while( pTmp ) 82 { 83 delete pTmp; 84 pTmp = Next(); 85 } 86 Clear(); 87 } 88 89 int SfxEventNamesItem::operator==( const SfxPoolItem& rAttr ) const 90 { 91 DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unequal types" ); 92 93 const SfxEventNamesList& rOwn = aEventsList; 94 const SfxEventNamesList& rOther = ( (SfxEventNamesItem&) rAttr ).aEventsList; 95 96 if ( rOwn.Count() != rOther.Count() ) 97 return sal_False; 98 99 for ( sal_uInt16 nNo = 0; nNo < rOwn.Count(); ++nNo ) 100 { 101 const SfxEventName *pOwn = rOwn.GetObject(nNo); 102 const SfxEventName *pOther = rOther.GetObject(nNo); 103 if ( pOwn->mnId != pOther->mnId || 104 pOwn->maEventName != pOther->maEventName || 105 pOwn->maUIName != pOther->maUIName ) 106 return sal_False; 107 } 108 109 return sal_True; 110 111 } 112 113 SfxItemPresentation SfxEventNamesItem::GetPresentation( SfxItemPresentation, 114 SfxMapUnit, 115 SfxMapUnit, 116 XubString &rText, 117 const IntlWrapper* ) const 118 { 119 rText.Erase(); 120 return SFX_ITEM_PRESENTATION_NONE; 121 } 122 123 SfxPoolItem* SfxEventNamesItem::Clone( SfxItemPool *) const 124 { 125 return new SfxEventNamesItem(*this); 126 } 127 128 SfxPoolItem* SfxEventNamesItem::Create(SvStream &, sal_uInt16) const 129 { 130 DBG_ERROR("not streamable!"); 131 return new SfxEventNamesItem(Which()); 132 } 133 134 SvStream& SfxEventNamesItem::Store(SvStream &rStream, sal_uInt16 ) const 135 { 136 DBG_ERROR("not streamable!"); 137 return rStream; 138 } 139 140 sal_uInt16 SfxEventNamesItem::GetVersion( sal_uInt16 ) const 141 { 142 DBG_ERROR("not streamable!"); 143 return 0; 144 } 145 146 void SfxEventNamesItem::AddEvent( const String& rName, const String& rUIName, sal_uInt16 nID ) 147 { 148 aEventsList.Insert( new SfxEventName( nID, rName, rUIName.Len() ? rUIName : rName ) ); 149 } 150 151 152 //========================================================================== 153 154 //-------------------------------------------------------------------------- 155 uno::Any CreateEventData_Impl( const SvxMacro *pMacro ) 156 { 157 /* 158 This function converts a SvxMacro into an Any containing three 159 properties. These properties are EventType and Script. Possible 160 values for EventType ar StarBasic, JavaScript, ... 161 The Script property should contain the URL to the macro and looks 162 like "macro://./standard.module1.main()" 163 164 If pMacro is NULL, we return an empty property sequence, so PropagateEvent_Impl 165 can delete an event binding. 166 */ 167 uno::Any aEventData; 168 169 if ( pMacro ) 170 { 171 if ( pMacro->GetScriptType() == STARBASIC ) 172 { 173 uno::Sequence < beans::PropertyValue > aProperties(3); 174 beans::PropertyValue *pValues = aProperties.getArray(); 175 176 ::rtl::OUString aType = ::rtl::OUString::createFromAscii( STAR_BASIC );; 177 ::rtl::OUString aLib = pMacro->GetLibName(); 178 ::rtl::OUString aMacro = pMacro->GetMacName(); 179 180 pValues[ 0 ].Name = ::rtl::OUString::createFromAscii( PROP_EVENT_TYPE ); 181 pValues[ 0 ].Value <<= aType; 182 183 pValues[ 1 ].Name = ::rtl::OUString::createFromAscii( PROP_LIBRARY ); 184 pValues[ 1 ].Value <<= aLib; 185 186 pValues[ 2 ].Name = ::rtl::OUString::createFromAscii( PROP_MACRO_NAME ); 187 pValues[ 2 ].Value <<= aMacro; 188 189 aEventData <<= aProperties; 190 } 191 else if ( pMacro->GetScriptType() == EXTENDED_STYPE ) 192 { 193 uno::Sequence < beans::PropertyValue > aProperties(2); 194 beans::PropertyValue *pValues = aProperties.getArray(); 195 196 ::rtl::OUString aLib = pMacro->GetLibName(); 197 ::rtl::OUString aMacro = pMacro->GetMacName(); 198 199 pValues[ 0 ].Name = ::rtl::OUString::createFromAscii( PROP_EVENT_TYPE ); 200 pValues[ 0 ].Value <<= aLib; 201 202 pValues[ 1 ].Name = ::rtl::OUString::createFromAscii( PROP_SCRIPT ); 203 pValues[ 1 ].Value <<= aMacro; 204 205 aEventData <<= aProperties; 206 } 207 else if ( pMacro->GetScriptType() == JAVASCRIPT ) 208 { 209 uno::Sequence < beans::PropertyValue > aProperties(2); 210 beans::PropertyValue *pValues = aProperties.getArray(); 211 212 ::rtl::OUString aMacro = pMacro->GetMacName(); 213 214 pValues[ 0 ].Name = ::rtl::OUString::createFromAscii( PROP_EVENT_TYPE ); 215 pValues[ 0 ].Value <<= ::rtl::OUString::createFromAscii(SVX_MACRO_LANGUAGE_JAVASCRIPT); 216 217 pValues[ 1 ].Name = ::rtl::OUString::createFromAscii( PROP_MACRO_NAME ); 218 pValues[ 1 ].Value <<= aMacro; 219 220 aEventData <<= aProperties; 221 } 222 else 223 { 224 DBG_ERRORFILE( "CreateEventData_Impl(): ScriptType not supported!"); 225 } 226 } 227 else 228 { 229 uno::Sequence < beans::PropertyValue > aProperties; 230 aEventData <<= aProperties; 231 } 232 233 return aEventData; 234 } 235 236 //-------------------------------------------------------------------------- 237 void PropagateEvent_Impl( SfxObjectShell *pDoc, rtl::OUString aEventName, const SvxMacro* pMacro ) 238 { 239 uno::Reference < document::XEventsSupplier > xSupplier; 240 if ( pDoc ) 241 { 242 xSupplier = uno::Reference < document::XEventsSupplier >( pDoc->GetModel(), uno::UNO_QUERY ); 243 } 244 else 245 { 246 xSupplier = uno::Reference < document::XEventsSupplier > 247 ( ::comphelper::getProcessServiceFactory()->createInstance( 248 rtl::OUString::createFromAscii("com.sun.star.frame.GlobalEventBroadcaster" )), uno::UNO_QUERY ); 249 } 250 251 if ( xSupplier.is() ) 252 { 253 uno::Reference < container::XNameReplace > xEvents = xSupplier->getEvents(); 254 if ( aEventName.getLength() ) 255 { 256 uno::Any aEventData = CreateEventData_Impl( pMacro ); 257 258 try 259 { 260 xEvents->replaceByName( aEventName, aEventData ); 261 } 262 catch( ::com::sun::star::lang::IllegalArgumentException ) 263 { DBG_ERRORFILE( "PropagateEvents_Impl: caught IllegalArgumentException" ); } 264 catch( ::com::sun::star::container::NoSuchElementException ) 265 { DBG_ERRORFILE( "PropagateEvents_Impl: caught NoSuchElementException" ); } 266 } 267 else { 268 DBG_WARNING( "PropagateEvents_Impl: Got unkown event" ); 269 } 270 } 271 } 272 273 //-------------------------------------------------------------------------------------------------------- 274 void SfxEventConfiguration::ConfigureEvent( rtl::OUString aName, const SvxMacro& rMacro, SfxObjectShell *pDoc ) 275 { 276 SvxMacro *pMacro = NULL; 277 if ( rMacro.GetMacName().Len() ) 278 pMacro = new SvxMacro( rMacro.GetMacName(), rMacro.GetLibName(), rMacro.GetScriptType() ); 279 if ( pDoc ) 280 { 281 PropagateEvent_Impl( pDoc, aName, pMacro ); 282 } 283 else 284 { 285 PropagateEvent_Impl( NULL, aName, pMacro ); 286 } 287 } 288 289 // ------------------------------------------------------------------------------------------------------- 290 SvxMacro* SfxEventConfiguration::ConvertToMacro( const com::sun::star::uno::Any& rElement, SfxObjectShell* pDoc, sal_Bool bBlowUp ) 291 { 292 return SfxEvents_Impl::ConvertToMacro( rElement, pDoc, bBlowUp ); 293 } 294