xref: /AOO41X/main/sw/source/core/edit/ednumber.cxx (revision 23d8f725f835233b771f2c90cead7f17182414a9)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 
27 
28 #include <hintids.hxx>
29 #include <editsh.hxx>
30 #include <edimp.hxx>
31 #include <doc.hxx>
32 #include <IDocumentUndoRedo.hxx>
33 #include <ndtxt.hxx>
34 #include <paratr.hxx>
35 #include <swundo.hxx>
36 #include <numrule.hxx>
37 
SV_IMPL_VARARR_SORT(_SwPamRanges,SwPamRange)38 SV_IMPL_VARARR_SORT( _SwPamRanges, SwPamRange )
39 
40 
41 SwPamRanges::SwPamRanges( const SwPaM& rRing )
42 {
43     const SwPaM* pTmp = &rRing;
44     do {
45         Insert( pTmp->GetMark()->nNode, pTmp->GetPoint()->nNode );
46     } while( &rRing != ( pTmp = (const SwPaM*)pTmp->GetNext() ));
47 }
48 
49 
Insert(const SwNodeIndex & rIdx1,const SwNodeIndex & rIdx2)50 void SwPamRanges::Insert( const SwNodeIndex& rIdx1, const SwNodeIndex& rIdx2 )
51 {
52     SwPamRange aRg( rIdx1.GetIndex(), rIdx2.GetIndex() );
53     if( aRg.nEnd < aRg.nStart )
54     {   aRg.nStart = aRg.nEnd; aRg.nEnd = rIdx1.GetIndex(); }
55 
56     sal_uInt16 nPos = 0;
57     const SwPamRange* pTmp;
58     if( Count() && Seek_Entry( aRg, &nPos ))        // suche Insert Position
59     {
60         // ist der im Array stehende kleiner ??
61         if( ( pTmp = GetData()+ nPos )->nEnd < aRg.nEnd )
62         {
63             aRg.nEnd = pTmp->nEnd;
64             Remove( nPos, 1 );      // zusammenfassen
65         }
66         else
67             return;     // ende, weil schon alle zusammengefasst waren
68     }
69 
70     sal_Bool bEnde;
71     do {
72         bEnde = sal_True;
73 
74         // mit dem Vorgaenger zusammenfassen ??
75         if( nPos > 0 )
76         {
77             if( ( pTmp = GetData()+( nPos-1 ))->nEnd == aRg.nStart
78                 || pTmp->nEnd+1 == aRg.nStart )
79             {
80                 aRg.nStart = pTmp->nStart;
81                 bEnde = sal_False;
82                 Remove( --nPos, 1 );        // zusammenfassen
83             }
84             // SSelection im Bereich ??
85             else if( pTmp->nStart <= aRg.nStart && aRg.nEnd <= pTmp->nEnd )
86                 return;
87         }
88             // mit dem Nachfolger zusammenfassen ??
89         if( nPos < Count() )
90         {
91             if( ( pTmp = GetData() + nPos )->nStart == aRg.nEnd ||
92                 pTmp->nStart == aRg.nEnd+1 )
93             {
94                 aRg.nEnd = pTmp->nEnd;
95                 bEnde = sal_False;
96                 Remove( nPos, 1 );      // zusammenfassen
97             }
98 
99             // SSelection im Bereich ??
100             else if( pTmp->nStart <= aRg.nStart && aRg.nEnd <= pTmp->nEnd )
101                 return;
102         }
103     } while( !bEnde );
104 
105     _SwPamRanges::Insert( aRg );
106 }
107 
108 
109 
SetPam(sal_uInt16 nArrPos,SwPaM & rPam)110 SwPaM& SwPamRanges::SetPam( sal_uInt16 nArrPos, SwPaM& rPam )
111 {
112     ASSERT_ID( nArrPos < Count(), ERR_VAR_IDX );
113     const SwPamRange& rTmp = *(GetData() + nArrPos );
114     rPam.GetPoint()->nNode = rTmp.nStart;
115     rPam.GetPoint()->nContent.Assign( rPam.GetCntntNode(), 0 );
116     rPam.SetMark();
117     rPam.GetPoint()->nNode = rTmp.nEnd;
118     rPam.GetPoint()->nContent.Assign( rPam.GetCntntNode(), 0 );
119     return rPam;
120 }
121 
122 
123 
124 // Numerierung Outline Regelwerk
125 
126 
SetOutlineNumRule(const SwNumRule & rRule)127 void SwEditShell::SetOutlineNumRule(const SwNumRule& rRule)
128 {
129     StartAllAction();       // Klammern fuers Updaten !!
130     GetDoc()->SetOutlineNumRule(rRule);
131     EndAllAction();
132 }
133 
134 
GetOutlineNumRule() const135 const SwNumRule* SwEditShell::GetOutlineNumRule() const
136 {
137     return GetDoc()->GetOutlineNumRule();
138 }
139 
140 // setzt, wenn noch keine Numerierung, sonst wird geaendert
141 // arbeitet mit alten und neuen Regeln, nur Differenzen aktualisieren
142 
143 // Absaetze ohne Numerierung, aber mit Einzuegen
144 
NoNum()145 sal_Bool SwEditShell::NoNum()
146 {
147     sal_Bool bRet = sal_True;
148     StartAllAction();
149 
150     SwPaM* pCrsr = GetCrsr();
151     if( pCrsr->GetNext() != pCrsr )         // Mehrfachselektion ?
152     {
153         GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
154         SwPamRanges aRangeArr( *pCrsr );
155         SwPaM aPam( *pCrsr->GetPoint() );
156         for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
157             bRet = bRet && GetDoc()->NoNum( aRangeArr.SetPam( n, aPam ));
158         GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
159     }
160     else
161         bRet = GetDoc()->NoNum( *pCrsr );
162 
163     EndAllAction();
164     return bRet;
165 }
166 // Loeschen, Splitten der Aufzaehlungsliste
SelectionHasNumber() const167 sal_Bool SwEditShell::SelectionHasNumber() const
168 {
169     sal_Bool bResult = HasNumber();
170     const SwTxtNode * pTxtNd =
171         GetCrsr()->GetPoint()->nNode.GetNode().GetTxtNode();
172     if (!bResult && pTxtNd && pTxtNd->Len()==0 && !pTxtNd->GetNumRule()) {
173         SwPamRanges aRangeArr( *GetCrsr() );
174         SwPaM aPam( *GetCrsr()->GetPoint() );
175         for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
176         {
177             aRangeArr.SetPam( n, aPam );
178             {
179                     sal_uInt32 nStt = aPam.GetPoint()->nNode.GetIndex(),
180                           nEnd = aPam.GetMark()->nNode.GetIndex();
181                     if( nStt > nEnd )
182                     {
183                         sal_uInt32 nTmp = nStt; nStt = nEnd; nEnd = nTmp;
184                     }
185                     for (sal_uInt32 nPos = nStt; nPos<=nEnd; nPos++) {
186                         SwTxtNode * pTxtNd = pDoc->GetNodes()[nPos]->GetTxtNode();
187                         if (pTxtNd && pTxtNd->Len()!=0)
188                         {
189                             bResult = pTxtNd->HasNumber();
190 
191                             // --> OD 2005-10-26 #b6340308#
192                             // special case: outline numbered, not counted paragraph
193                             if ( bResult &&
194                                 pTxtNd->GetNumRule() == GetDoc()->GetOutlineNumRule() &&
195                                 !pTxtNd->IsCountedInList() )
196                             {
197                                 bResult = sal_False;
198                             }
199                             if (bResult==sal_False) {
200                                 break;
201                             }
202                             // <--
203                         }
204                     }
205             }
206         }
207 
208     }
209 
210     return bResult;
211 }
212 //add a new function to determine number on/off status
SelectionHasBullet() const213 sal_Bool SwEditShell::SelectionHasBullet() const
214 {
215     sal_Bool bResult = HasBullet();
216     const SwTxtNode * pTxtNd =
217         GetCrsr()->GetPoint()->nNode.GetNode().GetTxtNode();
218     if (!bResult && pTxtNd && pTxtNd->Len()==0 && !pTxtNd->GetNumRule()) {
219         SwPamRanges aRangeArr( *GetCrsr() );
220         SwPaM aPam( *GetCrsr()->GetPoint() );
221         for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
222         {
223             aRangeArr.SetPam( n, aPam );
224             {
225                     sal_uInt32 nStt = aPam.GetPoint()->nNode.GetIndex(),
226                           nEnd = aPam.GetMark()->nNode.GetIndex();
227                     if( nStt > nEnd )
228                     {
229                         sal_uInt32 nTmp = nStt; nStt = nEnd; nEnd = nTmp;
230                     }
231                     for (sal_uInt32 nPos = nStt; nPos<=nEnd; nPos++) {
232                         SwTxtNode * pTxtNd = pDoc->GetNodes()[nPos]->GetTxtNode();
233                         if (pTxtNd && pTxtNd->Len()!=0)
234                         {
235                             bResult = pTxtNd->HasBullet();
236 
237                             if (bResult==sal_False) {
238                                 break;
239                             }
240                         }
241                     }
242             }
243         }
244 
245     }
246 
247     return bResult;
248 }
249 // -> #i29560#
HasNumber() const250 sal_Bool SwEditShell::HasNumber() const
251 {
252     sal_Bool bResult = sal_False;
253 
254     const SwTxtNode * pTxtNd =
255         GetCrsr()->GetPoint()->nNode.GetNode().GetTxtNode();
256 
257     if (pTxtNd)
258     {
259         bResult = pTxtNd->HasNumber();
260 
261         // --> OD 2005-10-26 #b6340308#
262         // special case: outline numbered, not counted paragraph
263         if ( bResult &&
264              pTxtNd->GetNumRule() == GetDoc()->GetOutlineNumRule() &&
265              !pTxtNd->IsCountedInList() )
266         {
267             bResult = sal_False;
268         }
269         // <--
270     }
271 
272     return bResult;
273 }
274 
HasBullet() const275 sal_Bool SwEditShell::HasBullet() const
276 {
277     sal_Bool bResult = sal_False;
278 
279     const SwTxtNode * pTxtNd =
280         GetCrsr()->GetPoint()->nNode.GetNode().GetTxtNode();
281 
282     if (pTxtNd)
283     {
284         bResult = pTxtNd->HasBullet();
285     }
286 
287     return bResult;
288 }
289 // <- #i29560#
290 
DelNumRules()291 void SwEditShell::DelNumRules()
292 {
293     StartAllAction();
294 
295     SwPaM* pCrsr = GetCrsr();
296     if( pCrsr->GetNext() != pCrsr )         // Mehrfachselektion ?
297     {
298         GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
299         SwPamRanges aRangeArr( *pCrsr );
300         SwPaM aPam( *pCrsr->GetPoint() );
301         for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
302         {
303             GetDoc()->DelNumRules( aRangeArr.SetPam( n, aPam ) );
304         }
305         GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
306     }
307     else
308         GetDoc()->DelNumRules( *pCrsr );
309 
310     // rufe das AttrChangeNotify auf der UI-Seite. Sollte eigentlich
311     // ueberfluessig sein, aber VB hatte darueber eine Bugrep.
312     CallChgLnk();
313 
314     // --> OD 2005-10-24 #126346# - cursor can not be anymore in
315     // front of a label, because numbering/bullet is deleted.
316     SetInFrontOfLabel( sal_False );
317     // <--
318 
319     GetDoc()->SetModified();
320     EndAllAction();
321 }
322 
323 // Hoch-/Runterstufen
324 
325 
NumUpDown(sal_Bool bDown)326 sal_Bool SwEditShell::NumUpDown( sal_Bool bDown )
327 {
328     StartAllAction();
329 
330     sal_Bool bRet = sal_True;
331     SwPaM* pCrsr = GetCrsr();
332     if( pCrsr->GetNext() == pCrsr )         // keine Mehrfachselektion ?
333         bRet = GetDoc()->NumUpDown( *pCrsr, bDown );
334     else
335     {
336         GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
337         SwPamRanges aRangeArr( *pCrsr );
338         SwPaM aPam( *pCrsr->GetPoint() );
339         for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
340             bRet = bRet && GetDoc()->NumUpDown( aRangeArr.SetPam( n, aPam ), bDown );
341         GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
342     }
343     GetDoc()->SetModified();
344 
345     // --> FME 2005-09-19 #i54693# Update marked numbering levels
346     if ( IsInFrontOfLabel() )
347         UpdateMarkedListLevel();
348     // <--
349 
350     CallChgLnk();
351 
352     EndAllAction();
353     return bRet;
354 }
355 // -> #i23726#
IsFirstOfNumRule() const356 sal_Bool SwEditShell::IsFirstOfNumRule() const
357 {
358     sal_Bool bResult = sal_False;
359 
360     SwPaM * pCrsr = GetCrsr();
361     if (pCrsr->GetNext() == pCrsr)
362     {
363         bResult = IsFirstOfNumRule(*pCrsr);
364     }
365 
366     return bResult;
367 }
368 
IsFirstOfNumRule(const SwPaM & rPaM) const369 sal_Bool SwEditShell::IsFirstOfNumRule(const SwPaM & rPaM) const
370 {
371     sal_Bool bResult = sal_False;
372 
373     SwPosition aPos(*rPaM.GetPoint());
374     bResult = GetDoc()->IsFirstOfNumRule(aPos);
375 
376     return bResult;
377 }
378 // <- #i23726#
379 
380 // -> #i23725#
381 // --> OD 2008-06-09 #i90078#
382 // Remove unused default parameter <nLevel> and <bRelative>.
383 // Adjust method name and parameter name
ChangeIndentOfAllListLevels(short nDiff)384 void SwEditShell::ChangeIndentOfAllListLevels( short nDiff )
385 {
386     StartAllAction();
387 
388     const SwNumRule *pCurNumRule = GetCurNumRule();
389     //#120911# check if numbering rule really exists
390     if (pCurNumRule)
391     {
392         SwNumRule aRule(*pCurNumRule);
393         // --> OD 2008-06-09 #i90078#
394         aRule.ChangeIndent( nDiff );
395         // <--
396 
397         // --> OD 2008-03-17 #refactorlists#
398         // no start of new list
399         SetCurNumRule( aRule, false );
400         // <--
401     }
402 
403     EndAllAction();
404 }
405 
406 // --> OD 2008-06-09 #i90078#
407 // Adjust method name
SetIndent(short nIndent,const SwPosition & rPos)408 void SwEditShell::SetIndent(short nIndent, const SwPosition & rPos)
409 // <--
410 {
411     StartAllAction();
412 
413     SwNumRule *pCurNumRule = GetDoc()->GetCurrNumRule(rPos);
414 
415     if (pCurNumRule)
416     {
417         SwPaM aPaM(rPos);
418         SwTxtNode * pTxtNode = aPaM.GetNode()->GetTxtNode();
419 
420         // --> OD 2008-06-09 #i90078#
421 //        int nLevel = -1;
422 //        int nReferenceLevel = pTxtNode->GetActualListLevel();
423 //        if (! IsFirstOfNumRule(aPaM))
424 //            nLevel = nReferenceLevel;
425 
426         SwNumRule aRule(*pCurNumRule);
427 //        aRule.ChangeIndent(nIndent, nLevel, nReferenceLevel, sal_False);
428         if ( IsFirstOfNumRule() )
429         {
430             aRule.SetIndentOfFirstListLevelAndChangeOthers( nIndent );
431         }
432         else if ( pTxtNode->GetActualListLevel() >= 0  )
433         {
434             aRule.SetIndent( nIndent,
435                              static_cast<sal_uInt16>(pTxtNode->GetActualListLevel()) );
436         }
437         // <--
438 
439         // --> OD 2005-02-18 #i42921# - 3rd parameter = false in order to
440         // suppress setting of num rule at <aPaM>.
441         // --> OD 2008-03-17 #refactorlists#
442         // do not apply any list
443         GetDoc()->SetNumRule( aPaM, aRule, false, String(), sal_False );
444         // <--
445     }
446 
447     EndAllAction();
448 }
449 // <- #i23725#
450 
MoveParagraph(long nOffset)451 sal_Bool SwEditShell::MoveParagraph( long nOffset )
452 {
453     StartAllAction();
454 
455     SwPaM *pCrsr = GetCrsr();
456     if( !pCrsr->HasMark() )
457     {
458         // sorge dafuer, das Bound1 und Bound2 im gleichen Node stehen
459         pCrsr->SetMark();
460         pCrsr->DeleteMark();
461     }
462 
463     sal_Bool bRet = GetDoc()->MoveParagraph( *pCrsr, nOffset );
464 
465     GetDoc()->SetModified();
466     EndAllAction();
467     return bRet;
468 }
469 
470 //#outline level add by zhaojianwei
GetCurrentParaOutlineLevel() const471 int SwEditShell::GetCurrentParaOutlineLevel( ) const
472 {
473     int nLevel = 0;
474 
475     SwPaM* pCrsr = GetCrsr();
476     const SwTxtNode* pTxtNd = pCrsr->GetNode()->GetTxtNode();
477     if( pTxtNd )
478         nLevel = pTxtNd->GetAttrOutlineLevel();
479     return nLevel;
480 }
481 //<-end,zhaojianwei
482 
GetCurrentOutlineLevels(sal_uInt8 & rUpper,sal_uInt8 & rLower)483 void SwEditShell::GetCurrentOutlineLevels( sal_uInt8& rUpper, sal_uInt8& rLower )
484 {
485     SwPaM* pCrsr = GetCrsr();
486     SwPaM aCrsr( *pCrsr->Start() );
487     aCrsr.SetMark();
488     if( pCrsr->HasMark() )
489         *aCrsr.GetPoint() = *pCrsr->End();
490     GetDoc()->GotoNextNum( *aCrsr.GetPoint(), sal_False,
491                             &rUpper, &rLower );
492 }
493 
MoveNumParas(sal_Bool bUpperLower,sal_Bool bUpperLeft)494 sal_Bool SwEditShell::MoveNumParas( sal_Bool bUpperLower, sal_Bool bUpperLeft )
495 {
496     StartAllAction();
497 
498     // auf alle Selektionen ??
499     SwPaM* pCrsr = GetCrsr();
500     SwPaM aCrsr( *pCrsr->Start() );
501     aCrsr.SetMark();
502 
503     if( pCrsr->HasMark() )
504         *aCrsr.GetPoint() = *pCrsr->End();
505 
506     sal_Bool bRet = sal_False;
507     sal_uInt8 nUpperLevel, nLowerLevel;
508     if( GetDoc()->GotoNextNum( *aCrsr.GetPoint(), sal_False,
509                                 &nUpperLevel, &nLowerLevel ))
510     {
511         if( bUpperLower )
512         {
513             // ueber die naechste Nummerierung
514             long nOffset = 0;
515             const SwNode* pNd;
516 
517             if( bUpperLeft )        // verschiebe nach oben
518             {
519                 SwPosition aPos( *aCrsr.GetMark() );
520                 if( GetDoc()->GotoPrevNum( aPos, sal_False ) )
521                     nOffset = aPos.nNode.GetIndex() -
522                             aCrsr.GetMark()->nNode.GetIndex();
523                 else
524                 {
525                     sal_uLong nStt = aPos.nNode.GetIndex(), nIdx = nStt - 1;
526                     while( nIdx && (
527                         ( pNd = GetDoc()->GetNodes()[ nIdx ])->IsSectionNode() ||
528                         ( pNd->IsEndNode() && pNd->StartOfSectionNode()->IsSectionNode())))
529                         --nIdx;
530                     if( GetDoc()->GetNodes()[ nIdx ]->IsTxtNode() )
531                         nOffset = nIdx - nStt;
532                 }
533             }
534             else                    // verschiebe nach unten
535             {
536                 const SwNumRule* pOrig = aCrsr.GetNode(sal_False)->GetTxtNode()->GetNumRule();
537                 if( aCrsr.GetNode()->IsTxtNode() &&
538                     pOrig == aCrsr.GetNode()->GetTxtNode()->GetNumRule() )
539                 {
540                     sal_uLong nStt = aCrsr.GetPoint()->nNode.GetIndex(), nIdx = nStt+1;
541 
542                     while (nIdx < GetDoc()->GetNodes().Count()-1)
543                     {
544                         pNd = GetDoc()->GetNodes()[ nIdx ];
545 
546                         if (pNd->IsSectionNode() ||
547                             ( pNd->IsEndNode() && pNd->StartOfSectionNode()->IsSectionNode()) ||
548                             ( pNd->IsTxtNode() && pOrig == ((SwTxtNode*)pNd)->GetNumRule() &&
549                               ((SwTxtNode*)pNd)->GetActualListLevel() > nUpperLevel ))
550                         {
551                             ++nIdx;
552                         }
553                         // --> OD 2005-11-14 #i57856#
554                         else
555                         {
556                             break;
557                         }
558                         // <--
559                     }
560 
561                     if( nStt == nIdx || !GetDoc()->GetNodes()[ nIdx ]->IsTxtNode() )
562                         nOffset = 1;
563                     else
564                         nOffset = nIdx - nStt;
565                 }
566                 else
567                     nOffset = 1;
568             }
569 
570             if( nOffset )
571             {
572                 aCrsr.Move( fnMoveBackward, fnGoNode );
573                 bRet = GetDoc()->MoveParagraph( aCrsr, nOffset );
574             }
575         }
576         else if( bUpperLeft ? nUpperLevel : nLowerLevel+1 < MAXLEVEL )
577         {
578             aCrsr.Move( fnMoveBackward, fnGoNode );
579             bRet = GetDoc()->NumUpDown( aCrsr, !bUpperLeft );
580         }
581     }
582 
583     GetDoc()->SetModified();
584     EndAllAction();
585     return bRet;
586 }
587 
OutlineUpDown(short nOffset)588 sal_Bool SwEditShell::OutlineUpDown( short nOffset )
589 {
590     StartAllAction();
591 
592     sal_Bool bRet = sal_True;
593     SwPaM* pCrsr = GetCrsr();
594     if( pCrsr->GetNext() == pCrsr )         // keine Mehrfachselektion ?
595         bRet = GetDoc()->OutlineUpDown( *pCrsr, nOffset );
596     else
597     {
598         GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
599         SwPamRanges aRangeArr( *pCrsr );
600         SwPaM aPam( *pCrsr->GetPoint() );
601         for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
602             bRet = bRet && GetDoc()->OutlineUpDown(
603                                     aRangeArr.SetPam( n, aPam ), nOffset );
604         GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
605     }
606     GetDoc()->SetModified();
607     EndAllAction();
608     return bRet;
609 }
610 
611 
MoveOutlinePara(short nOffset)612 sal_Bool SwEditShell::MoveOutlinePara( short nOffset )
613 {
614     StartAllAction();
615     sal_Bool bRet = GetDoc()->MoveOutlinePara( *GetCrsr(), nOffset );
616     EndAllAction();
617     return bRet;
618 }
619 
620 // Outlines and SubOutline are ReadOnly?
IsProtectedOutlinePara() const621 sal_Bool SwEditShell::IsProtectedOutlinePara() const
622 {
623     sal_Bool bRet = sal_False;
624     const SwNode& rNd = GetCrsr()->Start()->nNode.GetNode();
625     if( rNd.IsTxtNode() )
626     {
627         const SwOutlineNodes& rOutlNd = GetDoc()->GetNodes().GetOutLineNds();
628         SwNodePtr pNd = (SwNodePtr)&rNd;
629         sal_Bool bFirst = sal_True;
630         sal_uInt16 nPos;
631         int nLvl(0);
632         if( !rOutlNd.Seek_Entry( pNd, &nPos ) && nPos )
633             --nPos;
634 
635         for( ; nPos < rOutlNd.Count(); ++nPos )
636         {
637             SwNodePtr pTmpNd = rOutlNd[ nPos ];
638 
639             // --> OD 2008-04-02 #refactorlists#
640 //            sal_uInt8 nTmpLvl = GetRealLevel( pTmpNd->GetTxtNode()->
641 //                                    GetTxtColl()->GetOutlineLevel() );
642  //           int nTmpLvl = pTmpNd->GetTxtNode()->GetOutlineLevel();//#outline level,zhaojianwei
643             int nTmpLvl = pTmpNd->GetTxtNode()->GetAttrOutlineLevel();
644  //           ASSERT( nTmpLvl >= 0 && nTmpLvl < MAXLEVEL,
645             ASSERT( nTmpLvl >= 0 && nTmpLvl <= MAXLEVEL,            //<-end,zhaojianwei
646                     "<SwEditShell::IsProtectedOutlinePara()>" );
647             // <--
648             if( bFirst )
649             {
650                 nLvl = nTmpLvl;
651                 bFirst = sal_False;
652             }
653             else if( nLvl >= nTmpLvl )
654                 break;
655 
656             if( pTmpNd->IsProtect() )
657             {
658                 bRet = sal_True;
659                 break;
660             }
661         }
662     }
663 #ifdef DBG_UTIL
664     else
665     {
666         ASSERT(!this, "Cursor not on an outline node" );
667     }
668 #endif
669     return bRet;
670 }
671 
672 /** Test whether outline may be moved (bCopy == false)
673  *                           or copied (bCopy == true)
674  * Verify these conditions:
675  * 1) outline must be within main body (and not in redline)
676  * 2) outline must not be within table
677  * 3) if bCopy is set, outline must not be write protected
678  */
lcl_IsOutlineMoveAndCopyable(const SwDoc * pDoc,sal_uInt16 nIdx,bool bCopy)679 sal_Bool lcl_IsOutlineMoveAndCopyable( const SwDoc* pDoc, sal_uInt16 nIdx, bool bCopy )
680 {
681     const SwNodes& rNds = pDoc->GetNodes();
682     const SwNode* pNd = rNds.GetOutLineNds()[ nIdx ];
683     return pNd->GetIndex() >= rNds.GetEndOfExtras().GetIndex() &&   // 1) body
684             !pNd->FindTableNode() &&                                // 2) table
685             ( bCopy || !pNd->IsProtect() );                         // 3) write
686 }
687 
IsOutlineMovable(sal_uInt16 nIdx) const688 sal_Bool SwEditShell::IsOutlineMovable( sal_uInt16 nIdx ) const
689 {
690     return lcl_IsOutlineMoveAndCopyable( GetDoc(), nIdx, false );
691 }
692 
IsOutlineCopyable(sal_uInt16 nIdx) const693 sal_Bool SwEditShell::IsOutlineCopyable( sal_uInt16 nIdx ) const
694 {
695     return lcl_IsOutlineMoveAndCopyable( GetDoc(), nIdx, true );
696 }
697 
698 
NumOrNoNum(sal_Bool bNumOn,sal_Bool bChkStart)699 sal_Bool SwEditShell::NumOrNoNum(
700     sal_Bool bNumOn,
701     sal_Bool bChkStart )
702 {
703     sal_Bool bRet = sal_False;
704 
705     if ( !IsMultiSelection()
706          && !HasSelection()
707          && ( !bChkStart || IsSttPara() ) )
708     {
709         StartAllAction();
710         bRet = GetDoc()->NumOrNoNum( GetCrsr()->GetPoint()->nNode, !bNumOn );
711         EndAllAction();
712     }
713     return bRet;
714 }
715 
716 
IsNoNum(sal_Bool bChkStart) const717 sal_Bool SwEditShell::IsNoNum( sal_Bool bChkStart ) const
718 {
719     sal_Bool bResult = sal_False;
720 
721     if ( !IsMultiSelection()
722          && !HasSelection()
723          && ( !bChkStart || IsSttPara() ) )
724     {
725         const SwTxtNode* pTxtNd = GetCrsr()->GetNode()->GetTxtNode();
726         if ( pTxtNd != NULL )
727         {
728             bResult =  !pTxtNd->IsCountedInList();
729         }
730     }
731 
732     return bResult;
733 }
734 
GetNumLevel() const735 sal_uInt8 SwEditShell::GetNumLevel() const
736 {
737     // gebe die akt. Ebene zurueck, auf der sich der Point vom Cursor befindet
738     //sal_uInt8 nLevel = NO_NUMBERING;  //#outline level,zhaojianwei
739     sal_uInt8 nLevel = MAXLEVEL;        //end,zhaojianwei
740 
741     SwPaM* pCrsr = GetCrsr();
742     const SwTxtNode* pTxtNd = pCrsr->GetNode()->GetTxtNode();
743 
744     ASSERT( pTxtNd != NULL, "GetNumLevel() without text node" )
745     if ( pTxtNd == NULL )
746         return nLevel;
747 
748     const SwNumRule* pRule = pTxtNd->GetNumRule();
749     if ( pRule != NULL )
750     {
751         const int nListLevelOfTxtNode( pTxtNd->GetActualListLevel() );
752         if ( nListLevelOfTxtNode >= 0 )
753         {
754             nLevel = static_cast<sal_uInt8>( nListLevelOfTxtNode );
755         }
756     }
757 
758     return nLevel;
759 }
760 
GetCurNumRule() const761 const SwNumRule* SwEditShell::GetCurNumRule() const
762 {
763     return GetDoc()->GetCurrNumRule( *GetCrsr()->GetPoint() );
764 }
765 
766 // OD 2008-02-08 #newlistlevelattrs# - add handling of parameter <bResetIndentAttrs>
767 // --> OD 2008-03-17 #refactorlists#
SetCurNumRule(const SwNumRule & rRule,const bool bCreateNewList,const String sContinuedListId,const bool bResetIndentAttrs)768 void SwEditShell::SetCurNumRule( const SwNumRule& rRule,
769                                  const bool bCreateNewList,
770                                  const String sContinuedListId,
771                                  const bool bResetIndentAttrs )
772 {
773     StartAllAction();
774 
775     GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
776 
777     SwPaM* pCrsr = GetCrsr();
778     if( IsMultiSelection() )
779     {
780         SwPamRanges aRangeArr( *pCrsr );
781         SwPaM aPam( *pCrsr->GetPoint() );
782         for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
783         {
784             aRangeArr.SetPam( n, aPam );
785             GetDoc()->SetNumRule( aPam, rRule,
786                                   bCreateNewList, sContinuedListId,
787                                   sal_True, bResetIndentAttrs );
788             GetDoc()->SetCounted( aPam, true );
789         }
790     }
791     else
792     {
793         GetDoc()->SetNumRule( *pCrsr, rRule,
794                               bCreateNewList, sContinuedListId,
795                               sal_True, bResetIndentAttrs );
796         GetDoc()->SetCounted( *pCrsr, true );
797     }
798     GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
799 
800     EndAllAction();
801 }
802 
GetUniqueNumRuleName(const String * pChkStr,sal_Bool bAutoNum) const803 String SwEditShell::GetUniqueNumRuleName( const String* pChkStr, sal_Bool bAutoNum ) const
804 {
805     return GetDoc()->GetUniqueNumRuleName( pChkStr, bAutoNum );
806 }
807 
ChgNumRuleFmts(const SwNumRule & rRule)808 void SwEditShell::ChgNumRuleFmts( const SwNumRule& rRule )
809 {
810     StartAllAction();
811     GetDoc()->ChgNumRuleFmts( rRule );
812     EndAllAction();
813 }
814 
ReplaceNumRule(const String & rOldRule,const String & rNewRule)815 sal_Bool SwEditShell::ReplaceNumRule( const String& rOldRule, const String& rNewRule )
816 {
817     StartAllAction();
818     sal_Bool bRet = GetDoc()->ReplaceNumRule( *GetCrsr()->GetPoint(), rOldRule, rNewRule );
819     EndAllAction();
820     return bRet;
821 }
822 
SetNumRuleStart(sal_Bool bFlag)823 void SwEditShell::SetNumRuleStart( sal_Bool bFlag )
824 {
825     StartAllAction();
826 
827     SwPaM* pCrsr = GetCrsr();
828     if( pCrsr->GetNext() != pCrsr )         // Mehrfachselektion ?
829     {
830         GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
831         SwPamRanges aRangeArr( *pCrsr );
832         SwPaM aPam( *pCrsr->GetPoint() );
833         for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
834             GetDoc()->SetNumRuleStart( *aRangeArr.SetPam( n, aPam ).GetPoint(), bFlag );
835         GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
836     }
837     else
838         GetDoc()->SetNumRuleStart( *pCrsr->GetPoint(), bFlag );
839 
840     EndAllAction();
841 }
842 
IsNumRuleStart() const843 sal_Bool SwEditShell::IsNumRuleStart() const
844 {
845     sal_Bool bResult = sal_False;
846     const SwTxtNode* pTxtNd = GetCrsr()->GetNode()->GetTxtNode();
847     if( pTxtNd )
848         bResult = pTxtNd->IsListRestart() ? sal_True : sal_False;
849     return bResult;
850 }
851 
SetNodeNumStart(sal_uInt16 nStt)852 void SwEditShell::SetNodeNumStart( sal_uInt16 nStt )
853 {
854     StartAllAction();
855 
856     SwPaM* pCrsr = GetCrsr();
857     if( pCrsr->GetNext() != pCrsr )         // Mehrfachselektion ?
858     {
859         GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
860         SwPamRanges aRangeArr( *pCrsr );
861         SwPaM aPam( *pCrsr->GetPoint() );
862         for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
863             GetDoc()->SetNodeNumStart( *aRangeArr.SetPam( n, aPam ).GetPoint(), nStt );
864         GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
865     }
866     else
867         GetDoc()->SetNodeNumStart( *pCrsr->GetPoint(), nStt );
868 
869     EndAllAction();
870 }
871 
GetNodeNumStart() const872 sal_uInt16 SwEditShell::GetNodeNumStart() const
873 {
874     const SwTxtNode* pTxtNd = GetCrsr()->GetNode()->GetTxtNode();
875     // --> OD 2008-02-28 #refactorlists#
876     // correction: check, if list restart value is set at text node and
877     // use new method <SwTxtNode::GetAttrListRestartValue()>.
878     // return USHRT_MAX, if no list restart value is found.
879     if ( pTxtNd && pTxtNd->HasAttrListRestartValue() )
880     {
881         return static_cast<sal_uInt16>(pTxtNd->GetAttrListRestartValue());
882     }
883     return USHRT_MAX;
884     // <--
885 }
886 
887 /*-- 26.08.2005 14:47:17---------------------------------------------------
888 
889   -----------------------------------------------------------------------*/
890 // --> OD 2008-03-18 #refactorlists#
SearchNumRule(const bool bForward,const bool bNum,const bool bOutline,int nNonEmptyAllowed,String & sListId)891 const SwNumRule * SwEditShell::SearchNumRule( const bool bForward,
892                                               const bool bNum,
893                                               const bool bOutline,
894                                               int nNonEmptyAllowed,
895                                               String& sListId )
896 {
897     return GetDoc()->SearchNumRule( *(bForward ? GetCrsr()->End() : GetCrsr()->Start()),
898                                     bForward, bNum, bOutline, nNonEmptyAllowed,
899                                     sListId );
900 }
901 // <--
902