LCOV - code coverage report
Current view: top level - libreoffice/sw/source/core/edit - ednumber.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 9 379 2.4 %
Date: 2012-12-17 Functions: 2 37 5.4 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.10