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 : bool bResult = false;
280 :
281 0 : SwPosition aPos(*rPaM.GetPoint());
282 0 : bResult = GetDoc()->IsFirstOfNumRule(aPos);
283 :
284 0 : return bResult;
285 : }
286 : // <- #i23726#
287 :
288 : // -> #i23725#
289 : // #i90078#
290 : // Remove unused default parameter <nLevel> and <bRelative>.
291 : // Adjust method name and parameter name
292 0 : void SwEditShell::ChangeIndentOfAllListLevels( short nDiff )
293 : {
294 0 : StartAllAction();
295 :
296 0 : const SwNumRule *pCurNumRule = GetCurNumRule();
297 : //#120911# check if numbering rule really exists
298 0 : if (pCurNumRule)
299 : {
300 0 : SwNumRule aRule(*pCurNumRule);
301 : // #i90078#
302 0 : aRule.ChangeIndent( nDiff );
303 :
304 : // no start of new list
305 0 : SetCurNumRule( aRule, false );
306 : }
307 :
308 0 : EndAllAction();
309 0 : }
310 :
311 : // #i90078#
312 : // Adjust method name
313 0 : void SwEditShell::SetIndent(short nIndent, const SwPosition & rPos)
314 : {
315 0 : StartAllAction();
316 :
317 0 : SwNumRule *pCurNumRule = GetDoc()->GetCurrNumRule(rPos);
318 :
319 0 : if (pCurNumRule)
320 : {
321 0 : SwPaM aPaM(rPos);
322 0 : SwTxtNode * pTxtNode = aPaM.GetNode()->GetTxtNode();
323 :
324 : // #i90078#
325 :
326 0 : SwNumRule aRule(*pCurNumRule);
327 :
328 0 : if ( IsFirstOfNumRule() )
329 : {
330 0 : aRule.SetIndentOfFirstListLevelAndChangeOthers( nIndent );
331 : }
332 0 : else if ( pTxtNode->GetActualListLevel() >= 0 )
333 : {
334 : aRule.SetIndent( nIndent,
335 0 : static_cast<sal_uInt16>(pTxtNode->GetActualListLevel()) );
336 : }
337 :
338 : // #i42921# - 3rd parameter = false in order to
339 : // suppress setting of num rule at <aPaM>.
340 : // do not apply any list
341 0 : GetDoc()->SetNumRule( aPaM, aRule, false, String(), sal_False );
342 : }
343 :
344 0 : EndAllAction();
345 0 : }
346 : // <- #i23725#
347 :
348 0 : bool SwEditShell::MoveParagraph( long nOffset )
349 : {
350 0 : StartAllAction();
351 :
352 0 : SwPaM *pCrsr = GetCrsr();
353 0 : if( !pCrsr->HasMark() )
354 : {
355 : // sorge dafuer, das Bound1 und Bound2 im gleichen Node stehen
356 0 : pCrsr->SetMark();
357 0 : pCrsr->DeleteMark();
358 : }
359 :
360 0 : bool bRet = GetDoc()->MoveParagraph( *pCrsr, nOffset );
361 :
362 0 : GetDoc()->SetModified();
363 0 : EndAllAction();
364 0 : return bRet;
365 : }
366 :
367 : //#outline level add by zhaojianwei
368 5 : int SwEditShell::GetCurrentParaOutlineLevel( ) const
369 : {
370 5 : int nLevel = 0;
371 :
372 5 : SwPaM* pCrsr = GetCrsr();
373 5 : const SwTxtNode* pTxtNd = pCrsr->GetNode()->GetTxtNode();
374 5 : if( pTxtNd )
375 5 : nLevel = pTxtNd->GetAttrOutlineLevel();
376 5 : return nLevel;
377 : }
378 : //<-end,zhaojianwei
379 :
380 0 : void SwEditShell::GetCurrentOutlineLevels( sal_uInt8& rUpper, sal_uInt8& rLower )
381 : {
382 0 : SwPaM* pCrsr = GetCrsr();
383 0 : SwPaM aCrsr( *pCrsr->Start() );
384 0 : aCrsr.SetMark();
385 0 : if( pCrsr->HasMark() )
386 0 : *aCrsr.GetPoint() = *pCrsr->End();
387 0 : GetDoc()->GotoNextNum( *aCrsr.GetPoint(), false,
388 0 : &rUpper, &rLower );
389 0 : }
390 :
391 0 : bool SwEditShell::MoveNumParas( bool bUpperLower, bool bUpperLeft )
392 : {
393 0 : StartAllAction();
394 :
395 : // auf alle Selektionen ??
396 0 : SwPaM* pCrsr = GetCrsr();
397 0 : SwPaM aCrsr( *pCrsr->Start() );
398 0 : aCrsr.SetMark();
399 :
400 0 : if( pCrsr->HasMark() )
401 0 : *aCrsr.GetPoint() = *pCrsr->End();
402 :
403 0 : sal_Bool bRet = sal_False;
404 : sal_uInt8 nUpperLevel, nLowerLevel;
405 0 : if( GetDoc()->GotoNextNum( *aCrsr.GetPoint(), false,
406 0 : &nUpperLevel, &nLowerLevel ))
407 : {
408 0 : if( bUpperLower )
409 : {
410 : // ueber die naechste Nummerierung
411 0 : long nOffset = 0;
412 : const SwNode* pNd;
413 :
414 0 : if( bUpperLeft ) // verschiebe nach oben
415 : {
416 0 : SwPosition aPos( *aCrsr.GetMark() );
417 0 : if( GetDoc()->GotoPrevNum( aPos, false ) )
418 0 : nOffset = aPos.nNode.GetIndex() -
419 0 : aCrsr.GetMark()->nNode.GetIndex();
420 : else
421 : {
422 0 : sal_uLong nStt = aPos.nNode.GetIndex(), nIdx = nStt - 1;
423 0 : while( nIdx && (
424 0 : ( pNd = GetDoc()->GetNodes()[ nIdx ])->IsSectionNode() ||
425 0 : ( pNd->IsEndNode() && pNd->StartOfSectionNode()->IsSectionNode())))
426 0 : --nIdx;
427 0 : if( GetDoc()->GetNodes()[ nIdx ]->IsTxtNode() )
428 0 : nOffset = nIdx - nStt;
429 0 : }
430 : }
431 : else // verschiebe nach unten
432 : {
433 0 : const SwNumRule* pOrig = aCrsr.GetNode(sal_False)->GetTxtNode()->GetNumRule();
434 0 : if( aCrsr.GetNode()->IsTxtNode() &&
435 0 : pOrig == aCrsr.GetNode()->GetTxtNode()->GetNumRule() )
436 : {
437 0 : sal_uLong nStt = aCrsr.GetPoint()->nNode.GetIndex(), nIdx = nStt+1;
438 :
439 0 : while (nIdx < GetDoc()->GetNodes().Count()-1)
440 : {
441 0 : pNd = GetDoc()->GetNodes()[ nIdx ];
442 :
443 0 : if (pNd->IsSectionNode() ||
444 0 : ( pNd->IsEndNode() && pNd->StartOfSectionNode()->IsSectionNode()) ||
445 0 : ( pNd->IsTxtNode() && pOrig == ((SwTxtNode*)pNd)->GetNumRule() &&
446 0 : ((SwTxtNode*)pNd)->GetActualListLevel() > nUpperLevel ))
447 : {
448 0 : ++nIdx;
449 : }
450 : // #i57856#
451 : else
452 : {
453 0 : break;
454 : }
455 : }
456 :
457 0 : if( nStt == nIdx || !GetDoc()->GetNodes()[ nIdx ]->IsTxtNode() )
458 0 : nOffset = 1;
459 : else
460 0 : nOffset = nIdx - nStt;
461 : }
462 : else
463 0 : nOffset = 1;
464 : }
465 :
466 0 : if( nOffset )
467 : {
468 0 : aCrsr.Move( fnMoveBackward, fnGoNode );
469 0 : bRet = GetDoc()->MoveParagraph( aCrsr, nOffset );
470 : }
471 : }
472 0 : else if( bUpperLeft ? nUpperLevel : nLowerLevel+1 < MAXLEVEL )
473 : {
474 0 : aCrsr.Move( fnMoveBackward, fnGoNode );
475 0 : bRet = GetDoc()->NumUpDown( aCrsr, !bUpperLeft );
476 : }
477 : }
478 :
479 0 : GetDoc()->SetModified();
480 0 : EndAllAction();
481 0 : return bRet;
482 : }
483 :
484 0 : bool SwEditShell::OutlineUpDown( short nOffset )
485 : {
486 0 : StartAllAction();
487 :
488 0 : bool bRet = true;
489 0 : SwPaM* pCrsr = GetCrsr();
490 0 : if( pCrsr->GetNext() == pCrsr ) // keine Mehrfachselektion ?
491 0 : bRet = GetDoc()->OutlineUpDown( *pCrsr, nOffset );
492 : else
493 : {
494 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
495 0 : SwPamRanges aRangeArr( *pCrsr );
496 0 : SwPaM aPam( *pCrsr->GetPoint() );
497 0 : for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
498 : bRet = bRet && GetDoc()->OutlineUpDown(
499 0 : aRangeArr.SetPam( n, aPam ), nOffset );
500 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
501 : }
502 0 : GetDoc()->SetModified();
503 0 : EndAllAction();
504 0 : return bRet;
505 : }
506 :
507 :
508 0 : bool SwEditShell::MoveOutlinePara( short nOffset )
509 : {
510 0 : StartAllAction();
511 0 : bool bRet = GetDoc()->MoveOutlinePara( *GetCrsr(), nOffset );
512 0 : EndAllAction();
513 0 : return bRet;
514 : }
515 :
516 : // Outlines and SubOutline are ReadOnly?
517 0 : sal_Bool SwEditShell::IsProtectedOutlinePara() const
518 : {
519 0 : sal_Bool bRet = sal_False;
520 0 : const SwNode& rNd = GetCrsr()->Start()->nNode.GetNode();
521 0 : if( rNd.IsTxtNode() )
522 : {
523 0 : const SwOutlineNodes& rOutlNd = GetDoc()->GetNodes().GetOutLineNds();
524 0 : SwNodePtr pNd = (SwNodePtr)&rNd;
525 0 : bool bFirst = true;
526 : sal_uInt16 nPos;
527 0 : int nLvl(0);
528 0 : if( !rOutlNd.Seek_Entry( pNd, &nPos ) && nPos )
529 0 : --nPos;
530 :
531 0 : for( ; nPos < rOutlNd.size(); ++nPos )
532 : {
533 0 : SwNodePtr pTmpNd = rOutlNd[ nPos ];
534 :
535 0 : int nTmpLvl = pTmpNd->GetTxtNode()->GetAttrOutlineLevel();
536 :
537 : OSL_ENSURE( nTmpLvl >= 0 && nTmpLvl <= MAXLEVEL,
538 : "<SwEditShell::IsProtectedOutlinePara()>" );
539 :
540 0 : if( bFirst )
541 : {
542 0 : nLvl = nTmpLvl;
543 0 : bFirst = false;
544 : }
545 0 : else if( nLvl >= nTmpLvl )
546 0 : break;
547 :
548 0 : if( pTmpNd->IsProtect() )
549 : {
550 0 : bRet = sal_True;
551 0 : break;
552 : }
553 : }
554 : }
555 : #if OSL_DEBUG_LEVEL > 0
556 : else
557 : {
558 : OSL_FAIL("Cursor not on an outline node");
559 : }
560 : #endif
561 0 : return bRet;
562 : }
563 :
564 : /** Test whether outline may be moved (bCopy == false)
565 : * or copied (bCopy == true)
566 : * Verify these conditions:
567 : * 1) outline must be within main body (and not in redline)
568 : * 2) outline must not be within table
569 : * 3) if bCopy is set, outline must not be write protected
570 : */
571 0 : static sal_Bool lcl_IsOutlineMoveAndCopyable( const SwDoc* pDoc, sal_uInt16 nIdx, bool bCopy )
572 : {
573 0 : const SwNodes& rNds = pDoc->GetNodes();
574 0 : const SwNode* pNd = rNds.GetOutLineNds()[ nIdx ];
575 0 : return pNd->GetIndex() >= rNds.GetEndOfExtras().GetIndex() && // 1) body
576 0 : !pNd->FindTableNode() && // 2) table
577 0 : ( bCopy || !pNd->IsProtect() ); // 3) write
578 : }
579 :
580 0 : sal_Bool SwEditShell::IsOutlineMovable( sal_uInt16 nIdx ) const
581 : {
582 0 : return lcl_IsOutlineMoveAndCopyable( GetDoc(), nIdx, false );
583 : }
584 :
585 0 : sal_Bool SwEditShell::IsOutlineCopyable( sal_uInt16 nIdx ) const
586 : {
587 0 : return lcl_IsOutlineMoveAndCopyable( GetDoc(), nIdx, true );
588 : }
589 :
590 :
591 0 : bool SwEditShell::NumOrNoNum( sal_Bool bNumOn, bool bChkStart )
592 : {
593 0 : bool bRet = false;
594 0 : SwPaM* pCrsr = GetCrsr();
595 0 : if( pCrsr->GetNext() == pCrsr && !pCrsr->HasMark() &&
596 0 : ( !bChkStart || !pCrsr->GetPoint()->nContent.GetIndex()) )
597 : {
598 0 : StartAllAction(); // Klammern fuers Updaten !!
599 0 : bRet = GetDoc()->NumOrNoNum( pCrsr->GetPoint()->nNode, !bNumOn ); // #i29560#
600 0 : EndAllAction();
601 : }
602 0 : return bRet;
603 : }
604 :
605 0 : sal_Bool SwEditShell::IsNoNum( sal_Bool bChkStart ) const
606 : {
607 : // ein Backspace im Absatz ohne Nummer wird zum Delete
608 0 : sal_Bool bResult = sal_False;
609 0 : SwPaM* pCrsr = GetCrsr();
610 :
611 0 : if (pCrsr->GetNext() == pCrsr && !pCrsr->HasMark() &&
612 0 : (!bChkStart || !pCrsr->GetPoint()->nContent.GetIndex()))
613 : {
614 0 : const SwTxtNode* pTxtNd = pCrsr->GetNode()->GetTxtNode();
615 :
616 0 : if (pTxtNd)
617 : {
618 0 : bResult = ! pTxtNd->IsCountedInList();
619 : }
620 : }
621 :
622 0 : return bResult;
623 : }
624 :
625 0 : sal_uInt8 SwEditShell::GetNumLevel() const
626 : {
627 : // gebe die akt. Ebene zurueck, auf der sich der Point vom Cursor befindet
628 0 : sal_uInt8 nLevel = MAXLEVEL; //end,zhaojianwei
629 :
630 0 : SwPaM* pCrsr = GetCrsr();
631 0 : const SwTxtNode* pTxtNd = pCrsr->GetNode()->GetTxtNode();
632 :
633 : OSL_ENSURE( pTxtNd, "GetNumLevel() without text node" );
634 0 : if ( !pTxtNd )
635 0 : return nLevel;
636 :
637 0 : const SwNumRule* pRule = pTxtNd->GetNumRule();
638 0 : if(pRule)
639 : {
640 0 : const int nListLevelOfTxtNode( pTxtNd->GetActualListLevel() );
641 0 : if ( nListLevelOfTxtNode >= 0 )
642 : {
643 0 : nLevel = static_cast<sal_uInt8>( nListLevelOfTxtNode );
644 : }
645 : }
646 :
647 0 : return nLevel;
648 : }
649 :
650 1426 : const SwNumRule* SwEditShell::GetCurNumRule() const
651 : {
652 1426 : return GetDoc()->GetCurrNumRule( *GetCrsr()->GetPoint() );
653 : }
654 :
655 0 : void SwEditShell::SetCurNumRule( const SwNumRule& rRule,
656 : const bool bCreateNewList,
657 : const String sContinuedListId,
658 : const bool bResetIndentAttrs )
659 : {
660 0 : StartAllAction();
661 :
662 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
663 :
664 0 : SwPaM* pCrsr = GetCrsr();
665 0 : if( pCrsr->GetNext() != pCrsr ) // Mehrfachselektion ?
666 : {
667 0 : SwPamRanges aRangeArr( *pCrsr );
668 0 : SwPaM aPam( *pCrsr->GetPoint() );
669 0 : for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
670 : {
671 0 : aRangeArr.SetPam( n, aPam );
672 : GetDoc()->SetNumRule( aPam, rRule,
673 : bCreateNewList, sContinuedListId,
674 0 : true, bResetIndentAttrs );
675 0 : GetDoc()->SetCounted( aPam, true );
676 0 : }
677 : }
678 : else
679 : {
680 : GetDoc()->SetNumRule( *pCrsr, rRule,
681 : bCreateNewList, sContinuedListId,
682 0 : true, bResetIndentAttrs );
683 0 : GetDoc()->SetCounted( *pCrsr, true );
684 : }
685 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
686 :
687 0 : EndAllAction();
688 0 : }
689 :
690 0 : String SwEditShell::GetUniqueNumRuleName( const String* pChkStr, bool bAutoNum ) const
691 : {
692 0 : return GetDoc()->GetUniqueNumRuleName( pChkStr, bAutoNum );
693 : }
694 :
695 0 : void SwEditShell::ChgNumRuleFmts( const SwNumRule& rRule )
696 : {
697 0 : StartAllAction();
698 0 : GetDoc()->ChgNumRuleFmts( rRule );
699 0 : EndAllAction();
700 0 : }
701 :
702 0 : bool SwEditShell::ReplaceNumRule( const String& rOldRule, const String& rNewRule )
703 : {
704 0 : StartAllAction();
705 0 : bool bRet = GetDoc()->ReplaceNumRule( *GetCrsr()->GetPoint(), rOldRule, rNewRule );
706 0 : EndAllAction();
707 0 : return bRet;
708 : }
709 :
710 0 : void SwEditShell::SetNumRuleStart( sal_Bool bFlag, SwPaM* pPaM )
711 : {
712 0 : StartAllAction();
713 0 : SwPaM* pCrsr = pPaM ? pPaM : GetCrsr();
714 0 : if( pCrsr->GetNext() != pCrsr ) // Mehrfachselektion ?
715 : {
716 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
717 0 : SwPamRanges aRangeArr( *pCrsr );
718 0 : SwPaM aPam( *pCrsr->GetPoint() );
719 0 : for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
720 0 : GetDoc()->SetNumRuleStart( *aRangeArr.SetPam( n, aPam ).GetPoint(), bFlag );
721 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
722 : }
723 : else
724 0 : GetDoc()->SetNumRuleStart( *pCrsr->GetPoint(), bFlag );
725 :
726 0 : EndAllAction();
727 0 : }
728 :
729 0 : sal_Bool SwEditShell::IsNumRuleStart( SwPaM* pPaM ) const
730 : {
731 0 : sal_Bool bResult = sal_False;
732 0 : SwPaM* pCrsr = pPaM ? pPaM : GetCrsr( );
733 0 : const SwTxtNode* pTxtNd = pCrsr->GetNode()->GetTxtNode();
734 0 : if( pTxtNd )
735 0 : bResult = pTxtNd->IsListRestart() ? sal_True : sal_False;
736 0 : return bResult;
737 : }
738 :
739 0 : void SwEditShell::SetNodeNumStart( sal_uInt16 nStt, SwPaM* pPaM )
740 : {
741 0 : StartAllAction();
742 :
743 0 : SwPaM* pCrsr = pPaM ? pPaM : GetCrsr();
744 0 : if( pCrsr->GetNext() != pCrsr ) // Mehrfachselektion ?
745 : {
746 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
747 0 : SwPamRanges aRangeArr( *pCrsr );
748 0 : SwPaM aPam( *pCrsr->GetPoint() );
749 0 : for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
750 0 : GetDoc()->SetNodeNumStart( *aRangeArr.SetPam( n, aPam ).GetPoint(), nStt );
751 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
752 : }
753 : else
754 0 : GetDoc()->SetNodeNumStart( *pCrsr->GetPoint(), nStt );
755 :
756 0 : EndAllAction();
757 0 : }
758 :
759 0 : sal_uInt16 SwEditShell::GetNodeNumStart( SwPaM* pPaM ) const
760 : {
761 0 : SwPaM* pCrsr = pPaM ? pPaM : GetCrsr();
762 0 : const SwTxtNode* pTxtNd = pCrsr->GetNode()->GetTxtNode();
763 : // correction: check, if list restart value is set at text node and
764 : // use new method <SwTxtNode::GetAttrListRestartValue()>.
765 : // return USHRT_MAX, if no list restart value is found.
766 0 : if ( pTxtNd && pTxtNd->HasAttrListRestartValue() )
767 : {
768 0 : return static_cast<sal_uInt16>(pTxtNd->GetAttrListRestartValue());
769 : }
770 0 : return USHRT_MAX;
771 : }
772 :
773 0 : const SwNumRule * SwEditShell::SearchNumRule( const bool bForward,
774 : const bool bNum,
775 : const bool bOutline,
776 : int nNonEmptyAllowed,
777 : String& sListId )
778 : {
779 0 : return GetDoc()->SearchNumRule( *(bForward ? GetCrsr()->End() : GetCrsr()->Start()),
780 : bForward, bNum, bOutline, nNonEmptyAllowed,
781 0 : sListId );
782 : }
783 :
784 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|