6f185b7
From 082906e1f4cf58fdfab1a4064e2b7955fcdaeb8a Mon Sep 17 00:00:00 2001
6f185b7
From: Michael Stahl <mstahl@redhat.com>
6f185b7
Date: Wed, 21 Mar 2012 10:25:45 +0100
6f185b7
Subject: [PATCH] rhbz#789022: SwNodes: fix inconsistent outline check:
6f185b7
6f185b7
SwNodes::UpdateOutlineNode will add/remove the node from
6f185b7
SwNodes::pOutlineNds depending on IsOutline(), while various SwNodes
6f185b7
methods that move and delete nodes check GetAttrOutlineLevel() != 0,
6f185b7
which may be false even if IsOutline() is true.
6f185b7
---
6f185b7
 sw/source/core/docnode/nodes.cxx |   34 +++++++++++++++++-----------------
6f185b7
 sw/source/core/txtnode/ndtxt.cxx |    6 ++++++
6f185b7
 2 files changed, 23 insertions(+), 17 deletions(-)
6f185b7
6f185b7
diff --git a/sw/source/core/docnode/nodes.cxx b/sw/source/core/docnode/nodes.cxx
6f185b7
index 518de82..ab12430 100644
6f185b7
--- a/sw/source/core/docnode/nodes.cxx
6f185b7
+++ b/sw/source/core/docnode/nodes.cxx
6f185b7
@@ -173,7 +173,7 @@ void SwNodes::ChgNode( SwNodeIndex& rDelPos, sal_uLong nSz,
6f185b7
 
6f185b7
                 pTxtNode->RemoveFromList();
6f185b7
 
6f185b7
-                if ( pTxtNode->GetAttrOutlineLevel() != 0 )//<-end,zhaojianwei
6f185b7
+                if (pTxtNode->IsOutline())
6f185b7
                 {
6f185b7
                     const SwNodePtr pSrch = (SwNodePtr)&rN;;
6f185b7
                     pOutlineNds->Remove( pSrch );
6f185b7
@@ -188,8 +188,7 @@ void SwNodes::ChgNode( SwNodeIndex& rDelPos, sal_uLong nSz,
6f185b7
 
6f185b7
                 rTxtNd.AddToList();
6f185b7
 
6f185b7
-                if( bInsOutlineIdx &&
6f185b7
-                    0 != rTxtNd.GetAttrOutlineLevel() )//<-end,zhaojianwei
6f185b7
+                if (bInsOutlineIdx && rTxtNd.IsOutline())
6f185b7
                 {
6f185b7
                     const SwNodePtr pSrch = (SwNodePtr)&rN;;
6f185b7
                     pOutlineNds->Insert( pSrch );
6f185b7
@@ -232,9 +231,11 @@ void SwNodes::ChgNode( SwNodeIndex& rDelPos, sal_uLong nSz,
6f185b7
             {
6f185b7
                 SwTxtNode* pTxtNd = (SwTxtNode*)pNd;
6f185b7
 
6f185b7
-                // loesche die Gliederungs-Indizies aus dem alten Nodes-Array
6f185b7
-                if( 0 != pTxtNd->GetAttrOutlineLevel() )//<-end,zhaojianwei
6f185b7
+                // remove outline index from old nodes array
6f185b7
+                if (pTxtNd->IsOutline())
6f185b7
+                {
6f185b7
                     pOutlineNds->Remove( pNd );
6f185b7
+                }
6f185b7
 
6f185b7
                 // muss die Rule kopiere werden?
6f185b7
                 if( pDestDoc )
6f185b7
@@ -269,8 +270,7 @@ void SwNodes::ChgNode( SwNodeIndex& rDelPos, sal_uLong nSz,
6f185b7
                 {
6f185b7
                     SwpHints * const pHts = pTxtNd->GetpSwpHints();
6f185b7
                     // OultineNodes set the new nodes in the array
6f185b7
-                    if( bInsOutlineIdx &&
6f185b7
-                        0 != pTxtNd->GetAttrOutlineLevel() ) //#outline level,added by zhaojianwei
6f185b7
+                    if (bInsOutlineIdx && pTxtNd->IsOutline())
6f185b7
                     {
6f185b7
                         rNds.pOutlineNds->Insert( pTxtNd );
6f185b7
                     }
6f185b7
@@ -537,12 +537,12 @@ sal_Bool SwNodes::_MoveNodes( const SwNodeRange& aRange, SwNodes & rNodes,
6f185b7
                                 if( pTmpNd->IsTxtNode() )
6f185b7
                                     ((SwTxtNode*)pTmpNd)->RemoveFromList();
6f185b7
 
6f185b7
-                                // setze bei Start/EndNodes die richtigen Indizies
6f185b7
-                                // loesche die Gliederungs-Indizies aus
6f185b7
-                                // dem alten Nodes-Array
6f185b7
-                                if( pCNd->IsTxtNode() && 0 !=
6f185b7
-                                    ((SwTxtNode*)pCNd)->GetAttrOutlineLevel() )//<-end,by zhaojianwei
6f185b7
+                                // remove outline index from old nodes array
6f185b7
+                                if (pCNd->IsTxtNode() &&
6f185b7
+                                    static_cast<SwTxtNode*>(pCNd)->IsOutline())
6f185b7
+                                {
6f185b7
                                     pOutlineNds->Remove( pCNd );
6f185b7
+                                }
6f185b7
                                 else
6f185b7
                                     pCNd = 0;
6f185b7
                             }
6f185b7
@@ -572,7 +572,7 @@ sal_Bool SwNodes::_MoveNodes( const SwNodeRange& aRange, SwNodes & rNodes,
6f185b7
                             SwNode* pNd = &aMvIdx.GetNode();
6f185b7
 
6f185b7
                             const bool bOutlNd = pNd->IsTxtNode() &&
6f185b7
-                                    0 != ((SwTxtNode*)pNd)->GetAttrOutlineLevel();//<-end,zhaojianwei
6f185b7
+                                static_cast<SwTxtNode*>(pNd)->IsOutline();
6f185b7
                             // loesche die Gliederungs-Indizies aus
6f185b7
                             // dem alten Nodes-Array
6f185b7
                             if( bOutlNd )
6f185b7
@@ -1221,14 +1221,15 @@ void SwNodes::Delete(const SwNodeIndex &rIndex, sal_uLong nNodes)
6f185b7
 
6f185b7
                     if( pNd->IsTxtNode() )
6f185b7
                     {
6f185b7
-                        if( 0 != ((SwTxtNode*)pNd)->GetAttrOutlineLevel() &&//<-end,zhaojianwei
6f185b7
+                        SwTxtNode *const pTxtNode(static_cast<SwTxtNode*>(pNd));
6f185b7
+                        if (pTxtNode->IsOutline() &&
6f185b7
                                 pOutlineNds->Seek_Entry( pNd, &nIdxPos ))
6f185b7
                         {
6f185b7
                             // loesche die Gliederungs-Indizies.
6f185b7
                             pOutlineNds->Remove( nIdxPos );
6f185b7
                             bUpdateOutline = sal_True;
6f185b7
                         }
6f185b7
-                        ((SwTxtNode*)pNd)->InvalidateNumRule();
6f185b7
+                        pTxtNode->InvalidateNumRule();
6f185b7
                     }
6f185b7
                     else if( pNd->IsEndNode() &&
6f185b7
                             pNd->pStartOfSection->IsTableNode() )
6f185b7
@@ -1522,8 +1523,7 @@ void SwNodes::DelNodes( const SwNodeIndex & rStart, sal_uLong nCnt )
6f185b7
         {
6f185b7
             SwNode* pNd = (*this)[ n ];
6f185b7
 
6f185b7
-            if( pNd->IsTxtNode() &&
6f185b7
-                0 != ((SwTxtNode*)pNd)->GetAttrOutlineLevel() ) //<-end,zhaojianwei
6f185b7
+            if (pNd->IsTxtNode() && static_cast<SwTxtNode*>(pNd)->IsOutline())
6f185b7
             {                   // loesche die Gliederungs-Indizies.
6f185b7
                 sal_uInt16 nIdxPos;
6f185b7
                 if( pOutlineNds->Seek_Entry( pNd, &nIdxPos ))
6f185b7
diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx
6f185b7
index 2691f28..fa6f3b0 100644
6f185b7
--- a/sw/source/core/txtnode/ndtxt.cxx
6f185b7
+++ b/sw/source/core/txtnode/ndtxt.cxx
6f185b7
@@ -261,6 +261,12 @@ SwTxtNode::~SwTxtNode()
6f185b7
         delete pTmpHints;
6f185b7
     }
6f185b7
 
6f185b7
+    // must be removed from outline nodes by now
6f185b7
+#if OSL_DEBUG_LEVEL > 0
6f185b7
+    sal_uInt16 foo;
6f185b7
+    assert(!GetNodes().GetOutLineNds().Seek_Entry(this, &foo));
6f185b7
+#endif
6f185b7
+
6f185b7
     RemoveFromList();
6f185b7
 
6f185b7
     InitSwParaStatistics( false );
6f185b7
-- 
6f185b7
1.7.7.6
6f185b7