/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * 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 . */ #ifndef INCLUDED_SW_INC_FLDBAS_HXX #define INCLUDED_SW_INC_FLDBAS_HXX #include #include "swdllapi.h" #include "swtypes.hxx" #include "calbck.hxx" #include "nodeoffset.hxx" #include #include #include #include #include #include #include class SwDoc; class SwField; class SwFormatField; class SwDDETable; class SwRootFrame; class SvNumberFormatter; class IDocumentRedlineAccess; class SwGetRefField; class SwXFieldMaster; namespace com::sun::star::uno { class Any; } typedef struct _xmlTextWriter* xmlTextWriterPtr; enum class SwFieldIds : sal_uInt16 { /// For old documents the Field-Which IDs must be preserved !!! Database, User, Filename, DatabaseName, Date, Time, PageNumber, Author, Chapter, DocStat, GetExp, // 10 SetExp, GetRef, HiddenText, Postit, FixDate, FixTime, Reg, VarReg, SetRef, Input, // 20 Macro, Dde, Table, HiddenPara, DocInfo, TemplateName, DbNextSet, DbNumSet, DbSetNumber, ExtUser, // 30 RefPageSet, RefPageGet, Internet, JumpEdit, Script, DateTime, TableOfAuthorities, CombinedChars, Dropdown, ParagraphSignature, // 40 LAST = ParagraphSignature, Unknown = USHRT_MAX, // used as default value in some method calls }; /// List of FieldTypes at UI. enum class SwFieldTypesEnum : sal_uInt16 { Begin, Date = Begin, // 0 Time, Filename, DatabaseName, Chapter, PageNumber, DocumentStatistics, Author, Set, Get, Formel, // 10 HiddenText, SetRef, GetRef, DDE, Macro, Input, HiddenParagraph, DocumentInfo, Database, User, // 20 Postit, TemplateName, Sequence, DatabaseNextSet, DatabaseNumberSet, DatabaseSetNumber, ConditionalText, NextPage, PreviousPage, ExtendedUser, // 30 FixedDate, FixedTime, SetInput, UserInput, SetRefPage, GetRefPage, Internet, JumpEdit, Script, Authority, // 40 CombinedChars, Dropdown, Custom, // Unused - necessary for alignment with aSwFields in fldmgr.cxx ParagraphSignature, LAST, Unknown = USHRT_MAX // used by SwFieldMgr::GetCurTypeId }; enum SwAttrFieldType { ATTR_NONE, ATTR_DATEFLD, ATTR_TIMEFLD, ATTR_PAGENUMBERFLD, ATTR_PAGECOUNTFLD, ATTR_BOOKMARKFLD, ATTR_SETREFATTRFLD }; enum SwFileNameFormat { FF_BEGIN, FF_NAME = FF_BEGIN, FF_PATHNAME, FF_PATH, FF_NAME_NOEXT, FF_UI_NAME, FF_UI_RANGE, FF_END, FF_FIXED = 0x8000 }; enum SwVarFormat { VVF_CMD = 0x0010, ///< Show command. VVF_INVISIBLE = 0x0040, ///< Invisible. VVF_XXP = 0x0400, ///< 1234% VVF_XX_XXP = 0x0800, ///< 1.234,56% VVF_CLEAR = 0x000f, // From here new formats: VVF_SYS = 0x2000, ///< Format for numbers from system. VVF_X = 0x2100, ///< 1234 VVF_X_X = 0x2200, ///< 1234.5 VVF_X_XX = 0x2300, ///< 1245.56 VVF_XX_X = 0x2400, ///< 1.234.5 VVF_XX_XX = 0x2500, ///< 1.234.56 VVF_XX_XXX = 0x2600, ///< 1.234.567 VVF_SYS_CUR = 0x2700, ///< Format for currency from system. VVF_CUR_X = 0x2800, ///< EUR 1234 VVF_CUR_XX_XX = 0x2900, ///< EUR 1234.56 EUR 1234.00 VVF_CUR_XX_X0 = 0x2a00, ///< EUR 1234.56 EUR 1234.-- VVF_X_CUR = 0x2b00, ///< 1234 EUR VVF_XX_XX_CUR = 0x2c00, ///< 1234.56 EUR 1234.00 EUR VVF_XX_X0_CUR = 0x2d00, ///< 1234.56 EUR 1234.-- EUR /// Compatibility: VF_CMD = VVF_CMD, VF_INVISIBLE = VVF_INVISIBLE, VF_XXP = VVF_XXP, VF_XX_XXP = VVF_XX_XXP, VF_VISIBLE = VVF_SYS, VF_XX = VVF_X, VF_XX_XX = VVF_XX_XX, VF_XX_XX_CUR = VVF_SYS_CUR, VF_CLEAR = VVF_CLEAR }; typedef sal_uInt16 SwGetSetExpType; namespace nsSwGetSetExpType { const SwGetSetExpType GSE_STRING = 0x0001; ///< String const SwGetSetExpType GSE_EXPR = 0x0002; ///< Expression const SwGetSetExpType GSE_SEQ = 0x0008; ///< Sequence const SwGetSetExpType GSE_FORMULA = 0x0010; ///< Formula } typedef sal_uInt16 SwExtendedSubType; namespace nsSwExtendedSubType { const SwExtendedSubType SUB_CMD = 0x0100; ///< Show command. const SwExtendedSubType SUB_INVISIBLE = 0x0200; ///< Invisible. const SwExtendedSubType SUB_OWN_FMT = 0x0400; ///< SwDBField: Don't accept formatting from database. } enum SwInputFieldSubType { INP_TXT = 0x01, INP_USR = 0x02, INP_VAR = 0x03 }; enum SwUserType { UF_STRING = 0x01, UF_EXPR = 0x02 }; enum SwDateTimeSubType { FIXEDFLD = 1, DATEFLD = 2, TIMEFLD = 4 }; /// General tools. OUString FormatNumber(sal_uInt32 nNum, SvxNumType nFormat, LanguageType nLang = LANGUAGE_NONE); SwFieldTypesEnum SwFieldTypeFromString(std::u16string_view rString); /** Instances of SwFields and those derived from it occur 0 to n times. For each class there is one instance of the associated type class. Base class of all field types is SwFieldType. */ class SW_DLLPUBLIC SwFieldType : public sw::BroadcastingModify { unotools::WeakReference m_wXFieldMaster; SwFieldIds m_nWhich; friend void FinitUI(); ///< In order to delete pointer! static std::vector* s_pFieldNames; static void GetFieldName_(); ///< Sets up FieldNames; fldmgr.cxx! protected: /// Single argument ctors shall be explicit. explicit SwFieldType( SwFieldIds nWhichId ); public: unotools::WeakReference const& GetXObject() const { return m_wXFieldMaster; } void SetXObject(rtl::Reference const& xFieldMaster); static const OUString & GetTypeStr( SwFieldTypesEnum nTypeId ); /// Only in derived classes. virtual OUString GetName() const; virtual std::unique_ptr Copy() const = 0; virtual void QueryValue( css::uno::Any& rVal, sal_uInt16 nWhich ) const; virtual void PutValue( const css::uno::Any& rVal, sal_uInt16 nWhich ); SwFieldIds Which() const { return m_nWhich; } void PrintHiddenPara(); virtual void dumpAsXml(xmlTextWriterPtr pWriter) const; SwFormatField* FindFormatForField(const SwField*) const; SwFormatField* FindFormatForPostItId(sal_uInt32 nPostItId) const; void CollectPostIts(std::vector& rvFormatFields, IDocumentRedlineAccess const& rIDRA, bool HideRedlines); bool HasHiddenInformationNotes() const; void GatherNodeIndex(std::vector& rvNodeIndex); void GatherRefFields(std::vector& rvRFields, const sal_uInt16 nTyp); void GatherFields(std::vector& rvFormatFields, bool bCollectOnlyInDocNodes=true) const; void GatherDdeTables(std::vector& rvTables) const; void UpdateDocPos(const SwTwips nDocPos); virtual void UpdateFields(); }; /** Base class of all fields. Type of field is queried via Which. Expanded content of field is queried via ExpandField(). */ class SW_DLLPUBLIC SwField { private: mutable OUString m_Cache; ///< Cached expansion (for clipboard). SwFieldType* m_pType; sal_uInt32 m_nFormat; /// this can be either SvxNumType or SwChapterFormat depending on the subtype LanguageType m_nLang; ///< Always change via SetLanguage! bool m_bUseFieldValueCache; /// control the usage of the cached field value bool m_bIsAutomaticLanguage; /// Used for tooltip purposes when it's not-empty. OUString m_aTitle; virtual OUString ExpandImpl(SwRootFrame const* pLayout) const = 0; virtual std::unique_ptr Copy() const = 0; protected: void SetFormat(sal_uInt32 const nSet) { m_nFormat = nSet; } SwField( SwFieldType* pTyp, sal_uInt32 nFormat = 0, LanguageType nLang = LANGUAGE_SYSTEM, bool m_bUseFieldValueCache = true ); public: virtual ~SwField(); SwField(SwField const &) = default; SwField(SwField &&) = default; SwField & operator =(SwField const &) = default; SwField & operator =(SwField &&) = default; inline SwFieldType* GetTyp() const; /// Set new type (used for copying among documents). virtual SwFieldType* ChgTyp( SwFieldType* ); /** expand the field. @param bCached return cached field value. @remark most callers should use the cached field value. this is because various fields need special handing (ChangeExpansion()) to return correct values, and only SwTextFormatter::NewFieldPortion() sets things up properly. @param pLayout the layout to use for expansion; there are a few fields that expand differently via layout mode. @return the generated text (suitable for display) */ OUString ExpandField(bool bCached, SwRootFrame const* pLayout) const; /// @return name or content. virtual OUString GetFieldName() const; std::unique_ptr CopyField() const; /// ResId SwFieldIds Which() const #ifdef DBG_UTIL ; // implemented in fldbas.cxx #else { return m_pType->Which(); } #endif // TYP_ID SwFieldTypesEnum GetTypeId() const; virtual sal_uInt16 GetSubType() const; virtual void SetSubType(sal_uInt16); /// Language at field position. inline LanguageType GetLanguage() const; virtual void SetLanguage(LanguageType nLng); /// Query parameters for dialog and for BASIC. inline sal_uInt32 GetFormat() const; virtual OUString GetPar1() const; virtual OUString GetPar2() const; virtual OUString GetFormula() const; void ChangeFormat(sal_uInt32 n); virtual void SetPar1(const OUString& rStr); virtual void SetPar2(const OUString& rStr); virtual bool QueryValue( css::uno::Any& rVal, sal_uInt16 nWhichId ) const; virtual bool PutValue( const css::uno::Any& rVal, sal_uInt16 nWhichId ); /// Does the field possess an action on its ClickHandler? (e.g. INetFields, ...). bool HasClickHdl() const; bool IsFixed() const; bool IsAutomaticLanguage() const { return m_bIsAutomaticLanguage; } void SetAutomaticLanguage(bool const bSet) { m_bIsAutomaticLanguage = bSet; } virtual OUString GetDescription() const; /// Is this field clickable? bool IsClickable() const; virtual void dumpAsXml(xmlTextWriterPtr pWriter) const; const OUString & GetTitle() const { return m_aTitle; } void SetTitle(const OUString& rTitle) { m_aTitle = rTitle; } }; inline SwFieldType* SwField::GetTyp() const { return m_pType; } inline sal_uInt32 SwField::GetFormat() const { return m_nFormat; } inline LanguageType SwField::GetLanguage() const { return m_nLang; } /// Fields containing values that have to be formatted via number formatter. class SwValueFieldType : public SwFieldType { private: SwDoc* m_pDoc; bool m_bUseFormat; ///< Use number formatter. protected: SwValueFieldType( SwDoc* pDocPtr, SwFieldIds nWhichId ); SwValueFieldType( const SwValueFieldType& rTyp ); public: SwDoc* GetDoc() const { return m_pDoc; } void SetDoc(SwDoc* pNewDoc) { m_pDoc = pNewDoc; } bool UseFormat() const { return m_bUseFormat; } void EnableFormat(bool bFormat = true) { m_bUseFormat = bFormat; } OUString ExpandValue(const double& rVal, sal_uInt32 nFormat, LanguageType nLng) const; OUString DoubleToString(const double &rVal, LanguageType eLng) const; OUString DoubleToString(const double &rVal, sal_uInt32 nFormat) const; /// Query input or formatted value for dialog. OUString GetInputOrDateTime( const OUString& rInput, const double& rVal, sal_uInt32 nFormat ) const; }; class SW_DLLPUBLIC SwValueField : public SwField { private: double m_fValue; protected: SwValueField( SwValueFieldType* pFieldType, sal_uInt32 nFormat, LanguageType nLang = LANGUAGE_SYSTEM, const double fVal = 0.0 ); SwValueField( const SwValueField& rField ); public: virtual ~SwValueField() override; virtual SwFieldType* ChgTyp( SwFieldType* ) override; virtual void SetLanguage(LanguageType nLng) override; SwDoc* GetDoc() const { return static_cast(GetTyp())->GetDoc(); } virtual double GetValue() const; virtual void SetValue( const double& rVal ); OUString ExpandValue(const double& rVal, sal_uInt32 nFormat, LanguageType nLng) const { return static_cast(GetTyp())->ExpandValue(rVal, nFormat, nLng); } static sal_uInt32 GetSystemFormat(SvNumberFormatter* pFormatter, sal_uInt32 nFormat); void dumpAsXml(xmlTextWriterPtr pWriter) const override; }; class SW_DLLPUBLIC SwFormulaField : public SwValueField { private: OUString m_sFormula; protected: SwFormulaField( SwValueFieldType* pFieldType, sal_uInt32 nFormat, const double fVal ); SwFormulaField( const SwFormulaField& rField ); public: virtual OUString GetFormula() const override; void SetFormula(const OUString& rStr); void SetExpandedFormula(const OUString& rStr); OUString GetExpandedFormula() const; /// Query formula or formatted value for dialog. OUString GetInputOrDateTime() const; }; #endif // INCLUDED_SW_INC_FLDBAS_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */