LCOV - code coverage report
Current view: top level - sw/source/core/doc - docredln.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 365 833 43.8 %
Date: 2014-11-03 Functions: 58 95 61.1 %
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 <svl/itemiter.hxx>
      22             : #include <sfx2/app.hxx>
      23             : #include <editeng/colritem.hxx>
      24             : #include <editeng/udlnitem.hxx>
      25             : #include <editeng/crossedoutitem.hxx>
      26             : #include <swmodule.hxx>
      27             : #include <doc.hxx>
      28             : #include <docredln.hxx>
      29             : #include <IDocumentUndoRedo.hxx>
      30             : #include <DocumentContentOperationsManager.hxx>
      31             : #include <IDocumentRedlineAccess.hxx>
      32             : #include <IDocumentState.hxx>
      33             : #include <IDocumentLayoutAccess.hxx>
      34             : #include <IDocumentStylePoolAccess.hxx>
      35             : #include <docary.hxx>
      36             : #include <ndtxt.hxx>
      37             : #include <redline.hxx>
      38             : #include <swundo.hxx>
      39             : #include <UndoCore.hxx>
      40             : #include <UndoRedline.hxx>
      41             : #include <hints.hxx>
      42             : #include <pamtyp.hxx>
      43             : #include <poolfmt.hxx>
      44             : #include <viewsh.hxx>
      45             : #include <rootfrm.hxx>
      46             : 
      47             : #include <comcore.hrc>
      48             : 
      49             : using namespace com::sun::star;
      50             : 
      51             : #ifdef DBG_UTIL
      52             : 
      53             :     void sw_DebugRedline( const SwDoc* pDoc )
      54             :     {
      55             :         static sal_uInt16 nWatch = 0;
      56             :         const SwRedlineTbl& rTbl = pDoc->getIDocumentRedlineAccess().GetRedlineTbl();
      57             :         for( sal_uInt16 n = 0; n < rTbl.size(); ++n )
      58             :         {
      59             :             sal_uInt16 nDummy = 0;
      60             :             const SwRangeRedline* pCurrent = rTbl[ n ];
      61             :             const SwRangeRedline* pNext = n+1 < (sal_uInt16)rTbl.size() ? rTbl[ n+1 ] : 0;
      62             :             if( pCurrent == pNext )
      63             :                 ++nDummy;
      64             :             if( n == nWatch )
      65             :                 ++nDummy; // Possible debugger breakpoint
      66             :         }
      67             :     }
      68             : 
      69             : #endif
      70             : 
      71             : 
      72       10090 : SwExtraRedlineTbl::~SwExtraRedlineTbl()
      73             : {
      74        5045 :     DeleteAndDestroyAll();
      75        5045 : }
      76             : 
      77             : #if OSL_DEBUG_LEVEL > 0
      78             : bool CheckPosition( const SwPosition* pStt, const SwPosition* pEnd )
      79             : {
      80             :     int nError = 0;
      81             :     SwNode* pSttNode = &pStt->nNode.GetNode();
      82             :     SwNode* pEndNode = &pEnd->nNode.GetNode();
      83             :     SwNode* pSttTab = pSttNode->StartOfSectionNode()->FindTableNode();
      84             :     SwNode* pEndTab = pEndNode->StartOfSectionNode()->FindTableNode();
      85             :     SwNode* pSttStart = pSttNode;
      86             :     while( pSttStart && (!pSttStart->IsStartNode() || pSttStart->IsSectionNode() ||
      87             :         pSttStart->IsTableNode() ) )
      88             :         pSttStart = pSttStart->StartOfSectionNode();
      89             :     SwNode* pEndStart = pEndNode;
      90             :     while( pEndStart && (!pEndStart->IsStartNode() || pEndStart->IsSectionNode() ||
      91             :         pEndStart->IsTableNode() ) )
      92             :         pEndStart = pEndStart->StartOfSectionNode();
      93             :     if( pSttTab != pEndTab )
      94             :         nError = 1;
      95             :     if( !pSttTab && pSttStart != pEndStart )
      96             :         nError |= 2;
      97             :     if( nError )
      98             :         nError += 10;
      99             :     return nError != 0;
     100             : }
     101             : #endif
     102             : 
     103        1826 : bool SwExtraRedlineTbl::DeleteAllTableRedlines( SwDoc* pDoc, const SwTable& rTable, bool bSaveInUndo, sal_uInt16 nRedlineTypeToDelete )
     104             : {
     105        1826 :     if( nsRedlineMode_t::REDLINE_IGNOREDELETE_REDLINES & pDoc->getIDocumentRedlineAccess().GetRedlineMode() )
     106           0 :         return false;
     107             : 
     108        1826 :     bool bChg = false;
     109             : 
     110        1826 :     if (bSaveInUndo && pDoc->GetIDocumentUndoRedo().DoesUndo())
     111             :     {
     112             :         // #TODO - Add 'Undo' support for deleting 'Table Cell' redlines
     113             :         /*
     114             :         SwUndoRedline* pUndo = new SwUndoRedline( UNDO_REDLINE, rRange );
     115             :         if( pUndo->GetRedlSaveCount() )
     116             :         {
     117             :             GetIDocumentUndoRedo().AppendUndo(pUndo);
     118             :         }
     119             :         else
     120             :             delete pUndo;
     121             :         */
     122             :     }
     123             : 
     124        1826 :     for(sal_uInt16 nCurRedlinePos = 0; nCurRedlinePos < GetSize(); ++nCurRedlinePos )
     125             :     {
     126           0 :         SwExtraRedline* pExtraRedline = GetRedline(nCurRedlinePos);
     127           0 :         const SwTableCellRedline* pTableCellRedline = dynamic_cast<const SwTableCellRedline*>(pExtraRedline);
     128           0 :         if (pTableCellRedline)
     129             :         {
     130           0 :             const SwTableBox *pRedTabBox = &pTableCellRedline->GetTableBox();
     131           0 :             const SwTable& pRedTable = pRedTabBox->GetSttNd()->FindTableNode()->GetTable();
     132           0 :             if ( &pRedTable == &rTable )
     133             :             {
     134             :                 // Redline for this table
     135           0 :                 const SwRedlineData& aRedlineData = pTableCellRedline->GetRedlineData();
     136           0 :                 sal_uInt16 nRedlineType = aRedlineData.GetType();
     137             : 
     138             :                 // Check if this redline object type should be deleted
     139           0 :                 if( USHRT_MAX != nRedlineTypeToDelete && nRedlineTypeToDelete != nRedlineType )
     140           0 :                     continue;
     141             : 
     142           0 :                 DeleteAndDestroy( nCurRedlinePos );
     143           0 :                 bChg = true;
     144             :             }
     145             :         }
     146             :         else
     147             :         {
     148           0 :             const SwTableRowRedline* pTableRowRedline = dynamic_cast<const SwTableRowRedline*>(pExtraRedline);
     149           0 :             if (pTableRowRedline)
     150             :             {
     151           0 :                 const SwTableLine *pRedTabLine = &pTableRowRedline->GetTableLine();
     152           0 :                 const SwTableBoxes &pRedTabBoxes = pRedTabLine->GetTabBoxes();
     153           0 :                 const SwTable& pRedTable = pRedTabBoxes[0]->GetSttNd()->FindTableNode()->GetTable();
     154           0 :                 if ( &pRedTable == &rTable )
     155             :                 {
     156             :                     // Redline for this table
     157           0 :                     const SwRedlineData& aRedlineData = pTableRowRedline->GetRedlineData();
     158           0 :                     sal_uInt16 nRedlineType = aRedlineData.GetType();
     159             : 
     160             :                     // Check if this redline object type should be deleted
     161           0 :                     if( USHRT_MAX != nRedlineTypeToDelete && nRedlineTypeToDelete != nRedlineType )
     162           0 :                         continue;
     163             : 
     164           0 :                     DeleteAndDestroy( nCurRedlinePos );
     165           0 :                     bChg = true;
     166             :                 }
     167             :             }
     168             :         }
     169             :     }
     170             : 
     171        1826 :     if( bChg )
     172           0 :         pDoc->getIDocumentState().SetModified();
     173             : 
     174        1826 :     return bChg;
     175             : }
     176             : 
     177           4 : bool SwExtraRedlineTbl::DeleteTableRowRedline( SwDoc* pDoc, const SwTableLine& rTableLine, bool bSaveInUndo, sal_uInt16 nRedlineTypeToDelete )
     178             : {
     179           4 :     if( nsRedlineMode_t::REDLINE_IGNOREDELETE_REDLINES & pDoc->getIDocumentRedlineAccess().GetRedlineMode() )
     180           0 :         return false;
     181             : 
     182           4 :     bool bChg = false;
     183             : 
     184           4 :     if (bSaveInUndo && pDoc->GetIDocumentUndoRedo().DoesUndo())
     185             :     {
     186             :         // #TODO - Add 'Undo' support for deleting 'Table Cell' redlines
     187             :         /*
     188             :         SwUndoRedline* pUndo = new SwUndoRedline( UNDO_REDLINE, rRange );
     189             :         if( pUndo->GetRedlSaveCount() )
     190             :         {
     191             :             GetIDocumentUndoRedo().AppendUndo(pUndo);
     192             :         }
     193             :         else
     194             :             delete pUndo;
     195             :         */
     196             :     }
     197             : 
     198           4 :     for(sal_uInt16 nCurRedlinePos = 0; nCurRedlinePos < GetSize(); ++nCurRedlinePos )
     199             :     {
     200           0 :         SwExtraRedline* pExtraRedline = GetRedline(nCurRedlinePos);
     201           0 :         const SwTableRowRedline* pTableRowRedline = dynamic_cast<const SwTableRowRedline*>(pExtraRedline);
     202           0 :         const SwTableLine *pRedTabLine = pTableRowRedline ? &pTableRowRedline->GetTableLine() : NULL;
     203           0 :         if ( pRedTabLine == &rTableLine )
     204             :         {
     205             :             // Redline for this table row
     206           0 :             const SwRedlineData& aRedlineData = pTableRowRedline->GetRedlineData();
     207           0 :             sal_uInt16 nRedlineType = aRedlineData.GetType();
     208             : 
     209             :             // Check if this redline object type should be deleted
     210           0 :             if( USHRT_MAX != nRedlineTypeToDelete && nRedlineTypeToDelete != nRedlineType )
     211           0 :                 continue;
     212             : 
     213           0 :             DeleteAndDestroy( nCurRedlinePos );
     214           0 :             bChg = true;
     215             :         }
     216             :     }
     217             : 
     218           4 :     if( bChg )
     219           0 :         pDoc->getIDocumentState().SetModified();
     220             : 
     221           4 :     return bChg;
     222             : }
     223             : 
     224          14 : bool SwExtraRedlineTbl::DeleteTableCellRedline( SwDoc* pDoc, const SwTableBox& rTableBox, bool bSaveInUndo, sal_uInt16 nRedlineTypeToDelete )
     225             : {
     226          14 :     if( nsRedlineMode_t::REDLINE_IGNOREDELETE_REDLINES & pDoc->getIDocumentRedlineAccess().GetRedlineMode() )
     227           0 :         return false;
     228             : 
     229          14 :     bool bChg = false;
     230             : 
     231          14 :     if (bSaveInUndo && pDoc->GetIDocumentUndoRedo().DoesUndo())
     232             :     {
     233             :         // #TODO - Add 'Undo' support for deleting 'Table Cell' redlines
     234             :         /*
     235             :         SwUndoRedline* pUndo = new SwUndoRedline( UNDO_REDLINE, rRange );
     236             :         if( pUndo->GetRedlSaveCount() )
     237             :         {
     238             :             GetIDocumentUndoRedo().AppendUndo(pUndo);
     239             :         }
     240             :         else
     241             :             delete pUndo;
     242             :         */
     243             :     }
     244             : 
     245          14 :     for(sal_uInt16 nCurRedlinePos = 0; nCurRedlinePos < GetSize(); ++nCurRedlinePos )
     246             :     {
     247           0 :         SwExtraRedline* pExtraRedline = GetRedline(nCurRedlinePos);
     248           0 :         const SwTableCellRedline* pTableCellRedline = dynamic_cast<const SwTableCellRedline*>(pExtraRedline);
     249           0 :         const SwTableBox *pRedTabBox = pTableCellRedline ? &pTableCellRedline->GetTableBox() : NULL;
     250           0 :         if ( pRedTabBox == &rTableBox )
     251             :         {
     252             :             // Redline for this table cell
     253           0 :             const SwRedlineData& aRedlineData = pTableCellRedline->GetRedlineData();
     254           0 :             sal_uInt16 nRedlineType = aRedlineData.GetType();
     255             : 
     256             :             // Check if this redline object type should be deleted
     257           0 :             if( USHRT_MAX != nRedlineTypeToDelete && nRedlineTypeToDelete != nRedlineType )
     258           0 :                 continue;
     259             : 
     260           0 :             DeleteAndDestroy( nCurRedlinePos );
     261           0 :             bChg = true;
     262             :         }
     263             :     }
     264             : 
     265          14 :     if( bChg )
     266           0 :         pDoc->getIDocumentState().SetModified();
     267             : 
     268          14 :     return bChg;
     269             : }
     270             : 
     271        3725 : bool SwRedlineTbl::Insert( SwRangeRedline* p, bool bIns )
     272             : {
     273        3725 :     bool bRet = false;
     274        3725 :     if( p->HasValidRange() )
     275             :     {
     276        3725 :         bRet = insert( p ).second;
     277        3725 :         p->CallDisplayFunc();
     278             :     }
     279           0 :     else if( bIns )
     280           0 :         bRet = InsertWithValidRanges( p );
     281             :     else
     282             :     {
     283             :         OSL_ENSURE( false, "Redline: wrong range" );
     284             :     }
     285        3725 :     return bRet;
     286             : }
     287             : 
     288           0 : bool SwRedlineTbl::Insert( SwRangeRedline* p, sal_uInt16& rP, bool bIns )
     289             : {
     290           0 :     bool bRet = false;
     291           0 :     if( p->HasValidRange() )
     292             :     {
     293           0 :         std::pair<_SwRedlineTbl::const_iterator, bool> rv = insert( p );
     294           0 :         rP = rv.first - begin();
     295           0 :         bRet = rv.second;
     296           0 :         p->CallDisplayFunc();
     297             :     }
     298           0 :     else if( bIns )
     299           0 :         bRet = InsertWithValidRanges( p, &rP );
     300             :     else
     301             :     {
     302             :         OSL_ENSURE( false, "Redline: wrong range" );
     303             :     }
     304           0 :     return bRet;
     305             : }
     306             : 
     307           0 : bool SwRedlineTbl::InsertWithValidRanges( SwRangeRedline* p, sal_uInt16* pInsPos )
     308             : {
     309             :     // Create valid "sub-ranges" from the Selection
     310           0 :     bool bAnyIns = false;
     311           0 :     SwPosition* pStt = p->Start(),
     312           0 :               * pEnd = pStt == p->GetPoint() ? p->GetMark() : p->GetPoint();
     313           0 :     SwPosition aNewStt( *pStt );
     314           0 :     SwNodes& rNds = aNewStt.nNode.GetNodes();
     315             :     SwCntntNode* pC;
     316             : 
     317           0 :     if( !aNewStt.nNode.GetNode().IsCntntNode() )
     318             :     {
     319           0 :         pC = rNds.GoNext( &aNewStt.nNode );
     320           0 :         if( pC )
     321           0 :             aNewStt.nContent.Assign( pC, 0 );
     322             :         else
     323           0 :             aNewStt.nNode = rNds.GetEndOfContent();
     324             :     }
     325             : 
     326           0 :     SwRangeRedline* pNew = 0;
     327             :     sal_uInt16 nInsPos;
     328             : 
     329           0 :     if( aNewStt < *pEnd )
     330           0 :         do {
     331           0 :             if( !pNew )
     332           0 :                 pNew = new SwRangeRedline( p->GetRedlineData(), aNewStt );
     333             :             else
     334             :             {
     335           0 :                 pNew->DeleteMark();
     336           0 :                 *pNew->GetPoint() = aNewStt;
     337             :             }
     338             : 
     339           0 :             pNew->SetMark();
     340           0 :             GoEndSection( pNew->GetPoint() );
     341             :             // i60396: If the redlines starts before a table but the table is the last member
     342             :             // of the section, the GoEndSection will end inside the table.
     343             :             // This will result in an incorrect redline, so we've to go back
     344           0 :             SwNode* pTab = pNew->GetPoint()->nNode.GetNode().StartOfSectionNode()->FindTableNode();
     345             :             // We end in a table when pTab != 0
     346           0 :             if( pTab && !pNew->GetMark()->nNode.GetNode().StartOfSectionNode()->FindTableNode() )
     347             :             { // but our Mark was outside the table => Correction
     348           0 :                 do
     349             :                 {
     350             :                     // We want to be before the table
     351           0 :                     *pNew->GetPoint() = SwPosition(*pTab);
     352           0 :                     pC = GoPreviousNds( &pNew->GetPoint()->nNode, false ); // here we are.
     353           0 :                     if( pC )
     354           0 :                         pNew->GetPoint()->nContent.Assign( pC, 0 );
     355           0 :                     pTab = pNew->GetPoint()->nNode.GetNode().StartOfSectionNode()->FindTableNode();
     356             :                 } while( pTab ); // If there is another table we have to repeat our step backwards
     357             :             }
     358             : 
     359           0 :             if( *pNew->GetPoint() > *pEnd )
     360             :             {
     361           0 :                 pC = 0;
     362           0 :                 if( aNewStt.nNode != pEnd->nNode )
     363           0 :                     do {
     364           0 :                         SwNode& rCurNd = aNewStt.nNode.GetNode();
     365           0 :                         if( rCurNd.IsStartNode() )
     366             :                         {
     367           0 :                             if( rCurNd.EndOfSectionIndex() < pEnd->nNode.GetIndex() )
     368           0 :                                 aNewStt.nNode = *rCurNd.EndOfSectionNode();
     369             :                             else
     370           0 :                                 break;
     371             :                         }
     372           0 :                         else if( rCurNd.IsCntntNode() )
     373           0 :                             pC = rCurNd.GetCntntNode();
     374           0 :                         aNewStt.nNode++;
     375           0 :                     } while( aNewStt.nNode.GetIndex() < pEnd->nNode.GetIndex() );
     376             : 
     377           0 :                 if( aNewStt.nNode == pEnd->nNode )
     378           0 :                     aNewStt.nContent = pEnd->nContent;
     379           0 :                 else if( pC )
     380             :                 {
     381           0 :                     aNewStt.nNode = *pC;
     382           0 :                     aNewStt.nContent.Assign( pC, pC->Len() );
     383             :                 }
     384             : 
     385           0 :                 if( aNewStt <= *pEnd )
     386           0 :                     *pNew->GetPoint() = aNewStt;
     387             :             }
     388             :             else
     389           0 :                 aNewStt = *pNew->GetPoint();
     390             : #if OSL_DEBUG_LEVEL > 0
     391             :             CheckPosition( pNew->GetPoint(), pNew->GetMark() );
     392             : #endif
     393             : 
     394           0 :             if( *pNew->GetPoint() != *pNew->GetMark() &&
     395           0 :                 pNew->HasValidRange() &&
     396           0 :                 Insert( pNew, nInsPos ) )
     397             :             {
     398           0 :                 pNew->CallDisplayFunc();
     399           0 :                 bAnyIns = true;
     400           0 :                 pNew = 0;
     401           0 :                 if( pInsPos && *pInsPos < nInsPos )
     402           0 :                     *pInsPos = nInsPos;
     403             :             }
     404             : 
     405           0 :             if( aNewStt >= *pEnd ||
     406             :                 0 == (pC = rNds.GoNext( &aNewStt.nNode )) )
     407           0 :                 break;
     408             : 
     409           0 :             aNewStt.nContent.Assign( pC, 0 );
     410             : 
     411             :         } while( aNewStt < *pEnd );
     412             : 
     413           0 :     delete pNew;
     414           0 :     delete p, p = 0;
     415           0 :     return bAnyIns;
     416             : }
     417             : 
     418       21464 : bool CompareSwRedlineTbl::operator()(SwRangeRedline* const &lhs, SwRangeRedline* const &rhs) const
     419             : {
     420       21464 :     return *lhs < *rhs;
     421             : }
     422             : 
     423       10090 : _SwRedlineTbl::~_SwRedlineTbl()
     424             : {
     425        5045 :     DeleteAndDestroyAll();
     426        5045 : }
     427             : 
     428          12 : sal_uInt16 SwRedlineTbl::GetPos(const SwRangeRedline* p) const
     429             : {
     430          12 :     const_iterator it = find(const_cast<SwRangeRedline* const>(p));
     431          12 :     if( it == end() )
     432           0 :         return USHRT_MAX;
     433          12 :     return it - begin();
     434             : }
     435             : 
     436           0 : bool SwRedlineTbl::Remove( const SwRangeRedline* p )
     437             : {
     438           0 :     sal_uInt16 nPos = GetPos(p);
     439           0 :     if (nPos != USHRT_MAX)
     440           0 :         Remove(nPos);
     441           0 :     return nPos != USHRT_MAX;
     442             : }
     443             : 
     444           0 : void SwRedlineTbl::Remove( sal_uInt16 nP )
     445             : {
     446           0 :     SwDoc* pDoc = 0;
     447           0 :     if( !nP && 1 == size() )
     448           0 :         pDoc = front()->GetDoc();
     449             : 
     450           0 :     erase( begin() + nP );
     451             : 
     452             :     SwViewShell* pSh;
     453           0 :     if( pDoc && !pDoc->IsInDtor() &&
     454           0 :         0 != ( pSh = pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()) )
     455           0 :         pSh->InvalidateWindows( SwRect( 0, 0, LONG_MAX, LONG_MAX ) );
     456           0 : }
     457             : 
     458        5083 : void SwRedlineTbl::DeleteAndDestroyAll()
     459             : {
     460        5083 :     DeleteAndDestroy(0, size());
     461        5083 : }
     462             : 
     463        8193 : void SwRedlineTbl::DeleteAndDestroy( sal_uInt16 nP, sal_uInt16 nL )
     464             : {
     465        8193 :     SwDoc* pDoc = 0;
     466        8193 :     if( !nP && nL && nL == size() )
     467         246 :         pDoc = front()->GetDoc();
     468             : 
     469       11918 :     for( const_iterator it = begin() + nP; it != begin() + nP + nL; ++it )
     470        3725 :         delete *it;
     471        8193 :     erase( begin() + nP, begin() + nP + nL );
     472             : 
     473             :     SwViewShell* pSh;
     474        8299 :     if( pDoc && !pDoc->IsInDtor() &&
     475         106 :         0 != ( pSh = pDoc->getIDocumentLayoutAccess().GetCurrentViewShell() ) )
     476           0 :         pSh->InvalidateWindows( SwRect( 0, 0, LONG_MAX, LONG_MAX ) );
     477        8193 : }
     478             : 
     479             : /// Find the next or preceding Redline with the same seq.no.
     480             : /// We can limit the search using look ahead.
     481             : /// 0 or USHRT_MAX searches the whole array.
     482           0 : sal_uInt16 SwRedlineTbl::FindNextOfSeqNo( sal_uInt16 nSttPos, sal_uInt16 nLookahead ) const
     483             : {
     484           0 :     return nSttPos + 1 < (sal_uInt16)size()
     485           0 :                 ? FindNextSeqNo( operator[]( nSttPos )->GetSeqNo(), nSttPos+1, nLookahead )
     486           0 :                 : USHRT_MAX;
     487             : }
     488             : 
     489           0 : sal_uInt16 SwRedlineTbl::FindPrevOfSeqNo( sal_uInt16 nSttPos, sal_uInt16 nLookahead ) const
     490             : {
     491           0 :     return nSttPos ? FindPrevSeqNo( operator[]( nSttPos )->GetSeqNo(), nSttPos-1, nLookahead )
     492           0 :                    : USHRT_MAX;
     493             : }
     494             : 
     495           0 : sal_uInt16 SwRedlineTbl::FindNextSeqNo( sal_uInt16 nSeqNo, sal_uInt16 nSttPos,
     496             :                                     sal_uInt16 nLookahead ) const
     497             : {
     498           0 :     sal_uInt16 nRet = USHRT_MAX, nEnd;
     499           0 :     if( nSeqNo && nSttPos < size() )
     500             :     {
     501           0 :         nEnd = size();
     502           0 :         if( nLookahead && USHRT_MAX != nLookahead &&
     503           0 :             static_cast<size_t>(nSttPos + nLookahead) < size() )
     504           0 :             nEnd = nSttPos + nLookahead;
     505             : 
     506           0 :         for( ; nSttPos < nEnd; ++nSttPos )
     507           0 :             if( nSeqNo == operator[]( nSttPos )->GetSeqNo() )
     508             :             {
     509           0 :                 nRet = nSttPos;
     510           0 :                 break;
     511             :             }
     512             :     }
     513           0 :     return nRet;
     514             : }
     515             : 
     516           0 : sal_uInt16 SwRedlineTbl::FindPrevSeqNo( sal_uInt16 nSeqNo, sal_uInt16 nSttPos,
     517             :                                     sal_uInt16 nLookahead ) const
     518             : {
     519           0 :     sal_uInt16 nRet = USHRT_MAX, nEnd;
     520           0 :     if( nSeqNo && nSttPos < size() )
     521             :     {
     522           0 :         nEnd = 0;
     523           0 :         if( nLookahead && USHRT_MAX != nLookahead && nSttPos > nLookahead )
     524           0 :             nEnd = nSttPos - nLookahead;
     525             : 
     526           0 :         ++nSttPos;
     527           0 :         while( nSttPos > nEnd )
     528           0 :             if( nSeqNo == operator[]( --nSttPos )->GetSeqNo() )
     529             :             {
     530           0 :                 nRet = nSttPos;
     531           0 :                 break;
     532             :             }
     533             :     }
     534           0 :     return nRet;
     535             : }
     536             : 
     537           0 : const SwRangeRedline* SwRedlineTbl::FindAtPosition( const SwPosition& rSttPos,
     538             :                                         sal_uInt16& rPos,
     539             :                                         bool bNext ) const
     540             : {
     541           0 :     const SwRangeRedline* pFnd = 0;
     542           0 :     for( ; rPos < size() ; ++rPos )
     543             :     {
     544           0 :         const SwRangeRedline* pTmp = (*this)[ rPos ];
     545           0 :         if( pTmp->HasMark() && pTmp->IsVisible() )
     546             :         {
     547           0 :             const SwPosition* pRStt = pTmp->Start(),
     548           0 :                       * pREnd = pRStt == pTmp->GetPoint() ? pTmp->GetMark()
     549           0 :                                                           : pTmp->GetPoint();
     550           0 :             if( bNext ? *pRStt <= rSttPos : *pRStt < rSttPos )
     551             :             {
     552           0 :                 if( bNext ? *pREnd > rSttPos : *pREnd >= rSttPos )
     553             :                 {
     554           0 :                     pFnd = pTmp;
     555           0 :                     break;
     556             :                 }
     557             :             }
     558             :             else
     559           0 :                 break;
     560             :         }
     561             :     }
     562           0 :     return pFnd;
     563             : }
     564             : 
     565             : 
     566        1614 : SwRedlineExtraData::~SwRedlineExtraData()
     567             : {
     568        1614 : }
     569             : 
     570           0 : void SwRedlineExtraData::Accept( SwPaM& ) const
     571             : {
     572           0 : }
     573             : 
     574           0 : void SwRedlineExtraData::Reject( SwPaM& ) const
     575             : {
     576           0 : }
     577             : 
     578           0 : bool SwRedlineExtraData::operator == ( const SwRedlineExtraData& ) const
     579             : {
     580           0 :     return false;
     581             : }
     582             : 
     583           0 : SwRedlineExtraData_FmtColl::SwRedlineExtraData_FmtColl( const OUString& rColl,
     584             :                                                 sal_uInt16 nPoolFmtId,
     585             :                                                 const SfxItemSet* pItemSet )
     586           0 :     : sFmtNm(rColl), pSet(0), nPoolId(nPoolFmtId)
     587             : {
     588           0 :     if( pItemSet && pItemSet->Count() )
     589           0 :         pSet = new SfxItemSet( *pItemSet );
     590           0 : }
     591             : 
     592           0 : SwRedlineExtraData_FmtColl::~SwRedlineExtraData_FmtColl()
     593             : {
     594           0 :     delete pSet;
     595           0 : }
     596             : 
     597           0 : SwRedlineExtraData* SwRedlineExtraData_FmtColl::CreateNew() const
     598             : {
     599           0 :     return new SwRedlineExtraData_FmtColl( sFmtNm, nPoolId, pSet );
     600             : }
     601             : 
     602           0 : void SwRedlineExtraData_FmtColl::Reject( SwPaM& rPam ) const
     603             : {
     604           0 :     SwDoc* pDoc = rPam.GetDoc();
     605             : 
     606             :     // What about Undo? Is it turned off?
     607           0 :     SwTxtFmtColl* pColl = USHRT_MAX == nPoolId
     608           0 :                             ? pDoc->FindTxtFmtCollByName( sFmtNm )
     609           0 :                             : pDoc->getIDocumentStylePoolAccess().GetTxtCollFromPool( nPoolId );
     610           0 :     if( pColl )
     611           0 :         pDoc->SetTxtFmtColl( rPam, pColl, false );
     612             : 
     613           0 :     if( pSet )
     614             :     {
     615           0 :         rPam.SetMark();
     616           0 :         SwPosition& rMark = *rPam.GetMark();
     617           0 :         SwTxtNode* pTNd = rMark.nNode.GetNode().GetTxtNode();
     618           0 :         if( pTNd )
     619             :         {
     620           0 :             rMark.nContent.Assign(pTNd, pTNd->GetTxt().getLength());
     621             : 
     622           0 :             if( pTNd->HasSwAttrSet() )
     623             :             {
     624             :                 // Only set those that are not there anymore. Others
     625             :                 // could have changed, but we don't touch these.
     626           0 :                 SfxItemSet aTmp( *pSet );
     627           0 :                 aTmp.Differentiate( *pTNd->GetpSwAttrSet() );
     628           0 :                 pDoc->getIDocumentContentOperations().InsertItemSet( rPam, aTmp, 0 );
     629             :             }
     630             :             else
     631             :             {
     632           0 :                 pDoc->getIDocumentContentOperations().InsertItemSet( rPam, *pSet, 0 );
     633             :             }
     634             :         }
     635           0 :         rPam.DeleteMark();
     636             :     }
     637           0 : }
     638             : 
     639           0 : bool SwRedlineExtraData_FmtColl::operator == ( const SwRedlineExtraData& r) const
     640             : {
     641           0 :     const SwRedlineExtraData_FmtColl& rCmp = (SwRedlineExtraData_FmtColl&)r;
     642           0 :     return sFmtNm == rCmp.sFmtNm && nPoolId == rCmp.nPoolId &&
     643           0 :             ( ( !pSet && !rCmp.pSet ) ||
     644           0 :                ( pSet && rCmp.pSet && *pSet == *rCmp.pSet ) );
     645             : }
     646             : 
     647           0 : void SwRedlineExtraData_FmtColl::SetItemSet( const SfxItemSet& rSet )
     648             : {
     649           0 :     delete pSet;
     650           0 :     if( rSet.Count() )
     651           0 :         pSet = new SfxItemSet( rSet );
     652             :     else
     653           0 :         pSet = 0;
     654           0 : }
     655             : 
     656           0 : SwRedlineExtraData_Format::SwRedlineExtraData_Format( const SfxItemSet& rSet )
     657             : {
     658           0 :     SfxItemIter aIter( rSet );
     659           0 :     const SfxPoolItem* pItem = aIter.FirstItem();
     660             :     while( true )
     661             :     {
     662           0 :         aWhichIds.push_back( pItem->Which() );
     663           0 :         if( aIter.IsAtEnd() )
     664           0 :             break;
     665           0 :         pItem = aIter.NextItem();
     666           0 :     }
     667           0 : }
     668             : 
     669           0 : SwRedlineExtraData_Format::SwRedlineExtraData_Format(
     670             :         const SwRedlineExtraData_Format& rCpy )
     671           0 :     : SwRedlineExtraData()
     672             : {
     673           0 :     aWhichIds.insert( aWhichIds.begin(), rCpy.aWhichIds.begin(), rCpy.aWhichIds.end() );
     674           0 : }
     675             : 
     676           0 : SwRedlineExtraData_Format::~SwRedlineExtraData_Format()
     677             : {
     678           0 : }
     679             : 
     680           0 : SwRedlineExtraData* SwRedlineExtraData_Format::CreateNew() const
     681             : {
     682           0 :     return new SwRedlineExtraData_Format( *this );
     683             : }
     684             : 
     685           0 : void SwRedlineExtraData_Format::Reject( SwPaM& rPam ) const
     686             : {
     687           0 :     SwDoc* pDoc = rPam.GetDoc();
     688             : 
     689           0 :     RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode();
     690           0 :     pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(eOld & ~(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_IGNORE)));
     691             : 
     692             :     // Actually we need to reset the Attribute here!
     693           0 :     std::vector<sal_uInt16>::const_iterator it;
     694           0 :     for( it = aWhichIds.begin(); it != aWhichIds.end(); ++it )
     695             :     {
     696           0 :         pDoc->getIDocumentContentOperations().InsertPoolItem( rPam, *GetDfltAttr( *it ),
     697           0 :             nsSetAttrMode::SETATTR_DONTEXPAND );
     698             :     }
     699             : 
     700           0 :     pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld );
     701           0 : }
     702             : 
     703           0 : bool SwRedlineExtraData_Format::operator == ( const SwRedlineExtraData& rCmp ) const
     704             : {
     705           0 :     bool nRet = true;
     706           0 :     size_t nEnd = aWhichIds.size();
     707           0 :     if( nEnd != ((SwRedlineExtraData_Format&)rCmp).aWhichIds.size() )
     708           0 :         nRet = false;
     709             :     else
     710           0 :         for( size_t n = 0; n < nEnd; ++n )
     711           0 :             if( ((SwRedlineExtraData_Format&)rCmp).aWhichIds[n] != aWhichIds[n])
     712             :             {
     713           0 :                 nRet = false;
     714           0 :                 break;
     715             :             }
     716           0 :     return nRet;
     717             : }
     718             : 
     719        1614 : SwRedlineExtraData_FormattingChanges::SwRedlineExtraData_FormattingChanges( const SfxItemSet* pItemSet )
     720        1614 :     : pSet(0)
     721             : {
     722        1614 :     if( pItemSet && pItemSet->Count() )
     723        1612 :         pSet = new SfxItemSet( *pItemSet );
     724        1614 : }
     725             : 
     726        1614 : SwRedlineExtraData_FormattingChanges::SwRedlineExtraData_FormattingChanges( const SwRedlineExtraData_FormattingChanges& rCpy )
     727        1614 :     : SwRedlineExtraData()
     728             : {
     729             :     // Checking pointer pSet before accessing it for Count
     730        1614 :     if( rCpy.pSet && rCpy.pSet->Count() )
     731             :     {
     732        1612 :         pSet = new SfxItemSet( *(rCpy.pSet) );
     733             :     }
     734             :     else
     735             :     {
     736           2 :         pSet = 0;
     737             :     }
     738        1614 : }
     739             : 
     740        4842 : SwRedlineExtraData_FormattingChanges::~SwRedlineExtraData_FormattingChanges()
     741             : {
     742        1614 :     delete pSet;
     743        3228 : }
     744             : 
     745        1614 : SwRedlineExtraData* SwRedlineExtraData_FormattingChanges::CreateNew() const
     746             : {
     747        1614 :     return new SwRedlineExtraData_FormattingChanges( *this );
     748             : }
     749             : 
     750           0 : void SwRedlineExtraData_FormattingChanges::Reject( SwPaM& rPam ) const
     751             : {
     752           0 :     rPam.GetDoc();  // This is here just to prevent build 'warning'
     753             : 
     754             :     // ToDo: Add 'Reject' logic
     755           0 : }
     756             : 
     757        1342 : bool SwRedlineExtraData_FormattingChanges::operator == ( const SwRedlineExtraData& rExtraData ) const
     758             : {
     759        1342 :     const SwRedlineExtraData_FormattingChanges& rCmp = (SwRedlineExtraData_FormattingChanges&)rExtraData;
     760             : 
     761        1342 :     if ( !pSet && !rCmp.pSet )
     762             :     {
     763             :         // Both SfxItemSet are null
     764           0 :         return true;
     765             :     }
     766        1342 :     else if ( pSet && rCmp.pSet && *pSet == *rCmp.pSet )
     767             :     {
     768             :         // Both SfxItemSet exist and are equal
     769         874 :         return true;
     770             :     }
     771         468 :     return false;
     772             : }
     773             : 
     774        5108 : SwRedlineData::SwRedlineData( RedlineType_t eT, sal_uInt16 nAut )
     775             :     : pNext( 0 ), pExtraData( 0 ),
     776             :     aStamp( DateTime::SYSTEM ),
     777        5108 :     eType( eT ), nAuthor( nAut ), nSeqNo( 0 )
     778             : {
     779        5108 :     aStamp.SetSec( 0 );
     780        5108 :     aStamp.SetNanoSec( 0 );
     781        5108 : }
     782             : 
     783        2966 : SwRedlineData::SwRedlineData(
     784             :     const SwRedlineData& rCpy,
     785             :     bool bCpyNext )
     786        2962 :     : pNext( ( bCpyNext && rCpy.pNext ) ? new SwRedlineData( *rCpy.pNext ) : 0 )
     787           0 :     , pExtraData( rCpy.pExtraData ? rCpy.pExtraData->CreateNew() : 0 )
     788             :     , sComment( rCpy.sComment )
     789             :     , aStamp( rCpy.aStamp )
     790             :     , eType( rCpy.eType )
     791             :     , nAuthor( rCpy.nAuthor )
     792        2966 :     , nSeqNo( rCpy.nSeqNo )
     793             : {
     794        2966 : }
     795             : 
     796             : // For sw3io: We now own pNext!
     797          30 : SwRedlineData::SwRedlineData(RedlineType_t eT, sal_uInt16 nAut, const DateTime& rDT,
     798             :     const OUString& rCmnt, SwRedlineData *pNxt, SwRedlineExtraData* pData)
     799             :     : pNext(pNxt), pExtraData(pData), sComment(rCmnt), aStamp(rDT),
     800          30 :     eType(eT), nAuthor(nAut), nSeqNo(0)
     801             : {
     802          30 : }
     803             : 
     804       16208 : SwRedlineData::~SwRedlineData()
     805             : {
     806        8104 :     delete pExtraData;
     807        8104 :     delete pNext;
     808        8104 : }
     809             : 
     810             : /// ExtraData is copied. The Pointer's ownership is thus NOT transferred
     811             : /// to the Redline Object!
     812        2944 : void SwRedlineData::SetExtraData( const SwRedlineExtraData* pData )
     813             : {
     814        2944 :     delete pExtraData;
     815             : 
     816             :     // Check if there is data - and if so - delete it
     817        2944 :     if( pData )
     818        1614 :         pExtraData = pData->CreateNew();
     819             :     else
     820        1330 :         pExtraData = 0;
     821        2944 : }
     822             : 
     823           0 : OUString SwRedlineData::GetDescr() const
     824             : {
     825           0 :     OUString aResult;
     826             : 
     827           0 :     aResult += SW_RES(STR_REDLINE_INSERT + GetType());
     828             : 
     829           0 :     return aResult;
     830             : }
     831             : 
     832        2164 : SwRangeRedline::SwRangeRedline(RedlineType_t eTyp, const SwPaM& rPam )
     833        2164 :     : SwPaM( *rPam.GetMark(), *rPam.GetPoint() ),
     834        4328 :     pRedlineData( new SwRedlineData( eTyp, GetDoc()->getIDocumentRedlineAccess().GetRedlineAuthor() ) ),
     835        6492 :     pCntntSect( 0 )
     836             : {
     837        2164 :     bDelLastPara = bIsLastParaDelete = false;
     838        2164 :     bIsVisible = true;
     839        2164 :     if( !rPam.HasMark() )
     840           0 :         DeleteMark();
     841        2164 : }
     842             : 
     843        2890 : SwRangeRedline::SwRangeRedline( const SwRedlineData& rData, const SwPaM& rPam )
     844        2890 :     : SwPaM( *rPam.GetMark(), *rPam.GetPoint() ),
     845        2890 :     pRedlineData( new SwRedlineData( rData )),
     846        5780 :     pCntntSect( 0 )
     847             : {
     848        2890 :     bDelLastPara = bIsLastParaDelete = false;
     849        2890 :     bIsVisible = true;
     850        2890 :     if( !rPam.HasMark() )
     851           4 :         DeleteMark();
     852        2890 : }
     853             : 
     854           0 : SwRangeRedline::SwRangeRedline( const SwRedlineData& rData, const SwPosition& rPos )
     855             :     : SwPaM( rPos ),
     856           0 :     pRedlineData( new SwRedlineData( rData )),
     857           0 :     pCntntSect( 0 )
     858             : {
     859           0 :     bDelLastPara = bIsLastParaDelete = false;
     860           0 :     bIsVisible = true;
     861           0 : }
     862             : 
     863           0 : SwRangeRedline::SwRangeRedline( const SwRangeRedline& rCpy )
     864           0 :     : SwPaM( *rCpy.GetMark(), *rCpy.GetPoint() ),
     865           0 :     pRedlineData( new SwRedlineData( *rCpy.pRedlineData )),
     866           0 :     pCntntSect( 0 )
     867             : {
     868           0 :     bDelLastPara = bIsLastParaDelete = false;
     869           0 :     bIsVisible = true;
     870           0 :     if( !rCpy.HasMark() )
     871           0 :         DeleteMark();
     872           0 : }
     873             : 
     874       15222 : SwRangeRedline::~SwRangeRedline()
     875             : {
     876        5074 :     if( pCntntSect )
     877             :     {
     878             :         // delete the ContentSection
     879           2 :         if( !GetDoc()->IsInDtor() )
     880           0 :             GetDoc()->getIDocumentContentOperations().DeleteSection( &pCntntSect->GetNode() );
     881           2 :         delete pCntntSect;
     882             :     }
     883        5074 :     delete pRedlineData;
     884       10148 : }
     885             : 
     886             : /// Do we have a valid Selection?
     887        4252 : bool SwRangeRedline::HasValidRange() const
     888             : {
     889        4252 :     const SwNode* pPtNd = &GetPoint()->nNode.GetNode(),
     890        4252 :                 * pMkNd = &GetMark()->nNode.GetNode();
     891       12756 :     if( pPtNd->StartOfSectionNode() == pMkNd->StartOfSectionNode() &&
     892       12756 :         !pPtNd->StartOfSectionNode()->IsTableNode() &&
     893             :         // invalid if points on the end of content
     894             :         // end-of-content only invalid if no content index exists
     895        7888 :         ( pPtNd != pMkNd || GetContentIdx() != NULL ||
     896        3938 :           pPtNd != &pPtNd->GetNodes().GetEndOfContent() )
     897             :         )
     898        4252 :         return true;
     899           0 :     return false;
     900             : }
     901             : 
     902        3725 : void SwRangeRedline::CallDisplayFunc( sal_uInt16 nLoop )
     903             : {
     904        3725 :     switch( nsRedlineMode_t::REDLINE_SHOW_MASK & GetDoc()->getIDocumentRedlineAccess().GetRedlineMode() )
     905             :     {
     906             :     case nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE:
     907         330 :         Show( nLoop );
     908         330 :         break;
     909             :     case nsRedlineMode_t::REDLINE_SHOW_INSERT:
     910         511 :         Hide( nLoop );
     911         511 :         break;
     912             :     case nsRedlineMode_t::REDLINE_SHOW_DELETE:
     913           0 :         ShowOriginal( nLoop );
     914           0 :         break;
     915             :     }
     916        3725 : }
     917             : 
     918        3272 : void SwRangeRedline::Show( sal_uInt16 nLoop )
     919             : {
     920        3272 :     if( 1 <= nLoop )
     921             :     {
     922          40 :         SwDoc* pDoc = GetDoc();
     923          40 :         RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode();
     924          40 :         pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE));
     925          40 :         ::sw::UndoGuard const undoGuard(pDoc->GetIDocumentUndoRedo());
     926             : 
     927          40 :         switch( GetType() )
     928             :         {
     929             :         case nsRedlineType_t::REDLINE_INSERT:           // Content has been inserted
     930          16 :             bIsVisible = true;
     931          16 :             MoveFromSection();
     932          16 :             break;
     933             : 
     934             :         case nsRedlineType_t::REDLINE_DELETE:           // Content has been deleted
     935          24 :             bIsVisible = true;
     936          24 :             MoveFromSection();
     937          24 :             break;
     938             : 
     939             :         case nsRedlineType_t::REDLINE_FORMAT:           // Attributes have been applied
     940             :         case nsRedlineType_t::REDLINE_TABLE:            // Table structure has been modified
     941           0 :             InvalidateRange();
     942           0 :             break;
     943             :         default:
     944           0 :             break;
     945             :         }
     946          40 :         pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld );
     947             :     }
     948        3272 : }
     949             : 
     950         515 : void SwRangeRedline::Hide( sal_uInt16 nLoop )
     951             : {
     952         515 :     SwDoc* pDoc = GetDoc();
     953         515 :     RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode();
     954         515 :     pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE));
     955         515 :     ::sw::UndoGuard const undoGuard(pDoc->GetIDocumentUndoRedo());
     956             : 
     957         515 :     switch( GetType() )
     958             :     {
     959             :     case nsRedlineType_t::REDLINE_INSERT:           // Content has been inserted
     960         511 :         bIsVisible = true;
     961         511 :         if( 1 <= nLoop )
     962           0 :             MoveFromSection();
     963         511 :         break;
     964             : 
     965             :     case nsRedlineType_t::REDLINE_DELETE:           // Content has been deleted
     966           4 :         bIsVisible = false;
     967           4 :         switch( nLoop )
     968             :         {
     969           0 :         case 0: MoveToSection();    break;
     970           2 :         case 1: CopyToSection();    break;
     971           2 :         case 2: DelCopyOfSection(); break;
     972             :         }
     973           4 :         break;
     974             : 
     975             :     case nsRedlineType_t::REDLINE_FORMAT:           // Attributes have been applied
     976             :     case nsRedlineType_t::REDLINE_TABLE:            // Table structure has been modified
     977           0 :         if( 1 <= nLoop )
     978           0 :             InvalidateRange();
     979           0 :         break;
     980             :     default:
     981           0 :         break;
     982             :     }
     983         515 :     pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld );
     984         515 : }
     985             : 
     986           0 : void SwRangeRedline::ShowOriginal( sal_uInt16 nLoop )
     987             : {
     988           0 :     SwDoc* pDoc = GetDoc();
     989           0 :     RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode();
     990             :     SwRedlineData* pCur;
     991             : 
     992           0 :     pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE));
     993           0 :     ::sw::UndoGuard const undoGuard(pDoc->GetIDocumentUndoRedo());
     994             : 
     995             :     // Determine the Type, it's the first on Stack
     996           0 :     for( pCur = pRedlineData; pCur->pNext; )
     997           0 :         pCur = pCur->pNext;
     998             : 
     999           0 :     switch( pCur->eType )
    1000             :     {
    1001             :     case nsRedlineType_t::REDLINE_INSERT:           // Content has been inserted
    1002           0 :         bIsVisible = false;
    1003           0 :         switch( nLoop )
    1004             :         {
    1005           0 :         case 0: MoveToSection();    break;
    1006           0 :         case 1: CopyToSection();    break;
    1007           0 :         case 2: DelCopyOfSection(); break;
    1008             :         }
    1009           0 :         break;
    1010             : 
    1011             :     case nsRedlineType_t::REDLINE_DELETE:           // Inhalt wurde eingefuegt
    1012           0 :         bIsVisible = true;
    1013           0 :         if( 1 <= nLoop )
    1014           0 :             MoveFromSection();
    1015           0 :         break;
    1016             : 
    1017             :     case nsRedlineType_t::REDLINE_FORMAT:           // Attributes have been applied
    1018             :     case nsRedlineType_t::REDLINE_TABLE:            // Table structure has been modified
    1019           0 :         if( 1 <= nLoop )
    1020           0 :             InvalidateRange();
    1021           0 :         break;
    1022             :     default:
    1023           0 :         break;
    1024             :     }
    1025           0 :     pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld );
    1026           0 : }
    1027             : 
    1028        5231 : void SwRangeRedline::InvalidateRange()       // trigger the Layout
    1029             : {
    1030        5231 :     sal_uLong nSttNd = GetMark()->nNode.GetIndex(),
    1031        5231 :             nEndNd = GetPoint()->nNode.GetIndex();
    1032        5231 :     sal_Int32 nSttCnt = GetMark()->nContent.GetIndex();
    1033        5231 :     sal_Int32 nEndCnt = GetPoint()->nContent.GetIndex();
    1034             : 
    1035        5231 :     if( nSttNd > nEndNd || ( nSttNd == nEndNd && nSttCnt > nEndCnt ))
    1036             :     {
    1037        2914 :         sal_uLong nTmp = nSttNd; nSttNd = nEndNd; nEndNd = nTmp;
    1038        2914 :         sal_Int32 nTmp2 = nSttCnt; nSttCnt = nEndCnt; nEndCnt = nTmp2;
    1039             :     }
    1040             : 
    1041        5231 :     SwNodes& rNds = GetDoc()->GetNodes();
    1042       10750 :     for (sal_uLong n(nSttNd); n <= nEndNd; ++n)
    1043             :     {
    1044        5519 :         SwNode* pNode = rNds[n];
    1045             : 
    1046        5519 :         if (pNode && pNode->IsTxtNode())
    1047             :         {
    1048        5517 :             SwTxtNode* pNd = static_cast< SwTxtNode* >(pNode);
    1049             :             SwUpdateAttr aHt(
    1050             :                 n == nSttNd ? nSttCnt : 0,
    1051         286 :                 n == nEndNd ? nEndCnt : pNd->GetTxt().getLength(),
    1052        5803 :                 RES_FMT_CHG);
    1053             : 
    1054        5517 :             pNd->ModifyNotification(&aHt, &aHt);
    1055             :         }
    1056             :     }
    1057        5231 : }
    1058             : 
    1059             : /** Calculates the start and end position of the intersection rTmp and
    1060             :     text node nNdIdx */
    1061       20878 : void SwRangeRedline::CalcStartEnd( sal_uLong nNdIdx, sal_Int32& rStart, sal_Int32& rEnd ) const
    1062             : {
    1063       20878 :     const SwPosition *pRStt = Start(), *pREnd = End();
    1064       20878 :     if( pRStt->nNode < nNdIdx )
    1065             :     {
    1066       12318 :         if( pREnd->nNode > nNdIdx )
    1067             :         {
    1068        1526 :             rStart = 0;             // Paragraph is completely enclosed
    1069        1526 :             rEnd = COMPLETE_STRING;
    1070             :         }
    1071             :         else
    1072             :         {
    1073             :             OSL_ENSURE( pREnd->nNode == nNdIdx,
    1074             :                 "SwRedlineItr::Seek: GetRedlinePos Error" );
    1075       10792 :             rStart = 0;             // Paragraph is overlapped in the beginning
    1076       10792 :             rEnd = pREnd->nContent.GetIndex();
    1077             :         }
    1078             :     }
    1079        8560 :     else if( pRStt->nNode == nNdIdx )
    1080             :     {
    1081        8508 :         rStart = pRStt->nContent.GetIndex();
    1082        8508 :         if( pREnd->nNode == nNdIdx )
    1083        7128 :             rEnd = pREnd->nContent.GetIndex(); // Within the Paragraph
    1084             :         else
    1085        1380 :             rEnd = COMPLETE_STRING;      // Paragraph is overlapped in the end
    1086             :     }
    1087             :     else
    1088             :     {
    1089          52 :         rStart = COMPLETE_STRING;
    1090          52 :         rEnd = COMPLETE_STRING;
    1091             :     }
    1092       20878 : }
    1093             : 
    1094           0 : void SwRangeRedline::MoveToSection()
    1095             : {
    1096           0 :     if( !pCntntSect )
    1097             :     {
    1098           0 :         const SwPosition* pStt = Start(),
    1099           0 :                         * pEnd = pStt == GetPoint() ? GetMark() : GetPoint();
    1100             : 
    1101           0 :         SwDoc* pDoc = GetDoc();
    1102           0 :         SwPaM aPam( *pStt, *pEnd );
    1103           0 :         SwCntntNode* pCSttNd = pStt->nNode.GetNode().GetCntntNode();
    1104           0 :         SwCntntNode* pCEndNd = pEnd->nNode.GetNode().GetCntntNode();
    1105             : 
    1106           0 :         if( !pCSttNd )
    1107             :         {
    1108             :             // In order to not move other Redlines' indices, we set them
    1109             :             // to the end (is exclusive)
    1110           0 :             const SwRedlineTbl& rTbl = pDoc->getIDocumentRedlineAccess().GetRedlineTbl();
    1111           0 :             for( sal_uInt16 n = 0; n < rTbl.size(); ++n )
    1112             :             {
    1113           0 :                 SwRangeRedline* pRedl = rTbl[ n ];
    1114           0 :                 if( pRedl->GetBound(true) == *pStt )
    1115           0 :                     pRedl->GetBound(true) = *pEnd;
    1116           0 :                 if( pRedl->GetBound(false) == *pStt )
    1117           0 :                     pRedl->GetBound(false) = *pEnd;
    1118             :             }
    1119             :         }
    1120             : 
    1121             :         SwStartNode* pSttNd;
    1122           0 :         SwNodes& rNds = pDoc->GetNodes();
    1123           0 :         if( pCSttNd || pCEndNd )
    1124             :         {
    1125           0 :             SwTxtFmtColl* pColl = (pCSttNd && pCSttNd->IsTxtNode() )
    1126             :                                     ? ((SwTxtNode*)pCSttNd)->GetTxtColl()
    1127           0 :                                     : (pCEndNd && pCEndNd->IsTxtNode() )
    1128             :                                         ? ((SwTxtNode*)pCEndNd)->GetTxtColl()
    1129           0 :                                         : pDoc->getIDocumentStylePoolAccess().GetTxtCollFromPool(
    1130           0 :                                                 RES_POOLCOLL_STANDARD );
    1131             : 
    1132           0 :             pSttNd = rNds.MakeTextSection( SwNodeIndex( rNds.GetEndOfRedlines() ),
    1133           0 :                                             SwNormalStartNode, pColl );
    1134           0 :             SwTxtNode* pTxtNd = rNds[ pSttNd->GetIndex() + 1 ]->GetTxtNode();
    1135             : 
    1136           0 :             SwNodeIndex aNdIdx( *pTxtNd );
    1137           0 :             SwPosition aPos( aNdIdx, SwIndex( pTxtNd ));
    1138           0 :             if( pCSttNd && pCEndNd )
    1139           0 :                 pDoc->getIDocumentContentOperations().MoveAndJoin( aPam, aPos, IDocumentContentOperations::DOC_MOVEDEFAULT );
    1140             :             else
    1141             :             {
    1142           0 :                 if( pCSttNd && !pCEndNd )
    1143           0 :                     bDelLastPara = true;
    1144           0 :                 pDoc->getIDocumentContentOperations().MoveRange( aPam, aPos,
    1145           0 :                     IDocumentContentOperations::DOC_MOVEDEFAULT );
    1146           0 :             }
    1147             :         }
    1148             :         else
    1149             :         {
    1150           0 :             pSttNd = rNds.MakeEmptySection( SwNodeIndex( rNds.GetEndOfRedlines() ),
    1151           0 :                                             SwNormalStartNode );
    1152             : 
    1153           0 :             SwPosition aPos( *pSttNd->EndOfSectionNode() );
    1154           0 :             pDoc->getIDocumentContentOperations().MoveRange( aPam, aPos,
    1155           0 :                 IDocumentContentOperations::DOC_MOVEDEFAULT );
    1156             :         }
    1157           0 :         pCntntSect = new SwNodeIndex( *pSttNd );
    1158             : 
    1159           0 :         if( pStt == GetPoint() )
    1160           0 :             Exchange();
    1161             : 
    1162           0 :         DeleteMark();
    1163             :     }
    1164             :     else
    1165           0 :         InvalidateRange();
    1166           0 : }
    1167             : 
    1168           2 : void SwRangeRedline::CopyToSection()
    1169             : {
    1170           2 :     if( !pCntntSect )
    1171             :     {
    1172           2 :         const SwPosition* pStt = Start(),
    1173           2 :                         * pEnd = pStt == GetPoint() ? GetMark() : GetPoint();
    1174             : 
    1175           2 :         SwCntntNode* pCSttNd = pStt->nNode.GetNode().GetCntntNode();
    1176           2 :         SwCntntNode* pCEndNd = pEnd->nNode.GetNode().GetCntntNode();
    1177             : 
    1178             :         SwStartNode* pSttNd;
    1179           2 :         SwDoc* pDoc = GetDoc();
    1180           2 :         SwNodes& rNds = pDoc->GetNodes();
    1181             : 
    1182           2 :         bool bSaveCopyFlag = pDoc->IsCopyIsMove(),
    1183           2 :              bSaveRdlMoveFlg = pDoc->getIDocumentRedlineAccess().IsRedlineMove();
    1184           2 :         pDoc->SetCopyIsMove( true );
    1185             : 
    1186             :         // The IsRedlineMove() flag causes the behaviour of the
    1187             :         // SwDoc::_CopyFlyInFly method to change, which will eventually be
    1188             :         // called by the pDoc->Copy line below (through SwDoc::_Copy,
    1189             :         // SwDoc::CopyWithFlyInFly). This rather obscure bugfix
    1190             :         // apparently never really worked.
    1191           2 :         pDoc->getIDocumentRedlineAccess().SetRedlineMove( pStt->nContent == 0 );
    1192             : 
    1193           2 :         if( pCSttNd )
    1194             :         {
    1195           2 :             SwTxtFmtColl* pColl = (pCSttNd && pCSttNd->IsTxtNode() )
    1196             :                                     ? ((SwTxtNode*)pCSttNd)->GetTxtColl()
    1197           0 :                                     : pDoc->getIDocumentStylePoolAccess().GetTxtCollFromPool(
    1198           4 :                                                 RES_POOLCOLL_STANDARD );
    1199             : 
    1200           2 :             pSttNd = rNds.MakeTextSection( SwNodeIndex( rNds.GetEndOfRedlines() ),
    1201           2 :                                             SwNormalStartNode, pColl );
    1202             : 
    1203           2 :             SwNodeIndex aNdIdx( *pSttNd, 1 );
    1204           2 :             SwTxtNode* pTxtNd = aNdIdx.GetNode().GetTxtNode();
    1205           4 :             SwPosition aPos( aNdIdx, SwIndex( pTxtNd ));
    1206           2 :             pDoc->getIDocumentContentOperations().CopyRange( *this, aPos, false );
    1207             : 
    1208             :             // Take over the style from the EndNode if needed
    1209             :             // We don't want this in Doc::Copy
    1210           2 :             if( pCEndNd && pCEndNd != pCSttNd )
    1211             :             {
    1212           0 :                 SwCntntNode* pDestNd = aPos.nNode.GetNode().GetCntntNode();
    1213           0 :                 if( pDestNd )
    1214             :                 {
    1215           0 :                     if( pDestNd->IsTxtNode() && pCEndNd->IsTxtNode() )
    1216             :                         ((SwTxtNode*)pCEndNd)->CopyCollFmt(
    1217           0 :                                             *(SwTxtNode*)pDestNd );
    1218             :                     else
    1219           0 :                         pDestNd->ChgFmtColl( pCEndNd->GetFmtColl() );
    1220             :                 }
    1221           2 :             }
    1222             :         }
    1223             :         else
    1224             :         {
    1225           0 :             pSttNd = rNds.MakeEmptySection( SwNodeIndex( rNds.GetEndOfRedlines() ),
    1226           0 :                                             SwNormalStartNode );
    1227             : 
    1228           0 :             if( pCEndNd )
    1229             :             {
    1230           0 :                 SwPosition aPos( *pSttNd->EndOfSectionNode() );
    1231           0 :                 pDoc->getIDocumentContentOperations().CopyRange( *this, aPos, false );
    1232             :             }
    1233             :             else
    1234             :             {
    1235           0 :                 SwNodeIndex aInsPos( *pSttNd->EndOfSectionNode() );
    1236           0 :                 SwNodeRange aRg( pStt->nNode, 0, pEnd->nNode, 1 );
    1237           0 :                 pDoc->GetDocumentContentOperationsManager().CopyWithFlyInFly( aRg, 0, aInsPos );
    1238             :             }
    1239             :         }
    1240           2 :         pCntntSect = new SwNodeIndex( *pSttNd );
    1241             : 
    1242           2 :         pDoc->SetCopyIsMove( bSaveCopyFlag );
    1243           2 :         pDoc->getIDocumentRedlineAccess().SetRedlineMove( bSaveRdlMoveFlg );
    1244             :     }
    1245           2 : }
    1246             : 
    1247           2 : void SwRangeRedline::DelCopyOfSection()
    1248             : {
    1249           2 :     if( pCntntSect )
    1250             :     {
    1251           2 :         const SwPosition* pStt = Start(),
    1252           2 :                         * pEnd = pStt == GetPoint() ? GetMark() : GetPoint();
    1253             : 
    1254           2 :         SwDoc* pDoc = GetDoc();
    1255           2 :         SwPaM aPam( *pStt, *pEnd );
    1256           2 :         SwCntntNode* pCSttNd = pStt->nNode.GetNode().GetCntntNode();
    1257           2 :         SwCntntNode* pCEndNd = pEnd->nNode.GetNode().GetCntntNode();
    1258             : 
    1259           2 :         if( !pCSttNd )
    1260             :         {
    1261             :             // In order to not move other Redlines' indices, we set them
    1262             :             // to the end (is exclusive)
    1263           0 :             const SwRedlineTbl& rTbl = pDoc->getIDocumentRedlineAccess().GetRedlineTbl();
    1264           0 :             for( sal_uInt16 n = 0; n < rTbl.size(); ++n )
    1265             :             {
    1266           0 :                 SwRangeRedline* pRedl = rTbl[ n ];
    1267           0 :                 if( pRedl->GetBound(true) == *pStt )
    1268           0 :                     pRedl->GetBound(true) = *pEnd;
    1269           0 :                 if( pRedl->GetBound(false) == *pStt )
    1270           0 :                     pRedl->GetBound(false) = *pEnd;
    1271             :             }
    1272             :         }
    1273             : 
    1274           2 :         if( pCSttNd && pCEndNd )
    1275             :         {
    1276             :             // #i100466# - force a <join next> on <delete and join> operation
    1277           2 :             pDoc->getIDocumentContentOperations().DeleteAndJoin( aPam, true );
    1278             :         }
    1279           0 :         else if( pCSttNd || pCEndNd )
    1280             :         {
    1281           0 :             if( pCSttNd && !pCEndNd )
    1282           0 :                 bDelLastPara = true;
    1283           0 :             pDoc->getIDocumentContentOperations().DeleteRange( aPam );
    1284             : 
    1285           0 :             if( bDelLastPara )
    1286             :             {
    1287             :                 // To prevent dangling references to the paragraph to
    1288             :                 // be deleted, redline that point into this paragraph should be
    1289             :                 // moved to the new end position. Since redlines in the redline
    1290             :                 // table are sorted and the pEnd position is an endnode (see
    1291             :                 // bDelLastPara condition above), only redlines before the
    1292             :                 // current ones can be affected.
    1293           0 :                 const SwRedlineTbl& rTbl = pDoc->getIDocumentRedlineAccess().GetRedlineTbl();
    1294           0 :                 sal_uInt16 n = rTbl.GetPos( this );
    1295             :                 OSL_ENSURE( n != USHRT_MAX, "How strange. We don't exist!" );
    1296           0 :                 for( bool bBreak = false; !bBreak && n > 0; )
    1297             :                 {
    1298           0 :                     --n;
    1299           0 :                     bBreak = true;
    1300           0 :                     if( rTbl[ n ]->GetBound(true) == *aPam.GetPoint() )
    1301             :                     {
    1302           0 :                         rTbl[ n ]->GetBound(true) = *pEnd;
    1303           0 :                         bBreak = false;
    1304             :                     }
    1305           0 :                     if( rTbl[ n ]->GetBound(false) == *aPam.GetPoint() )
    1306             :                     {
    1307           0 :                         rTbl[ n ]->GetBound(false) = *pEnd;
    1308           0 :                         bBreak = false;
    1309             :                     }
    1310             :                 }
    1311             : 
    1312           0 :                 SwPosition aEnd( *pEnd );
    1313           0 :                 *GetPoint() = *pEnd;
    1314           0 :                 *GetMark() = *pEnd;
    1315           0 :                 DeleteMark();
    1316             : 
    1317           0 :                 aPam.GetBound( true ).nContent.Assign( 0, 0 );
    1318           0 :                 aPam.GetBound( false ).nContent.Assign( 0, 0 );
    1319           0 :                 aPam.DeleteMark();
    1320           0 :                 pDoc->getIDocumentContentOperations().DelFullPara( aPam );
    1321           0 :             }
    1322             :         }
    1323             :         else
    1324             :         {
    1325           0 :             pDoc->getIDocumentContentOperations().DeleteRange( aPam );
    1326             :         }
    1327             : 
    1328           2 :         if( pStt == GetPoint() )
    1329           2 :             Exchange();
    1330             : 
    1331           2 :         DeleteMark();
    1332             :     }
    1333           2 : }
    1334             : 
    1335          40 : void SwRangeRedline::MoveFromSection()
    1336             : {
    1337          40 :     if( pCntntSect )
    1338             :     {
    1339          12 :         SwDoc* pDoc = GetDoc();
    1340          12 :         const SwRedlineTbl& rTbl = pDoc->getIDocumentRedlineAccess().GetRedlineTbl();
    1341          24 :         std::vector<SwPosition*> aBeforeArr, aBehindArr;
    1342          12 :         sal_uInt16 nMyPos = rTbl.GetPos( this );
    1343             :         OSL_ENSURE( this, "this is not in the array?" );
    1344          12 :         bool bBreak = false;
    1345             :         sal_uInt16 n;
    1346             : 
    1347          18 :         for( n = nMyPos+1; !bBreak && n < rTbl.size(); ++n )
    1348             :         {
    1349           6 :             bBreak = true;
    1350           6 :             if( rTbl[ n ]->GetBound(true) == *GetPoint() )
    1351             :             {
    1352           2 :                 aBehindArr.push_back( &rTbl[ n ]->GetBound(true) );
    1353           2 :                 bBreak = false;
    1354             :             }
    1355           6 :             if( rTbl[ n ]->GetBound(false) == *GetPoint() )
    1356             :             {
    1357           2 :                 aBehindArr.push_back( &rTbl[ n ]->GetBound(false) );
    1358           2 :                 bBreak = false;
    1359             :             }
    1360             :         }
    1361          26 :         for( bBreak = false, n = nMyPos; !bBreak && n ; )
    1362             :         {
    1363           2 :             --n;
    1364           2 :             bBreak = true;
    1365           2 :             if( rTbl[ n ]->GetBound(true) == *GetPoint() )
    1366             :             {
    1367           2 :                 aBeforeArr.push_back( &rTbl[ n ]->GetBound(true) );
    1368           2 :                 bBreak = false;
    1369             :             }
    1370           2 :             if( rTbl[ n ]->GetBound(false) == *GetPoint() )
    1371             :             {
    1372           0 :                 aBeforeArr.push_back( &rTbl[ n ]->GetBound(false) );
    1373           0 :                 bBreak = false;
    1374             :             }
    1375             :         }
    1376             : 
    1377          12 :         const SwNode* pKeptCntntSectNode( &pCntntSect->GetNode() ); // #i95711#
    1378             :         {
    1379          12 :             SwPaM aPam( pCntntSect->GetNode(),
    1380          12 :                         *pCntntSect->GetNode().EndOfSectionNode(), 1,
    1381          36 :                         ( bDelLastPara ? -2 : -1 ) );
    1382          12 :             SwCntntNode* pCNd = aPam.GetCntntNode();
    1383          12 :             if( pCNd )
    1384          12 :                 aPam.GetPoint()->nContent.Assign( pCNd, pCNd->Len() );
    1385             :             else
    1386           0 :                 aPam.GetPoint()->nNode++;
    1387             : 
    1388          20 :             SwFmtColl* pColl = pCNd && pCNd->Len() && aPam.GetPoint()->nNode !=
    1389           8 :                                         aPam.GetMark()->nNode
    1390          14 :                                 ? pCNd->GetFmtColl() : 0;
    1391             : 
    1392          24 :             SwNodeIndex aNdIdx( GetPoint()->nNode, -1 );
    1393          12 :             const sal_Int32 nPos = GetPoint()->nContent.GetIndex();
    1394             : 
    1395          24 :             SwPosition aPos( *GetPoint() );
    1396          12 :             if( bDelLastPara && *aPam.GetPoint() == *aPam.GetMark() )
    1397             :             {
    1398           0 :                 aPos.nNode--;
    1399             : 
    1400           0 :                 pDoc->getIDocumentContentOperations().AppendTxtNode( aPos );
    1401             :             }
    1402             :             else
    1403             :             {
    1404          12 :                 pDoc->getIDocumentContentOperations().MoveRange( aPam, aPos,
    1405          12 :                     IDocumentContentOperations::DOC_MOVEALLFLYS );
    1406             :             }
    1407             : 
    1408          12 :             SetMark();
    1409          12 :             *GetPoint() = aPos;
    1410          12 :             GetMark()->nNode = aNdIdx.GetIndex() + 1;
    1411          12 :             pCNd = GetMark()->nNode.GetNode().GetCntntNode();
    1412          12 :             GetMark()->nContent.Assign( pCNd, nPos );
    1413             : 
    1414          12 :             if( bDelLastPara )
    1415             :             {
    1416           0 :                 GetPoint()->nNode++;
    1417           0 :                 GetPoint()->nContent.Assign( pCNd = GetCntntNode(), 0 );
    1418           0 :                 bDelLastPara = false;
    1419             :             }
    1420          12 :             else if( pColl )
    1421           2 :                 pCNd = GetCntntNode();
    1422             : 
    1423          12 :             if( pColl && pCNd )
    1424          14 :                 pCNd->ChgFmtColl( pColl );
    1425             :         }
    1426             :         // #i95771#
    1427             :         // Under certain conditions the previous <SwDoc::Move(..)> has already
    1428             :         // removed the change tracking section of this <SwRangeRedline> instance from
    1429             :         // the change tracking nodes area.
    1430             :         // Thus, check if <pCntntSect> still points to the change tracking section
    1431             :         // by comparing it with the "indexed" <SwNode> instance copied before
    1432             :         // perform the intrinsic move.
    1433             :         // Note: Such condition is e.g. a "delete" change tracking only containing a table.
    1434          12 :         if ( &pCntntSect->GetNode() == pKeptCntntSectNode )
    1435             :         {
    1436          12 :             pDoc->getIDocumentContentOperations().DeleteSection( &pCntntSect->GetNode() );
    1437             :         }
    1438          12 :         delete pCntntSect, pCntntSect = 0;
    1439             : 
    1440             :         // adjustment of redline table positions must take start and
    1441             :         // end into account, not point and mark.
    1442          14 :         for( n = 0; n < aBeforeArr.size(); ++n )
    1443           2 :             *aBeforeArr[ n ] = *Start();
    1444          16 :         for( n = 0; n < aBehindArr.size(); ++n )
    1445          16 :             *aBehindArr[ n ] = *End();
    1446             :     }
    1447             :     else
    1448          28 :         InvalidateRange();
    1449          40 : }
    1450             : 
    1451             : // for Undo
    1452          12 : void SwRangeRedline::SetContentIdx( const SwNodeIndex* pIdx )
    1453             : {
    1454          12 :     if( pIdx && !pCntntSect )
    1455             :     {
    1456          12 :         pCntntSect = new SwNodeIndex( *pIdx );
    1457          12 :         bIsVisible = false;
    1458             :     }
    1459           0 :     else if( !pIdx && pCntntSect )
    1460             :     {
    1461           0 :         delete pCntntSect, pCntntSect = 0;
    1462           0 :         bIsVisible = false;
    1463             :     }
    1464             :     else
    1465             :     {
    1466             :         OSL_FAIL("SwRangeRedline::SetContentIdx: invalid state");
    1467             :     }
    1468          12 : }
    1469             : 
    1470        5662 : bool SwRangeRedline::CanCombine( const SwRangeRedline& rRedl ) const
    1471             : {
    1472       11280 :     return  IsVisible() && rRedl.IsVisible() &&
    1473       11280 :             pRedlineData->CanCombine( *rRedl.pRedlineData );
    1474             : }
    1475             : 
    1476           4 : void SwRangeRedline::PushData( const SwRangeRedline& rRedl, bool bOwnAsNext )
    1477             : {
    1478           4 :     SwRedlineData* pNew = new SwRedlineData( *rRedl.pRedlineData, false );
    1479           4 :     if( bOwnAsNext )
    1480             :     {
    1481           4 :         pNew->pNext = pRedlineData;
    1482           4 :         pRedlineData = pNew;
    1483             :     }
    1484             :     else
    1485             :     {
    1486           0 :         pNew->pNext = pRedlineData->pNext;
    1487           0 :         pRedlineData->pNext = pNew;
    1488             :     }
    1489           4 : }
    1490             : 
    1491           0 : bool SwRangeRedline::PopData()
    1492             : {
    1493           0 :     if( !pRedlineData->pNext )
    1494           0 :         return false;
    1495           0 :     SwRedlineData* pCur = pRedlineData;
    1496           0 :     pRedlineData = pCur->pNext;
    1497           0 :     pCur->pNext = 0;
    1498           0 :     delete pCur;
    1499           0 :     return true;
    1500             : }
    1501             : 
    1502        5392 : sal_uInt16 SwRangeRedline::GetStackCount() const
    1503             : {
    1504        5392 :     sal_uInt16 nRet = 1;
    1505        5430 :     for( SwRedlineData* pCur = pRedlineData; pCur->pNext; ++nRet )
    1506          38 :         pCur = pCur->pNext;
    1507        5392 :     return nRet;
    1508             : }
    1509             : 
    1510       49042 : sal_uInt16 SwRangeRedline::GetAuthor( sal_uInt16 nPos ) const
    1511             : {
    1512       49042 :     return GetRedlineData(nPos).nAuthor;
    1513             : }
    1514             : 
    1515          16 : OUString SwRangeRedline::GetAuthorString( sal_uInt16 nPos ) const
    1516             : {
    1517          16 :     return SW_MOD()->GetRedlineAuthor(GetRedlineData(nPos).nAuthor);
    1518             : }
    1519             : 
    1520          10 : const DateTime& SwRangeRedline::GetTimeStamp( sal_uInt16 nPos ) const
    1521             : {
    1522          10 :     return GetRedlineData(nPos).aStamp;
    1523             : }
    1524             : 
    1525      333803 : RedlineType_t SwRangeRedline::GetRealType( sal_uInt16 nPos ) const
    1526             : {
    1527      333803 :     return GetRedlineData(nPos).eType;
    1528             : }
    1529             : 
    1530           4 : const OUString& SwRangeRedline::GetComment( sal_uInt16 nPos ) const
    1531             : {
    1532           4 :     return GetRedlineData(nPos).sComment;
    1533             : }
    1534             : 
    1535           0 : bool SwRangeRedline::operator==( const SwRangeRedline& rCmp ) const
    1536             : {
    1537           0 :     return this == &rCmp;
    1538             : }
    1539             : 
    1540       21464 : bool SwRangeRedline::operator<( const SwRangeRedline& rCmp ) const
    1541             : {
    1542       21464 :     bool nResult = false;
    1543             : 
    1544       21464 :     if (*Start() < *rCmp.Start())
    1545       19008 :         nResult = true;
    1546        2456 :     else if (*Start() == *rCmp.Start())
    1547        2158 :         if (*End() < *rCmp.End())
    1548           6 :             nResult = true;
    1549             : 
    1550       21464 :     return nResult;
    1551             : }
    1552             : 
    1553      384167 : const SwRedlineData & SwRangeRedline::GetRedlineData(sal_uInt16 nPos) const
    1554             : {
    1555      384167 :     SwRedlineData * pCur = pRedlineData;
    1556             : 
    1557      768410 :     while (nPos > 0 && NULL != pCur->pNext)
    1558             :     {
    1559          76 :         pCur = pCur->pNext;
    1560             : 
    1561          76 :         nPos--;
    1562             :     }
    1563             : 
    1564             :     OSL_ENSURE( 0 == nPos, "Pos is too big" );
    1565             : 
    1566      384167 :     return *pCur;
    1567             : }
    1568             : 
    1569           0 : OUString SwRangeRedline::GetDescr(sal_uInt16 nPos)
    1570             : {
    1571           0 :     OUString aResult;
    1572             : 
    1573             :     // get description of redline data (e.g.: "insert $1")
    1574           0 :     aResult = GetRedlineData(nPos).GetDescr();
    1575             : 
    1576           0 :     SwPaM * pPaM = NULL;
    1577           0 :     bool bDeletePaM = false;
    1578             : 
    1579             :     // if this redline is visible the content is in this PaM
    1580           0 :     if (NULL == pCntntSect)
    1581             :     {
    1582           0 :         pPaM = this;
    1583             :     }
    1584             :     else // otherwise it is saved in pCntntSect
    1585             :     {
    1586           0 :         SwNodeIndex aTmpIdx( *pCntntSect->GetNode().EndOfSectionNode() );
    1587           0 :         pPaM = new SwPaM(*pCntntSect, aTmpIdx );
    1588           0 :         bDeletePaM = true;
    1589             :     }
    1590             : 
    1591             :     // replace $1 in description by description of the redlines text
    1592           0 :     OUString aTmpStr;
    1593           0 :     aTmpStr += SW_RES(STR_START_QUOTE);
    1594           0 :     aTmpStr += ShortenString(pPaM->GetTxt(), nUndoStringLength,
    1595           0 :                              OUString(SW_RES(STR_LDOTS)));
    1596           0 :     aTmpStr += SW_RES(STR_END_QUOTE);
    1597             : 
    1598           0 :     SwRewriter aRewriter;
    1599           0 :     aRewriter.AddRule(UndoArg1, aTmpStr);
    1600             : 
    1601           0 :     aResult = aRewriter.Apply(aResult);
    1602             : 
    1603           0 :     if (bDeletePaM)
    1604           0 :         delete pPaM;
    1605             : 
    1606           0 :     return aResult;
    1607             : }
    1608             : 
    1609          68 : bool SwExtraRedlineTbl::Insert( SwExtraRedline* p )
    1610             : {
    1611          68 :     m_aExtraRedlines.push_back( p );
    1612             :     //p->CallDisplayFunc();
    1613          68 :     return true;
    1614             : }
    1615             : 
    1616       10128 : void SwExtraRedlineTbl::DeleteAndDestroy( sal_uInt16 nPos, sal_uInt16 nLen )
    1617             : {
    1618             :     /*
    1619             :     SwDoc* pDoc = 0;
    1620             :     if( !nP && nL && nL == size() )
    1621             :         pDoc = front()->GetDoc();
    1622             :     */
    1623             : 
    1624       10196 :     for( std::vector<SwExtraRedline*>::iterator it = m_aExtraRedlines.begin() + nPos; it != m_aExtraRedlines.begin() + nPos + nLen; ++it )
    1625          68 :         delete *it;
    1626             : 
    1627       10128 :     m_aExtraRedlines.erase( m_aExtraRedlines.begin() + nPos, m_aExtraRedlines.begin() + nPos + nLen );
    1628             : 
    1629             :     /*
    1630             :     SwViewShell* pSh;
    1631             :     if( pDoc && !pDoc->IsInDtor() &&
    1632             :         0 != ( pSh = pDoc->getIDocumentLayoutAccess().GetCurrentViewShell() ) )
    1633             :         pSh->InvalidateWindows( SwRect( 0, 0, LONG_MAX, LONG_MAX ) );
    1634             :     */
    1635       10128 : }
    1636             : 
    1637       10128 : void SwExtraRedlineTbl::DeleteAndDestroyAll()
    1638             : {
    1639       10128 :     DeleteAndDestroy(0, m_aExtraRedlines.size());
    1640       10128 : }
    1641             : 
    1642          68 : SwExtraRedline::~SwExtraRedline()
    1643             : {
    1644          68 : }
    1645             : 
    1646          56 : SwTableRowRedline::SwTableRowRedline(const SwRedlineData& rData, const SwTableLine& rTableLine)
    1647             :     : m_aRedlineData(rData)
    1648          56 :     , m_rTableLine(rTableLine)
    1649             : {
    1650          56 : }
    1651             : 
    1652         112 : SwTableRowRedline::~SwTableRowRedline()
    1653             : {
    1654         112 : }
    1655             : 
    1656          12 : SwTableCellRedline::SwTableCellRedline(const SwRedlineData& rData, const SwTableBox& rTableBox)
    1657             :     : m_aRedlineData(rData)
    1658          12 :     , m_rTableBox(rTableBox)
    1659             : {
    1660          12 : }
    1661             : 
    1662          24 : SwTableCellRedline::~SwTableCellRedline()
    1663             : {
    1664         294 : }
    1665             : 
    1666             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
    1667             : 

Generated by: LCOV version 1.10