xref: /aoo41x/main/sw/source/core/doc/docnum.cxx (revision 69a74367)
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 <hintids.hxx>
283d14cea3SMichael Stahl #include <rtl/random.h>
29cdf0e10cSrcweir #include <tools/resid.hxx>
30cdf0e10cSrcweir #include <editeng/lrspitem.hxx>
31cdf0e10cSrcweir #include <ftninfo.hxx>
32cdf0e10cSrcweir #include <ftnidx.hxx>
33cdf0e10cSrcweir #include <doc.hxx>
34cdf0e10cSrcweir #include <IDocumentUndoRedo.hxx>
35cdf0e10cSrcweir #include <pam.hxx>
36cdf0e10cSrcweir #include <ndtxt.hxx>
37cdf0e10cSrcweir #include <doctxm.hxx>		// pTOXBaseRing
38cdf0e10cSrcweir #include <poolfmt.hxx>
39cdf0e10cSrcweir #include <UndoCore.hxx>
40cdf0e10cSrcweir #include <UndoRedline.hxx>
41cdf0e10cSrcweir #include <UndoNumbering.hxx>
42cdf0e10cSrcweir #include <swundo.hxx>
43cdf0e10cSrcweir #include <SwUndoFmt.hxx>
44cdf0e10cSrcweir #include <rolbck.hxx>
45cdf0e10cSrcweir #include <paratr.hxx>
46cdf0e10cSrcweir #include <docary.hxx>
47cdf0e10cSrcweir #include <mvsave.hxx>
48cdf0e10cSrcweir #include <txtfrm.hxx>
49cdf0e10cSrcweir #include <pamtyp.hxx>
50cdf0e10cSrcweir #include <redline.hxx>
51cdf0e10cSrcweir #include <comcore.hrc>
52cdf0e10cSrcweir #include <editeng/adjitem.hxx>
53cdf0e10cSrcweir #include <editeng/frmdiritem.hxx>
54cdf0e10cSrcweir #include <frmatr.hxx>
55cdf0e10cSrcweir #include <SwStyleNameMapper.hxx>
56cdf0e10cSrcweir #include <SwNodeNum.hxx>
57cdf0e10cSrcweir #include <list.hxx>
58cdf0e10cSrcweir #include <listfunc.hxx>
59cdf0e10cSrcweir #include <switerator.hxx>
60cdf0e10cSrcweir 
61cdf0e10cSrcweir #include <map>
62cdf0e10cSrcweir 
63b264d727SArmin Le Grand #include <stdlib.h>
64b264d727SArmin Le Grand 
65b264d727SArmin Le Grand 
GetUpperLvlChg(sal_uInt8 nCurLvl,sal_uInt8 nLevel,sal_uInt16 nMask)66cdf0e10cSrcweir inline sal_uInt8 GetUpperLvlChg( sal_uInt8 nCurLvl, sal_uInt8 nLevel, sal_uInt16 nMask )
67cdf0e10cSrcweir {
68cdf0e10cSrcweir 	if( 1 < nLevel )
69cdf0e10cSrcweir 	{
70cdf0e10cSrcweir 		if( nCurLvl + 1 >= nLevel )
71cdf0e10cSrcweir 			nCurLvl -= nLevel - 1;
72cdf0e10cSrcweir 		else
73cdf0e10cSrcweir 			nCurLvl = 0;
74cdf0e10cSrcweir 	}
75cdf0e10cSrcweir 	return static_cast<sal_uInt8>((nMask - 1) & ~(( 1 << nCurLvl ) - 1));
76cdf0e10cSrcweir }
77cdf0e10cSrcweir 
SetOutlineNumRule(const SwNumRule & rRule)78cdf0e10cSrcweir void SwDoc::SetOutlineNumRule( const SwNumRule& rRule )
79cdf0e10cSrcweir {
80cdf0e10cSrcweir     if( pOutlineRule )
81cdf0e10cSrcweir 		(*pOutlineRule) = rRule;
82cdf0e10cSrcweir 	else
83cdf0e10cSrcweir 	{
84cdf0e10cSrcweir 		pOutlineRule = new SwNumRule( rRule );
85cdf0e10cSrcweir 
86cdf0e10cSrcweir         AddNumRule(pOutlineRule); // #i36749#
87cdf0e10cSrcweir 	}
88cdf0e10cSrcweir 
89cdf0e10cSrcweir 	pOutlineRule->SetRuleType( OUTLINE_RULE );
90cdf0e10cSrcweir     // --> OD 2008-07-08 #i91400#
91cdf0e10cSrcweir 	pOutlineRule->SetName( String::CreateFromAscii(
92cdf0e10cSrcweir                                         SwNumRule::GetOutlineRuleName() ),
93cdf0e10cSrcweir                            *this);
94cdf0e10cSrcweir     // <--
95cdf0e10cSrcweir     // --> OD 2006-09-21 #i69522#
96cdf0e10cSrcweir     // assure that the outline numbering rule is an automatic rule
97cdf0e10cSrcweir     pOutlineRule->SetAutoRule( sal_True );
98cdf0e10cSrcweir     // <--
99cdf0e10cSrcweir 
100cdf0e10cSrcweir 	// teste ob die evt. gesetzen CharFormate in diesem Document
101cdf0e10cSrcweir 	// definiert sind
102cdf0e10cSrcweir 	pOutlineRule->CheckCharFmts( this );
103cdf0e10cSrcweir 
104cdf0e10cSrcweir     // --> OD 2008-05-13 #refactorlists#
105cdf0e10cSrcweir     // notify text nodes, which are registered at the outline style, about the
106cdf0e10cSrcweir     // changed outline style
107cdf0e10cSrcweir     SwNumRule::tTxtNodeList aTxtNodeList;
108cdf0e10cSrcweir     pOutlineRule->GetTxtNodeList( aTxtNodeList );
109cdf0e10cSrcweir     for ( SwNumRule::tTxtNodeList::iterator aIter = aTxtNodeList.begin();
110cdf0e10cSrcweir           aIter != aTxtNodeList.end(); ++aIter )
111cdf0e10cSrcweir     {
112cdf0e10cSrcweir         SwTxtNode* pTxtNd = *aIter;
113cdf0e10cSrcweir         pTxtNd->NumRuleChgd();
114cdf0e10cSrcweir         // --> OD 2009-01-20 #i94152#
115cdf0e10cSrcweir         // assure that list level corresponds to outline level
116cdf0e10cSrcweir         if ( pTxtNd->GetTxtColl()->IsAssignedToListLevelOfOutlineStyle() &&
117cdf0e10cSrcweir              pTxtNd->GetAttrListLevel() != pTxtNd->GetTxtColl()->GetAssignedOutlineStyleLevel() )
118cdf0e10cSrcweir         {
119cdf0e10cSrcweir             pTxtNd->SetAttrListLevel( pTxtNd->GetTxtColl()->GetAssignedOutlineStyleLevel() );
120cdf0e10cSrcweir         }
121cdf0e10cSrcweir         // <--
122cdf0e10cSrcweir     }
123cdf0e10cSrcweir     // <--
124cdf0e10cSrcweir 
125cdf0e10cSrcweir     PropagateOutlineRule();
126cdf0e10cSrcweir     pOutlineRule->SetInvalidRule(sal_True);
127cdf0e10cSrcweir     UpdateNumRule();
128cdf0e10cSrcweir 
129cdf0e10cSrcweir     // gibt es Fussnoten && gilt Kapitelweises Nummerieren, dann updaten
130cdf0e10cSrcweir     if( GetFtnIdxs().Count() && FTNNUM_CHAPTER == GetFtnInfo().eNum )
131cdf0e10cSrcweir         GetFtnIdxs().UpdateAllFtn();
132cdf0e10cSrcweir 
133cdf0e10cSrcweir 	UpdateExpFlds(NULL, true);
134cdf0e10cSrcweir 
135cdf0e10cSrcweir 	SetModified();
136cdf0e10cSrcweir }
137cdf0e10cSrcweir 
PropagateOutlineRule()138cdf0e10cSrcweir void SwDoc::PropagateOutlineRule()
139cdf0e10cSrcweir {
140cdf0e10cSrcweir     for (sal_uInt16 n = 0; n < pTxtFmtCollTbl->Count(); n++)
141cdf0e10cSrcweir     {
142cdf0e10cSrcweir         SwTxtFmtColl *pColl = (*pTxtFmtCollTbl)[n];
143cdf0e10cSrcweir 
144cdf0e10cSrcweir        // if (NO_NUMBERING != pColl->GetOutlineLevel())//#outline level,zhaojianwei
145cdf0e10cSrcweir 		if(pColl->IsAssignedToListLevelOfOutlineStyle())//<-end,zhaojianwei
146cdf0e10cSrcweir         {
147cdf0e10cSrcweir             // --> OD 2006-11-20 #i71764#
148cdf0e10cSrcweir             // Check only the list style, which is set at the paragraph style
149cdf0e10cSrcweir             const SwNumRuleItem & rCollRuleItem = pColl->GetNumRule( sal_False );
150cdf0e10cSrcweir             // <--
151cdf0e10cSrcweir 
152cdf0e10cSrcweir             // --> OD 2006-11-20 #i71764#
153cdf0e10cSrcweir             // Check on document setting OUTLINE_LEVEL_YIELDS_OUTLINE_RULE no longer needed.
154cdf0e10cSrcweir             if ( rCollRuleItem.GetValue().Len() == 0 )
155cdf0e10cSrcweir             // <--
156cdf0e10cSrcweir             {
157cdf0e10cSrcweir                 SwNumRule * pMyOutlineRule = GetOutlineNumRule();
158cdf0e10cSrcweir 
159cdf0e10cSrcweir                 if (pMyOutlineRule)
160cdf0e10cSrcweir                 {
161cdf0e10cSrcweir                     SwNumRuleItem aNumItem( pMyOutlineRule->GetName() );
162cdf0e10cSrcweir 
163cdf0e10cSrcweir                     pColl->SetFmtAttr(aNumItem);
164cdf0e10cSrcweir                 }
165cdf0e10cSrcweir 			}
166cdf0e10cSrcweir         }
167cdf0e10cSrcweir     }
168cdf0e10cSrcweir }
169cdf0e10cSrcweir 
170cdf0e10cSrcweir 	// Hoch-/Runterstufen
OutlineUpDown(const SwPaM & rPam,short nOffset)171cdf0e10cSrcweir sal_Bool SwDoc::OutlineUpDown( const SwPaM& rPam, short nOffset )
172cdf0e10cSrcweir {
173cdf0e10cSrcweir 	if( !GetNodes().GetOutLineNds().Count() || !nOffset )
174cdf0e10cSrcweir 		return sal_False;
175cdf0e10cSrcweir 
176cdf0e10cSrcweir 	// den Bereich feststellen
177cdf0e10cSrcweir 	const SwOutlineNodes& rOutlNds = GetNodes().GetOutLineNds();
178cdf0e10cSrcweir 	const SwNodePtr pSttNd = (SwNodePtr)&rPam.Start()->nNode.GetNode();
179cdf0e10cSrcweir 	const SwNodePtr pEndNd = (SwNodePtr)&rPam.End()->nNode.GetNode();
180cdf0e10cSrcweir 	sal_uInt16 nSttPos, nEndPos;
181cdf0e10cSrcweir 
182cdf0e10cSrcweir 	if( !rOutlNds.Seek_Entry( pSttNd, &nSttPos ) &&
183cdf0e10cSrcweir 		!nSttPos-- )
184cdf0e10cSrcweir 		// wir stehen in keiner "Outline-Section"
185cdf0e10cSrcweir 		return sal_False;
186cdf0e10cSrcweir 
187cdf0e10cSrcweir 	if( rOutlNds.Seek_Entry( pEndNd, &nEndPos ) )
188cdf0e10cSrcweir 		++nEndPos;
189cdf0e10cSrcweir 
190cdf0e10cSrcweir 	// jetzt haben wir unseren Bereich im OutlineNodes-Array
191cdf0e10cSrcweir 	// dann prufe ersmal, ob nicht unterebenen aufgehoben werden
192cdf0e10cSrcweir 	// (Stufung ueber die Grenzen)
193cdf0e10cSrcweir 	sal_uInt16 n;
194cdf0e10cSrcweir 
195cdf0e10cSrcweir 	// so, dann koennen wir:
196cdf0e10cSrcweir 	// 1. Vorlagen-Array anlegen
197cdf0e10cSrcweir 	SwTxtFmtColl* aCollArr[ MAXLEVEL ];
198cdf0e10cSrcweir 	memset( aCollArr, 0, sizeof( SwTxtFmtColl* ) * MAXLEVEL );
199cdf0e10cSrcweir 
200cdf0e10cSrcweir 	for( n = 0; n < pTxtFmtCollTbl->Count(); ++n )
201cdf0e10cSrcweir 	{
202cdf0e10cSrcweir 		//sal_uInt8 nLevel = (*pTxtFmtCollTbl)[ n ]->GetOutlineLevel();//#outline level,zhaojianwei
203cdf0e10cSrcweir 		//if( nLevel < MAXLEVEL )
204cdf0e10cSrcweir 		//	aCollArr[ nLevel ] = (*pTxtFmtCollTbl)[ n ];
205cdf0e10cSrcweir 		if((*pTxtFmtCollTbl)[ n ]->IsAssignedToListLevelOfOutlineStyle())
206cdf0e10cSrcweir 		{
207cdf0e10cSrcweir             const int nLevel = (*pTxtFmtCollTbl)[ n ]->GetAssignedOutlineStyleLevel();
208cdf0e10cSrcweir 			aCollArr[ nLevel ] = (*pTxtFmtCollTbl)[ n ];
209cdf0e10cSrcweir 		}//<-end,zhaojianwei
210cdf0e10cSrcweir 	}
211cdf0e10cSrcweir 
212cdf0e10cSrcweir     /* --> #111107# */
213cdf0e10cSrcweir     /* Find the last occupied level (backward). */
214cdf0e10cSrcweir     for (n = MAXLEVEL - 1; n > 0; n--)
215cdf0e10cSrcweir     {
216cdf0e10cSrcweir         if (aCollArr[n] != 0)
217cdf0e10cSrcweir             break;
218cdf0e10cSrcweir     }
219cdf0e10cSrcweir 
220cdf0e10cSrcweir     /* If an occupied level is found, choose next level (which IS
221cdf0e10cSrcweir        unoccupied) until a valid level is found. If no occupied level
222cdf0e10cSrcweir        was found n is 0 and aCollArr[0] is 0. In this case no demoting
223cdf0e10cSrcweir        is possible. */
224cdf0e10cSrcweir     if (aCollArr[n] != 0)
225cdf0e10cSrcweir     {
226cdf0e10cSrcweir         while (n < MAXLEVEL - 1)
227cdf0e10cSrcweir         {
228cdf0e10cSrcweir             n++;
229cdf0e10cSrcweir 
230cdf0e10cSrcweir             SwTxtFmtColl *aTmpColl =
231cdf0e10cSrcweir                 GetTxtCollFromPool(static_cast<sal_uInt16>(RES_POOLCOLL_HEADLINE1 + n));
232cdf0e10cSrcweir 
233cdf0e10cSrcweir             //if (aTmpColl->GetOutlineLevel() == n)//#outline level,zhaojianwei
234cdf0e10cSrcweir 			if( aTmpColl->IsAssignedToListLevelOfOutlineStyle() &&
235cdf0e10cSrcweir 				aTmpColl->GetAssignedOutlineStyleLevel() == n )//<-end,zhaojianwei
236cdf0e10cSrcweir             {
237cdf0e10cSrcweir                 aCollArr[n] = aTmpColl;
238cdf0e10cSrcweir                 break;
239cdf0e10cSrcweir             }
240cdf0e10cSrcweir         }
241cdf0e10cSrcweir     }
242cdf0e10cSrcweir 
243cdf0e10cSrcweir     /* Find the first occupied level (forward). */
244cdf0e10cSrcweir     for (n = 0; n < MAXLEVEL - 1; n++)
245cdf0e10cSrcweir     {
246cdf0e10cSrcweir         if (aCollArr[n] != 0)
247cdf0e10cSrcweir             break;
248cdf0e10cSrcweir     }
249cdf0e10cSrcweir 
250cdf0e10cSrcweir     /* If an occupied level is found, choose previous level (which IS
251cdf0e10cSrcweir        unoccupied) until a valid level is found. If no occupied level
252cdf0e10cSrcweir        was found n is MAXLEVEL - 1 and aCollArr[MAXLEVEL - 1] is 0. In
253cdf0e10cSrcweir        this case no demoting is possible. */
254cdf0e10cSrcweir     if (aCollArr[n] != 0)
255cdf0e10cSrcweir     {
256cdf0e10cSrcweir         while (n > 0)
257cdf0e10cSrcweir         {
258cdf0e10cSrcweir             n--;
259cdf0e10cSrcweir 
260cdf0e10cSrcweir             SwTxtFmtColl *aTmpColl =
261cdf0e10cSrcweir                 GetTxtCollFromPool(static_cast<sal_uInt16>(RES_POOLCOLL_HEADLINE1 + n));
262cdf0e10cSrcweir 
263cdf0e10cSrcweir             //if (aTmpColl->GetOutlineLevel() == n)//#outline level,zhaojianwei
264cdf0e10cSrcweir 			if( aTmpColl->IsAssignedToListLevelOfOutlineStyle() &&
265cdf0e10cSrcweir 				aTmpColl->GetAssignedOutlineStyleLevel() == n )//<-end,zhaojianwei
266cdf0e10cSrcweir             {
267cdf0e10cSrcweir                 aCollArr[n] = aTmpColl;
268cdf0e10cSrcweir                 break;
269cdf0e10cSrcweir             }
270cdf0e10cSrcweir         }
271cdf0e10cSrcweir     }
272cdf0e10cSrcweir     /* <-- #111107# */
273cdf0e10cSrcweir 
274cdf0e10cSrcweir     /* --> #i13747#
275cdf0e10cSrcweir 
276cdf0e10cSrcweir        Build a move table that states from which level an outline will
277cdf0e10cSrcweir 
278cdf0e10cSrcweir   be moved to which other level. */
279cdf0e10cSrcweir 
280cdf0e10cSrcweir     /* the move table
281cdf0e10cSrcweir 
282cdf0e10cSrcweir        aMoveArr[n] = m: replace aCollArr[n] with aCollArr[m]
283cdf0e10cSrcweir     */
284cdf0e10cSrcweir     int aMoveArr[MAXLEVEL];
285cdf0e10cSrcweir     int nStep; // step size for searching in aCollArr: -1 or 1
286cdf0e10cSrcweir     int nNum; // amount of steps for stepping in aCollArr
287cdf0e10cSrcweir 
288cdf0e10cSrcweir     if (nOffset < 0)
289cdf0e10cSrcweir     {
290cdf0e10cSrcweir         nStep = -1;
291cdf0e10cSrcweir         nNum = -nOffset;
292cdf0e10cSrcweir     }
293cdf0e10cSrcweir     else
294cdf0e10cSrcweir     {
295cdf0e10cSrcweir         nStep = 1;
296cdf0e10cSrcweir         nNum = nOffset;
297cdf0e10cSrcweir     }
298cdf0e10cSrcweir 
299cdf0e10cSrcweir     /* traverse aCollArr */
300cdf0e10cSrcweir     for (n = 0; n < MAXLEVEL; n++)
301cdf0e10cSrcweir     {
302cdf0e10cSrcweir         /* If outline level n has an assigned paragraph style step
303cdf0e10cSrcweir            nNum steps forwards (nStep == 1) or backwards (nStep ==
304cdf0e10cSrcweir            -1).  One step is to go to the next non-null entry in
305cdf0e10cSrcweir            aCollArr in the selected direction. If nNum steps were
306cdf0e10cSrcweir            possible write the index of the entry found to aCollArr[n],
307cdf0e10cSrcweir            i.e. outline level n will be replaced by outline level
308cdf0e10cSrcweir            aCollArr[n].
309cdf0e10cSrcweir 
310cdf0e10cSrcweir            If outline level n has no assigned paragraph style
311cdf0e10cSrcweir            aMoveArr[n] is set to -1.
312cdf0e10cSrcweir         */
313cdf0e10cSrcweir         if (aCollArr[n] != NULL)
314cdf0e10cSrcweir         {
315cdf0e10cSrcweir             sal_uInt16 m = n;
316cdf0e10cSrcweir             int nCount = nNum;
317cdf0e10cSrcweir 
318cdf0e10cSrcweir             while (nCount > 0 && m + nStep >= 0 && m + nStep < MAXLEVEL)
319cdf0e10cSrcweir             {
320cdf0e10cSrcweir                 m = static_cast<sal_uInt16>(m + nStep);
321cdf0e10cSrcweir 
322cdf0e10cSrcweir                 if (aCollArr[m] != NULL)
323cdf0e10cSrcweir                     nCount--;
324cdf0e10cSrcweir             }
325cdf0e10cSrcweir 
326cdf0e10cSrcweir             if (nCount == 0)
327cdf0e10cSrcweir                 aMoveArr[n] = m;
328cdf0e10cSrcweir 			else
329cdf0e10cSrcweir 				aMoveArr[n] = -1;
330cdf0e10cSrcweir 
331cdf0e10cSrcweir         }
332cdf0e10cSrcweir         else
333cdf0e10cSrcweir             aMoveArr[n] = -1;
334cdf0e10cSrcweir     }
335cdf0e10cSrcweir 
336cdf0e10cSrcweir     /* If moving of the outline levels is applicable, i.e. for all
337cdf0e10cSrcweir        outline levels occuring in the document there has to be a valid
338cdf0e10cSrcweir        target outline level implied by aMoveArr. */
339cdf0e10cSrcweir     bool bMoveApplicable = true;
340cdf0e10cSrcweir 	for (n = nSttPos; n < nEndPos; n++)
341cdf0e10cSrcweir 	{
342cdf0e10cSrcweir 		SwTxtNode* pTxtNd = rOutlNds[ n ]->GetTxtNode();
343cdf0e10cSrcweir         SwTxtFmtColl* pColl = pTxtNd->GetTxtColl();
344cdf0e10cSrcweir //        int nLevel = pColl->GetOutlineLevel();//#outline level,zhaojianwei
345cdf0e10cSrcweir //        if (aMoveArr[nLevel] == -1)
346cdf0e10cSrcweir //          bMoveApplicable = false;
347cdf0e10cSrcweir         if( pColl->IsAssignedToListLevelOfOutlineStyle() )
348cdf0e10cSrcweir         {
349cdf0e10cSrcweir             const int nLevel = pColl->GetAssignedOutlineStyleLevel();
350cdf0e10cSrcweir             if (aMoveArr[nLevel] == -1)
351cdf0e10cSrcweir                 bMoveApplicable = false;
352cdf0e10cSrcweir         }//<-end,zhaojianwei
353cdf0e10cSrcweir         // --> OD 2008-12-16 #i70748#
354cdf0e10cSrcweir         // Check on outline level attribute of text node, if text node is
355cdf0e10cSrcweir         // not an outline via a to outline style assigned paragraph style.
356cdf0e10cSrcweir         else
357cdf0e10cSrcweir         {
358cdf0e10cSrcweir             const int nNewOutlineLevel = pTxtNd->GetAttrOutlineLevel() + nOffset;
359cdf0e10cSrcweir             if ( nNewOutlineLevel < 1 || nNewOutlineLevel > MAXLEVEL )
360cdf0e10cSrcweir             {
361cdf0e10cSrcweir                 bMoveApplicable = false;
362cdf0e10cSrcweir             }
363cdf0e10cSrcweir         }
364cdf0e10cSrcweir         // <--
365cdf0e10cSrcweir 	}
366cdf0e10cSrcweir 
367cdf0e10cSrcweir 	if (! bMoveApplicable )
368cdf0e10cSrcweir 		return sal_False;
369cdf0e10cSrcweir 
370cdf0e10cSrcweir     /* <-- #i13747 # */
371cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
372cdf0e10cSrcweir     {
373cdf0e10cSrcweir         GetIDocumentUndoRedo().StartUndo(UNDO_OUTLINE_LR, NULL);
374cdf0e10cSrcweir         SwUndo *const pUndoOLR( new SwUndoOutlineLeftRight( rPam, nOffset ) );
375cdf0e10cSrcweir         GetIDocumentUndoRedo().AppendUndo(pUndoOLR);
376cdf0e10cSrcweir     }
377cdf0e10cSrcweir 
378cdf0e10cSrcweir 	// 2. allen Nodes die neue Vorlage zuweisen
379cdf0e10cSrcweir 
380cdf0e10cSrcweir 	n = nSttPos;
381cdf0e10cSrcweir 	while( n < nEndPos)
382cdf0e10cSrcweir 	{
383cdf0e10cSrcweir 		SwTxtNode* pTxtNd = rOutlNds[ n ]->GetTxtNode();
384cdf0e10cSrcweir 		SwTxtFmtColl* pColl = pTxtNd->GetTxtColl();
385cdf0e10cSrcweir 
386cdf0e10cSrcweir 		if( pColl->IsAssignedToListLevelOfOutlineStyle() )
387cdf0e10cSrcweir 		{
388cdf0e10cSrcweir 		// ASSERT(pColl->GetOutlineLevel() < MAXLEVEL,	//#outline level,removed by zhaojianwei
389cdf0e10cSrcweir         //         "non outline node in outline nodes?");
390cdf0e10cSrcweir         //int nLevel = pColl->GetOutlineLevel();
391cdf0e10cSrcweir             const int nLevel = pColl->GetAssignedOutlineStyleLevel();//#outline level,add by zhaojianwei
392cdf0e10cSrcweir 
393cdf0e10cSrcweir 			ASSERT(aMoveArr[nLevel] >= 0,
394cdf0e10cSrcweir 				"move table: current TxtColl not found when building table!");
395cdf0e10cSrcweir 
396cdf0e10cSrcweir 
397cdf0e10cSrcweir 			if (nLevel < MAXLEVEL && aMoveArr[nLevel] >= 0)
398cdf0e10cSrcweir 			{
399cdf0e10cSrcweir 				pColl = aCollArr[ aMoveArr[nLevel] ];
400cdf0e10cSrcweir 
401cdf0e10cSrcweir 				if (pColl != NULL)
402cdf0e10cSrcweir 					pColl = (SwTxtFmtColl*)pTxtNd->ChgFmtColl( pColl );
403cdf0e10cSrcweir 			}
404cdf0e10cSrcweir 
405cdf0e10cSrcweir 		}
406cdf0e10cSrcweir 		else if( pTxtNd->GetAttrOutlineLevel() > 0)	//#outline level,add by zhaojianwei
407cdf0e10cSrcweir 		{
408cdf0e10cSrcweir 			int nLevel = pTxtNd->GetAttrOutlineLevel() + nOffset;
409cdf0e10cSrcweir 			if( 0 <= nLevel && nLevel <= MAXLEVEL)
410cdf0e10cSrcweir 				pTxtNd->SetAttrOutlineLevel( nLevel );
411cdf0e10cSrcweir 
412cdf0e10cSrcweir 		}//<-end,zhaojianwei
413cdf0e10cSrcweir 
414cdf0e10cSrcweir         n++;
415cdf0e10cSrcweir 		// Undo ???
416cdf0e10cSrcweir 	}
417cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
418cdf0e10cSrcweir     {
419cdf0e10cSrcweir         GetIDocumentUndoRedo().EndUndo(UNDO_OUTLINE_LR, NULL);
420cdf0e10cSrcweir     }
421cdf0e10cSrcweir 
422cdf0e10cSrcweir     ChkCondColls();
423cdf0e10cSrcweir 	SetModified();
424cdf0e10cSrcweir 
425cdf0e10cSrcweir 	return sal_True;
426cdf0e10cSrcweir }
427cdf0e10cSrcweir 
428cdf0e10cSrcweir 
429cdf0e10cSrcweir 
430cdf0e10cSrcweir 	// Hoch-/Runter - Verschieben !
MoveOutlinePara(const SwPaM & rPam,short nOffset)431cdf0e10cSrcweir sal_Bool SwDoc::MoveOutlinePara( const SwPaM& rPam, short nOffset )
432cdf0e10cSrcweir {
433cdf0e10cSrcweir 	// kein Verschiebung in den Sonderbereichen
434cdf0e10cSrcweir 	const SwPosition& rStt = *rPam.Start(),
435cdf0e10cSrcweir 					& rEnd = &rStt == rPam.GetPoint() ? *rPam.GetMark()
436cdf0e10cSrcweir 													  : *rPam.GetPoint();
437cdf0e10cSrcweir 	if( !GetNodes().GetOutLineNds().Count() || !nOffset ||
438cdf0e10cSrcweir         (rStt.nNode.GetIndex() < GetNodes().GetEndOfExtras().GetIndex()) ||
439cdf0e10cSrcweir         (rEnd.nNode.GetIndex() < GetNodes().GetEndOfExtras().GetIndex()))
440cdf0e10cSrcweir     {
441cdf0e10cSrcweir 		return sal_False;
442cdf0e10cSrcweir     }
443cdf0e10cSrcweir 
444cdf0e10cSrcweir 	sal_uInt16 nAktPos = 0;
445cdf0e10cSrcweir 	SwNodeIndex aSttRg( rStt.nNode ), aEndRg( rEnd.nNode );
446cdf0e10cSrcweir 
447cdf0e10cSrcweir     //sal_uInt8 nOutLineLevel = NO_NUMBERING;	//#outline level,zhaojianwei
448cdf0e10cSrcweir     int nOutLineLevel = MAXLEVEL;			//<-end,zhaojianwei
449cdf0e10cSrcweir 	SwNode* pSrch = &aSttRg.GetNode();
450cdf0e10cSrcweir     //if( pSrch->IsTxtNode() )				//#outline level,zhaojianwei
451cdf0e10cSrcweir     //     nOutLineLevel = static_cast<sal_uInt8>(((SwTxtNode*)pSrch)->GetOutlineLevel());
452cdf0e10cSrcweir    if( pSrch->IsTxtNode())
453cdf0e10cSrcweir         nOutLineLevel = static_cast<sal_uInt8>(((SwTxtNode*)pSrch)->GetAttrOutlineLevel()-1);//<-end,zhaojianwei
454cdf0e10cSrcweir 	SwNode* pEndSrch = &aEndRg.GetNode();
455cdf0e10cSrcweir     if( !GetNodes().GetOutLineNds().Seek_Entry( pSrch, &nAktPos ) )
456cdf0e10cSrcweir     {
457cdf0e10cSrcweir         if( !nAktPos )
458cdf0e10cSrcweir             return sal_False; // Promoting or demoting before the first outline => no.
459cdf0e10cSrcweir         if( --nAktPos )
460cdf0e10cSrcweir             aSttRg = *GetNodes().GetOutLineNds()[ nAktPos ];
461cdf0e10cSrcweir         else if( 0 > nOffset )
462cdf0e10cSrcweir             return sal_False; // Promoting at the top of document?!
463cdf0e10cSrcweir         else
464cdf0e10cSrcweir             aSttRg = *GetNodes().GetEndOfContent().StartOfSectionNode();
465cdf0e10cSrcweir     }
466cdf0e10cSrcweir     sal_uInt16 nTmpPos = 0;
467cdf0e10cSrcweir     // If the given range ends at an outlined text node we have to decide if it has to be a part of
468cdf0e10cSrcweir     // the moving range or not. Normally it will be a sub outline of our chapter
469cdf0e10cSrcweir     // and has to be moved, too. But if the chapter ends with a table(or a section end),
470cdf0e10cSrcweir     // the next text node will be choosen and this could be the next outline of the same level.
471cdf0e10cSrcweir     // The criteria has to be the outline level: sub level => incorporate, same/higher level => no.
472cdf0e10cSrcweir     if( GetNodes().GetOutLineNds().Seek_Entry( pEndSrch, &nTmpPos ) )
473cdf0e10cSrcweir     {
474cdf0e10cSrcweir         if( !pEndSrch->IsTxtNode() || pEndSrch == pSrch ||
475cdf0e10cSrcweir             //nOutLineLevel < ((SwTxtNode*)pEndSrch)->GetOutlineLevel() )//#outline level,zhaojianwei
476cdf0e10cSrcweir 			nOutLineLevel < ((SwTxtNode*)pEndSrch)->GetAttrOutlineLevel()-1 )//<-end,zhaojianwei
477cdf0e10cSrcweir             ++nTmpPos; // For sub outlines only!
478cdf0e10cSrcweir     }
479cdf0e10cSrcweir 
480cdf0e10cSrcweir     aEndRg = nTmpPos < GetNodes().GetOutLineNds().Count()
481cdf0e10cSrcweir                     ? *GetNodes().GetOutLineNds()[ nTmpPos ]
482cdf0e10cSrcweir                     : GetNodes().GetEndOfContent();
483cdf0e10cSrcweir     if( nOffset >= 0 )
484cdf0e10cSrcweir         nAktPos = nTmpPos;
485cdf0e10cSrcweir     if( aEndRg == aSttRg )
486cdf0e10cSrcweir     {
487cdf0e10cSrcweir         ASSERT( false, "Moving outlines: Surprising selection" );
488cdf0e10cSrcweir         aEndRg++;
489cdf0e10cSrcweir     }
490cdf0e10cSrcweir 
491cdf0e10cSrcweir 	const SwNode* pNd;
492cdf0e10cSrcweir     // The following code corrects the range to handle sections (start/end nodes)
493cdf0e10cSrcweir     // The range will be extended if the least node before the range is a start node
494cdf0e10cSrcweir     // which ends inside the range => The complete section will be moved.
495cdf0e10cSrcweir     // The range will be shrinked if the last position is a start node.
496cdf0e10cSrcweir     // The range will be shrinked if the last node is an end node which starts before the range.
497cdf0e10cSrcweir     aSttRg--;
498cdf0e10cSrcweir     while( aSttRg.GetNode().IsStartNode() )
499cdf0e10cSrcweir     {
500cdf0e10cSrcweir         pNd = aSttRg.GetNode().EndOfSectionNode();
501cdf0e10cSrcweir         if( pNd->GetIndex() >= aEndRg.GetIndex() )
502cdf0e10cSrcweir             break;
503cdf0e10cSrcweir         aSttRg--;
504cdf0e10cSrcweir     }
505cdf0e10cSrcweir     aSttRg++;
506cdf0e10cSrcweir 
507cdf0e10cSrcweir     aEndRg--;
508cdf0e10cSrcweir     while( aEndRg.GetNode().IsStartNode() )
509cdf0e10cSrcweir         aEndRg--;
510cdf0e10cSrcweir     while( aEndRg.GetNode().IsEndNode() )
511cdf0e10cSrcweir     {
512cdf0e10cSrcweir         pNd = aEndRg.GetNode().StartOfSectionNode();
513cdf0e10cSrcweir         if( pNd->GetIndex() >= aSttRg.GetIndex() )
514cdf0e10cSrcweir             break;
515cdf0e10cSrcweir         aEndRg--;
516cdf0e10cSrcweir     }
517cdf0e10cSrcweir     aEndRg++;
518cdf0e10cSrcweir 
519cdf0e10cSrcweir 	// calculation of the new position
520cdf0e10cSrcweir 	if( nOffset < 0 && nAktPos < sal_uInt16(-nOffset) )
521cdf0e10cSrcweir 		pNd = GetNodes().GetEndOfContent().StartOfSectionNode();
522cdf0e10cSrcweir 	else if( nAktPos + nOffset >= GetNodes().GetOutLineNds().Count() )
523cdf0e10cSrcweir 		pNd = &GetNodes().GetEndOfContent();
524cdf0e10cSrcweir 	else
525cdf0e10cSrcweir 		pNd = GetNodes().GetOutLineNds()[ nAktPos + nOffset ];
526cdf0e10cSrcweir 
527cdf0e10cSrcweir 	sal_uLong nNewPos = pNd->GetIndex();
528cdf0e10cSrcweir 
529cdf0e10cSrcweir     // And now a correction of the insert position if necessary...
530cdf0e10cSrcweir     SwNodeIndex aInsertPos( *pNd, -1 );
531cdf0e10cSrcweir     while( aInsertPos.GetNode().IsStartNode() )
532cdf0e10cSrcweir     {
533cdf0e10cSrcweir         // Just before the insert position starts a section:
534cdf0e10cSrcweir         // when I'm moving forward I do not want to enter the section,
535cdf0e10cSrcweir         // when I'm moving backward I want to stay in the section if I'm already a part of,
536cdf0e10cSrcweir         // I want to stay outside if I was outside before.
537cdf0e10cSrcweir         if( nOffset < 0 )
538cdf0e10cSrcweir         {
539cdf0e10cSrcweir             pNd = aInsertPos.GetNode().EndOfSectionNode();
540cdf0e10cSrcweir             if( pNd->GetIndex() >= aEndRg.GetIndex() )
541cdf0e10cSrcweir                 break;
542cdf0e10cSrcweir         }
543cdf0e10cSrcweir         aInsertPos--;
544cdf0e10cSrcweir         --nNewPos;
545cdf0e10cSrcweir     }
546cdf0e10cSrcweir     if( nOffset >= 0 )
547cdf0e10cSrcweir     {
548cdf0e10cSrcweir         // When just before the insert position a section ends, it is okay when I'm moving backward
549cdf0e10cSrcweir         // because I want to stay outside the section.
550cdf0e10cSrcweir         // When moving forward I've to check if I started inside or outside the section
551cdf0e10cSrcweir         // because I don't want to enter of leave such a section
552cdf0e10cSrcweir         while( aInsertPos.GetNode().IsEndNode() )
553cdf0e10cSrcweir         {
554cdf0e10cSrcweir             pNd = aInsertPos.GetNode().StartOfSectionNode();
555cdf0e10cSrcweir             if( pNd->GetIndex() >= aSttRg.GetIndex() )
556cdf0e10cSrcweir                 break;
557cdf0e10cSrcweir             aInsertPos--;
558cdf0e10cSrcweir             --nNewPos;
559cdf0e10cSrcweir         }
560cdf0e10cSrcweir     }
561cdf0e10cSrcweir     // We do not want to move into tables (at the moment)
562cdf0e10cSrcweir     aInsertPos++;
563cdf0e10cSrcweir     pNd = &aInsertPos.GetNode();
564cdf0e10cSrcweir     if( pNd->IsTableNode() )
565cdf0e10cSrcweir         pNd = pNd->StartOfSectionNode();
566cdf0e10cSrcweir     if( pNd->FindTableNode() )
567cdf0e10cSrcweir         return sal_False;
568cdf0e10cSrcweir 
569cdf0e10cSrcweir 	ASSERT( aSttRg.GetIndex() > nNewPos || nNewPos >= aEndRg.GetIndex(),
570cdf0e10cSrcweir 				"Position liegt im MoveBereich" );
571cdf0e10cSrcweir 
572cdf0e10cSrcweir 	// wurde ein Position in den Sonderbereichen errechnet, dann
573cdf0e10cSrcweir 	// setze die Position auf den Dokumentanfang.
574cdf0e10cSrcweir 	// Sollten da Bereiche oder Tabellen stehen, so werden sie nach
575cdf0e10cSrcweir 	// hinten verschoben.
576cdf0e10cSrcweir     nNewPos = Max( nNewPos, GetNodes().GetEndOfExtras().GetIndex() + 2 );
577cdf0e10cSrcweir 
578cdf0e10cSrcweir 	long nOffs = nNewPos - ( 0 < nOffset ? aEndRg.GetIndex() : aSttRg.GetIndex());
579cdf0e10cSrcweir 	SwPaM aPam( aSttRg, aEndRg, 0, -1 );
580cdf0e10cSrcweir 	return MoveParagraph( aPam, nOffs, sal_True );
581cdf0e10cSrcweir }
582cdf0e10cSrcweir 
583cdf0e10cSrcweir 
lcl_FindOutlineName(const SwNodes & rNds,const String & rName,sal_Bool bExact)584cdf0e10cSrcweir sal_uInt16 lcl_FindOutlineName( const SwNodes& rNds, const String& rName,
585cdf0e10cSrcweir 							sal_Bool bExact )
586cdf0e10cSrcweir {
587cdf0e10cSrcweir 	sal_uInt16 nSavePos = USHRT_MAX;
588cdf0e10cSrcweir 	const SwOutlineNodes& rOutlNds = rNds.GetOutLineNds();
589cdf0e10cSrcweir 	for( sal_uInt16 n = 0; n < rOutlNds.Count(); ++n )
590cdf0e10cSrcweir 	{
591cdf0e10cSrcweir 		SwTxtNode* pTxtNd = rOutlNds[ n ]->GetTxtNode();
592cdf0e10cSrcweir 		String sTxt( pTxtNd->GetExpandTxt() );
593cdf0e10cSrcweir 		if( sTxt.Equals( rName ) )
594cdf0e10cSrcweir 		{
595cdf0e10cSrcweir 			// "exact" gefunden, setze Pos auf den Node
596cdf0e10cSrcweir 			nSavePos = n;
597cdf0e10cSrcweir 			break;
598cdf0e10cSrcweir 		}
599cdf0e10cSrcweir 		else if( !bExact && USHRT_MAX == nSavePos &&
600cdf0e10cSrcweir 					COMPARE_EQUAL == sTxt.CompareTo( rName, rName.Len()) )
601cdf0e10cSrcweir 		{
602cdf0e10cSrcweir 			// dann vielleicht nur den den 1.Teil vom Text gefunden
603cdf0e10cSrcweir 			nSavePos = n;
604cdf0e10cSrcweir 		}
605cdf0e10cSrcweir 	}
606cdf0e10cSrcweir 
607cdf0e10cSrcweir 	return nSavePos;
608cdf0e10cSrcweir }
609cdf0e10cSrcweir 
610cdf0e10cSrcweir 
611cdf0e10cSrcweir 
lcl_FindOutlineNum(const SwNodes & rNds,String & rName)612cdf0e10cSrcweir sal_uInt16 lcl_FindOutlineNum( const SwNodes& rNds, String& rName )
613cdf0e10cSrcweir {
614cdf0e10cSrcweir 	// Gueltig Nummern sind (immer nur Offsets!!!):
615cdf0e10cSrcweir 	// 	([Nummer]+\.)+	(als regulaerer Ausdruck!)
616cdf0e10cSrcweir 	//	(Nummer gefolgt von Punkt, zum 5 Wiederholungen)
617cdf0e10cSrcweir 	//	also: "1.1.", "1.", "1.1.1."
618cdf0e10cSrcweir 	xub_StrLen nPos = 0;
619cdf0e10cSrcweir 	String sNum = rName.GetToken( 0, '.', nPos );
620cdf0e10cSrcweir 	if( STRING_NOTFOUND == nPos )
621cdf0e10cSrcweir 		return USHRT_MAX;			// ungueltige Nummer!!!
622cdf0e10cSrcweir 
623cdf0e10cSrcweir 	sal_uInt16 nLevelVal[ MAXLEVEL ];		// Nummern aller Levels
624cdf0e10cSrcweir 	memset( nLevelVal, 0, MAXLEVEL * sizeof( nLevelVal[0] ));
625cdf0e10cSrcweir 	sal_uInt8 nLevel = 0;
626cdf0e10cSrcweir 	String sName( rName );
627cdf0e10cSrcweir 
628cdf0e10cSrcweir 	while( STRING_NOTFOUND != nPos )
629cdf0e10cSrcweir 	{
630cdf0e10cSrcweir 		sal_uInt16 nVal = 0;
631cdf0e10cSrcweir 		sal_Unicode c;
632cdf0e10cSrcweir 		for( sal_uInt16 n = 0; n < sNum.Len(); ++n )
633cdf0e10cSrcweir 			if( '0' <= ( c = sNum.GetChar( n )) && c <= '9' )
634cdf0e10cSrcweir 			{
635cdf0e10cSrcweir 				nVal *= 10;  nVal += c - '0';
636cdf0e10cSrcweir 			}
637cdf0e10cSrcweir 			else if( nLevel )
638cdf0e10cSrcweir 				break;						// "fast" gueltige Nummer
639cdf0e10cSrcweir 			else
640cdf0e10cSrcweir 				return USHRT_MAX;			// ungueltige Nummer!!!
641cdf0e10cSrcweir 
642cdf0e10cSrcweir 		if( MAXLEVEL > nLevel )
643cdf0e10cSrcweir 			nLevelVal[ nLevel++ ] = nVal;
644cdf0e10cSrcweir 
645cdf0e10cSrcweir 		sName.Erase( 0, nPos );
646cdf0e10cSrcweir 		nPos = 0;
647cdf0e10cSrcweir 		sNum = sName.GetToken( 0, '.', nPos );
648cdf0e10cSrcweir         // #i4533# without this check all parts delimited by a dot are treated as outline numbers
649cdf0e10cSrcweir         if(!ByteString(sNum, gsl_getSystemTextEncoding()).IsNumericAscii())
650cdf0e10cSrcweir             nPos = STRING_NOTFOUND;
651cdf0e10cSrcweir 	}
652cdf0e10cSrcweir 	rName = sName;		// das ist der nachfolgende Text.
653cdf0e10cSrcweir 
654cdf0e10cSrcweir 	// alle Levels gelesen, dann suche mal im Document nach dieser
655cdf0e10cSrcweir 	// Gliederung:
656cdf0e10cSrcweir 	const SwOutlineNodes& rOutlNds = rNds.GetOutLineNds();
657cdf0e10cSrcweir 	// OS: ohne OutlineNodes lohnt die Suche nicht
658cdf0e10cSrcweir 	// und man spart sich einen Absturz #42958#
659cdf0e10cSrcweir 	if(!rOutlNds.Count())
660cdf0e10cSrcweir 		return USHRT_MAX;
661cdf0e10cSrcweir 	SwTxtNode* pNd;
662cdf0e10cSrcweir     nPos = 0;
663cdf0e10cSrcweir     //search in the existing outline nodes for the required outline num array
664cdf0e10cSrcweir     for( ; nPos < rOutlNds.Count(); ++nPos )
665cdf0e10cSrcweir     {
666cdf0e10cSrcweir         pNd = rOutlNds[ nPos ]->GetTxtNode();
667cdf0e10cSrcweir         //sal_uInt8 nLvl = pNd->GetTxtColl()->GetOutlineLevel();	//#outline level,zhaojianwei
668cdf0e10cSrcweir         const int nLvl = pNd->GetAttrOutlineLevel()-1;   //<-end,zhaojianwei
669cdf0e10cSrcweir         if( nLvl == nLevel - 1)
670cdf0e10cSrcweir         {
671cdf0e10cSrcweir             // check for the outline num
672cdf0e10cSrcweir             // --> OD 2005-11-02 #i51089 - TUNING#
673cdf0e10cSrcweir             // --> OD 2006-09-22 #i68289#
674cdf0e10cSrcweir             // Assure, that text node has the correct numbering level. Otherwise,
675cdf0e10cSrcweir             // its number vector will not fit to the searched level.
676cdf0e10cSrcweir //            if ( pNd->GetNum() )
677cdf0e10cSrcweir             if ( pNd->GetNum() &&
678cdf0e10cSrcweir                  pNd->GetActualListLevel() == ( nLevel - 1 ) )
679cdf0e10cSrcweir             // <--
680cdf0e10cSrcweir             {
681cdf0e10cSrcweir                 const SwNodeNum & rNdNum = *(pNd->GetNum());
682cdf0e10cSrcweir                 SwNumberTree::tNumberVector aLevelVal = rNdNum.GetNumberVector();
683cdf0e10cSrcweir                 //now compare with the one searched for
684cdf0e10cSrcweir                 bool bEqual = true;
685cdf0e10cSrcweir                 for( sal_uInt8 n = 0; (n < nLevel) && bEqual; ++n )
686cdf0e10cSrcweir                 {
687cdf0e10cSrcweir                     bEqual = aLevelVal[n] == nLevelVal[n];
688cdf0e10cSrcweir                 }
689cdf0e10cSrcweir                 if(bEqual)
690cdf0e10cSrcweir                 {
691cdf0e10cSrcweir                     break;
692cdf0e10cSrcweir                 }
693cdf0e10cSrcweir             }
694cdf0e10cSrcweir             else
695cdf0e10cSrcweir             {
696cdf0e10cSrcweir                 // --> OD 2006-01-12 #126588#
697cdf0e10cSrcweir                 // A text node, which has an outline paragraph style applied and
698cdf0e10cSrcweir                 // has as hard attribute 'no numbering' set, has an outline level,
699cdf0e10cSrcweir                 // but no numbering tree node. Thus, consider this situation in
700cdf0e10cSrcweir                 // the assertion condition.
701cdf0e10cSrcweir                 ASSERT( !pNd->GetNumRule(),
702cdf0e10cSrcweir                         "<lcl_FindOutlineNum(..)> - text node with outline level and numbering rule, but without numbering tree node. This is a serious defect -> inform OD" );
703cdf0e10cSrcweir             }
704cdf0e10cSrcweir         }
705cdf0e10cSrcweir     }
706cdf0e10cSrcweir     if( nPos >= rOutlNds.Count() )
707cdf0e10cSrcweir         nPos = USHRT_MAX;
708cdf0e10cSrcweir     return nPos;
709cdf0e10cSrcweir }
710cdf0e10cSrcweir 
711cdf0e10cSrcweir 	// zu diesem Gliederungspunkt
712cdf0e10cSrcweir 
713cdf0e10cSrcweir 
714cdf0e10cSrcweir 	// JP 13.06.96:
715cdf0e10cSrcweir 	// im Namen kann eine Nummer oder/und der Text stehen.
716cdf0e10cSrcweir 	// zuerst wird ueber die Nummer versucht den richtigen Eintrag zu finden.
717cdf0e10cSrcweir 	// Gibt es diesen, dann wird ueber den Text verglichen, od es der
718cdf0e10cSrcweir 	// gewuenschte ist. Ist das nicht der Fall, wird noch mal nur ueber den
719cdf0e10cSrcweir 	// Text gesucht. Wird dieser gefunden ist es der Eintrag. Ansonsten der,
720cdf0e10cSrcweir 	// der ueber die Nummer gefunden wurde.
721cdf0e10cSrcweir 	// Ist keine Nummer angegeben, dann nur den Text suchen.
722cdf0e10cSrcweir 
GotoOutline(SwPosition & rPos,const String & rName) const723cdf0e10cSrcweir sal_Bool SwDoc::GotoOutline( SwPosition& rPos, const String& rName ) const
724cdf0e10cSrcweir {
725cdf0e10cSrcweir 	if( rName.Len() )
726cdf0e10cSrcweir 	{
727cdf0e10cSrcweir 		const SwOutlineNodes& rOutlNds = GetNodes().GetOutLineNds();
728cdf0e10cSrcweir 
729cdf0e10cSrcweir 		// 1. Schritt: ueber die Nummer:
730cdf0e10cSrcweir 		String sName( rName );
731cdf0e10cSrcweir 		sal_uInt16 nFndPos = ::lcl_FindOutlineNum( GetNodes(), sName );
732cdf0e10cSrcweir 		if( USHRT_MAX != nFndPos )
733cdf0e10cSrcweir 		{
734cdf0e10cSrcweir 			SwTxtNode* pNd = rOutlNds[ nFndPos ]->GetTxtNode();
735cdf0e10cSrcweir             String sExpandedText = pNd->GetExpandTxt();
736cdf0e10cSrcweir             //#i4533# leading numbers followed by a dot have been remove while
737cdf0e10cSrcweir             //searching for the outline position
738cdf0e10cSrcweir             //to compensate this they must be removed from the paragraphs text content, too
739cdf0e10cSrcweir             sal_uInt16 nPos = 0;
740cdf0e10cSrcweir             String sTempNum;
741cdf0e10cSrcweir             while(sExpandedText.Len() && (sTempNum = sExpandedText.GetToken(0, '.', nPos)).Len() &&
742cdf0e10cSrcweir                     STRING_NOTFOUND != nPos &&
743cdf0e10cSrcweir                     ByteString(sTempNum, gsl_getSystemTextEncoding()).IsNumericAscii())
744cdf0e10cSrcweir             {
745cdf0e10cSrcweir                 sExpandedText.Erase(0, nPos);
746cdf0e10cSrcweir                 nPos = 0;
747cdf0e10cSrcweir             }
748cdf0e10cSrcweir 
749cdf0e10cSrcweir             if( !sExpandedText.Equals( sName ) )
750cdf0e10cSrcweir 			{
751cdf0e10cSrcweir 				sal_uInt16 nTmp = ::lcl_FindOutlineName( GetNodes(), sName, sal_True );
752cdf0e10cSrcweir 				if( USHRT_MAX != nTmp )				// ueber den Namen gefunden
753cdf0e10cSrcweir 				{
754cdf0e10cSrcweir 					nFndPos = nTmp;
755cdf0e10cSrcweir 					pNd = rOutlNds[ nFndPos ]->GetTxtNode();
756cdf0e10cSrcweir 				}
757cdf0e10cSrcweir 			}
758cdf0e10cSrcweir 			rPos.nNode = *pNd;
759cdf0e10cSrcweir 			rPos.nContent.Assign( pNd, 0 );
760cdf0e10cSrcweir 			return sal_True;
761cdf0e10cSrcweir 		}
762cdf0e10cSrcweir 
763cdf0e10cSrcweir 		nFndPos = ::lcl_FindOutlineName( GetNodes(), rName, sal_False );
764cdf0e10cSrcweir 		if( USHRT_MAX != nFndPos )
765cdf0e10cSrcweir 		{
766cdf0e10cSrcweir 			SwTxtNode* pNd = rOutlNds[ nFndPos ]->GetTxtNode();
767cdf0e10cSrcweir 			rPos.nNode = *pNd;
768cdf0e10cSrcweir 			rPos.nContent.Assign( pNd, 0 );
769cdf0e10cSrcweir 			return sal_True;
770cdf0e10cSrcweir 		}
771cdf0e10cSrcweir 
772cdf0e10cSrcweir         // --> OD 2006-09-22 #i68289#
773cdf0e10cSrcweir         // additional search on hyperlink URL without its outline numbering part
774cdf0e10cSrcweir         if ( !sName.Equals( rName ) )
775cdf0e10cSrcweir         {
776cdf0e10cSrcweir             nFndPos = ::lcl_FindOutlineName( GetNodes(), sName, sal_False );
777cdf0e10cSrcweir             if( USHRT_MAX != nFndPos )
778cdf0e10cSrcweir             {
779cdf0e10cSrcweir                 SwTxtNode* pNd = rOutlNds[ nFndPos ]->GetTxtNode();
780cdf0e10cSrcweir                 rPos.nNode = *pNd;
781cdf0e10cSrcweir                 rPos.nContent.Assign( pNd, 0 );
782cdf0e10cSrcweir                 return sal_True;
783cdf0e10cSrcweir             }
784cdf0e10cSrcweir         }
785cdf0e10cSrcweir         // <--
786cdf0e10cSrcweir 	}
787cdf0e10cSrcweir 	return sal_False;
788cdf0e10cSrcweir }
789cdf0e10cSrcweir 
790cdf0e10cSrcweir /*  */
791cdf0e10cSrcweir 
792cdf0e10cSrcweir // --- Nummerierung -----------------------------------------
793cdf0e10cSrcweir 
794cdf0e10cSrcweir // --> OD 2008-02-19 #refactorlists#
795cdf0e10cSrcweir //void SwNumRuleInfo::MakeList( SwDoc& rDoc, sal_Bool )
796cdf0e10cSrcweir //{
797cdf0e10cSrcweir //    SwNumRule* pRule = rDoc.FindNumRulePtr(rName);
798cdf0e10cSrcweir 
799cdf0e10cSrcweir //    // no rule, no fun.
800cdf0e10cSrcweir //    if ( !pRule )
801cdf0e10cSrcweir //        return;
802cdf0e10cSrcweir 
803cdf0e10cSrcweir //    //
804cdf0e10cSrcweir //    // 1. Case: Information already available at pRule:
805cdf0e10cSrcweir //    //
806cdf0e10cSrcweir //    if (pRule->GetTxtNodeList())
807cdf0e10cSrcweir //    {
808cdf0e10cSrcweir //        // copy list to own pList pointer:
809cdf0e10cSrcweir //        aList = *pRule->GetTxtNodeList();
810cdf0e10cSrcweir //        return;
811cdf0e10cSrcweir //    }
812cdf0e10cSrcweir 
813cdf0e10cSrcweir //    //
814cdf0e10cSrcweir //    // 2. Case: Information has to be generated from scratch:
815cdf0e10cSrcweir //    //
816cdf0e10cSrcweir 
817cdf0e10cSrcweir //    if (pRule->IsOutlineRule())
818cdf0e10cSrcweir //    {
819cdf0e10cSrcweir //        const SwOutlineNodes & rOutlineNodes = rDoc.GetNodes().GetOutLineNds();
820cdf0e10cSrcweir 
821cdf0e10cSrcweir //        for (sal_uInt16 i = 0; i < rOutlineNodes.Count(); ++i)
822cdf0e10cSrcweir //        {
823cdf0e10cSrcweir //            SwTxtNode & aNode = *((SwTxtNode *) rOutlineNodes[i]);
824cdf0e10cSrcweir 
825cdf0e10cSrcweir //            if (pRule == aNode.GetNumRule())
826cdf0e10cSrcweir //                AddNode(aNode);
827cdf0e10cSrcweir //        }
828cdf0e10cSrcweir //    }
829cdf0e10cSrcweir //    {
830cdf0e10cSrcweir //        SwModify* pMod;
831cdf0e10cSrcweir //        const SfxPoolItem* pItem;
832cdf0e10cSrcweir //        sal_uInt16 i, nMaxItems = rDoc.GetAttrPool().GetItemCount
833cdf0e10cSrcweir //            ( RES_PARATR_NUMRULE);
834cdf0e10cSrcweir //        for( i = 0; i < nMaxItems; ++i )
835cdf0e10cSrcweir //        {
836cdf0e10cSrcweir //            pItem = rDoc.GetAttrPool().GetItem( RES_PARATR_NUMRULE, i );
837cdf0e10cSrcweir //            if( 0 != pItem)
838cdf0e10cSrcweir //            {
839cdf0e10cSrcweir //                pMod = (SwModify*)((SwNumRuleItem*)pItem)->GetDefinedIn();
840cdf0e10cSrcweir //                if (0 != pMod &&
841cdf0e10cSrcweir //                    ((SwNumRuleItem*)pItem)->GetValue().Len() &&
842cdf0e10cSrcweir //                    ((SwNumRuleItem*)pItem)->GetValue() == rName )
843cdf0e10cSrcweir //                {
844cdf0e10cSrcweir //                    if( pMod->IsA( TYPE( SwFmt )) )
845cdf0e10cSrcweir //                        pMod->GetInfo( *this );
846cdf0e10cSrcweir //                    else
847cdf0e10cSrcweir //                    {
848cdf0e10cSrcweir //                        SwTxtNode* pModTxtNode = (SwTxtNode*)pMod;
849cdf0e10cSrcweir 
850cdf0e10cSrcweir //                        // #115901#
851cdf0e10cSrcweir //                        if( pModTxtNode->GetNodes().IsDocNodes())
852cdf0e10cSrcweir //                        {
853cdf0e10cSrcweir //                            AddNode( *pModTxtNode );
854cdf0e10cSrcweir //                        }
855cdf0e10cSrcweir //                    }
856cdf0e10cSrcweir //                }
857cdf0e10cSrcweir //            }
858cdf0e10cSrcweir //        }
859cdf0e10cSrcweir //    }
860cdf0e10cSrcweir 
861cdf0e10cSrcweir //    // --> FME 2004-11-03 #i36571# The numrule and this info structure should
862cdf0e10cSrcweir //    // have different instances of the list:
863cdf0e10cSrcweir //    // --> OD 2006-09-12 #i69145#
864cdf0e10cSrcweir //    // method <SwNumRule::SetList(..)> copies content of list provided by the parameter
865cdf0e10cSrcweir //    pRule->SetTxtNodeList( aList );
866cdf0e10cSrcweir //    // <--
867cdf0e10cSrcweir //}
868cdf0e10cSrcweir // <--
869cdf0e10cSrcweir 
870cdf0e10cSrcweir 
lcl_ChgNumRule(SwDoc & rDoc,const SwNumRule & rRule)871cdf0e10cSrcweir void lcl_ChgNumRule( SwDoc& rDoc, const SwNumRule& rRule )
872cdf0e10cSrcweir {
873cdf0e10cSrcweir 	SwNumRule* pOld = rDoc.FindNumRulePtr( rRule.GetName() );
874cdf0e10cSrcweir 	ASSERT( pOld, "ohne die alte NumRule geht gar nichts" );
875cdf0e10cSrcweir 
876cdf0e10cSrcweir     sal_uInt16 nChgFmtLevel = 0, nMask = 1;
877cdf0e10cSrcweir 	sal_uInt8 n;
878cdf0e10cSrcweir 
879cdf0e10cSrcweir 	for( n = 0; n < MAXLEVEL; ++n, nMask <<= 1 )
880cdf0e10cSrcweir 	{
881cdf0e10cSrcweir 		const SwNumFmt& rOldFmt = pOld->Get( n ),
882cdf0e10cSrcweir 					  & rNewFmt = rRule.Get( n );
883cdf0e10cSrcweir 
884cdf0e10cSrcweir 		if( rOldFmt != rNewFmt )
885cdf0e10cSrcweir 		{
886cdf0e10cSrcweir 			nChgFmtLevel |= nMask;
887cdf0e10cSrcweir 		}
888cdf0e10cSrcweir 		else if( SVX_NUM_NUMBER_NONE > rNewFmt.GetNumberingType() && 1 < rNewFmt.GetIncludeUpperLevels() &&
889cdf0e10cSrcweir 				0 != (nChgFmtLevel & GetUpperLvlChg( n, rNewFmt.GetIncludeUpperLevels(),nMask )) )
890cdf0e10cSrcweir 			nChgFmtLevel |= nMask;
891cdf0e10cSrcweir 	}
892cdf0e10cSrcweir 
893cdf0e10cSrcweir     if( !nChgFmtLevel )         // es wurde nichts veraendert?
894cdf0e10cSrcweir     {
895cdf0e10cSrcweir         // --> OD 2006-04-27 #i64311#
896cdf0e10cSrcweir         const bool bInvalidateNumRule( pOld->IsContinusNum() != rRule.IsContinusNum() );
897cdf0e10cSrcweir         // <--
898cdf0e10cSrcweir         pOld->CheckCharFmts( &rDoc );
899cdf0e10cSrcweir         pOld->SetContinusNum( rRule.IsContinusNum() );
900cdf0e10cSrcweir         // --> OD 2008-06-17 #i87166#
901cdf0e10cSrcweir         // Do NOT change list style type
902cdf0e10cSrcweir //        pOld->SetRuleType( rRule.GetRuleType() );
903cdf0e10cSrcweir         // <--
904cdf0e10cSrcweir         // --> OD 2006-04-27 #i64311#
905cdf0e10cSrcweir         if ( bInvalidateNumRule )
906cdf0e10cSrcweir         {
907cdf0e10cSrcweir             pOld->SetInvalidRule(sal_True);
908cdf0e10cSrcweir         }
909cdf0e10cSrcweir         // <--
910cdf0e10cSrcweir         return ;
911cdf0e10cSrcweir 	}
912cdf0e10cSrcweir 
913cdf0e10cSrcweir     // --> OD 2008-02-19 #refactorlists#
914cdf0e10cSrcweir //    SwNumRuleInfo* pUpd = new SwNumRuleInfo( rRule.GetName() );
915cdf0e10cSrcweir //    pUpd->MakeList( rDoc );
916cdf0e10cSrcweir 
917cdf0e10cSrcweir //    sal_uInt8 nLvl;
918cdf0e10cSrcweir //    for( sal_uLong nFirst = 0, nLast = pUpd->GetList().Count();
919cdf0e10cSrcweir //        nFirst < nLast; ++nFirst )
920cdf0e10cSrcweir //    {
921cdf0e10cSrcweir //        SwTxtNode* pTxtNd = pUpd->GetList().GetObject( nFirst );
922cdf0e10cSrcweir //        nLvl = static_cast<sal_uInt8>(pTxtNd->GetLevel());
923cdf0e10cSrcweir 
924cdf0e10cSrcweir //        if( nLvl < MAXLEVEL )
925cdf0e10cSrcweir //        {
926cdf0e10cSrcweir //            if( nChgFmtLevel & ( 1 << nLvl ))
927cdf0e10cSrcweir //            {
928cdf0e10cSrcweir //                pTxtNd->NumRuleChgd();
929cdf0e10cSrcweir //            }
930cdf0e10cSrcweir //        }
931cdf0e10cSrcweir //    }
932cdf0e10cSrcweir     SwNumRule::tTxtNodeList aTxtNodeList;
933cdf0e10cSrcweir     pOld->GetTxtNodeList( aTxtNodeList );
934cdf0e10cSrcweir     sal_uInt8 nLvl( 0 );
935cdf0e10cSrcweir     for ( SwNumRule::tTxtNodeList::iterator aIter = aTxtNodeList.begin();
936cdf0e10cSrcweir           aIter != aTxtNodeList.end(); ++aIter )
937cdf0e10cSrcweir     {
938cdf0e10cSrcweir         SwTxtNode* pTxtNd = *aIter;
939cdf0e10cSrcweir         nLvl = static_cast<sal_uInt8>(pTxtNd->GetActualListLevel());
940cdf0e10cSrcweir 
941cdf0e10cSrcweir         if( nLvl < MAXLEVEL )
942cdf0e10cSrcweir         {
943cdf0e10cSrcweir             if( nChgFmtLevel & ( 1 << nLvl ))
944cdf0e10cSrcweir             {
945cdf0e10cSrcweir                 pTxtNd->NumRuleChgd();
946cdf0e10cSrcweir             }
947cdf0e10cSrcweir         }
948cdf0e10cSrcweir     }
949cdf0e10cSrcweir     // <--
950cdf0e10cSrcweir 
951cdf0e10cSrcweir 	for( n = 0; n < MAXLEVEL; ++n )
952cdf0e10cSrcweir 		if( nChgFmtLevel & ( 1 << n ))
953cdf0e10cSrcweir 			pOld->Set( n, rRule.GetNumFmt( n ));
954cdf0e10cSrcweir 
955cdf0e10cSrcweir 	pOld->CheckCharFmts( &rDoc );
956cdf0e10cSrcweir 	pOld->SetInvalidRule(sal_True);
957cdf0e10cSrcweir 	pOld->SetContinusNum( rRule.IsContinusNum() );
958cdf0e10cSrcweir     // --> OD 2008-06-17 #i87166#
959cdf0e10cSrcweir     // Do NOT change list style type
960cdf0e10cSrcweir //    pOld->SetRuleType( rRule.GetRuleType() );
961cdf0e10cSrcweir     // <--
962cdf0e10cSrcweir 
963cdf0e10cSrcweir     // --> OD 2008-02-19 #refactorlists#
964cdf0e10cSrcweir //    delete pUpd;
965cdf0e10cSrcweir     // <--
966cdf0e10cSrcweir 
967cdf0e10cSrcweir     rDoc.UpdateNumRule();
968cdf0e10cSrcweir }
969cdf0e10cSrcweir 
970cdf0e10cSrcweir // OD 2008-02-08 #newlistlevelattrs# - add handling of parameter <bResetIndentAttrs>
971cdf0e10cSrcweir // --> OD 2008-03-17 #refactorlists#
SetNumRule(const SwPaM & rPam,const SwNumRule & rRule,const bool bCreateNewList,const String sContinuedListId,sal_Bool bSetItem,const bool bResetIndentAttrs)972cdf0e10cSrcweir void SwDoc::SetNumRule( const SwPaM& rPam,
973cdf0e10cSrcweir                         const SwNumRule& rRule,
974cdf0e10cSrcweir                         const bool bCreateNewList,
975cdf0e10cSrcweir                         const String sContinuedListId,
976cdf0e10cSrcweir                         sal_Bool bSetItem,
977cdf0e10cSrcweir                         const bool bResetIndentAttrs )
978cdf0e10cSrcweir {
979cdf0e10cSrcweir     SwUndoInsNum * pUndo = NULL;
980cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
981cdf0e10cSrcweir     {
982cdf0e10cSrcweir         // Start/End for attributes!
983cdf0e10cSrcweir         GetIDocumentUndoRedo().StartUndo( UNDO_INSNUM, NULL );
984cdf0e10cSrcweir         pUndo = new SwUndoInsNum( rPam, rRule );
985cdf0e10cSrcweir         GetIDocumentUndoRedo().AppendUndo(pUndo);
986cdf0e10cSrcweir     }
987cdf0e10cSrcweir 
988cdf0e10cSrcweir 	SwNumRule * pNew = FindNumRulePtr( rRule.GetName() );
989cdf0e10cSrcweir     bool bUpdateRule = false;
990cdf0e10cSrcweir 
991cdf0e10cSrcweir 	if( !pNew )
992cdf0e10cSrcweir     {
993cdf0e10cSrcweir 		pNew = (*pNumRuleTbl)[ MakeNumRule( rRule.GetName(), &rRule ) ];
994cdf0e10cSrcweir     }
995cdf0e10cSrcweir     else if (rRule != *pNew)
996cdf0e10cSrcweir     {
997cdf0e10cSrcweir         bUpdateRule = true;
998cdf0e10cSrcweir     }
999cdf0e10cSrcweir 
1000cdf0e10cSrcweir     if (bUpdateRule)
1001cdf0e10cSrcweir     {
1002cdf0e10cSrcweir         if( pUndo )
1003cdf0e10cSrcweir         {
1004cdf0e10cSrcweir         	pUndo->SaveOldNumRule( *pNew );
1005cdf0e10cSrcweir 			::lcl_ChgNumRule( *this, rRule );
1006cdf0e10cSrcweir 			pUndo->SetLRSpaceEndPos();
1007cdf0e10cSrcweir         }
1008cdf0e10cSrcweir         else
1009cdf0e10cSrcweir         {
1010cdf0e10cSrcweir 			::lcl_ChgNumRule( *this, rRule );
1011cdf0e10cSrcweir         }
1012cdf0e10cSrcweir     }
1013cdf0e10cSrcweir 
1014cdf0e10cSrcweir     if ( bSetItem )
1015cdf0e10cSrcweir     {
1016cdf0e10cSrcweir         if ( bCreateNewList )
1017cdf0e10cSrcweir         {
1018cdf0e10cSrcweir             String sListId;
1019cdf0e10cSrcweir             if ( !bUpdateRule )
1020cdf0e10cSrcweir             {
1021cdf0e10cSrcweir                 // apply list id of list, which has been created for the new list style
1022cdf0e10cSrcweir                 sListId = pNew->GetDefaultListId();
1023cdf0e10cSrcweir             }
1024cdf0e10cSrcweir             else
1025cdf0e10cSrcweir             {
1026cdf0e10cSrcweir                 // create new list and apply its list id
1027cdf0e10cSrcweir                 SwList* pNewList = createList( String(), pNew->GetName() );
1028cdf0e10cSrcweir                 ASSERT( pNewList,
1029cdf0e10cSrcweir                         "<SwDoc::SetNumRule(..)> - could not create new list. Serious defect -> please inform OD." );
1030cdf0e10cSrcweir                 sListId = pNewList->GetListId();
1031cdf0e10cSrcweir             }
1032*69a74367SOliver-Rainer Wittmann             InsertPoolItem( rPam, SfxStringItem( RES_PARATR_LIST_ID, sListId ), 0 );
1033cdf0e10cSrcweir         }
1034cdf0e10cSrcweir         else if ( sContinuedListId.Len() > 0 )
1035cdf0e10cSrcweir         {
1036cdf0e10cSrcweir             // apply given list id
1037*69a74367SOliver-Rainer Wittmann             InsertPoolItem( rPam, SfxStringItem( RES_PARATR_LIST_ID, sContinuedListId ), 0 );
1038cdf0e10cSrcweir         }
1039cdf0e10cSrcweir     }
1040cdf0e10cSrcweir 
1041cdf0e10cSrcweir     if ( ! rPam.HasMark())
1042cdf0e10cSrcweir     {
1043cdf0e10cSrcweir         SwTxtNode * pTxtNd = rPam.GetPoint()->nNode.GetNode().GetTxtNode();
1044cdf0e10cSrcweir         // consider case that the PaM doesn't denote a text node - e.g. it denotes a graphic node
1045cdf0e10cSrcweir         if ( pTxtNd )
1046cdf0e10cSrcweir         {
1047cdf0e10cSrcweir             SwNumRule * pRule = pTxtNd->GetNumRule();
1048cdf0e10cSrcweir 
1049cdf0e10cSrcweir             if (pRule && pRule->GetName() == pNew->GetName())
1050cdf0e10cSrcweir             {
1051cdf0e10cSrcweir                 bSetItem = sal_False;
1052cdf0e10cSrcweir                 if ( !pTxtNd->IsInList() )
1053cdf0e10cSrcweir                 {
1054cdf0e10cSrcweir                     pTxtNd->AddToList();
1055cdf0e10cSrcweir                 }
1056cdf0e10cSrcweir             }
1057*69a74367SOliver-Rainer Wittmann             // only clear numbering attribute at text node,
1058*69a74367SOliver-Rainer Wittmann             // if at paragraph style the new numbering rule is found.
1059cdf0e10cSrcweir             else if ( !pRule )
1060cdf0e10cSrcweir             {
1061cdf0e10cSrcweir                 SwTxtFmtColl* pColl = pTxtNd->GetTxtColl();
1062cdf0e10cSrcweir                 if ( pColl )
1063cdf0e10cSrcweir                 {
1064cdf0e10cSrcweir                     SwNumRule* pCollRule = FindNumRulePtr(pColl->GetNumRule().GetValue());
1065cdf0e10cSrcweir                     if ( pCollRule && pCollRule->GetName() == pNew->GetName() )
1066cdf0e10cSrcweir                     {
1067cdf0e10cSrcweir                         pTxtNd->ResetAttr( RES_PARATR_NUMRULE );
1068cdf0e10cSrcweir                         bSetItem = sal_False;
1069cdf0e10cSrcweir                     }
1070cdf0e10cSrcweir                 }
1071cdf0e10cSrcweir             }
1072cdf0e10cSrcweir         }
1073cdf0e10cSrcweir     }
1074cdf0e10cSrcweir 
1075cdf0e10cSrcweir     if ( bSetItem )
1076cdf0e10cSrcweir     {
1077cdf0e10cSrcweir         InsertPoolItem( rPam, SwNumRuleItem( pNew->GetName() ), 0 );
1078cdf0e10cSrcweir     }
1079cdf0e10cSrcweir 
1080cdf0e10cSrcweir     if ( bResetIndentAttrs &&
1081cdf0e10cSrcweir          pNew && pNew->Get( 0 ).GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
1082cdf0e10cSrcweir     {
1083cdf0e10cSrcweir         SvUShortsSort aResetAttrsArray;
1084cdf0e10cSrcweir         aResetAttrsArray.Insert( RES_LR_SPACE );
1085cdf0e10cSrcweir         // On a selection setup a corresponding Point-and-Mark in order to get
1086cdf0e10cSrcweir         // the indentation attribute reset on all paragraphs touched by the selection
1087cdf0e10cSrcweir         if ( rPam.HasMark() &&
1088cdf0e10cSrcweir              rPam.End()->nNode.GetNode().GetTxtNode() )
1089cdf0e10cSrcweir         {
1090cdf0e10cSrcweir             SwPaM aPam( rPam.Start()->nNode,
1091cdf0e10cSrcweir                         rPam.End()->nNode );
1092cdf0e10cSrcweir             aPam.Start()->nContent = 0;
1093cdf0e10cSrcweir             aPam.End()->nContent = rPam.End()->nNode.GetNode().GetTxtNode()->Len();
1094cdf0e10cSrcweir             ResetAttrs( aPam, sal_False, &aResetAttrsArray );
1095cdf0e10cSrcweir         }
1096cdf0e10cSrcweir         else
1097cdf0e10cSrcweir         {
1098cdf0e10cSrcweir             ResetAttrs( rPam, sal_False, &aResetAttrsArray );
1099cdf0e10cSrcweir         }
1100cdf0e10cSrcweir     }
1101cdf0e10cSrcweir 
1102cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
1103cdf0e10cSrcweir     {
1104cdf0e10cSrcweir         GetIDocumentUndoRedo().EndUndo( UNDO_INSNUM, NULL );
1105cdf0e10cSrcweir     }
1106cdf0e10cSrcweir 
1107*69a74367SOliver-Rainer Wittmann     SetModified();
1108cdf0e10cSrcweir }
1109cdf0e10cSrcweir 
SetCounted(const SwPaM & rPam,bool bCounted)1110cdf0e10cSrcweir void SwDoc::SetCounted(const SwPaM & rPam, bool bCounted)
1111cdf0e10cSrcweir {
1112cdf0e10cSrcweir     if ( bCounted )
1113cdf0e10cSrcweir     {
1114cdf0e10cSrcweir         SvUShortsSort aResetAttrsArray;
1115cdf0e10cSrcweir         aResetAttrsArray.Insert( RES_PARATR_LIST_ISCOUNTED );
1116cdf0e10cSrcweir         // On a selection setup a corresponding Point-and-Mark in order to get
1117cdf0e10cSrcweir         // the list-is-counted attribute reset on all paragraphs touched by the selection
1118cdf0e10cSrcweir         if ( rPam.HasMark() &&
1119cdf0e10cSrcweir              rPam.End()->nNode.GetNode().GetTxtNode() )
1120cdf0e10cSrcweir         {
1121cdf0e10cSrcweir             SwPaM aPam( rPam.Start()->nNode,
1122cdf0e10cSrcweir                         rPam.End()->nNode );
1123cdf0e10cSrcweir             aPam.Start()->nContent = 0;
1124cdf0e10cSrcweir             aPam.End()->nContent = rPam.End()->nNode.GetNode().GetTxtNode()->Len();
1125cdf0e10cSrcweir             ResetAttrs( aPam, sal_False, &aResetAttrsArray );
1126cdf0e10cSrcweir         }
1127cdf0e10cSrcweir         else
1128cdf0e10cSrcweir         {
1129cdf0e10cSrcweir             ResetAttrs( rPam, sal_False, &aResetAttrsArray );
1130cdf0e10cSrcweir         }
1131cdf0e10cSrcweir     }
1132cdf0e10cSrcweir     else
1133cdf0e10cSrcweir     {
1134*69a74367SOliver-Rainer Wittmann         InsertPoolItem( rPam, SfxBoolItem( RES_PARATR_LIST_ISCOUNTED, sal_False ), 0 );
1135cdf0e10cSrcweir     }
1136cdf0e10cSrcweir }
1137cdf0e10cSrcweir 
SetNumRuleStart(const SwPosition & rPos,sal_Bool bFlag)1138cdf0e10cSrcweir void SwDoc::SetNumRuleStart( const SwPosition& rPos, sal_Bool bFlag )
1139cdf0e10cSrcweir {
1140cdf0e10cSrcweir 	SwTxtNode* pTxtNd = rPos.nNode.GetNode().GetTxtNode();
1141cdf0e10cSrcweir 
1142cdf0e10cSrcweir     if (pTxtNd)
1143cdf0e10cSrcweir     {
1144cdf0e10cSrcweir         const SwNumRule* pRule = pTxtNd->GetNumRule();
1145cdf0e10cSrcweir         if( pRule && !bFlag != !pTxtNd->IsListRestart())
1146cdf0e10cSrcweir         {
1147cdf0e10cSrcweir             if (GetIDocumentUndoRedo().DoesUndo())
1148cdf0e10cSrcweir             {
1149cdf0e10cSrcweir                 SwUndo *const pUndo( new SwUndoNumRuleStart(rPos, bFlag) );
1150cdf0e10cSrcweir                 GetIDocumentUndoRedo().AppendUndo(pUndo);
1151cdf0e10cSrcweir             }
1152cdf0e10cSrcweir 
1153cdf0e10cSrcweir             pTxtNd->SetListRestart(bFlag ? true : false);
1154cdf0e10cSrcweir 
1155cdf0e10cSrcweir             SetModified();
1156cdf0e10cSrcweir         }
1157cdf0e10cSrcweir 	}
1158cdf0e10cSrcweir }
1159cdf0e10cSrcweir 
SetNodeNumStart(const SwPosition & rPos,sal_uInt16 nStt)1160cdf0e10cSrcweir void SwDoc::SetNodeNumStart( const SwPosition& rPos, sal_uInt16 nStt )
1161cdf0e10cSrcweir {
1162cdf0e10cSrcweir 	SwTxtNode* pTxtNd = rPos.nNode.GetNode().GetTxtNode();
1163cdf0e10cSrcweir 
1164cdf0e10cSrcweir     if (pTxtNd)
1165cdf0e10cSrcweir     {
1166cdf0e10cSrcweir         // --> OD 2008-02-27 #refactorlists#
1167cdf0e10cSrcweir //        const SwNumRule* pRule = pTxtNd->GetNumRule();
1168cdf0e10cSrcweir //        if( pRule && nStt != pTxtNd->GetListRestartValue() )
1169cdf0e10cSrcweir //        {
1170cdf0e10cSrcweir //            if( DoesUndo() )
1171cdf0e10cSrcweir //            {
1172cdf0e10cSrcweir //                ClearRedo();
1173cdf0e10cSrcweir //                AppendUndo( new SwUndoNumRuleStart( rPos, nStt ));
1174cdf0e10cSrcweir //            }
1175cdf0e10cSrcweir //        }
1176cdf0e10cSrcweir //        pTxtNd->SetListRestartValue(nStt);
1177cdf0e10cSrcweir 
1178cdf0e10cSrcweir //        SetModified();
1179cdf0e10cSrcweir         if ( !pTxtNd->HasAttrListRestartValue() ||
1180cdf0e10cSrcweir              pTxtNd->GetAttrListRestartValue() != nStt )
1181cdf0e10cSrcweir         {
1182cdf0e10cSrcweir             if (GetIDocumentUndoRedo().DoesUndo())
1183cdf0e10cSrcweir             {
1184cdf0e10cSrcweir                 SwUndo *const pUndo( new SwUndoNumRuleStart(rPos, nStt) );
1185cdf0e10cSrcweir                 GetIDocumentUndoRedo().AppendUndo(pUndo);
1186cdf0e10cSrcweir             }
1187cdf0e10cSrcweir             pTxtNd->SetAttrListRestartValue( nStt );
1188cdf0e10cSrcweir 
1189cdf0e10cSrcweir             SetModified();
1190cdf0e10cSrcweir         }
1191cdf0e10cSrcweir         // <--
1192cdf0e10cSrcweir 	}
1193cdf0e10cSrcweir }
1194cdf0e10cSrcweir 
1195cdf0e10cSrcweir 	// loeschen geht nur, wenn die Rule niemand benutzt!
DelNumRule(const String & rName,sal_Bool bBroadcast)1196cdf0e10cSrcweir sal_Bool SwDoc::DelNumRule( const String& rName, sal_Bool bBroadcast )
1197cdf0e10cSrcweir {
1198cdf0e10cSrcweir 	sal_uInt16 nPos = FindNumRule( rName );
1199cdf0e10cSrcweir 
1200cdf0e10cSrcweir     // --> OD 2007-12-17 #151213#
1201cdf0e10cSrcweir     if ( (*pNumRuleTbl)[ nPos ] == GetOutlineNumRule() )
1202cdf0e10cSrcweir     {
1203cdf0e10cSrcweir         ASSERT( false,
1204cdf0e10cSrcweir                 "<SwDoc::DelNumRule(..)> - No deletion of outline list style. This is serious defect - please inform OD" );
1205cdf0e10cSrcweir         return sal_False;
1206cdf0e10cSrcweir     }
1207cdf0e10cSrcweir     // <--
1208cdf0e10cSrcweir 
1209cdf0e10cSrcweir     if( USHRT_MAX != nPos && !IsUsed( *(*pNumRuleTbl)[ nPos ] ))
1210cdf0e10cSrcweir 	{
1211cdf0e10cSrcweir         if (GetIDocumentUndoRedo().DoesUndo())
1212cdf0e10cSrcweir         {
1213cdf0e10cSrcweir             SwUndo * pUndo =
1214cdf0e10cSrcweir                 new SwUndoNumruleDelete(*(*pNumRuleTbl)[nPos], this);
1215cdf0e10cSrcweir             GetIDocumentUndoRedo().AppendUndo(pUndo);
1216cdf0e10cSrcweir         }
1217cdf0e10cSrcweir 
1218cdf0e10cSrcweir         if (bBroadcast)
1219cdf0e10cSrcweir             BroadcastStyleOperation(rName, SFX_STYLE_FAMILY_PSEUDO,
1220cdf0e10cSrcweir                                     SFX_STYLESHEET_ERASED);
1221cdf0e10cSrcweir 
1222cdf0e10cSrcweir         // --> OD 2008-04-02 #refactorlists#
1223cdf0e10cSrcweir         deleteListForListStyle( rName );
1224cdf0e10cSrcweir         {
1225cdf0e10cSrcweir             // delete further list, which have the deleted list style as default list style
1226cdf0e10cSrcweir             std::vector< SwList* > aListsForDeletion;
1227cdf0e10cSrcweir             tHashMapForLists::iterator aListIter = maLists.begin();
1228cdf0e10cSrcweir             while ( aListIter != maLists.end() )
1229cdf0e10cSrcweir             {
1230cdf0e10cSrcweir                 SwList* pList = (*aListIter).second;
1231cdf0e10cSrcweir                 if ( pList->GetDefaultListStyleName() == rName )
1232cdf0e10cSrcweir                 {
1233cdf0e10cSrcweir                     aListsForDeletion.push_back( pList );
1234cdf0e10cSrcweir                 }
1235cdf0e10cSrcweir 
1236cdf0e10cSrcweir                 ++aListIter;
1237cdf0e10cSrcweir             }
1238cdf0e10cSrcweir             while ( aListsForDeletion.size() > 0 )
1239cdf0e10cSrcweir             {
1240cdf0e10cSrcweir                 SwList* pList = aListsForDeletion.back();
1241cdf0e10cSrcweir                 aListsForDeletion.pop_back();
1242cdf0e10cSrcweir                 deleteList( pList->GetListId() );
1243cdf0e10cSrcweir             }
1244cdf0e10cSrcweir         }
1245cdf0e10cSrcweir         // <--
1246cdf0e10cSrcweir         // --> FME 2004-11-02 #i34097# DeleteAndDestroy deletes rName if
1247cdf0e10cSrcweir         // rName is directly taken from the numrule.
1248cdf0e10cSrcweir         const String aTmpName( rName );
1249cdf0e10cSrcweir         // <--
1250cdf0e10cSrcweir         pNumRuleTbl->DeleteAndDestroy( nPos );
1251cdf0e10cSrcweir         maNumRuleMap.erase(aTmpName);
1252cdf0e10cSrcweir 
1253cdf0e10cSrcweir 		SetModified();
1254cdf0e10cSrcweir 		return sal_True;
1255cdf0e10cSrcweir 	}
1256cdf0e10cSrcweir 	return sal_False;
1257cdf0e10cSrcweir }
1258cdf0e10cSrcweir 
1259cdf0e10cSrcweir // #106897#
ChgNumRuleFmts(const SwNumRule & rRule,const String * pName)1260cdf0e10cSrcweir void SwDoc::ChgNumRuleFmts( const SwNumRule& rRule, const String * pName )
1261cdf0e10cSrcweir {
1262cdf0e10cSrcweir     // #106897#
1263cdf0e10cSrcweir 	SwNumRule* pRule = FindNumRulePtr( pName ? *pName : rRule.GetName() );
1264cdf0e10cSrcweir 	if( pRule )
1265cdf0e10cSrcweir 	{
1266cdf0e10cSrcweir 		SwUndoInsNum* pUndo = 0;
1267cdf0e10cSrcweir         if (GetIDocumentUndoRedo().DoesUndo())
1268cdf0e10cSrcweir         {
1269cdf0e10cSrcweir 			pUndo = new SwUndoInsNum( *pRule, rRule );
1270cdf0e10cSrcweir 			pUndo->GetHistory();
1271cdf0e10cSrcweir             GetIDocumentUndoRedo().AppendUndo( pUndo );
1272cdf0e10cSrcweir         }
1273cdf0e10cSrcweir 		::lcl_ChgNumRule( *this, rRule );
1274cdf0e10cSrcweir 
1275cdf0e10cSrcweir 		if( pUndo )
1276cdf0e10cSrcweir 			pUndo->SetLRSpaceEndPos();
1277cdf0e10cSrcweir 
1278cdf0e10cSrcweir 		SetModified();
1279cdf0e10cSrcweir 	}
1280cdf0e10cSrcweir }
1281cdf0e10cSrcweir 
RenameNumRule(const String & rOldName,const String & rNewName,sal_Bool bBroadcast)1282cdf0e10cSrcweir sal_Bool SwDoc::RenameNumRule(const String & rOldName, const String & rNewName,
1283cdf0e10cSrcweir                               sal_Bool bBroadcast)
1284cdf0e10cSrcweir {
1285cdf0e10cSrcweir     sal_Bool bResult = sal_False;
1286cdf0e10cSrcweir     SwNumRule * pNumRule = FindNumRulePtr(rOldName);
1287cdf0e10cSrcweir 
1288cdf0e10cSrcweir     if (pNumRule)
1289cdf0e10cSrcweir     {
1290cdf0e10cSrcweir         if (GetIDocumentUndoRedo().DoesUndo())
1291cdf0e10cSrcweir         {
1292cdf0e10cSrcweir             SwUndo * pUndo = new SwUndoNumruleRename(rOldName, rNewName, this);
1293cdf0e10cSrcweir             GetIDocumentUndoRedo().AppendUndo(pUndo);
1294cdf0e10cSrcweir         }
1295cdf0e10cSrcweir 
1296cdf0e10cSrcweir         // --> OD 2008-02-19 #refactorlists#
1297cdf0e10cSrcweir //        SwNumRuleInfo aInfo(rOldName);
1298cdf0e10cSrcweir //        aInfo.MakeList(*this);
1299cdf0e10cSrcweir         SwNumRule::tTxtNodeList aTxtNodeList;
1300cdf0e10cSrcweir         pNumRule->GetTxtNodeList( aTxtNodeList );
1301cdf0e10cSrcweir         // <--
1302cdf0e10cSrcweir 
1303cdf0e10cSrcweir         // --> OD 2008-07-08 #i91400#
1304cdf0e10cSrcweir         pNumRule->SetName( rNewName, *this );
1305cdf0e10cSrcweir         // <--
1306cdf0e10cSrcweir 
1307cdf0e10cSrcweir         SwNumRuleItem aItem(rNewName);
1308cdf0e10cSrcweir         // --> OD 2008-02-19 #refactorlists#
1309cdf0e10cSrcweir //        for (sal_uLong nI = 0; nI < aInfo.GetList().Count(); ++nI)
1310cdf0e10cSrcweir //        {
1311cdf0e10cSrcweir //            SwTxtNode * pTxtNd = aInfo.GetList().GetObject(nI);
1312cdf0e10cSrcweir //            pTxtNd->SwCntntNode::SetAttr(aItem);
1313cdf0e10cSrcweir //        }
1314cdf0e10cSrcweir         for ( SwNumRule::tTxtNodeList::iterator aIter = aTxtNodeList.begin();
1315cdf0e10cSrcweir               aIter != aTxtNodeList.end(); ++aIter )
1316cdf0e10cSrcweir         {
1317cdf0e10cSrcweir             SwTxtNode * pTxtNd = *aIter;
1318cdf0e10cSrcweir             pTxtNd->SetAttr(aItem);
1319cdf0e10cSrcweir         }
1320cdf0e10cSrcweir         // <--
1321cdf0e10cSrcweir 
1322cdf0e10cSrcweir         bResult = sal_True;
1323cdf0e10cSrcweir 
1324cdf0e10cSrcweir         if (bBroadcast)
1325cdf0e10cSrcweir             BroadcastStyleOperation(rOldName, SFX_STYLE_FAMILY_PSEUDO,
1326cdf0e10cSrcweir                                     SFX_STYLESHEET_MODIFIED);
1327cdf0e10cSrcweir     }
1328cdf0e10cSrcweir 
1329cdf0e10cSrcweir     return bResult;
1330cdf0e10cSrcweir }
1331cdf0e10cSrcweir 
StopNumRuleAnimations(OutputDevice * pOut)1332cdf0e10cSrcweir void SwDoc::StopNumRuleAnimations( OutputDevice* pOut )
1333cdf0e10cSrcweir {
1334cdf0e10cSrcweir 	for( sal_uInt16 n = GetNumRuleTbl().Count(); n; )
1335cdf0e10cSrcweir 	{
1336cdf0e10cSrcweir         SwNumRule::tTxtNodeList aTxtNodeList;
1337cdf0e10cSrcweir         GetNumRuleTbl()[ --n ]->GetTxtNodeList( aTxtNodeList );
1338cdf0e10cSrcweir         for ( SwNumRule::tTxtNodeList::iterator aTxtNodeIter = aTxtNodeList.begin();
1339cdf0e10cSrcweir               aTxtNodeIter != aTxtNodeList.end(); ++aTxtNodeIter )
1340cdf0e10cSrcweir         {
1341cdf0e10cSrcweir             SwTxtNode* pTNd = *aTxtNodeIter;
1342cdf0e10cSrcweir             SwIterator<SwTxtFrm,SwTxtNode> aIter(*pTNd);
1343cdf0e10cSrcweir             for(SwTxtFrm* pFrm = aIter.First(); pFrm; pFrm = aIter.Next() )
1344cdf0e10cSrcweir                 if( pFrm->HasAnimation() )
1345cdf0e10cSrcweir                     pFrm->StopAnimation( pOut );
1346cdf0e10cSrcweir         }
1347cdf0e10cSrcweir 	}
1348cdf0e10cSrcweir }
1349cdf0e10cSrcweir 
ReplaceNumRule(const SwPosition & rPos,const String & rOldRule,const String & rNewRule)1350cdf0e10cSrcweir sal_Bool SwDoc::ReplaceNumRule( const SwPosition& rPos,
1351cdf0e10cSrcweir 							const String& rOldRule, const String& rNewRule )
1352cdf0e10cSrcweir {
1353cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
1354cdf0e10cSrcweir 	SwNumRule *pOldRule = FindNumRulePtr( rOldRule ),
1355cdf0e10cSrcweir 			  *pNewRule = FindNumRulePtr( rNewRule );
1356cdf0e10cSrcweir 	if( pOldRule && pNewRule && pOldRule != pNewRule )
1357cdf0e10cSrcweir 	{
1358cdf0e10cSrcweir         // --> OD 2008-02-19 #refactorlists#
1359cdf0e10cSrcweir         SwUndoInsNum* pUndo = 0;
1360cdf0e10cSrcweir         if (GetIDocumentUndoRedo().DoesUndo())
1361cdf0e10cSrcweir         {
1362cdf0e10cSrcweir             // Start/End for attributes!
1363cdf0e10cSrcweir             GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
1364cdf0e10cSrcweir             pUndo = new SwUndoInsNum( rPos, *pNewRule, rOldRule );
1365cdf0e10cSrcweir             GetIDocumentUndoRedo().AppendUndo(pUndo);
1366cdf0e10cSrcweir         }
1367cdf0e10cSrcweir 
1368cdf0e10cSrcweir         // --> OD 2008-02-19 #refactorlists#
1369cdf0e10cSrcweir         // apply new list style <pNewRule> to all text nodes, which have the
1370cdf0e10cSrcweir         // old list style <pOldNRule> applied and belong to the same list as
1371cdf0e10cSrcweir         // the text node of the given <SwPosition>.
1372cdf0e10cSrcweir //        SwNumRuleInfo aUpd( rOldRule );
1373cdf0e10cSrcweir //        aUpd.MakeList( *this );
1374cdf0e10cSrcweir 
1375cdf0e10cSrcweir //        if (aUpd.GetList().Count() > 0)    // #106897#
1376cdf0e10cSrcweir         SwNumRule::tTxtNodeList aTxtNodeList;
1377cdf0e10cSrcweir         pOldRule->GetTxtNodeList( aTxtNodeList );
1378cdf0e10cSrcweir         if ( aTxtNodeList.size() > 0 )
1379cdf0e10cSrcweir         {
1380cdf0e10cSrcweir //            // Position suchen und bestimme ob ein Node davor oder dahinter
1381cdf0e10cSrcweir //            // einen Start erzwingt
1382cdf0e10cSrcweir //            SwTxtNode* pTxtNd;
1383cdf0e10cSrcweir //            sal_uLong nFndPos, nFirst, nLast;
1384cdf0e10cSrcweir 
1385cdf0e10cSrcweir //            if( TABLE_ENTRY_NOTFOUND != aUpd.GetList().SearchKey(
1386cdf0e10cSrcweir //                                                                 rPos.nNode.GetIndex(), &nFndPos ))
1387cdf0e10cSrcweir //                ++nFndPos;
1388cdf0e10cSrcweir 
1389cdf0e10cSrcweir //            for( nLast = nFndPos; nLast < aUpd.GetList().Count(); ++nLast )
1390cdf0e10cSrcweir //            {
1391cdf0e10cSrcweir //                pTxtNd = aUpd.GetList().GetObject( nLast );
1392cdf0e10cSrcweir //                if(pTxtNd->IsRestart())
1393cdf0e10cSrcweir //                    break;
1394cdf0e10cSrcweir //            }
1395cdf0e10cSrcweir //            for( nFirst = nFndPos; nFirst; )
1396cdf0e10cSrcweir //            {
1397cdf0e10cSrcweir //                pTxtNd = aUpd.GetList().GetObject( --nFirst );
1398cdf0e10cSrcweir //                if( pTxtNd->IsRestart() )
1399cdf0e10cSrcweir //                    break;
1400cdf0e10cSrcweir //            }
1401cdf0e10cSrcweir //            // dann neue Numerierung ueber diesen Bereich
1402cdf0e10cSrcweir //            // definieren und den Start am Anfang/Ende zurueck setzen
1403cdf0e10cSrcweir //            pTxtNd = aUpd.GetList().GetObject( nFirst );
1404cdf0e10cSrcweir //            if( pTxtNd->IsRestart() )
1405cdf0e10cSrcweir //            {
1406cdf0e10cSrcweir //                pTxtNd->SetRestart(false);
1407cdf0e10cSrcweir //                if( pUndo )
1408cdf0e10cSrcweir //                    pUndo->SetSttNum( pTxtNd->GetIndex() );
1409cdf0e10cSrcweir //            }
1410cdf0e10cSrcweir 
1411cdf0e10cSrcweir             SwRegHistory aRegH( pUndo ? pUndo->GetHistory() : 0 );
1412cdf0e10cSrcweir             sal_uInt16 nChgFmtLevel = 0;
1413cdf0e10cSrcweir             for( sal_uInt8 n = 0; n < MAXLEVEL; ++n )
1414cdf0e10cSrcweir             {
1415cdf0e10cSrcweir                 const SwNumFmt& rOldFmt = pOldRule->Get( n ),
1416cdf0e10cSrcweir                     & rNewFmt = pNewRule->Get( n );
1417cdf0e10cSrcweir 
1418cdf0e10cSrcweir                 if( rOldFmt.GetAbsLSpace() != rNewFmt.GetAbsLSpace() ||
1419cdf0e10cSrcweir                     rOldFmt.GetFirstLineOffset() != rNewFmt.GetFirstLineOffset() )
1420cdf0e10cSrcweir                     nChgFmtLevel |= ( 1 << n );
1421cdf0e10cSrcweir             }
1422cdf0e10cSrcweir 
1423cdf0e10cSrcweir             const SwTxtNode* pGivenTxtNode = rPos.nNode.GetNode().GetTxtNode();
1424cdf0e10cSrcweir             SwNumRuleItem aRule( rNewRule );
1425cdf0e10cSrcweir //            for( ; nFirst < nLast; ++nFirst )
1426cdf0e10cSrcweir //            {
1427cdf0e10cSrcweir //                pTxtNd = aUpd.GetList().GetObject( nFirst );
1428cdf0e10cSrcweir 
1429cdf0e10cSrcweir //                aRegH.RegisterInModify( pTxtNd, *pTxtNd );
1430cdf0e10cSrcweir 
1431cdf0e10cSrcweir //                pTxtNd->SwCntntNode::SetAttr( aRule );
1432cdf0e10cSrcweir //                pTxtNd->NumRuleChgd();
1433cdf0e10cSrcweir //            }
1434cdf0e10cSrcweir             for ( SwNumRule::tTxtNodeList::iterator aIter = aTxtNodeList.begin();
1435cdf0e10cSrcweir                   aIter != aTxtNodeList.end(); ++aIter )
1436cdf0e10cSrcweir             {
1437cdf0e10cSrcweir                 SwTxtNode* pTxtNd = *aIter;
1438cdf0e10cSrcweir 
1439cdf0e10cSrcweir                 if ( pGivenTxtNode &&
1440cdf0e10cSrcweir                      pGivenTxtNode->GetListId() == pTxtNd->GetListId() )
1441cdf0e10cSrcweir                 {
1442cdf0e10cSrcweir                     aRegH.RegisterInModify( pTxtNd, *pTxtNd );
1443cdf0e10cSrcweir 
1444cdf0e10cSrcweir                     pTxtNd->SetAttr( aRule );
1445cdf0e10cSrcweir                     pTxtNd->NumRuleChgd();
1446cdf0e10cSrcweir                 }
1447cdf0e10cSrcweir             }
1448cdf0e10cSrcweir             GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
1449cdf0e10cSrcweir             SetModified();
1450cdf0e10cSrcweir 
1451cdf0e10cSrcweir             bRet = sal_True;     // #106897#
1452cdf0e10cSrcweir         }
1453cdf0e10cSrcweir     }
1454cdf0e10cSrcweir 
1455cdf0e10cSrcweir 	return bRet;
1456cdf0e10cSrcweir }
1457cdf0e10cSrcweir 
1458cdf0e10cSrcweir // --> OD 2008-03-18 #refactorlists#
1459cdf0e10cSrcweir namespace
1460cdf0e10cSrcweir {
1461cdf0e10cSrcweir     struct ListStyleData
1462cdf0e10cSrcweir     {
1463cdf0e10cSrcweir         SwNumRule* pReplaceNumRule;
1464cdf0e10cSrcweir         bool bCreateNewList;
1465cdf0e10cSrcweir         String sListId;
1466cdf0e10cSrcweir 
ListStyleData__anonbf58d5930111::ListStyleData1467cdf0e10cSrcweir         ListStyleData()
1468cdf0e10cSrcweir             : pReplaceNumRule( 0 ),
1469cdf0e10cSrcweir               bCreateNewList( false ),
1470cdf0e10cSrcweir               sListId()
1471cdf0e10cSrcweir         {}
1472cdf0e10cSrcweir     };
1473cdf0e10cSrcweir }
1474cdf0e10cSrcweir // <--
1475cdf0e10cSrcweir 
MakeUniqueNumRules(const SwPaM & rPaM)1476cdf0e10cSrcweir void SwDoc::MakeUniqueNumRules(const SwPaM & rPaM)
1477cdf0e10cSrcweir {
1478cdf0e10cSrcweir     ASSERT( rPaM.GetDoc() == this, "need same doc" );
1479cdf0e10cSrcweir 
1480cdf0e10cSrcweir     // --> OD 2008-03-18 #refactorlists#
1481cdf0e10cSrcweir //    map<SwNumRule *, SwNumRule *> aMyNumRuleMap;
1482cdf0e10cSrcweir     ::std::map<SwNumRule *, ListStyleData> aMyNumRuleMap;
1483cdf0e10cSrcweir     // <--
1484cdf0e10cSrcweir 
1485cdf0e10cSrcweir  	sal_uLong nStt = rPaM.Start()->nNode.GetIndex();
1486cdf0e10cSrcweir 	sal_uLong nEnd = rPaM.End()->nNode.GetIndex();
1487cdf0e10cSrcweir 
1488cdf0e10cSrcweir     bool bFirst = true;
1489cdf0e10cSrcweir 
1490cdf0e10cSrcweir     for (sal_uLong n = nStt; n <= nEnd; n++)
1491cdf0e10cSrcweir     {
1492cdf0e10cSrcweir         SwTxtNode * pCNd = GetNodes()[n]->GetTxtNode();
1493cdf0e10cSrcweir 
1494cdf0e10cSrcweir         if (pCNd)
1495cdf0e10cSrcweir         {
1496cdf0e10cSrcweir             SwNumRule * pRule = pCNd->GetNumRule();
1497cdf0e10cSrcweir 
1498cdf0e10cSrcweir             if (pRule && pRule->IsAutoRule() && ! pRule->IsOutlineRule())
1499cdf0e10cSrcweir             {
1500cdf0e10cSrcweir                 // --> OD 2008-03-18 #refactorlists#
1501cdf0e10cSrcweir //                SwNumRule * pReplaceNumRule = aMyNumRuleMap[pRule];
1502cdf0e10cSrcweir                 ListStyleData aListStyleData = aMyNumRuleMap[pRule];
1503cdf0e10cSrcweir 
1504cdf0e10cSrcweir //                if (! pReplaceNumRule)
1505cdf0e10cSrcweir                 if ( aListStyleData.pReplaceNumRule == 0 )
1506cdf0e10cSrcweir                 {
1507cdf0e10cSrcweir                     if (bFirst)
1508cdf0e10cSrcweir                     {
1509cdf0e10cSrcweir                         SwPosition aPos(*pCNd);
1510cdf0e10cSrcweir                         aListStyleData.pReplaceNumRule =
1511cdf0e10cSrcweir                             const_cast<SwNumRule *>
1512cdf0e10cSrcweir                             (SearchNumRule( aPos, false, pCNd->HasNumber(),
1513cdf0e10cSrcweir                                             false, 0,
1514cdf0e10cSrcweir                                             aListStyleData.sListId, true ));
1515cdf0e10cSrcweir                     }
1516cdf0e10cSrcweir 
1517cdf0e10cSrcweir //                    if (! pReplaceNumRule)
1518cdf0e10cSrcweir                     if ( aListStyleData.pReplaceNumRule == 0 )
1519cdf0e10cSrcweir                     {
1520cdf0e10cSrcweir //                        pReplaceNumRule = new SwNumRule(*pRule);
1521cdf0e10cSrcweir //                        pReplaceNumRule->SetName(GetUniqueNumRuleName());
1522cdf0e10cSrcweir                         aListStyleData.pReplaceNumRule = new SwNumRule(*pRule);
1523cdf0e10cSrcweir                         // --> OD 2008-07-08 #i91400#
1524cdf0e10cSrcweir                         aListStyleData.pReplaceNumRule->SetName(
1525cdf0e10cSrcweir                                                 GetUniqueNumRuleName(), *this );
1526cdf0e10cSrcweir                         // <--
1527cdf0e10cSrcweir                         aListStyleData.bCreateNewList = true;
1528cdf0e10cSrcweir                     }
1529cdf0e10cSrcweir 
1530cdf0e10cSrcweir //                    aMyNumRuleMap[pRule] = pReplaceNumRule;
1531cdf0e10cSrcweir                     aMyNumRuleMap[pRule] = aListStyleData;
1532cdf0e10cSrcweir                 }
1533cdf0e10cSrcweir 
1534cdf0e10cSrcweir                 SwPaM aPam(*pCNd);
1535cdf0e10cSrcweir 
1536cdf0e10cSrcweir                 SetNumRule( aPam, *aListStyleData.pReplaceNumRule,
1537cdf0e10cSrcweir                             aListStyleData.bCreateNewList,
1538cdf0e10cSrcweir                             aListStyleData.sListId );
1539cdf0e10cSrcweir                 if ( aListStyleData.bCreateNewList )
1540cdf0e10cSrcweir                 {
1541cdf0e10cSrcweir                     aListStyleData.bCreateNewList = false;
1542cdf0e10cSrcweir                     aListStyleData.sListId = pCNd->GetListId();
1543cdf0e10cSrcweir                     aMyNumRuleMap[pRule] = aListStyleData;
1544cdf0e10cSrcweir                 }
1545cdf0e10cSrcweir                 // <--
1546cdf0e10cSrcweir 
1547cdf0e10cSrcweir                 bFirst = false;
1548cdf0e10cSrcweir             }
1549cdf0e10cSrcweir         }
1550cdf0e10cSrcweir     }
1551cdf0e10cSrcweir }
1552cdf0e10cSrcweir 
NoNum(const SwPaM & rPam)1553cdf0e10cSrcweir sal_Bool SwDoc::NoNum( const SwPaM& rPam )
1554cdf0e10cSrcweir {
1555cdf0e10cSrcweir 
1556cdf0e10cSrcweir 	sal_Bool bRet = SplitNode( *rPam.GetPoint(), false );
1557cdf0e10cSrcweir 	// ist ueberhaupt Nummerierung im Spiel ?
1558cdf0e10cSrcweir 	if( bRet )
1559cdf0e10cSrcweir 	{
1560cdf0e10cSrcweir 		// NoNum setzen und Upaten
1561cdf0e10cSrcweir 		const SwNodeIndex& rIdx = rPam.GetPoint()->nNode;
1562cdf0e10cSrcweir 		SwTxtNode* pNd = rIdx.GetNode().GetTxtNode();
1563cdf0e10cSrcweir 		const SwNumRule* pRule = pNd->GetNumRule();
1564cdf0e10cSrcweir 		if( pRule )
1565cdf0e10cSrcweir 		{
1566cdf0e10cSrcweir             pNd->SetCountedInList(false);
1567cdf0e10cSrcweir 
1568cdf0e10cSrcweir 			SetModified();
1569cdf0e10cSrcweir 		}
1570cdf0e10cSrcweir 		else
1571cdf0e10cSrcweir 			bRet = sal_False;	// keine Nummerierung , ?? oder immer sal_True ??
1572cdf0e10cSrcweir 	}
1573cdf0e10cSrcweir 	return bRet;
1574cdf0e10cSrcweir }
1575cdf0e10cSrcweir 
DelNumRules(const SwPaM & rPam)1576cdf0e10cSrcweir void SwDoc::DelNumRules( const SwPaM& rPam )
1577cdf0e10cSrcweir {
1578cdf0e10cSrcweir 	sal_uLong nStt = rPam.GetPoint()->nNode.GetIndex(),
1579cdf0e10cSrcweir 			nEnd = rPam.GetMark()->nNode.GetIndex();
1580cdf0e10cSrcweir 	if( nStt > nEnd )
1581cdf0e10cSrcweir 	{
1582cdf0e10cSrcweir 		sal_uLong nTmp = nStt; nStt = nEnd; nEnd = nTmp;
1583cdf0e10cSrcweir 	}
1584cdf0e10cSrcweir 
1585cdf0e10cSrcweir 	SwUndoDelNum* pUndo;
1586cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
1587cdf0e10cSrcweir     {
1588cdf0e10cSrcweir         pUndo = new SwUndoDelNum( rPam );
1589cdf0e10cSrcweir         GetIDocumentUndoRedo().AppendUndo(pUndo);
1590cdf0e10cSrcweir     }
1591cdf0e10cSrcweir     else
1592cdf0e10cSrcweir 		pUndo = 0;
1593cdf0e10cSrcweir 
1594cdf0e10cSrcweir     SwRegHistory aRegH( pUndo ? pUndo->GetHistory() : 0 );
1595cdf0e10cSrcweir 
1596cdf0e10cSrcweir 	SwNumRuleItem aEmptyRule( aEmptyStr );
1597cdf0e10cSrcweir 	const SwNode* pOutlNd = 0;
1598cdf0e10cSrcweir 	for( ; nStt <= nEnd; ++nStt )
1599cdf0e10cSrcweir 	{
1600cdf0e10cSrcweir 		SwTxtNode* pTNd = GetNodes()[ nStt ]->GetTxtNode();
1601cdf0e10cSrcweir         // --> OD 2008-03-13 #refactorlists#
1602cdf0e10cSrcweir //        if( pTNd && 0 != ( pItem = pTNd->GetNoCondAttr(
1603cdf0e10cSrcweir //            RES_PARATR_NUMRULE, sal_True ) ) &&
1604cdf0e10cSrcweir //            ( pName = &((SwNumRuleItem*)pItem)->GetValue())->Len() )
1605cdf0e10cSrcweir         SwNumRule* pNumRuleOfTxtNode = pTNd ? pTNd->GetNumRule() : 0;
1606cdf0e10cSrcweir         if ( pTNd && pNumRuleOfTxtNode )
1607cdf0e10cSrcweir         // <--
1608cdf0e10cSrcweir 		{
1609cdf0e10cSrcweir             // recognize changes of attribute for undo
1610cdf0e10cSrcweir 			aRegH.RegisterInModify( pTNd, *pTNd );
1611cdf0e10cSrcweir 
1612cdf0e10cSrcweir 			if( pUndo )
1613cdf0e10cSrcweir                 pUndo->AddNode( *pTNd, sal_False );
1614cdf0e10cSrcweir 
1615cdf0e10cSrcweir             // directly set list style attribute is reset, otherwise empty
1616cdf0e10cSrcweir             // list style is applied
1617cdf0e10cSrcweir             const SfxItemSet* pAttrSet = pTNd->GetpSwAttrSet();
1618cdf0e10cSrcweir             if ( pAttrSet &&
1619cdf0e10cSrcweir                  pAttrSet->GetItemState( RES_PARATR_NUMRULE, sal_False ) == SFX_ITEM_SET )
1620cdf0e10cSrcweir                 pTNd->ResetAttr( RES_PARATR_NUMRULE );
1621cdf0e10cSrcweir 			else
1622cdf0e10cSrcweir                 pTNd->SetAttr( aEmptyRule );
1623cdf0e10cSrcweir 
1624cdf0e10cSrcweir             // --> OD 2008-03-26 #refactorlists#
1625cdf0e10cSrcweir             pTNd->ResetAttr( RES_PARATR_LIST_ID );
1626cdf0e10cSrcweir             pTNd->ResetAttr( RES_PARATR_LIST_LEVEL );
1627cdf0e10cSrcweir             pTNd->ResetAttr( RES_PARATR_LIST_ISRESTART );
1628cdf0e10cSrcweir             pTNd->ResetAttr( RES_PARATR_LIST_RESTARTVALUE );
1629cdf0e10cSrcweir             pTNd->ResetAttr( RES_PARATR_LIST_ISCOUNTED );
1630cdf0e10cSrcweir             // <--
1631cdf0e10cSrcweir 
1632cdf0e10cSrcweir 			if( RES_CONDTXTFMTCOLL == pTNd->GetFmtColl()->Which() )
1633cdf0e10cSrcweir 				pTNd->ChkCondColl();
1634cdf0e10cSrcweir 			//else if( !pOutlNd && NO_NUMBERING != //#outline level,zhaojianwei
1635cdf0e10cSrcweir 			//	((SwTxtFmtColl*)pTNd->GetFmtColl())->GetOutlineLevel() )
1636cdf0e10cSrcweir 			else if( !pOutlNd &&
1637cdf0e10cSrcweir 				((SwTxtFmtColl*)pTNd->GetFmtColl())->IsAssignedToListLevelOfOutlineStyle() )//<-end,zhaojianwei
1638cdf0e10cSrcweir 				pOutlNd = pTNd;
1639cdf0e10cSrcweir 		}
1640cdf0e10cSrcweir 	}
1641cdf0e10cSrcweir 
1642cdf0e10cSrcweir 	// dann noch alle Updaten
1643cdf0e10cSrcweir 	UpdateNumRule();
1644cdf0e10cSrcweir 
1645cdf0e10cSrcweir 	if( pOutlNd )
1646cdf0e10cSrcweir 		GetNodes().UpdtOutlineIdx( *pOutlNd );
1647cdf0e10cSrcweir }
1648cdf0e10cSrcweir 
InvalidateNumRules()1649cdf0e10cSrcweir void SwDoc::InvalidateNumRules()
1650cdf0e10cSrcweir {
1651cdf0e10cSrcweir     for (sal_uInt16 n = 0; n < pNumRuleTbl->Count(); ++n)
1652cdf0e10cSrcweir         (*pNumRuleTbl)[n]->SetInvalidRule(sal_True);
1653cdf0e10cSrcweir }
1654cdf0e10cSrcweir 
1655cdf0e10cSrcweir 	// zum naechsten/vorhergehenden Punkt auf gleicher Ebene
1656cdf0e10cSrcweir 
lcl_IsNumOk(sal_uInt8 nSrchNum,sal_uInt8 & rLower,sal_uInt8 & rUpper,sal_Bool bOverUpper,sal_uInt8 nNumber)1657cdf0e10cSrcweir sal_Bool lcl_IsNumOk( sal_uInt8 nSrchNum, sal_uInt8& rLower, sal_uInt8& rUpper,
1658cdf0e10cSrcweir 					sal_Bool bOverUpper, sal_uInt8 nNumber )
1659cdf0e10cSrcweir {
1660cdf0e10cSrcweir     // --> OD 2008-04-02 #refactorlists#
1661cdf0e10cSrcweir     ASSERT( nNumber < MAXLEVEL,
1662cdf0e10cSrcweir             "<lcl_IsNumOk(..)> - misusage of method" );
1663cdf0e10cSrcweir     // <--
1664cdf0e10cSrcweir 
1665cdf0e10cSrcweir     sal_Bool bRet = sal_False;
1666cdf0e10cSrcweir 	{
1667cdf0e10cSrcweir 		if( bOverUpper ? nSrchNum == nNumber : nSrchNum >= nNumber )
1668cdf0e10cSrcweir 			bRet = sal_True;
1669cdf0e10cSrcweir 		else if( nNumber > rLower )
1670cdf0e10cSrcweir 			rLower = nNumber;
1671cdf0e10cSrcweir 		else if( nNumber < rUpper )
1672cdf0e10cSrcweir 			rUpper = nNumber;
1673cdf0e10cSrcweir 	}
1674cdf0e10cSrcweir 	return bRet;
1675cdf0e10cSrcweir }
1676cdf0e10cSrcweir 
lcl_IsValidPrevNextNumNode(const SwNodeIndex & rIdx)1677cdf0e10cSrcweir sal_Bool lcl_IsValidPrevNextNumNode( const SwNodeIndex& rIdx )
1678cdf0e10cSrcweir {
1679cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
1680cdf0e10cSrcweir 	const SwNode& rNd = rIdx.GetNode();
1681cdf0e10cSrcweir 	switch( rNd.GetNodeType() )
1682cdf0e10cSrcweir 	{
1683cdf0e10cSrcweir 	case ND_ENDNODE:
1684cdf0e10cSrcweir         bRet = SwTableBoxStartNode == rNd.StartOfSectionNode()->GetStartNodeType() ||
1685cdf0e10cSrcweir                 rNd.StartOfSectionNode()->IsSectionNode();
1686cdf0e10cSrcweir 		break;
1687cdf0e10cSrcweir 
1688cdf0e10cSrcweir 	case ND_STARTNODE:
1689cdf0e10cSrcweir 		bRet = SwTableBoxStartNode == ((SwStartNode&)rNd).GetStartNodeType();
1690cdf0e10cSrcweir 		break;
1691cdf0e10cSrcweir 
1692cdf0e10cSrcweir 	case ND_SECTIONNODE:			// der ist erlaubt, also weiter
1693cdf0e10cSrcweir 		bRet = sal_True;
1694cdf0e10cSrcweir 		break;
1695cdf0e10cSrcweir 	}
1696cdf0e10cSrcweir 	return bRet;
1697cdf0e10cSrcweir }
1698cdf0e10cSrcweir 
lcl_GotoNextPrevNum(SwPosition & rPos,sal_Bool bNext,sal_Bool bOverUpper,sal_uInt8 * pUpper,sal_uInt8 * pLower)1699cdf0e10cSrcweir sal_Bool lcl_GotoNextPrevNum( SwPosition& rPos, sal_Bool bNext,
1700cdf0e10cSrcweir 							sal_Bool bOverUpper, sal_uInt8* pUpper, sal_uInt8* pLower )
1701cdf0e10cSrcweir {
1702cdf0e10cSrcweir 	const SwTxtNode* pNd = rPos.nNode.GetNode().GetTxtNode();
1703cdf0e10cSrcweir 	const SwNumRule* pRule;
1704cdf0e10cSrcweir 	if( !pNd || 0 == ( pRule = pNd->GetNumRule()))
1705cdf0e10cSrcweir 		return sal_False;
1706cdf0e10cSrcweir 
1707cdf0e10cSrcweir     sal_uInt8 nSrchNum = static_cast<sal_uInt8>(pNd->GetActualListLevel());
1708cdf0e10cSrcweir 
1709cdf0e10cSrcweir 	SwNodeIndex aIdx( rPos.nNode );
1710cdf0e10cSrcweir     if( ! pNd->IsCountedInList() )
1711cdf0e10cSrcweir 	{
1712cdf0e10cSrcweir 		// falls gerade mal NO_NUMLEVEL an ist, so such den vorherigen Node
1713cdf0e10cSrcweir 		// mit Nummerierung
1714cdf0e10cSrcweir 		sal_Bool bError = sal_False;
1715cdf0e10cSrcweir 		do {
1716cdf0e10cSrcweir 			aIdx--;
1717cdf0e10cSrcweir 			if( aIdx.GetNode().IsTxtNode() )
1718cdf0e10cSrcweir 			{
1719cdf0e10cSrcweir 				pNd = aIdx.GetNode().GetTxtNode();
1720cdf0e10cSrcweir                 pRule = pNd->GetNumRule();
1721cdf0e10cSrcweir 
1722cdf0e10cSrcweir                 sal_uInt8 nTmpNum;
1723cdf0e10cSrcweir 
1724cdf0e10cSrcweir 				if( pRule  )
1725cdf0e10cSrcweir 				{
1726cdf0e10cSrcweir                     nTmpNum = static_cast<sal_uInt8>(pNd->GetActualListLevel());
1727cdf0e10cSrcweir                     if( !( ! pNd->IsCountedInList() &&
1728cdf0e10cSrcweir 						 (nTmpNum >= nSrchNum )) )
1729cdf0e10cSrcweir 						break;		// gefunden
1730cdf0e10cSrcweir 				}
1731cdf0e10cSrcweir 				else
1732cdf0e10cSrcweir 					bError = sal_True;
1733cdf0e10cSrcweir 			}
1734cdf0e10cSrcweir 			else
1735cdf0e10cSrcweir 				bError = !lcl_IsValidPrevNextNumNode( aIdx );
1736cdf0e10cSrcweir 
1737cdf0e10cSrcweir 		} while( !bError );
1738cdf0e10cSrcweir 		if( bError )
1739cdf0e10cSrcweir 			return sal_False;
1740cdf0e10cSrcweir 	}
1741cdf0e10cSrcweir 
1742cdf0e10cSrcweir 	sal_uInt8 nLower = nSrchNum, nUpper = nSrchNum;
1743cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
1744cdf0e10cSrcweir 
1745cdf0e10cSrcweir 	const SwTxtNode* pLast;
1746cdf0e10cSrcweir 	if( bNext )
1747cdf0e10cSrcweir 		aIdx++, pLast = pNd;
1748cdf0e10cSrcweir 	else
1749cdf0e10cSrcweir 		aIdx--, pLast = 0;
1750cdf0e10cSrcweir 
1751cdf0e10cSrcweir 	while( bNext ? ( aIdx.GetIndex() < aIdx.GetNodes().Count() - 1 )
1752cdf0e10cSrcweir 				 : aIdx.GetIndex() )
1753cdf0e10cSrcweir 	{
1754cdf0e10cSrcweir 		if( aIdx.GetNode().IsTxtNode() )
1755cdf0e10cSrcweir 		{
1756cdf0e10cSrcweir 			pNd = aIdx.GetNode().GetTxtNode();
1757cdf0e10cSrcweir             pRule = pNd->GetNumRule();
1758cdf0e10cSrcweir 			if( pRule )
1759cdf0e10cSrcweir 			{
1760cdf0e10cSrcweir 				if( ::lcl_IsNumOk( nSrchNum, nLower, nUpper, bOverUpper,
1761cdf0e10cSrcweir                                     static_cast<sal_uInt8>(pNd->GetActualListLevel()) ))
1762cdf0e10cSrcweir 				{
1763cdf0e10cSrcweir 					rPos.nNode = aIdx;
1764cdf0e10cSrcweir 					rPos.nContent.Assign( (SwTxtNode*)pNd, 0 );
1765cdf0e10cSrcweir 					bRet = sal_True;
1766cdf0e10cSrcweir 					break;
1767cdf0e10cSrcweir 				}
1768cdf0e10cSrcweir 				else
1769cdf0e10cSrcweir 					pLast = pNd;
1770cdf0e10cSrcweir 			}
1771cdf0e10cSrcweir 			else
1772cdf0e10cSrcweir 				break;
1773cdf0e10cSrcweir 		}
1774cdf0e10cSrcweir 		else if( !lcl_IsValidPrevNextNumNode( aIdx ))
1775cdf0e10cSrcweir 			break;
1776cdf0e10cSrcweir 
1777cdf0e10cSrcweir 		if( bNext )
1778cdf0e10cSrcweir 			aIdx++;
1779cdf0e10cSrcweir 		else
1780cdf0e10cSrcweir 			aIdx--;
1781cdf0e10cSrcweir 	}
1782cdf0e10cSrcweir 
1783cdf0e10cSrcweir 	if( !bRet && !bOverUpper && pLast )		// nicht ueber hoehere Nummmern, aber bis Ende
1784cdf0e10cSrcweir 	{
1785cdf0e10cSrcweir 		if( bNext )
1786cdf0e10cSrcweir 		{
1787cdf0e10cSrcweir 			rPos.nNode = aIdx;
1788cdf0e10cSrcweir 			if( aIdx.GetNode().IsCntntNode() )
1789cdf0e10cSrcweir 				rPos.nContent.Assign( aIdx.GetNode().GetCntntNode(), 0 );
1790cdf0e10cSrcweir 		}
1791cdf0e10cSrcweir 		else
1792cdf0e10cSrcweir 		{
1793cdf0e10cSrcweir 			rPos.nNode.Assign( *pLast );
1794cdf0e10cSrcweir 			rPos.nContent.Assign( (SwTxtNode*)pLast, 0 );
1795cdf0e10cSrcweir 		}
1796cdf0e10cSrcweir 		bRet = sal_True;
1797cdf0e10cSrcweir 	}
1798cdf0e10cSrcweir 
1799cdf0e10cSrcweir 	if( bRet )
1800cdf0e10cSrcweir 	{
1801cdf0e10cSrcweir 		if( pUpper )
1802cdf0e10cSrcweir 			*pUpper = nUpper;
1803cdf0e10cSrcweir 		if( pLower )
1804cdf0e10cSrcweir 			*pLower = nLower;
1805cdf0e10cSrcweir 	}
1806cdf0e10cSrcweir 	return bRet;
1807cdf0e10cSrcweir }
1808cdf0e10cSrcweir 
GotoNextNum(SwPosition & rPos,sal_Bool bOverUpper,sal_uInt8 * pUpper,sal_uInt8 * pLower)1809cdf0e10cSrcweir sal_Bool SwDoc::GotoNextNum( SwPosition& rPos, sal_Bool bOverUpper,
1810cdf0e10cSrcweir 							sal_uInt8* pUpper, sal_uInt8* pLower  )
1811cdf0e10cSrcweir {
1812cdf0e10cSrcweir    return ::lcl_GotoNextPrevNum( rPos, sal_True, bOverUpper, pUpper, pLower );
1813cdf0e10cSrcweir }
1814cdf0e10cSrcweir 
1815cdf0e10cSrcweir // -> #i23731#
1816cdf0e10cSrcweir // --> OD 2008-03-18 #refactorlists# - add output parameter <sListId>
SearchNumRule(const SwPosition & rPos,const bool bForward,const bool bNum,const bool bOutline,int nNonEmptyAllowed,String & sListId,const bool bInvestigateStartNode)1817cdf0e10cSrcweir const SwNumRule *  SwDoc::SearchNumRule(const SwPosition & rPos,
1818cdf0e10cSrcweir                                         const bool bForward,
1819cdf0e10cSrcweir                                         const bool bNum,
1820cdf0e10cSrcweir                                         const bool bOutline,
1821cdf0e10cSrcweir                                         int nNonEmptyAllowed,
1822cdf0e10cSrcweir                                         String& sListId,
1823cdf0e10cSrcweir                                         const bool bInvestigateStartNode)
1824cdf0e10cSrcweir {
1825cdf0e10cSrcweir     const SwNumRule * pResult = NULL;
1826cdf0e10cSrcweir     SwTxtNode * pTxtNd = rPos.nNode.GetNode().GetTxtNode();
1827cdf0e10cSrcweir     SwNode * pStartFromNode = pTxtNd;
1828cdf0e10cSrcweir 
1829cdf0e10cSrcweir     if (pTxtNd)
1830cdf0e10cSrcweir     {
1831cdf0e10cSrcweir         SwNodeIndex aIdx(rPos.nNode);
1832cdf0e10cSrcweir 
1833cdf0e10cSrcweir         // --> OD 2005-10-20 #i55391#
1834cdf0e10cSrcweir         // - the start node has also been investigated, if requested.
1835cdf0e10cSrcweir         const SwNode * pNode = NULL;
1836cdf0e10cSrcweir         do
1837cdf0e10cSrcweir         {
1838cdf0e10cSrcweir             // --> OD 2005-10-20 #i55391#
1839cdf0e10cSrcweir             if ( !bInvestigateStartNode )
1840cdf0e10cSrcweir             {
1841cdf0e10cSrcweir                 if (bForward)
1842cdf0e10cSrcweir                     aIdx++;
1843cdf0e10cSrcweir                 else
1844cdf0e10cSrcweir                     aIdx--;
1845cdf0e10cSrcweir             }
1846cdf0e10cSrcweir             // <--
1847cdf0e10cSrcweir             if (aIdx.GetNode().IsTxtNode())
1848cdf0e10cSrcweir             {
1849cdf0e10cSrcweir                 pTxtNd = aIdx.GetNode().GetTxtNode();
1850cdf0e10cSrcweir 
1851cdf0e10cSrcweir                 const SwNumRule * pNumRule = pTxtNd->GetNumRule();
1852cdf0e10cSrcweir                 if (pNumRule)
1853cdf0e10cSrcweir                 {
1854cdf0e10cSrcweir                     if ( ( pNumRule->IsOutlineRule() == ( bOutline ? sal_True : sal_False ) ) && // #115901#
1855cdf0e10cSrcweir                          ( ( bNum && pNumRule->Get(0).IsEnumeration()) ||
1856cdf0e10cSrcweir                            ( !bNum && pNumRule->Get(0).IsItemize() ) ) ) // #i22362#, #i29560#
1857cdf0e10cSrcweir                     {
1858cdf0e10cSrcweir                         pResult = pTxtNd->GetNumRule();
1859cdf0e10cSrcweir                         // --> OD 2008-03-18 #refactorlists#
1860cdf0e10cSrcweir                         // provide also the list id, to which the text node belongs.
1861cdf0e10cSrcweir                         sListId = pTxtNd->GetListId();
1862cdf0e10cSrcweir                     }
1863cdf0e10cSrcweir 
1864cdf0e10cSrcweir                     break;
1865cdf0e10cSrcweir                 }
1866cdf0e10cSrcweir                 else if (pTxtNd->Len() > 0 || NULL != pTxtNd->GetNumRule())
1867cdf0e10cSrcweir                 {
1868cdf0e10cSrcweir                     if (nNonEmptyAllowed == 0)
1869cdf0e10cSrcweir                         break;
1870cdf0e10cSrcweir 
1871cdf0e10cSrcweir                     nNonEmptyAllowed--;
1872cdf0e10cSrcweir 
1873cdf0e10cSrcweir                     if (nNonEmptyAllowed < 0)
1874cdf0e10cSrcweir                         nNonEmptyAllowed = -1;
1875cdf0e10cSrcweir                 }
1876cdf0e10cSrcweir             }
1877cdf0e10cSrcweir 
1878cdf0e10cSrcweir             // --> OD 2005-10-20 #i55391#
1879cdf0e10cSrcweir             if ( bInvestigateStartNode )
1880cdf0e10cSrcweir             {
1881cdf0e10cSrcweir                 if (bForward)
1882cdf0e10cSrcweir                     aIdx++;
1883cdf0e10cSrcweir                 else
1884cdf0e10cSrcweir                     aIdx--;
1885cdf0e10cSrcweir             }
1886cdf0e10cSrcweir             // <--
1887cdf0e10cSrcweir 
1888cdf0e10cSrcweir             pNode = &aIdx.GetNode();
1889cdf0e10cSrcweir         }
1890cdf0e10cSrcweir         while (!(pNode == GetNodes().DocumentSectionStartNode(pStartFromNode) ||
1891cdf0e10cSrcweir                  pNode == GetNodes().DocumentSectionEndNode(pStartFromNode)));
1892cdf0e10cSrcweir         // <--
1893cdf0e10cSrcweir     }
1894cdf0e10cSrcweir 
1895cdf0e10cSrcweir     return pResult;
1896cdf0e10cSrcweir }
1897cdf0e10cSrcweir // <- #i23731#
1898cdf0e10cSrcweir 
GotoPrevNum(SwPosition & rPos,sal_Bool bOverUpper,sal_uInt8 * pUpper,sal_uInt8 * pLower)1899cdf0e10cSrcweir sal_Bool SwDoc::GotoPrevNum( SwPosition& rPos, sal_Bool bOverUpper,
1900cdf0e10cSrcweir 							sal_uInt8* pUpper, sal_uInt8* pLower  )
1901cdf0e10cSrcweir {
1902cdf0e10cSrcweir    return ::lcl_GotoNextPrevNum( rPos, sal_False, bOverUpper, pUpper, pLower );
1903cdf0e10cSrcweir }
1904cdf0e10cSrcweir 
NumUpDown(const SwPaM & rPam,sal_Bool bDown)1905cdf0e10cSrcweir sal_Bool SwDoc::NumUpDown( const SwPaM& rPam, sal_Bool bDown )
1906cdf0e10cSrcweir {
1907cdf0e10cSrcweir 	sal_uLong nStt = rPam.GetPoint()->nNode.GetIndex(),
1908cdf0e10cSrcweir 			nEnd = rPam.GetMark()->nNode.GetIndex();
1909cdf0e10cSrcweir 	if( nStt > nEnd )
1910cdf0e10cSrcweir 	{
1911cdf0e10cSrcweir 		sal_uLong nTmp = nStt; nStt = nEnd; nEnd = nTmp;
1912cdf0e10cSrcweir 	}
1913cdf0e10cSrcweir 
1914cdf0e10cSrcweir     // -> #115901# outline nodes are promoted or demoted differently
1915cdf0e10cSrcweir     bool bOnlyOutline = true;
1916cdf0e10cSrcweir     bool bOnlyNonOutline = true;
1917cdf0e10cSrcweir     for (sal_uLong n = nStt; n <= nEnd; n++)
1918cdf0e10cSrcweir     {
1919cdf0e10cSrcweir         SwTxtNode * pTxtNd = GetNodes()[n]->GetTxtNode();
1920cdf0e10cSrcweir 
1921cdf0e10cSrcweir         if (pTxtNd)
1922cdf0e10cSrcweir         {
1923cdf0e10cSrcweir             SwNumRule * pRule = pTxtNd->GetNumRule();
1924cdf0e10cSrcweir 
1925cdf0e10cSrcweir             if (pRule)
1926cdf0e10cSrcweir             {
1927cdf0e10cSrcweir                 if (pRule->IsOutlineRule())
1928cdf0e10cSrcweir                     bOnlyNonOutline = false;
1929cdf0e10cSrcweir                 else
1930cdf0e10cSrcweir                     bOnlyOutline = false;
1931cdf0e10cSrcweir             }
1932cdf0e10cSrcweir         }
1933cdf0e10cSrcweir     }
1934cdf0e10cSrcweir     // <- #115901#
1935cdf0e10cSrcweir 
1936cdf0e10cSrcweir     sal_Bool bRet = sal_True;
1937cdf0e10cSrcweir     char nDiff = bDown ? 1 : -1;
1938cdf0e10cSrcweir 
1939cdf0e10cSrcweir     // ->#115901#
1940cdf0e10cSrcweir     if (bOnlyOutline)
1941cdf0e10cSrcweir         bRet = OutlineUpDown(rPam, nDiff);
1942cdf0e10cSrcweir     else if (bOnlyNonOutline)
1943cdf0e10cSrcweir     {
1944cdf0e10cSrcweir         /* --> #i24560#
1945cdf0e10cSrcweir 
1946cdf0e10cSrcweir         Only promote or demote if all selected paragraphs are
1947cdf0e10cSrcweir         promotable resp. demotable.
1948cdf0e10cSrcweir 
1949cdf0e10cSrcweir         */
1950cdf0e10cSrcweir         for (sal_uLong nTmp = nStt; nTmp <= nEnd; ++nTmp)
1951cdf0e10cSrcweir         {
1952cdf0e10cSrcweir             SwTxtNode* pTNd = GetNodes()[ nTmp ]->GetTxtNode();
1953cdf0e10cSrcweir 
1954cdf0e10cSrcweir             // --> OD 2006-10-19 #134160# - make code robust:
1955cdf0e10cSrcweir             // consider case that the node doesn't denote a text node.
1956cdf0e10cSrcweir             if ( pTNd )
1957cdf0e10cSrcweir             {
1958cdf0e10cSrcweir                 SwNumRule * pRule = pTNd->GetNumRule();
1959cdf0e10cSrcweir 
1960cdf0e10cSrcweir                 if (pRule)
1961cdf0e10cSrcweir                 {
1962cdf0e10cSrcweir                     sal_uInt8 nLevel = static_cast<sal_uInt8>(pTNd->GetActualListLevel());
1963cdf0e10cSrcweir                     if( (-1 == nDiff && 0 >= nLevel) ||
1964cdf0e10cSrcweir                         (1 == nDiff && MAXLEVEL - 1 <= nLevel))
1965cdf0e10cSrcweir                         bRet = sal_False;
1966cdf0e10cSrcweir                 }
1967cdf0e10cSrcweir             }
1968cdf0e10cSrcweir             // <--
1969cdf0e10cSrcweir         }
1970cdf0e10cSrcweir 
1971cdf0e10cSrcweir         if( bRet )
1972cdf0e10cSrcweir         {
1973cdf0e10cSrcweir             /* <-- #i24560# */
1974cdf0e10cSrcweir             if (GetIDocumentUndoRedo().DoesUndo())
1975cdf0e10cSrcweir             {
1976cdf0e10cSrcweir                 SwUndo *const pUndo( new SwUndoNumUpDown(rPam, nDiff) );
1977cdf0e10cSrcweir                 GetIDocumentUndoRedo().AppendUndo(pUndo);
1978cdf0e10cSrcweir             }
1979cdf0e10cSrcweir 
1980cdf0e10cSrcweir             String sNumRule;
1981cdf0e10cSrcweir 
1982cdf0e10cSrcweir             for(sal_uLong nTmp = nStt; nTmp <= nEnd; ++nTmp )
1983cdf0e10cSrcweir             {
1984cdf0e10cSrcweir                 SwTxtNode* pTNd = GetNodes()[ nTmp ]->GetTxtNode();
1985cdf0e10cSrcweir 
1986cdf0e10cSrcweir                 if( pTNd)
1987cdf0e10cSrcweir                 {
1988cdf0e10cSrcweir                     SwNumRule * pRule = pTNd->GetNumRule();
1989cdf0e10cSrcweir 
1990cdf0e10cSrcweir                     if (pRule)
1991cdf0e10cSrcweir                     {
1992cdf0e10cSrcweir                         sal_uInt8 nLevel = static_cast<sal_uInt8>(pTNd->GetActualListLevel());
1993cdf0e10cSrcweir                         nLevel = nLevel + nDiff;
1994cdf0e10cSrcweir 
1995cdf0e10cSrcweir                         pTNd->SetAttrListLevel(nLevel);
1996cdf0e10cSrcweir                     }
1997cdf0e10cSrcweir                 }
1998cdf0e10cSrcweir             }
1999cdf0e10cSrcweir 
2000cdf0e10cSrcweir             ChkCondColls();
2001cdf0e10cSrcweir             SetModified();
2002cdf0e10cSrcweir         }
2003cdf0e10cSrcweir     }
2004cdf0e10cSrcweir 
2005cdf0e10cSrcweir 	return bRet;
2006cdf0e10cSrcweir }
2007cdf0e10cSrcweir 
MoveParagraph(const SwPaM & rPam,long nOffset,sal_Bool bIsOutlMv)2008cdf0e10cSrcweir sal_Bool SwDoc::MoveParagraph( const SwPaM& rPam, long nOffset, sal_Bool bIsOutlMv )
2009cdf0e10cSrcweir {
2010cdf0e10cSrcweir 	const SwPosition *pStt = rPam.Start(), *pEnd = rPam.End();
2011cdf0e10cSrcweir 
2012cdf0e10cSrcweir 	sal_uLong nStIdx = pStt->nNode.GetIndex();
2013cdf0e10cSrcweir 	sal_uLong nEndIdx = pEnd->nNode.GetIndex();
2014cdf0e10cSrcweir 
2015cdf0e10cSrcweir     // Here are some sophisticated checks whether the wished PaM will be moved or not.
2016cdf0e10cSrcweir     // For moving outlines (bIsOutlMv) I've already done some checks, so here are two different
2017cdf0e10cSrcweir     // checks...
2018cdf0e10cSrcweir     SwNode *pTmp1;
2019cdf0e10cSrcweir     SwNode *pTmp2;
2020cdf0e10cSrcweir     if( bIsOutlMv )
2021cdf0e10cSrcweir     {
2022cdf0e10cSrcweir         // For moving chapters (outline) the following reason will deny the move:
2023cdf0e10cSrcweir         // if a start node is inside the moved area and its end node outside or vice versa.
2024cdf0e10cSrcweir         // If a start node is the first moved paragraph, its end node has to be within the moved
2025cdf0e10cSrcweir         // area, too (e.g. as last node).
2026cdf0e10cSrcweir         // If an end node is the last node of the moved area, its start node has to be a part of
2027cdf0e10cSrcweir         // the moved section, too.
2028cdf0e10cSrcweir         pTmp1 = GetNodes()[ nStIdx ];
2029cdf0e10cSrcweir         if( pTmp1->IsStartNode() )
2030cdf0e10cSrcweir         {   // First is a start node
2031cdf0e10cSrcweir             pTmp2 = pTmp1->EndOfSectionNode();
2032cdf0e10cSrcweir             if( pTmp2->GetIndex() > nEndIdx )
2033cdf0e10cSrcweir                 return sal_False; // Its end node is behind the moved range
2034cdf0e10cSrcweir         }
2035cdf0e10cSrcweir         pTmp1 = pTmp1->StartOfSectionNode()->EndOfSectionNode();
2036cdf0e10cSrcweir         if( pTmp1->GetIndex() <= nEndIdx )
2037cdf0e10cSrcweir             return sal_False; // End node inside but start node before moved range => no.
2038cdf0e10cSrcweir         pTmp1 = GetNodes()[ nEndIdx ];
2039cdf0e10cSrcweir         if( pTmp1->IsEndNode() )
2040cdf0e10cSrcweir         {   // The last one is an end node
2041cdf0e10cSrcweir             pTmp1 = pTmp1->StartOfSectionNode();
2042cdf0e10cSrcweir             if( pTmp1->GetIndex() < nStIdx )
2043cdf0e10cSrcweir                 return sal_False; // Its start node is before the moved range.
2044cdf0e10cSrcweir         }
2045cdf0e10cSrcweir         pTmp1 = pTmp1->StartOfSectionNode();
2046cdf0e10cSrcweir         if( pTmp1->GetIndex() >= nStIdx )
2047cdf0e10cSrcweir             return sal_False; // A start node which ends behind the moved area => no.
2048cdf0e10cSrcweir     }
2049cdf0e10cSrcweir 
2050cdf0e10cSrcweir 	sal_uLong nInStIdx, nInEndIdx;
2051cdf0e10cSrcweir 	long nOffs = nOffset;
2052cdf0e10cSrcweir 	if( nOffset > 0 )
2053cdf0e10cSrcweir 	{
2054cdf0e10cSrcweir 		nInEndIdx = nEndIdx;
2055cdf0e10cSrcweir 		nEndIdx += nOffset;
2056cdf0e10cSrcweir 		++nOffs;
2057cdf0e10cSrcweir 	}
2058cdf0e10cSrcweir 	else
2059cdf0e10cSrcweir 	{
2060cdf0e10cSrcweir         //Impossible to move to negative index
2061cdf0e10cSrcweir         if( sal_uLong(abs( nOffset )) > nStIdx)
2062cdf0e10cSrcweir             return sal_False;
2063cdf0e10cSrcweir 
2064cdf0e10cSrcweir 		nInEndIdx = nStIdx - 1;
2065cdf0e10cSrcweir 		nStIdx += nOffset;
2066cdf0e10cSrcweir 	}
2067cdf0e10cSrcweir 	nInStIdx = nInEndIdx + 1;
2068cdf0e10cSrcweir 	// Folgende Absatzbloecke sollen vertauscht werden:
2069cdf0e10cSrcweir 	// [ nStIdx, nInEndIdx ] mit [ nInStIdx, nEndIdx ]
2070cdf0e10cSrcweir 
2071cdf0e10cSrcweir     if( nEndIdx >= GetNodes().GetEndOfContent().GetIndex() )
2072cdf0e10cSrcweir         return sal_False;
2073cdf0e10cSrcweir 
2074cdf0e10cSrcweir     if( !bIsOutlMv )
2075cdf0e10cSrcweir     {   // And here the restrictions for moving paragraphs other than chapters (outlines)
2076cdf0e10cSrcweir         // The plan is to exchange [nStIdx,nInEndIdx] and [nStartIdx,nEndIdx]
2077cdf0e10cSrcweir         // It will checked if the both "start" nodes as well as the both "end" notes belongs to
2078cdf0e10cSrcweir         // the same start-end-section. This is more restrictive than the conditions checked above.
2079cdf0e10cSrcweir         // E.g. a paragraph will not escape from a section or be inserted to another section.
2080cdf0e10cSrcweir         pTmp1 = GetNodes()[ nStIdx ]->StartOfSectionNode();
2081cdf0e10cSrcweir         pTmp2 = GetNodes()[ nInStIdx ]->StartOfSectionNode();
2082cdf0e10cSrcweir         if( pTmp1 != pTmp2 )
2083cdf0e10cSrcweir             return sal_False; // "start" nodes in different sections
2084cdf0e10cSrcweir         pTmp1 = GetNodes()[ nEndIdx ];
2085cdf0e10cSrcweir         bool bIsEndNode = pTmp1->IsEndNode();
2086cdf0e10cSrcweir         if( !pTmp1->IsStartNode() )
2087cdf0e10cSrcweir         {
2088cdf0e10cSrcweir             pTmp1 = pTmp1->StartOfSectionNode();
2089cdf0e10cSrcweir             if( bIsEndNode ) // For end nodes the first start node is of course inside the range,
2090cdf0e10cSrcweir                 pTmp1 = pTmp1->StartOfSectionNode(); // I've to check the start node of the start node.
2091cdf0e10cSrcweir         }
2092cdf0e10cSrcweir         pTmp1 = pTmp1->EndOfSectionNode();
2093cdf0e10cSrcweir         pTmp2 = GetNodes()[ nInEndIdx ];
2094cdf0e10cSrcweir         if( !pTmp2->IsStartNode() )
2095cdf0e10cSrcweir         {
2096cdf0e10cSrcweir             bIsEndNode = pTmp2->IsEndNode();
2097cdf0e10cSrcweir             pTmp2 = pTmp2->StartOfSectionNode();
2098cdf0e10cSrcweir             if( bIsEndNode )
2099cdf0e10cSrcweir                 pTmp2 = pTmp2->StartOfSectionNode();
2100cdf0e10cSrcweir         }
2101cdf0e10cSrcweir         pTmp2 = pTmp2->EndOfSectionNode();
2102cdf0e10cSrcweir         if( pTmp1 != pTmp2 )
2103cdf0e10cSrcweir             return sal_False; // The "end" notes are in different sections
2104cdf0e10cSrcweir     }
2105cdf0e10cSrcweir 
2106cdf0e10cSrcweir     // auf Redlining testen - darf die Selektion ueberhaupt verschoben
2107cdf0e10cSrcweir     // werden?
2108cdf0e10cSrcweir 	if( !IsIgnoreRedline() )
2109cdf0e10cSrcweir 	{
2110cdf0e10cSrcweir 		sal_uInt16 nRedlPos = GetRedlinePos( pStt->nNode.GetNode(), nsRedlineType_t::REDLINE_DELETE );
2111cdf0e10cSrcweir 		if( USHRT_MAX != nRedlPos )
2112cdf0e10cSrcweir 		{
2113cdf0e10cSrcweir 			SwPosition aStPos( *pStt ), aEndPos( *pEnd );
2114cdf0e10cSrcweir 			aStPos.nContent = 0;
2115cdf0e10cSrcweir 			SwCntntNode* pCNd = pEnd->nNode.GetNode().GetCntntNode();
2116cdf0e10cSrcweir 			aEndPos.nContent = pCNd ? pCNd->Len() : 1;
2117cdf0e10cSrcweir 			sal_Bool bCheckDel = sal_True;
2118cdf0e10cSrcweir 
2119cdf0e10cSrcweir 			// es existiert fuer den Bereich irgendein Redline-Delete-Object
2120cdf0e10cSrcweir 			for( ; nRedlPos < GetRedlineTbl().Count(); ++nRedlPos )
2121cdf0e10cSrcweir 			{
2122cdf0e10cSrcweir 				const SwRedline* pTmp = GetRedlineTbl()[ nRedlPos ];
2123cdf0e10cSrcweir 				if( !bCheckDel || nsRedlineType_t::REDLINE_DELETE == pTmp->GetType() )
2124cdf0e10cSrcweir 				{
2125cdf0e10cSrcweir 					const SwPosition *pRStt = pTmp->Start(), *pREnd = pTmp->End();
2126cdf0e10cSrcweir 					switch( ComparePosition( *pRStt, *pREnd, aStPos, aEndPos ))
2127cdf0e10cSrcweir 					{
2128cdf0e10cSrcweir 					case POS_COLLIDE_START:
2129cdf0e10cSrcweir 					case POS_BEHIND:			// Pos1 liegt hinter Pos2
2130cdf0e10cSrcweir 						nRedlPos = GetRedlineTbl().Count();
2131cdf0e10cSrcweir 						break;
2132cdf0e10cSrcweir 
2133cdf0e10cSrcweir 					case POS_COLLIDE_END:
2134cdf0e10cSrcweir 					case POS_BEFORE:			// Pos1 liegt vor Pos2
2135cdf0e10cSrcweir 						break;
2136cdf0e10cSrcweir 					case POS_INSIDE:			// Pos1 liegt vollstaendig in Pos2
2137cdf0e10cSrcweir 						// ist erlaubt, aber checke dann alle nachfolgenden
2138cdf0e10cSrcweir 						// auf Ueberlappungen
2139cdf0e10cSrcweir 						bCheckDel = sal_False;
2140cdf0e10cSrcweir 						break;
2141cdf0e10cSrcweir 
2142cdf0e10cSrcweir 					case POS_OUTSIDE:			// Pos2 liegt vollstaendig in Pos1
2143cdf0e10cSrcweir 					case POS_EQUAL:				// Pos1 ist genauso gross wie Pos2
2144cdf0e10cSrcweir 					case POS_OVERLAP_BEFORE:	// Pos1 ueberlappt Pos2 am Anfang
2145cdf0e10cSrcweir 					case POS_OVERLAP_BEHIND:	// Pos1 ueberlappt Pos2 am Ende
2146cdf0e10cSrcweir 						return sal_False;
2147cdf0e10cSrcweir 					}
2148cdf0e10cSrcweir 				}
2149cdf0e10cSrcweir 			}
2150cdf0e10cSrcweir 		}
2151cdf0e10cSrcweir 	}
2152cdf0e10cSrcweir 
2153cdf0e10cSrcweir 	{
2154cdf0e10cSrcweir 		// DataChanged vorm verschieben verschicken, dann bekommt
2155cdf0e10cSrcweir 		// man noch mit, welche Objecte sich im Bereich befinden.
2156cdf0e10cSrcweir 		// Danach koennen sie vor/hinter der Position befinden.
2157cdf0e10cSrcweir 		SwDataChanged aTmp( rPam, 0 );
2158cdf0e10cSrcweir 	}
2159cdf0e10cSrcweir 
2160cdf0e10cSrcweir 	SwNodeIndex aIdx( nOffset > 0 ? pEnd->nNode : pStt->nNode, nOffs );
2161cdf0e10cSrcweir 	SwNodeRange aMvRg( pStt->nNode, 0, pEnd->nNode, +1 );
2162cdf0e10cSrcweir 
2163cdf0e10cSrcweir 	SwRedline* pOwnRedl = 0;
2164cdf0e10cSrcweir 	if( IsRedlineOn() )
2165cdf0e10cSrcweir 	{
2166cdf0e10cSrcweir 		// wenn der Bereich komplett im eigenen Redline liegt, kann es
2167cdf0e10cSrcweir 		// verschoben werden!
2168cdf0e10cSrcweir 		sal_uInt16 nRedlPos = GetRedlinePos( pStt->nNode.GetNode(), nsRedlineType_t::REDLINE_INSERT );
2169cdf0e10cSrcweir 		if( USHRT_MAX != nRedlPos )
2170cdf0e10cSrcweir 		{
2171cdf0e10cSrcweir 			SwRedline* pTmp = GetRedlineTbl()[ nRedlPos ];
2172cdf0e10cSrcweir 			const SwPosition *pRStt = pTmp->Start(), *pREnd = pTmp->End();
2173cdf0e10cSrcweir 			SwRedline aTmpRedl( nsRedlineType_t::REDLINE_INSERT, rPam );
2174cdf0e10cSrcweir 			const SwCntntNode* pCEndNd = pEnd->nNode.GetNode().GetCntntNode();
2175cdf0e10cSrcweir 			// liegt komplett im Bereich, und ist auch der eigene Redline?
2176cdf0e10cSrcweir 			if( aTmpRedl.IsOwnRedline( *pTmp ) &&
2177cdf0e10cSrcweir 				(pRStt->nNode < pStt->nNode ||
2178cdf0e10cSrcweir 				(pRStt->nNode == pStt->nNode && !pRStt->nContent.GetIndex()) ) &&
2179cdf0e10cSrcweir 				(pEnd->nNode < pREnd->nNode ||
2180cdf0e10cSrcweir 				(pEnd->nNode == pREnd->nNode &&
2181cdf0e10cSrcweir 				 pCEndNd ? pREnd->nContent.GetIndex() == pCEndNd->Len()
2182cdf0e10cSrcweir 						 : !pREnd->nContent.GetIndex() )) )
2183cdf0e10cSrcweir 			{
2184cdf0e10cSrcweir 				pOwnRedl = pTmp;
2185cdf0e10cSrcweir 				if( nRedlPos + 1 < GetRedlineTbl().Count() )
2186cdf0e10cSrcweir 				{
2187cdf0e10cSrcweir 					pTmp = GetRedlineTbl()[ nRedlPos+1 ];
2188cdf0e10cSrcweir 					if( *pTmp->Start() == *pREnd )
2189cdf0e10cSrcweir 						// dann doch nicht!
2190cdf0e10cSrcweir 						pOwnRedl = 0;
2191cdf0e10cSrcweir 				}
2192cdf0e10cSrcweir 
2193cdf0e10cSrcweir 				if( pOwnRedl &&
2194cdf0e10cSrcweir 					!( pRStt->nNode <= aIdx && aIdx <= pREnd->nNode ))
2195cdf0e10cSrcweir 				{
2196cdf0e10cSrcweir 					// nicht in sich selbst, dann auch nicht moven
2197cdf0e10cSrcweir 					pOwnRedl = 0;
2198cdf0e10cSrcweir 				}
2199cdf0e10cSrcweir 			}
2200cdf0e10cSrcweir 		}
2201cdf0e10cSrcweir 
2202cdf0e10cSrcweir 		if( !pOwnRedl )
2203cdf0e10cSrcweir         {
2204cdf0e10cSrcweir             GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
2205cdf0e10cSrcweir 
2206cdf0e10cSrcweir 			// zuerst das Insert, dann das Loeschen
2207cdf0e10cSrcweir 			SwPosition aInsPos( aIdx );
2208cdf0e10cSrcweir 			aInsPos.nContent.Assign( aIdx.GetNode().GetCntntNode(), 0 );
2209cdf0e10cSrcweir 
2210cdf0e10cSrcweir 			SwPaM aPam( pStt->nNode, aMvRg.aEnd );
2211cdf0e10cSrcweir 
2212cdf0e10cSrcweir 			SwPaM& rOrigPam = (SwPaM&)rPam;
2213cdf0e10cSrcweir 			rOrigPam.DeleteMark();
2214cdf0e10cSrcweir 			rOrigPam.GetPoint()->nNode = aIdx.GetIndex() - 1;
2215cdf0e10cSrcweir 
2216cdf0e10cSrcweir 			sal_Bool bDelLastPara = !aInsPos.nNode.GetNode().IsCntntNode();
2217cdf0e10cSrcweir 
2218cdf0e10cSrcweir             /* #101076# When copying to a non-content node Copy will
2219cdf0e10cSrcweir                insert a paragraph before that node and insert before
2220cdf0e10cSrcweir                that inserted node. Copy creates an SwUndoInserts that
2221cdf0e10cSrcweir                does not cover the extra paragraph. Thus we insert the
2222cdf0e10cSrcweir                extra paragraph ourselves, _with_ correct undo
2223cdf0e10cSrcweir                information. */
2224cdf0e10cSrcweir             if (bDelLastPara)
2225cdf0e10cSrcweir             {
2226cdf0e10cSrcweir                 /* aInsPos points to the non-content node. Move it to
2227cdf0e10cSrcweir                    the previous content node. */
2228cdf0e10cSrcweir                 SwPaM aInsPam(aInsPos);
2229cdf0e10cSrcweir                 sal_Bool bMoved = aInsPam.Move(fnMoveBackward);
2230cdf0e10cSrcweir                 ASSERT(bMoved, "No content node found!");
2231cdf0e10cSrcweir 
2232cdf0e10cSrcweir                 if (bMoved)
2233cdf0e10cSrcweir                 {
2234cdf0e10cSrcweir                     /* Append the new node after the content node
2235cdf0e10cSrcweir                        found. The new position to insert the moved
2236cdf0e10cSrcweir                        paragraph at is before the inserted
2237cdf0e10cSrcweir                        paragraph. */
2238cdf0e10cSrcweir                     AppendTxtNode(*aInsPam.GetPoint());
2239cdf0e10cSrcweir                     aInsPos = *aInsPam.GetPoint();
2240cdf0e10cSrcweir                 }
2241cdf0e10cSrcweir             }
2242cdf0e10cSrcweir 
2243cdf0e10cSrcweir             CopyRange( aPam, aInsPos, false );
2244cdf0e10cSrcweir 			if( bDelLastPara )
2245cdf0e10cSrcweir 			{
2246cdf0e10cSrcweir 				// dann muss der letzte leere Node wieder entfernt werden
2247cdf0e10cSrcweir 				aIdx = aInsPos.nNode;
2248cdf0e10cSrcweir 				SwCntntNode* pCNd = GetNodes().GoPrevious( &aInsPos.nNode );
2249cdf0e10cSrcweir 				xub_StrLen nCLen = 0; if( pCNd ) nCLen = pCNd->Len();
2250cdf0e10cSrcweir 				aInsPos.nContent.Assign( pCNd, nCLen );
2251cdf0e10cSrcweir 
2252cdf0e10cSrcweir 				// alle die im zu loeschenden Node stehen, mussen auf den
2253cdf0e10cSrcweir 				// naechsten umgestezt werden
2254cdf0e10cSrcweir 				SwPosition* pPos;
2255cdf0e10cSrcweir 				for( sal_uInt16 n = 0; n < GetRedlineTbl().Count(); ++n )
2256cdf0e10cSrcweir 				{
2257cdf0e10cSrcweir 					SwRedline* pTmp = GetRedlineTbl()[ n ];
2258cdf0e10cSrcweir 					if( ( pPos = &pTmp->GetBound(sal_True))->nNode == aIdx )
2259cdf0e10cSrcweir 					{
2260cdf0e10cSrcweir 						pPos->nNode++;
2261cdf0e10cSrcweir 						pPos->nContent.Assign( pPos->nNode.GetNode().GetCntntNode(),0);
2262cdf0e10cSrcweir 					}
2263cdf0e10cSrcweir 					if( ( pPos = &pTmp->GetBound(sal_False))->nNode == aIdx )
2264cdf0e10cSrcweir 					{
2265cdf0e10cSrcweir 						pPos->nNode++;
2266cdf0e10cSrcweir 						pPos->nContent.Assign( pPos->nNode.GetNode().GetCntntNode(),0);
2267cdf0e10cSrcweir 					}
2268cdf0e10cSrcweir 				}
2269cdf0e10cSrcweir 				CorrRel( aIdx, aInsPos, 0, sal_False );
2270cdf0e10cSrcweir 
2271cdf0e10cSrcweir 				pCNd->JoinNext();
2272cdf0e10cSrcweir 			}
2273cdf0e10cSrcweir 
2274cdf0e10cSrcweir 			rOrigPam.GetPoint()->nNode++;
2275cdf0e10cSrcweir 			rOrigPam.GetPoint()->nContent.Assign( rOrigPam.GetCntntNode(), 0 );
2276cdf0e10cSrcweir 
2277cdf0e10cSrcweir 			RedlineMode_t eOld = GetRedlineMode();
2278cdf0e10cSrcweir 			checkRedlining(eOld);
2279cdf0e10cSrcweir             if (GetIDocumentUndoRedo().DoesUndo())
2280cdf0e10cSrcweir             {
2281cdf0e10cSrcweir                 //JP 06.01.98: MUSS noch optimiert werden!!!
2282cdf0e10cSrcweir                 SetRedlineMode(
2283cdf0e10cSrcweir 			       (RedlineMode_t)(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE));
2284cdf0e10cSrcweir                 SwUndo *const pUndo(new SwUndoRedlineDelete(aPam, UNDO_DELETE));
2285cdf0e10cSrcweir                 GetIDocumentUndoRedo().AppendUndo(pUndo);
2286cdf0e10cSrcweir             }
2287cdf0e10cSrcweir 
2288cdf0e10cSrcweir             SwRedline* pNewRedline = new SwRedline( nsRedlineType_t::REDLINE_DELETE, aPam );
2289cdf0e10cSrcweir 
2290cdf0e10cSrcweir             // #101654# prevent assertion from aPam's target being deleted
2291cdf0e10cSrcweir             // (Alternatively, one could just let aPam go out of scope, but
2292cdf0e10cSrcweir             //  that requires touching a lot of code.)
2293cdf0e10cSrcweir             aPam.GetBound(sal_True).nContent.Assign( NULL, 0 );
2294cdf0e10cSrcweir             aPam.GetBound(sal_False).nContent.Assign( NULL, 0 );
2295cdf0e10cSrcweir 
2296cdf0e10cSrcweir             AppendRedline( pNewRedline, true );
2297cdf0e10cSrcweir 
2298cdf0e10cSrcweir //JP 06.01.98: MUSS noch optimiert werden!!!
2299cdf0e10cSrcweir SetRedlineMode( eOld );
2300cdf0e10cSrcweir             GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
2301cdf0e10cSrcweir 			SetModified();
2302cdf0e10cSrcweir 
2303cdf0e10cSrcweir 			return sal_True;
2304cdf0e10cSrcweir 		}
2305cdf0e10cSrcweir 	}
2306cdf0e10cSrcweir 
2307cdf0e10cSrcweir 	if( !pOwnRedl && !IsIgnoreRedline() && GetRedlineTbl().Count() )
2308cdf0e10cSrcweir 	{
2309cdf0e10cSrcweir 		SwPaM aTemp(aIdx);
2310cdf0e10cSrcweir 		SplitRedline(aTemp);
2311cdf0e10cSrcweir 	}
2312cdf0e10cSrcweir 
2313cdf0e10cSrcweir 	sal_uLong nRedlSttNd(0), nRedlEndNd(0);
2314cdf0e10cSrcweir 	if( pOwnRedl )
2315cdf0e10cSrcweir 	{
2316cdf0e10cSrcweir 		const SwPosition *pRStt = pOwnRedl->Start(), *pREnd = pOwnRedl->End();
2317cdf0e10cSrcweir 		nRedlSttNd = pRStt->nNode.GetIndex();
2318cdf0e10cSrcweir 		nRedlEndNd = pREnd->nNode.GetIndex();
2319cdf0e10cSrcweir 	}
2320cdf0e10cSrcweir 
2321cdf0e10cSrcweir 	SwUndoMoveNum* pUndo = 0;
2322cdf0e10cSrcweir     sal_uLong nMoved = 0;
2323cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
2324cdf0e10cSrcweir     {
2325cdf0e10cSrcweir 		pUndo = new SwUndoMoveNum( rPam, nOffset, bIsOutlMv );
2326cdf0e10cSrcweir         nMoved = rPam.End()->nNode.GetIndex() - rPam.Start()->nNode.GetIndex() + 1;
2327cdf0e10cSrcweir     }
2328cdf0e10cSrcweir 
2329cdf0e10cSrcweir 
2330cdf0e10cSrcweir     MoveNodeRange( aMvRg, aIdx, DOC_MOVEREDLINES );
2331cdf0e10cSrcweir 
2332cdf0e10cSrcweir 	if( pUndo )
2333cdf0e10cSrcweir 	{
2334cdf0e10cSrcweir         // i57907: Under circumstances (sections at the end of a chapter)
2335cdf0e10cSrcweir         // the rPam.Start() is not moved to the new position.
2336cdf0e10cSrcweir         // But aIdx should be at the new end position and as long as the number of moved paragraphs
2337cdf0e10cSrcweir         // is nMoved, I know, where the new position is.
2338cdf0e10cSrcweir 		pUndo->SetStartNode( aIdx.GetIndex() - nMoved );
2339cdf0e10cSrcweir         GetIDocumentUndoRedo().AppendUndo(pUndo);
2340cdf0e10cSrcweir     }
2341cdf0e10cSrcweir 
2342cdf0e10cSrcweir 	if( pOwnRedl )
2343cdf0e10cSrcweir 	{
2344cdf0e10cSrcweir 		SwPosition *pRStt = pOwnRedl->Start(), *pREnd = pOwnRedl->End();
2345cdf0e10cSrcweir 		if( pRStt->nNode.GetIndex() != nRedlSttNd )
2346cdf0e10cSrcweir 		{
2347cdf0e10cSrcweir 			pRStt->nNode = nRedlSttNd;
2348cdf0e10cSrcweir 			pRStt->nContent.Assign( pRStt->nNode.GetNode().GetCntntNode(),0);
2349cdf0e10cSrcweir 		}
2350cdf0e10cSrcweir 		if( pREnd->nNode.GetIndex() != nRedlEndNd )
2351cdf0e10cSrcweir 		{
2352cdf0e10cSrcweir 			pREnd->nNode = nRedlEndNd;
2353cdf0e10cSrcweir 			SwCntntNode* pCNd = pREnd->nNode.GetNode().GetCntntNode();
2354cdf0e10cSrcweir 			xub_StrLen nL = 0; if( pCNd ) nL = pCNd->Len();
2355cdf0e10cSrcweir 			pREnd->nContent.Assign( pCNd, nL );
2356cdf0e10cSrcweir 		}
2357cdf0e10cSrcweir 	}
2358cdf0e10cSrcweir 
2359cdf0e10cSrcweir 	SetModified();
2360cdf0e10cSrcweir 	return sal_True;
2361cdf0e10cSrcweir }
2362cdf0e10cSrcweir 
NumOrNoNum(const SwNodeIndex & rIdx,sal_Bool bDel)2363cdf0e10cSrcweir sal_Bool SwDoc::NumOrNoNum( const SwNodeIndex& rIdx, sal_Bool bDel )
2364cdf0e10cSrcweir {
2365cdf0e10cSrcweir     sal_Bool bResult = sal_False;
2366cdf0e10cSrcweir     SwTxtNode * pTxtNd = rIdx.GetNode().GetTxtNode();
2367cdf0e10cSrcweir 
2368cdf0e10cSrcweir     if (pTxtNd && pTxtNd->GetNumRule() != NULL &&
2369cdf0e10cSrcweir         (pTxtNd->HasNumber() || pTxtNd->HasBullet()))
2370cdf0e10cSrcweir     {
2371cdf0e10cSrcweir         if ( !pTxtNd->IsCountedInList() == !bDel)
2372cdf0e10cSrcweir         {
2373cdf0e10cSrcweir             sal_Bool bOldNum = bDel; // == pTxtNd->IsCounted();
2374cdf0e10cSrcweir             sal_Bool bNewNum = bDel ? sal_False : sal_True;
2375cdf0e10cSrcweir             pTxtNd->SetCountedInList(bNewNum ? true : false);
2376cdf0e10cSrcweir 
2377cdf0e10cSrcweir             SetModified();
2378cdf0e10cSrcweir 
2379cdf0e10cSrcweir             bResult = sal_True;
2380cdf0e10cSrcweir 
2381cdf0e10cSrcweir             if (GetIDocumentUndoRedo().DoesUndo())
2382cdf0e10cSrcweir             {
2383cdf0e10cSrcweir                 SwUndoNumOrNoNum * pUndo =
2384cdf0e10cSrcweir                     new SwUndoNumOrNoNum(rIdx, bOldNum, bNewNum);
2385cdf0e10cSrcweir 
2386cdf0e10cSrcweir                 GetIDocumentUndoRedo().AppendUndo(pUndo);
2387cdf0e10cSrcweir             }
2388cdf0e10cSrcweir         }
2389cdf0e10cSrcweir         else if (bDel && pTxtNd->GetNumRule(sal_False) &&
2390cdf0e10cSrcweir                  pTxtNd->GetActualListLevel() >= 0 &&
2391cdf0e10cSrcweir                  pTxtNd->GetActualListLevel() < MAXLEVEL)
2392cdf0e10cSrcweir         {
2393cdf0e10cSrcweir             SwPaM aPam(*pTxtNd);
2394cdf0e10cSrcweir 
2395cdf0e10cSrcweir             DelNumRules(aPam);
2396cdf0e10cSrcweir 
2397cdf0e10cSrcweir             bResult = sal_True;
2398cdf0e10cSrcweir         }
2399cdf0e10cSrcweir     }
2400cdf0e10cSrcweir 
2401cdf0e10cSrcweir     return bResult;
2402cdf0e10cSrcweir }
2403cdf0e10cSrcweir 
GetCurrNumRule(const SwPosition & rPos) const2404cdf0e10cSrcweir SwNumRule* SwDoc::GetCurrNumRule( const SwPosition& rPos ) const
2405cdf0e10cSrcweir {
2406cdf0e10cSrcweir 	SwNumRule* pRet = 0;
2407cdf0e10cSrcweir 	SwTxtNode* pTNd = rPos.nNode.GetNode().GetTxtNode();
2408cdf0e10cSrcweir 
2409cdf0e10cSrcweir 	if( pTNd )
2410cdf0e10cSrcweir     {
2411cdf0e10cSrcweir         // --> OD 2008-02-20 #refactorlists#
2412cdf0e10cSrcweir //        pTNd->SyncNumberAndNumRule();
2413cdf0e10cSrcweir         // <--
2414cdf0e10cSrcweir 		pRet = pTNd->GetNumRule();
2415cdf0e10cSrcweir     }
2416cdf0e10cSrcweir 
2417cdf0e10cSrcweir 	return pRet;
2418cdf0e10cSrcweir }
2419cdf0e10cSrcweir 
FindNumRule(const String & rName) const2420cdf0e10cSrcweir sal_uInt16 SwDoc::FindNumRule( const String& rName ) const
2421cdf0e10cSrcweir {
2422cdf0e10cSrcweir 	for( sal_uInt16 n = pNumRuleTbl->Count(); n; )
2423cdf0e10cSrcweir 		if( (*pNumRuleTbl)[ --n ]->GetName() == rName )
2424cdf0e10cSrcweir 			return n;
2425cdf0e10cSrcweir 
2426cdf0e10cSrcweir     return USHRT_MAX;
2427cdf0e10cSrcweir }
2428cdf0e10cSrcweir 
FindNumRulePtr(const String & rName) const2429cdf0e10cSrcweir SwNumRule* SwDoc::FindNumRulePtr( const String& rName ) const
2430cdf0e10cSrcweir {
2431cdf0e10cSrcweir     SwNumRule * pResult = 0;
2432cdf0e10cSrcweir 
2433cdf0e10cSrcweir     pResult = maNumRuleMap[rName];
2434cdf0e10cSrcweir 
2435cdf0e10cSrcweir     if ( !pResult )
2436cdf0e10cSrcweir     {
2437cdf0e10cSrcweir         for (sal_uInt16 n = 0; n < pNumRuleTbl->Count(); ++n)
2438cdf0e10cSrcweir         {
2439cdf0e10cSrcweir             if ((*pNumRuleTbl)[n]->GetName() == rName)
2440cdf0e10cSrcweir             {
2441cdf0e10cSrcweir                 pResult = (*pNumRuleTbl)[n];
2442cdf0e10cSrcweir 
2443cdf0e10cSrcweir                 break;
2444cdf0e10cSrcweir             }
2445cdf0e10cSrcweir         }
2446cdf0e10cSrcweir     }
2447cdf0e10cSrcweir 
2448cdf0e10cSrcweir 	return pResult;
2449cdf0e10cSrcweir }
2450cdf0e10cSrcweir 
2451cdf0e10cSrcweir // #i36749#
AddNumRule(SwNumRule * pRule)2452cdf0e10cSrcweir void SwDoc::AddNumRule(SwNumRule * pRule)
2453cdf0e10cSrcweir {
2454b264d727SArmin Le Grand     if ((SAL_MAX_UINT16 - 1) <= pNumRuleTbl->Count())
2455b264d727SArmin Le Grand     {
2456b264d727SArmin Le Grand         OSL_ENSURE(false, "SwDoc::AddNumRule: table full.");
2457b264d727SArmin Le Grand         abort(); // this should never happen on real documents
2458b264d727SArmin Le Grand     }
2459cdf0e10cSrcweir     pNumRuleTbl->Insert(pRule, pNumRuleTbl->Count());
2460cdf0e10cSrcweir     maNumRuleMap[pRule->GetName()] = pRule;
2461cdf0e10cSrcweir     pRule->SetNumRuleMap(&maNumRuleMap);
2462cdf0e10cSrcweir 
2463cdf0e10cSrcweir     // --> OD 2008-03-26 #refactorlists#
2464cdf0e10cSrcweir     createListForListStyle( pRule->GetName() );
2465cdf0e10cSrcweir     // <--
2466cdf0e10cSrcweir }
2467cdf0e10cSrcweir 
2468cdf0e10cSrcweir // --> OD 2008-02-11 #newlistlevelattrs#
MakeNumRule(const String & rName,const SwNumRule * pCpy,sal_Bool bBroadcast,const SvxNumberFormat::SvxNumPositionAndSpaceMode eDefaultNumberFormatPositionAndSpaceMode)2469cdf0e10cSrcweir sal_uInt16 SwDoc::MakeNumRule( const String &rName,
2470cdf0e10cSrcweir             const SwNumRule* pCpy,
2471cdf0e10cSrcweir             sal_Bool bBroadcast,
2472cdf0e10cSrcweir             const SvxNumberFormat::SvxNumPositionAndSpaceMode eDefaultNumberFormatPositionAndSpaceMode )
2473cdf0e10cSrcweir {
2474cdf0e10cSrcweir 	SwNumRule* pNew;
2475cdf0e10cSrcweir 	if( pCpy )
2476cdf0e10cSrcweir 	{
2477cdf0e10cSrcweir 		pNew = new SwNumRule( *pCpy );
2478cdf0e10cSrcweir 
2479cdf0e10cSrcweir         // --> OD 2008-07-08 #i91400#
2480cdf0e10cSrcweir         pNew->SetName( GetUniqueNumRuleName( &rName ), *this );
2481cdf0e10cSrcweir         // <--
2482cdf0e10cSrcweir 		if( pNew->GetName() != rName )
2483cdf0e10cSrcweir 		{
2484cdf0e10cSrcweir 			pNew->SetPoolFmtId( USHRT_MAX );
2485cdf0e10cSrcweir 			pNew->SetPoolHelpId( USHRT_MAX );
2486cdf0e10cSrcweir 			pNew->SetPoolHlpFileId( UCHAR_MAX );
2487cdf0e10cSrcweir             // --> OD 2008-04-03 #refactorlists#
2488cdf0e10cSrcweir             pNew->SetDefaultListId( String() );
2489cdf0e10cSrcweir             // <--
2490cdf0e10cSrcweir 		}
2491cdf0e10cSrcweir 		pNew->CheckCharFmts( this );
2492cdf0e10cSrcweir 	}
2493cdf0e10cSrcweir 	else
2494cdf0e10cSrcweir     {
2495cdf0e10cSrcweir         // --> OD 2008-02-11 #newlistlevelattrs#
2496cdf0e10cSrcweir         pNew = new SwNumRule( GetUniqueNumRuleName( &rName ),
2497cdf0e10cSrcweir                               eDefaultNumberFormatPositionAndSpaceMode );
2498cdf0e10cSrcweir         // <--
2499cdf0e10cSrcweir     }
2500cdf0e10cSrcweir 
2501cdf0e10cSrcweir 	sal_uInt16 nRet = pNumRuleTbl->Count();
2502cdf0e10cSrcweir 
2503cdf0e10cSrcweir     AddNumRule(pNew); // #i36749#
2504cdf0e10cSrcweir 
2505cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
2506cdf0e10cSrcweir     {
2507cdf0e10cSrcweir         SwUndo * pUndo = new SwUndoNumruleCreate(pNew, this);
2508cdf0e10cSrcweir         GetIDocumentUndoRedo().AppendUndo(pUndo);
2509cdf0e10cSrcweir     }
2510cdf0e10cSrcweir 
2511cdf0e10cSrcweir     if (bBroadcast)
2512cdf0e10cSrcweir         BroadcastStyleOperation(pNew->GetName(), SFX_STYLE_FAMILY_PSEUDO,
2513cdf0e10cSrcweir                                 SFX_STYLESHEET_CREATED);
2514cdf0e10cSrcweir 
2515cdf0e10cSrcweir 	return nRet;
2516cdf0e10cSrcweir }
2517cdf0e10cSrcweir 
GetUniqueNumRuleName(const String * pChkStr,sal_Bool bAutoNum) const2518cdf0e10cSrcweir String SwDoc::GetUniqueNumRuleName( const String* pChkStr, sal_Bool bAutoNum ) const
2519cdf0e10cSrcweir {
2520cdf0e10cSrcweir 	String aName;
2521cdf0e10cSrcweir 	if( bAutoNum )
2522cdf0e10cSrcweir 	{
25233d14cea3SMichael Stahl         // --> OD #o12311627#
25243d14cea3SMichael Stahl         static rtlRandomPool s_RandomPool( rtl_random_createPool() );
25253d14cea3SMichael Stahl         sal_Int64 n;
25263d14cea3SMichael Stahl         rtl_random_getBytes( s_RandomPool, &n, sizeof(n) );
25273d14cea3SMichael Stahl         aName = String::CreateFromInt64( (n < 0 ? -n : n) );
25283d14cea3SMichael Stahl         // <--
2529cdf0e10cSrcweir 		if( pChkStr && !pChkStr->Len() )
2530cdf0e10cSrcweir 			pChkStr = 0;
2531cdf0e10cSrcweir 	}
2532cdf0e10cSrcweir 	else if( pChkStr && pChkStr->Len() )
2533cdf0e10cSrcweir 		aName = *pChkStr;
2534cdf0e10cSrcweir 	else
2535cdf0e10cSrcweir 	{
2536cdf0e10cSrcweir 		pChkStr = 0;
2537cdf0e10cSrcweir 		aName = SW_RESSTR( STR_NUMRULE_DEFNAME );
2538cdf0e10cSrcweir 	}
2539cdf0e10cSrcweir 
2540cdf0e10cSrcweir 	sal_uInt16 nNum(0), nTmp, nFlagSize = ( pNumRuleTbl->Count() / 8 ) +2;
2541cdf0e10cSrcweir 	sal_uInt8* pSetFlags = new sal_uInt8[ nFlagSize ];
2542cdf0e10cSrcweir 	memset( pSetFlags, 0, nFlagSize );
2543cdf0e10cSrcweir 
2544cdf0e10cSrcweir 	xub_StrLen nNmLen = aName.Len();
2545cdf0e10cSrcweir 	if( !bAutoNum && pChkStr )
2546cdf0e10cSrcweir 	{
2547cdf0e10cSrcweir 		while( nNmLen-- && '0' <= aName.GetChar( nNmLen ) &&
2548cdf0e10cSrcweir 						   '9' >= aName.GetChar( nNmLen ) )
2549cdf0e10cSrcweir 			; //nop
2550cdf0e10cSrcweir 
2551cdf0e10cSrcweir 		if( ++nNmLen < aName.Len() )
2552cdf0e10cSrcweir 		{
2553cdf0e10cSrcweir 			aName.Erase( nNmLen );
2554cdf0e10cSrcweir 			pChkStr = 0;
2555cdf0e10cSrcweir 		}
2556cdf0e10cSrcweir 	}
2557cdf0e10cSrcweir 
2558cdf0e10cSrcweir 	const SwNumRule* pNumRule;
2559cdf0e10cSrcweir 	sal_uInt16 n;
2560cdf0e10cSrcweir 
2561cdf0e10cSrcweir 	for( n = 0; n < pNumRuleTbl->Count(); ++n )
2562cdf0e10cSrcweir 		if( 0 != ( pNumRule = (*pNumRuleTbl)[ n ] ) )
2563cdf0e10cSrcweir 		{
2564cdf0e10cSrcweir 			const String& rNm = pNumRule->GetName();
2565cdf0e10cSrcweir 			if( rNm.Match( aName ) == nNmLen )
2566cdf0e10cSrcweir 			{
2567cdf0e10cSrcweir 				// Nummer bestimmen und das Flag setzen
2568cdf0e10cSrcweir                 nNum = (sal_uInt16)rNm.Copy( nNmLen ).ToInt32();
2569cdf0e10cSrcweir 				if( nNum-- && nNum < pNumRuleTbl->Count() )
2570cdf0e10cSrcweir 					pSetFlags[ nNum / 8 ] |= (0x01 << ( nNum & 0x07 ));
2571cdf0e10cSrcweir 			}
2572cdf0e10cSrcweir 			if( pChkStr && pChkStr->Equals( rNm ) )
2573cdf0e10cSrcweir 				pChkStr = 0;
2574cdf0e10cSrcweir 		}
2575cdf0e10cSrcweir 
2576cdf0e10cSrcweir 	if( !pChkStr )
2577cdf0e10cSrcweir 	{
2578cdf0e10cSrcweir 		// alle Nummern entsprechend geflag, also bestimme die richtige Nummer
2579cdf0e10cSrcweir 		nNum = pNumRuleTbl->Count();
2580cdf0e10cSrcweir 		for( n = 0; n < nFlagSize; ++n )
2581cdf0e10cSrcweir 			if( 0xff != ( nTmp = pSetFlags[ n ] ))
2582cdf0e10cSrcweir 			{
2583cdf0e10cSrcweir 				// also die Nummer bestimmen
2584cdf0e10cSrcweir 				nNum = n * 8;
2585cdf0e10cSrcweir 				while( nTmp & 1 )
2586cdf0e10cSrcweir 					++nNum, nTmp >>= 1;
2587cdf0e10cSrcweir 				break;
2588cdf0e10cSrcweir 			}
2589cdf0e10cSrcweir 
2590cdf0e10cSrcweir 	}
2591cdf0e10cSrcweir 	delete [] pSetFlags;
2592cdf0e10cSrcweir 	if( pChkStr && pChkStr->Len() )
2593cdf0e10cSrcweir 		return *pChkStr;
2594cdf0e10cSrcweir 	return aName += String::CreateFromInt32( ++nNum );
2595cdf0e10cSrcweir }
2596cdf0e10cSrcweir 
UpdateNumRule()2597cdf0e10cSrcweir void SwDoc::UpdateNumRule()
2598cdf0e10cSrcweir {
2599cdf0e10cSrcweir 	const SwNumRuleTbl& rNmTbl = GetNumRuleTbl();
2600cdf0e10cSrcweir 	for( sal_uInt16 n = 0; n < rNmTbl.Count(); ++n )
2601cdf0e10cSrcweir 		if( rNmTbl[ n ]->IsInvalidRule() )
2602cdf0e10cSrcweir 			rNmTbl[ n ]->Validate();
2603cdf0e10cSrcweir }
2604cdf0e10cSrcweir 
2605cdf0e10cSrcweir // --> OD 2008-04-02 #refactorlists#
MarkListLevel(const String & sListId,const int nListLevel,const sal_Bool bValue)2606cdf0e10cSrcweir void SwDoc::MarkListLevel( const String& sListId,
2607cdf0e10cSrcweir                            const int nListLevel,
2608cdf0e10cSrcweir                            const sal_Bool bValue )
2609cdf0e10cSrcweir {
2610cdf0e10cSrcweir     SwList* pList = getListByName( sListId );
2611cdf0e10cSrcweir 
2612cdf0e10cSrcweir     if ( pList )
2613cdf0e10cSrcweir     {
2614cdf0e10cSrcweir         MarkListLevel( *pList, nListLevel, bValue );
2615cdf0e10cSrcweir     }
2616cdf0e10cSrcweir }
2617cdf0e10cSrcweir 
MarkListLevel(SwList & rList,const int nListLevel,const sal_Bool bValue)2618cdf0e10cSrcweir void SwDoc::MarkListLevel( SwList& rList,
2619cdf0e10cSrcweir                            const int nListLevel,
2620cdf0e10cSrcweir                            const sal_Bool bValue )
2621cdf0e10cSrcweir {
2622cdf0e10cSrcweir     // Set new marked list level and notify all affected nodes of the changed mark.
2623cdf0e10cSrcweir     rList.MarkListLevel( nListLevel, bValue );
2624cdf0e10cSrcweir }
2625cdf0e10cSrcweir // <- #i27615#
2626cdf0e10cSrcweir // <--
2627cdf0e10cSrcweir 
2628cdf0e10cSrcweir // #i23726#
IsFirstOfNumRule(SwPosition & rPos)2629cdf0e10cSrcweir sal_Bool SwDoc::IsFirstOfNumRule(SwPosition & rPos)
2630cdf0e10cSrcweir {
2631cdf0e10cSrcweir     sal_Bool bResult = sal_False;
2632cdf0e10cSrcweir     SwTxtNode * pTxtNode = rPos.nNode.GetNode().GetTxtNode();
2633cdf0e10cSrcweir 
2634cdf0e10cSrcweir     if (pTxtNode)
2635cdf0e10cSrcweir     {
2636cdf0e10cSrcweir         SwNumRule * pNumRule = pTxtNode->GetNumRule();
2637cdf0e10cSrcweir 
2638cdf0e10cSrcweir         if (pNumRule)
2639cdf0e10cSrcweir             bResult = pTxtNode->IsFirstOfNumRule();
2640cdf0e10cSrcweir     }
2641cdf0e10cSrcweir 
2642cdf0e10cSrcweir     return bResult;
2643cdf0e10cSrcweir }
2644cdf0e10cSrcweir 
2645cdf0e10cSrcweir // --> OD 2007-10-26 #i83479#
2646cdf0e10cSrcweir // implementation for interface <IDocumentListItems>
operator ()(const SwNodeNum * pNodeNumOne,const SwNodeNum * pNodeNumTwo) const2647cdf0e10cSrcweir bool SwDoc::lessThanNodeNum::operator()( const SwNodeNum* pNodeNumOne,
2648cdf0e10cSrcweir                                          const SwNodeNum* pNodeNumTwo ) const
2649cdf0e10cSrcweir {
2650cdf0e10cSrcweir     return pNodeNumOne->LessThan( *pNodeNumTwo );
2651cdf0e10cSrcweir }
2652cdf0e10cSrcweir 
addListItem(const SwNodeNum & rNodeNum)2653cdf0e10cSrcweir void SwDoc::addListItem( const SwNodeNum& rNodeNum )
2654cdf0e10cSrcweir {
2655cdf0e10cSrcweir     if ( mpListItemsList == 0 )
2656cdf0e10cSrcweir     {
2657cdf0e10cSrcweir         return;
2658cdf0e10cSrcweir     }
2659cdf0e10cSrcweir 
2660cdf0e10cSrcweir     const bool bAlreadyInserted(
2661cdf0e10cSrcweir             mpListItemsList->find( &rNodeNum ) != mpListItemsList->end() );
2662cdf0e10cSrcweir     ASSERT( !bAlreadyInserted,
2663cdf0e10cSrcweir             "<SwDoc::InsertListItem(..)> - <SwNodeNum> instance already registered as numbered item!" );
2664cdf0e10cSrcweir     if ( !bAlreadyInserted )
2665cdf0e10cSrcweir     {
2666cdf0e10cSrcweir         mpListItemsList->insert( &rNodeNum );
2667cdf0e10cSrcweir     }
2668cdf0e10cSrcweir }
2669cdf0e10cSrcweir 
removeListItem(const SwNodeNum & rNodeNum)2670cdf0e10cSrcweir void SwDoc::removeListItem( const SwNodeNum& rNodeNum )
2671cdf0e10cSrcweir {
2672cdf0e10cSrcweir     if ( mpListItemsList == 0 )
2673cdf0e10cSrcweir     {
2674cdf0e10cSrcweir         return;
2675cdf0e10cSrcweir     }
2676cdf0e10cSrcweir 
2677cdf0e10cSrcweir     const tImplSortedNodeNumList::size_type nDeleted = mpListItemsList->erase( &rNodeNum );
2678cdf0e10cSrcweir     if ( nDeleted > 1 )
2679cdf0e10cSrcweir     {
2680cdf0e10cSrcweir         ASSERT( false,
2681cdf0e10cSrcweir                 "<SwDoc::RemoveListItem(..)> - <SwNodeNum> was registered more than once as numbered item!" );
2682cdf0e10cSrcweir     }
2683cdf0e10cSrcweir }
2684cdf0e10cSrcweir 
getListItemText(const SwNodeNum & rNodeNum,const bool bWithNumber,const bool bWithSpacesForLevel) const2685cdf0e10cSrcweir String SwDoc::getListItemText( const SwNodeNum& rNodeNum,
2686cdf0e10cSrcweir                                const bool bWithNumber,
2687cdf0e10cSrcweir                                const bool bWithSpacesForLevel ) const
2688cdf0e10cSrcweir {
2689cdf0e10cSrcweir     return rNodeNum.GetTxtNode()
2690cdf0e10cSrcweir            ? rNodeNum.GetTxtNode()->GetExpandTxt( 0, STRING_LEN, bWithNumber,
2691cdf0e10cSrcweir                                                   bWithNumber, bWithSpacesForLevel )
2692cdf0e10cSrcweir            : String();
2693cdf0e10cSrcweir }
2694cdf0e10cSrcweir 
getListItems(tSortedNodeNumList & orNodeNumList) const2695cdf0e10cSrcweir void SwDoc::getListItems( tSortedNodeNumList& orNodeNumList ) const
2696cdf0e10cSrcweir {
2697cdf0e10cSrcweir     orNodeNumList.clear();
2698cdf0e10cSrcweir     orNodeNumList.reserve( mpListItemsList->size() );
2699cdf0e10cSrcweir 
2700cdf0e10cSrcweir     tImplSortedNodeNumList::iterator aIter;
2701cdf0e10cSrcweir     tImplSortedNodeNumList::iterator aEndIter = mpListItemsList->end();
2702cdf0e10cSrcweir     for ( aIter = mpListItemsList->begin(); aIter != aEndIter; ++aIter )
2703cdf0e10cSrcweir     {
2704cdf0e10cSrcweir         orNodeNumList.push_back( (*aIter) );
2705cdf0e10cSrcweir     }
2706cdf0e10cSrcweir }
2707cdf0e10cSrcweir 
getNumItems(tSortedNodeNumList & orNodeNumList) const2708cdf0e10cSrcweir void SwDoc::getNumItems( tSortedNodeNumList& orNodeNumList ) const
2709cdf0e10cSrcweir {
2710cdf0e10cSrcweir     orNodeNumList.clear();
2711cdf0e10cSrcweir     orNodeNumList.reserve( mpListItemsList->size() );
2712cdf0e10cSrcweir 
2713cdf0e10cSrcweir     tImplSortedNodeNumList::iterator aIter;
2714cdf0e10cSrcweir     tImplSortedNodeNumList::iterator aEndIter = mpListItemsList->end();
2715cdf0e10cSrcweir     for ( aIter = mpListItemsList->begin(); aIter != aEndIter; ++aIter )
2716cdf0e10cSrcweir     {
2717cdf0e10cSrcweir         const SwNodeNum* pNodeNum = (*aIter);
2718cdf0e10cSrcweir         if ( pNodeNum->IsCounted() &&
2719cdf0e10cSrcweir              pNodeNum->GetTxtNode() && pNodeNum->GetTxtNode()->HasNumber() )
2720cdf0e10cSrcweir         {
2721cdf0e10cSrcweir             orNodeNumList.push_back( pNodeNum );
2722cdf0e10cSrcweir         }
2723cdf0e10cSrcweir     }
2724cdf0e10cSrcweir }
2725cdf0e10cSrcweir // <--
2726cdf0e10cSrcweir 
2727cdf0e10cSrcweir // --> OD 2007-11-15 #i83479#
2728cdf0e10cSrcweir // implementation for interface <IDocumentOutlineNodes>
getOutlineNodesCount() const2729cdf0e10cSrcweir sal_Int32 SwDoc::getOutlineNodesCount() const
2730cdf0e10cSrcweir {
2731cdf0e10cSrcweir     return GetNodes().GetOutLineNds().Count();
2732cdf0e10cSrcweir }
2733cdf0e10cSrcweir 
getOutlineLevel(const sal_Int32 nIdx) const2734cdf0e10cSrcweir int SwDoc::getOutlineLevel( const sal_Int32 nIdx ) const
2735cdf0e10cSrcweir {
2736cdf0e10cSrcweir     return GetNodes().GetOutLineNds()[ static_cast<sal_uInt16>(nIdx) ]->
2737cdf0e10cSrcweir                                            // GetTxtNode()->GetOutlineLevel();				//#outline level,zhaojianwei
2738cdf0e10cSrcweir 								GetTxtNode()->GetAttrOutlineLevel()-1;	//<-end,zhaojianwei
2739cdf0e10cSrcweir }
2740cdf0e10cSrcweir 
getOutlineText(const sal_Int32 nIdx,const bool bWithNumber,const bool bWithSpacesForLevel) const2741cdf0e10cSrcweir String SwDoc::getOutlineText( const sal_Int32 nIdx,
2742cdf0e10cSrcweir                               const bool bWithNumber,
2743cdf0e10cSrcweir                               const bool bWithSpacesForLevel ) const
2744cdf0e10cSrcweir {
2745cdf0e10cSrcweir     return GetNodes().GetOutLineNds()[ static_cast<sal_uInt16>(nIdx) ]->
2746cdf0e10cSrcweir                 GetTxtNode()->GetExpandTxt( 0, STRING_LEN, bWithNumber,
2747cdf0e10cSrcweir                                             bWithNumber, bWithSpacesForLevel );
2748cdf0e10cSrcweir }
2749cdf0e10cSrcweir 
getOutlineNode(const sal_Int32 nIdx) const2750cdf0e10cSrcweir SwTxtNode* SwDoc::getOutlineNode( const sal_Int32 nIdx ) const
2751cdf0e10cSrcweir {
2752cdf0e10cSrcweir     return GetNodes().GetOutLineNds()[ static_cast<sal_uInt16>(nIdx) ]->GetTxtNode();
2753cdf0e10cSrcweir }
2754cdf0e10cSrcweir 
getOutlineNodes(IDocumentOutlineNodes::tSortedOutlineNodeList & orOutlineNodeList) const2755cdf0e10cSrcweir void SwDoc::getOutlineNodes( IDocumentOutlineNodes::tSortedOutlineNodeList& orOutlineNodeList ) const
2756cdf0e10cSrcweir {
2757cdf0e10cSrcweir     orOutlineNodeList.clear();
2758cdf0e10cSrcweir     orOutlineNodeList.reserve( getOutlineNodesCount() );
2759cdf0e10cSrcweir 
2760cdf0e10cSrcweir     const sal_uInt16 nOutlCount( static_cast<sal_uInt16>(getOutlineNodesCount()) );
2761cdf0e10cSrcweir     for ( sal_uInt16 i = 0; i < nOutlCount; ++i )
2762cdf0e10cSrcweir     {
2763cdf0e10cSrcweir         orOutlineNodeList.push_back(
2764cdf0e10cSrcweir             GetNodes().GetOutLineNds()[i]->GetTxtNode() );
2765cdf0e10cSrcweir     }
2766cdf0e10cSrcweir }
2767cdf0e10cSrcweir // <--
2768cdf0e10cSrcweir 
2769cdf0e10cSrcweir // --> OD 2008-03-26 #refactorlists#
2770cdf0e10cSrcweir // implementation of interface IDocumentListsAccess
createList(String sListId,const String sDefaultListStyleName)2771cdf0e10cSrcweir SwList* SwDoc::createList( String sListId,
2772cdf0e10cSrcweir                            const String sDefaultListStyleName )
2773cdf0e10cSrcweir {
2774cdf0e10cSrcweir     if ( sListId.Len() == 0 )
2775cdf0e10cSrcweir     {
2776cdf0e10cSrcweir         sListId = listfunc::CreateUniqueListId( *this );
2777cdf0e10cSrcweir     }
2778cdf0e10cSrcweir 
2779cdf0e10cSrcweir     if ( getListByName( sListId ) )
2780cdf0e10cSrcweir     {
2781cdf0e10cSrcweir         ASSERT( false,
2782cdf0e10cSrcweir                 "<SwDoc::createList(..)> - provided list id already used. Serious defect -> please inform OD." );
2783cdf0e10cSrcweir         return 0;
2784cdf0e10cSrcweir     }
2785cdf0e10cSrcweir 
2786cdf0e10cSrcweir     SwNumRule* pDefaultNumRuleForNewList = FindNumRulePtr( sDefaultListStyleName );
2787cdf0e10cSrcweir     if ( !pDefaultNumRuleForNewList )
2788cdf0e10cSrcweir     {
2789cdf0e10cSrcweir         ASSERT( false,
2790cdf0e10cSrcweir                 "<SwDoc::createList(..)> - for provided default list style name no list style is found. Serious defect -> please inform OD." );
2791cdf0e10cSrcweir         return 0;
2792cdf0e10cSrcweir     }
2793cdf0e10cSrcweir 
2794cdf0e10cSrcweir     SwList* pNewList = new SwList( sListId, *pDefaultNumRuleForNewList, GetNodes() );
2795cdf0e10cSrcweir     maLists[sListId] = pNewList;
2796cdf0e10cSrcweir 
2797cdf0e10cSrcweir     return pNewList;
2798cdf0e10cSrcweir }
2799cdf0e10cSrcweir 
deleteList(const String sListId)2800cdf0e10cSrcweir void SwDoc::deleteList( const String sListId )
2801cdf0e10cSrcweir {
2802cdf0e10cSrcweir     SwList* pList = getListByName( sListId );
2803cdf0e10cSrcweir     if ( pList )
2804cdf0e10cSrcweir     {
2805cdf0e10cSrcweir         maLists.erase( sListId );
2806cdf0e10cSrcweir         delete pList;
2807cdf0e10cSrcweir     }
2808cdf0e10cSrcweir }
2809cdf0e10cSrcweir 
getListByName(const String sListId) const2810cdf0e10cSrcweir SwList* SwDoc::getListByName( const String sListId ) const
2811cdf0e10cSrcweir {
2812cdf0e10cSrcweir     SwList* pList = 0;
2813cdf0e10cSrcweir 
2814cdf0e10cSrcweir     std::hash_map< String, SwList*, StringHash >::const_iterator
2815cdf0e10cSrcweir                                             aListIter = maLists.find( sListId );
2816cdf0e10cSrcweir     if ( aListIter != maLists.end() )
2817cdf0e10cSrcweir     {
2818cdf0e10cSrcweir         pList = (*aListIter).second;
2819cdf0e10cSrcweir     }
2820cdf0e10cSrcweir 
2821cdf0e10cSrcweir     return pList;
2822cdf0e10cSrcweir }
2823cdf0e10cSrcweir 
createListForListStyle(const String sListStyleName)2824cdf0e10cSrcweir SwList* SwDoc::createListForListStyle( const String sListStyleName )
2825cdf0e10cSrcweir {
2826cdf0e10cSrcweir     if ( sListStyleName.Len() == 0 )
2827cdf0e10cSrcweir     {
2828cdf0e10cSrcweir         ASSERT( false,
2829cdf0e10cSrcweir                 "<SwDoc::createListForListStyle(..)> - no list style name provided. Serious defect -> please inform OD." );
2830cdf0e10cSrcweir         return 0;
2831cdf0e10cSrcweir     }
2832cdf0e10cSrcweir 
2833cdf0e10cSrcweir     if ( getListForListStyle( sListStyleName ) )
2834cdf0e10cSrcweir     {
2835cdf0e10cSrcweir         ASSERT( false,
2836cdf0e10cSrcweir                 "<SwDoc::createListForListStyle(..)> - a list for the provided list style name already exists. Serious defect -> please inform OD." );
2837cdf0e10cSrcweir         return 0;
2838cdf0e10cSrcweir     }
2839cdf0e10cSrcweir 
2840cdf0e10cSrcweir     SwNumRule* pNumRule = FindNumRulePtr( sListStyleName );
2841cdf0e10cSrcweir     if ( !pNumRule )
2842cdf0e10cSrcweir     {
2843cdf0e10cSrcweir         ASSERT( false,
2844cdf0e10cSrcweir                 "<SwDoc::createListForListStyle(..)> - for provided list style name no list style is found. Serious defect -> please inform OD." );
2845cdf0e10cSrcweir         return 0;
2846cdf0e10cSrcweir     }
2847cdf0e10cSrcweir 
2848cdf0e10cSrcweir     String sListId( pNumRule->GetDefaultListId() ); // can be empty String
2849cdf0e10cSrcweir     if ( getListByName( sListId ) )
2850cdf0e10cSrcweir     {
2851cdf0e10cSrcweir         sListId = String();
2852cdf0e10cSrcweir     }
2853cdf0e10cSrcweir     SwList* pNewList = createList( sListId, sListStyleName );
2854cdf0e10cSrcweir     maListStyleLists[sListStyleName] = pNewList;
2855cdf0e10cSrcweir     pNumRule->SetDefaultListId( pNewList->GetListId() );
2856cdf0e10cSrcweir 
2857cdf0e10cSrcweir     return pNewList;
2858cdf0e10cSrcweir }
2859cdf0e10cSrcweir 
getListForListStyle(const String sListStyleName) const2860cdf0e10cSrcweir SwList* SwDoc::getListForListStyle( const String sListStyleName ) const
2861cdf0e10cSrcweir {
2862cdf0e10cSrcweir     SwList* pList = 0;
2863cdf0e10cSrcweir 
2864cdf0e10cSrcweir     std::hash_map< String, SwList*, StringHash >::const_iterator
2865cdf0e10cSrcweir                             aListIter = maListStyleLists.find( sListStyleName );
2866cdf0e10cSrcweir     if ( aListIter != maListStyleLists.end() )
2867cdf0e10cSrcweir     {
2868cdf0e10cSrcweir         pList = (*aListIter).second;
2869cdf0e10cSrcweir     }
2870cdf0e10cSrcweir 
2871cdf0e10cSrcweir     return pList;
2872cdf0e10cSrcweir }
2873cdf0e10cSrcweir 
deleteListForListStyle(const String sListStyleName)2874cdf0e10cSrcweir void SwDoc::deleteListForListStyle( const String sListStyleName )
2875cdf0e10cSrcweir {
2876cdf0e10cSrcweir     String sListId;
2877cdf0e10cSrcweir     {
2878cdf0e10cSrcweir         SwList* pList = getListForListStyle( sListStyleName );
2879cdf0e10cSrcweir         ASSERT( pList,
2880cdf0e10cSrcweir                 "<SwDoc::deleteListForListStyle(..)> - misusage of method: no list found for given list style name" );
2881cdf0e10cSrcweir         if ( pList )
2882cdf0e10cSrcweir         {
2883cdf0e10cSrcweir             sListId = pList->GetListId();
2884cdf0e10cSrcweir         }
2885cdf0e10cSrcweir     }
2886cdf0e10cSrcweir     if ( sListId.Len() > 0 )
2887cdf0e10cSrcweir     {
2888cdf0e10cSrcweir         maListStyleLists.erase( sListStyleName );
2889cdf0e10cSrcweir         deleteList( sListId );
2890cdf0e10cSrcweir     }
2891cdf0e10cSrcweir }
2892cdf0e10cSrcweir // <--
2893cdf0e10cSrcweir // --> OD 2008-07-08 #i91400#
trackChangeOfListStyleName(const String sListStyleName,const String sNewListStyleName)2894cdf0e10cSrcweir void SwDoc::trackChangeOfListStyleName( const String sListStyleName,
2895cdf0e10cSrcweir                                         const String sNewListStyleName )
2896cdf0e10cSrcweir {
2897cdf0e10cSrcweir     SwList* pList = getListForListStyle( sListStyleName );
2898cdf0e10cSrcweir     ASSERT( pList,
2899cdf0e10cSrcweir             "<SwDoc::changeOfListStyleName(..)> - misusage of method: no list found for given list style name" );
2900cdf0e10cSrcweir 
2901cdf0e10cSrcweir     if ( pList != 0 )
2902cdf0e10cSrcweir     {
2903cdf0e10cSrcweir         maListStyleLists.erase( sListStyleName );
2904cdf0e10cSrcweir         maListStyleLists[sNewListStyleName] = pList;
2905cdf0e10cSrcweir     }
2906cdf0e10cSrcweir }
2907cdf0e10cSrcweir // <--
2908cdf0e10cSrcweir 
2909cdf0e10cSrcweir // --> OD 2008-03-13 #refactorlists#
2910cdf0e10cSrcweir namespace listfunc
2911cdf0e10cSrcweir {
MakeListIdUnique(const SwDoc & rDoc,const String aSuggestedUniqueListId)2912cdf0e10cSrcweir     const String MakeListIdUnique( const SwDoc& rDoc,
2913cdf0e10cSrcweir                                    const String aSuggestedUniqueListId )
2914cdf0e10cSrcweir     {
2915cdf0e10cSrcweir         long nHitCount = 0;
2916cdf0e10cSrcweir         String aTmpStr = aSuggestedUniqueListId;
2917cdf0e10cSrcweir         while ( rDoc.getListByName( aTmpStr ) )
2918cdf0e10cSrcweir         {
2919cdf0e10cSrcweir             ++nHitCount;
2920cdf0e10cSrcweir             aTmpStr = aSuggestedUniqueListId;
2921cdf0e10cSrcweir             aTmpStr += String::CreateFromInt32( nHitCount );
2922cdf0e10cSrcweir         }
2923cdf0e10cSrcweir 
2924cdf0e10cSrcweir         return aTmpStr;
2925cdf0e10cSrcweir     }
CreateUniqueListId(const SwDoc & rDoc)2926cdf0e10cSrcweir     const String CreateUniqueListId( const SwDoc& rDoc )
2927cdf0e10cSrcweir     {
2928cdf0e10cSrcweir         // --> OD 2008-08-06 #i92478#
2929cdf0e10cSrcweir         String aNewListId = String::CreateFromAscii( "list" );
2930cdf0e10cSrcweir         // <--
29313d14cea3SMichael Stahl         // --> OD #o12311627#
29323d14cea3SMichael Stahl         static rtlRandomPool s_RandomPool( rtl_random_createPool() );
29333d14cea3SMichael Stahl         sal_Int64 n;
29343d14cea3SMichael Stahl         rtl_random_getBytes( s_RandomPool, &n, sizeof(n) );
29353d14cea3SMichael Stahl         aNewListId += String::CreateFromInt64( (n < 0 ? -n : n) );
2936cdf0e10cSrcweir         // <--
2937cdf0e10cSrcweir 
2938cdf0e10cSrcweir         return MakeListIdUnique( rDoc, aNewListId );
2939cdf0e10cSrcweir     }
2940cdf0e10cSrcweir }
2941cdf0e10cSrcweir // <--
2942