summaryrefslogtreecommitdiffstats
path: root/sw/inc/numrule.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/inc/numrule.hxx')
-rw-r--r--sw/inc/numrule.hxx316
1 files changed, 316 insertions, 0 deletions
diff --git a/sw/inc/numrule.hxx b/sw/inc/numrule.hxx
new file mode 100644
index 0000000000..b21cc52596
--- /dev/null
+++ b/sw/inc/numrule.hxx
@@ -0,0 +1,316 @@
+/* -*- 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_NUMRULE_HXX
+#define INCLUDED_SW_INC_NUMRULE_HXX
+
+#include <sal/types.h>
+#include <rtl/ustring.hxx>
+#include <editeng/numitem.hxx>
+#include <i18nlangtag/lang.h>
+#include "swdllapi.h"
+#include "swtypes.hxx"
+#include "calbck.hxx"
+#include "SwNumberTreeTypes.hxx"
+#include "ndarr.hxx"
+#include <unordered_map>
+#include <memory>
+#include <vector>
+#include "charfmt.hxx"
+#include "fmtornt.hxx"
+
+class SwTextFormatColl;
+class IDocumentListsAccess;
+class SwNodeNum;
+namespace vcl { class Font; }
+class SvxBrushItem;
+class SfxGrabBagItem;
+class SwDoc;
+class SwTextNode;
+class Size;
+class SwWrtShell;
+
+const sal_Unicode cBulletChar = 0x2022; ///< Character for lists.
+
+class SW_DLLPUBLIC SwNumFormat final : public SvxNumberFormat, public SwClient
+{
+ SwFormatVertOrient m_aVertOrient;
+ //For i120928,record the cp info of graphic within bullet
+ sal_Unicode m_cGrfBulletCP;
+ SAL_DLLPRIVATE void UpdateNumNodes(SwDoc& rDoc);
+
+ using SvxNumberFormat::operator ==;
+ using SvxNumberFormat::operator !=;
+
+ virtual void SwClientNotify(const SwModify&, const SfxHint&) override;
+
+public:
+ SwNumFormat();
+ SwNumFormat( const SwNumFormat& );
+ SwNumFormat( const SvxNumberFormat&, SwDoc* pDoc);
+
+ virtual ~SwNumFormat() override;
+
+ SwNumFormat& operator=( const SwNumFormat& );
+
+ bool operator==( const SwNumFormat& ) const;
+ bool operator!=( const SwNumFormat& r ) const { return !(*this == r); }
+
+ SwCharFormat* GetCharFormat() const { return const_cast<SwCharFormat*>(static_cast<const SwCharFormat*>(GetRegisteredIn())); }
+ void SetCharFormat( SwCharFormat* );
+
+ using SvxNumberFormat::SetCharFormatName;
+ virtual OUString GetCharFormatName() const override;
+
+ //For i120928,access the cp info of graphic within bullet
+ void SetGrfBulletCP(sal_Unicode cP){m_cGrfBulletCP = cP;}
+ sal_Unicode GetGrfBulletCP() const {return m_cGrfBulletCP;}
+
+ virtual void SetGraphicBrush( const SvxBrushItem* pBrushItem, const Size* pSize = nullptr, const sal_Int16* pOrient = nullptr) override;
+
+ const SwFormatVertOrient* GetGraphicOrientation() const;
+
+ bool IsEnumeration() const; // #i22362#
+ bool IsItemize() const; // #i29560#
+};
+
+enum SwNumRuleType { OUTLINE_RULE = 0, NUM_RULE = 1, RULE_END = 2 };
+class SW_DLLPUBLIC SwNumRule
+{
+
+public:
+ typedef std::vector< SwTextNode* > tTextNodeList;
+ typedef std::vector< SwTextFormatColl* > tParagraphStyleList;
+
+ struct Extremities
+ {
+ sal_uInt16 nPrefixChars;
+ sal_uInt16 nSuffixChars;
+ };
+
+private:
+ friend void FinitCore();
+
+ static SwNumFormat* saBaseFormats [ RULE_END ][ MAXLEVEL ];
+ static const sal_uInt16 saDefNumIndents[ MAXLEVEL ];
+ /// default list level properties for position-and-space mode LABEL_ALIGNMENT
+ static SwNumFormat* saLabelAlignmentBaseFormats [ RULE_END ][ MAXLEVEL ];
+ static sal_uInt16 snRefCount;
+
+ std::unique_ptr<SwNumFormat> maFormats[ MAXLEVEL ];
+
+ /** container for associated text nodes */
+ tTextNodeList maTextNodeList;
+
+ /** container for associated paragraph styles */
+ tParagraphStyleList maParagraphStyleList;
+
+ /** unordered_map containing "name->rule" relation */
+ std::unordered_map<OUString, SwNumRule *> * mpNumRuleMap;
+
+ OUString msName;
+ SwNumRuleType meRuleType;
+ sal_uInt16 mnPoolFormatId; ///< Id-for NumRules created "automatically"
+ sal_uInt16 mnPoolHelpId; ///< HelpId for this Pool-style.
+ sal_uInt8 mnPoolHlpFileId; ///< FilePos at Doc on style helps.
+ bool mbAutoRuleFlag : 1;
+ bool mbInvalidRuleFlag : 1;
+ bool mbContinusNum : 1; ///< Continuous numbering without levels.
+ bool mbAbsSpaces : 1; ///< Levels represent absolute indents.
+ bool mbHidden : 1; ///< Is the numbering rule to be hidden in the UI?
+ bool mbCountPhantoms;
+ bool mbUsedByRedline; /// it needs to export as part of tracked numbering change
+
+ SvxNumberFormat::SvxNumPositionAndSpaceMode meDefaultNumberFormatPositionAndSpaceMode;
+ OUString msDefaultListId;
+ std::shared_ptr<SfxGrabBagItem> mpGrabBagItem; ///< Style InteropGrabBag.
+
+public:
+ /// add parameter <eDefaultNumberFormatPositionAndSpaceMode>
+ SwNumRule( OUString aNm,
+ const SvxNumberFormat::SvxNumPositionAndSpaceMode eDefaultNumberFormatPositionAndSpaceMode,
+ SwNumRuleType = NUM_RULE );
+
+ SwNumRule( const SwNumRule& );
+ ~SwNumRule();
+
+ SwNumRule& operator=( const SwNumRule& );
+ bool operator==( const SwNumRule& ) const;
+ bool operator!=( const SwNumRule& r ) const { return !(*this == r); }
+
+ void Reset( const OUString& rName );
+
+ const SwNumFormat* GetNumFormat( sal_uInt16 i ) const;
+ const SwNumFormat& Get( sal_uInt16 i ) const;
+
+ bool IsHidden( ) const { return mbHidden; }
+ void SetHidden( bool bValue ) { mbHidden = bValue; }
+
+ void Set( sal_uInt16 i, const SwNumFormat* );
+ void Set( sal_uInt16 i, const SwNumFormat& );
+ OUString MakeNumString( const SwNodeNum&, bool bInclStrings = true ) const;
+ /** - add optional parameter <_nRestrictToThisLevel> in order to
+ restrict returned string to this level. */
+ OUString MakeNumString( const SwNumberTree::tNumberVector & rNumVector,
+ const bool bInclStrings = true,
+ const unsigned int _nRestrictToThisLevel = MAXLEVEL,
+ const bool bHideNonNumerical = false,
+ Extremities* pExtremities = nullptr,
+ LanguageType nLang = LANGUAGE_SYSTEM) const;
+ OUString MakeRefNumString( const SwNodeNum& rNodeNum,
+ const bool bInclSuperiorNumLabels,
+ const int nRestrictInclToThisLevel,
+ const bool bHideNonNumerical ) const;
+ OUString MakeParagraphStyleListString() const;
+
+ /** @return list of associated text nodes */
+ void GetTextNodeList( SwNumRule::tTextNodeList& rTextNodeList ) const;
+ SwNumRule::tTextNodeList::size_type GetTextNodeListSize() const;
+
+ void AddTextNode( SwTextNode& rTextNode );
+ void RemoveTextNode( SwTextNode& rTextNode );
+
+ SwNumRule::tParagraphStyleList::size_type GetParagraphStyleListSize() const;
+ void AddParagraphStyle( SwTextFormatColl& rTextFormatColl );
+ void RemoveParagraphStyle( SwTextFormatColl& rTextFormatColl );
+
+ void SetDefaultListId( const OUString& sDefaultListId )
+ {
+ msDefaultListId = sDefaultListId;
+ }
+ const OUString& GetDefaultListId() const
+ {
+ return msDefaultListId;
+ }
+ /**
+ Register this rule in a "name->numrule" map.
+
+ @param pNumRuleMap map to register in
+ */
+ void SetNumRuleMap(
+ std::unordered_map<OUString, SwNumRule *>* pNumRuleMap );
+
+ static OUString GetOutlineRuleName();
+
+ static sal_uInt16 GetNumIndent( sal_uInt8 nLvl );
+ static sal_uInt16 GetBullIndent( sal_uInt8 nLvl );
+
+ SwNumRuleType GetRuleType() const { return meRuleType; }
+ void SetRuleType( SwNumRuleType eNew ) { meRuleType = eNew;
+ mbInvalidRuleFlag = true; }
+
+ /** A kind of copy-constructor to make sure the num formats are
+ attached to the correctCharFormats of a document!!
+ (Copies the NumFormats and returns itself). */
+ SwNumRule& CopyNumRule( SwDoc&, const SwNumRule& );
+
+ /** Tests whether the CharFormats are from the given doc
+ and copies them if appropriate. */
+ void CheckCharFormats( SwDoc& rDoc );
+
+ const OUString& GetName() const { return msName; }
+
+ void SetName( const OUString& rNm,
+ IDocumentListsAccess& rDocListAccess );
+
+ bool IsAutoRule() const { return mbAutoRuleFlag; }
+ void SetAutoRule( bool bFlag ) { mbAutoRuleFlag = bFlag; }
+
+ bool IsInvalidRule() const { return mbInvalidRuleFlag; }
+ void SetInvalidRule( bool bFlag );
+
+ bool IsContinusNum() const { return mbContinusNum; }
+ void SetContinusNum( bool bFlag ) { mbContinusNum = bFlag; }
+
+ bool IsAbsSpaces() const { return mbAbsSpaces; }
+ void SetAbsSpaces( bool bFlag ) { mbAbsSpaces = bFlag; }
+
+ bool IsOutlineRule() const { return meRuleType == OUTLINE_RULE; }
+
+ bool IsCountPhantoms() const { return mbCountPhantoms; }
+ void SetCountPhantoms(bool bCountPhantoms);
+
+ bool IsUsedByRedline() const { return mbUsedByRedline; }
+ void SetUsedByRedline(bool bUsed ) { mbUsedByRedline = bUsed; }
+
+ /// Query and set PoolFormat IDs.
+ sal_uInt16 GetPoolFormatId() const { return mnPoolFormatId; }
+ void SetPoolFormatId( sal_uInt16 nId ) { mnPoolFormatId = nId; }
+
+ /// Query and set Help-IDs for document styles.
+ sal_uInt16 GetPoolHelpId() const { return mnPoolHelpId; }
+ void SetPoolHelpId( sal_uInt16 nId ) { mnPoolHelpId = nId; }
+ sal_uInt8 GetPoolHlpFileId() const { return mnPoolHlpFileId; }
+ void SetPoolHlpFileId( sal_uInt8 nId ) { mnPoolHlpFileId = nId; }
+
+ void SetSvxRule(const SvxNumRule&, SwDoc* pDoc);
+ SvxNumRule MakeSvxNumRule() const;
+
+ /// change indent of all list levels by given difference
+ void ChangeIndent( const sal_Int32 nDiff );
+ /// set indent of certain list level to given value
+ void SetIndent( const short nNewIndent,
+ const sal_uInt16 nListLevel );
+ /** set indent of first list level to given value and change other list level's
+ indents accordingly */
+ void SetIndentOfFirstListLevelAndChangeOthers( const short nNewIndent );
+
+ void Validate(const SwDoc& rDoc);
+ void dumpAsXml(xmlTextWriterPtr w) const;
+ void GetGrabBagItem(css::uno::Any& rVal) const;
+ void SetGrabBagItem(const css::uno::Any& rVal);
+};
+
+/// namespace for static functions and methods for numbering and bullets
+namespace numfunc
+{
+ /** retrieve font family name used for the default bullet list characters */
+ OUString const & GetDefBulletFontname();
+
+ /** determine if default bullet font is user defined
+
+ The default bullet font is user defined, if it is given in the user configuration
+ */
+ bool IsDefBulletFontUserDefined();
+
+ /** retrieve font used for the default bullet list characters */
+ SW_DLLPUBLIC const vcl::Font& GetDefBulletFont();
+
+ /** retrieve unicode of character used for the default bullet list for the given list level */
+ sal_Unicode GetBulletChar( sal_uInt8 nLevel );
+
+ /** configuration, if at first position of the first list item the <TAB>-key
+ increased the indent of the complete list or only demotes this list item.
+ The same for <SHIFT-TAB>-key at the same position for decreasing the
+ indent of the complete list or only promotes this list item.
+ */
+ bool ChangeIndentOnTabAtFirstPosOfFirstListItem();
+
+ /**
+ * Decides if increasing ("downing") the numbering level will change the amount of indentation
+ * or not. This is typically true, unless the numbering levels are invisible and have no
+ * indents.
+ */
+ bool NumDownChangesIndent(const SwWrtShell& rShell);
+
+ SvxNumberFormat::SvxNumPositionAndSpaceMode GetDefaultPositionAndSpaceMode();
+}
+
+#endif // INCLUDED_SW_INC_NUMRULE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */