/**************************************************************
 * 
 * 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 SW_DBFLD_HXX
#define SW_DBFLD_HXX

#include "swdllapi.h"
#include "fldbas.hxx"
#include "swdbdata.hxx"

class SwDoc;
class SwTxtFld;
class SwFrm;

/*--------------------------------------------------------------------
	Beschreibung: Datenbankfeld
 --------------------------------------------------------------------*/

class SW_DLLPUBLIC SwDBFieldType : public SwValueFieldType
{
	SwDBData 	aDBData;		//
	String 		sName;			// only used in ::GetName() !
	String 		sColumn;
	long   		nRefCnt;

public:

	SwDBFieldType(SwDoc* pDocPtr, const String& rColumnName, const SwDBData& rDBData);
    ~SwDBFieldType();

	virtual const String& GetName() const;
	virtual SwFieldType*  Copy() const;

	inline void		AddRef() { nRefCnt++; }
	void			ReleaseRef();

	const String&	GetColumnName()	const {return sColumn;}
	const SwDBData&	GetDBData()	const {return aDBData;}

    virtual sal_Bool        QueryValue( com::sun::star::uno::Any& rVal, sal_uInt16 nWhich ) const;
    virtual sal_Bool        PutValue( const com::sun::star::uno::Any& rVal, sal_uInt16 nWhich );
};

/*--------------------------------------------------------------------
	Beschreibung:
	von SwFields abgeleitete Klassen. Sie ueberlagern die Expand-Funktion.
	Der Inhalt wird entsprechend dem Format, soweit vorhanden, formatiert.
 --------------------------------------------------------------------*/

class SW_DLLPUBLIC SwDBField : public SwValueField
{
	String  aContent;
    String  sFieldCode; // contains Word's field code
	sal_uInt16	nSubType;
	sal_Bool 	bIsInBodyTxt	: 1;
	sal_Bool	bValidValue		: 1;
	sal_Bool	bInitialized	: 1;

    virtual String      Expand() const;
    virtual SwField*    Copy() const;

public:
	SwDBField(SwDBFieldType*, sal_uLong nFmt = 0);
	virtual ~SwDBField();

	virtual SwFieldType*	ChgTyp( SwFieldType* );

	// Der aktuelle Text
	inline  void		SetExpansion(const String& rStr);

	virtual sal_uInt16		GetSubType() const;
	virtual void		SetSubType(sal_uInt16 nType);

    virtual String      GetFieldName() const;

	// fuer Berechnungen in Ausdruecken
	void 				ChgValue( double d, sal_Bool bVal );

	// Evaluierung ueber den DBMgr String rauspulen
	void				Evaluate();

	// Evaluierung fuer Kopf und Fusszeilen
	void 			    ChangeExpansion( const SwFrm*, const SwTxtFld* );
	void				InitContent();
	void				InitContent(const String& rExpansion);

	inline void 		ChgBodyTxtFlag( sal_Bool bIsInBody );

	inline sal_Bool 		IsInitialized() const	{ return bInitialized; }
	inline void			ClearInitialized()		{ bInitialized = sal_False; }
	inline void			SetInitialized()		{ bInitialized = sal_True; }

	// Name erfragen
	virtual const String& GetPar1() const;

    // access to the command string
    const String&       GetFieldCode()   const
                        { return sFieldCode;}
    void                SetFieldCode(const String& rStr)
                        { sFieldCode = rStr; }

	// DBName
	inline const SwDBData& 	GetDBData() const { return ((SwDBFieldType*)GetTyp())->GetDBData(); }
    virtual sal_Bool        QueryValue( com::sun::star::uno::Any& rVal, sal_uInt16 nWhich ) const;
    virtual sal_Bool        PutValue( const com::sun::star::uno::Any& rVal, sal_uInt16 nWhich );
};

inline  void SwDBField::SetExpansion(const String& rStr)
	{ aContent = rStr; }

// wird von UpdateExpFlds gesetzt (dort ist die Node-Position bekannt)
inline void SwDBField::ChgBodyTxtFlag( sal_Bool bIsInBody )
	{ bIsInBodyTxt = bIsInBody; }

/*--------------------------------------------------------------------
	Beschreibung: Basisklasse fuer alle weiteren Datenbankfelder
 --------------------------------------------------------------------*/

class SW_DLLPUBLIC SwDBNameInfField : public SwField
{
	SwDBData 	aDBData;
    sal_uInt16      nSubType;

protected:
	const SwDBData& GetDBData() const {return aDBData;}
	SwDBData& 		GetDBData() {return aDBData;}

	SwDBNameInfField(SwFieldType* pTyp, const SwDBData& rDBData, sal_uLong nFmt = 0);

public:
	// DBName
	inline const SwDBData&	GetRealDBData() { return aDBData; }

	SwDBData				GetDBData(SwDoc* pDoc);
	void				    SetDBData(const SwDBData& rDBData); // #111840#

    virtual String          GetFieldName() const;

    virtual sal_Bool            QueryValue( com::sun::star::uno::Any& rVal, sal_uInt16 nWhich ) const;
    virtual sal_Bool            PutValue( const com::sun::star::uno::Any& rVal, sal_uInt16 nWhich );
    virtual sal_uInt16          GetSubType() const;
    virtual void            SetSubType(sal_uInt16 nType);
};


/*--------------------------------------------------------------------
	Beschreibung: Datenbankfeld Naechster Satz
 --------------------------------------------------------------------*/

class SW_DLLPUBLIC SwDBNextSetFieldType : public SwFieldType
{
public:
	SwDBNextSetFieldType();

	virtual SwFieldType* 	Copy() const;
};


/*--------------------------------------------------------------------
	Beschreibung: Naechsten Datensatz mit Bedingung
 --------------------------------------------------------------------*/

class SW_DLLPUBLIC SwDBNextSetField : public SwDBNameInfField
{
	String 	aCond;
	sal_Bool	bCondValid;

public:
	SwDBNextSetField( SwDBNextSetFieldType*,
					  const String& rCond, const String& rDummy, const SwDBData& rDBData);

	virtual String 			Expand() const;
	virtual SwField*		Copy() const;

	void					Evaluate(SwDoc*);
	inline void				SetCondValid(sal_Bool bCond);
	inline sal_Bool				IsCondValid() const;

	// Condition
	virtual const String&	GetPar1() const;
	virtual void	   		SetPar1(const String& rStr);
    virtual sal_Bool        QueryValue( com::sun::star::uno::Any& rVal, sal_uInt16 nWhich ) const;
    virtual sal_Bool        PutValue( const com::sun::star::uno::Any& rVal, sal_uInt16 nWhich );
};

inline sal_Bool	SwDBNextSetField::IsCondValid() const
	{ return bCondValid; }

inline void	SwDBNextSetField::SetCondValid(sal_Bool bCond)
	{ bCondValid = bCond; }

/*--------------------------------------------------------------------
	Beschreibung: Datenbankfeld Naechster Satz
 --------------------------------------------------------------------*/

class SwDBNumSetFieldType : public SwFieldType
{
public:
	SwDBNumSetFieldType();

	virtual SwFieldType*	Copy() const;
};


/*--------------------------------------------------------------------
	Beschreibung: Datensatz mit Nummer xxx
				  Die Nummer steht in nFormat
				  ! kleiner Missbrauch
 --------------------------------------------------------------------*/

class SwDBNumSetField : public SwDBNameInfField
{
	String 	aCond;
	String 	aPar2;
	sal_Bool 	bCondValid;

public:
	SwDBNumSetField(SwDBNumSetFieldType*, const String& rCond, const String& rDBNum, const SwDBData& rDBData);

	virtual String 			Expand() const;
	virtual SwField*		Copy() const;

	inline sal_Bool				IsCondValid() const;
	inline void				SetCondValid(sal_Bool bCond);
	void					Evaluate(SwDoc*);

	// Condition
	virtual const String&	GetPar1() const;
	virtual void	   		SetPar1(const String& rStr);

	// Datensatznummer
	virtual String			GetPar2() 	const;
	virtual void			SetPar2(const String& rStr);

	// Die Datensatznummer steht in nFormat !!
    virtual sal_Bool        QueryValue( com::sun::star::uno::Any& rVal, sal_uInt16 nWhich ) const;
    virtual sal_Bool        PutValue( const com::sun::star::uno::Any& rVal, sal_uInt16 nWhich );
};

inline sal_Bool	SwDBNumSetField::IsCondValid() const
	{ return bCondValid; }

inline void	SwDBNumSetField::SetCondValid(sal_Bool bCond)
	{ bCondValid = bCond; }

/*--------------------------------------------------------------------
	Beschreibung: Datenbankname
 --------------------------------------------------------------------*/

class SwDBNameFieldType : public SwFieldType
{
		SwDoc *pDoc;
public:
	SwDBNameFieldType(SwDoc*);

	String 					Expand(sal_uLong) const;
	virtual SwFieldType*    Copy() const;
};

/*--------------------------------------------------------------------
	Beschreibung: Datenbankfeld
 --------------------------------------------------------------------*/

class SW_DLLPUBLIC SwDBNameField : public SwDBNameInfField
{
public:
	SwDBNameField(SwDBNameFieldType*, const SwDBData& rDBData, sal_uLong nFmt = 0);

	virtual String	 Expand() const;
	virtual SwField* Copy() const;
    virtual sal_Bool        QueryValue( com::sun::star::uno::Any& rVal, sal_uInt16 nWhich ) const;
    virtual sal_Bool        PutValue( const com::sun::star::uno::Any& rVal, sal_uInt16 nWhich );
};

/*--------------------------------------------------------------------
	Beschreibung: Datensatznummer
 --------------------------------------------------------------------*/

class SW_DLLPUBLIC SwDBSetNumberFieldType : public SwFieldType
{
public:
	SwDBSetNumberFieldType();

	virtual SwFieldType*    Copy() const;
};

/*--------------------------------------------------------------------
	Beschreibung: Datenbankfeld
 --------------------------------------------------------------------*/

class SW_DLLPUBLIC SwDBSetNumberField : public SwDBNameInfField
{
	long	nNumber;

public:
	SwDBSetNumberField(SwDBSetNumberFieldType*, const SwDBData& rDBData, sal_uLong nFmt = 0);

	virtual String	Expand() const;
	virtual 		SwField* Copy() const;
	void			Evaluate(SwDoc*);

	inline long		GetSetNumber() const;
	inline void		SetSetNumber(long nNum);
    virtual sal_Bool        QueryValue( com::sun::star::uno::Any& rVal, sal_uInt16 nWhich ) const;
    virtual sal_Bool        PutValue( const com::sun::star::uno::Any& rVal, sal_uInt16 nWhich );
};

inline long	SwDBSetNumberField::GetSetNumber() const
	{ return nNumber; }

inline void	SwDBSetNumberField::SetSetNumber(long nNum)
	{ nNumber = nNum; }


#endif // SW_DBFLD_HXX
