/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/

#ifndef _SFXMACRO_HXX
#define _SFXMACRO_HXX

//====================================================================
#include <com/sun/star/beans/PropertyValue.hpp>
#include <com/sun/star/uno/Sequence.hxx>

#include <tools/string.hxx>

class SfxSlot;
class SfxShell;
struct SfxMacro_Impl;
class SfxMacro;

//====================================================================

class SfxMacroStatement
{
	sal_uInt16				nSlotId;	// ausgef"uhrte Slot-Id oder 0, wenn manuell
    ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue > aArgs;      // aktuelle Parameter, falls nSlotId != 0
	String				aStatement; // Statement in BASIC-Syntax (ggf. mit CR/LF)
	sal_Bool				bDone;  	// auskommentieren wenn kein Done() gerufen
	void*				pDummy;		// f"ur alle F"alle zum kompatibel bleiben

#ifdef _SFXMACRO_HXX
private:
	void				GenerateNameAndArgs_Impl( SfxMacro *pMacro,
												  const SfxSlot &rSlot,
												  sal_Bool bRequestDone,
                                                  ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >& aArgs );
#endif

public:
						SfxMacroStatement( const SfxMacroStatement &rOrig );

						SfxMacroStatement( const String &rTarget,
										   const SfxSlot &rSlot,
										   sal_Bool bRequestDone,
                                           ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >& aArgs );

						SfxMacroStatement( const SfxShell &rShell,
										   const String &rTarget,
										   sal_Bool bAbsolute,
										   const SfxSlot &rSlot,
										   sal_Bool bRequestDone,
                                           ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >& aArgs );

						SfxMacroStatement( const String &rStatment );
						~SfxMacroStatement();

	sal_uInt16				GetSlotId() const;
    const ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >& GetArgs() const;
	sal_Bool				IsDone() const;
	const String&		GetStatement() const;
};

//--------------------------------------------------------------------

inline sal_uInt16 SfxMacroStatement::GetSlotId() const

/*  [Beschreibung]

	Liefert die Slot-Id die das Statement beim Abspielen wieder ausf"uhren
	soll oder 0, falls das Statement manuell (<SFX_SLOT_RECORDMANUAL>)
	aufgezeichnet wurde.
*/

{
	return nSlotId;
}

//--------------------------------------------------------------------

inline const ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >& SfxMacroStatement::GetArgs() const

/*  [Beschreibung]

	Liefert die Parameter mit denen Statement ausgef"uhrt wurde oder 0,
	falls das Statement	manuell (<SFX_SLOT_RECORDMANUAL>) aufgezeichnet
	wurde.

	Der R"uckgabewert geh"ort dem SfxMacroStatement und ist nur im
	unmittelbar aufrufenden Stackframe g"ultig.
*/

{
    return aArgs;
}

//--------------------------------------------------------------------

inline sal_Bool	SfxMacroStatement::IsDone() const

/*  [Beschreibung]

	Liefert TRUE, wenn das Statement wirklich ausgef"uhrt wurde,
	also z.B. nicht vom Benutzer abgebrochen wurde. Wurde es nicht
	wirklich ausgef"uhrt, dann wird es im BASIC-Source auskommentiert.
*/

{
	return bDone;
}

//--------------------------------------------------------------------

/*  [Beschreibung]

	Liefert das Statement in BASIC-Syntax. Wurde das Makro manuell erzeugt,
	wird genau der im Konstruktor angegebene String zur"uckgegeben, sonst
	der generierte Source-Code.

	Bei beiden Arten ist es m"oglich, da\s mehrere BASIC-Statements, jeweils
	mit CR/LF getrennt in dem String enthalten sind, da ein SFx-Statement
	ggf. in mehrere BASIC-Statements "ubersetzt wird.

	Statements f"ur die nicht <SfxRequest::Done()> gerufen wurde, werden
	mit einem vorangestellten 'rem' gekennzeichnet.
*/

inline const String& SfxMacroStatement::GetStatement() const
{
	return aStatement;
}

//====================================================================

enum SfxMacroMode

/*	[Beschreibung]

	Mit diesem enum wird bestimmt, ob eine <SfxMacro>-Instanz zum
	absoluten oder relativen Recorden erzeugt wurde, oder um ein
	existierendendes Makro zu Referenzieren.
*/

{
	SFX_MACRO_EXISTING,			/*	es handelt sich um ein bereits
									exitistierendes Makro, welches lediglich
									referenziert wird */

	SFX_MACRO_RECORDINGABSOLUTE,/*	dieses Makro soll aufgezeichnet werden,
									wobei die betroffenen Objekte m"oglichst
									direkt angesprochen werden sollen
									(Beispiel: "[doc.sdc]") */

	SFX_MACRO_RECORDINGRELATIVE/*   dieses Makro soll aufgezeichnet werden,
									wobei die betroffenen Objekte so
									angesprochen werden sollen, da\s sich das
									Abspielen auf die dann g"ultige Selektion
									bezieht (Beispiel: "ActiveDocument()") */
};

//====================================================================

class SfxMacro

/*	[Beschreibung]

	"Uber diese Klasse (bzw. genaugenommen ihre Subklassen) wird zum
	einen die Lokation einer BASIC-Funktion (also in welcher Library,
	in welchem Modul sowie der Funktions-Name) beschrieben, als auch
	ein aufzuzeichnendes Makro w"ahrend der Aufzeichnung zwischen-
	gespeichert.
*/

{
	SfxMacro_Impl*			pImp;

public:
                            SfxMacro( SfxMacroMode eMode = SFX_MACRO_RECORDINGRELATIVE );
	virtual 				~SfxMacro();

	SfxMacroMode			GetMode() const;
	void					Record( SfxMacroStatement *pStatement );
	void					Replace( SfxMacroStatement *pStatement );
	void					Remove();
	const SfxMacroStatement*GetLastStatement() const;

	String					GenerateSource() const;
};

#endif
