blob: ed866318146e9dfeeeacd4ba279a7a67d2c8c441 [file] [log] [blame]
/**************************************************************
*
* 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_EXPFLD_HXX
#define SW_EXPFLD_HXX
#include <svl/svarray.hxx>
#include "swdllapi.h"
#include <fldbas.hxx>
#include <cellfml.hxx>
class SfxPoolItem;
class SwTxtNode;
class SwFrm;
struct SwPosition;
class SwTxtFld;
class SwDoc;
class SwFmtFld;
class _SetGetExpFlds;
class SwEditShell;
// Vorwaertsdeklaration: besorge den "Body-TextNode", fuer Exp.Fld in Fly's
// Header/Footers/Footnodes
const SwTxtNode* GetBodyTxtNode( const SwDoc& pDoc, SwPosition& rPos,
const SwFrm& rFrm );
// Wandlung Address -> Adressen
void ReplacePoint(String& sTmpName, sal_Bool bWithCommandType = sal_False);
struct _SeqFldLstElem
{
String sDlgEntry;
sal_uInt16 nSeqNo;
_SeqFldLstElem( const String& rStr, sal_uInt16 nNo )
: sDlgEntry( rStr ), nSeqNo( nNo )
{}
};
SV_DECL_PTRARR_DEL( _SwSeqFldList, _SeqFldLstElem*, 10, 10 )
class SW_DLLPUBLIC SwSeqFldList : public _SwSeqFldList
{
public:
SwSeqFldList() : _SwSeqFldList( 10, 10 ) {}
sal_Bool InsertSort( _SeqFldLstElem* );
sal_Bool SeekEntry( const _SeqFldLstElem& , sal_uInt16* pPos = 0 );
};
/*--------------------------------------------------------------------
Beschreibung: Ausdruck
--------------------------------------------------------------------*/
class SwGetExpFieldType : public SwValueFieldType
{
public:
SwGetExpFieldType(SwDoc* pDoc);
virtual SwFieldType* Copy() const;
// ueberlagert, weil das Get-Field nicht veraendert werden kann
// und dann auch nicht aktualisiert werden muss. Aktualisierung
// erfolgt beim Aendern von Set-Werten !
protected:
virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew );
};
/*--------------------------------------------------------------------
Beschreibung: GetExperession
--------------------------------------------------------------------*/
class SW_DLLPUBLIC SwGetExpField : public SwFormulaField
{
String sExpand;
sal_Bool bIsInBodyTxt;
sal_uInt16 nSubType;
bool bLateInitialization; // #i82544#
virtual String Expand() const;
virtual SwField* Copy() const;
public:
SwGetExpField( SwGetExpFieldType*, const String& rFormel,
sal_uInt16 nSubType = nsSwGetSetExpType::GSE_EXPR, sal_uLong nFmt = 0);
virtual void SetValue( const double& rVal );
virtual void SetLanguage(sal_uInt16 nLng);
inline const String& GetExpStr() const;
inline void ChgExpStr(const String& rExpand);
// wird von der Formatierung abgefragt
inline sal_Bool IsInBodyTxt() const;
// wird von UpdateExpFlds gesetzt (dort ist die Node-Position bekannt)
inline void ChgBodyTxtFlag( sal_Bool bIsInBody );
// fuer Felder in Header/Footer/Footnotes/Flys:
// (wird nur von der Formatierung aufgerufen!!)
void ChangeExpansion( const SwFrm&, const SwTxtFld& );
virtual String GetFieldName() const;
// Die Formel aendern
virtual String GetPar2() const;
virtual void SetPar2(const String& rStr);
virtual sal_uInt16 GetSubType() const;
virtual void SetSubType(sal_uInt16 nType);
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 );
static sal_uInt16 GetReferenceTextPos( const SwFmtFld& rFmt, SwDoc& rDoc);
// #i82544#
void SetLateInitialization() { bLateInitialization = true;}
};
inline void SwGetExpField::ChgExpStr(const String& rExpand)
{ sExpand = rExpand;}
inline const String& SwGetExpField::GetExpStr() const
{ return sExpand; }
// wird von der Formatierung abgefragt
inline sal_Bool SwGetExpField::IsInBodyTxt() const
{ return bIsInBodyTxt; }
// wird von UpdateExpFlds gesetzt (dort ist die Node-Position bekannt)
inline void SwGetExpField::ChgBodyTxtFlag( sal_Bool bIsInBody )
{ bIsInBodyTxt = bIsInBody; }
/*--------------------------------------------------------------------
Beschreibung: Ausdruck setzen
--------------------------------------------------------------------*/
class SwSetExpField;
class SW_DLLPUBLIC SwSetExpFieldType : public SwValueFieldType
{
String sName;
const SwNode* pOutlChgNd;
String sDelim;
sal_uInt16 nType;
sal_uInt8 nLevel;
sal_Bool bDeleted;
protected:
virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew );
public:
SwSetExpFieldType( SwDoc* pDoc, const String& rName,
sal_uInt16 nType = nsSwGetSetExpType::GSE_EXPR );
virtual SwFieldType* Copy() const;
virtual const String& GetName() const;
inline void SetType(sal_uInt16 nTyp);
inline sal_uInt16 GetType() const;
void SetSeqFormat(sal_uLong nFormat);
sal_uLong GetSeqFormat();
sal_Bool IsDeleted() const { return bDeleted; }
void SetDeleted( sal_Bool b ) { bDeleted = b; }
// ueberlagert, weil das Set-Field selbst dafuer sorgt, das
// es aktualisiert wird.
inline const String& GetSetRefName() const;
sal_uInt16 SetSeqRefNo( SwSetExpField& rFld );
sal_uInt16 GetSeqFldList( SwSeqFldList& rList );
String MakeSeqName( sal_uInt16 nSeqNo );
// Seqencefelder ggfs. Kapitelweise numerieren
// sal_Unicode GetDelimiter() const { return cDelim; }
// void SetDelimiter( sal_Unicode c ) { cDelim = c; }
const String& GetDelimiter() const { return sDelim; }
void SetDelimiter( const String& s ) { sDelim = s; }
sal_uInt8 GetOutlineLvl() const { return nLevel; }
void SetOutlineLvl( sal_uInt8 n ) { nLevel = n; }
void SetChapter( SwSetExpField& rFld, const SwNode& rNd );
// Member nur fuers SwDoc::UpdateExpFld - wird nur waehrend der Laufzeit
// von SequencefeldTypen benoetigt!!!
const SwNode* GetOutlineChgNd() const { return pOutlChgNd; }
void SetOutlineChgNd( const SwNode* p ) { pOutlChgNd = p; }
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 SwSetExpFieldType::SetType( sal_uInt16 nTyp )
{
nType = nTyp;
EnableFormat( !(nType & (nsSwGetSetExpType::GSE_SEQ|nsSwGetSetExpType::GSE_STRING)));
}
inline sal_uInt16 SwSetExpFieldType::GetType() const
{ return nType; }
inline const String& SwSetExpFieldType::GetSetRefName() const
{ return sName; }
/*--------------------------------------------------------------------
Beschreibung: Ausdruck
--------------------------------------------------------------------*/
class SW_DLLPUBLIC SwSetExpField : public SwFormulaField
{
String sExpand;
String aPText;
String aSeqText;
sal_Bool bInput;
sal_uInt16 nSeqNo;
sal_uInt16 nSubType;
virtual String Expand() const;
virtual SwField* Copy() const;
public:
SwSetExpField(SwSetExpFieldType*, const String& rFormel, sal_uLong nFmt = 0);
virtual void SetValue( const double& rVal );
inline const String& GetExpStr() const;
inline void ChgExpStr( const String& rExpand );
inline void SetPromptText(const String& rStr);
inline const String& GetPromptText() const;
inline void SetInputFlag(sal_Bool bInp);
inline sal_Bool GetInputFlag() const;
virtual String GetFieldName() const;
virtual sal_uInt16 GetSubType() const;
virtual void SetSubType(sal_uInt16 nType);
inline sal_Bool IsSequenceFld() const;
// fuer SequenceFelder - logische Nummer
inline void SetSeqNumber( sal_uInt16 n ) { nSeqNo = n; }
inline sal_uInt16 GetSeqNumber() const { return nSeqNo; }
// Der Name nur erfragen
virtual const String& GetPar1() const;
// Die Formel
virtual String GetPar2() const;
virtual void SetPar2(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 const String& SwSetExpField::GetExpStr() const
{ return sExpand; }
inline void SwSetExpField::ChgExpStr( const String& rExpand )
{ sExpand = rExpand; }
inline void SwSetExpField::SetPromptText(const String& rStr)
{ aPText = rStr; }
inline const String& SwSetExpField::GetPromptText() const
{ return aPText; }
inline void SwSetExpField::SetInputFlag(sal_Bool bInp)
{ bInput = bInp; }
inline sal_Bool SwSetExpField::GetInputFlag() const
{ return bInput; }
inline sal_Bool SwSetExpField::IsSequenceFld() const
{ return 0 != (nsSwGetSetExpType::GSE_SEQ & ((SwSetExpFieldType*)GetTyp())->GetType()); }
/*--------------------------------------------------------------------
Beschreibung: Eingabe im Text/Variable setzen
--------------------------------------------------------------------*/
class SwInputFieldType : public SwFieldType
{
SwDoc* pDoc;
public:
SwInputFieldType( SwDoc* pDoc );
virtual SwFieldType* Copy() const;
SwDoc* GetDoc() const { return pDoc; }
};
/*--------------------------------------------------------------------
Beschreibung: Eingabefeld
--------------------------------------------------------------------*/
class SW_DLLPUBLIC SwInputField : public SwField
{
mutable String aContent;
String aPText;
String aHelp;
String aToolTip;
sal_uInt16 nSubType;
bool mbIsFormField;
SwFmtFld* mpFmtFld; // attribute to which the <SwInputField> belongs to
virtual String Expand() const;
virtual SwField* Copy() const;
// Accessing Input Field's content
const String& getContent() const;
void LockNotifyContentChange();
void UnlockNotifyContentChange();
public:
// Direkte Eingabe ueber Dialog alten Wert loeschen
SwInputField(
SwInputFieldType* pFieldType,
const String& rContent,
const String& rPrompt,
sal_uInt16 nSubType = 0,
sal_uLong nFmt = 0,
bool bIsFormField = true );
virtual ~SwInputField();
void SetFmtFld( SwFmtFld& rFmtFld );
SwFmtFld* GetFmtFld();
// Providing new Input Field's content:
// Fill Input Field's content depending on <nSupType>.
void applyFieldContent( const String& rNewFieldContent );
bool isFormField() const;
virtual String GetFieldName() const;
// Content
virtual const String& GetPar1() const;
virtual void SetPar1(const String& rStr);
// aPromptText
virtual String GetPar2() const;
virtual void SetPar2(const String& rStr);
virtual String GetHelp() const;
virtual void SetHelp(const String & rStr);
virtual String GetToolTip() const;
virtual void SetToolTip(const String & rStr);
virtual sal_uInt16 GetSubType() const;
virtual void SetSubType(sal_uInt16 nSub);
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 );
};
/*--------------------------------------------------------------------
Description: Sorted list of input fields and DropDown fields
--------------------------------------------------------------------*/
class SwInputFieldList
{
public:
SwInputFieldList( SwEditShell* pShell, sal_Bool bBuildTmpLst = sal_False );
~SwInputFieldList();
sal_uInt16 Count() const;
SwField* GetField(sal_uInt16 nId);
void GotoFieldPos(sal_uInt16 nId);
void PushCrsr();
void PopCrsr();
// vergleiche TmpLst mit akt Feldern. Alle neue kommen in die SortLst
// damit sie geupdatet werden koennen. Returnt die Anzahl.
// (Fuer Textbausteine: nur seine Input-Felder aktualisieren)
sal_uInt16 BuildSortLst();
// Alle unselektierten Felder aus Liste entfernen
void RemoveUnselectedFlds();
private:
SwEditShell* pSh;
_SetGetExpFlds* pSrtLst;
SvPtrarr aTmpLst;
};
/*--------------------------------------------------------------------
Beschreibung: Tabellen-Formelfeld
(Implementierung steht in tblcalc.cxx)
--------------------------------------------------------------------*/
class SwTblFieldType : public SwValueFieldType
{
public:
SwTblFieldType(SwDoc* pDocPtr);
virtual SwFieldType* Copy() const;
};
// MSC will den hier nicht
//typedef void (SwField:: *FnScanFormel)( const SwTable&, String&,
// String&, String* = 0, void* = 0 );
class SwTblField : public SwValueField, public SwTableFormula
{
String sExpand;
sal_uInt16 nSubType;
virtual String Expand() const;
virtual SwField* Copy() const;
// suche den TextNode, in dem das Feld steht
virtual const SwNode* GetNodeOfFormula() const;
String GetCommand();
public:
SwTblField( SwTblFieldType*, const String& rFormel,
sal_uInt16 nSubType = 0, sal_uLong nFmt = 0);
virtual void SetValue( const double& rVal );
virtual sal_uInt16 GetSubType() const;
virtual void SetSubType(sal_uInt16 nType);
const String& GetExpStr() const { return sExpand; }
void ChgExpStr(const String& rStr) { sExpand = rStr; }
// berechne sich selbst
void CalcField( SwTblCalcPara& rCalcPara );
virtual String GetFieldName() const;
// Die Formel
virtual String GetPar2() const;
virtual void SetPar2(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 );
};
#endif // SW_EXPFLD_HXX