sw/README | 57 +++++++++++++++++ sw/inc/SwNumberTree.hxx | 19 ++--- sw/inc/doc.hxx | 17 ++--- sw/inc/ndarr.hxx | 1 sw/inc/node.hxx | 1 sw/source/core/SwNumberTree/SwNumberTree.cxx | 88 +++++++++------------------ 6 files changed, 103 insertions(+), 80 deletions(-)
New commits: commit c65cae183dec9b89ac5279da9c5aa099254b7234 Author: Michael Stahl <mst...@redhat.com> Date: Thu Jul 6 17:45:53 2017 +0200 sw/README: document lists and outline Change-Id: I1f6a7a29a308e13c20e5987902d148ee8d466e31 diff --git a/sw/README b/sw/README index 4305613debac..60de27ba4ccd 100644 --- a/sw/README +++ b/sw/README @@ -140,3 +140,60 @@ There are multiple model classes involved for fields: Its life-cycle is determined by UNO clients outside of sw; it will get disposed when the SwFormatField dies. +=== Lists === + +- SwNumFormat (subclass of SvxNumFormat) determines the formatting of a single + numbering level. + +- SwNumRule (NOT a subclass of SvxNumRule) is a *list style*, containing one + SwNumFormat per list level. + SwNumRule::maTextNodeList is the list of SwTextNode that have this list style + applied. + +- SwNumberTreeNode is a base class that represents an abstract node in a + hierarchical tree of numbered nodes. + +- SwNodeNum is the subclass of SwNumberTreeNode that connects it with an + actual SwTextNode and also with a SwNumRule; + SwTextNode::mpNodeNum points back in the other direction + +- SwList represents a list, which is (mostly) a vector of SwNodeNum trees, + one per SwNodes top-level section (why that?). + +- IDocumentListsAccess, sw::DocumentListsManager owns all SwList instances, + and maintains mappings: + + from list-id to SwList + + from list style name to SwList (the "default" SwList for that list style) + +- IDocumentListItems, sw::DocumentListItemsManager contains a set of all + SwNodeNum instances, ordered by SwNode index + +- the special Outline numbering rule: SwDoc::mpOutlineRule + +- IDocumentOutlineNodes, sw::DocumentOutlineNodesManager maintain + a list (which is actually stored in SwNodes::m_pOutlineNodes) of SwTextNodes + that either have the Outline numrule applied, + or have the RES_PARATR_OUTLINELEVEL item set (note that in the latter case, + the SwTextNode does not have a SwNodeNum and is not associated with the + SwDoc::mpOutlineRule). + +- SwTextNodes and paragraph styles have items/properties: + + RES_PARATR_OUTLINELEVEL/"OutlineLevel" to specify an outline level without + necessarily having the outline SwNumRule assigned + + RES_PARATR_NUMRULE/"NumberingStyleName" the list style to apply; may be + empty "" which means no list style (to override inherited value) + Only SwTextNode has these items: + + RES_PARATR_LIST_ID/"ListId" + determines the SwList to which the node is added + + RES_PARATR_LIST_LEVEL/"NumberingLevel" + the level at which the SwTextNode will appear in the list + + RES_PARATR_LIST_ISRESTART/"ParaIsNumberingRestart" + restart numbering sequence at this SwTextNode + + RES_PARATR_LIST_RESTARTVALUE/"NumberingStartValue" + restart numbering sequence at this SwTextNode with this value + + RES_PARATR_LIST_ISCOUNTED/"NumberingIsNumber" + determines if the node is actually counted in the numbering sequence; + these are different from "phantoms" because there's still a SwTextNode. + +Note that there is no UNO service to represent a list. + commit ea3e718855d804943831db81428fec249b9c7575 Author: Michael Stahl <mst...@redhat.com> Date: Thu Jul 6 14:13:12 2017 +0200 sw: convert SwNumberTree::IsSane to assert() and simplify Change-Id: Ib2087a53d2a22f5fdafa5c3d0d058dd0ad8ed643 diff --git a/sw/inc/SwNumberTree.hxx b/sw/inc/SwNumberTree.hxx index 3d19458e5b8c..c908eeca490c 100644 --- a/sw/inc/SwNumberTree.hxx +++ b/sw/inc/SwNumberTree.hxx @@ -346,7 +346,7 @@ public: @retval true the structure of this node is sane @retval false else */ - bool IsSane(bool bRecursive) const; + void IsSane(bool bRecursive) const; #endif // DBG_UTIL protected: @@ -391,15 +391,12 @@ protected: virtual void PostRemove() = 0; #ifdef DBG_UTIL - /** - Sanity check with loop detection. + /** Sanity check with loop detection. @param bRecursive descend to children @param rParents vector for recording path - - @retval true this node is sane - @retval false else */ - virtual bool IsSane + */ + virtual void IsSane (bool bRecursive, std::vector<const SwNumberTreeNode *> rParents) const; #endif // DBG_UTIL diff --git a/sw/source/core/SwNumberTree/SwNumberTree.cxx b/sw/source/core/SwNumberTree/SwNumberTree.cxx index f60f0c0a732b..c606f7b34aea 100644 --- a/sw/source/core/SwNumberTree/SwNumberTree.cxx +++ b/sw/source/core/SwNumberTree/SwNumberTree.cxx @@ -23,6 +23,8 @@ #include <osl/diagnose.h> #include <sal/log.hxx> +#include <cassert> + using std::vector; using std::find; @@ -385,7 +387,8 @@ void SwNumberTreeNode::MoveGreaterChildren( SwNumberTreeNode& _rCompareNode, } #ifdef DBG_UTIL - SAL_WARN_IF(!IsSane(false) || !_rDestNode.IsSane(true), "sw.core", "insanity"); + IsSane(false); + _rDestNode.IsSane(true); #endif } @@ -433,7 +436,8 @@ void SwNumberTreeNode::MoveChildren(SwNumberTreeNode * pDest) OSL_ENSURE(mChildren.empty(), "MoveChildren failed!"); #ifdef DBG_UTIL - OSL_ENSURE(IsSane(false) && pDest->IsSane(false), "insanity!"); + IsSane(false); + pDest->IsSane(false); #endif } @@ -585,7 +589,7 @@ void SwNumberTreeNode::AddChild( SwNumberTreeNode * pChild, } #ifdef DBG_UTIL - SAL_WARN_IF(!IsSane(false), "sw.core", "insanity"); + IsSane(false); #endif } @@ -678,7 +682,7 @@ void SwNumberTreeNode::RemoveMe() pSavedParent->ClearObsoletePhantoms(); #ifdef DBG_UTIL - SAL_WARN_IF(!IsSane(false), "sw.core", "insanity"); + IsSane(false); #endif } } @@ -857,34 +861,22 @@ SwNumberTreeNode::GetChildCount() const } #ifdef DBG_UTIL -bool SwNumberTreeNode::IsSane(bool bRecursive) const +void SwNumberTreeNode::IsSane(bool bRecursive) const { vector<const SwNumberTreeNode*> aParents; return IsSane(bRecursive, aParents); } -bool SwNumberTreeNode::IsSane(bool bRecursive, +void SwNumberTreeNode::IsSane(bool bRecursive, vector<const SwNumberTreeNode *> rParents) const { - bool bResult = true; - tSwNumberTreeChildren::const_iterator aIt; - if (find(rParents.begin(), rParents.end(), this) != rParents.end()) - { - OSL_FAIL(" I'm my own ancestor!"); - - bResult = false; - } + assert(find(rParents.begin(), rParents.end(), this) == rParents.end()); - if (! rParents.empty() && rParents.back() != mpParent) - { - OSL_FAIL(" I'm a bastard!"); - - bResult = false; - } + assert(rParents.empty() || rParents.back() == mpParent); rParents.push_back(this); @@ -895,49 +887,33 @@ bool SwNumberTreeNode::IsSane(bool bRecursive, { if ((*aIt)->IsPhantom()) { - if ((*aIt)->HasOnlyPhantoms()) - { - bResult = false; - } + SAL_WARN_IF((*aIt)->HasOnlyPhantoms(), "sw.core", + "HasOnlyPhantoms: is this an error?"); - if (! bFirst) - { - OSL_FAIL(" found phantom not at first position."); - - bResult = false; - } + assert(bFirst && "found phantom not at first position."); } - if ((*aIt)->mpParent != (SwNumberTreeNode *) this) - { - OSL_FAIL("found a bastard"); - - bResult = false; - } + assert((*aIt)->mpParent == this); if (mpParent) { - if (!(*aIt)->IsPhantom() && (*aIt)->LessThan(*this)) - { - OSL_FAIL(" found child less than me"); - - bResult = false; - } + assert((*aIt)->IsPhantom() || !(*aIt)->LessThan(*this)); } } else { - OSL_FAIL("found child that is NULL"); - bResult = false; + assert(!"found child that is NULL"); } - if (bRecursive) - bResult = (*aIt)->IsSane(bRecursive, rParents) && bResult; + if (bRecursive) + { + (*aIt)->IsSane(bRecursive, rParents); + } + + bFirst = false; } rParents.pop_back(); - - return bResult; } #endif // DBG_UTIL commit a0dc0d3cc2cf64567eeebba73d308f6ad827d810 Author: Michael Stahl <mst...@redhat.com> Date: Thu Jul 6 13:21:59 2017 +0200 sw: enable some SwNumberTree sanity testing code __SW_NUMBER_TREE_SANITY_CHECK isn't defined anywhere. Change-Id: Ieb8c47d12c47a8a1ffcad0616382e4d2b55024a0 diff --git a/sw/inc/SwNumberTree.hxx b/sw/inc/SwNumberTree.hxx index 166ad1fd18ce..3d19458e5b8c 100644 --- a/sw/inc/SwNumberTree.hxx +++ b/sw/inc/SwNumberTree.hxx @@ -337,7 +337,7 @@ public: */ const SwNumberTreeNode* GetPrecedingNodeOf( const SwNumberTreeNode& rNode ) const; -#ifdef __SW_NUMBER_TREE_SANITY_CHECK +#ifdef DBG_UTIL /** Sanity check. @@ -347,7 +347,7 @@ public: @retval false else */ bool IsSane(bool bRecursive) const; -#endif // __SW_NUMBER_TREE_SANITY_CHECK +#endif // DBG_UTIL protected: /** @@ -390,7 +390,7 @@ protected: // method called after this tree node has been removed from the list tree virtual void PostRemove() = 0; -#ifdef __SW_NUMBER_TREE_SANITY_CHECK +#ifdef DBG_UTIL /** Sanity check with loop detection. @@ -401,7 +401,7 @@ protected: @retval false else */ virtual bool IsSane (bool bRecursive, std::vector<const SwNumberTreeNode *> rParents) const; -#endif // __SW_NUMBER_TREE_SANITY_CHECK +#endif // DBG_UTIL /** the parent node diff --git a/sw/source/core/SwNumberTree/SwNumberTree.cxx b/sw/source/core/SwNumberTree/SwNumberTree.cxx index 69564bfb5416..f60f0c0a732b 100644 --- a/sw/source/core/SwNumberTree/SwNumberTree.cxx +++ b/sw/source/core/SwNumberTree/SwNumberTree.cxx @@ -21,6 +21,7 @@ #include <functional> #include <SwNumberTree.hxx> #include <osl/diagnose.h> +#include <sal/log.hxx> using std::vector; using std::find; @@ -383,9 +384,8 @@ void SwNumberTreeNode::MoveGreaterChildren( SwNumberTreeNode& _rCompareNode, } } -#ifdef __SW_NUMBER_TREE_SANITY_CHECK - if (! IsSane(false) || ! IsSane(&_rDestNode)) - clog << __FUNCTION__ << "insanity!" << endl; +#ifdef DBG_UTIL + SAL_WARN_IF(!IsSane(false) || !_rDestNode.IsSane(true), "sw.core", "insanity"); #endif } @@ -432,7 +432,7 @@ void SwNumberTreeNode::MoveChildren(SwNumberTreeNode * pDest) OSL_ENSURE(mChildren.empty(), "MoveChildren failed!"); -#ifdef __SW_NUMBER_TREE_SANITY_CHECK +#ifdef DBG_UTIL OSL_ENSURE(IsSane(false) && pDest->IsSane(false), "insanity!"); #endif } @@ -584,9 +584,8 @@ void SwNumberTreeNode::AddChild( SwNumberTreeNode * pChild, } } -#ifdef __SW_NUMBER_TREE_SANITY_CHECK - if (! IsSane(false)) - clog << __FUNCTION__ << ": insanity!" << endl; +#ifdef DBG_UTIL + SAL_WARN_IF(!IsSane(false), "sw.core", "insanity"); #endif } @@ -678,9 +677,8 @@ void SwNumberTreeNode::RemoveMe() if (pSavedParent) pSavedParent->ClearObsoletePhantoms(); -#ifdef __SW_NUMBER_TREE_SANITY_CHECK - if (! IsSane(false)) - clog << __FUNCTION__ << ": insanity!" << endl; +#ifdef DBG_UTIL + SAL_WARN_IF(!IsSane(false), "sw.core", "insanity"); #endif } } @@ -858,7 +856,7 @@ SwNumberTreeNode::GetChildCount() const return mChildren.size(); } -#ifdef __SW_NUMBER_TREE_SANITY_CHECK +#ifdef DBG_UTIL bool SwNumberTreeNode::IsSane(bool bRecursive) const { vector<const SwNumberTreeNode*> aParents; @@ -941,7 +939,7 @@ bool SwNumberTreeNode::IsSane(bool bRecursive, return bResult; } -#endif // __SW_NUMBER_TREE_SANITY_CHECK +#endif // DBG_UTIL SwNumberTreeNode::tSwNumberTreeChildren::const_iterator SwNumberTreeNode::GetIterator(const SwNumberTreeNode * pChild) const commit 4a932d3b672029374a6ada000f115ad86d7bc523 Author: Michael Stahl <mst...@redhat.com> Date: Wed Jul 5 14:19:05 2017 +0200 sw: comment cosmetics Change-Id: I572bf8b28738e82e2f207b5201a0c27d9d9b623d diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx index c9fb60cb678b..b0042896602f 100644 --- a/sw/inc/doc.hxx +++ b/sw/inc/doc.hxx @@ -1032,23 +1032,21 @@ public: // Outline - promote / demote. bool OutlineUpDown( const SwPaM& rPam, short nOffset ); - // Ountline - move up / move down. + /// Outline - move up / move down. bool MoveOutlinePara( const SwPaM& rPam, SwOutlineNodes::difference_type nOffset); bool GotoOutline( SwPosition& rPos, const OUString& rName ) const; - /** Accept changes of outline styles for OUtlineRule. - re-use unused 3rd parameter - Optional parameter <bResetIndentAttrs> - default value false: + /** Accept changes of outline styles for OutlineRule. + @param bResetIndentAttrs Optional parameter - default value false: If <bResetIndentAttrs> equals true, the indent attributes "before text" and "first line indent" are additionally reset at the provided PaM, if the list style makes use of the new list level attributes. - Parameters <bCreateNewList> and <sContinuedListId>: - <bCreateNewList> indicates, if a new list is created by applying the given list style. - If <bCreateNewList> equals false, <sContinuedListId> may contain the - list Id of a list, which has to be continued by applying the given list style + @param bCreateNewList indicates if a new list is created by applying the given list style. + @param sContinuedListId If bCreateNewList is false, may contain the + list Id of a list which has to be continued by applying the given list style - Returns the set ListId if bSetItem is true */ + @return the set ListId if bSetItem is true */ OUString SetNumRule( const SwPaM&, const SwNumRule&, bool bCreateNewList, @@ -1604,7 +1602,6 @@ public: /** * Dumps the entire nodes structure to the given destination (file nodes.xml in the current directory by default) - * @since 3.5 */ void dumpAsXml(struct _xmlTextWriter* = nullptr) const; diff --git a/sw/inc/ndarr.hxx b/sw/inc/ndarr.hxx index 4e7cca5fa0ee..eebc176e1f54 100644 --- a/sw/inc/ndarr.hxx +++ b/sw/inc/ndarr.hxx @@ -323,7 +323,6 @@ public: /** * Dumps the entire nodes structure to the given destination (file nodes.xml in the current directory by default) - * @since 3.5 */ void dumpAsXml( xmlTextWriterPtr pWriter ) const; }; diff --git a/sw/inc/node.hxx b/sw/inc/node.hxx index 89c6f7f10a94..48411c5facc6 100644 --- a/sw/inc/node.hxx +++ b/sw/inc/node.hxx @@ -283,7 +283,6 @@ public: /** * Dumps the node structure to the given destination (file nodes.xml in the current directory by default) - * @since 3.5 */ virtual void dumpAsXml(struct _xmlTextWriter* pWriter) const; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits