xref: /trunk/main/sfx2/source/control/macro.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_sfx2.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
32*cdf0e10cSrcweir #include <tools/stream.hxx>
33*cdf0e10cSrcweir #endif
34*cdf0e10cSrcweir 
35*cdf0e10cSrcweir #include "macro.hxx"
36*cdf0e10cSrcweir #include <sfx2/request.hxx>
37*cdf0e10cSrcweir #include <sfx2/msg.hxx>
38*cdf0e10cSrcweir 
39*cdf0e10cSrcweir //====================================================================
40*cdf0e10cSrcweir 
41*cdf0e10cSrcweir SV_DECL_PTRARR_DEL( SfxStatements_Impl, SfxMacroStatement*, 16, 8 )
42*cdf0e10cSrcweir SV_IMPL_PTRARR( SfxStatements_Impl, SfxMacroStatement* );
43*cdf0e10cSrcweir 
44*cdf0e10cSrcweir //--------------------------------------------------------------------
45*cdf0e10cSrcweir 
46*cdf0e10cSrcweir struct SfxMacro_Impl
47*cdf0e10cSrcweir 
48*cdf0e10cSrcweir /*  [Beschreibung]
49*cdf0e10cSrcweir 
50*cdf0e10cSrcweir     Implementations-Struktur der Klasse <SfxMacro>.
51*cdf0e10cSrcweir */
52*cdf0e10cSrcweir 
53*cdf0e10cSrcweir {
54*cdf0e10cSrcweir     SfxMacroMode        eMode;  /*  Zweck der <SfxMacro>-Instanz,
55*cdf0e10cSrcweir                                     Bedeutung siehe enum <SfxMacroMode> */
56*cdf0e10cSrcweir     SfxStatements_Impl  aList;  /*  Liste von aufgezeichneten Statements */
57*cdf0e10cSrcweir };
58*cdf0e10cSrcweir 
59*cdf0e10cSrcweir //====================================================================
60*cdf0e10cSrcweir 
61*cdf0e10cSrcweir SfxMacroStatement::SfxMacroStatement
62*cdf0e10cSrcweir (
63*cdf0e10cSrcweir     const SfxShell& /*rShell*/,     // <SfxShell>, die den Request ausf"uhrte
64*cdf0e10cSrcweir     const String&   /*rTarget*/,    // Name des Zielobjektes vor der Ausf"urhung
65*cdf0e10cSrcweir     sal_Bool            /*bAbsolute*/,  // obsolet
66*cdf0e10cSrcweir     const SfxSlot&  rSlot,          // der <SfxSlot>, der das Statement abspielen kann
67*cdf0e10cSrcweir     sal_Bool            bRequestDone,   // wurde der Request tats"achlich ausgef"uhrt
68*cdf0e10cSrcweir     ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >& rArgs
69*cdf0e10cSrcweir )
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir /*  [Beschreibung]
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir     Dieser Konstruktor der Klasse SfxMacroStatement erzeugt ein Statement,
74*cdf0e10cSrcweir     bei dem ein Objekt angesprochen wird, welches durch 'rShell' angegeben
75*cdf0e10cSrcweir     ist. Dabei erfolgt die Addressierung je nach 'bAbsolute' absolut,
76*cdf0e10cSrcweir     also z.B. als '[mydoc.sdc]' oder relativ, also z.B. 'ActiveDocument'.
77*cdf0e10cSrcweir 
78*cdf0e10cSrcweir     Je nach Art der Subklasse von 'rShell' ergeben sich folgende
79*cdf0e10cSrcweir     Ausdr"ucke:
80*cdf0e10cSrcweir 
81*cdf0e10cSrcweir                           | absolut                  relativ
82*cdf0e10cSrcweir     -----------------------------------------------------------------------
83*cdf0e10cSrcweir     SfxApplication'       | 'StarCalc'              'Application'
84*cdf0e10cSrcweir     SfxViewFrame'         | '[mydoc.sdc:1]'         'ActiveWindow'
85*cdf0e10cSrcweir     SfxViewShell'         | '[mydoc.sdc:1]'         'AvtiveWindow'
86*cdf0e10cSrcweir     SfxObjectShell'       | '[mydoc.sdc]'           'ActiveDocument'
87*cdf0e10cSrcweir     sonstige (Sub-Shells) | '[mydoc.sdc:1]'         'ActiveWindow'
88*cdf0e10cSrcweir 
89*cdf0e10cSrcweir     Dabei sind 'StarCalc' stellvertretend fuer den Namen der Applikation
90*cdf0e10cSrcweir     (Application::GetAppName()const). In der absoluten Fassung k"onnte
91*cdf0e10cSrcweir     die Selektion auch deskriptiv z.B. als 'CellSelection("A5-D8")')
92*cdf0e10cSrcweir     angesprochen werden, dazu mu\ jedoch vom Anwendungsprogrammierer der
93*cdf0e10cSrcweir     Konstruktor <SfxMacroStatement::SfxMacroStatement(const String&,
94*cdf0e10cSrcweir     const SfxSlot&,sal_Bool,SfxArguments*)> verwendet werden.
95*cdf0e10cSrcweir 
96*cdf0e10cSrcweir     F"ur das so bezeichnete Objekt wird dann je nach Typ des Slots
97*cdf0e10cSrcweir     eine Zuweisung an eines seiner Properties oder der Aufruf einer seiner
98*cdf0e10cSrcweir     Methoden ausgedr"uckt.
99*cdf0e10cSrcweir 
100*cdf0e10cSrcweir 
101*cdf0e10cSrcweir     [Beispiele]
102*cdf0e10cSrcweir 
103*cdf0e10cSrcweir     absolut:
104*cdf0e10cSrcweir     SCalc3.OpenDocument( "\docs\mydoc.sdd", "StarDraw Presentation", 0, 0 )
105*cdf0e10cSrcweir     [mydoc.sdd].Activate()
106*cdf0e10cSrcweir     [mydoc.sdd:1].SwitchToView( 2 )
107*cdf0e10cSrcweir     [mydoc.sdc:1:1].CellSelection( "A5-D8" ).LineColor = 192357
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir     relativ:
110*cdf0e10cSrcweir     ActiveWindow.LineColor = 192357
111*cdf0e10cSrcweir 
112*cdf0e10cSrcweir 
113*cdf0e10cSrcweir     [Querverweise]
114*cdf0e10cSrcweir 
115*cdf0e10cSrcweir     <SfxMacroStatement::SfxMacroStatement(const String&,const SfxSlot&,sal_Bool,SfxArguments*)>
116*cdf0e10cSrcweir     <SfxMacroStatement::SfxMacroStatement(const String&)>
117*cdf0e10cSrcweir */
118*cdf0e10cSrcweir 
119*cdf0e10cSrcweir :   nSlotId( rSlot.GetSlotId() ),
120*cdf0e10cSrcweir     aArgs( rArgs ),
121*cdf0e10cSrcweir     bDone( bRequestDone ),
122*cdf0e10cSrcweir     pDummy( 0 )
123*cdf0e10cSrcweir {
124*cdf0e10cSrcweir     // Workaround Recording nicht exportierter Slots (#25386#)
125*cdf0e10cSrcweir     if ( !rSlot.pName )
126*cdf0e10cSrcweir         return;
127*cdf0e10cSrcweir /*
128*cdf0e10cSrcweir     // Objekt-Typ bestimmen
129*cdf0e10cSrcweir     bool bIsApp = rShell.ISA(SfxApplication);
130*cdf0e10cSrcweir     bool bIsDoc = rShell.ISA(SfxObjectShell);
131*cdf0e10cSrcweir     bool bIsWin = !bIsApp && !bIsDoc &&
132*cdf0e10cSrcweir                       ( rShell.ISA(SfxViewShell) || rShell.ISA(SfxViewFrame) );
133*cdf0e10cSrcweir     bool bIsSel = !bIsApp && !bIsDoc && !bIsWin;
134*cdf0e10cSrcweir 
135*cdf0e10cSrcweir     // Objekt nicht schon im Slot-Namen enthalten?
136*cdf0e10cSrcweir     if ( bIsSel || rSlot.pName[0] == '.' )
137*cdf0e10cSrcweir     {
138*cdf0e10cSrcweir         // absolutes Aufzeichnen?
139*cdf0e10cSrcweir         if ( rSlot.IsMode( SFX_SLOT_RECORDABSOLUTE ) )
140*cdf0e10cSrcweir         {
141*cdf0e10cSrcweir             // an der Applikation oder am Modul
142*cdf0e10cSrcweir             if ( rShell.ISA(SfxApplication) || rShell.ISA(SfxModule) )
143*cdf0e10cSrcweir                 aStatement = rTarget;
144*cdf0e10cSrcweir 
145*cdf0e10cSrcweir             // am Dokument?
146*cdf0e10cSrcweir             // '[' = 5Bh
147*cdf0e10cSrcweir             // ']' = 5Dh
148*cdf0e10cSrcweir             else if ( rShell.ISA(SfxObjectShell) )
149*cdf0e10cSrcweir             {
150*cdf0e10cSrcweir                 aStatement = 0x005B;
151*cdf0e10cSrcweir                 aStatement += rTarget;
152*cdf0e10cSrcweir                 aStatement += 0x005D;
153*cdf0e10cSrcweir             }
154*cdf0e10cSrcweir 
155*cdf0e10cSrcweir             else if ( rShell.ISA(SfxViewFrame) )
156*cdf0e10cSrcweir             {
157*cdf0e10cSrcweir                 aStatement = 0x005B;
158*cdf0e10cSrcweir                 aStatement += String::CreateFromAscii("ViewFrame");//rShell.GetSbxObject()->GetName();
159*cdf0e10cSrcweir                 aStatement += 0x005D;
160*cdf0e10cSrcweir             }
161*cdf0e10cSrcweir 
162*cdf0e10cSrcweir             else
163*cdf0e10cSrcweir             {
164*cdf0e10cSrcweir                 // an der View oder Sub-Shell
165*cdf0e10cSrcweir                 SfxViewShell *pViewShell = rShell.GetViewShell();
166*cdf0e10cSrcweir                 aStatement = 0x005B;
167*cdf0e10cSrcweir                 aStatement += String::CreateFromAscii("ViewShell");//pViewShell->GetViewFrame()->GetSbxObject()->GetName();
168*cdf0e10cSrcweir                 aStatement += 0x005D;
169*cdf0e10cSrcweir                 if ( !rShell.ISA(SfxViewFrame) )
170*cdf0e10cSrcweir                     // an einer Sub-Shell zus"atlich ".Selection" anh"angen
171*cdf0e10cSrcweir                     aStatement += DEFINE_CONST_UNICODE(".Selection");
172*cdf0e10cSrcweir             }
173*cdf0e10cSrcweir         }
174*cdf0e10cSrcweir         else // relatives Aufzeichnen
175*cdf0e10cSrcweir         {
176*cdf0e10cSrcweir             // an der Application?
177*cdf0e10cSrcweir             if ( rShell.ISA(SfxApplication) )
178*cdf0e10cSrcweir                 aStatement = DEFINE_CONST_UNICODE("Application");
179*cdf0e10cSrcweir 
180*cdf0e10cSrcweir             // am Modul?
181*cdf0e10cSrcweir             else if ( rShell.ISA(SfxModule) )
182*cdf0e10cSrcweir                 aStatement = DEFINE_CONST_UNICODE("ActiveModule");
183*cdf0e10cSrcweir 
184*cdf0e10cSrcweir             // am Dokument
185*cdf0e10cSrcweir             else if ( rShell.ISA(SfxObjectShell) )
186*cdf0e10cSrcweir                 aStatement = DEFINE_CONST_UNICODE("ActiveDocument");
187*cdf0e10cSrcweir 
188*cdf0e10cSrcweir             // am Window
189*cdf0e10cSrcweir             else if ( rShell.ISA(SfxViewShell) || rShell.ISA(SfxViewFrame) )
190*cdf0e10cSrcweir                 aStatement = DEFINE_CONST_UNICODE("ActiveWindow");
191*cdf0e10cSrcweir 
192*cdf0e10cSrcweir             else
193*cdf0e10cSrcweir                 // an einer Sub-Shell
194*cdf0e10cSrcweir                 aStatement = DEFINE_CONST_UNICODE("Selection");
195*cdf0e10cSrcweir         }
196*cdf0e10cSrcweir     }
197*cdf0e10cSrcweir 
198*cdf0e10cSrcweir     if ( bIsSel )
199*cdf0e10cSrcweir     {
200*cdf0e10cSrcweir         // bei Selection ggf. noch den Namen der SubShell anh"angen
201*cdf0e10cSrcweir         const SfxShellObject *pShObj =
202*cdf0e10cSrcweir                     (const SfxShellObject*) rShell.GetSbxObject();
203*cdf0e10cSrcweir         if ( pShObj )
204*cdf0e10cSrcweir         {
205*cdf0e10cSrcweir             const SfxShellObject *pParentObj =
206*cdf0e10cSrcweir                         (const SfxShellObject*) pShObj->GetParent();
207*cdf0e10cSrcweir             SfxShell *pParentSh = pParentObj->GetShell();
208*cdf0e10cSrcweir             DBG_ASSERT( pParentSh->ISA(SfxViewFrame),
209*cdf0e10cSrcweir                         "parent of SubShell must be a Frame" );
210*cdf0e10cSrcweir             if ( rSlot.pName[0] == '.' )
211*cdf0e10cSrcweir             {
212*cdf0e10cSrcweir                 aStatement += '.';
213*cdf0e10cSrcweir                 aStatement += rShell.GetSbxObject()->GetName();
214*cdf0e10cSrcweir             }
215*cdf0e10cSrcweir         }
216*cdf0e10cSrcweir         else
217*cdf0e10cSrcweir             DBG_ASSERT( rSlot.pName[0] != '0', "recording unnamed object" );
218*cdf0e10cSrcweir     }
219*cdf0e10cSrcweir */
220*cdf0e10cSrcweir     aStatement = DEFINE_CONST_UNICODE("Selection");
221*cdf0e10cSrcweir 
222*cdf0e10cSrcweir     // an diesen Objekt-Ausdruck den Methoden-/Property-Namen und Parameter
223*cdf0e10cSrcweir     GenerateNameAndArgs_Impl( SfxRequest::GetRecordingMacro(), rSlot, bRequestDone, aArgs);
224*cdf0e10cSrcweir }
225*cdf0e10cSrcweir 
226*cdf0e10cSrcweir //--------------------------------------------------------------------
227*cdf0e10cSrcweir 
228*cdf0e10cSrcweir SfxMacroStatement::SfxMacroStatement
229*cdf0e10cSrcweir (
230*cdf0e10cSrcweir     const String&   rTarget,        // Objekt, was beim Playing angesprochen wird
231*cdf0e10cSrcweir     const SfxSlot&  rSlot,          // der <SfxSlot>, der das Statement abspielen kann
232*cdf0e10cSrcweir     sal_Bool            bRequestDone,   // wurde der Request tats"achlich ausgef"uhrt
233*cdf0e10cSrcweir     ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >& rArgs
234*cdf0e10cSrcweir )
235*cdf0e10cSrcweir 
236*cdf0e10cSrcweir /*  [Beschreibung]
237*cdf0e10cSrcweir 
238*cdf0e10cSrcweir 
239*cdf0e10cSrcweir     [Querverweise]
240*cdf0e10cSrcweir 
241*cdf0e10cSrcweir     <SfxMacroStatement::SfxMacroStatement(const String&)>
242*cdf0e10cSrcweir     <SfxMacroStatement::SfxMacroStatement(const SfxShell&,sal_Bool,const SfxSlot&,sal_Bool,SfxArguments*)>
243*cdf0e10cSrcweir */
244*cdf0e10cSrcweir 
245*cdf0e10cSrcweir :   nSlotId( rSlot.GetSlotId() ),
246*cdf0e10cSrcweir     aArgs( rArgs ),
247*cdf0e10cSrcweir     bDone( bRequestDone ),
248*cdf0e10cSrcweir     pDummy( 0 )
249*cdf0e10cSrcweir {
250*cdf0e10cSrcweir     aStatement = rTarget;
251*cdf0e10cSrcweir     aStatement += '.';
252*cdf0e10cSrcweir     GenerateNameAndArgs_Impl( SfxRequest::GetRecordingMacro(), rSlot, bRequestDone, aArgs);
253*cdf0e10cSrcweir }
254*cdf0e10cSrcweir 
255*cdf0e10cSrcweir //--------------------------------------------------------------------
256*cdf0e10cSrcweir 
257*cdf0e10cSrcweir SfxMacroStatement::SfxMacroStatement
258*cdf0e10cSrcweir (
259*cdf0e10cSrcweir     const String&   rStatement      // manuell erzeugte(s) Statement(s)
260*cdf0e10cSrcweir )
261*cdf0e10cSrcweir 
262*cdf0e10cSrcweir /*  [Beschreibung]
263*cdf0e10cSrcweir 
264*cdf0e10cSrcweir     Dieser Konstruktor erzeugt eine SfxMacroStatement-Instanz, deren
265*cdf0e10cSrcweir     Aufbau vollst"andig vom Applikationsentwickler bestimmt wird. Da der
266*cdf0e10cSrcweir     angegebene String auch mehrere mit CR/LF getrennte Statements
267*cdf0e10cSrcweir     enthalten darf, ist damit ein weitgehender Eingriff in das Aufzeichnen
268*cdf0e10cSrcweir     von BASIC-Makros m"oglich, um Spezialf"alle zu behandeln.
269*cdf0e10cSrcweir 
270*cdf0e10cSrcweir 
271*cdf0e10cSrcweir     [Querverweise]
272*cdf0e10cSrcweir 
273*cdf0e10cSrcweir     <SfxMacroStatement::SfxMacroStatement(const String&,const SfxSlot&,sal_Bool,SfxArguments*)>
274*cdf0e10cSrcweir     <SfxMacroStatement::SfxMacroStatement(const SfxShell&,sal_Bool,const SfxSlot&,sal_Bool,SfxArguments*)>
275*cdf0e10cSrcweir */
276*cdf0e10cSrcweir 
277*cdf0e10cSrcweir :   nSlotId( 0 ),
278*cdf0e10cSrcweir        aStatement( rStatement ),
279*cdf0e10cSrcweir     bDone( sal_True ),
280*cdf0e10cSrcweir     pDummy( 0 )
281*cdf0e10cSrcweir {
282*cdf0e10cSrcweir }
283*cdf0e10cSrcweir 
284*cdf0e10cSrcweir //--------------------------------------------------------------------
285*cdf0e10cSrcweir 
286*cdf0e10cSrcweir SfxMacroStatement::SfxMacroStatement
287*cdf0e10cSrcweir (
288*cdf0e10cSrcweir     const SfxMacroStatement&    rOrig // Original, von dem kopiert wird
289*cdf0e10cSrcweir )
290*cdf0e10cSrcweir 
291*cdf0e10cSrcweir /*  [Beschreibung]
292*cdf0e10cSrcweir 
293*cdf0e10cSrcweir     Copy-Konstruktor der SfxMacroStatement-Klasse.
294*cdf0e10cSrcweir */
295*cdf0e10cSrcweir 
296*cdf0e10cSrcweir :   nSlotId( rOrig.nSlotId ),
297*cdf0e10cSrcweir     aStatement( rOrig.aStatement ),
298*cdf0e10cSrcweir        bDone( rOrig.bDone ),
299*cdf0e10cSrcweir     pDummy( 0 )
300*cdf0e10cSrcweir {
301*cdf0e10cSrcweir     aArgs = rOrig.aArgs;
302*cdf0e10cSrcweir }
303*cdf0e10cSrcweir 
304*cdf0e10cSrcweir //--------------------------------------------------------------------
305*cdf0e10cSrcweir 
306*cdf0e10cSrcweir SfxMacroStatement::~SfxMacroStatement()
307*cdf0e10cSrcweir 
308*cdf0e10cSrcweir /*  [Beschreibung]
309*cdf0e10cSrcweir 
310*cdf0e10cSrcweir     Destruktor der Klasse SfxMacroStatement. Gibt die Liste der
311*cdf0e10cSrcweir     aktuellen Parameter frei.
312*cdf0e10cSrcweir */
313*cdf0e10cSrcweir 
314*cdf0e10cSrcweir {
315*cdf0e10cSrcweir }
316*cdf0e10cSrcweir 
317*cdf0e10cSrcweir //--------------------------------------------------------------------
318*cdf0e10cSrcweir 
319*cdf0e10cSrcweir void SfxMacroStatement::GenerateNameAndArgs_Impl
320*cdf0e10cSrcweir (
321*cdf0e10cSrcweir     SfxMacro*       /*pMacro*/,         // darin wird aufgezeichnet
322*cdf0e10cSrcweir     const SfxSlot&  rSlot,          // der Slot, der das Statement abspielen kann
323*cdf0e10cSrcweir     sal_Bool            bRequestDone,   // sal_True=wurde ausgef"uhrt, sal_False=abgebrochen
324*cdf0e10cSrcweir     ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >& /*rArgs*/
325*cdf0e10cSrcweir )
326*cdf0e10cSrcweir 
327*cdf0e10cSrcweir /*  [Beschreibung]
328*cdf0e10cSrcweir 
329*cdf0e10cSrcweir     Interne Hilfsmethode zum generieren des Funktions-/Property-Names
330*cdf0e10cSrcweir     sowie der Parameter. Diese Methode wird nur verwendet, wenn der
331*cdf0e10cSrcweir     Anwendungsprogrammierer keinen eigenen Source an den <SfxRequest>
332*cdf0e10cSrcweir     geh"angt hat.
333*cdf0e10cSrcweir */
334*cdf0e10cSrcweir 
335*cdf0e10cSrcweir {
336*cdf0e10cSrcweir     if ( aStatement.Len() && aStatement.GetChar( aStatement.Len() - 1 ) != '.'
337*cdf0e10cSrcweir          && rSlot.pName[0] != '.' )
338*cdf0e10cSrcweir         aStatement += '.';
339*cdf0e10cSrcweir 
340*cdf0e10cSrcweir     // der Name des Slots ist der Name der Methode / des Properties
341*cdf0e10cSrcweir     aStatement += String::CreateFromAscii(rSlot.pName);
342*cdf0e10cSrcweir     if ( rSlot.IsMode(SFX_SLOT_METHOD) )
343*cdf0e10cSrcweir         aStatement += DEFINE_CONST_UNICODE("( ");
344*cdf0e10cSrcweir     else
345*cdf0e10cSrcweir         aStatement += DEFINE_CONST_UNICODE(" = ");
346*cdf0e10cSrcweir 
347*cdf0e10cSrcweir     // alle zusammengesuchten Parameter rausschreiben
348*cdf0e10cSrcweir     if ( aArgs.getLength() )
349*cdf0e10cSrcweir         for ( sal_uInt16 nArg = 0; nArg < aArgs.getLength(); ++nArg )
350*cdf0e10cSrcweir         {
351*cdf0e10cSrcweir             // den Parameter textuell darstellen
352*cdf0e10cSrcweir             String aArg;
353*cdf0e10cSrcweir             ::com::sun::star::uno::Any& rValue = aArgs[nArg].Value;
354*cdf0e10cSrcweir             ::com::sun::star::uno::Type pType = rValue.getValueType();
355*cdf0e10cSrcweir             if ( pType == ::getBooleanCppuType() )
356*cdf0e10cSrcweir             {
357*cdf0e10cSrcweir                 sal_Bool bTemp = false;
358*cdf0e10cSrcweir                 rValue >>= bTemp;
359*cdf0e10cSrcweir                 aArg = bTemp ? DEFINE_CONST_UNICODE("TRUE") : DEFINE_CONST_UNICODE("FALSE");
360*cdf0e10cSrcweir             }
361*cdf0e10cSrcweir             else if ( pType == ::getCppuType((const sal_Int16*)0) )
362*cdf0e10cSrcweir             {
363*cdf0e10cSrcweir                 sal_uInt16 nTemp = 0;
364*cdf0e10cSrcweir                 rValue >>= nTemp;
365*cdf0e10cSrcweir                 aArg = String::CreateFromInt32( (sal_Int32) nTemp );
366*cdf0e10cSrcweir             }
367*cdf0e10cSrcweir             else if ( pType == ::getCppuType((const sal_Int32*)0) )
368*cdf0e10cSrcweir             {
369*cdf0e10cSrcweir                 sal_uInt32 nTemp = 0;
370*cdf0e10cSrcweir                 rValue >>= nTemp;
371*cdf0e10cSrcweir                 aArg = String::CreateFromInt32( nTemp );
372*cdf0e10cSrcweir             }
373*cdf0e10cSrcweir             else if ( pType == ::getCppuType((const ::rtl::OUString*)0) )
374*cdf0e10cSrcweir             {
375*cdf0e10cSrcweir                 ::rtl::OUString sTemp;
376*cdf0e10cSrcweir                 rValue >>= sTemp;
377*cdf0e10cSrcweir 
378*cdf0e10cSrcweir                 // Anf"uhrungszeichen werden verdoppelt
379*cdf0e10cSrcweir                 XubString aRecordable( sTemp );
380*cdf0e10cSrcweir                 sal_uInt16 nPos = 0;
381*cdf0e10cSrcweir                 while ( sal_True )
382*cdf0e10cSrcweir                 {
383*cdf0e10cSrcweir                     nPos = aRecordable.SearchAndReplace( DEFINE_CONST_UNICODE('"'), DEFINE_CONST_UNICODE("\"\""), nPos );
384*cdf0e10cSrcweir                     if ( STRING_NOTFOUND == nPos )
385*cdf0e10cSrcweir                         break;
386*cdf0e10cSrcweir                     nPos += 2;
387*cdf0e10cSrcweir                 }
388*cdf0e10cSrcweir 
389*cdf0e10cSrcweir                 // nicht druckbare Zeichen werden als chr$(...) geschrieben
390*cdf0e10cSrcweir                 bool bPrevReplaced = sal_False;
391*cdf0e10cSrcweir                 for ( sal_uInt16 n = 0; n < aRecordable.Len(); ++n )
392*cdf0e10cSrcweir                 {
393*cdf0e10cSrcweir                     sal_Unicode cChar = aRecordable.GetChar(n);
394*cdf0e10cSrcweir                     if ( !( cChar>=32 && cChar!=127 ) ) // ALS ERSATZ FUER String::IsPrintable()!
395*cdf0e10cSrcweir                     {
396*cdf0e10cSrcweir                         XubString aReplacement( DEFINE_CONST_UNICODE("+chr$(") );
397*cdf0e10cSrcweir                         aReplacement += cChar;
398*cdf0e10cSrcweir 
399*cdf0e10cSrcweir                         if ( bPrevReplaced )
400*cdf0e10cSrcweir                         {
401*cdf0e10cSrcweir                             aRecordable.Insert( aReplacement, n - 2 );
402*cdf0e10cSrcweir                             n = n + aReplacement.Len();
403*cdf0e10cSrcweir                             aRecordable.SetChar((unsigned short) (n-2), 0x0029);// ')' = 29h
404*cdf0e10cSrcweir                             aRecordable.Replace( n-1, 2, DEFINE_CONST_UNICODE("+\"") );
405*cdf0e10cSrcweir                             // ++n;
406*cdf0e10cSrcweir                         }
407*cdf0e10cSrcweir                         else
408*cdf0e10cSrcweir                         {
409*cdf0e10cSrcweir                             aReplacement += DEFINE_CONST_UNICODE(")+\"");
410*cdf0e10cSrcweir                             aRecordable.SetChar(n, 0x0022 );// '"' = 22h
411*cdf0e10cSrcweir                             aRecordable.Insert( aReplacement, n + 1 );
412*cdf0e10cSrcweir                             n = n + aReplacement.Len();
413*cdf0e10cSrcweir                         }
414*cdf0e10cSrcweir                         bPrevReplaced = sal_True;
415*cdf0e10cSrcweir                     }
416*cdf0e10cSrcweir                     else
417*cdf0e10cSrcweir                         bPrevReplaced = sal_False;
418*cdf0e10cSrcweir 
419*cdf0e10cSrcweir                     // Argument in Anf"uhrungszeichen
420*cdf0e10cSrcweir                     aArg = '"';
421*cdf0e10cSrcweir                     aArg += aRecordable;
422*cdf0e10cSrcweir                     aArg += '"';
423*cdf0e10cSrcweir                 }
424*cdf0e10cSrcweir /*
425*cdf0e10cSrcweir                 case SbxBYTE:
426*cdf0e10cSrcweir                 {
427*cdf0e10cSrcweir                     // als Zahl darstellen
428*cdf0e10cSrcweir                     aArg = (sal_uInt16) rVar.GetByte();
429*cdf0e10cSrcweir                     break;
430*cdf0e10cSrcweir                 }
431*cdf0e10cSrcweir */
432*cdf0e10cSrcweir             }
433*cdf0e10cSrcweir             else
434*cdf0e10cSrcweir             {
435*cdf0e10cSrcweir                 OSL_ENSURE(
436*cdf0e10cSrcweir                     pType == ::getVoidCppuType(), "Unknown Type in recorder!" );
437*cdf0e10cSrcweir             }
438*cdf0e10cSrcweir 
439*cdf0e10cSrcweir             // den Parameter anh"angen
440*cdf0e10cSrcweir             aStatement += aArg;
441*cdf0e10cSrcweir             aStatement += DEFINE_CONST_UNICODE(", ");
442*cdf0e10cSrcweir         }
443*cdf0e10cSrcweir 
444*cdf0e10cSrcweir     // Statement beeden
445*cdf0e10cSrcweir     if ( aArgs.getLength() )
446*cdf0e10cSrcweir         aStatement.Erase( aStatement.Len() - 2, 1 );
447*cdf0e10cSrcweir     else
448*cdf0e10cSrcweir         aStatement.Erase( aStatement.Len() - 1, 1 );
449*cdf0e10cSrcweir     if ( rSlot.IsMode(SFX_SLOT_METHOD) )
450*cdf0e10cSrcweir         aStatement += ')';
451*cdf0e10cSrcweir 
452*cdf0e10cSrcweir     if ( !bRequestDone )
453*cdf0e10cSrcweir         // nicht als "Done()" gekennzeichnete Statements auskommentieren
454*cdf0e10cSrcweir         aStatement.InsertAscii( "rem ", 0 );
455*cdf0e10cSrcweir }
456*cdf0e10cSrcweir 
457*cdf0e10cSrcweir //--------------------------------------------------------------------
458*cdf0e10cSrcweir 
459*cdf0e10cSrcweir SfxMacro::SfxMacro
460*cdf0e10cSrcweir (
461*cdf0e10cSrcweir     SfxMacroMode    eMode       // Zweck der Instanz, siehe <SfxMacroMode>
462*cdf0e10cSrcweir )
463*cdf0e10cSrcweir 
464*cdf0e10cSrcweir /*  [Beschreibung]
465*cdf0e10cSrcweir 
466*cdf0e10cSrcweir     Konstruktor der Klasse SfxMacro. Instanzen dieser Klasse werden im
467*cdf0e10cSrcweir     SFx zu zwei Zwecken ben"otigt:
468*cdf0e10cSrcweir 
469*cdf0e10cSrcweir     1. zum Aufzeichnen von Makros
470*cdf0e10cSrcweir     In diesem Fall wird der Konstruktor mit SFX_MACRO_RECORDINGABSOLUTE
471*cdf0e10cSrcweir     oder SFX_MACRO_RECORDINGRELATIVE aufgerufen. Es sollte sich um eine
472*cdf0e10cSrcweir     Instanz einer abgeleiteten Klasse handeln, um in der Ableitung
473*cdf0e10cSrcweir     die Information dar"uber unterzubringen, wo das Makro gespeichert
474*cdf0e10cSrcweir     werden soll. Ein solches Makro solle sich dann in seinem Destruktor
475*cdf0e10cSrcweir     an der vom Benutzer gew"ahlten Stelle speichern.
476*cdf0e10cSrcweir 
477*cdf0e10cSrcweir     2. zum Zuordnen von exisitierenden Makros
478*cdf0e10cSrcweir     In diesem Fall wird der Konstruktor mit SFX_MACRO_EXISTING aufgerufen.
479*cdf0e10cSrcweir     Eine solche Instanz wird z.B. ben"otigt, wenn Makros auf Events
480*cdf0e10cSrcweir     oder <SfxControllerItem>s konfiguriert werden sollen.
481*cdf0e10cSrcweir */
482*cdf0e10cSrcweir 
483*cdf0e10cSrcweir :   pImp( new SfxMacro_Impl )
484*cdf0e10cSrcweir 
485*cdf0e10cSrcweir {
486*cdf0e10cSrcweir     pImp->eMode = eMode;
487*cdf0e10cSrcweir }
488*cdf0e10cSrcweir 
489*cdf0e10cSrcweir //--------------------------------------------------------------------
490*cdf0e10cSrcweir 
491*cdf0e10cSrcweir SfxMacro::~SfxMacro()
492*cdf0e10cSrcweir 
493*cdf0e10cSrcweir /*  [Beschreibung]
494*cdf0e10cSrcweir 
495*cdf0e10cSrcweir     Virtueller Destruktor der Klasse SfxMacro. Dieser sollte in den
496*cdf0e10cSrcweir     abgeleiteten Klassen "uberladen werden, um in den Modi
497*cdf0e10cSrcweir     SFX_MACRO_RECORDINGABSOLUTE und SFX_MACRO_RECORDINGRELATIVE den
498*cdf0e10cSrcweir     aufgezeichneten Source abzuspeichern.
499*cdf0e10cSrcweir 
500*cdf0e10cSrcweir 
501*cdf0e10cSrcweir     [Querverweise]
502*cdf0e10cSrcweir 
503*cdf0e10cSrcweir     <SfxMacro::GenerateSource()const>
504*cdf0e10cSrcweir */
505*cdf0e10cSrcweir 
506*cdf0e10cSrcweir {
507*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
508*cdf0e10cSrcweir     SvFileStream aStream( String::CreateFromAscii("file:///f:/testmacro.bas" ), STREAM_STD_READWRITE | STREAM_TRUNC );
509*cdf0e10cSrcweir     aStream << ByteString( GenerateSource(), RTL_TEXTENCODING_UTF8 ).GetBuffer();
510*cdf0e10cSrcweir #endif
511*cdf0e10cSrcweir     delete pImp;
512*cdf0e10cSrcweir }
513*cdf0e10cSrcweir 
514*cdf0e10cSrcweir //--------------------------------------------------------------------
515*cdf0e10cSrcweir 
516*cdf0e10cSrcweir SfxMacroMode SfxMacro::GetMode() const
517*cdf0e10cSrcweir 
518*cdf0e10cSrcweir /*  [Beschreibung]
519*cdf0e10cSrcweir 
520*cdf0e10cSrcweir     Liefert den Modus, der besagt zu welchem Zweck das SfxMacro konstruiert
521*cdf0e10cSrcweir     wurde.
522*cdf0e10cSrcweir 
523*cdf0e10cSrcweir 
524*cdf0e10cSrcweir     [Querverweise]
525*cdf0e10cSrcweir 
526*cdf0e10cSrcweir     enum <SfxMacroMode>
527*cdf0e10cSrcweir */
528*cdf0e10cSrcweir 
529*cdf0e10cSrcweir {
530*cdf0e10cSrcweir     return pImp->eMode;
531*cdf0e10cSrcweir }
532*cdf0e10cSrcweir 
533*cdf0e10cSrcweir //--------------------------------------------------------------------
534*cdf0e10cSrcweir 
535*cdf0e10cSrcweir void SfxMacro::Record
536*cdf0e10cSrcweir (
537*cdf0e10cSrcweir     SfxMacroStatement*  pStatement  // aufzuzeichnendes <SfxMacroStatement>
538*cdf0e10cSrcweir )
539*cdf0e10cSrcweir 
540*cdf0e10cSrcweir /*  [Beschreibung]
541*cdf0e10cSrcweir 
542*cdf0e10cSrcweir     Diese Methode zeichnet das als Parameter "ubergeben Statement auf.
543*cdf0e10cSrcweir     Die Instanz auf die der "ubergebe Pointer zeigt, geht in das Eigentum
544*cdf0e10cSrcweir     des SfxMacro "uber.
545*cdf0e10cSrcweir 
546*cdf0e10cSrcweir     Der Aufruf ist nur g"ultig, wenn es sich um ein SfxMacro handelt,
547*cdf0e10cSrcweir     welches mit SFX_MACRO_RECORDINGABSOLUTE oder SFX_MACRO_RECORDINGRELATIVE
548*cdf0e10cSrcweir     konstruiert wirde.
549*cdf0e10cSrcweir 
550*cdf0e10cSrcweir 
551*cdf0e10cSrcweir     [Querverweise]
552*cdf0e10cSrcweir 
553*cdf0e10cSrcweir     <SfxMacro::Replace(SfxMacroStatement*)>
554*cdf0e10cSrcweir     <SfxMacro::Remove()>
555*cdf0e10cSrcweir     <SfxMacro::GetLastStatement()const>
556*cdf0e10cSrcweir */
557*cdf0e10cSrcweir 
558*cdf0e10cSrcweir {
559*cdf0e10cSrcweir     DBG_ASSERT( pImp->eMode != SFX_MACRO_EXISTING, "invalid call to non-recording SfxMacro" );
560*cdf0e10cSrcweir     pImp->aList.C40_INSERT( SfxMacroStatement, pStatement, pImp->aList.Count() );
561*cdf0e10cSrcweir }
562*cdf0e10cSrcweir 
563*cdf0e10cSrcweir //--------------------------------------------------------------------
564*cdf0e10cSrcweir 
565*cdf0e10cSrcweir void SfxMacro::Replace
566*cdf0e10cSrcweir (
567*cdf0e10cSrcweir     SfxMacroStatement*  pStatement  // aufzuzeichnendes <SfxMacroStatement>
568*cdf0e10cSrcweir )
569*cdf0e10cSrcweir 
570*cdf0e10cSrcweir /*  [Beschreibung]
571*cdf0e10cSrcweir 
572*cdf0e10cSrcweir     Diese Methode zeichnet das als Parameter "ubergeben Statement auf.
573*cdf0e10cSrcweir     Dabei wird das jeweils zuletzt aufgezeichnete Statement "uberschrieben.
574*cdf0e10cSrcweir     Die Instanz auf die der "ubergebe Pointer zeigt, geht in das Eigentum
575*cdf0e10cSrcweir     des SfxMacro "uber.
576*cdf0e10cSrcweir 
577*cdf0e10cSrcweir     Mit dieser Methode ist es m"oglich, Statements zusammenzufassen. Z.B.
578*cdf0e10cSrcweir     anstelle f"unfmal hintereinander 'CursorLeft()' aufzurufen, k"onnte
579*cdf0e10cSrcweir     das zu 'CursorLeft(5)' zusammengefa\st werden. Oder anstelle ein Wort
580*cdf0e10cSrcweir     Buchstabe f"ur Buchstabe aufzubauen, k"onnte dies durch ein einziges
581*cdf0e10cSrcweir     Statement 'InsertString("Hallo")' ersetzt werden.
582*cdf0e10cSrcweir 
583*cdf0e10cSrcweir     Der Aufruf ist nur g"ultig, wenn es sich um ein SfxMacro handelt,
584*cdf0e10cSrcweir     welches mit SFX_MACRO_RECORDINGABSOLUTE oder SFX_MACRO_RECORDINGRELATIVE
585*cdf0e10cSrcweir     konstruiert wurde und bereits ein aufgezeichnetes Statement vorhanden
586*cdf0e10cSrcweir     ist.
587*cdf0e10cSrcweir 
588*cdf0e10cSrcweir 
589*cdf0e10cSrcweir     [Anmerkung]
590*cdf0e10cSrcweir 
591*cdf0e10cSrcweir     Diese Methode wird typischerweise aus den Execute-Methoden der
592*cdf0e10cSrcweir     <SfxSlot>s von den Applikationsentwicklern gerufen.
593*cdf0e10cSrcweir 
594*cdf0e10cSrcweir 
595*cdf0e10cSrcweir     [Querverweise]
596*cdf0e10cSrcweir 
597*cdf0e10cSrcweir     <SfxMacro::Record(SfxMacroStatement*)>
598*cdf0e10cSrcweir     <SfxMacro::Remove()>
599*cdf0e10cSrcweir     <SfxMacro::GetLastStatement()const>
600*cdf0e10cSrcweir */
601*cdf0e10cSrcweir 
602*cdf0e10cSrcweir {
603*cdf0e10cSrcweir     DBG_ASSERT( pImp->eMode != SFX_MACRO_EXISTING, "invalid call to non-recording SfxMacro" );
604*cdf0e10cSrcweir     DBG_ASSERT( pImp->aList.Count(), "no replaceable statement available" );
605*cdf0e10cSrcweir     pImp->aList.Remove( pImp->aList.Count() - 1 );
606*cdf0e10cSrcweir     pImp->aList.C40_INSERT( SfxMacroStatement,pStatement, pImp->aList.Count() );
607*cdf0e10cSrcweir }
608*cdf0e10cSrcweir 
609*cdf0e10cSrcweir //--------------------------------------------------------------------
610*cdf0e10cSrcweir 
611*cdf0e10cSrcweir void SfxMacro::Remove()
612*cdf0e10cSrcweir 
613*cdf0e10cSrcweir /*  [Beschreibung]
614*cdf0e10cSrcweir 
615*cdf0e10cSrcweir     Diese Methode l"oscht das zuletzt aufgezeichnete <SfxMacroStatement>
616*cdf0e10cSrcweir     und entfernt es aus dem Macro.
617*cdf0e10cSrcweir 
618*cdf0e10cSrcweir     Mit dieser Methode ist es m"oglich, Statements zusammenzufassen. Z.B.
619*cdf0e10cSrcweir     anstelle f"unfmal hintereinander 'CursorLeft()' aufzurufen, k"onnte
620*cdf0e10cSrcweir     das zu 'CursorLeft(5)' zusammengefa\st werden. Oder anstelle ein Wort
621*cdf0e10cSrcweir     Buchstabe f"ur Buchstabe aufzubauen, k"onnte dies durch ein einziges
622*cdf0e10cSrcweir     Statement 'InsertString("Hallo")' ersetzt werden.
623*cdf0e10cSrcweir 
624*cdf0e10cSrcweir     Der Aufruf ist nur g"ultig, wenn es sich um ein SfxMacro handelt,
625*cdf0e10cSrcweir     welches mit SFX_MACRO_RECORDINGABSOLUTE oder SFX_MACRO_RECORDINGRELATIVE
626*cdf0e10cSrcweir     konstruiert wurde und bereits ein aufgezeichnetes Statement vorhanden
627*cdf0e10cSrcweir     ist.
628*cdf0e10cSrcweir 
629*cdf0e10cSrcweir 
630*cdf0e10cSrcweir     [Anmerkung]
631*cdf0e10cSrcweir 
632*cdf0e10cSrcweir     Diese Methode wird typischerweise aus den Execute-Methoden der
633*cdf0e10cSrcweir     <SfxSlot>s von den Applikationsentwicklern gerufen.
634*cdf0e10cSrcweir 
635*cdf0e10cSrcweir 
636*cdf0e10cSrcweir     [Querverweise]
637*cdf0e10cSrcweir 
638*cdf0e10cSrcweir     <SfxMacro::Replace(SfxMacroStatement*)>
639*cdf0e10cSrcweir     <SfxMacro::Record(SfxMacroStatement*)>
640*cdf0e10cSrcweir     <SfxMacro::GetLastStatement()const>
641*cdf0e10cSrcweir */
642*cdf0e10cSrcweir 
643*cdf0e10cSrcweir {
644*cdf0e10cSrcweir     DBG_ASSERT( pImp->eMode != SFX_MACRO_EXISTING, "invalid call to non-recording SfxMacro" );
645*cdf0e10cSrcweir     DBG_ASSERT( pImp->aList.Count(), "no replaceable statement available" );
646*cdf0e10cSrcweir     pImp->aList.Remove( pImp->aList.Count() - 1 );
647*cdf0e10cSrcweir }
648*cdf0e10cSrcweir 
649*cdf0e10cSrcweir //--------------------------------------------------------------------
650*cdf0e10cSrcweir 
651*cdf0e10cSrcweir const SfxMacroStatement* SfxMacro::GetLastStatement() const
652*cdf0e10cSrcweir 
653*cdf0e10cSrcweir /*  [Beschreibung]
654*cdf0e10cSrcweir 
655*cdf0e10cSrcweir     Mit dieser Methode kann auf das jeweils zuletzt aufgezeichnete Statement
656*cdf0e10cSrcweir     lesend zugegriffen werden. Zusammen mit der Methode
657*cdf0e10cSrcweir     <SfxMacro::Replace(SfxMacroStatement*)> ergibt sich dadurch die
658*cdf0e10cSrcweir     M"oglichkeit, Statements zusammenzufassen.
659*cdf0e10cSrcweir 
660*cdf0e10cSrcweir     Der Aufruf ist nur g"ultig, wenn es sich um ein SfxMacro handelt,
661*cdf0e10cSrcweir     welches mit SFX_MACRO_RECORDINGABSOLUTE oder SFX_MACRO_RECORDINGRELATIVE
662*cdf0e10cSrcweir     konstruiert wurde.
663*cdf0e10cSrcweir 
664*cdf0e10cSrcweir 
665*cdf0e10cSrcweir     [Querverweise]
666*cdf0e10cSrcweir 
667*cdf0e10cSrcweir     <SfxMacro::Record(SfxMacroStatement*)>
668*cdf0e10cSrcweir     <SfxMacro::Replace(SfxMacroStatement*)>
669*cdf0e10cSrcweir */
670*cdf0e10cSrcweir 
671*cdf0e10cSrcweir {
672*cdf0e10cSrcweir     DBG_ASSERT( pImp->eMode != SFX_MACRO_EXISTING, "invalid call to non-recording SfxMacro" );
673*cdf0e10cSrcweir     if ( pImp->aList.Count() )
674*cdf0e10cSrcweir         return pImp->aList.GetObject( pImp->aList.Count() - 1 );
675*cdf0e10cSrcweir     return 0;
676*cdf0e10cSrcweir }
677*cdf0e10cSrcweir 
678*cdf0e10cSrcweir //--------------------------------------------------------------------
679*cdf0e10cSrcweir 
680*cdf0e10cSrcweir String SfxMacro::GenerateSource() const
681*cdf0e10cSrcweir 
682*cdf0e10cSrcweir /*  [Beschreibung]
683*cdf0e10cSrcweir 
684*cdf0e10cSrcweir     Diese Funktion generiert aus den, seit dem Konstruieren der Instanz
685*cdf0e10cSrcweir     bis zum Zeitpunkt des Aufrufs dieser Methode aufgezeichneten
686*cdf0e10cSrcweir     <SfxMacroStatement>s einen BASIC-Sourcecode, der die Statements,
687*cdf0e10cSrcweir     jedoch nicht den Header ('Sub X') und den Footer ('End Sub') enth"alt.
688*cdf0e10cSrcweir 
689*cdf0e10cSrcweir 
690*cdf0e10cSrcweir     [Querverweise]
691*cdf0e10cSrcweir 
692*cdf0e10cSrcweir     <SfxMacro::Record(SfxMacroStatement*)>
693*cdf0e10cSrcweir     <SfxMacro::Repeat(SfxMacroStatement*)>
694*cdf0e10cSrcweir */
695*cdf0e10cSrcweir 
696*cdf0e10cSrcweir {
697*cdf0e10cSrcweir     DBG_ASSERT( pImp->eMode != SFX_MACRO_EXISTING, "invalid call to non-recording SfxMacro" );
698*cdf0e10cSrcweir     String aSource;
699*cdf0e10cSrcweir     for ( sal_uInt16 n = 0; n < pImp->aList.Count(); ++n )
700*cdf0e10cSrcweir     {
701*cdf0e10cSrcweir         aSource += pImp->aList.GetObject(n)->GetStatement();
702*cdf0e10cSrcweir         if ( (n+1) < pImp->aList.Count() )
703*cdf0e10cSrcweir             aSource += DEFINE_CONST_UNICODE("\n");
704*cdf0e10cSrcweir     }
705*cdf0e10cSrcweir 
706*cdf0e10cSrcweir     return aSource;
707*cdf0e10cSrcweir }
708*cdf0e10cSrcweir 
709