xref: /aoo42x/main/sfx2/source/control/macro.cxx (revision cdf0e10c)
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