Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <hintids.hxx>
21 : #include <editsh.hxx>
22 : #include <edimp.hxx>
23 : #include <doc.hxx>
24 : #include <IDocumentUndoRedo.hxx>
25 : #include <ndtxt.hxx>
26 : #include <paratr.hxx>
27 : #include <swundo.hxx>
28 : #include <numrule.hxx>
29 :
30 :
31 0 : SwPamRanges::SwPamRanges( const SwPaM& rRing )
32 : {
33 0 : const SwPaM* pTmp = &rRing;
34 0 : do {
35 0 : Insert( pTmp->GetMark()->nNode, pTmp->GetPoint()->nNode );
36 0 : } while( &rRing != ( pTmp = (const SwPaM*)pTmp->GetNext() ));
37 0 : }
38 :
39 :
40 0 : void SwPamRanges::Insert( const SwNodeIndex& rIdx1, const SwNodeIndex& rIdx2 )
41 : {
42 0 : SwPamRange aRg( rIdx1.GetIndex(), rIdx2.GetIndex() );
43 0 : if( aRg.nEnd < aRg.nStart )
44 0 : { aRg.nStart = aRg.nEnd; aRg.nEnd = rIdx1.GetIndex(); }
45 :
46 0 : _SwPamRanges::const_iterator it = lower_bound(aRg); //search Insert Position
47 0 : sal_uInt16 nPos = it - begin();
48 0 : if (!empty() && (it != end()) && (*it) == aRg)
49 : {
50 : // is the one in the Array smaller?
51 0 : SwPamRange const& rTmp = _SwPamRanges::operator[](nPos);
52 0 : if( rTmp.nEnd < aRg.nEnd )
53 : {
54 0 : aRg.nEnd = rTmp.nEnd;
55 0 : erase(begin() + nPos); // combine
56 : }
57 : else
58 : return; // done, because by precondition everything is combined
59 : }
60 :
61 : bool bEnde;
62 0 : do {
63 0 : bEnde = true;
64 :
65 : // combine with predecessor?
66 0 : if( nPos > 0 )
67 : {
68 0 : SwPamRange const& rTmp = _SwPamRanges::operator[](nPos-1);
69 0 : if( rTmp.nEnd == aRg.nStart
70 : || rTmp.nEnd+1 == aRg.nStart )
71 : {
72 0 : aRg.nStart = rTmp.nStart;
73 0 : bEnde = false;
74 0 : erase( begin() + --nPos ); // combine
75 : }
76 : // range contained in rTmp?
77 0 : else if( rTmp.nStart <= aRg.nStart && aRg.nEnd <= rTmp.nEnd )
78 : return;
79 : }
80 : // combine with successor?
81 0 : if( nPos < size() )
82 : {
83 0 : SwPamRange const& rTmp = _SwPamRanges::operator[](nPos);
84 0 : if( rTmp.nStart == aRg.nEnd ||
85 : rTmp.nStart == aRg.nEnd+1 )
86 : {
87 0 : aRg.nEnd = rTmp.nEnd;
88 0 : bEnde = false;
89 0 : erase( begin() + nPos ); // combine
90 : }
91 :
92 : // range contained in rTmp?
93 0 : else if( rTmp.nStart <= aRg.nStart && aRg.nEnd <= rTmp.nEnd )
94 : return;
95 : }
96 0 : } while( !bEnde );
97 :
98 0 : _SwPamRanges::insert( aRg );
99 : }
100 :
101 :
102 :
103 0 : SwPaM& SwPamRanges::SetPam( sal_uInt16 nArrPos, SwPaM& rPam )
104 : {
105 : OSL_ASSERT( nArrPos < Count() );
106 0 : const SwPamRange& rTmp = (*this)[ nArrPos ];
107 0 : rPam.GetPoint()->nNode = rTmp.nStart;
108 0 : rPam.GetPoint()->nContent.Assign( rPam.GetCntntNode(), 0 );
109 0 : rPam.SetMark();
110 0 : rPam.GetPoint()->nNode = rTmp.nEnd;
111 0 : rPam.GetPoint()->nContent.Assign( rPam.GetCntntNode(), 0 );
112 0 : return rPam;
113 : }
114 :
115 :
116 :
117 : // Numerierung Outline Regelwerk
118 :
119 :
120 0 : void SwEditShell::SetOutlineNumRule(const SwNumRule& rRule)
121 : {
122 0 : StartAllAction(); // Klammern fuers Updaten !!
123 0 : GetDoc()->SetOutlineNumRule(rRule);
124 0 : EndAllAction();
125 0 : }
126 :
127 :
128 0 : const SwNumRule* SwEditShell::GetOutlineNumRule() const
129 : {
130 0 : return GetDoc()->GetOutlineNumRule();
131 : }
132 :
133 : // setzt, wenn noch keine Numerierung, sonst wird geaendert
134 : // arbeitet mit alten und neuen Regeln, nur Differenzen aktualisieren
135 :
136 : // Absaetze ohne Numerierung, aber mit Einzuegen
137 :
138 0 : bool SwEditShell::NoNum()
139 : {
140 0 : bool bRet = true;
141 0 : StartAllAction();
142 :
143 0 : SwPaM* pCrsr = GetCrsr();
144 0 : if( pCrsr->GetNext() != pCrsr ) // Mehrfachselektion ?
145 : {
146 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
147 0 : SwPamRanges aRangeArr( *pCrsr );
148 0 : SwPaM aPam( *pCrsr->GetPoint() );
149 0 : for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
150 0 : bRet = bRet && GetDoc()->NoNum( aRangeArr.SetPam( n, aPam ));
151 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
152 : }
153 : else
154 0 : bRet = GetDoc()->NoNum( *pCrsr );
155 :
156 0 : EndAllAction();
157 0 : return bRet;
158 : }
159 : // Loeschen, Splitten der Aufzaehlungsliste
160 :
161 : // -> #i29560#
162 0 : sal_Bool SwEditShell::HasNumber() const
163 : {
164 0 : sal_Bool bResult = sal_False;
165 :
166 : const SwTxtNode * pTxtNd =
167 0 : GetCrsr()->GetPoint()->nNode.GetNode().GetTxtNode();
168 :
169 0 : if (pTxtNd)
170 : {
171 0 : bResult = pTxtNd->HasNumber();
172 :
173 : // special case: outline numbered, not counted paragraph
174 0 : if ( bResult &&
175 0 : pTxtNd->GetNumRule() == GetDoc()->GetOutlineNumRule() &&
176 0 : !pTxtNd->IsCountedInList() )
177 : {
178 0 : bResult = sal_False;
179 : }
180 : }
181 :
182 0 : return bResult;
183 : }
184 :
185 0 : sal_Bool SwEditShell::HasBullet() const
186 : {
187 0 : sal_Bool bResult = sal_False;
188 :
189 : const SwTxtNode * pTxtNd =
190 0 : GetCrsr()->GetPoint()->nNode.GetNode().GetTxtNode();
191 :
192 0 : if (pTxtNd)
193 : {
194 0 : bResult = pTxtNd->HasBullet();
195 : }
196 :
197 0 : return bResult;
198 : }
199 : // <- #i29560#
200 :
201 0 : void SwEditShell::DelNumRules()
202 : {
203 0 : StartAllAction();
204 :
205 0 : SwPaM* pCrsr = GetCrsr();
206 0 : if( pCrsr->GetNext() != pCrsr ) // Mehrfachselektion ?
207 : {
208 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
209 0 : SwPamRanges aRangeArr( *pCrsr );
210 0 : SwPaM aPam( *pCrsr->GetPoint() );
211 0 : for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
212 : {
213 0 : GetDoc()->DelNumRules( aRangeArr.SetPam( n, aPam ) );
214 : }
215 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
216 : }
217 : else
218 0 : GetDoc()->DelNumRules( *pCrsr );
219 :
220 : // rufe das AttrChangeNotify auf der UI-Seite. Sollte eigentlich
221 : // ueberfluessig sein, aber VB hatte darueber eine Bugrep.
222 0 : CallChgLnk();
223 :
224 : // cursor can not be anymore in front of a label,
225 : // because numbering/bullet is deleted.
226 0 : SetInFrontOfLabel( false );
227 :
228 0 : GetDoc()->SetModified();
229 0 : EndAllAction();
230 0 : }
231 :
232 : // Hoch-/Runterstufen
233 :
234 :
235 0 : bool SwEditShell::NumUpDown( bool bDown )
236 : {
237 0 : StartAllAction();
238 :
239 0 : bool bRet = true;
240 0 : SwPaM* pCrsr = GetCrsr();
241 0 : if( pCrsr->GetNext() == pCrsr ) // keine Mehrfachselektion ?
242 0 : bRet = GetDoc()->NumUpDown( *pCrsr, bDown );
243 : else
244 : {
245 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
246 0 : SwPamRanges aRangeArr( *pCrsr );
247 0 : SwPaM aPam( *pCrsr->GetPoint() );
248 0 : for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
249 0 : bRet = bRet && GetDoc()->NumUpDown( aRangeArr.SetPam( n, aPam ), bDown );
250 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
251 : }
252 0 : GetDoc()->SetModified();
253 :
254 : // #i54693# Update marked numbering levels
255 0 : if ( IsInFrontOfLabel() )
256 0 : UpdateMarkedListLevel();
257 :
258 0 : CallChgLnk();
259 :
260 0 : EndAllAction();
261 0 : return bRet;
262 : }
263 : // -> #i23726#
264 0 : bool SwEditShell::IsFirstOfNumRule() const
265 : {
266 0 : bool bResult = false;
267 :
268 0 : SwPaM * pCrsr = GetCrsr();
269 0 : if (pCrsr->GetNext() == pCrsr)
270 : {
271 0 : bResult = IsFirstOfNumRule(*pCrsr);
272 : }
273 :
274 0 : return bResult;
275 : }
276 :
277 0 : bool SwEditShell::IsFirstOfNumRule(const SwPaM & rPaM) const
278 : {
279 0 : SwPosition aPos(*rPaM.GetPoint());
280 0 : return (GetDoc()->IsFirstOfNumRule(aPos));
281 : }
282 : // <- #i23726#
283 :
284 : // -> #i23725#
285 : // #i90078#
286 : // Remove unused default parameter <nLevel> and <bRelative>.
287 : // Adjust method name and parameter name
288 0 : void SwEditShell::ChangeIndentOfAllListLevels( short nDiff )
289 : {
290 0 : StartAllAction();
291 :
292 0 : const SwNumRule *pCurNumRule = GetCurNumRule();
293 : //#120911# check if numbering rule really exists
294 0 : if (pCurNumRule)
295 : {
296 0 : SwNumRule aRule(*pCurNumRule);
297 : // #i90078#
298 0 : aRule.ChangeIndent( nDiff );
299 :
300 : // no start of new list
301 0 : SetCurNumRule( aRule, false );
302 : }
303 :
304 0 : EndAllAction();
305 0 : }
306 :
307 : // #i90078#
308 : // Adjust method name
309 0 : void SwEditShell::SetIndent(short nIndent, const SwPosition & rPos)
310 : {
311 0 : StartAllAction();
312 :
313 0 : SwNumRule *pCurNumRule = GetDoc()->GetCurrNumRule(rPos);
314 :
315 0 : if (pCurNumRule)
316 : {
317 0 : SwPaM aPaM(rPos);
318 0 : SwTxtNode * pTxtNode = aPaM.GetNode()->GetTxtNode();
319 :
320 : // #i90078#
321 :
322 0 : SwNumRule aRule(*pCurNumRule);
323 :
324 0 : if ( IsFirstOfNumRule() )
325 : {
326 0 : aRule.SetIndentOfFirstListLevelAndChangeOthers( nIndent );
327 : }
328 0 : else if ( pTxtNode->GetActualListLevel() >= 0 )
329 : {
330 : aRule.SetIndent( nIndent,
331 0 : static_cast<sal_uInt16>(pTxtNode->GetActualListLevel()) );
332 : }
333 :
334 : // #i42921# - 3rd parameter = false in order to
335 : // suppress setting of num rule at <aPaM>.
336 : // do not apply any list
337 0 : GetDoc()->SetNumRule( aPaM, aRule, false, String(), sal_False );
338 : }
339 :
340 0 : EndAllAction();
341 0 : }
342 : // <- #i23725#
343 :
344 0 : bool SwEditShell::MoveParagraph( long nOffset )
345 : {
346 0 : StartAllAction();
347 :
348 0 : SwPaM *pCrsr = GetCrsr();
349 0 : if( !pCrsr->HasMark() )
350 : {
351 : // sorge dafuer, das Bound1 und Bound2 im gleichen Node stehen
352 0 : pCrsr->SetMark();
353 0 : pCrsr->DeleteMark();
354 : }
355 :
356 0 : bool bRet = GetDoc()->MoveParagraph( *pCrsr, nOffset );
357 :
358 0 : GetDoc()->SetModified();
359 0 : EndAllAction();
360 0 : return bRet;
361 : }
362 :
363 : //#outline level add by zhaojianwei
364 0 : int SwEditShell::GetCurrentParaOutlineLevel( ) const
365 : {
366 0 : int nLevel = 0;
367 :
368 0 : SwPaM* pCrsr = GetCrsr();
369 0 : const SwTxtNode* pTxtNd = pCrsr->GetNode()->GetTxtNode();
370 0 : if( pTxtNd )
371 0 : nLevel = pTxtNd->GetAttrOutlineLevel();
372 0 : return nLevel;
373 : }
374 : //<-end,zhaojianwei
375 :
376 0 : void SwEditShell::GetCurrentOutlineLevels( sal_uInt8& rUpper, sal_uInt8& rLower )
377 : {
378 0 : SwPaM* pCrsr = GetCrsr();
379 0 : SwPaM aCrsr( *pCrsr->Start() );
380 0 : aCrsr.SetMark();
381 0 : if( pCrsr->HasMark() )
382 0 : *aCrsr.GetPoint() = *pCrsr->End();
383 0 : GetDoc()->GotoNextNum( *aCrsr.GetPoint(), false,
384 0 : &rUpper, &rLower );
385 0 : }
386 :
387 0 : bool SwEditShell::MoveNumParas( bool bUpperLower, bool bUpperLeft )
388 : {
389 0 : StartAllAction();
390 :
391 : // auf alle Selektionen ??
392 0 : SwPaM* pCrsr = GetCrsr();
393 0 : SwPaM aCrsr( *pCrsr->Start() );
394 0 : aCrsr.SetMark();
395 :
396 0 : if( pCrsr->HasMark() )
397 0 : *aCrsr.GetPoint() = *pCrsr->End();
398 :
399 0 : sal_Bool bRet = sal_False;
400 : sal_uInt8 nUpperLevel, nLowerLevel;
401 0 : if( GetDoc()->GotoNextNum( *aCrsr.GetPoint(), false,
402 0 : &nUpperLevel, &nLowerLevel ))
403 : {
404 0 : if( bUpperLower )
405 : {
406 : // ueber die naechste Nummerierung
407 0 : long nOffset = 0;
408 : const SwNode* pNd;
409 :
410 0 : if( bUpperLeft ) // verschiebe nach oben
411 : {
412 0 : SwPosition aPos( *aCrsr.GetMark() );
413 0 : if( GetDoc()->GotoPrevNum( aPos, false ) )
414 0 : nOffset = aPos.nNode.GetIndex() -
415 0 : aCrsr.GetMark()->nNode.GetIndex();
416 : else
417 : {
418 0 : sal_uLong nStt = aPos.nNode.GetIndex(), nIdx = nStt - 1;
419 0 : while( nIdx && (
420 0 : ( pNd = GetDoc()->GetNodes()[ nIdx ])->IsSectionNode() ||
421 0 : ( pNd->IsEndNode() && pNd->StartOfSectionNode()->IsSectionNode())))
422 0 : --nIdx;
423 0 : if( GetDoc()->GetNodes()[ nIdx ]->IsTxtNode() )
424 0 : nOffset = nIdx - nStt;
425 0 : }
426 : }
427 : else // verschiebe nach unten
428 : {
429 0 : const SwNumRule* pOrig = aCrsr.GetNode(sal_False)->GetTxtNode()->GetNumRule();
430 0 : if( aCrsr.GetNode()->IsTxtNode() &&
431 0 : pOrig == aCrsr.GetNode()->GetTxtNode()->GetNumRule() )
432 : {
433 0 : sal_uLong nStt = aCrsr.GetPoint()->nNode.GetIndex(), nIdx = nStt+1;
434 :
435 0 : while (nIdx < GetDoc()->GetNodes().Count()-1)
436 : {
437 0 : pNd = GetDoc()->GetNodes()[ nIdx ];
438 :
439 0 : if (pNd->IsSectionNode() ||
440 0 : ( pNd->IsEndNode() && pNd->StartOfSectionNode()->IsSectionNode()) ||
441 0 : ( pNd->IsTxtNode() && pOrig == ((SwTxtNode*)pNd)->GetNumRule() &&
442 0 : ((SwTxtNode*)pNd)->GetActualListLevel() > nUpperLevel ))
443 : {
444 0 : ++nIdx;
445 : }
446 : // #i57856#
447 : else
448 : {
449 0 : break;
450 : }
451 : }
452 :
453 0 : if( nStt == nIdx || !GetDoc()->GetNodes()[ nIdx ]->IsTxtNode() )
454 0 : nOffset = 1;
455 : else
456 0 : nOffset = nIdx - nStt;
457 : }
458 : else
459 0 : nOffset = 1;
460 : }
461 :
462 0 : if( nOffset )
463 : {
464 0 : aCrsr.Move( fnMoveBackward, fnGoNode );
465 0 : bRet = GetDoc()->MoveParagraph( aCrsr, nOffset );
466 : }
467 : }
468 0 : else if( bUpperLeft ? nUpperLevel : nLowerLevel+1 < MAXLEVEL )
469 : {
470 0 : aCrsr.Move( fnMoveBackward, fnGoNode );
471 0 : bRet = GetDoc()->NumUpDown( aCrsr, !bUpperLeft );
472 : }
473 : }
474 :
475 0 : GetDoc()->SetModified();
476 0 : EndAllAction();
477 0 : return bRet;
478 : }
479 :
480 0 : bool SwEditShell::OutlineUpDown( short nOffset )
481 : {
482 0 : StartAllAction();
483 :
484 0 : bool bRet = true;
485 0 : SwPaM* pCrsr = GetCrsr();
486 0 : if( pCrsr->GetNext() == pCrsr ) // keine Mehrfachselektion ?
487 0 : bRet = GetDoc()->OutlineUpDown( *pCrsr, nOffset );
488 : else
489 : {
490 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
491 0 : SwPamRanges aRangeArr( *pCrsr );
492 0 : SwPaM aPam( *pCrsr->GetPoint() );
493 0 : for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
494 : bRet = bRet && GetDoc()->OutlineUpDown(
495 0 : aRangeArr.SetPam( n, aPam ), nOffset );
496 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
497 : }
498 0 : GetDoc()->SetModified();
499 0 : EndAllAction();
500 0 : return bRet;
501 : }
502 :
503 :
504 0 : bool SwEditShell::MoveOutlinePara( short nOffset )
505 : {
506 0 : StartAllAction();
507 0 : bool bRet = GetDoc()->MoveOutlinePara( *GetCrsr(), nOffset );
508 0 : EndAllAction();
509 0 : return bRet;
510 : }
511 :
512 : // Outlines and SubOutline are ReadOnly?
513 0 : sal_Bool SwEditShell::IsProtectedOutlinePara() const
514 : {
515 0 : sal_Bool bRet = sal_False;
516 0 : const SwNode& rNd = GetCrsr()->Start()->nNode.GetNode();
517 0 : if( rNd.IsTxtNode() )
518 : {
519 0 : const SwOutlineNodes& rOutlNd = GetDoc()->GetNodes().GetOutLineNds();
520 0 : SwNodePtr pNd = (SwNodePtr)&rNd;
521 0 : bool bFirst = true;
522 : sal_uInt16 nPos;
523 0 : int nLvl(0);
524 0 : if( !rOutlNd.Seek_Entry( pNd, &nPos ) && nPos )
525 0 : --nPos;
526 :
527 0 : for( ; nPos < rOutlNd.size(); ++nPos )
528 : {
529 0 : SwNodePtr pTmpNd = rOutlNd[ nPos ];
530 :
531 0 : int nTmpLvl = pTmpNd->GetTxtNode()->GetAttrOutlineLevel();
532 :
533 : OSL_ENSURE( nTmpLvl >= 0 && nTmpLvl <= MAXLEVEL,
534 : "<SwEditShell::IsProtectedOutlinePara()>" );
535 :
536 0 : if( bFirst )
537 : {
538 0 : nLvl = nTmpLvl;
539 0 : bFirst = false;
540 : }
541 0 : else if( nLvl >= nTmpLvl )
542 0 : break;
543 :
544 0 : if( pTmpNd->IsProtect() )
545 : {
546 0 : bRet = sal_True;
547 0 : break;
548 : }
549 : }
550 : }
551 : #if OSL_DEBUG_LEVEL > 0
552 : else
553 : {
554 : OSL_FAIL("Cursor not on an outline node");
555 : }
556 : #endif
557 0 : return bRet;
558 : }
559 :
560 : /** Test whether outline may be moved (bCopy == false)
561 : * or copied (bCopy == true)
562 : * Verify these conditions:
563 : * 1) outline must be within main body (and not in redline)
564 : * 2) outline must not be within table
565 : * 3) if bCopy is set, outline must not be write protected
566 : */
567 0 : static sal_Bool lcl_IsOutlineMoveAndCopyable( const SwDoc* pDoc, sal_uInt16 nIdx, bool bCopy )
568 : {
569 0 : const SwNodes& rNds = pDoc->GetNodes();
570 0 : const SwNode* pNd = rNds.GetOutLineNds()[ nIdx ];
571 0 : return pNd->GetIndex() >= rNds.GetEndOfExtras().GetIndex() && // 1) body
572 0 : !pNd->FindTableNode() && // 2) table
573 0 : ( bCopy || !pNd->IsProtect() ); // 3) write
574 : }
575 :
576 0 : sal_Bool SwEditShell::IsOutlineMovable( sal_uInt16 nIdx ) const
577 : {
578 0 : return lcl_IsOutlineMoveAndCopyable( GetDoc(), nIdx, false );
579 : }
580 :
581 0 : sal_Bool SwEditShell::IsOutlineCopyable( sal_uInt16 nIdx ) const
582 : {
583 0 : return lcl_IsOutlineMoveAndCopyable( GetDoc(), nIdx, true );
584 : }
585 :
586 :
587 0 : bool SwEditShell::NumOrNoNum( sal_Bool bNumOn, bool bChkStart )
588 : {
589 0 : bool bRet = false;
590 0 : SwPaM* pCrsr = GetCrsr();
591 0 : if( pCrsr->GetNext() == pCrsr && !pCrsr->HasMark() &&
592 0 : ( !bChkStart || !pCrsr->GetPoint()->nContent.GetIndex()) )
593 : {
594 0 : StartAllAction(); // Klammern fuers Updaten !!
595 0 : bRet = GetDoc()->NumOrNoNum( pCrsr->GetPoint()->nNode, !bNumOn ); // #i29560#
596 0 : EndAllAction();
597 : }
598 0 : return bRet;
599 : }
600 :
601 0 : sal_Bool SwEditShell::IsNoNum( sal_Bool bChkStart ) const
602 : {
603 : // ein Backspace im Absatz ohne Nummer wird zum Delete
604 0 : sal_Bool bResult = sal_False;
605 0 : SwPaM* pCrsr = GetCrsr();
606 :
607 0 : if (pCrsr->GetNext() == pCrsr && !pCrsr->HasMark() &&
608 0 : (!bChkStart || !pCrsr->GetPoint()->nContent.GetIndex()))
609 : {
610 0 : const SwTxtNode* pTxtNd = pCrsr->GetNode()->GetTxtNode();
611 :
612 0 : if (pTxtNd)
613 : {
614 0 : bResult = ! pTxtNd->IsCountedInList();
615 : }
616 : }
617 :
618 0 : return bResult;
619 : }
620 :
621 0 : sal_uInt8 SwEditShell::GetNumLevel() const
622 : {
623 : // gebe die akt. Ebene zurueck, auf der sich der Point vom Cursor befindet
624 0 : sal_uInt8 nLevel = MAXLEVEL; //end,zhaojianwei
625 :
626 0 : SwPaM* pCrsr = GetCrsr();
627 0 : const SwTxtNode* pTxtNd = pCrsr->GetNode()->GetTxtNode();
628 :
629 : OSL_ENSURE( pTxtNd, "GetNumLevel() without text node" );
630 0 : if ( !pTxtNd )
631 0 : return nLevel;
632 :
633 0 : const SwNumRule* pRule = pTxtNd->GetNumRule();
634 0 : if(pRule)
635 : {
636 0 : const int nListLevelOfTxtNode( pTxtNd->GetActualListLevel() );
637 0 : if ( nListLevelOfTxtNode >= 0 )
638 : {
639 0 : nLevel = static_cast<sal_uInt8>( nListLevelOfTxtNode );
640 : }
641 : }
642 :
643 0 : return nLevel;
644 : }
645 :
646 662 : const SwNumRule* SwEditShell::GetCurNumRule() const
647 : {
648 662 : return GetDoc()->GetCurrNumRule( *GetCrsr()->GetPoint() );
649 : }
650 :
651 0 : void SwEditShell::SetCurNumRule( const SwNumRule& rRule,
652 : const bool bCreateNewList,
653 : const String sContinuedListId,
654 : const bool bResetIndentAttrs )
655 : {
656 0 : StartAllAction();
657 :
658 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
659 :
660 0 : SwPaM* pCrsr = GetCrsr();
661 0 : if( pCrsr->GetNext() != pCrsr ) // Mehrfachselektion ?
662 : {
663 0 : SwPamRanges aRangeArr( *pCrsr );
664 0 : SwPaM aPam( *pCrsr->GetPoint() );
665 0 : for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
666 : {
667 0 : aRangeArr.SetPam( n, aPam );
668 : GetDoc()->SetNumRule( aPam, rRule,
669 : bCreateNewList, sContinuedListId,
670 0 : true, bResetIndentAttrs );
671 0 : GetDoc()->SetCounted( aPam, true );
672 0 : }
673 : }
674 : else
675 : {
676 : GetDoc()->SetNumRule( *pCrsr, rRule,
677 : bCreateNewList, sContinuedListId,
678 0 : true, bResetIndentAttrs );
679 0 : GetDoc()->SetCounted( *pCrsr, true );
680 : }
681 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
682 :
683 0 : EndAllAction();
684 0 : }
685 :
686 0 : String SwEditShell::GetUniqueNumRuleName( const String* pChkStr, bool bAutoNum ) const
687 : {
688 0 : return GetDoc()->GetUniqueNumRuleName( pChkStr, bAutoNum );
689 : }
690 :
691 0 : void SwEditShell::ChgNumRuleFmts( const SwNumRule& rRule )
692 : {
693 0 : StartAllAction();
694 0 : GetDoc()->ChgNumRuleFmts( rRule );
695 0 : EndAllAction();
696 0 : }
697 :
698 0 : bool SwEditShell::ReplaceNumRule( const String& rOldRule, const String& rNewRule )
699 : {
700 0 : StartAllAction();
701 0 : bool bRet = GetDoc()->ReplaceNumRule( *GetCrsr()->GetPoint(), rOldRule, rNewRule );
702 0 : EndAllAction();
703 0 : return bRet;
704 : }
705 :
706 0 : void SwEditShell::SetNumRuleStart( sal_Bool bFlag, SwPaM* pPaM )
707 : {
708 0 : StartAllAction();
709 0 : SwPaM* pCrsr = pPaM ? pPaM : GetCrsr();
710 0 : if( pCrsr->GetNext() != pCrsr ) // Mehrfachselektion ?
711 : {
712 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
713 0 : SwPamRanges aRangeArr( *pCrsr );
714 0 : SwPaM aPam( *pCrsr->GetPoint() );
715 0 : for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
716 0 : GetDoc()->SetNumRuleStart( *aRangeArr.SetPam( n, aPam ).GetPoint(), bFlag );
717 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
718 : }
719 : else
720 0 : GetDoc()->SetNumRuleStart( *pCrsr->GetPoint(), bFlag );
721 :
722 0 : EndAllAction();
723 0 : }
724 :
725 0 : sal_Bool SwEditShell::IsNumRuleStart( SwPaM* pPaM ) const
726 : {
727 0 : sal_Bool bResult = sal_False;
728 0 : SwPaM* pCrsr = pPaM ? pPaM : GetCrsr( );
729 0 : const SwTxtNode* pTxtNd = pCrsr->GetNode()->GetTxtNode();
730 0 : if( pTxtNd )
731 0 : bResult = pTxtNd->IsListRestart() ? sal_True : sal_False;
732 0 : return bResult;
733 : }
734 :
735 0 : void SwEditShell::SetNodeNumStart( sal_uInt16 nStt, SwPaM* pPaM )
736 : {
737 0 : StartAllAction();
738 :
739 0 : SwPaM* pCrsr = pPaM ? pPaM : GetCrsr();
740 0 : if( pCrsr->GetNext() != pCrsr ) // Mehrfachselektion ?
741 : {
742 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
743 0 : SwPamRanges aRangeArr( *pCrsr );
744 0 : SwPaM aPam( *pCrsr->GetPoint() );
745 0 : for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
746 0 : GetDoc()->SetNodeNumStart( *aRangeArr.SetPam( n, aPam ).GetPoint(), nStt );
747 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
748 : }
749 : else
750 0 : GetDoc()->SetNodeNumStart( *pCrsr->GetPoint(), nStt );
751 :
752 0 : EndAllAction();
753 0 : }
754 :
755 0 : sal_uInt16 SwEditShell::GetNodeNumStart( SwPaM* pPaM ) const
756 : {
757 0 : SwPaM* pCrsr = pPaM ? pPaM : GetCrsr();
758 0 : const SwTxtNode* pTxtNd = pCrsr->GetNode()->GetTxtNode();
759 : // correction: check, if list restart value is set at text node and
760 : // use new method <SwTxtNode::GetAttrListRestartValue()>.
761 : // return USHRT_MAX, if no list restart value is found.
762 0 : if ( pTxtNd && pTxtNd->HasAttrListRestartValue() )
763 : {
764 0 : return static_cast<sal_uInt16>(pTxtNd->GetAttrListRestartValue());
765 : }
766 0 : return USHRT_MAX;
767 : }
768 :
769 0 : const SwNumRule * SwEditShell::SearchNumRule( const bool bForward,
770 : const bool bNum,
771 : const bool bOutline,
772 : int nNonEmptyAllowed,
773 : String& sListId )
774 : {
775 0 : return GetDoc()->SearchNumRule( *(bForward ? GetCrsr()->End() : GetCrsr()->Start()),
776 : bForward, bNum, bOutline, nNonEmptyAllowed,
777 0 : sListId );
778 : }
779 :
780 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|