LCOV - code coverage report
Current view: top level - sw/source/core/edit - ednumber.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 9 379 2.4 %
Date: 2012-08-25 Functions: 2 37 5.4 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 1 532 0.2 %

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

Generated by: LCOV version 1.10