1*d119d52dSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*d119d52dSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*d119d52dSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*d119d52dSAndrew Rist * distributed with this work for additional information 6*d119d52dSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*d119d52dSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*d119d52dSAndrew Rist * "License"); you may not use this file except in compliance 9*d119d52dSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*d119d52dSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*d119d52dSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*d119d52dSAndrew Rist * software distributed under the License is distributed on an 15*d119d52dSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*d119d52dSAndrew Rist * KIND, either express or implied. See the License for the 17*d119d52dSAndrew Rist * specific language governing permissions and limitations 18*d119d52dSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*d119d52dSAndrew Rist *************************************************************/ 21*d119d52dSAndrew Rist 22*d119d52dSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir 25cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 26cdf0e10cSrcweir #include "precompiled_sfx2.hxx" 27cdf0e10cSrcweir 28cdf0e10cSrcweir #include <com/sun/star/frame/DispatchStatement.hpp> 29cdf0e10cSrcweir #include <com/sun/star/container/XIndexReplace.hpp> 30cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp> 31cdf0e10cSrcweir #include <com/sun/star/uno/Sequence.hxx> 32cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 33cdf0e10cSrcweir #include <com/sun/star/util/XURLTransformer.hpp> 34cdf0e10cSrcweir #include <com/sun/star/frame/XDispatchRecorderSupplier.hpp> 35cdf0e10cSrcweir #include <svl/itemiter.hxx> 36cdf0e10cSrcweir 37cdf0e10cSrcweir #ifndef _ARGS_HXX //autogen 38cdf0e10cSrcweir #include <svl/itempool.hxx> 39cdf0e10cSrcweir #endif 40cdf0e10cSrcweir #include <svtools/itemdel.hxx> 41cdf0e10cSrcweir 42cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 43cdf0e10cSrcweir 44cdf0e10cSrcweir #ifndef GCC 45cdf0e10cSrcweir #endif 46cdf0e10cSrcweir 47cdf0e10cSrcweir #include <svl/smplhint.hxx> 48cdf0e10cSrcweir 49cdf0e10cSrcweir #include <sfx2/request.hxx> 50cdf0e10cSrcweir #include <sfx2/dispatch.hxx> 51cdf0e10cSrcweir #include <sfx2/msg.hxx> 52cdf0e10cSrcweir #include <sfx2/viewfrm.hxx> 53cdf0e10cSrcweir #include "macro.hxx" 54cdf0e10cSrcweir #include <sfx2/objface.hxx> 55cdf0e10cSrcweir #include <sfx2/appuno.hxx> 56cdf0e10cSrcweir 57cdf0e10cSrcweir //=================================================================== 58cdf0e10cSrcweir 59cdf0e10cSrcweir using namespace ::com::sun::star; 60cdf0e10cSrcweir 61cdf0e10cSrcweir struct SfxRequest_Impl: public SfxListener 62cdf0e10cSrcweir 63cdf0e10cSrcweir /* [Beschreibung] 64cdf0e10cSrcweir 65cdf0e10cSrcweir Implementations-Struktur der Klasse <SfxRequest>. 66cdf0e10cSrcweir */ 67cdf0e10cSrcweir 68cdf0e10cSrcweir { 69cdf0e10cSrcweir SfxRequest* pAnti; // Owner wegen sterbendem Pool 70cdf0e10cSrcweir String aTarget; // ggf. von App gesetztes Zielobjekt 71cdf0e10cSrcweir SfxItemPool* pPool; // ItemSet mit diesem Pool bauen 72cdf0e10cSrcweir SfxPoolItem* pRetVal; // R"uckgabewert geh"ort sich selbst 73cdf0e10cSrcweir SfxShell* pShell; // ausgef"uhrt an dieser Shell 74cdf0e10cSrcweir const SfxSlot* pSlot; // ausgef"uhrter Slot 75cdf0e10cSrcweir sal_uInt16 nModifier; // welche Modifier waren gedrueckt? 76cdf0e10cSrcweir sal_Bool bDone; // "uberhaupt ausgef"uhrt 77cdf0e10cSrcweir sal_Bool bIgnored; // vom User abgebrochen 78cdf0e10cSrcweir sal_Bool bCancelled; // nicht mehr zustellen 79cdf0e10cSrcweir sal_Bool bUseTarget; // aTarget wurde von Applikation gesetzt 80cdf0e10cSrcweir sal_uInt16 nCallMode; // Synch/Asynch/API/Record 81cdf0e10cSrcweir sal_Bool bAllowRecording; 82cdf0e10cSrcweir SfxAllItemSet* pInternalArgs; 83cdf0e10cSrcweir SfxViewFrame* pViewFrame; 84cdf0e10cSrcweir 85cdf0e10cSrcweir com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorder > xRecorder; 86cdf0e10cSrcweir 87cdf0e10cSrcweir SfxRequest_Impl( SfxRequest *pOwner ) 88cdf0e10cSrcweir : pAnti( pOwner) 89cdf0e10cSrcweir , pPool(0) 90cdf0e10cSrcweir , nModifier(0) 91cdf0e10cSrcweir , bCancelled(sal_False) 92cdf0e10cSrcweir , nCallMode( SFX_CALLMODE_SYNCHRON ) 93cdf0e10cSrcweir , bAllowRecording( sal_False ) 94cdf0e10cSrcweir , pInternalArgs( 0 ) 95cdf0e10cSrcweir , pViewFrame(0) 96cdf0e10cSrcweir {} 97cdf0e10cSrcweir ~SfxRequest_Impl() { delete pInternalArgs; } 98cdf0e10cSrcweir 99cdf0e10cSrcweir 100cdf0e10cSrcweir void SetPool( SfxItemPool *pNewPool ); 101cdf0e10cSrcweir virtual void Notify( SfxBroadcaster &rBC, const SfxHint &rHint ); 102cdf0e10cSrcweir void Record( const uno::Sequence < beans::PropertyValue >& rArgs ); 103cdf0e10cSrcweir }; 104cdf0e10cSrcweir 105cdf0e10cSrcweir 106cdf0e10cSrcweir //==================================================================== 107cdf0e10cSrcweir 108cdf0e10cSrcweir void SfxRequest_Impl::Notify( SfxBroadcaster&, const SfxHint &rHint ) 109cdf0e10cSrcweir { 110cdf0e10cSrcweir SfxSimpleHint *pSimpleHint = PTR_CAST(SfxSimpleHint, &rHint); 111cdf0e10cSrcweir if ( pSimpleHint && pSimpleHint->GetId() == SFX_HINT_DYING ) 112cdf0e10cSrcweir pAnti->Cancel(); 113cdf0e10cSrcweir } 114cdf0e10cSrcweir 115cdf0e10cSrcweir //==================================================================== 116cdf0e10cSrcweir 117cdf0e10cSrcweir void SfxRequest_Impl::SetPool( SfxItemPool *pNewPool ) 118cdf0e10cSrcweir { 119cdf0e10cSrcweir if ( pNewPool != pPool ) 120cdf0e10cSrcweir { 121cdf0e10cSrcweir if ( pPool ) 122cdf0e10cSrcweir EndListening( pPool->BC() ); 123cdf0e10cSrcweir pPool = pNewPool; 124cdf0e10cSrcweir if ( pNewPool ) 125cdf0e10cSrcweir StartListening( pNewPool->BC() ); 126cdf0e10cSrcweir } 127cdf0e10cSrcweir } 128cdf0e10cSrcweir 129cdf0e10cSrcweir //==================================================================== 130cdf0e10cSrcweir 131cdf0e10cSrcweir 132cdf0e10cSrcweir SfxRequest::~SfxRequest() 133cdf0e10cSrcweir { 134cdf0e10cSrcweir DBG_MEMTEST(); 135cdf0e10cSrcweir 136cdf0e10cSrcweir // nicht mit Done() marktierte Requests mit 'rem' rausschreiben 137cdf0e10cSrcweir if ( pImp->xRecorder.is() && !pImp->bDone && !pImp->bIgnored ) 138cdf0e10cSrcweir pImp->Record( uno::Sequence < beans::PropertyValue >() ); 139cdf0e10cSrcweir 140cdf0e10cSrcweir // Objekt abr"aumen 141cdf0e10cSrcweir delete pArgs; 142cdf0e10cSrcweir if ( pImp->pRetVal ) 143cdf0e10cSrcweir DeleteItemOnIdle(pImp->pRetVal); 144cdf0e10cSrcweir delete pImp; 145cdf0e10cSrcweir } 146cdf0e10cSrcweir //-------------------------------------------------------------------- 147cdf0e10cSrcweir 148cdf0e10cSrcweir 149cdf0e10cSrcweir SfxRequest::SfxRequest 150cdf0e10cSrcweir ( 151cdf0e10cSrcweir const SfxRequest& rOrig 152cdf0e10cSrcweir ) 153cdf0e10cSrcweir : SfxHint( rOrig ), 154cdf0e10cSrcweir nSlot(rOrig.nSlot), 155cdf0e10cSrcweir pArgs(rOrig.pArgs? new SfxAllItemSet(*rOrig.pArgs): 0), 156cdf0e10cSrcweir pImp( new SfxRequest_Impl(this) ) 157cdf0e10cSrcweir { 158cdf0e10cSrcweir DBG_MEMTEST(); 159cdf0e10cSrcweir 160cdf0e10cSrcweir pImp->bAllowRecording = rOrig.pImp->bAllowRecording; 161cdf0e10cSrcweir pImp->bDone = sal_False; 162cdf0e10cSrcweir pImp->bIgnored = sal_False; 163cdf0e10cSrcweir pImp->pRetVal = 0; 164cdf0e10cSrcweir pImp->pShell = 0; 165cdf0e10cSrcweir pImp->pSlot = 0; 166cdf0e10cSrcweir pImp->nCallMode = rOrig.pImp->nCallMode; 167cdf0e10cSrcweir pImp->bUseTarget = rOrig.pImp->bUseTarget; 168cdf0e10cSrcweir pImp->aTarget = rOrig.pImp->aTarget; 169cdf0e10cSrcweir pImp->nModifier = rOrig.pImp->nModifier; 170cdf0e10cSrcweir 171cdf0e10cSrcweir // deep copy needed ! 172cdf0e10cSrcweir pImp->pInternalArgs = (rOrig.pImp->pInternalArgs ? new SfxAllItemSet(*rOrig.pImp->pInternalArgs) : 0); 173cdf0e10cSrcweir 174cdf0e10cSrcweir if ( pArgs ) 175cdf0e10cSrcweir pImp->SetPool( pArgs->GetPool() ); 176cdf0e10cSrcweir else 177cdf0e10cSrcweir pImp->SetPool( rOrig.pImp->pPool ); 178cdf0e10cSrcweir } 179cdf0e10cSrcweir //-------------------------------------------------------------------- 180cdf0e10cSrcweir 181cdf0e10cSrcweir 182cdf0e10cSrcweir SfxRequest::SfxRequest 183cdf0e10cSrcweir ( 184cdf0e10cSrcweir SfxViewFrame* pViewFrame, 185cdf0e10cSrcweir sal_uInt16 nSlotId 186cdf0e10cSrcweir 187cdf0e10cSrcweir ) 188cdf0e10cSrcweir 189cdf0e10cSrcweir /* [Beschreibung] 190cdf0e10cSrcweir 191cdf0e10cSrcweir Mit diesem Konstruktor k"onnen Events, die nicht "uber den SfxDispatcher 192cdf0e10cSrcweir gelaufen sind (z.B aus KeyInput() oder Mouse-Events) nachtr"aglich 193cdf0e10cSrcweir recorded werden. Dazu wird eine SfxRequest-Instanz mit diesem Konstruktor 194cdf0e10cSrcweir erzeugt und dann genauso verfahren, wie mit einem SfxRequest, der in 195cdf0e10cSrcweir eine <Slot-Execute-Methode> als Parameter gegeben wird. 196cdf0e10cSrcweir */ 197cdf0e10cSrcweir 198cdf0e10cSrcweir : nSlot(nSlotId), 199cdf0e10cSrcweir pArgs(0), 200cdf0e10cSrcweir pImp( new SfxRequest_Impl(this) ) 201cdf0e10cSrcweir { 202cdf0e10cSrcweir DBG_MEMTEST(); 203cdf0e10cSrcweir 204cdf0e10cSrcweir pImp->bDone = sal_False; 205cdf0e10cSrcweir pImp->bIgnored = sal_False; 206cdf0e10cSrcweir pImp->SetPool( &pViewFrame->GetPool() ); 207cdf0e10cSrcweir pImp->pRetVal = 0; 208cdf0e10cSrcweir pImp->pShell = 0; 209cdf0e10cSrcweir pImp->pSlot = 0; 210cdf0e10cSrcweir pImp->nCallMode = SFX_CALLMODE_SYNCHRON; 211cdf0e10cSrcweir pImp->bUseTarget = sal_False; 212cdf0e10cSrcweir pImp->pViewFrame = pViewFrame; 213cdf0e10cSrcweir if( pImp->pViewFrame->GetDispatcher()->GetShellAndSlot_Impl( nSlotId, &pImp->pShell, &pImp->pSlot, sal_True, sal_True ) ) 214cdf0e10cSrcweir { 215cdf0e10cSrcweir pImp->SetPool( &pImp->pShell->GetPool() ); 216cdf0e10cSrcweir pImp->xRecorder = SfxRequest::GetMacroRecorder( pViewFrame ); 217cdf0e10cSrcweir pImp->aTarget = pImp->pShell->GetName(); 218cdf0e10cSrcweir } 219cdf0e10cSrcweir #ifdef DBG_UTIL 220cdf0e10cSrcweir else 221cdf0e10cSrcweir { 222cdf0e10cSrcweir ByteString aStr( "Recording unsupported slot: "); 223cdf0e10cSrcweir aStr += ByteString::CreateFromInt32( pImp->pPool->GetSlotId(nSlotId) ); 224cdf0e10cSrcweir DBG_ERROR( aStr.GetBuffer() ); 225cdf0e10cSrcweir } 226cdf0e10cSrcweir #endif 227cdf0e10cSrcweir } 228cdf0e10cSrcweir 229cdf0e10cSrcweir //-------------------------------------------------------------------- 230cdf0e10cSrcweir 231cdf0e10cSrcweir 232cdf0e10cSrcweir SfxRequest::SfxRequest 233cdf0e10cSrcweir ( 234cdf0e10cSrcweir sal_uInt16 nSlotId, // auszuf"uhrende <Slot-Id> 235cdf0e10cSrcweir SfxCallMode nMode, // Synch/API/... 236cdf0e10cSrcweir SfxItemPool& rPool // ggf. f"ur das SfxItemSet f"ur Parameter 237cdf0e10cSrcweir ) 238cdf0e10cSrcweir 239cdf0e10cSrcweir // creates a SfxRequest without arguments 240cdf0e10cSrcweir 241cdf0e10cSrcweir : nSlot(nSlotId), 242cdf0e10cSrcweir pArgs(0), 243cdf0e10cSrcweir pImp( new SfxRequest_Impl(this) ) 244cdf0e10cSrcweir { 245cdf0e10cSrcweir DBG_MEMTEST(); 246cdf0e10cSrcweir 247cdf0e10cSrcweir pImp->bDone = sal_False; 248cdf0e10cSrcweir pImp->bIgnored = sal_False; 249cdf0e10cSrcweir pImp->SetPool( &rPool ); 250cdf0e10cSrcweir pImp->pRetVal = 0; 251cdf0e10cSrcweir pImp->pShell = 0; 252cdf0e10cSrcweir pImp->pSlot = 0; 253cdf0e10cSrcweir pImp->nCallMode = nMode; 254cdf0e10cSrcweir pImp->bUseTarget = sal_False; 255cdf0e10cSrcweir } 256cdf0e10cSrcweir 257cdf0e10cSrcweir SfxRequest::SfxRequest 258cdf0e10cSrcweir ( 259cdf0e10cSrcweir const SfxSlot* pSlot, // auszuf"uhrende <Slot-Id> 260cdf0e10cSrcweir const com::sun::star::uno::Sequence < com::sun::star::beans::PropertyValue >& rArgs, 261cdf0e10cSrcweir SfxCallMode nMode, // Synch/API/... 262cdf0e10cSrcweir SfxItemPool& rPool // ggf. f"ur das SfxItemSet f"ur Parameter 263cdf0e10cSrcweir ) 264cdf0e10cSrcweir : nSlot(pSlot->GetSlotId()), 265cdf0e10cSrcweir pArgs(new SfxAllItemSet(rPool)), 266cdf0e10cSrcweir pImp( new SfxRequest_Impl(this) ) 267cdf0e10cSrcweir { 268cdf0e10cSrcweir DBG_MEMTEST(); 269cdf0e10cSrcweir 270cdf0e10cSrcweir pImp->bDone = sal_False; 271cdf0e10cSrcweir pImp->bIgnored = sal_False; 272cdf0e10cSrcweir pImp->SetPool( &rPool ); 273cdf0e10cSrcweir pImp->pRetVal = 0; 274cdf0e10cSrcweir pImp->pShell = 0; 275cdf0e10cSrcweir pImp->pSlot = 0; 276cdf0e10cSrcweir pImp->nCallMode = nMode; 277cdf0e10cSrcweir pImp->bUseTarget = sal_False; 278cdf0e10cSrcweir TransformParameters( nSlot, rArgs, *pArgs, pSlot ); 279cdf0e10cSrcweir } 280cdf0e10cSrcweir 281cdf0e10cSrcweir //----------------------------------------------------------------------- 282cdf0e10cSrcweir 283cdf0e10cSrcweir SfxRequest::SfxRequest 284cdf0e10cSrcweir ( 285cdf0e10cSrcweir sal_uInt16 nSlotId, 286cdf0e10cSrcweir sal_uInt16 nMode, 287cdf0e10cSrcweir const SfxAllItemSet& rSfxArgs 288cdf0e10cSrcweir ) 289cdf0e10cSrcweir 290cdf0e10cSrcweir // creates a SfxRequest with arguments 291cdf0e10cSrcweir 292cdf0e10cSrcweir : nSlot(nSlotId), 293cdf0e10cSrcweir pArgs(new SfxAllItemSet(rSfxArgs)), 294cdf0e10cSrcweir pImp( new SfxRequest_Impl(this) ) 295cdf0e10cSrcweir { 296cdf0e10cSrcweir DBG_MEMTEST(); 297cdf0e10cSrcweir 298cdf0e10cSrcweir pImp->bDone = sal_False; 299cdf0e10cSrcweir pImp->bIgnored = sal_False; 300cdf0e10cSrcweir pImp->SetPool( rSfxArgs.GetPool() ); 301cdf0e10cSrcweir pImp->pRetVal = 0; 302cdf0e10cSrcweir pImp->pShell = 0; 303cdf0e10cSrcweir pImp->pSlot = 0; 304cdf0e10cSrcweir pImp->nCallMode = nMode; 305cdf0e10cSrcweir pImp->bUseTarget = sal_False; 306cdf0e10cSrcweir } 307cdf0e10cSrcweir //-------------------------------------------------------------------- 308cdf0e10cSrcweir 309cdf0e10cSrcweir sal_uInt16 SfxRequest::GetCallMode() const 310cdf0e10cSrcweir { 311cdf0e10cSrcweir return pImp->nCallMode; 312cdf0e10cSrcweir } 313cdf0e10cSrcweir 314cdf0e10cSrcweir //-------------------------------------------------------------------- 315cdf0e10cSrcweir 316cdf0e10cSrcweir sal_Bool SfxRequest::IsSynchronCall() const 317cdf0e10cSrcweir { 318cdf0e10cSrcweir return SFX_CALLMODE_SYNCHRON == ( SFX_CALLMODE_SYNCHRON & pImp->nCallMode ); 319cdf0e10cSrcweir } 320cdf0e10cSrcweir 321cdf0e10cSrcweir //-------------------------------------------------------------------- 322cdf0e10cSrcweir 323cdf0e10cSrcweir void SfxRequest::SetSynchronCall( sal_Bool bSynchron ) 324cdf0e10cSrcweir { 325cdf0e10cSrcweir if ( bSynchron ) 326cdf0e10cSrcweir pImp->nCallMode |= SFX_CALLMODE_SYNCHRON; 327cdf0e10cSrcweir else 328cdf0e10cSrcweir pImp->nCallMode &= ~(sal_uInt16) SFX_CALLMODE_SYNCHRON; 329cdf0e10cSrcweir } 330cdf0e10cSrcweir 331cdf0e10cSrcweir void SfxRequest::SetInternalArgs_Impl( const SfxAllItemSet& rArgs ) 332cdf0e10cSrcweir { 333cdf0e10cSrcweir delete pImp->pInternalArgs; 334cdf0e10cSrcweir pImp->pInternalArgs = new SfxAllItemSet( rArgs ); 335cdf0e10cSrcweir } 336cdf0e10cSrcweir 337cdf0e10cSrcweir const SfxItemSet* SfxRequest::GetInternalArgs_Impl() const 338cdf0e10cSrcweir { 339cdf0e10cSrcweir return pImp->pInternalArgs; 340cdf0e10cSrcweir } 341cdf0e10cSrcweir 342cdf0e10cSrcweir //-------------------------------------------------------------------- 343cdf0e10cSrcweir 344cdf0e10cSrcweir 345cdf0e10cSrcweir void SfxRequest_Impl::Record 346cdf0e10cSrcweir ( 347cdf0e10cSrcweir const uno::Sequence < beans::PropertyValue >& rArgs // aktuelle Parameter 348cdf0e10cSrcweir ) 349cdf0e10cSrcweir 350cdf0e10cSrcweir /* [Beschreibung] 351cdf0e10cSrcweir 352cdf0e10cSrcweir Interne Hilfsmethode zum erzeugen einer <SfxMacroStatement>-Instanz, 353cdf0e10cSrcweir welche den bereits ausgef"uhrten SfxRequest wiederholbar beschreibt. 354cdf0e10cSrcweir 355cdf0e10cSrcweir Die erzeugte Instanz, auf die ein Pointer zur"uckgeliefert wird 356cdf0e10cSrcweir geht in das Eigentum des Aufrufers "uber. 357cdf0e10cSrcweir */ 358cdf0e10cSrcweir 359cdf0e10cSrcweir { 360cdf0e10cSrcweir String aCommand = String::CreateFromAscii(".uno:"); 361cdf0e10cSrcweir aCommand.AppendAscii( pSlot->GetUnoName() ); 362cdf0e10cSrcweir ::rtl::OUString aCmd( aCommand ); 363cdf0e10cSrcweir if(xRecorder.is()) 364cdf0e10cSrcweir { 365cdf0e10cSrcweir uno::Reference< container::XIndexReplace > xReplace( xRecorder, uno::UNO_QUERY ); 366cdf0e10cSrcweir if ( xReplace.is() && aCmd.compareToAscii(".uno:InsertText") == COMPARE_EQUAL ) 367cdf0e10cSrcweir { 368cdf0e10cSrcweir sal_Int32 nCount = xReplace->getCount(); 369cdf0e10cSrcweir if ( nCount ) 370cdf0e10cSrcweir { 371cdf0e10cSrcweir frame::DispatchStatement aStatement; 372cdf0e10cSrcweir uno::Any aElement = xReplace->getByIndex(nCount-1); 373cdf0e10cSrcweir if ( (aElement >>= aStatement) && aStatement.aCommand == aCmd ) 374cdf0e10cSrcweir { 375cdf0e10cSrcweir ::rtl::OUString aStr; 376cdf0e10cSrcweir ::rtl::OUString aNew; 377cdf0e10cSrcweir aStatement.aArgs[0].Value >>= aStr; 378cdf0e10cSrcweir rArgs[0].Value >>= aNew; 379cdf0e10cSrcweir aStr += aNew; 380cdf0e10cSrcweir aStatement.aArgs[0].Value <<= aStr; 381cdf0e10cSrcweir aElement <<= aStatement; 382cdf0e10cSrcweir xReplace->replaceByIndex( nCount-1, aElement ); 383cdf0e10cSrcweir return; 384cdf0e10cSrcweir } 385cdf0e10cSrcweir } 386cdf0e10cSrcweir } 387cdf0e10cSrcweir 388cdf0e10cSrcweir com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory > xFactory( 389cdf0e10cSrcweir ::comphelper::getProcessServiceFactory(), 390cdf0e10cSrcweir com::sun::star::uno::UNO_QUERY); 391cdf0e10cSrcweir 392cdf0e10cSrcweir com::sun::star::uno::Reference< com::sun::star::util::XURLTransformer > xTransform( 393cdf0e10cSrcweir xFactory->createInstance(rtl::OUString::createFromAscii("com.sun.star.util.URLTransformer")), 394cdf0e10cSrcweir com::sun::star::uno::UNO_QUERY); 395cdf0e10cSrcweir 396cdf0e10cSrcweir com::sun::star::util::URL aURL; 397cdf0e10cSrcweir aURL.Complete = aCmd; 398cdf0e10cSrcweir xTransform->parseStrict(aURL); 399cdf0e10cSrcweir 400cdf0e10cSrcweir if (bDone) 401cdf0e10cSrcweir xRecorder->recordDispatch(aURL,rArgs); 402cdf0e10cSrcweir else 403cdf0e10cSrcweir xRecorder->recordDispatchAsComment(aURL,rArgs); 404cdf0e10cSrcweir } 405cdf0e10cSrcweir } 406cdf0e10cSrcweir 407cdf0e10cSrcweir //-------------------------------------------------------------------- 408cdf0e10cSrcweir 409cdf0e10cSrcweir void SfxRequest::Record_Impl 410cdf0e10cSrcweir ( 411cdf0e10cSrcweir SfxShell& rSh, // die <SfxShell>, die den Request ausgef"uhrt hat 412cdf0e10cSrcweir const SfxSlot& rSlot, // der <SfxSlot>, der den Request ausgef"uhrt hat 413cdf0e10cSrcweir com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorder > xRecorder, // der Recorder, mit dem aufgezeichnet wird 414cdf0e10cSrcweir SfxViewFrame* pViewFrame 415cdf0e10cSrcweir ) 416cdf0e10cSrcweir 417cdf0e10cSrcweir /* [Beschreibung] 418cdf0e10cSrcweir 419cdf0e10cSrcweir Diese interne Methode markiert den SfxRequest als in dem angegebenen 420cdf0e10cSrcweir SfxMakro aufzuzeichnen. 421cdf0e10cSrcweir 422cdf0e10cSrcweir Pointer auf die Parameter werden in Done() wieder verwendet, m"usseb 423cdf0e10cSrcweir dann also noch leben. 424cdf0e10cSrcweir */ 425cdf0e10cSrcweir 426cdf0e10cSrcweir { 427cdf0e10cSrcweir DBG_MEMTEST(); 428cdf0e10cSrcweir pImp->pShell = &rSh; 429cdf0e10cSrcweir pImp->pSlot = &rSlot; 430cdf0e10cSrcweir pImp->xRecorder = xRecorder; 431cdf0e10cSrcweir pImp->aTarget = rSh.GetName(); 432cdf0e10cSrcweir pImp->pViewFrame = pViewFrame; 433cdf0e10cSrcweir } 434cdf0e10cSrcweir 435cdf0e10cSrcweir //-------------------------------------------------------------------- 436cdf0e10cSrcweir 437cdf0e10cSrcweir void SfxRequest::SetArgs( const SfxAllItemSet& rArgs ) 438cdf0e10cSrcweir { 439cdf0e10cSrcweir delete pArgs; 440cdf0e10cSrcweir pArgs = new SfxAllItemSet(rArgs); 441cdf0e10cSrcweir pImp->SetPool( pArgs->GetPool() ); 442cdf0e10cSrcweir } 443cdf0e10cSrcweir 444cdf0e10cSrcweir //-------------------------------------------------------------------- 445cdf0e10cSrcweir 446cdf0e10cSrcweir void SfxRequest::AppendItem(const SfxPoolItem &rItem) 447cdf0e10cSrcweir { 448cdf0e10cSrcweir if(!pArgs) 449cdf0e10cSrcweir pArgs = new SfxAllItemSet(*pImp->pPool); 450cdf0e10cSrcweir pArgs->Put(rItem, rItem.Which()); 451cdf0e10cSrcweir } 452cdf0e10cSrcweir 453cdf0e10cSrcweir //-------------------------------------------------------------------- 454cdf0e10cSrcweir 455cdf0e10cSrcweir void SfxRequest::RemoveItem( sal_uInt16 nID ) 456cdf0e10cSrcweir { 457cdf0e10cSrcweir if (pArgs) 458cdf0e10cSrcweir { 459cdf0e10cSrcweir pArgs->ClearItem(nID); 460cdf0e10cSrcweir if ( !pArgs->Count() ) 461cdf0e10cSrcweir DELETEZ(pArgs); 462cdf0e10cSrcweir } 463cdf0e10cSrcweir } 464cdf0e10cSrcweir 465cdf0e10cSrcweir //-------------------------------------------------------------------- 466cdf0e10cSrcweir 467cdf0e10cSrcweir const SfxPoolItem* SfxRequest::GetArg 468cdf0e10cSrcweir ( 469cdf0e10cSrcweir sal_uInt16 nSlotId, // Slot-Id oder Which-Id des Parameters 470cdf0e10cSrcweir bool bDeep, // false: nicht in Parent-ItemSets suchen 471cdf0e10cSrcweir TypeId aType // != 0: RTTI Pruefung mit Assertion 472cdf0e10cSrcweir ) const 473cdf0e10cSrcweir { 474cdf0e10cSrcweir return GetItem( pArgs, nSlotId, bDeep, aType ); 475cdf0e10cSrcweir } 476cdf0e10cSrcweir 477cdf0e10cSrcweir 478cdf0e10cSrcweir //-------------------------------------------------------------------- 479cdf0e10cSrcweir const SfxPoolItem* SfxRequest::GetItem 480cdf0e10cSrcweir ( 481cdf0e10cSrcweir const SfxItemSet* pArgs, 482cdf0e10cSrcweir sal_uInt16 nSlotId, // Slot-Id oder Which-Id des Parameters 483cdf0e10cSrcweir bool bDeep, // false: nicht in Parent-ItemSets suchen 484cdf0e10cSrcweir TypeId aType // != 0: RTTI Pruefung mit Assertion 485cdf0e10cSrcweir ) 486cdf0e10cSrcweir 487cdf0e10cSrcweir /* [Beschreibung] 488cdf0e10cSrcweir 489cdf0e10cSrcweir Mit dieser Methode wird der Zugriff auf einzelne Parameter im 490cdf0e10cSrcweir SfxRequest wesentlich vereinfacht. Insbesondere wird die Typpr"ufung 491cdf0e10cSrcweir (per Assertion) durchgef"uhrt, wodurch die Applikations-Sourcen 492cdf0e10cSrcweir wesentlich "ubersichtlicher werden. In der PRODUCT-Version wird 493cdf0e10cSrcweir eine 0 zur"uckgegeben, wenn das gefundene Item nicht von der 494cdf0e10cSrcweir angegebenen Klasse ist. 495cdf0e10cSrcweir 496cdf0e10cSrcweir 497cdf0e10cSrcweir [Beispiel] 498cdf0e10cSrcweir 499cdf0e10cSrcweir void MyShell::Execute( SfxRequest &rReq ) 500cdf0e10cSrcweir { 501cdf0e10cSrcweir switch ( rReq.GetSlot() ) 502cdf0e10cSrcweir { 503cdf0e10cSrcweir case SID_MY: 504cdf0e10cSrcweir { 505cdf0e10cSrcweir ... 506cdf0e10cSrcweir // ein Beispiel ohne Verwendung des Makros 507cdf0e10cSrcweir const SfxInt32Item *pPosItem = (const SfxUInt32Item*) 508cdf0e10cSrcweir rReq.GetArg( SID_POS, sal_False, TYPE(SfxInt32Item) ); 509cdf0e10cSrcweir sal_uInt16 nPos = pPosItem ? pPosItem->GetValue() : 0; 510cdf0e10cSrcweir 511cdf0e10cSrcweir // ein Beispiel mit Verwendung des Makros 512cdf0e10cSrcweir SFX_REQUEST_ARG(rReq, pSizeItem, SfxInt32Item, SID_SIZE, sal_False); 513cdf0e10cSrcweir sal_uInt16 nSize = pSizeItem ? pPosItem->GetValue() : 0; 514cdf0e10cSrcweir 515cdf0e10cSrcweir ... 516cdf0e10cSrcweir } 517cdf0e10cSrcweir 518cdf0e10cSrcweir ... 519cdf0e10cSrcweir } 520cdf0e10cSrcweir } 521cdf0e10cSrcweir */ 522cdf0e10cSrcweir 523cdf0e10cSrcweir { 524cdf0e10cSrcweir if ( pArgs ) 525cdf0e10cSrcweir { 526cdf0e10cSrcweir // ggf. in Which-Id umrechnen 527cdf0e10cSrcweir sal_uInt16 nWhich = pArgs->GetPool()->GetWhich(nSlotId); 528cdf0e10cSrcweir 529cdf0e10cSrcweir // ist das Item gesetzt oder bei bDeep==TRUE verf"ugbar? 530cdf0e10cSrcweir const SfxPoolItem *pItem = 0; 531cdf0e10cSrcweir if ( ( bDeep ? SFX_ITEM_AVAILABLE : SFX_ITEM_SET ) 532cdf0e10cSrcweir <= pArgs->GetItemState( nWhich, bDeep, &pItem ) ) 533cdf0e10cSrcweir { 534cdf0e10cSrcweir // stimmt der Typ "uberein? 535cdf0e10cSrcweir if ( !pItem || pItem->IsA(aType) ) 536cdf0e10cSrcweir return pItem; 537cdf0e10cSrcweir 538cdf0e10cSrcweir // Item da aber falsch => Programmierfehler 539cdf0e10cSrcweir DBG_ERROR( "invalid argument type" ); 540cdf0e10cSrcweir } 541cdf0e10cSrcweir } 542cdf0e10cSrcweir 543cdf0e10cSrcweir // keine Parameter, nicht gefunden oder falschen Typ gefunden 544cdf0e10cSrcweir return 0; 545cdf0e10cSrcweir } 546cdf0e10cSrcweir 547cdf0e10cSrcweir //-------------------------------------------------------------------- 548cdf0e10cSrcweir 549cdf0e10cSrcweir void SfxRequest::SetReturnValue(const SfxPoolItem &rItem) 550cdf0e10cSrcweir { 551cdf0e10cSrcweir DBG_ASSERT(!pImp->pRetVal, "Returnwert mehrfach setzen?"); 552cdf0e10cSrcweir if(pImp->pRetVal) 553cdf0e10cSrcweir delete pImp->pRetVal; 554cdf0e10cSrcweir pImp->pRetVal = rItem.Clone(); 555cdf0e10cSrcweir } 556cdf0e10cSrcweir 557cdf0e10cSrcweir //-------------------------------------------------------------------- 558cdf0e10cSrcweir 559cdf0e10cSrcweir const SfxPoolItem* SfxRequest::GetReturnValue() const 560cdf0e10cSrcweir { 561cdf0e10cSrcweir return pImp->pRetVal; 562cdf0e10cSrcweir } 563cdf0e10cSrcweir 564cdf0e10cSrcweir //-------------------------------------------------------------------- 565cdf0e10cSrcweir 566cdf0e10cSrcweir void SfxRequest::Done 567cdf0e10cSrcweir ( 568cdf0e10cSrcweir const SfxItemSet& rSet, /* von der Applikation mitgeteilte Parameter, 569cdf0e10cSrcweir die z.B. in einem Dialog vom Benuter 570cdf0e10cSrcweir erfragt wurden, ggf. 0 falls keine 571cdf0e10cSrcweir Parameter gesetzt wurden */ 572cdf0e10cSrcweir 573cdf0e10cSrcweir bool bKeep /* true (default) 574cdf0e10cSrcweir 'rSet' wird gepeichert und ist "uber 575cdf0e10cSrcweir GetArgs() abfragbar 576cdf0e10cSrcweir 577cdf0e10cSrcweir false 578cdf0e10cSrcweir 'rSet' wird nicht kopiert (schneller) */ 579cdf0e10cSrcweir ) 580cdf0e10cSrcweir 581cdf0e10cSrcweir /* [Beschreibung] 582cdf0e10cSrcweir 583cdf0e10cSrcweir Diese Methode mu\s in der <Execute-Methode> des <SfxSlot>s gerufen 584cdf0e10cSrcweir werden, der den SfxRequest ausgef"uhrt hat, wenn die Ausf"uhrung 585cdf0e10cSrcweir tats"achlich stattgefunden hat. Wird 'Done()' nicht gerufen, gilt 586cdf0e10cSrcweir der SfxRequest als abgebrochen. 587cdf0e10cSrcweir 588cdf0e10cSrcweir Etwaige Returnwerte werden nur durchgereicht, wenn 'Done()' gerufen 589cdf0e10cSrcweir wurde. Ebenso werden beim Aufzeichnen von Makros nur echte 590cdf0e10cSrcweir Statements erzeugt, wenn 'Done()' gerufen wurde; f"ur SfxRequests, 591cdf0e10cSrcweir die nicht derart gekennzeichnet wurden, wird anstelle dessen eine 592cdf0e10cSrcweir auf die abgebrochene Funktion hinweisende Bemerkung ('rem') eingf"ugt. 593cdf0e10cSrcweir 594cdf0e10cSrcweir 595cdf0e10cSrcweir [Anmerkung] 596cdf0e10cSrcweir 597cdf0e10cSrcweir 'Done()' wird z.B. nicht gerufen, wenn ein durch die Funktion gestarteter 598cdf0e10cSrcweir Dialog vom Benutzer abgebrochen wurde oder das Ausf"uhren aufgrund 599cdf0e10cSrcweir eines falschen Kontextes (ohne Verwendung separater <SfxShell>s) 600cdf0e10cSrcweir nicht durchgef"uhrt werden konnte. 'Done()' mu\s sehr wohl gerufen 601cdf0e10cSrcweir werden, wenn das Ausf"uhren der Funktion zu einem regul"aren Fehler 602cdf0e10cSrcweir f"uhrte (z.B. Datei konnte nicht ge"offnet werden). 603cdf0e10cSrcweir */ 604cdf0e10cSrcweir 605cdf0e10cSrcweir { 606cdf0e10cSrcweir Done_Impl( &rSet ); 607cdf0e10cSrcweir 608cdf0e10cSrcweir // ggf. Items merken, damit StarDraw sie abfragen kann 609cdf0e10cSrcweir if ( bKeep ) 610cdf0e10cSrcweir { 611cdf0e10cSrcweir if ( !pArgs ) 612cdf0e10cSrcweir { 613cdf0e10cSrcweir pArgs = new SfxAllItemSet( rSet ); 614cdf0e10cSrcweir pImp->SetPool( pArgs->GetPool() ); 615cdf0e10cSrcweir } 616cdf0e10cSrcweir else 617cdf0e10cSrcweir { 618cdf0e10cSrcweir SfxItemIter aIter(rSet); 619cdf0e10cSrcweir const SfxPoolItem* pItem = aIter.FirstItem(); 620cdf0e10cSrcweir while(pItem) 621cdf0e10cSrcweir { 622cdf0e10cSrcweir if(!IsInvalidItem(pItem)) 623cdf0e10cSrcweir pArgs->Put(*pItem,pItem->Which()); 624cdf0e10cSrcweir pItem = aIter.NextItem(); 625cdf0e10cSrcweir } 626cdf0e10cSrcweir } 627cdf0e10cSrcweir } 628cdf0e10cSrcweir } 629cdf0e10cSrcweir 630cdf0e10cSrcweir //-------------------------------------------------------------------- 631cdf0e10cSrcweir 632cdf0e10cSrcweir 633cdf0e10cSrcweir void SfxRequest::Done( sal_Bool bRelease ) 634cdf0e10cSrcweir // [<SfxRequest::Done(SfxItemSet&)>] 635cdf0e10cSrcweir { 636cdf0e10cSrcweir Done_Impl( pArgs ); 637cdf0e10cSrcweir if( bRelease ) 638cdf0e10cSrcweir DELETEZ( pArgs ); 639cdf0e10cSrcweir } 640cdf0e10cSrcweir 641cdf0e10cSrcweir //-------------------------------------------------------------------- 642cdf0e10cSrcweir 643cdf0e10cSrcweir void SfxRequest::ForgetAllArgs() 644cdf0e10cSrcweir { 645cdf0e10cSrcweir DELETEZ( pArgs ); 646cdf0e10cSrcweir DELETEZ( pImp->pInternalArgs ); 647cdf0e10cSrcweir } 648cdf0e10cSrcweir 649cdf0e10cSrcweir //-------------------------------------------------------------------- 650cdf0e10cSrcweir 651cdf0e10cSrcweir sal_Bool SfxRequest::IsCancelled() const 652cdf0e10cSrcweir { 653cdf0e10cSrcweir return pImp->bCancelled; 654cdf0e10cSrcweir } 655cdf0e10cSrcweir 656cdf0e10cSrcweir //-------------------------------------------------------------------- 657cdf0e10cSrcweir 658cdf0e10cSrcweir void SfxRequest::Cancel() 659cdf0e10cSrcweir 660cdf0e10cSrcweir /* [Beschreibung] 661cdf0e10cSrcweir 662cdf0e10cSrcweir Markiert diesen Request als nicht mehr auszufuehren. Wird z.B. gerufen, 663cdf0e10cSrcweir wenn das Ziel (genauer dessen Pool) stirbt. 664cdf0e10cSrcweir */ 665cdf0e10cSrcweir 666cdf0e10cSrcweir { 667cdf0e10cSrcweir pImp->bCancelled = sal_True; 668cdf0e10cSrcweir pImp->SetPool( 0 ); 669cdf0e10cSrcweir DELETEZ( pArgs ); 670cdf0e10cSrcweir } 671cdf0e10cSrcweir 672cdf0e10cSrcweir //-------------------------------------------------------------------- 673cdf0e10cSrcweir 674cdf0e10cSrcweir 675cdf0e10cSrcweir void SfxRequest::Ignore() 676cdf0e10cSrcweir 677cdf0e10cSrcweir /* [Beschreibung] 678cdf0e10cSrcweir 679cdf0e10cSrcweir Wird diese Methode anstelle von <SfxRequest::Done()> gerufen, dann 680cdf0e10cSrcweir wird dieser Request nicht recorded. 681cdf0e10cSrcweir 682cdf0e10cSrcweir 683cdf0e10cSrcweir [Bespiel] 684cdf0e10cSrcweir 685cdf0e10cSrcweir Das Selektieren von Tools im StarDraw soll nicht aufgezeichnet werden, 686cdf0e10cSrcweir dieselben Slots sollen aber zum erzeugen der von den Tools zu 687cdf0e10cSrcweir erzeugenden Objekte verwendet werde. Also kann nicht NoRecord 688cdf0e10cSrcweir angegeben werden, dennoch soll u.U. nicht aufgezeichnet werden. 689cdf0e10cSrcweir */ 690cdf0e10cSrcweir 691cdf0e10cSrcweir { 692cdf0e10cSrcweir // als tats"achlich ausgef"uhrt markieren 693cdf0e10cSrcweir pImp->bIgnored = sal_True; 694cdf0e10cSrcweir } 695cdf0e10cSrcweir 696cdf0e10cSrcweir //-------------------------------------------------------------------- 697cdf0e10cSrcweir 698cdf0e10cSrcweir void SfxRequest::Done_Impl 699cdf0e10cSrcweir ( 700cdf0e10cSrcweir const SfxItemSet* pSet /* von der Applikation mitgeteilte Parameter, 701cdf0e10cSrcweir die z.B. in einem Dialog vom Benuter 702cdf0e10cSrcweir erfragt wurden, ggf. 0 falls keine 703cdf0e10cSrcweir Parameter gesetzt wurden */ 704cdf0e10cSrcweir ) 705cdf0e10cSrcweir 706cdf0e10cSrcweir /* [Beschreibung] 707cdf0e10cSrcweir 708cdf0e10cSrcweir Interne Methode zum als 'done' markieren des SfxRequest und zum Auswerten 709cdf0e10cSrcweir der Parameter in 'pSet' falls aufgezeichnet wird. 710cdf0e10cSrcweir */ 711cdf0e10cSrcweir 712cdf0e10cSrcweir { 713cdf0e10cSrcweir // als tats"achlich ausgef"uhrt markieren 714cdf0e10cSrcweir pImp->bDone = sal_True; 715cdf0e10cSrcweir 716cdf0e10cSrcweir // nicht Recorden 717cdf0e10cSrcweir if ( !pImp->xRecorder.is() ) 718cdf0e10cSrcweir return; 719cdf0e10cSrcweir 720cdf0e10cSrcweir // wurde ein anderer Slot ausgef"uhrt als angefordert (Delegation) 721cdf0e10cSrcweir if ( nSlot != pImp->pSlot->GetSlotId() ) 722cdf0e10cSrcweir { 723cdf0e10cSrcweir // Slot neu suchen 724cdf0e10cSrcweir pImp->pSlot = pImp->pShell->GetInterface()->GetSlot(nSlot); 725cdf0e10cSrcweir DBG_ASSERT( pImp->pSlot, "delegated SlotId not found" ); 726cdf0e10cSrcweir if ( !pImp->pSlot ) // Hosentr"ger und G"urtel 727cdf0e10cSrcweir return; 728cdf0e10cSrcweir } 729cdf0e10cSrcweir 730cdf0e10cSrcweir // record-f"ahig? 731cdf0e10cSrcweir // neues Recorden verwendet UnoName! 732cdf0e10cSrcweir if ( !pImp->pSlot->pUnoName ) 733cdf0e10cSrcweir { 734cdf0e10cSrcweir ByteString aStr( "Recording not exported slot: "); 735cdf0e10cSrcweir aStr += ByteString::CreateFromInt32( pImp->pSlot->GetSlotId() ); 736cdf0e10cSrcweir DBG_ERROR( aStr.GetBuffer() ); 737cdf0e10cSrcweir } 738cdf0e10cSrcweir 739cdf0e10cSrcweir if ( !pImp->pSlot->pUnoName ) // Hosentr"ger und G"urtel 740cdf0e10cSrcweir return; 741cdf0e10cSrcweir 742cdf0e10cSrcweir // "ofters ben"otigte Werte 743cdf0e10cSrcweir SfxItemPool &rPool = pImp->pShell->GetPool(); 744cdf0e10cSrcweir 745cdf0e10cSrcweir // Property-Slot? 746cdf0e10cSrcweir if ( !pImp->pSlot->IsMode(SFX_SLOT_METHOD) ) 747cdf0e10cSrcweir { 748cdf0e10cSrcweir // des Property als SfxPoolItem besorgen 749cdf0e10cSrcweir const SfxPoolItem *pItem; 750cdf0e10cSrcweir sal_uInt16 nWhich = rPool.GetWhich(pImp->pSlot->GetSlotId()); 751cdf0e10cSrcweir SfxItemState eState = pSet ? pSet->GetItemState( nWhich, sal_False, &pItem ) : SFX_ITEM_UNKNOWN; 752cdf0e10cSrcweir #ifdef DBG_UTIL 753cdf0e10cSrcweir if ( SFX_ITEM_SET != eState ) 754cdf0e10cSrcweir { 755cdf0e10cSrcweir ByteString aStr( "Recording property not available: "); 756cdf0e10cSrcweir aStr += ByteString::CreateFromInt32( pImp->pSlot->GetSlotId() ); 757cdf0e10cSrcweir DBG_ERROR( aStr.GetBuffer() ); 758cdf0e10cSrcweir } 759cdf0e10cSrcweir #endif 760cdf0e10cSrcweir uno::Sequence < beans::PropertyValue > aSeq; 761cdf0e10cSrcweir if ( eState == SFX_ITEM_SET ) 762cdf0e10cSrcweir TransformItems( pImp->pSlot->GetSlotId(), *pSet, aSeq, pImp->pSlot ); 763cdf0e10cSrcweir pImp->Record( aSeq ); 764cdf0e10cSrcweir } 765cdf0e10cSrcweir 766cdf0e10cSrcweir // alles in ein einziges Statement aufzeichnen? 767cdf0e10cSrcweir else if ( pImp->pSlot->IsMode(SFX_SLOT_RECORDPERSET) ) 768cdf0e10cSrcweir { 769cdf0e10cSrcweir uno::Sequence < beans::PropertyValue > aSeq; 770cdf0e10cSrcweir if ( pSet ) 771cdf0e10cSrcweir TransformItems( pImp->pSlot->GetSlotId(), *pSet, aSeq, pImp->pSlot ); 772cdf0e10cSrcweir pImp->Record( aSeq ); 773cdf0e10cSrcweir } 774cdf0e10cSrcweir 775cdf0e10cSrcweir // jedes Item als einzelnes Statement recorden 776cdf0e10cSrcweir else if ( pImp->pSlot->IsMode(SFX_SLOT_RECORDPERITEM) ) 777cdf0e10cSrcweir { 778cdf0e10cSrcweir if ( pSet ) 779cdf0e10cSrcweir { 780cdf0e10cSrcweir // "uber die Items iterieren 781cdf0e10cSrcweir SfxItemIter aIter(*pSet); 782cdf0e10cSrcweir for ( const SfxPoolItem* pItem = aIter.FirstItem(); pItem; pItem = aIter.NextItem() ) 783cdf0e10cSrcweir { 784cdf0e10cSrcweir // die Slot-Id f"ur das einzelne Item ermitteln 785cdf0e10cSrcweir sal_uInt16 nSlotId = rPool.GetSlotId( pItem->Which() ); 786cdf0e10cSrcweir if ( nSlotId == nSlot ) 787cdf0e10cSrcweir { 788cdf0e10cSrcweir // mit Hosentr"ager und G"urtel reparieren des falschen Flags 789cdf0e10cSrcweir DBG_ERROR( "recursion RecordPerItem - use RecordPerSet!" ); 790cdf0e10cSrcweir SfxSlot *pSlot = (SfxSlot*) pImp->pSlot; 791cdf0e10cSrcweir pSlot->nFlags &= ~((sal_uIntPtr)SFX_SLOT_RECORDPERITEM); 792cdf0e10cSrcweir pSlot->nFlags &= SFX_SLOT_RECORDPERSET; 793cdf0e10cSrcweir } 794cdf0e10cSrcweir 795cdf0e10cSrcweir // einen Sub-Request recorden 796cdf0e10cSrcweir SfxRequest aReq( pImp->pViewFrame, nSlotId ); 797cdf0e10cSrcweir if ( aReq.pImp->pSlot ) 798cdf0e10cSrcweir aReq.AppendItem( *pItem ); 799cdf0e10cSrcweir aReq.Done(); 800cdf0e10cSrcweir } 801cdf0e10cSrcweir } 802cdf0e10cSrcweir else 803cdf0e10cSrcweir { 804cdf0e10cSrcweir HACK(hierueber nochmal nachdenken) 805cdf0e10cSrcweir pImp->Record( uno::Sequence < beans::PropertyValue >() ); 806cdf0e10cSrcweir } 807cdf0e10cSrcweir } 808cdf0e10cSrcweir } 809cdf0e10cSrcweir 810cdf0e10cSrcweir //-------------------------------------------------------------------- 811cdf0e10cSrcweir 812cdf0e10cSrcweir sal_Bool SfxRequest::IsDone() const 813cdf0e10cSrcweir 814cdf0e10cSrcweir /* [Beschreibung] 815cdf0e10cSrcweir 816cdf0e10cSrcweir Mit dieser Methode kann abgefragt werden, ob der SfxRequest tats"achlich 817cdf0e10cSrcweir ausgef"uhrt wurde oder nicht. Wurde ein SfxRequest nicht ausgef"uhrt, 818cdf0e10cSrcweir liegt dies z.B. daran, da\s der Benutzer abgebrochen hat oder 819cdf0e10cSrcweir der Kontext f"ur diesen Request falsch war, dieses aber nicht "uber 820cdf0e10cSrcweir eine separate <SfxShell> realisiert wurde. 821cdf0e10cSrcweir 822cdf0e10cSrcweir SfxRequest-Instanzen, die hier sal_False liefern, werden nicht recorded. 823cdf0e10cSrcweir 824cdf0e10cSrcweir 825cdf0e10cSrcweir [Querverweise] 826cdf0e10cSrcweir 827cdf0e10cSrcweir <SfxRequest::Done(const SfxItemSet&)> 828cdf0e10cSrcweir <SfxRequest::Done()> 829cdf0e10cSrcweir */ 830cdf0e10cSrcweir 831cdf0e10cSrcweir { 832cdf0e10cSrcweir return pImp->bDone; 833cdf0e10cSrcweir } 834cdf0e10cSrcweir 835cdf0e10cSrcweir //-------------------------------------------------------------------- 836cdf0e10cSrcweir 837cdf0e10cSrcweir SfxMacro* SfxRequest::GetRecordingMacro() 838cdf0e10cSrcweir 839cdf0e10cSrcweir /* [Beschreibung] 840cdf0e10cSrcweir 841cdf0e10cSrcweir Mit dieser Methode kann abgefragt werden, ob und in welchem <SfxMacro> 842cdf0e10cSrcweir die SfxRequests gerade aufgezeichnet werden. 843cdf0e10cSrcweir */ 844cdf0e10cSrcweir 845cdf0e10cSrcweir { 846cdf0e10cSrcweir return NULL; 847cdf0e10cSrcweir } 848cdf0e10cSrcweir 849cdf0e10cSrcweir //-------------------------------------------------------------------- 850cdf0e10cSrcweir 851cdf0e10cSrcweir com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorder > SfxRequest::GetMacroRecorder( SfxViewFrame* pView ) 852cdf0e10cSrcweir 853cdf0e10cSrcweir /* [Beschreibung] 854cdf0e10cSrcweir 855cdf0e10cSrcweir Hier wird versucht einen Recorder fuer dispatch() Aufrufe vom Frame zu bekommen. 856cdf0e10cSrcweir Dieser ist dort per Property an einem Supplier verfuegbar - aber nur dann, wenn 857cdf0e10cSrcweir recording angeschaltet wurde. 858cdf0e10cSrcweir (Siehe auch SfxViewFrame::MiscExec_Impl() und SID_RECORDING) 859cdf0e10cSrcweir */ 860cdf0e10cSrcweir 861cdf0e10cSrcweir { 862cdf0e10cSrcweir com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorder > xRecorder; 863cdf0e10cSrcweir 864cdf0e10cSrcweir com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet > xSet( 865cdf0e10cSrcweir (pView ? pView : SfxViewFrame::Current())->GetFrame().GetFrameInterface(), 866cdf0e10cSrcweir com::sun::star::uno::UNO_QUERY); 867cdf0e10cSrcweir 868cdf0e10cSrcweir if(xSet.is()) 869cdf0e10cSrcweir { 870cdf0e10cSrcweir com::sun::star::uno::Any aProp = xSet->getPropertyValue(rtl::OUString::createFromAscii("DispatchRecorderSupplier")); 871cdf0e10cSrcweir com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorderSupplier > xSupplier; 872cdf0e10cSrcweir aProp >>= xSupplier; 873cdf0e10cSrcweir if(xSupplier.is()) 874cdf0e10cSrcweir xRecorder = xSupplier->getDispatchRecorder(); 875cdf0e10cSrcweir } 876cdf0e10cSrcweir 877cdf0e10cSrcweir return xRecorder; 878cdf0e10cSrcweir } 879cdf0e10cSrcweir 880cdf0e10cSrcweir sal_Bool SfxRequest::HasMacroRecorder( SfxViewFrame* pView ) 881cdf0e10cSrcweir { 882cdf0e10cSrcweir return GetMacroRecorder( pView ).is(); 883cdf0e10cSrcweir } 884cdf0e10cSrcweir 885cdf0e10cSrcweir 886cdf0e10cSrcweir //-------------------------------------------------------------------- 887cdf0e10cSrcweir 888cdf0e10cSrcweir sal_Bool SfxRequest::IsAPI() const 889cdf0e10cSrcweir 890cdf0e10cSrcweir /* [Beschreibung] 891cdf0e10cSrcweir 892cdf0e10cSrcweir Liefert sal_True, wenn dieser SfxRequest von einer API (z.B. BASIC) 893cdf0e10cSrcweir erzeugt wurde, sonst sal_False. 894cdf0e10cSrcweir */ 895cdf0e10cSrcweir 896cdf0e10cSrcweir { 897cdf0e10cSrcweir return SFX_CALLMODE_API == ( SFX_CALLMODE_API & pImp->nCallMode ); 898cdf0e10cSrcweir } 899cdf0e10cSrcweir 900cdf0e10cSrcweir //-------------------------------------------------------------------- 901cdf0e10cSrcweir 902cdf0e10cSrcweir 903cdf0e10cSrcweir bool SfxRequest::IsRecording() const 904cdf0e10cSrcweir 905cdf0e10cSrcweir /* [Beschreibung] 906cdf0e10cSrcweir 907cdf0e10cSrcweir Liefert sal_True, wenn dieser SfxRequest recorded werden soll, d.h. 908cdf0e10cSrcweir 1. zu Zeit ein Makro aufgezeichnet wird 909cdf0e10cSrcweir 2. dieser Request "uberhaupt aufgezeichnet wird 910cdf0e10cSrcweir 3. der Request nicht von reiner API (z.B. BASIC) ausgeht, 911cdf0e10cSrcweir sonst sal_False. 912cdf0e10cSrcweir */ 913cdf0e10cSrcweir 914cdf0e10cSrcweir { 915cdf0e10cSrcweir return ( AllowsRecording() && GetMacroRecorder().is() ); 916cdf0e10cSrcweir } 917cdf0e10cSrcweir 918cdf0e10cSrcweir //-------------------------------------------------------------------- 919cdf0e10cSrcweir void SfxRequest::SetModifier( sal_uInt16 nModi ) 920cdf0e10cSrcweir { 921cdf0e10cSrcweir pImp->nModifier = nModi; 922cdf0e10cSrcweir } 923cdf0e10cSrcweir 924cdf0e10cSrcweir //-------------------------------------------------------------------- 925cdf0e10cSrcweir sal_uInt16 SfxRequest::GetModifier() const 926cdf0e10cSrcweir { 927cdf0e10cSrcweir return pImp->nModifier; 928cdf0e10cSrcweir } 929cdf0e10cSrcweir 930cdf0e10cSrcweir //-------------------------------------------------------------------- 931cdf0e10cSrcweir 932cdf0e10cSrcweir void SfxRequest::SetTarget( const String &rTarget ) 933cdf0e10cSrcweir 934cdf0e10cSrcweir /* [Beschreibung] 935cdf0e10cSrcweir 936cdf0e10cSrcweir Mit dieser Methode kann das zu recordende Zielobjekt umgesetzt werden. 937cdf0e10cSrcweir 938cdf0e10cSrcweir 939cdf0e10cSrcweir [Beispiel] 940cdf0e10cSrcweir 941cdf0e10cSrcweir Die BASIC-Methode 'Open' wird zwar von der Shell 'Application' ausgef"uhrt, 942cdf0e10cSrcweir aber am Objekt 'Documents' (global) recorded: 943cdf0e10cSrcweir 944cdf0e10cSrcweir rReq.SetTarget( "Documents" ); 945cdf0e10cSrcweir 946cdf0e10cSrcweir Dies f"uhrt dann zu: 947cdf0e10cSrcweir 948cdf0e10cSrcweir Documents.Open( ... ) 949cdf0e10cSrcweir */ 950cdf0e10cSrcweir 951cdf0e10cSrcweir { 952cdf0e10cSrcweir pImp->aTarget = rTarget; 953cdf0e10cSrcweir pImp->bUseTarget = sal_True; 954cdf0e10cSrcweir } 955cdf0e10cSrcweir 956cdf0e10cSrcweir void SfxRequest::AllowRecording( sal_Bool bSet ) 957cdf0e10cSrcweir { 958cdf0e10cSrcweir pImp->bAllowRecording = bSet; 959cdf0e10cSrcweir } 960cdf0e10cSrcweir 961cdf0e10cSrcweir sal_Bool SfxRequest::AllowsRecording() const 962cdf0e10cSrcweir { 963cdf0e10cSrcweir sal_Bool bAllow = pImp->bAllowRecording; 964cdf0e10cSrcweir if( !bAllow ) 965cdf0e10cSrcweir bAllow = ( SFX_CALLMODE_API != ( SFX_CALLMODE_API & pImp->nCallMode ) ) && 966cdf0e10cSrcweir ( SFX_CALLMODE_RECORD == ( SFX_CALLMODE_RECORD & pImp->nCallMode ) ); 967cdf0e10cSrcweir return bAllow; 968cdf0e10cSrcweir } 969cdf0e10cSrcweir 970cdf0e10cSrcweir void SfxRequest::ReleaseArgs() 971cdf0e10cSrcweir { 972cdf0e10cSrcweir DELETEZ( pArgs ); 973cdf0e10cSrcweir DELETEZ( pImp->pInternalArgs ); 974cdf0e10cSrcweir } 975