1efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5efeef26fSAndrew Rist  * distributed with this work for additional information
6efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10efeef26fSAndrew Rist  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12efeef26fSAndrew Rist  *
13efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17efeef26fSAndrew Rist  * specific language governing permissions and limitations
18efeef26fSAndrew Rist  * under the License.
19efeef26fSAndrew Rist  *
20efeef26fSAndrew Rist  *************************************************************/
21efeef26fSAndrew Rist 
22efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <algorithm>
28cdf0e10cSrcweir #include <functional>
29cdf0e10cSrcweir #include <errhdl.hxx>
30cdf0e10cSrcweir #include <SwNumberTree.hxx>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir using std::vector;
33cdf0e10cSrcweir using std::find;
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #ifdef DBG_UTIL
36cdf0e10cSrcweir unsigned long SwNumberTreeNode::nInstances = 0;
37cdf0e10cSrcweir #endif
38cdf0e10cSrcweir 
SwNumberTreeNode()39cdf0e10cSrcweir SwNumberTreeNode::SwNumberTreeNode()
40cdf0e10cSrcweir     : mChildren(),
41cdf0e10cSrcweir       mpParent( 0 ),
42cdf0e10cSrcweir       mnNumber( 0 ),
43cdf0e10cSrcweir       // --> OD 2008-11-26 #158694#
44cdf0e10cSrcweir       mbContinueingPreviousSubTree( false ),
45cdf0e10cSrcweir       // <--
46cdf0e10cSrcweir       mbPhantom( false ),
47cdf0e10cSrcweir       mItLastValid()
48cdf0e10cSrcweir {
49cdf0e10cSrcweir     mItLastValid = mChildren.end();
50cdf0e10cSrcweir 
51cdf0e10cSrcweir #ifdef DBG_UTIL
52cdf0e10cSrcweir     mnSerial = nInstances;
53cdf0e10cSrcweir     nInstances++;
54cdf0e10cSrcweir #endif
55cdf0e10cSrcweir }
56cdf0e10cSrcweir 
~SwNumberTreeNode()57cdf0e10cSrcweir SwNumberTreeNode::~SwNumberTreeNode()
58cdf0e10cSrcweir {
59cdf0e10cSrcweir     if (GetChildCount() > 0)
60cdf0e10cSrcweir     {
61cdf0e10cSrcweir         if (HasOnlyPhantoms())
62cdf0e10cSrcweir         {
63cdf0e10cSrcweir             delete *mChildren.begin();
64cdf0e10cSrcweir 
65cdf0e10cSrcweir             mChildren.clear();
66cdf0e10cSrcweir             mItLastValid = mChildren.end();
67cdf0e10cSrcweir         }
68cdf0e10cSrcweir         else
69cdf0e10cSrcweir         {
70cdf0e10cSrcweir             ASSERT(false, "lost children!");
71cdf0e10cSrcweir         }
72cdf0e10cSrcweir     }
73cdf0e10cSrcweir 
74cdf0e10cSrcweir     ASSERT( IsPhantom() || mpParent == NULL, ": I'm not supposed to have a parent.");
75cdf0e10cSrcweir 
76cdf0e10cSrcweir #ifdef DBG_UTIL
77cdf0e10cSrcweir     nInstances--;
78cdf0e10cSrcweir #endif
79cdf0e10cSrcweir 
80cdf0e10cSrcweir     mpParent = (SwNumberTreeNode *) 0xdeadbeef;
81cdf0e10cSrcweir 
82cdf0e10cSrcweir     ASSERT(mChildren.empty(), "children left!");
83cdf0e10cSrcweir }
84cdf0e10cSrcweir 
CreatePhantom()85cdf0e10cSrcweir SwNumberTreeNode * SwNumberTreeNode::CreatePhantom()
86cdf0e10cSrcweir {
87cdf0e10cSrcweir     SwNumberTreeNode * pNew = NULL;
88cdf0e10cSrcweir 
89cdf0e10cSrcweir     if (! mChildren.empty() &&
90cdf0e10cSrcweir         (*mChildren.begin())->IsPhantom())
91cdf0e10cSrcweir     {
92cdf0e10cSrcweir         ASSERT(false, "phantom already present");
93cdf0e10cSrcweir     }
94cdf0e10cSrcweir     else
95cdf0e10cSrcweir     {
96cdf0e10cSrcweir         pNew = Create();
97cdf0e10cSrcweir         pNew->SetPhantom(true);
98cdf0e10cSrcweir         pNew->mpParent = this;
99cdf0e10cSrcweir 
100cdf0e10cSrcweir         std::pair<tSwNumberTreeChildren::iterator, bool> aInsert =
101cdf0e10cSrcweir             mChildren.insert(pNew);
102cdf0e10cSrcweir 
103cdf0e10cSrcweir         if (! aInsert.second)
104cdf0e10cSrcweir         {
105cdf0e10cSrcweir             ASSERT(false, "insert of phantom failed!");
106cdf0e10cSrcweir 
107cdf0e10cSrcweir             delete pNew;
108cdf0e10cSrcweir             pNew = NULL;
109cdf0e10cSrcweir         }
110cdf0e10cSrcweir     }
111cdf0e10cSrcweir 
112cdf0e10cSrcweir     return pNew;
113cdf0e10cSrcweir }
114cdf0e10cSrcweir 
GetRoot() const115cdf0e10cSrcweir SwNumberTreeNode * SwNumberTreeNode::GetRoot() const
116cdf0e10cSrcweir {
117cdf0e10cSrcweir     SwNumberTreeNode * pResult = mpParent;
118cdf0e10cSrcweir 
119cdf0e10cSrcweir     if (pResult)
120cdf0e10cSrcweir         while (pResult->mpParent)
121cdf0e10cSrcweir             pResult = pResult->mpParent;
122cdf0e10cSrcweir 
123cdf0e10cSrcweir     return pResult;
124cdf0e10cSrcweir }
125cdf0e10cSrcweir 
ClearObsoletePhantoms()126cdf0e10cSrcweir void SwNumberTreeNode::ClearObsoletePhantoms()
127cdf0e10cSrcweir {
128cdf0e10cSrcweir     tSwNumberTreeChildren::iterator aIt = mChildren.begin();
129cdf0e10cSrcweir 
130cdf0e10cSrcweir     if (aIt != mChildren.end() && (*aIt)->IsPhantom())
131cdf0e10cSrcweir     {
132cdf0e10cSrcweir         (*aIt)->ClearObsoletePhantoms();
133cdf0e10cSrcweir 
134cdf0e10cSrcweir         if ((*aIt)->mChildren.empty())
135cdf0e10cSrcweir         {
136cdf0e10cSrcweir             // --> OD 2006-01-17 #i60652#
137cdf0e10cSrcweir             // Because <mChildren.erase(aIt)> could destroy the element, which
138cdf0e10cSrcweir             // is referenced by <mItLastValid>, it's needed to adjust
139cdf0e10cSrcweir             // <mItLastValid> before erasing <aIt>.
140cdf0e10cSrcweir             SetLastValid(mChildren.end());
141cdf0e10cSrcweir             // <--
142cdf0e10cSrcweir 
143cdf0e10cSrcweir             delete *aIt;
144cdf0e10cSrcweir             mChildren.erase(aIt);
145cdf0e10cSrcweir         }
146cdf0e10cSrcweir     }
147cdf0e10cSrcweir }
148cdf0e10cSrcweir 
ValidateHierarchical(const SwNumberTreeNode * pNode) const149cdf0e10cSrcweir void SwNumberTreeNode::ValidateHierarchical(const SwNumberTreeNode * pNode) const
150cdf0e10cSrcweir {
151*24b62240SHerbert Dürr     tSwNumberTreeChildren::const_iterator aValidateIt =
152cdf0e10cSrcweir         GetIterator(pNode);
153cdf0e10cSrcweir 
154cdf0e10cSrcweir     if (aValidateIt != mChildren.end())
155cdf0e10cSrcweir     {
156cdf0e10cSrcweir         ASSERT((*aValidateIt)->mpParent == this, "wrong parent");
157cdf0e10cSrcweir 
158*24b62240SHerbert Dürr         tSwNumberTreeChildren::const_iterator aIt = mItLastValid;
159cdf0e10cSrcweir 
160cdf0e10cSrcweir         // --> OD 2005-10-19 #126009#
161cdf0e10cSrcweir         // improvement:
162cdf0e10cSrcweir         // - Only one time checked for <mChildren.end()>.
163cdf0e10cSrcweir         // - Less checks for each loop run.
164cdf0e10cSrcweir         // correction:
165cdf0e10cSrcweir         // - consider case that current node isn't counted and isn't the first
166cdf0e10cSrcweir         // child of its parent. In this case the number of last counted child
167cdf0e10cSrcweir         // of the previous node determines the start value for the following
168cdf0e10cSrcweir         // children loop, if all children have to be validated and the first
169cdf0e10cSrcweir         // one doesn't restart the counting.
170cdf0e10cSrcweir //        tSwNumTreeNumber nTmpNumber = 0;
171cdf0e10cSrcweir //        if (aIt != mChildren.end())
172cdf0e10cSrcweir //            nTmpNumber = (*aIt)->mnNumber;
173cdf0e10cSrcweir //        while (aIt != aValidateIt)
174cdf0e10cSrcweir //        {
175cdf0e10cSrcweir //            if (aIt == mChildren.end())
176cdf0e10cSrcweir //                aIt = mChildren.begin();
177cdf0e10cSrcweir //            else
178cdf0e10cSrcweir //            {
179cdf0e10cSrcweir //                aIt++;
180cdf0e10cSrcweir //                if ((*aIt)->IsCounted())
181cdf0e10cSrcweir //                    nTmpNumber++;
182cdf0e10cSrcweir //            }
183cdf0e10cSrcweir //            if ((*aIt)->IsRestart() || aIt == mChildren.begin())
184cdf0e10cSrcweir //                nTmpNumber = (*aIt)->GetStart();
185cdf0e10cSrcweir //            (*aIt)->mnNumber = nTmpNumber;
186cdf0e10cSrcweir //        }
187cdf0e10cSrcweir         SwNumberTree::tSwNumTreeNumber nTmpNumber( 0 );
188cdf0e10cSrcweir         if (aIt != mChildren.end())
189cdf0e10cSrcweir             nTmpNumber = (*aIt)->mnNumber;
190cdf0e10cSrcweir         else
191cdf0e10cSrcweir         {
192cdf0e10cSrcweir             aIt = mChildren.begin();
193cdf0e10cSrcweir             // --> OD 2008-11-26 #158694#
194cdf0e10cSrcweir             (*aIt)->mbContinueingPreviousSubTree = false;
195cdf0e10cSrcweir             // <--
196cdf0e10cSrcweir 
197cdf0e10cSrcweir             // determine default start value
198cdf0e10cSrcweir             // consider the case that the first child isn't counted.
199cdf0e10cSrcweir             nTmpNumber = (*aIt)->GetStartValue();
200cdf0e10cSrcweir             if ( !(*aIt)->IsCounted() &&
201cdf0e10cSrcweir                  ( !(*aIt)->HasCountedChildren() || (*aIt)->IsPhantom() ) )
202cdf0e10cSrcweir             {
203cdf0e10cSrcweir                 --nTmpNumber;
204cdf0e10cSrcweir             }
205cdf0e10cSrcweir 
206cdf0e10cSrcweir             // determine special start value for the case that first child
207cdf0e10cSrcweir             // doesn't restart the numbering and the parent node isn't counted
208cdf0e10cSrcweir             // and isn't the first child.
209cdf0e10cSrcweir             // --> OD 2005-10-27 #126009#
210cdf0e10cSrcweir             const bool bParentCounted( IsCounted() &&
211cdf0e10cSrcweir                                        ( !IsPhantom() ||
212cdf0e10cSrcweir                                          HasPhantomCountedParent() ) );
213cdf0e10cSrcweir             // <--
214cdf0e10cSrcweir             if ( !(*aIt)->IsRestart() &&
215cdf0e10cSrcweir                  GetParent() && !bParentCounted )
216cdf0e10cSrcweir             {
217*24b62240SHerbert Dürr                 tSwNumberTreeChildren::const_iterator aParentChildIt =
218cdf0e10cSrcweir                                                 GetParent()->GetIterator( this );
219cdf0e10cSrcweir                 while ( aParentChildIt != GetParent()->mChildren.begin() )
220cdf0e10cSrcweir                 {
221cdf0e10cSrcweir                     --aParentChildIt;
222cdf0e10cSrcweir                     SwNumberTreeNode* pPrevNode( *aParentChildIt );
223cdf0e10cSrcweir                     if ( pPrevNode->GetChildCount() > 0 )
224cdf0e10cSrcweir                     {
225cdf0e10cSrcweir                         // --> OD 2008-11-26 #158694#
226cdf0e10cSrcweir                         (*aIt)->mbContinueingPreviousSubTree = true;
227cdf0e10cSrcweir                         // <--
228cdf0e10cSrcweir                         nTmpNumber = (*(pPrevNode->mChildren.rbegin()))->GetNumber();
229cdf0e10cSrcweir                         // --> OD 2005-10-27 #126009#
230cdf0e10cSrcweir                         if ( (*aIt)->IsCounted() &&
231cdf0e10cSrcweir                              ( !(*aIt)->IsPhantom() ||
232cdf0e10cSrcweir                                (*aIt)->HasPhantomCountedParent() ) )
233cdf0e10cSrcweir                         // <--
234cdf0e10cSrcweir                         {
235cdf0e10cSrcweir                             ++nTmpNumber;
236cdf0e10cSrcweir                         }
237cdf0e10cSrcweir                         break;
238cdf0e10cSrcweir                     }
239cdf0e10cSrcweir                     else if ( pPrevNode->IsCounted() )
240cdf0e10cSrcweir                     {
241cdf0e10cSrcweir                         break;
242cdf0e10cSrcweir                     }
243cdf0e10cSrcweir                     else
244cdf0e10cSrcweir                     {
245cdf0e10cSrcweir                         // Previous node has no children and is not counted.
246cdf0e10cSrcweir                         // Thus, next turn and check for the previous node.
247cdf0e10cSrcweir                     }
248cdf0e10cSrcweir                 }
249cdf0e10cSrcweir             }
250cdf0e10cSrcweir 
251cdf0e10cSrcweir             (*aIt)->mnNumber = nTmpNumber;
252cdf0e10cSrcweir         }
253cdf0e10cSrcweir 
254cdf0e10cSrcweir         while (aIt != aValidateIt)
255cdf0e10cSrcweir         {
256cdf0e10cSrcweir             ++aIt;
257cdf0e10cSrcweir             // --> OD 2008-11-26 #158694#
258cdf0e10cSrcweir             (*aIt)->mbContinueingPreviousSubTree = false;
259cdf0e10cSrcweir             // <--
260cdf0e10cSrcweir 
261cdf0e10cSrcweir             // --> OD 2005-10-19 #126009# - only for counted nodes the number
262cdf0e10cSrcweir             // has to be adjusted, compared to the previous node.
263cdf0e10cSrcweir             // this condition is hold also for nodes, which restart the numbering.
264cdf0e10cSrcweir             if ( (*aIt)->IsCounted() )
265cdf0e10cSrcweir             {
266cdf0e10cSrcweir                 if ((*aIt)->IsRestart())
267cdf0e10cSrcweir                     nTmpNumber = (*aIt)->GetStartValue();
268cdf0e10cSrcweir                 else
269cdf0e10cSrcweir                     ++nTmpNumber;
270cdf0e10cSrcweir             }
271cdf0e10cSrcweir             // <--
272cdf0e10cSrcweir 
273cdf0e10cSrcweir             (*aIt)->mnNumber = nTmpNumber;
274cdf0e10cSrcweir         }
275cdf0e10cSrcweir         // <--
276cdf0e10cSrcweir 
277cdf0e10cSrcweir         SetLastValid(aIt, true);
278cdf0e10cSrcweir     }
279cdf0e10cSrcweir }
280cdf0e10cSrcweir 
ValidateContinuous(const SwNumberTreeNode * pNode) const281cdf0e10cSrcweir void SwNumberTreeNode::ValidateContinuous(const SwNumberTreeNode * pNode) const
282cdf0e10cSrcweir {
283*24b62240SHerbert Dürr     tSwNumberTreeChildren::const_iterator aIt = mItLastValid;
284cdf0e10cSrcweir 
285cdf0e10cSrcweir     SwNumberTree::tSwNumTreeNumber nTmpNumber = 0;
286cdf0e10cSrcweir 
287cdf0e10cSrcweir     do
288cdf0e10cSrcweir     {
289cdf0e10cSrcweir         if (aIt == mChildren.end())
290cdf0e10cSrcweir         {
291cdf0e10cSrcweir             aIt = mChildren.begin();
292cdf0e10cSrcweir 
293cdf0e10cSrcweir             nTmpNumber = GetStartValue();
294cdf0e10cSrcweir         }
295cdf0e10cSrcweir         else
296cdf0e10cSrcweir             aIt++;
297cdf0e10cSrcweir 
298cdf0e10cSrcweir         if (aIt != mChildren.end())
299cdf0e10cSrcweir         {
300cdf0e10cSrcweir             SwNumberTreeNode * pPred = (*aIt)->GetPred();
301cdf0e10cSrcweir 
302cdf0e10cSrcweir             // --> OD 2006-04-21 #i64311#
303cdf0e10cSrcweir             // correct consideration of phantoms
304cdf0e10cSrcweir             // correct consideration of restart at a number tree node
305cdf0e10cSrcweir             if ( pPred )
306cdf0e10cSrcweir             {
307cdf0e10cSrcweir                 if ( !(*aIt)->IsCounted() )
308cdf0e10cSrcweir                     // --> OD 2006-05-12 #i65284#
309cdf0e10cSrcweir                     nTmpNumber = pPred->GetNumber( pPred->GetParent() != (*aIt)->GetParent() );
310cdf0e10cSrcweir                     // <--
311cdf0e10cSrcweir                 else
312cdf0e10cSrcweir                 {
313cdf0e10cSrcweir                     if ( (*aIt)->IsRestart() )
314cdf0e10cSrcweir                         nTmpNumber = (*aIt)->GetStartValue();
315cdf0e10cSrcweir                     else
316cdf0e10cSrcweir                         nTmpNumber = pPred->GetNumber( pPred->GetParent() != (*aIt)->GetParent() ) + 1;
317cdf0e10cSrcweir                 }
318cdf0e10cSrcweir             }
319cdf0e10cSrcweir             else
320cdf0e10cSrcweir             {
321cdf0e10cSrcweir                 if ( !(*aIt)->IsCounted() )
322cdf0e10cSrcweir                     nTmpNumber = GetStartValue() - 1;
323cdf0e10cSrcweir                 else
324cdf0e10cSrcweir                 {
325cdf0e10cSrcweir                     if ( (*aIt)->IsRestart() )
326cdf0e10cSrcweir                         nTmpNumber = (*aIt)->GetStartValue();
327cdf0e10cSrcweir                     else
328cdf0e10cSrcweir                        nTmpNumber = GetStartValue();
329cdf0e10cSrcweir                 }
330cdf0e10cSrcweir             }
331cdf0e10cSrcweir             // <--
332cdf0e10cSrcweir 
333cdf0e10cSrcweir             (*aIt)->mnNumber = nTmpNumber;
334cdf0e10cSrcweir         }
335cdf0e10cSrcweir     }
336cdf0e10cSrcweir     while (aIt != mChildren.end() && *aIt != pNode);
337cdf0e10cSrcweir 
338cdf0e10cSrcweir     // --> OD 2008-05-21 #i74748# - applied patch from garnier_romain
339cdf0e10cSrcweir     // number tree node has to be validated.
340cdf0e10cSrcweir //    SetLastValid(aIt);
341cdf0e10cSrcweir     SetLastValid( aIt, true );
342cdf0e10cSrcweir     // <--
343cdf0e10cSrcweir }
344cdf0e10cSrcweir 
Validate(const SwNumberTreeNode * pNode) const345cdf0e10cSrcweir void SwNumberTreeNode::Validate(const SwNumberTreeNode * pNode) const
346cdf0e10cSrcweir {
347cdf0e10cSrcweir     if (! IsValid(pNode))
348cdf0e10cSrcweir     {
349cdf0e10cSrcweir         if (IsContinuous())
350cdf0e10cSrcweir             ValidateContinuous(pNode);
351cdf0e10cSrcweir         else
352cdf0e10cSrcweir             ValidateHierarchical(pNode);
353cdf0e10cSrcweir     }
354cdf0e10cSrcweir }
355cdf0e10cSrcweir 
ValidateTree()356cdf0e10cSrcweir void SwNumberTreeNode::ValidateTree()
357cdf0e10cSrcweir {
358cdf0e10cSrcweir     if (! IsContinuous())
359cdf0e10cSrcweir     {
360cdf0e10cSrcweir         {
361cdf0e10cSrcweir             tSwNumberTreeChildren::reverse_iterator aIt = mChildren.rbegin();
362cdf0e10cSrcweir 
363cdf0e10cSrcweir             if (aIt != mChildren.rend())
364cdf0e10cSrcweir                 Validate(*aIt);
365cdf0e10cSrcweir         }
366cdf0e10cSrcweir         {
367cdf0e10cSrcweir             tSwNumberTreeChildren::iterator aIt;
368cdf0e10cSrcweir 
369cdf0e10cSrcweir             for (aIt = mChildren.begin(); aIt != mChildren.end(); aIt++)
370cdf0e10cSrcweir                 (*aIt)->ValidateTree();
371cdf0e10cSrcweir         }
372cdf0e10cSrcweir     }
373cdf0e10cSrcweir     else
374cdf0e10cSrcweir     {
375cdf0e10cSrcweir         SwNumberTreeNode * pNode = GetLastDescendant();
376cdf0e10cSrcweir 
377cdf0e10cSrcweir         if (pNode && pNode->mpParent)
378cdf0e10cSrcweir             pNode->mpParent->Validate(pNode);
379cdf0e10cSrcweir     }
380cdf0e10cSrcweir }
381cdf0e10cSrcweir 
_GetNumberVector(vector<SwNumberTree::tSwNumTreeNumber> & rVector,bool bValidate) const382cdf0e10cSrcweir void SwNumberTreeNode::_GetNumberVector(vector<SwNumberTree::tSwNumTreeNumber> & rVector,
383cdf0e10cSrcweir                                         bool bValidate) const
384cdf0e10cSrcweir {
385cdf0e10cSrcweir     if (mpParent)
386cdf0e10cSrcweir     {
387cdf0e10cSrcweir         mpParent->_GetNumberVector(rVector, bValidate);
388cdf0e10cSrcweir         rVector.push_back(GetNumber(bValidate));
389cdf0e10cSrcweir     }
390cdf0e10cSrcweir }
391cdf0e10cSrcweir 
GetFirstNonPhantomChild()392cdf0e10cSrcweir SwNumberTreeNode * SwNumberTreeNode::GetFirstNonPhantomChild()
393cdf0e10cSrcweir {
394cdf0e10cSrcweir     if (IsPhantom())
395cdf0e10cSrcweir         return (*mChildren.begin())->GetFirstNonPhantomChild();
396cdf0e10cSrcweir 
397cdf0e10cSrcweir     return this;
398cdf0e10cSrcweir }
399cdf0e10cSrcweir 
400cdf0e10cSrcweir /** Moves all children of this node that are greater than a given node
401cdf0e10cSrcweir     to the destination node.
402cdf0e10cSrcweir 
403cdf0e10cSrcweir     OD 2005-10-14 #125991#
404cdf0e10cSrcweir */
MoveGreaterChildren(SwNumberTreeNode & _rCompareNode,SwNumberTreeNode & _rDestNode)405cdf0e10cSrcweir void SwNumberTreeNode::MoveGreaterChildren( SwNumberTreeNode& _rCompareNode,
406cdf0e10cSrcweir                                             SwNumberTreeNode& _rDestNode )
407cdf0e10cSrcweir {
408cdf0e10cSrcweir     if ( mChildren.size() == 0 )
409cdf0e10cSrcweir         return;
410cdf0e10cSrcweir 
411cdf0e10cSrcweir     // determine first child, which has to move to <_rDestNode>
412cdf0e10cSrcweir     tSwNumberTreeChildren::iterator aItUpper( mChildren.end() );
413cdf0e10cSrcweir     if ((*mChildren.begin())->IsPhantom() &&
414cdf0e10cSrcweir         _rCompareNode.LessThan(*(*mChildren.begin())->GetFirstNonPhantomChild()))
415cdf0e10cSrcweir     {
416cdf0e10cSrcweir         aItUpper = mChildren.begin();
417cdf0e10cSrcweir     }
418cdf0e10cSrcweir     else
419cdf0e10cSrcweir     {
420cdf0e10cSrcweir         aItUpper = mChildren.upper_bound(&_rCompareNode);
421cdf0e10cSrcweir     }
422cdf0e10cSrcweir 
423cdf0e10cSrcweir     // move children
424cdf0e10cSrcweir     if (aItUpper != mChildren.end())
425cdf0e10cSrcweir     {
426cdf0e10cSrcweir         tSwNumberTreeChildren::iterator aIt;
427cdf0e10cSrcweir         for (aIt = aItUpper; aIt != mChildren.end(); aIt++)
428cdf0e10cSrcweir             (*aIt)->mpParent = &_rDestNode;
429cdf0e10cSrcweir 
430cdf0e10cSrcweir         _rDestNode.mChildren.insert(aItUpper, mChildren.end());
431cdf0e10cSrcweir 
432cdf0e10cSrcweir         // --> OD 2006-01-17 #i60652#
433cdf0e10cSrcweir         // Because <mChildren.erase(aItUpper, mChildren.end())> could destroy
434cdf0e10cSrcweir         // the element, which is referenced by <mItLastValid>, it's needed to
435cdf0e10cSrcweir         // adjust <mItLastValid> before erasing <aIt>.
436cdf0e10cSrcweir         SetLastValid( mChildren.end() );
437cdf0e10cSrcweir         // <--
438cdf0e10cSrcweir 
439cdf0e10cSrcweir         mChildren.erase(aItUpper, mChildren.end());
440cdf0e10cSrcweir 
441cdf0e10cSrcweir         // --> OD 2006-01-17 #i60652#
442cdf0e10cSrcweir         if ( !mChildren.empty() )
443cdf0e10cSrcweir         {
444cdf0e10cSrcweir             SetLastValid( --(mChildren.end()) );
445cdf0e10cSrcweir         }
446cdf0e10cSrcweir         // <--
447cdf0e10cSrcweir     }
448cdf0e10cSrcweir 
449cdf0e10cSrcweir #ifdef __SW_NUMBER_TREE_SANITY_CHECK
450cdf0e10cSrcweir     if (! IsSane(false) || ! IsSane(&_rDestNode))
451cdf0e10cSrcweir         clog << __FUNCTION__ << "insanity!" << endl;
452cdf0e10cSrcweir #endif
453cdf0e10cSrcweir }
454cdf0e10cSrcweir 
MoveChildren(SwNumberTreeNode * pDest)455cdf0e10cSrcweir void SwNumberTreeNode::MoveChildren(SwNumberTreeNode * pDest)
456cdf0e10cSrcweir {
457cdf0e10cSrcweir     if (! mChildren.empty())
458cdf0e10cSrcweir     {
459cdf0e10cSrcweir         tSwNumberTreeChildren::iterator aItBegin = mChildren.begin();
460cdf0e10cSrcweir         SwNumberTreeNode * pMyFirst = *mChildren.begin();
461cdf0e10cSrcweir 
462cdf0e10cSrcweir         // --> OD 2006-01-17 #i60652#
463cdf0e10cSrcweir         // Because <mChildren.erase(aItBegin)> could destroy the element,
464cdf0e10cSrcweir         // which is referenced by <mItLastValid>, it's needed to adjust
465cdf0e10cSrcweir         // <mItLastValid> before erasing <aItBegin>.
466cdf0e10cSrcweir         SetLastValid(mChildren.end());
467cdf0e10cSrcweir         // <--
468cdf0e10cSrcweir 
469cdf0e10cSrcweir         if (pMyFirst->IsPhantom())
470cdf0e10cSrcweir         {
471cdf0e10cSrcweir             SwNumberTreeNode * pDestLast = NULL;
472cdf0e10cSrcweir 
473cdf0e10cSrcweir             if (pDest->mChildren.empty())
474cdf0e10cSrcweir                 pDestLast = pDest->CreatePhantom();
475cdf0e10cSrcweir             else
476cdf0e10cSrcweir                 pDestLast = *pDest->mChildren.rbegin();
477cdf0e10cSrcweir 
478cdf0e10cSrcweir             pMyFirst->MoveChildren(pDestLast);
479cdf0e10cSrcweir 
480cdf0e10cSrcweir             delete pMyFirst;
481cdf0e10cSrcweir             mChildren.erase(aItBegin);
482cdf0e10cSrcweir 
483cdf0e10cSrcweir             aItBegin = mChildren.begin();
484cdf0e10cSrcweir         }
485cdf0e10cSrcweir 
486cdf0e10cSrcweir         tSwNumberTreeChildren::iterator aIt;
487cdf0e10cSrcweir         for (aIt = mChildren.begin(); aIt != mChildren.end(); aIt++)
488cdf0e10cSrcweir             (*aIt)->mpParent = pDest;
489cdf0e10cSrcweir 
490cdf0e10cSrcweir         pDest->mChildren.insert(mChildren.begin(), mChildren.end());
491cdf0e10cSrcweir         mChildren.clear();
492cdf0e10cSrcweir         // --> OD 2006-03-08 #131436#
493cdf0e10cSrcweir         // <stl::set.clear()> destroys all existing iterators.
494cdf0e10cSrcweir         // Thus, <mItLastValid> is also destroyed and reset becomes necessary
495cdf0e10cSrcweir         mItLastValid = mChildren.end();
496cdf0e10cSrcweir         // <--
497cdf0e10cSrcweir     }
498cdf0e10cSrcweir 
499cdf0e10cSrcweir     ASSERT (mChildren.empty(), "MoveChildren failed!");
500cdf0e10cSrcweir 
501cdf0e10cSrcweir #ifdef __SW_NUMBER_TREE_SANITY_CHECK
502cdf0e10cSrcweir     ASSERT(IsSane(false) && pDest->IsSane(false), "insanity!");
503cdf0e10cSrcweir #endif
504cdf0e10cSrcweir }
505cdf0e10cSrcweir 
AddChild(SwNumberTreeNode * pChild,const int nDepth)506cdf0e10cSrcweir void SwNumberTreeNode::AddChild( SwNumberTreeNode * pChild,
507cdf0e10cSrcweir                                  const int nDepth )
508cdf0e10cSrcweir {
509cdf0e10cSrcweir     /*
510cdf0e10cSrcweir        Algorithm:
511cdf0e10cSrcweir 
512cdf0e10cSrcweir        Search first child A that is greater than pChild,
513cdf0e10cSrcweir          A may be the end of childs.
514cdf0e10cSrcweir        If nDepth > 0 then
515cdf0e10cSrcweir        {
516cdf0e10cSrcweir           if A is first child then
517cdf0e10cSrcweir             create new phantom child B at beginning of child list
518cdf0e10cSrcweir           else
519cdf0e10cSrcweir             B is A
520cdf0e10cSrcweir 
521cdf0e10cSrcweir           Add child to B with depth nDepth - 1.
522cdf0e10cSrcweir        }
523cdf0e10cSrcweir        else
524cdf0e10cSrcweir        {
525cdf0e10cSrcweir          Insert pNode before A.
526cdf0e10cSrcweir 
527cdf0e10cSrcweir          if A has predecessor B then
528cdf0e10cSrcweir            remove children of B that are greater as A and insert them as
529cdf0e10cSrcweir              children of A.
530cdf0e10cSrcweir        }
531cdf0e10cSrcweir 
532cdf0e10cSrcweir */
533cdf0e10cSrcweir 
534cdf0e10cSrcweir     // --> OD 2008-03-13 #refactorlists#
535cdf0e10cSrcweir     if ( nDepth < 0 )
536cdf0e10cSrcweir     {
537cdf0e10cSrcweir         ASSERT( false,
538cdf0e10cSrcweir                 "<SwNumberTreeNode::AddChild(..)> - parameter <nDepth> out of valid range. Serious defect -> please inform OD." );
539cdf0e10cSrcweir         return;
540cdf0e10cSrcweir     }
541cdf0e10cSrcweir     // <--
542cdf0e10cSrcweir 
543cdf0e10cSrcweir     if ( pChild->GetParent() != NULL || pChild->GetChildCount() > 0 )
544cdf0e10cSrcweir     {
545cdf0e10cSrcweir         ASSERT(false, "only orphans allowed.");
546cdf0e10cSrcweir         return;
547cdf0e10cSrcweir     }
548cdf0e10cSrcweir 
549cdf0e10cSrcweir     if (nDepth > 0)
550cdf0e10cSrcweir     {
551cdf0e10cSrcweir         tSwNumberTreeChildren::iterator aInsertDeepIt =
552cdf0e10cSrcweir             mChildren.upper_bound(pChild);
553cdf0e10cSrcweir 
554cdf0e10cSrcweir         ASSERT(! (aInsertDeepIt != mChildren.end() &&
555cdf0e10cSrcweir                   (*aInsertDeepIt)->IsPhantom()), " unexspected phantom");
556cdf0e10cSrcweir 
557cdf0e10cSrcweir 
558cdf0e10cSrcweir         if (aInsertDeepIt == mChildren.begin())
559cdf0e10cSrcweir         {
560cdf0e10cSrcweir             SwNumberTreeNode * pNew = CreatePhantom();
561cdf0e10cSrcweir 
562cdf0e10cSrcweir             SetLastValid(mChildren.end());
563cdf0e10cSrcweir 
564cdf0e10cSrcweir             if (pNew)
565cdf0e10cSrcweir                 pNew->AddChild(pChild, nDepth - 1);
566cdf0e10cSrcweir         }
567cdf0e10cSrcweir         else
568cdf0e10cSrcweir         {
569cdf0e10cSrcweir             aInsertDeepIt--;
570cdf0e10cSrcweir             (*aInsertDeepIt)->AddChild(pChild, nDepth - 1);
571cdf0e10cSrcweir         }
572cdf0e10cSrcweir 
573cdf0e10cSrcweir     }
574cdf0e10cSrcweir     else
575cdf0e10cSrcweir     {
576cdf0e10cSrcweir         // --> OD 2008-02-19 #refactorlists#
577cdf0e10cSrcweir         pChild->PreAdd();
578cdf0e10cSrcweir         // <--
579cdf0e10cSrcweir         std::pair<tSwNumberTreeChildren::iterator, bool> aResult =
580cdf0e10cSrcweir             mChildren.insert(pChild);
581cdf0e10cSrcweir 
582cdf0e10cSrcweir         if (aResult.second)
583cdf0e10cSrcweir         {
584cdf0e10cSrcweir             pChild->mpParent = this;
585cdf0e10cSrcweir             bool bNotification = pChild->IsNotificationEnabled();
586cdf0e10cSrcweir             tSwNumberTreeChildren::iterator aInsertedIt = aResult.first;
587cdf0e10cSrcweir 
588cdf0e10cSrcweir             if (aInsertedIt != mChildren.begin())
589cdf0e10cSrcweir             {
590cdf0e10cSrcweir                 tSwNumberTreeChildren::iterator aPredIt = aInsertedIt;
591cdf0e10cSrcweir                 aPredIt--;
592cdf0e10cSrcweir 
593cdf0e10cSrcweir                 // --> OD 2005-10-14 #125991#
594cdf0e10cSrcweir                 // Move greater children of previous node to new child.
595cdf0e10cSrcweir                 // This has to be done recursively on the children levels.
596cdf0e10cSrcweir                 // Initialize loop variables <pPrevChildNode> and <pDestNode>
597cdf0e10cSrcweir                 // for loop on children levels.
598cdf0e10cSrcweir                 SwNumberTreeNode* pPrevChildNode( *aPredIt );
599cdf0e10cSrcweir                 SwNumberTreeNode* pDestNode( pChild );
600cdf0e10cSrcweir                 while ( pDestNode && pPrevChildNode &&
601cdf0e10cSrcweir                         pPrevChildNode->GetChildCount() > 0 )
602cdf0e10cSrcweir                 {
603cdf0e10cSrcweir                     // move children
604cdf0e10cSrcweir                     pPrevChildNode->MoveGreaterChildren( *pChild, *pDestNode );
605cdf0e10cSrcweir 
606cdf0e10cSrcweir                     // prepare next loop:
607cdf0e10cSrcweir                     // - search of last child of <pPrevChildNode
608cdf0e10cSrcweir                     // - If found, determine destination node
609cdf0e10cSrcweir                     if ( pPrevChildNode->GetChildCount() > 0 )
610cdf0e10cSrcweir                     {
611cdf0e10cSrcweir                         tSwNumberTreeChildren::reverse_iterator aIt =
612cdf0e10cSrcweir                                         pPrevChildNode->mChildren.rbegin();
613cdf0e10cSrcweir                         pPrevChildNode = *aIt;
614cdf0e10cSrcweir                         // determine new destination node
615cdf0e10cSrcweir                         if ( pDestNode->GetChildCount() > 0 )
616cdf0e10cSrcweir                         {
617cdf0e10cSrcweir                             pDestNode = *(pDestNode->mChildren.begin());
618cdf0e10cSrcweir                             if ( !pDestNode->IsPhantom() )
619cdf0e10cSrcweir                             {
620cdf0e10cSrcweir                                 pDestNode = pDestNode->mpParent->CreatePhantom();
621cdf0e10cSrcweir                             }
622cdf0e10cSrcweir                         }
623cdf0e10cSrcweir                         else
624cdf0e10cSrcweir                         {
625cdf0e10cSrcweir                             pDestNode = pDestNode->CreatePhantom();
626cdf0e10cSrcweir                         }
627cdf0e10cSrcweir                     }
628cdf0e10cSrcweir                     else
629cdf0e10cSrcweir                     {
630cdf0e10cSrcweir                         // ready -> break loop.
631cdf0e10cSrcweir                         break;
632cdf0e10cSrcweir                     }
633cdf0e10cSrcweir                 }
634cdf0e10cSrcweir                 // assure that unnessary created phantoms at <pChild> are deleted.
635cdf0e10cSrcweir                 pChild->ClearObsoletePhantoms();
636cdf0e10cSrcweir                 // <--
637cdf0e10cSrcweir 
638cdf0e10cSrcweir                 if ((*aPredIt)->IsValid())
639cdf0e10cSrcweir                     SetLastValid(aPredIt);
640cdf0e10cSrcweir             }
641cdf0e10cSrcweir             else
642cdf0e10cSrcweir                 SetLastValid(mChildren.end());
643cdf0e10cSrcweir 
644cdf0e10cSrcweir             ClearObsoletePhantoms();
645cdf0e10cSrcweir 
646cdf0e10cSrcweir             if( bNotification )
647cdf0e10cSrcweir             {
648cdf0e10cSrcweir                 // --> OD 2005-10-20 #126009# - invalidation of not counted parent
649cdf0e10cSrcweir                 // and notification of its siblings.
650cdf0e10cSrcweir                 if ( !IsCounted() )
651cdf0e10cSrcweir                 {
652cdf0e10cSrcweir                     InvalidateMe();
653cdf0e10cSrcweir                     NotifyInvalidSiblings();
654cdf0e10cSrcweir                 }
655cdf0e10cSrcweir                 // <--
656cdf0e10cSrcweir                 NotifyInvalidChildren();
657cdf0e10cSrcweir             }
658cdf0e10cSrcweir         }
659cdf0e10cSrcweir     }
660cdf0e10cSrcweir 
661cdf0e10cSrcweir #ifdef __SW_NUMBER_TREE_SANITY_CHECK
662cdf0e10cSrcweir     if (! IsSane(false))
663cdf0e10cSrcweir         clog << __FUNCTION__ << ": insanity!" << endl;
664cdf0e10cSrcweir #endif
665cdf0e10cSrcweir }
666cdf0e10cSrcweir 
RemoveChild(SwNumberTreeNode * pChild)667cdf0e10cSrcweir void SwNumberTreeNode::RemoveChild(SwNumberTreeNode * pChild)
668cdf0e10cSrcweir {
669cdf0e10cSrcweir     /*
670cdf0e10cSrcweir        Algorithm:
671cdf0e10cSrcweir 
672cdf0e10cSrcweir        if pChild has predecessor A then
673cdf0e10cSrcweir          B is A
674cdf0e10cSrcweir        else
675cdf0e10cSrcweir          create phantom child B at beginning of child list
676cdf0e10cSrcweir 
677cdf0e10cSrcweir        Move children of pChild to B.
678cdf0e10cSrcweir     */
679cdf0e10cSrcweir 
680cdf0e10cSrcweir     if (pChild->IsPhantom())
681cdf0e10cSrcweir     {
682cdf0e10cSrcweir         ASSERT(false, "not applicable to phantoms!");
683cdf0e10cSrcweir 
684cdf0e10cSrcweir         return;
685cdf0e10cSrcweir     }
686cdf0e10cSrcweir 
687*24b62240SHerbert Dürr     tSwNumberTreeChildren::const_iterator aRemoveIt = GetIterator(pChild);
688cdf0e10cSrcweir 
689cdf0e10cSrcweir     if (aRemoveIt != mChildren.end())
690cdf0e10cSrcweir     {
691cdf0e10cSrcweir         SwNumberTreeNode * pRemove = *aRemoveIt;
692cdf0e10cSrcweir 
693cdf0e10cSrcweir         pRemove->mpParent = NULL;
694cdf0e10cSrcweir 
695*24b62240SHerbert Dürr         tSwNumberTreeChildren::const_iterator aItPred = mChildren.end();
696cdf0e10cSrcweir 
697cdf0e10cSrcweir         if (aRemoveIt == mChildren.begin())
698cdf0e10cSrcweir         {
699cdf0e10cSrcweir             if (! pRemove->mChildren.empty())
700cdf0e10cSrcweir             {
701cdf0e10cSrcweir                 CreatePhantom();
702cdf0e10cSrcweir 
703cdf0e10cSrcweir                 aItPred = mChildren.begin();
704cdf0e10cSrcweir             }
705cdf0e10cSrcweir         }
706cdf0e10cSrcweir         else
707cdf0e10cSrcweir         {
708cdf0e10cSrcweir             aItPred = aRemoveIt;
709cdf0e10cSrcweir 
710cdf0e10cSrcweir             aItPred--;
711cdf0e10cSrcweir         }
712cdf0e10cSrcweir 
713cdf0e10cSrcweir         if (! pRemove->mChildren.empty())
714cdf0e10cSrcweir         {
715cdf0e10cSrcweir             pRemove->MoveChildren(*aItPred);
716cdf0e10cSrcweir             // --> OD 2008-04-04 #refactorlists#
717cdf0e10cSrcweir             (*aItPred)->InvalidateTree();
718cdf0e10cSrcweir             (*aItPred)->NotifyInvalidChildren();
719cdf0e10cSrcweir             // <--
720cdf0e10cSrcweir         }
721cdf0e10cSrcweir 
722cdf0e10cSrcweir         // --> OD 2006-01-17 #i60652#
723cdf0e10cSrcweir         // Because <mChildren.erase(aRemoveIt)> could destroy the element,
724cdf0e10cSrcweir         // which is referenced by <mItLastValid>, it's needed to adjust
725cdf0e10cSrcweir         // <mItLastValid> before erasing <aRemoveIt>.
726cdf0e10cSrcweir         if (aItPred != mChildren.end() && (*aItPred)->IsPhantom())
727cdf0e10cSrcweir             SetLastValid(mChildren.end());
728cdf0e10cSrcweir         else
729cdf0e10cSrcweir             SetLastValid(aItPred);
730cdf0e10cSrcweir         // <--
731cdf0e10cSrcweir 
732cdf0e10cSrcweir         mChildren.erase(aRemoveIt);
733cdf0e10cSrcweir 
734cdf0e10cSrcweir         // --> OD 2008-04-04 #refactorlists#
735cdf0e10cSrcweir //        if (aItPred != mChildren.end())
736cdf0e10cSrcweir //            NotifyInvalidChildren();
737cdf0e10cSrcweir         NotifyInvalidChildren();
738cdf0e10cSrcweir         // <--
739cdf0e10cSrcweir     }
740cdf0e10cSrcweir     else
741cdf0e10cSrcweir     {
742cdf0e10cSrcweir         ASSERT(false, "RemoveChild: failed!");
743cdf0e10cSrcweir     }
744cdf0e10cSrcweir 
745cdf0e10cSrcweir     // --> OD 2008-02-19 #refactorlists#
746cdf0e10cSrcweir     pChild->PostRemove();
747cdf0e10cSrcweir     // <--
748cdf0e10cSrcweir }
749cdf0e10cSrcweir 
RemoveMe()750cdf0e10cSrcweir void SwNumberTreeNode::RemoveMe()
751cdf0e10cSrcweir {
752cdf0e10cSrcweir     if (mpParent)
753cdf0e10cSrcweir     {
754cdf0e10cSrcweir         SwNumberTreeNode * pSavedParent = mpParent;
755cdf0e10cSrcweir 
756cdf0e10cSrcweir         pSavedParent->RemoveChild(this);
757cdf0e10cSrcweir 
758cdf0e10cSrcweir         while (pSavedParent && pSavedParent->IsPhantom() &&
759cdf0e10cSrcweir                pSavedParent->HasOnlyPhantoms())
760cdf0e10cSrcweir             pSavedParent = pSavedParent->GetParent();
761cdf0e10cSrcweir 
762cdf0e10cSrcweir         if (pSavedParent)
763cdf0e10cSrcweir             pSavedParent->ClearObsoletePhantoms();
764cdf0e10cSrcweir 
765cdf0e10cSrcweir #ifdef __SW_NUMBER_TREE_SANITY_CHECK
766cdf0e10cSrcweir         if (! IsSane(false))
767cdf0e10cSrcweir             clog << __FUNCTION__ << ": insanity!" << endl;
768cdf0e10cSrcweir #endif
769cdf0e10cSrcweir     }
770cdf0e10cSrcweir }
771cdf0e10cSrcweir 
IsValid() const772cdf0e10cSrcweir bool SwNumberTreeNode::IsValid() const
773cdf0e10cSrcweir {
774cdf0e10cSrcweir     return mpParent ? mpParent->IsValid(this) : false;
775cdf0e10cSrcweir }
776cdf0e10cSrcweir 
GetNumber(bool bValidate) const777cdf0e10cSrcweir SwNumberTree::tSwNumTreeNumber SwNumberTreeNode::GetNumber(bool bValidate)
778cdf0e10cSrcweir     const
779cdf0e10cSrcweir {
780cdf0e10cSrcweir     if (bValidate && mpParent)
781cdf0e10cSrcweir         mpParent->Validate(this);
782cdf0e10cSrcweir 
783cdf0e10cSrcweir     return mnNumber;
784cdf0e10cSrcweir }
785cdf0e10cSrcweir 
786cdf0e10cSrcweir // --> OD 2008-11-26 #158694#
IsContinueingPreviousSubTree() const787cdf0e10cSrcweir bool SwNumberTreeNode::IsContinueingPreviousSubTree() const
788cdf0e10cSrcweir {
789cdf0e10cSrcweir     return mbContinueingPreviousSubTree;
790cdf0e10cSrcweir }
791cdf0e10cSrcweir // <--
792cdf0e10cSrcweir 
793cdf0e10cSrcweir 
GetNumberVector() const794cdf0e10cSrcweir vector<SwNumberTree::tSwNumTreeNumber> SwNumberTreeNode::GetNumberVector() const
795cdf0e10cSrcweir {
796cdf0e10cSrcweir     vector<SwNumberTree::tSwNumTreeNumber> aResult;
797cdf0e10cSrcweir 
798cdf0e10cSrcweir     _GetNumberVector(aResult);
799cdf0e10cSrcweir 
800cdf0e10cSrcweir     return aResult;
801cdf0e10cSrcweir }
802cdf0e10cSrcweir 
IsValid(const SwNumberTreeNode * pChild) const803cdf0e10cSrcweir bool SwNumberTreeNode::IsValid(const SwNumberTreeNode * pChild) const
804cdf0e10cSrcweir {
805cdf0e10cSrcweir   bool bResult = false;
806cdf0e10cSrcweir 
807cdf0e10cSrcweir   if (mItLastValid != mChildren.end())
808cdf0e10cSrcweir   {
809cdf0e10cSrcweir       if (pChild && pChild->mpParent == this)
810cdf0e10cSrcweir       {
811cdf0e10cSrcweir           bResult = ! (*mItLastValid)->LessThan(*pChild);
812cdf0e10cSrcweir       }
813cdf0e10cSrcweir   }
814cdf0e10cSrcweir 
815cdf0e10cSrcweir   return bResult;
816cdf0e10cSrcweir }
817cdf0e10cSrcweir 
IsPhantom() const818cdf0e10cSrcweir bool SwNumberTreeNode::IsPhantom() const
819cdf0e10cSrcweir {
820cdf0e10cSrcweir     return mbPhantom;
821cdf0e10cSrcweir }
822cdf0e10cSrcweir 
SetPhantom(bool _bPhantom)823cdf0e10cSrcweir void SwNumberTreeNode::SetPhantom(bool _bPhantom)
824cdf0e10cSrcweir {
825cdf0e10cSrcweir     mbPhantom = _bPhantom;
826cdf0e10cSrcweir }
827cdf0e10cSrcweir 
HasOnlyPhantoms() const828cdf0e10cSrcweir bool SwNumberTreeNode::HasOnlyPhantoms() const
829cdf0e10cSrcweir {
830cdf0e10cSrcweir     bool bResult = false;
831cdf0e10cSrcweir 
832cdf0e10cSrcweir     if (GetChildCount() == 1)
833cdf0e10cSrcweir     {
834cdf0e10cSrcweir         tSwNumberTreeChildren::const_iterator aIt = mChildren.begin();
835cdf0e10cSrcweir 
836cdf0e10cSrcweir         bResult = (*aIt)->IsPhantom() && (*aIt)->HasOnlyPhantoms();
837cdf0e10cSrcweir     }
838cdf0e10cSrcweir     else if (GetChildCount() == 0)
839cdf0e10cSrcweir         bResult = true;
840cdf0e10cSrcweir 
841cdf0e10cSrcweir     return bResult;
842cdf0e10cSrcweir }
843cdf0e10cSrcweir 
IsCounted() const844cdf0e10cSrcweir bool SwNumberTreeNode::IsCounted() const
845cdf0e10cSrcweir {
846cdf0e10cSrcweir     return !IsPhantom() ||
847cdf0e10cSrcweir             ( IsCountPhantoms() && HasCountedChildren() );
848cdf0e10cSrcweir }
849cdf0e10cSrcweir 
850cdf0e10cSrcweir // --> OD 2005-10-27 #126009#
HasPhantomCountedParent() const851cdf0e10cSrcweir bool SwNumberTreeNode::HasPhantomCountedParent() const
852cdf0e10cSrcweir {
853cdf0e10cSrcweir     bool bRet( false );
854cdf0e10cSrcweir 
855cdf0e10cSrcweir     ASSERT( IsPhantom(),
856cdf0e10cSrcweir             "<SwNumberTreeNode::HasPhantomCountedParent()> - wrong usage of method - it's only for phantoms" );
857cdf0e10cSrcweir     if ( IsPhantom() && mpParent )
858cdf0e10cSrcweir     {
859cdf0e10cSrcweir         if ( mpParent == GetRoot() )
860cdf0e10cSrcweir         {
861cdf0e10cSrcweir             bRet = true;
862cdf0e10cSrcweir         }
863cdf0e10cSrcweir         else if ( !mpParent->IsPhantom() )
864cdf0e10cSrcweir         {
865cdf0e10cSrcweir             bRet = mpParent->IsCounted();
866cdf0e10cSrcweir         }
867cdf0e10cSrcweir         else
868cdf0e10cSrcweir         {
869cdf0e10cSrcweir             bRet = mpParent->IsCounted() && mpParent->HasPhantomCountedParent();
870cdf0e10cSrcweir         }
871cdf0e10cSrcweir     }
872cdf0e10cSrcweir 
873cdf0e10cSrcweir     return bRet;
874cdf0e10cSrcweir }
875cdf0e10cSrcweir // <--
876cdf0e10cSrcweir 
IsFirst(const SwNumberTreeNode * pNode) const877cdf0e10cSrcweir bool SwNumberTreeNode::IsFirst(const SwNumberTreeNode * pNode) const
878cdf0e10cSrcweir {
879*24b62240SHerbert Dürr     tSwNumberTreeChildren::const_iterator aIt = mChildren.begin();
880cdf0e10cSrcweir 
881cdf0e10cSrcweir     if ((*aIt)->IsPhantom())
882cdf0e10cSrcweir         aIt++;
883cdf0e10cSrcweir 
884cdf0e10cSrcweir     return *aIt == pNode;
885cdf0e10cSrcweir }
886cdf0e10cSrcweir 
IsFirst() const887cdf0e10cSrcweir bool SwNumberTreeNode::IsFirst() const
888cdf0e10cSrcweir {
889cdf0e10cSrcweir     bool bResult = true;
890cdf0e10cSrcweir 
891cdf0e10cSrcweir     if (GetParent())
892cdf0e10cSrcweir     {
893cdf0e10cSrcweir         if (GetParent()->IsFirst(this))
894cdf0e10cSrcweir         {
895cdf0e10cSrcweir             SwNumberTreeNode * pNode = GetParent();
896cdf0e10cSrcweir 
897cdf0e10cSrcweir             while (pNode)
898cdf0e10cSrcweir             {
899cdf0e10cSrcweir                 if (!pNode->IsPhantom() && pNode->GetParent())
900cdf0e10cSrcweir                 {
901cdf0e10cSrcweir                     bResult = false;
902cdf0e10cSrcweir                     break;
903cdf0e10cSrcweir                 }
904cdf0e10cSrcweir 
905cdf0e10cSrcweir                 pNode = pNode->GetParent();
906cdf0e10cSrcweir             }
907cdf0e10cSrcweir 
908cdf0e10cSrcweir             // --> OD 2007-10-02 #b6600435#
909cdf0e10cSrcweir             // If node isn't the first child, it is the second child and the
910cdf0e10cSrcweir             // first child is a phanton. In this case check, if the first phantom
911cdf0e10cSrcweir             // child have only phanton childs
912cdf0e10cSrcweir             if ( bResult &&
913cdf0e10cSrcweir                  this != *(GetParent()->mChildren.begin()) &&
914cdf0e10cSrcweir                  !(*(GetParent()->mChildren.begin()))->HasOnlyPhantoms() )
915cdf0e10cSrcweir             {
916cdf0e10cSrcweir                 bResult = false;
917cdf0e10cSrcweir             }
918cdf0e10cSrcweir             // <--
919cdf0e10cSrcweir         }
920cdf0e10cSrcweir         else
921cdf0e10cSrcweir             bResult = false;
922cdf0e10cSrcweir     }
923cdf0e10cSrcweir 
924cdf0e10cSrcweir     return bResult;
925cdf0e10cSrcweir }
926cdf0e10cSrcweir 
927cdf0e10cSrcweir // --> OD 2008-03-13 #refactorlists#
SetLevelInListTree(const int nLevel)928cdf0e10cSrcweir void SwNumberTreeNode::SetLevelInListTree( const int nLevel )
929cdf0e10cSrcweir {
930cdf0e10cSrcweir     if ( nLevel < 0 )
931cdf0e10cSrcweir     {
932cdf0e10cSrcweir         ASSERT( false,
933cdf0e10cSrcweir                 "<SwNumberTreeNode::SetLevelInListTree(..)> - parameter <nLevel> out of valid range. Serious defect -> please inform OD." );
934cdf0e10cSrcweir         return;
935cdf0e10cSrcweir     }
936cdf0e10cSrcweir 
937cdf0e10cSrcweir     ASSERT( GetParent(),
938cdf0e10cSrcweir             "<SwNumberTreeNode::SetLevelInListTree(..)> - can only be called for number tree nodes in a list tree" );
939cdf0e10cSrcweir     if ( GetParent() )
940cdf0e10cSrcweir     {
941cdf0e10cSrcweir         if ( nLevel != GetLevelInListTree() )
942cdf0e10cSrcweir         {
943cdf0e10cSrcweir             SwNumberTreeNode* pRootTreeNode = GetRoot();
944cdf0e10cSrcweir             ASSERT( pRootTreeNode,
945cdf0e10cSrcweir                     "<SwNumberTreeNode::SetLevelInListTree(..)> - no root tree node found. Serious defect -> please inform OD." );
946cdf0e10cSrcweir 
947cdf0e10cSrcweir             RemoveMe();
948cdf0e10cSrcweir             pRootTreeNode->AddChild( this, nLevel );
949cdf0e10cSrcweir         }
950cdf0e10cSrcweir     }
951cdf0e10cSrcweir }
952cdf0e10cSrcweir // <--
953cdf0e10cSrcweir 
GetLevelInListTree() const954cdf0e10cSrcweir int SwNumberTreeNode::GetLevelInListTree() const
955cdf0e10cSrcweir {
956cdf0e10cSrcweir     if (mpParent)
957cdf0e10cSrcweir         return mpParent->GetLevelInListTree() + 1;
958cdf0e10cSrcweir 
959cdf0e10cSrcweir     return -1;
960cdf0e10cSrcweir }
961cdf0e10cSrcweir 
962cdf0e10cSrcweir SwNumberTreeNode::tSwNumberTreeChildren::size_type
GetChildCount() const963cdf0e10cSrcweir SwNumberTreeNode::GetChildCount() const
964cdf0e10cSrcweir {
965cdf0e10cSrcweir     return mChildren.size();
966cdf0e10cSrcweir }
967cdf0e10cSrcweir 
968cdf0e10cSrcweir #ifdef __SW_NUMBER_TREE_SANITY_CHECK
IsSane(bool bRecursive) const969cdf0e10cSrcweir bool SwNumberTreeNode::IsSane(bool bRecursive) const
970cdf0e10cSrcweir {
971cdf0e10cSrcweir     vector<const SwNumberTreeNode*> aParents;
972cdf0e10cSrcweir 
973cdf0e10cSrcweir     return IsSane(bRecursive, aParents);
974cdf0e10cSrcweir }
975cdf0e10cSrcweir 
IsSane(bool bRecursive,vector<const SwNumberTreeNode * > rParents) const976cdf0e10cSrcweir bool SwNumberTreeNode::IsSane(bool bRecursive,
977cdf0e10cSrcweir                               vector<const SwNumberTreeNode *> rParents)
978cdf0e10cSrcweir     const
979cdf0e10cSrcweir {
980cdf0e10cSrcweir     bool bResult = true;
981cdf0e10cSrcweir 
982cdf0e10cSrcweir     tSwNumberTreeChildren::const_iterator aIt;
983cdf0e10cSrcweir 
984cdf0e10cSrcweir     if (find(rParents.begin(), rParents.end(), this) != rParents.end())
985cdf0e10cSrcweir     {
986cdf0e10cSrcweir         ASSERT(false, " I'm my own ancestor!");
987cdf0e10cSrcweir 
988cdf0e10cSrcweir         bResult = false;
989cdf0e10cSrcweir     }
990cdf0e10cSrcweir 
991cdf0e10cSrcweir     if (! rParents.empty() && rParents.back() != mpParent)
992cdf0e10cSrcweir     {
993cdf0e10cSrcweir         ASSERT(false, " I'm a bastard!");
994cdf0e10cSrcweir 
995cdf0e10cSrcweir         bResult = false;
996cdf0e10cSrcweir     }
997cdf0e10cSrcweir 
998cdf0e10cSrcweir     rParents.push_back(this);
999cdf0e10cSrcweir 
1000cdf0e10cSrcweir     bool bFirst = true;
1001cdf0e10cSrcweir     for (aIt = mChildren.begin(); aIt != mChildren.end(); aIt++)
1002cdf0e10cSrcweir     {
1003cdf0e10cSrcweir         if (*aIt)
1004cdf0e10cSrcweir         {
1005cdf0e10cSrcweir             if ((*aIt)->IsPhantom())
1006cdf0e10cSrcweir             {
1007cdf0e10cSrcweir                 if ((*aIt)->HasOnlyPhantoms())
1008cdf0e10cSrcweir                 {
1009cdf0e10cSrcweir                     bResult = false;
1010cdf0e10cSrcweir                 }
1011cdf0e10cSrcweir 
1012cdf0e10cSrcweir                 if (! bFirst)
1013cdf0e10cSrcweir                 {
1014cdf0e10cSrcweir                     ASSERT(false, " found phantom not at first position.");
1015cdf0e10cSrcweir 
1016cdf0e10cSrcweir                     bResult = false;
1017cdf0e10cSrcweir                 }
1018cdf0e10cSrcweir             }
1019cdf0e10cSrcweir 
1020cdf0e10cSrcweir             if ((*aIt)->mpParent != (SwNumberTreeNode *) this)
1021cdf0e10cSrcweir             {
1022cdf0e10cSrcweir                 ASSERT(false, "found a bastard");
1023cdf0e10cSrcweir 
1024cdf0e10cSrcweir                 bResult = false;
1025cdf0e10cSrcweir             }
1026cdf0e10cSrcweir 
1027cdf0e10cSrcweir             if (mpParent)
1028cdf0e10cSrcweir             {
1029cdf0e10cSrcweir                 if  (!(*aIt)->IsPhantom() && (*aIt)->LessThan(*this))
1030cdf0e10cSrcweir                 {
1031cdf0e10cSrcweir                     ASSERT(false, " found child less than me");
1032cdf0e10cSrcweir 
1033cdf0e10cSrcweir                     bResult = false;
1034cdf0e10cSrcweir                 }
1035cdf0e10cSrcweir             }
1036cdf0e10cSrcweir         }
1037cdf0e10cSrcweir         else
1038cdf0e10cSrcweir         {
1039cdf0e10cSrcweir             ASSERT(false, "found child that is NULL");
1040cdf0e10cSrcweir             bResult = false;
1041cdf0e10cSrcweir         }
1042cdf0e10cSrcweir 
1043cdf0e10cSrcweir 	if (bRecursive)
1044cdf0e10cSrcweir 	  bResult = (*aIt)->IsSane(bRecursive, rParents) && bResult;
1045cdf0e10cSrcweir     }
1046cdf0e10cSrcweir 
1047cdf0e10cSrcweir     rParents.pop_back();
1048cdf0e10cSrcweir 
1049cdf0e10cSrcweir     return bResult;
1050cdf0e10cSrcweir }
1051cdf0e10cSrcweir #endif // __SW_NUMBER_TREE_SANITY_CHECK
1052cdf0e10cSrcweir 
1053*24b62240SHerbert Dürr SwNumberTreeNode::tSwNumberTreeChildren::const_iterator
GetIterator(const SwNumberTreeNode * pChild) const1054cdf0e10cSrcweir SwNumberTreeNode::GetIterator(const SwNumberTreeNode * pChild) const
1055cdf0e10cSrcweir {
1056*24b62240SHerbert Dürr     tSwNumberTreeChildren::const_iterator aItResult =
1057cdf0e10cSrcweir         mChildren.find(const_cast<SwNumberTreeNode *>(pChild));
1058cdf0e10cSrcweir 
1059cdf0e10cSrcweir     ASSERT( aItResult != mChildren.end(),
1060cdf0e10cSrcweir             "something went wrong getting the iterator for a child");
1061cdf0e10cSrcweir 
1062cdf0e10cSrcweir     return aItResult;
1063cdf0e10cSrcweir }
1064cdf0e10cSrcweir 
1065cdf0e10cSrcweir //String SwNumberTreeNode::print(const String & rIndent,
1066cdf0e10cSrcweir //                               const String & rMyIndent,
1067cdf0e10cSrcweir //                               int nDepth) const
1068cdf0e10cSrcweir //{
1069cdf0e10cSrcweir //  String aStr = rIndent;
1070cdf0e10cSrcweir //  aStr += ToString();
1071cdf0e10cSrcweir //  aStr += String("\n", RTL_TEXTENCODING_ASCII_US);
1072cdf0e10cSrcweir 
1073cdf0e10cSrcweir //  if (nDepth != 0)
1074cdf0e10cSrcweir //  {
1075cdf0e10cSrcweir //      if (nDepth < 0)
1076cdf0e10cSrcweir //          nDepth = -1;
1077cdf0e10cSrcweir 
1078cdf0e10cSrcweir //      tSwNumberTreeChildren::const_iterator aIt;
1079cdf0e10cSrcweir //      for (aIt = mChildren.begin(); aIt != mChildren.end(); aIt++)
1080cdf0e10cSrcweir //      {
1081cdf0e10cSrcweir //          String aTmpStr(rIndent);
1082cdf0e10cSrcweir 
1083cdf0e10cSrcweir //          aTmpStr += rMyIndent;
1084cdf0e10cSrcweir //          aStr += (*aIt)->print(aTmpStr, rMyIndent, nDepth - 1);
1085cdf0e10cSrcweir //      }
1086cdf0e10cSrcweir //  }
1087cdf0e10cSrcweir 
1088cdf0e10cSrcweir //  return aStr;
1089cdf0e10cSrcweir //}
1090cdf0e10cSrcweir 
1091cdf0e10cSrcweir #ifdef DBG_UTIL
GetInstances()1092cdf0e10cSrcweir unsigned long SwNumberTreeNode::GetInstances()
1093cdf0e10cSrcweir {
1094cdf0e10cSrcweir     return nInstances;
1095cdf0e10cSrcweir }
1096cdf0e10cSrcweir 
GetSerial()1097cdf0e10cSrcweir unsigned long SwNumberTreeNode::GetSerial()
1098cdf0e10cSrcweir {
1099cdf0e10cSrcweir     return mnSerial;
1100cdf0e10cSrcweir }
1101cdf0e10cSrcweir #endif
1102cdf0e10cSrcweir 
SwNumberTreeNodeLessThan(const SwNumberTreeNode * pA,const SwNumberTreeNode * pB)1103cdf0e10cSrcweir bool SwNumberTreeNodeLessThan(const SwNumberTreeNode * pA,
1104cdf0e10cSrcweir                               const SwNumberTreeNode * pB)
1105cdf0e10cSrcweir {
1106cdf0e10cSrcweir   bool bResult = false;
1107cdf0e10cSrcweir 
1108cdf0e10cSrcweir   if (pA == NULL && pB != NULL)
1109cdf0e10cSrcweir     bResult = true;
1110cdf0e10cSrcweir   else if (pA != NULL && pB != NULL)
1111cdf0e10cSrcweir     bResult = pA->LessThan(*pB);
1112cdf0e10cSrcweir 
1113cdf0e10cSrcweir   return bResult;
1114cdf0e10cSrcweir }
1115cdf0e10cSrcweir 
GetLastDescendant() const1116cdf0e10cSrcweir SwNumberTreeNode * SwNumberTreeNode::GetLastDescendant() const
1117cdf0e10cSrcweir {
1118cdf0e10cSrcweir     SwNumberTreeNode * pResult = NULL;
1119*24b62240SHerbert Dürr     tSwNumberTreeChildren::const_reverse_iterator aIt = mChildren.rbegin();
1120cdf0e10cSrcweir 
1121cdf0e10cSrcweir     if (aIt != mChildren.rend())
1122cdf0e10cSrcweir     {
1123cdf0e10cSrcweir         pResult = (*aIt)->GetLastDescendant();
1124cdf0e10cSrcweir 
1125cdf0e10cSrcweir         if (! pResult)
1126cdf0e10cSrcweir             pResult = *aIt;
1127cdf0e10cSrcweir     }
1128cdf0e10cSrcweir 
1129cdf0e10cSrcweir     return pResult;
1130cdf0e10cSrcweir }
1131cdf0e10cSrcweir 
LessThan(const SwNumberTreeNode & rTreeNode) const1132cdf0e10cSrcweir bool SwNumberTreeNode::LessThan(const SwNumberTreeNode & rTreeNode) const
1133cdf0e10cSrcweir {
1134cdf0e10cSrcweir     return this < &rTreeNode;
1135cdf0e10cSrcweir }
1136cdf0e10cSrcweir 
GetPred(bool bSibling) const1137cdf0e10cSrcweir SwNumberTreeNode * SwNumberTreeNode::GetPred(bool bSibling) const
1138cdf0e10cSrcweir {
1139cdf0e10cSrcweir     SwNumberTreeNode * pResult = NULL;
1140cdf0e10cSrcweir 
1141cdf0e10cSrcweir     if (mpParent)
1142cdf0e10cSrcweir     {
1143*24b62240SHerbert Dürr         tSwNumberTreeChildren::const_iterator aIt =
1144cdf0e10cSrcweir             mpParent->GetIterator(this);
1145cdf0e10cSrcweir 
1146cdf0e10cSrcweir         if ( aIt == mpParent->mChildren.begin() )
1147cdf0e10cSrcweir         {
1148cdf0e10cSrcweir             // --> OD 2006-04-24 #i64311#
1149cdf0e10cSrcweir             // root node is no valid predecessor
1150cdf0e10cSrcweir             pResult = mpParent->GetParent() ? mpParent : NULL;
1151cdf0e10cSrcweir             // <--
1152cdf0e10cSrcweir         }
1153cdf0e10cSrcweir         else
1154cdf0e10cSrcweir         {
1155cdf0e10cSrcweir             aIt--;
1156cdf0e10cSrcweir 
1157cdf0e10cSrcweir             if ( !bSibling )
1158cdf0e10cSrcweir                 pResult = (*aIt)->GetLastDescendant();
1159cdf0e10cSrcweir             else
1160cdf0e10cSrcweir                 pResult = (*aIt);
1161cdf0e10cSrcweir 
1162cdf0e10cSrcweir             if (! pResult)
1163cdf0e10cSrcweir                 pResult = (*aIt);
1164cdf0e10cSrcweir         }
1165cdf0e10cSrcweir     }
1166cdf0e10cSrcweir 
1167cdf0e10cSrcweir     return pResult;
1168cdf0e10cSrcweir }
1169cdf0e10cSrcweir 
SetLastValid(SwNumberTreeNode::tSwNumberTreeChildren::const_iterator aItValid,bool bValidating) const1170cdf0e10cSrcweir void SwNumberTreeNode::SetLastValid
1171*24b62240SHerbert Dürr                     ( SwNumberTreeNode::tSwNumberTreeChildren::const_iterator aItValid,
1172cdf0e10cSrcweir                       bool bValidating ) const
1173cdf0e10cSrcweir {
1174cdf0e10cSrcweir     ASSERT( (aItValid == mChildren.end() || GetIterator(*aItValid) != mChildren.end()),
1175cdf0e10cSrcweir             "last-valid iterator");
1176cdf0e10cSrcweir 
1177cdf0e10cSrcweir     if (
1178cdf0e10cSrcweir         bValidating ||
1179cdf0e10cSrcweir         aItValid == mChildren.end() ||
1180cdf0e10cSrcweir          (mItLastValid != mChildren.end() &&
1181cdf0e10cSrcweir           (*aItValid)->LessThan(**mItLastValid))
1182cdf0e10cSrcweir         )
1183cdf0e10cSrcweir     {
1184cdf0e10cSrcweir         mItLastValid = aItValid;
1185cdf0e10cSrcweir         // --> OD 2005-10-19 #126009# - invalidation of children of next not
1186cdf0e10cSrcweir         // counted is needed
1187cdf0e10cSrcweir         if ( GetParent() )
1188cdf0e10cSrcweir         {
1189*24b62240SHerbert Dürr             tSwNumberTreeChildren::const_iterator aParentChildIt =
1190cdf0e10cSrcweir                                             GetParent()->GetIterator( this );
1191cdf0e10cSrcweir             ++aParentChildIt;
1192cdf0e10cSrcweir             if ( aParentChildIt != GetParent()->mChildren.end() )
1193cdf0e10cSrcweir             {
1194cdf0e10cSrcweir                 SwNumberTreeNode* pNextNode( *aParentChildIt );
1195cdf0e10cSrcweir                 if ( !pNextNode->IsCounted() )
1196cdf0e10cSrcweir                 {
1197cdf0e10cSrcweir                     pNextNode->InvalidateChildren();
1198cdf0e10cSrcweir                 }
1199cdf0e10cSrcweir             }
1200cdf0e10cSrcweir         }
1201cdf0e10cSrcweir         // <--
1202cdf0e10cSrcweir     }
1203cdf0e10cSrcweir 
1204cdf0e10cSrcweir     {
1205cdf0e10cSrcweir         if (IsContinuous())
1206cdf0e10cSrcweir         {
1207*24b62240SHerbert Dürr             tSwNumberTreeChildren::const_iterator aIt = mItLastValid;
1208cdf0e10cSrcweir 
1209cdf0e10cSrcweir             if (aIt != mChildren.end())
1210cdf0e10cSrcweir                 aIt++;
1211cdf0e10cSrcweir             else
1212cdf0e10cSrcweir                 aIt = mChildren.begin();
1213cdf0e10cSrcweir 
1214cdf0e10cSrcweir             while (aIt != mChildren.end())
1215cdf0e10cSrcweir             {
1216cdf0e10cSrcweir                 (*aIt)->InvalidateTree();
1217cdf0e10cSrcweir 
1218cdf0e10cSrcweir                 aIt++;
1219cdf0e10cSrcweir             }
1220cdf0e10cSrcweir 
1221cdf0e10cSrcweir             SetLastValid(bValidating);
1222cdf0e10cSrcweir         }
1223cdf0e10cSrcweir     }
1224cdf0e10cSrcweir }
1225cdf0e10cSrcweir 
SetLastValid(bool bValidating) const1226cdf0e10cSrcweir void SwNumberTreeNode::SetLastValid(bool bValidating) const
1227cdf0e10cSrcweir {
1228cdf0e10cSrcweir     if (mpParent)
1229cdf0e10cSrcweir     {
1230*24b62240SHerbert Dürr         tSwNumberTreeChildren::const_iterator aIt = mpParent->GetIterator(this);
1231cdf0e10cSrcweir 
1232cdf0e10cSrcweir         mpParent->SetLastValid(aIt, bValidating);
1233cdf0e10cSrcweir     }
1234cdf0e10cSrcweir }
1235cdf0e10cSrcweir 
InvalidateTree() const1236cdf0e10cSrcweir void SwNumberTreeNode::InvalidateTree() const
1237cdf0e10cSrcweir {
1238cdf0e10cSrcweir     // do not call SetInvalid, would cause loop !!!
1239cdf0e10cSrcweir     mItLastValid = mChildren.end();
1240cdf0e10cSrcweir 
1241*24b62240SHerbert Dürr     tSwNumberTreeChildren::const_iterator aIt;
1242cdf0e10cSrcweir 
1243cdf0e10cSrcweir     for (aIt = mChildren.begin(); aIt != mChildren.end(); aIt++)
1244cdf0e10cSrcweir         (*aIt)->InvalidateTree();
1245cdf0e10cSrcweir }
1246cdf0e10cSrcweir 
Invalidate(SwNumberTreeNode * pChild)1247cdf0e10cSrcweir void SwNumberTreeNode::Invalidate(SwNumberTreeNode * pChild)
1248cdf0e10cSrcweir {
1249cdf0e10cSrcweir     if (pChild->IsValid())
1250cdf0e10cSrcweir     {
1251*24b62240SHerbert Dürr         tSwNumberTreeChildren::const_iterator aIt = GetIterator(pChild);
1252cdf0e10cSrcweir 
1253cdf0e10cSrcweir         if (aIt != mChildren.begin())
1254cdf0e10cSrcweir             aIt--;
1255cdf0e10cSrcweir         else
1256cdf0e10cSrcweir             aIt = mChildren.end();
1257cdf0e10cSrcweir 
1258cdf0e10cSrcweir         SetLastValid(aIt);
1259cdf0e10cSrcweir 
1260cdf0e10cSrcweir     }
1261cdf0e10cSrcweir }
1262cdf0e10cSrcweir 
InvalidateMe()1263cdf0e10cSrcweir void SwNumberTreeNode::InvalidateMe()
1264cdf0e10cSrcweir {
1265cdf0e10cSrcweir     if (mpParent)
1266cdf0e10cSrcweir         mpParent->Invalidate(this);
1267cdf0e10cSrcweir }
1268cdf0e10cSrcweir 
ValidateMe()1269cdf0e10cSrcweir void SwNumberTreeNode::ValidateMe()
1270cdf0e10cSrcweir {
1271cdf0e10cSrcweir     if (mpParent)
1272cdf0e10cSrcweir         mpParent->Validate(this);
1273cdf0e10cSrcweir }
1274cdf0e10cSrcweir 
Notify()1275cdf0e10cSrcweir void SwNumberTreeNode::Notify()
1276cdf0e10cSrcweir {
1277cdf0e10cSrcweir     if (IsNotifiable())
1278cdf0e10cSrcweir     {
1279cdf0e10cSrcweir         if (! IsPhantom())
1280cdf0e10cSrcweir             NotifyNode();
1281cdf0e10cSrcweir 
1282cdf0e10cSrcweir         tSwNumberTreeChildren::iterator aIt;
1283cdf0e10cSrcweir 
1284cdf0e10cSrcweir         for (aIt = mChildren.begin(); aIt != mChildren.end(); aIt++)
1285cdf0e10cSrcweir             (*aIt)->Notify();
1286cdf0e10cSrcweir     }
1287cdf0e10cSrcweir }
1288cdf0e10cSrcweir 
NotifyInvalidChildren()1289cdf0e10cSrcweir void SwNumberTreeNode::NotifyInvalidChildren()
1290cdf0e10cSrcweir {
1291cdf0e10cSrcweir     if (IsNotifiable())
1292cdf0e10cSrcweir     {
1293*24b62240SHerbert Dürr         tSwNumberTreeChildren::const_iterator aIt = mItLastValid;
1294cdf0e10cSrcweir 
1295cdf0e10cSrcweir         if (aIt == mChildren.end())
1296cdf0e10cSrcweir             aIt = mChildren.begin();
1297cdf0e10cSrcweir         else
1298cdf0e10cSrcweir             aIt++;
1299cdf0e10cSrcweir 
1300cdf0e10cSrcweir         while (aIt != mChildren.end())
1301cdf0e10cSrcweir         {
1302cdf0e10cSrcweir             (*aIt)->Notify();
1303cdf0e10cSrcweir 
1304cdf0e10cSrcweir             aIt++;
1305cdf0e10cSrcweir         }
1306cdf0e10cSrcweir         // --> OD 2005-10-19 #126009# - notification of next not counted node
1307cdf0e10cSrcweir         // is also needed.
1308cdf0e10cSrcweir         if ( GetParent() )
1309cdf0e10cSrcweir         {
1310*24b62240SHerbert Dürr             tSwNumberTreeChildren::const_iterator aParentChildIt =
1311cdf0e10cSrcweir                                             GetParent()->GetIterator( this );
1312cdf0e10cSrcweir             ++aParentChildIt;
1313cdf0e10cSrcweir             if ( aParentChildIt != GetParent()->mChildren.end() )
1314cdf0e10cSrcweir             {
1315cdf0e10cSrcweir                 SwNumberTreeNode* pNextNode( *aParentChildIt );
1316cdf0e10cSrcweir                 if ( !pNextNode->IsCounted() )
1317cdf0e10cSrcweir                 {
1318cdf0e10cSrcweir                     pNextNode->NotifyInvalidChildren();
1319cdf0e10cSrcweir                 }
1320cdf0e10cSrcweir             }
1321cdf0e10cSrcweir         }
1322cdf0e10cSrcweir 
1323cdf0e10cSrcweir         // <--
1324cdf0e10cSrcweir     }
1325cdf0e10cSrcweir 
1326cdf0e10cSrcweir     if (IsContinuous() && mpParent)
1327cdf0e10cSrcweir         mpParent->NotifyInvalidChildren();
1328cdf0e10cSrcweir }
1329cdf0e10cSrcweir 
NotifyInvalidSiblings()1330cdf0e10cSrcweir void SwNumberTreeNode::NotifyInvalidSiblings()
1331cdf0e10cSrcweir {
1332cdf0e10cSrcweir     if (mpParent != NULL)
1333cdf0e10cSrcweir         mpParent->NotifyInvalidChildren();
1334cdf0e10cSrcweir }
1335cdf0e10cSrcweir 
1336cdf0e10cSrcweir // --> OD 2007-09-07 #i81002#
GetPrecedingNodeOf(const SwNumberTreeNode & rNode) const1337cdf0e10cSrcweir const SwNumberTreeNode* SwNumberTreeNode::GetPrecedingNodeOf(
1338cdf0e10cSrcweir                                         const SwNumberTreeNode& rNode ) const
1339cdf0e10cSrcweir {
1340cdf0e10cSrcweir     const SwNumberTreeNode* pPrecedingNode( 0 );
1341cdf0e10cSrcweir 
1342cdf0e10cSrcweir     if ( GetChildCount() > 0 )
1343cdf0e10cSrcweir     {
1344cdf0e10cSrcweir         tSwNumberTreeChildren::const_iterator aUpperBoundIt =
1345cdf0e10cSrcweir                 mChildren.upper_bound( const_cast<SwNumberTreeNode*>(&rNode) );
1346cdf0e10cSrcweir         if ( aUpperBoundIt != mChildren.begin() )
1347cdf0e10cSrcweir         {
1348cdf0e10cSrcweir             --aUpperBoundIt;
1349cdf0e10cSrcweir             pPrecedingNode = (*aUpperBoundIt)->GetPrecedingNodeOf( rNode );
1350cdf0e10cSrcweir         }
1351cdf0e10cSrcweir     }
1352cdf0e10cSrcweir 
1353cdf0e10cSrcweir     if ( pPrecedingNode == 0 && GetRoot() )
1354cdf0e10cSrcweir     {
1355cdf0e10cSrcweir         // <this> node has no children or the given node precedes all its children
1356cdf0e10cSrcweir         // and the <this> node isn't the root node.
1357cdf0e10cSrcweir         // Thus, compare the given node with the <this> node in order to check,
1358cdf0e10cSrcweir         // if the <this> node precedes the given node.
1359cdf0e10cSrcweir         if ( !(rNode.LessThan( *this )) )
1360cdf0e10cSrcweir         {
1361cdf0e10cSrcweir             pPrecedingNode = this;
1362cdf0e10cSrcweir         }
1363cdf0e10cSrcweir     }
1364cdf0e10cSrcweir 
1365cdf0e10cSrcweir     return pPrecedingNode;
1366cdf0e10cSrcweir }
1367cdf0e10cSrcweir // <--
1368cdf0e10cSrcweir 
1369cdf0e10cSrcweir // --> OD 2008-04-17 #refactorlists#
NotifyNodesOnListLevel(const int nListLevel)1370cdf0e10cSrcweir void SwNumberTreeNode::NotifyNodesOnListLevel( const int nListLevel )
1371cdf0e10cSrcweir {
1372cdf0e10cSrcweir     if ( nListLevel < 0 )
1373cdf0e10cSrcweir     {
1374cdf0e10cSrcweir         ASSERT( false,
1375cdf0e10cSrcweir                 "<SwNumberTreeNode::NotifyNodesOnListLevel(..)> - invalid list level provided" );
1376cdf0e10cSrcweir         return;
1377cdf0e10cSrcweir     }
1378cdf0e10cSrcweir 
1379cdf0e10cSrcweir     SwNumberTreeNode* pRootNode = GetParent() ? GetRoot() : this;
1380cdf0e10cSrcweir 
1381cdf0e10cSrcweir     pRootNode->NotifyChildrenOnDepth( nListLevel );
1382cdf0e10cSrcweir }
1383cdf0e10cSrcweir 
NotifyChildrenOnDepth(const int nDepth)1384cdf0e10cSrcweir void SwNumberTreeNode::NotifyChildrenOnDepth( const int nDepth )
1385cdf0e10cSrcweir {
1386cdf0e10cSrcweir     ASSERT( nDepth >= 0,
1387cdf0e10cSrcweir             "<SwNumberTreeNode::NotifyChildrenOnDepth(..)> - misusage" );
1388cdf0e10cSrcweir 
1389cdf0e10cSrcweir     SwNumberTreeNode::tSwNumberTreeChildren::iterator aChildIter =
1390cdf0e10cSrcweir                                                             mChildren.begin();
1391cdf0e10cSrcweir     while ( aChildIter != mChildren.end() )
1392cdf0e10cSrcweir     {
1393cdf0e10cSrcweir         if ( nDepth == 0 )
1394cdf0e10cSrcweir         {
1395cdf0e10cSrcweir             (*aChildIter)->NotifyNode();
1396cdf0e10cSrcweir         }
1397cdf0e10cSrcweir         else
1398cdf0e10cSrcweir         {
1399cdf0e10cSrcweir             (*aChildIter)->NotifyChildrenOnDepth( nDepth - 1 );
1400cdf0e10cSrcweir         }
1401cdf0e10cSrcweir 
1402cdf0e10cSrcweir         ++aChildIter;
1403cdf0e10cSrcweir     }
1404cdf0e10cSrcweir }
1405cdf0e10cSrcweir // <--
1406