1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: request.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
32 // MARKER(update_precomp.py): autogen include statement, do not remove
33 #include "precompiled_sfx2.hxx"
35 #include <com/sun/star/frame/DispatchStatement.hpp>
36 #include <com/sun/star/container/XIndexReplace.hpp>
37 #include <com/sun/star/beans/PropertyValue.hpp>
38 #include <com/sun/star/uno/Sequence.hxx>
39 #include <com/sun/star/beans/XPropertySet.hpp>
40 #include <com/sun/star/util/XURLTransformer.hpp>
41 #include <com/sun/star/frame/XDispatchRecorderSupplier.hpp>
42 #include <svtools/itemiter.hxx>
44 #ifndef _ARGS_HXX //autogen
45 #include <svtools/itempool.hxx>
47 #include <svtools/itemdel.hxx>
49 #include <comphelper/processfactory.hxx>
54 #include <svtools/smplhint.hxx>
56 #include <sfx2/request.hxx>
57 #include <sfx2/dispatch.hxx>
58 #include <sfx2/msg.hxx>
59 #include <sfx2/viewfrm.hxx>
61 #include <sfx2/objface.hxx>
62 #include <sfx2/appuno.hxx>
64 //===================================================================
66 using namespace ::com::sun::star
;
68 struct SfxRequest_Impl
: public SfxListener
72 Implementations-Struktur der Klasse <SfxRequest>.
76 SfxRequest
* pAnti
; // Owner wegen sterbendem Pool
77 String aTarget
; // ggf. von App gesetztes Zielobjekt
78 SfxItemPool
* pPool
; // ItemSet mit diesem Pool bauen
79 SfxPoolItem
* pRetVal
; // R"uckgabewert geh"ort sich selbst
80 SfxShell
* pShell
; // ausgef"uhrt an dieser Shell
81 const SfxSlot
* pSlot
; // ausgef"uhrter Slot
82 USHORT nModifier
; // welche Modifier waren gedrueckt?
83 BOOL bDone
; // "uberhaupt ausgef"uhrt
84 BOOL bIgnored
; // vom User abgebrochen
85 BOOL bCancelled
; // nicht mehr zustellen
86 BOOL bUseTarget
; // aTarget wurde von Applikation gesetzt
87 USHORT nCallMode
; // Synch/Asynch/API/Record
89 SfxAllItemSet
* pInternalArgs
;
90 SfxViewFrame
* pViewFrame
;
92 com::sun::star::uno::Reference
< com::sun::star::frame::XDispatchRecorder
> xRecorder
;
94 SfxRequest_Impl( SfxRequest
*pOwner
)
99 , nCallMode( SFX_CALLMODE_SYNCHRON
)
100 , bAllowRecording( FALSE
)
104 ~SfxRequest_Impl() { delete pInternalArgs
; }
107 void SetPool( SfxItemPool
*pNewPool
);
108 virtual void Notify( SfxBroadcaster
&rBC
, const SfxHint
&rHint
);
109 void Record( const uno::Sequence
< beans::PropertyValue
>& rArgs
);
113 //====================================================================
115 void SfxRequest_Impl::Notify( SfxBroadcaster
&, const SfxHint
&rHint
)
117 SfxSimpleHint
*pSimpleHint
= PTR_CAST(SfxSimpleHint
, &rHint
);
118 if ( pSimpleHint
&& pSimpleHint
->GetId() == SFX_HINT_DYING
)
122 //====================================================================
124 void SfxRequest_Impl::SetPool( SfxItemPool
*pNewPool
)
126 if ( pNewPool
!= pPool
)
129 EndListening( pPool
->BC() );
132 StartListening( pNewPool
->BC() );
136 //====================================================================
139 SfxRequest::~SfxRequest()
143 // nicht mit Done() marktierte Requests mit 'rem' rausschreiben
144 if ( pImp
->xRecorder
.is() && !pImp
->bDone
&& !pImp
->bIgnored
)
145 pImp
->Record( uno::Sequence
< beans::PropertyValue
>() );
150 DeleteItemOnIdle(pImp
->pRetVal
);
153 //--------------------------------------------------------------------
156 SfxRequest::SfxRequest
158 const SfxRequest
& rOrig
162 pArgs(rOrig
.pArgs
? new SfxAllItemSet(*rOrig
.pArgs
): 0),
163 pImp( new SfxRequest_Impl(this) )
167 pImp
->bAllowRecording
= rOrig
.pImp
->bAllowRecording
;
169 pImp
->bIgnored
= FALSE
;
173 pImp
->nCallMode
= rOrig
.pImp
->nCallMode
;
174 pImp
->bUseTarget
= rOrig
.pImp
->bUseTarget
;
175 pImp
->aTarget
= rOrig
.pImp
->aTarget
;
176 pImp
->nModifier
= rOrig
.pImp
->nModifier
;
178 // deep copy needed !
179 pImp
->pInternalArgs
= (rOrig
.pImp
->pInternalArgs
? new SfxAllItemSet(*rOrig
.pImp
->pInternalArgs
) : 0);
182 pImp
->SetPool( pArgs
->GetPool() );
184 pImp
->SetPool( rOrig
.pImp
->pPool
);
186 //--------------------------------------------------------------------
189 SfxRequest::SfxRequest
191 SfxViewFrame
* pViewFrame
,
198 Mit diesem Konstruktor k"onnen Events, die nicht "uber den SfxDispatcher
199 gelaufen sind (z.B aus KeyInput() oder Mouse-Events) nachtr"aglich
200 recorded werden. Dazu wird eine SfxRequest-Instanz mit diesem Konstruktor
201 erzeugt und dann genauso verfahren, wie mit einem SfxRequest, der in
202 eine <Slot-Execute-Methode> als Parameter gegeben wird.
207 pImp( new SfxRequest_Impl(this) )
212 pImp
->bIgnored
= FALSE
;
213 pImp
->SetPool( &pViewFrame
->GetPool() );
217 pImp
->nCallMode
= SFX_CALLMODE_SYNCHRON
;
218 pImp
->bUseTarget
= FALSE
;
219 pImp
->pViewFrame
= pViewFrame
;
220 if( pImp
->pViewFrame
->GetDispatcher()->GetShellAndSlot_Impl( nSlotId
, &pImp
->pShell
, &pImp
->pSlot
, TRUE
, TRUE
) )
222 pImp
->SetPool( &pImp
->pShell
->GetPool() );
223 pImp
->xRecorder
= SfxRequest::GetMacroRecorder( pViewFrame
);
224 pImp
->aTarget
= pImp
->pShell
->GetName();
229 ByteString
aStr( "Recording unsupported slot: ");
230 aStr
+= ByteString::CreateFromInt32( pImp
->pPool
->GetSlotId(nSlotId
) );
231 DBG_ERROR( aStr
.GetBuffer() );
236 //--------------------------------------------------------------------
239 SfxRequest::SfxRequest
241 USHORT nSlotId
, // auszuf"uhrende <Slot-Id>
242 SfxCallMode nMode
, // Synch/API/...
243 SfxItemPool
& rPool
// ggf. f"ur das SfxItemSet f"ur Parameter
246 // creates a SfxRequest without arguments
250 pImp( new SfxRequest_Impl(this) )
255 pImp
->bIgnored
= FALSE
;
256 pImp
->SetPool( &rPool
);
260 pImp
->nCallMode
= nMode
;
261 pImp
->bUseTarget
= FALSE
;
264 SfxRequest::SfxRequest
266 const SfxSlot
* pSlot
, // auszuf"uhrende <Slot-Id>
267 const com::sun::star::uno::Sequence
< com::sun::star::beans::PropertyValue
>& rArgs
,
268 SfxCallMode nMode
, // Synch/API/...
269 SfxItemPool
& rPool
// ggf. f"ur das SfxItemSet f"ur Parameter
271 : nSlot(pSlot
->GetSlotId()),
272 pArgs(new SfxAllItemSet(rPool
)),
273 pImp( new SfxRequest_Impl(this) )
278 pImp
->bIgnored
= FALSE
;
279 pImp
->SetPool( &rPool
);
283 pImp
->nCallMode
= nMode
;
284 pImp
->bUseTarget
= FALSE
;
285 TransformParameters( nSlot
, rArgs
, *pArgs
, pSlot
);
288 //-----------------------------------------------------------------------
290 SfxRequest::SfxRequest
294 const SfxAllItemSet
& rSfxArgs
297 // creates a SfxRequest with arguments
300 pArgs(new SfxAllItemSet(rSfxArgs
)),
301 pImp( new SfxRequest_Impl(this) )
306 pImp
->bIgnored
= FALSE
;
307 pImp
->SetPool( rSfxArgs
.GetPool() );
311 pImp
->nCallMode
= nMode
;
312 pImp
->bUseTarget
= FALSE
;
314 //--------------------------------------------------------------------
316 USHORT
SfxRequest::GetCallMode() const
318 return pImp
->nCallMode
;
321 //--------------------------------------------------------------------
323 BOOL
SfxRequest::IsSynchronCall() const
325 return SFX_CALLMODE_SYNCHRON
== ( SFX_CALLMODE_SYNCHRON
& pImp
->nCallMode
);
328 //--------------------------------------------------------------------
330 void SfxRequest::SetSynchronCall( BOOL bSynchron
)
333 pImp
->nCallMode
|= SFX_CALLMODE_SYNCHRON
;
335 pImp
->nCallMode
&= ~(USHORT
) SFX_CALLMODE_SYNCHRON
;
338 void SfxRequest::SetInternalArgs_Impl( const SfxAllItemSet
& rArgs
)
340 delete pImp
->pInternalArgs
;
341 pImp
->pInternalArgs
= new SfxAllItemSet( rArgs
);
344 const SfxItemSet
* SfxRequest::GetInternalArgs_Impl() const
346 return pImp
->pInternalArgs
;
349 //--------------------------------------------------------------------
352 void SfxRequest_Impl::Record
354 const uno::Sequence
< beans::PropertyValue
>& rArgs
// aktuelle Parameter
359 Interne Hilfsmethode zum erzeugen einer <SfxMacroStatement>-Instanz,
360 welche den bereits ausgef"uhrten SfxRequest wiederholbar beschreibt.
362 Die erzeugte Instanz, auf die ein Pointer zur"uckgeliefert wird
363 geht in das Eigentum des Aufrufers "uber.
367 String aCommand
= String::CreateFromAscii(".uno:");
368 aCommand
.AppendAscii( pSlot
->GetUnoName() );
369 ::rtl::OUString
aCmd( aCommand
);
372 uno::Reference
< container::XIndexReplace
> xReplace( xRecorder
, uno::UNO_QUERY
);
373 if ( xReplace
.is() && aCmd
.compareToAscii(".uno:InsertText") == COMPARE_EQUAL
)
375 sal_Int32 nCount
= xReplace
->getCount();
378 frame::DispatchStatement aStatement
;
379 uno::Any aElement
= xReplace
->getByIndex(nCount
-1);
380 if ( (aElement
>>= aStatement
) && aStatement
.aCommand
== aCmd
)
382 ::rtl::OUString aStr
;
383 ::rtl::OUString aNew
;
384 aStatement
.aArgs
[0].Value
>>= aStr
;
385 rArgs
[0].Value
>>= aNew
;
387 aStatement
.aArgs
[0].Value
<<= aStr
;
388 aElement
<<= aStatement
;
389 xReplace
->replaceByIndex( nCount
-1, aElement
);
395 com::sun::star::uno::Reference
< com::sun::star::lang::XMultiServiceFactory
> xFactory(
396 ::comphelper::getProcessServiceFactory(),
397 com::sun::star::uno::UNO_QUERY
);
399 com::sun::star::uno::Reference
< com::sun::star::util::XURLTransformer
> xTransform(
400 xFactory
->createInstance(rtl::OUString::createFromAscii("com.sun.star.util.URLTransformer")),
401 com::sun::star::uno::UNO_QUERY
);
403 com::sun::star::util::URL aURL
;
404 aURL
.Complete
= aCmd
;
405 xTransform
->parseStrict(aURL
);
408 xRecorder
->recordDispatch(aURL
,rArgs
);
410 xRecorder
->recordDispatchAsComment(aURL
,rArgs
);
414 //--------------------------------------------------------------------
416 void SfxRequest::Record_Impl
418 SfxShell
& rSh
, // die <SfxShell>, die den Request ausgef"uhrt hat
419 const SfxSlot
& rSlot
, // der <SfxSlot>, der den Request ausgef"uhrt hat
420 com::sun::star::uno::Reference
< com::sun::star::frame::XDispatchRecorder
> xRecorder
, // der Recorder, mit dem aufgezeichnet wird
421 SfxViewFrame
* pViewFrame
426 Diese interne Methode markiert den SfxRequest als in dem angegebenen
427 SfxMakro aufzuzeichnen.
429 Pointer auf die Parameter werden in Done() wieder verwendet, m"usseb
430 dann also noch leben.
436 pImp
->pSlot
= &rSlot
;
437 pImp
->xRecorder
= xRecorder
;
438 pImp
->aTarget
= rSh
.GetName();
439 pImp
->pViewFrame
= pViewFrame
;
442 //--------------------------------------------------------------------
444 void SfxRequest::SetArgs( const SfxAllItemSet
& rArgs
)
447 pArgs
= new SfxAllItemSet(rArgs
);
448 pImp
->SetPool( pArgs
->GetPool() );
451 //--------------------------------------------------------------------
453 void SfxRequest::AppendItem(const SfxPoolItem
&rItem
)
456 pArgs
= new SfxAllItemSet(*pImp
->pPool
);
457 pArgs
->Put(rItem
, rItem
.Which());
460 //--------------------------------------------------------------------
462 void SfxRequest::RemoveItem( USHORT nID
)
466 pArgs
->ClearItem(nID
);
467 if ( !pArgs
->Count() )
472 //--------------------------------------------------------------------
474 const SfxPoolItem
* SfxRequest::GetArg
476 USHORT nSlotId
, // Slot-Id oder Which-Id des Parameters
477 FASTBOOL bDeep
, // FALSE: nicht in Parent-ItemSets suchen
478 TypeId aType
// != 0: RTTI Pruefung mit Assertion
481 return GetItem( pArgs
, nSlotId
, bDeep
, aType
);
485 //--------------------------------------------------------------------
486 const SfxPoolItem
* SfxRequest::GetItem
488 const SfxItemSet
* pArgs
,
489 USHORT nSlotId
, // Slot-Id oder Which-Id des Parameters
490 bool bDeep
, // false: nicht in Parent-ItemSets suchen
491 TypeId aType
// != 0: RTTI Pruefung mit Assertion
496 Mit dieser Methode wird der Zugriff auf einzelne Parameter im
497 SfxRequest wesentlich vereinfacht. Insbesondere wird die Typpr"ufung
498 (per Assertion) durchgef"uhrt, wodurch die Applikations-Sourcen
499 wesentlich "ubersichtlicher werden. In der PRODUCT-Version wird
500 eine 0 zur"uckgegeben, wenn das gefundene Item nicht von der
501 angegebenen Klasse ist.
506 void MyShell::Execute( SfxRequest &rReq )
508 switch ( rReq.GetSlot() )
513 // ein Beispiel ohne Verwendung des Makros
514 const SfxInt32Item *pPosItem = (const SfxUInt32Item*)
515 rReq.GetArg( SID_POS, FALSE, TYPE(SfxInt32Item) );
516 USHORT nPos = pPosItem ? pPosItem->GetValue() : 0;
518 // ein Beispiel mit Verwendung des Makros
519 SFX_REQUEST_ARG(rReq, pSizeItem, SfxInt32Item, SID_SIZE, FALSE);
520 USHORT nSize = pSizeItem ? pPosItem->GetValue() : 0;
533 // ggf. in Which-Id umrechnen
534 USHORT nWhich
= pArgs
->GetPool()->GetWhich(nSlotId
);
536 // ist das Item gesetzt oder bei bDeep==TRUE verf"ugbar?
537 const SfxPoolItem
*pItem
= 0;
538 if ( ( bDeep
? SFX_ITEM_AVAILABLE
: SFX_ITEM_SET
)
539 <= pArgs
->GetItemState( nWhich
, bDeep
, &pItem
) )
541 // stimmt der Typ "uberein?
542 if ( !pItem
|| pItem
->IsA(aType
) )
545 // Item da aber falsch => Programmierfehler
546 DBG_ERROR( "invalid argument type" );
550 // keine Parameter, nicht gefunden oder falschen Typ gefunden
554 //--------------------------------------------------------------------
556 void SfxRequest::SetReturnValue(const SfxPoolItem
&rItem
)
558 DBG_ASSERT(!pImp
->pRetVal
, "Returnwert mehrfach setzen?");
560 delete pImp
->pRetVal
;
561 pImp
->pRetVal
= rItem
.Clone();
564 //--------------------------------------------------------------------
566 const SfxPoolItem
* SfxRequest::GetReturnValue() const
568 return pImp
->pRetVal
;
571 //--------------------------------------------------------------------
573 void SfxRequest::Done
575 const SfxItemSet
& rSet
, /* von der Applikation mitgeteilte Parameter,
576 die z.B. in einem Dialog vom Benuter
577 erfragt wurden, ggf. 0 falls keine
578 Parameter gesetzt wurden */
580 FASTBOOL bKeep
/* TRUE (default)
581 'rSet' wird gepeichert und ist "uber
585 'rSet' wird nicht kopiert (schneller) */
590 Diese Methode mu\s in der <Execute-Methode> des <SfxSlot>s gerufen
591 werden, der den SfxRequest ausgef"uhrt hat, wenn die Ausf"uhrung
592 tats"achlich stattgefunden hat. Wird 'Done()' nicht gerufen, gilt
593 der SfxRequest als abgebrochen.
595 Etwaige Returnwerte werden nur durchgereicht, wenn 'Done()' gerufen
596 wurde. Ebenso werden beim Aufzeichnen von Makros nur echte
597 Statements erzeugt, wenn 'Done()' gerufen wurde; f"ur SfxRequests,
598 die nicht derart gekennzeichnet wurden, wird anstelle dessen eine
599 auf die abgebrochene Funktion hinweisende Bemerkung ('rem') eingf"ugt.
604 'Done()' wird z.B. nicht gerufen, wenn ein durch die Funktion gestarteter
605 Dialog vom Benutzer abgebrochen wurde oder das Ausf"uhren aufgrund
606 eines falschen Kontextes (ohne Verwendung separater <SfxShell>s)
607 nicht durchgef"uhrt werden konnte. 'Done()' mu\s sehr wohl gerufen
608 werden, wenn das Ausf"uhren der Funktion zu einem regul"aren Fehler
609 f"uhrte (z.B. Datei konnte nicht ge"offnet werden).
615 // ggf. Items merken, damit StarDraw sie abfragen kann
620 pArgs
= new SfxAllItemSet( rSet
);
621 pImp
->SetPool( pArgs
->GetPool() );
625 SfxItemIter
aIter(rSet
);
626 const SfxPoolItem
* pItem
= aIter
.FirstItem();
629 if(!IsInvalidItem(pItem
))
630 pArgs
->Put(*pItem
,pItem
->Which());
631 pItem
= aIter
.NextItem();
637 //--------------------------------------------------------------------
640 void SfxRequest::Done( BOOL bRelease
)
641 // [<SfxRequest::Done(SfxItemSet&)>]
648 //--------------------------------------------------------------------
650 void SfxRequest::ForgetAllArgs()
653 DELETEZ( pImp
->pInternalArgs
);
656 //--------------------------------------------------------------------
658 BOOL
SfxRequest::IsCancelled() const
660 return pImp
->bCancelled
;
663 //--------------------------------------------------------------------
665 void SfxRequest::Cancel()
669 Markiert diesen Request als nicht mehr auszufuehren. Wird z.B. gerufen,
670 wenn das Ziel (genauer dessen Pool) stirbt.
674 pImp
->bCancelled
= TRUE
;
679 //--------------------------------------------------------------------
682 void SfxRequest::Ignore()
686 Wird diese Methode anstelle von <SfxRequest::Done()> gerufen, dann
687 wird dieser Request nicht recorded.
692 Das Selektieren von Tools im StarDraw soll nicht aufgezeichnet werden,
693 dieselben Slots sollen aber zum erzeugen der von den Tools zu
694 erzeugenden Objekte verwendet werde. Also kann nicht NoRecord
695 angegeben werden, dennoch soll u.U. nicht aufgezeichnet werden.
699 // als tats"achlich ausgef"uhrt markieren
700 pImp
->bIgnored
= TRUE
;
703 //--------------------------------------------------------------------
705 void SfxRequest::Done_Impl
707 const SfxItemSet
* pSet
/* von der Applikation mitgeteilte Parameter,
708 die z.B. in einem Dialog vom Benuter
709 erfragt wurden, ggf. 0 falls keine
710 Parameter gesetzt wurden */
715 Interne Methode zum als 'done' markieren des SfxRequest und zum Auswerten
716 der Parameter in 'pSet' falls aufgezeichnet wird.
720 // als tats"achlich ausgef"uhrt markieren
724 if ( !pImp
->xRecorder
.is() )
727 // wurde ein anderer Slot ausgef"uhrt als angefordert (Delegation)
728 if ( nSlot
!= pImp
->pSlot
->GetSlotId() )
731 pImp
->pSlot
= pImp
->pShell
->GetInterface()->GetSlot(nSlot
);
732 DBG_ASSERT( pImp
->pSlot
, "delegated SlotId not found" );
733 if ( !pImp
->pSlot
) // Hosentr"ger und G"urtel
738 // neues Recorden verwendet UnoName!
739 if ( !pImp
->pSlot
->pUnoName
)
741 ByteString
aStr( "Recording not exported slot: ");
742 aStr
+= ByteString::CreateFromInt32( pImp
->pSlot
->GetSlotId() );
743 DBG_ERROR( aStr
.GetBuffer() );
746 if ( !pImp
->pSlot
->pUnoName
) // Hosentr"ger und G"urtel
749 // "ofters ben"otigte Werte
750 SfxItemPool
&rPool
= pImp
->pShell
->GetPool();
753 if ( !pImp
->pSlot
->IsMode(SFX_SLOT_METHOD
) )
755 // des Property als SfxPoolItem besorgen
756 const SfxPoolItem
*pItem
;
757 USHORT nWhich
= rPool
.GetWhich(pImp
->pSlot
->GetSlotId());
758 SfxItemState eState
= pSet
? pSet
->GetItemState( nWhich
, FALSE
, &pItem
) : SFX_ITEM_UNKNOWN
;
760 if ( SFX_ITEM_SET
!= eState
)
762 ByteString
aStr( "Recording property not available: ");
763 aStr
+= ByteString::CreateFromInt32( pImp
->pSlot
->GetSlotId() );
764 DBG_ERROR( aStr
.GetBuffer() );
767 uno::Sequence
< beans::PropertyValue
> aSeq
;
768 if ( eState
== SFX_ITEM_SET
)
769 TransformItems( pImp
->pSlot
->GetSlotId(), *pSet
, aSeq
, pImp
->pSlot
);
770 pImp
->Record( aSeq
);
773 // alles in ein einziges Statement aufzeichnen?
774 else if ( pImp
->pSlot
->IsMode(SFX_SLOT_RECORDPERSET
) )
776 uno::Sequence
< beans::PropertyValue
> aSeq
;
778 TransformItems( pImp
->pSlot
->GetSlotId(), *pSet
, aSeq
, pImp
->pSlot
);
779 pImp
->Record( aSeq
);
782 // jedes Item als einzelnes Statement recorden
783 else if ( pImp
->pSlot
->IsMode(SFX_SLOT_RECORDPERITEM
) )
787 // "uber die Items iterieren
788 SfxItemIter
aIter(*pSet
);
789 for ( const SfxPoolItem
* pItem
= aIter
.FirstItem(); pItem
; pItem
= aIter
.NextItem() )
791 // die Slot-Id f"ur das einzelne Item ermitteln
792 USHORT nSlotId
= rPool
.GetSlotId( pItem
->Which() );
793 if ( nSlotId
== nSlot
)
795 // mit Hosentr"ager und G"urtel reparieren des falschen Flags
796 DBG_ERROR( "recursion RecordPerItem - use RecordPerSet!" );
797 SfxSlot
*pSlot
= (SfxSlot
*) pImp
->pSlot
;
798 pSlot
->nFlags
&= ~((ULONG
)SFX_SLOT_RECORDPERITEM
);
799 pSlot
->nFlags
&= SFX_SLOT_RECORDPERSET
;
802 // einen Sub-Request recorden
803 SfxRequest
aReq( pImp
->pViewFrame
, nSlotId
);
804 if ( aReq
.pImp
->pSlot
)
805 aReq
.AppendItem( *pItem
);
811 HACK(hierueber nochmal nachdenken
)
812 pImp
->Record( uno::Sequence
< beans::PropertyValue
>() );
817 //--------------------------------------------------------------------
819 BOOL
SfxRequest::IsDone() const
823 Mit dieser Methode kann abgefragt werden, ob der SfxRequest tats"achlich
824 ausgef"uhrt wurde oder nicht. Wurde ein SfxRequest nicht ausgef"uhrt,
825 liegt dies z.B. daran, da\s der Benutzer abgebrochen hat oder
826 der Kontext f"ur diesen Request falsch war, dieses aber nicht "uber
827 eine separate <SfxShell> realisiert wurde.
829 SfxRequest-Instanzen, die hier FALSE liefern, werden nicht recorded.
834 <SfxRequest::Done(const SfxItemSet&)>
842 //--------------------------------------------------------------------
844 SfxMacro
* SfxRequest::GetRecordingMacro()
848 Mit dieser Methode kann abgefragt werden, ob und in welchem <SfxMacro>
849 die SfxRequests gerade aufgezeichnet werden.
856 //--------------------------------------------------------------------
858 com::sun::star::uno::Reference
< com::sun::star::frame::XDispatchRecorder
> SfxRequest::GetMacroRecorder( SfxViewFrame
* pView
)
862 Hier wird versucht einen Recorder fuer dispatch() Aufrufe vom Frame zu bekommen.
863 Dieser ist dort per Property an einem Supplier verfuegbar - aber nur dann, wenn
864 recording angeschaltet wurde.
865 (Siehe auch SfxViewFrame::MiscExec_Impl() und SID_RECORDING)
869 com::sun::star::uno::Reference
< com::sun::star::frame::XDispatchRecorder
> xRecorder
;
871 com::sun::star::uno::Reference
< com::sun::star::beans::XPropertySet
> xSet(
872 (pView
? pView
: SfxViewFrame::Current())->GetFrame()->GetFrameInterface(),
873 com::sun::star::uno::UNO_QUERY
);
877 com::sun::star::uno::Any aProp
= xSet
->getPropertyValue(rtl::OUString::createFromAscii("DispatchRecorderSupplier"));
878 com::sun::star::uno::Reference
< com::sun::star::frame::XDispatchRecorderSupplier
> xSupplier
;
881 xRecorder
= xSupplier
->getDispatchRecorder();
887 BOOL
SfxRequest::HasMacroRecorder( SfxViewFrame
* pView
)
889 return GetMacroRecorder( pView
).is();
893 //--------------------------------------------------------------------
895 BOOL
SfxRequest::IsAPI() const
899 Liefert TRUE, wenn dieser SfxRequest von einer API (z.B. BASIC)
900 erzeugt wurde, sonst FALSE.
904 return SFX_CALLMODE_API
== ( SFX_CALLMODE_API
& pImp
->nCallMode
);
907 //--------------------------------------------------------------------
910 FASTBOOL
SfxRequest::IsRecording() const
914 Liefert TRUE, wenn dieser SfxRequest recorded werden soll, d.h.
915 1. zu Zeit ein Makro aufgezeichnet wird
916 2. dieser Request "uberhaupt aufgezeichnet wird
917 3. der Request nicht von reiner API (z.B. BASIC) ausgeht,
922 return ( AllowsRecording() && GetMacroRecorder().is() );
925 //--------------------------------------------------------------------
926 void SfxRequest::SetModifier( USHORT nModi
)
928 pImp
->nModifier
= nModi
;
931 //--------------------------------------------------------------------
932 USHORT
SfxRequest::GetModifier() const
934 return pImp
->nModifier
;
937 //--------------------------------------------------------------------
939 void SfxRequest::SetTarget( const String
&rTarget
)
943 Mit dieser Methode kann das zu recordende Zielobjekt umgesetzt werden.
948 Die BASIC-Methode 'Open' wird zwar von der Shell 'Application' ausgef"uhrt,
949 aber am Objekt 'Documents' (global) recorded:
951 rReq.SetTarget( "Documents" );
955 Documents.Open( ... )
959 pImp
->aTarget
= rTarget
;
960 pImp
->bUseTarget
= TRUE
;
963 void SfxRequest::AllowRecording( BOOL bSet
)
965 pImp
->bAllowRecording
= bSet
;
968 BOOL
SfxRequest::AllowsRecording() const
970 BOOL bAllow
= pImp
->bAllowRecording
;
972 bAllow
= ( SFX_CALLMODE_API
!= ( SFX_CALLMODE_API
& pImp
->nCallMode
) ) &&
973 ( SFX_CALLMODE_RECORD
== ( SFX_CALLMODE_RECORD
& pImp
->nCallMode
) );
977 void SfxRequest::ReleaseArgs()
980 DELETEZ( pImp
->pInternalArgs
);