LCOV - code coverage report
Current view: top level - sc/source/filter/xcl97 - XclImpChangeTrack.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 14 256 5.5 %
Date: 2012-08-25 Functions: 5 29 17.2 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 15 400 3.8 %

           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                 :            : 
      30                 :            : #include "XclImpChangeTrack.hxx"
      31                 :            : #include <sot/storage.hxx>
      32                 :            : #include <svl/zforlist.hxx>
      33                 :            : #include "chgviset.hxx"
      34                 :            : #include "cell.hxx"
      35                 :            : #include "chgtrack.hxx"
      36                 :            : #include "xihelper.hxx"
      37                 :            : #include "xilink.hxx"
      38                 :            : #include "externalrefmgr.hxx"
      39                 :            : 
      40                 :            : //___________________________________________________________________
      41                 :            : // class XclImpChangeTrack
      42                 :            : 
      43                 :         55 : XclImpChangeTrack::XclImpChangeTrack( const XclImpRoot& rRoot, const XclImpStream& rBookStrm ) :
      44                 :            :     XclImpRoot( rRoot ),
      45                 :            :     aRecHeader(),
      46                 :            :     sOldUsername(),
      47                 :            :     pChangeTrack( NULL ),
      48                 :            :     pStrm( NULL ),
      49                 :            :     nTabIdCount( 0 ),
      50                 :            :     bGlobExit( false ),
      51         [ +  - ]:         55 :     eNestedMode( nmBase )
      52                 :            : {
      53                 :            :     // Verify that the User Names stream exists before going any further. Excel adds both
      54                 :            :     // "Revision Log" and "User Names" streams when Change Tracking is active but the Revision log
      55                 :            :     // remains if Change Tracking is turned off.
      56 [ +  - ][ +  - ]:         55 :     SotStorageStreamRef xUserStrm = OpenStream( EXC_STREAM_USERNAMES );
                 [ +  - ]
      57         [ +  - ]:         55 :     if( !xUserStrm.Is() )
      58                 :         55 :         return;
      59                 :            : 
      60 [ #  # ][ #  # ]:          0 :     xInStrm = OpenStream( EXC_STREAM_REVLOG );
         [ #  # ][ #  # ]
                 [ #  # ]
      61         [ #  # ]:          0 :     if( xInStrm.Is() )
      62                 :            :     {
      63         [ #  # ]:          0 :         xInStrm->Seek( STREAM_SEEK_TO_END );
      64                 :          0 :         sal_uLong nStreamLen = xInStrm->Tell();
      65 [ #  # ][ #  # ]:          0 :         if( (xInStrm->GetErrorCode() == ERRCODE_NONE) && (nStreamLen != STREAM_SEEK_TO_END) )
                 [ #  # ]
      66                 :            :         {
      67         [ #  # ]:          0 :             xInStrm->Seek( STREAM_SEEK_TO_BEGIN );
      68 [ #  # ][ #  # ]:          0 :             pStrm = new XclImpStream( *xInStrm, GetRoot() );
      69         [ #  # ]:          0 :             pStrm->CopyDecrypterFrom( rBookStrm );
      70 [ #  # ][ #  # ]:          0 :             pChangeTrack = new ScChangeTrack( GetDocPtr() );
      71                 :            : 
      72 [ #  # ][ #  # ]:          0 :             sOldUsername = pChangeTrack->GetUser();
      73                 :          0 :             pChangeTrack->SetUseFixDateTime( sal_True );
      74                 :            : 
      75         [ #  # ]:          0 :             ReadRecords();
      76                 :            :         }
      77 [ +  - ][ -  + ]:         55 :     }
      78                 :            : }
      79                 :            : 
      80 [ +  - ][ +  - ]:         55 : XclImpChangeTrack::~XclImpChangeTrack()
      81                 :            : {
      82 [ -  + ][ #  # ]:         55 :     delete pChangeTrack;
      83 [ -  + ][ #  # ]:         55 :     delete pStrm;
      84         [ -  + ]:         55 : }
      85                 :            : 
      86                 :          0 : void XclImpChangeTrack::DoAcceptRejectAction( ScChangeAction* pAction )
      87                 :            : {
      88         [ #  # ]:          0 :     if( !pAction ) return;
      89      [ #  #  # ]:          0 :     switch( aRecHeader.nAccept )
      90                 :            :     {
      91                 :            :         case EXC_CHTR_ACCEPT:
      92                 :          0 :             pChangeTrack->Accept( pAction );
      93                 :          0 :         break;
      94                 :            :         case EXC_CHTR_REJECT:
      95                 :          0 :         break;
      96                 :            :     }
      97                 :            : }
      98                 :            : 
      99                 :          0 : void XclImpChangeTrack::DoAcceptRejectAction( sal_uInt32 nFirst, sal_uInt32 nLast )
     100                 :            : {
     101         [ #  # ]:          0 :     for( sal_uInt32 nIndex = nFirst; nIndex <= nLast; nIndex++ )
     102                 :          0 :         DoAcceptRejectAction( pChangeTrack->GetAction( nIndex ) );
     103                 :          0 : }
     104                 :            : 
     105                 :          0 : void XclImpChangeTrack::DoInsertRange( const ScRange& rRange )
     106                 :            : {
     107                 :          0 :     sal_uInt32 nFirst = pChangeTrack->GetActionMax() + 1;
     108                 :          0 :     pChangeTrack->AppendInsert( rRange );
     109                 :          0 :     sal_uInt32 nLast = pChangeTrack->GetActionMax();
     110                 :          0 :     DoAcceptRejectAction( nFirst, nLast );
     111                 :          0 : }
     112                 :            : 
     113                 :          0 : void XclImpChangeTrack::DoDeleteRange( const ScRange& rRange )
     114                 :            : {
     115                 :            :     sal_uLong nFirst, nLast;
     116         [ #  # ]:          0 :     pChangeTrack->AppendDeleteRange( rRange, NULL, nFirst, nLast );
     117         [ #  # ]:          0 :     DoAcceptRejectAction( nFirst, nLast );
     118                 :          0 : }
     119                 :            : 
     120                 :          0 : SCTAB XclImpChangeTrack::ReadTabNum()
     121                 :            : {
     122                 :          0 :     return static_cast<SCTAB>(GetTabInfo().GetCurrentIndex(
     123                 :          0 :                 pStrm->ReaduInt16(), nTabIdCount ));
     124                 :            : }
     125                 :            : 
     126                 :          0 : void XclImpChangeTrack::ReadDateTime( DateTime& rDateTime )
     127                 :            : {
     128                 :            :     sal_uInt16 nYear;
     129                 :            :     sal_uInt8 nMonth, nDay, nHour, nMin, nSec;
     130                 :            : 
     131 [ #  # ][ #  # ]:          0 :     *pStrm >> nYear >> nMonth >> nDay >> nHour >> nMin >> nSec;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     132                 :            : 
     133         [ #  # ]:          0 :     rDateTime.SetYear( nYear );
     134         [ #  # ]:          0 :     rDateTime.SetMonth( nMonth );
     135         [ #  # ]:          0 :     rDateTime.SetDay( nDay );
     136         [ #  # ]:          0 :     rDateTime.SetHour( nHour );
     137         [ #  # ]:          0 :     rDateTime.SetMin( nMin );
     138         [ #  # ]:          0 :     rDateTime.SetSec( nSec );
     139         [ #  # ]:          0 :     rDateTime.Set100Sec( 0 );
     140                 :          0 : }
     141                 :            : 
     142                 :          0 : sal_Bool XclImpChangeTrack::CheckRecord( sal_uInt16 nOpCode )
     143                 :            : {
     144 [ #  # ][ #  # ]:          0 :     if( (nOpCode != EXC_CHTR_OP_UNKNOWN) && (aRecHeader.nOpCode != nOpCode) )
     145                 :            :     {
     146                 :            :         OSL_FAIL( "XclImpChangeTrack::CheckRecord - unknown action" );
     147                 :          0 :         return false;
     148                 :            :     }
     149                 :          0 :     return aRecHeader.nIndex != 0;
     150                 :            : }
     151                 :            : 
     152                 :          0 : sal_Bool XclImpChangeTrack::Read3DTabRefInfo( SCTAB& rFirstTab, SCTAB& rLastTab, ExcelToSc8::ExternalTabInfo& rExtInfo )
     153                 :            : {
     154         [ #  # ]:          0 :     if( LookAtuInt8() == 0x01 )
     155                 :            :     {
     156                 :          0 :         rExtInfo.mbExternal = false;
     157                 :            :         // internal ref - read tab num and return sc tab num (position in TABID list)
     158                 :          0 :         pStrm->Ignore( 3 );
     159                 :          0 :         rFirstTab = static_cast< SCTAB >( GetTabInfo().GetCurrentIndex( pStrm->ReaduInt16(), nTabIdCount ) );
     160                 :          0 :         sal_uInt8 nFillByte = pStrm->ReaduInt8();
     161                 :            :         rLastTab = (nFillByte == 0x00) ?
     162         [ #  # ]:          0 :             static_cast< SCTAB >( GetTabInfo().GetCurrentIndex( pStrm->ReaduInt16(), nTabIdCount ) ) : rFirstTab;
     163                 :            :     }
     164                 :            :     else
     165                 :            :     {
     166                 :            :         // external ref - read doc and tab name and find sc tab num
     167                 :            :         // - URL
     168         [ #  # ]:          0 :         String aEncUrl( pStrm->ReadUniString() );
     169                 :          0 :         ::rtl::OUString aUrl;
     170                 :            :         bool bSelf;
     171 [ #  # ][ #  # ]:          0 :         XclImpUrlHelper::DecodeUrl( aUrl, bSelf, GetRoot(), aEncUrl );
     172         [ #  # ]:          0 :         pStrm->Ignore( 1 );
     173                 :            :         // - sheet name, always separated from URL
     174         [ #  # ]:          0 :         String aTabName( pStrm->ReadUniString() );
     175         [ #  # ]:          0 :         pStrm->Ignore( 1 );
     176                 :            : 
     177                 :          0 :         rExtInfo.mbExternal = true;
     178         [ #  # ]:          0 :         ScExternalRefManager* pRefMgr = GetDoc().GetExternalRefManager();
     179         [ #  # ]:          0 :         pRefMgr->convertToAbsName(aUrl);
     180         [ #  # ]:          0 :         rExtInfo.mnFileId = pRefMgr->getExternalFileId(aUrl);
     181         [ #  # ]:          0 :         rExtInfo.maTabName = aTabName;
     182 [ #  # ][ #  # ]:          0 :         rFirstTab = rLastTab = 0;
     183                 :            :     }
     184                 :          0 :     return sal_True;
     185                 :            : }
     186                 :            : 
     187                 :          0 : void XclImpChangeTrack::ReadFormula( ScTokenArray*& rpTokenArray, const ScAddress& rPosition )
     188                 :            : {
     189                 :            :     sal_uInt16 nFmlSize;
     190         [ #  # ]:          0 :     *pStrm >> nFmlSize;
     191                 :            : 
     192                 :            :     // create a memory stream and copy the formula to be able to read simultaneously
     193                 :            :     // the formula and the additional 3D tab ref data following the formula
     194                 :            :     // here we have to simulate an Excel record to be able to use an XclImpStream...
     195                 :            :     // 2do: remove the stream member from formula converter and add it as a parameter
     196                 :            :     // to the Convert() routine (to prevent the construction/destruction of the
     197                 :            :     // converter in each formula)
     198         [ #  # ]:          0 :     SvMemoryStream aMemStrm;
     199 [ #  # ][ #  # ]:          0 :     aMemStrm << (sal_uInt16) 0x0001 << nFmlSize;
     200         [ #  # ]:          0 :     size_t nRead = pStrm->CopyToStream( aMemStrm, nFmlSize );
     201                 :            : 
     202                 :            :     // survive reading invalid streams!
     203                 :            :     // if we can't read as many bytes as required just don't use them and
     204                 :            :     // assume that this part is broken
     205         [ #  # ]:          0 :     if(nRead != nFmlSize)
     206                 :            :     {
     207                 :          0 :         rpTokenArray = NULL;
     208         [ #  # ]:          0 :         pStrm->Ignore(1);
     209                 :          0 :         return;
     210                 :            :     }
     211                 :            : 
     212         [ #  # ]:          0 :     XclImpStream aFmlaStrm( aMemStrm, GetRoot() );
     213         [ #  # ]:          0 :     aFmlaStrm.StartNextRecord();
     214         [ #  # ]:          0 :     XclImpChTrFmlConverter aFmlConv( GetRoot(), *this );
     215                 :            : 
     216                 :            :     // read the formula, 3D tab refs from extended data
     217                 :          0 :     const ScTokenArray* pArray = NULL;
     218         [ #  # ]:          0 :     aFmlConv.Reset( rPosition );
     219         [ #  # ]:          0 :     sal_Bool bOK = (aFmlConv.Convert( pArray, aFmlaStrm, nFmlSize, false, FT_CellFormula) == ConvOK);   // JEG : Check This
     220 [ #  # ][ #  # ]:          0 :     rpTokenArray = (bOK && pArray) ? new ScTokenArray( *pArray ) : NULL;
         [ #  # ][ #  # ]
     221 [ #  # ][ #  # ]:          0 :     pStrm->Ignore( 1 );
         [ #  # ][ #  # ]
                 [ #  # ]
     222                 :            : }
     223                 :            : 
     224                 :          0 : void XclImpChangeTrack::ReadCell(
     225                 :            :         ScBaseCell*& rpCell,
     226                 :            :         sal_uInt32& rFormat,
     227                 :            :         sal_uInt16 nFlags,
     228                 :            :         const ScAddress& rPosition )
     229                 :            : {
     230                 :          0 :     rpCell = NULL;
     231                 :          0 :     rFormat = 0;
     232   [ #  #  #  #  :          0 :     switch( nFlags & EXC_CHTR_TYPE_MASK )
                #  #  # ]
     233                 :            :     {
     234                 :            :         case EXC_CHTR_TYPE_EMPTY:
     235                 :          0 :         break;
     236                 :            :         case EXC_CHTR_TYPE_RK:
     237                 :            :         {
     238                 :          0 :             double fValue = ReadRK();
     239         [ #  # ]:          0 :             if( pStrm->IsValid() )
     240         [ #  # ]:          0 :                 rpCell = new ScValueCell( fValue );
     241                 :            :         }
     242                 :          0 :         break;
     243                 :            :         case EXC_CHTR_TYPE_DOUBLE:
     244                 :            :         {
     245                 :            :             double fValue;
     246         [ #  # ]:          0 :             *pStrm >> fValue;
     247         [ #  # ]:          0 :             if( pStrm->IsValid() )
     248 [ #  # ][ #  # ]:          0 :                 rpCell = new ScValueCell( fValue );
     249                 :            :         }
     250                 :          0 :         break;
     251                 :            :         case EXC_CHTR_TYPE_STRING:
     252                 :            :         {
     253         [ #  # ]:          0 :             String sString( pStrm->ReadUniString() );
     254         [ #  # ]:          0 :             if( pStrm->IsValid() )
     255 [ #  # ][ #  # ]:          0 :                 rpCell = new ScStringCell( sString );
         [ #  # ][ #  # ]
     256                 :            :         }
     257                 :          0 :         break;
     258                 :            :         case EXC_CHTR_TYPE_BOOL:
     259                 :            :         {
     260                 :          0 :             double fValue = (double) ReadBool();
     261         [ #  # ]:          0 :             if( pStrm->IsValid() )
     262                 :            :             {
     263         [ #  # ]:          0 :                 rpCell = new ScValueCell( fValue );
     264                 :          0 :                 rFormat = GetFormatter().GetStandardFormat( NUMBERFORMAT_LOGICAL, ScGlobal::eLnge );
     265                 :            :             }
     266                 :            :         }
     267                 :          0 :         break;
     268                 :            :         case EXC_CHTR_TYPE_FORMULA:
     269                 :            :         {
     270                 :          0 :             ScTokenArray* pTokenArray = NULL;
     271         [ #  # ]:          0 :             ReadFormula( pTokenArray, rPosition );
     272 [ #  # ][ #  # ]:          0 :             if( pStrm->IsValid() && pTokenArray )
                 [ #  # ]
     273 [ #  # ][ #  # ]:          0 :                 rpCell = new ScFormulaCell( GetDocPtr(), rPosition, pTokenArray );
                 [ #  # ]
     274                 :            :         }
     275                 :          0 :         break;
     276                 :            :         default:
     277                 :            :             OSL_FAIL( "XclImpChangeTrack::ReadCell - unknown data type" );
     278                 :            :     }
     279                 :          0 : }
     280                 :            : 
     281                 :          0 : void XclImpChangeTrack::ReadChTrInsert()
     282                 :            : {
     283                 :          0 :     *pStrm >> aRecHeader;
     284         [ #  # ]:          0 :     if( CheckRecord( EXC_CHTR_OP_UNKNOWN ) )
     285                 :            :     {
     286 [ #  # ][ #  # ]:          0 :         if( (aRecHeader.nOpCode != EXC_CHTR_OP_INSROW) &&
         [ #  # ][ #  # ]
     287                 :            :             (aRecHeader.nOpCode != EXC_CHTR_OP_INSCOL) &&
     288                 :            :             (aRecHeader.nOpCode != EXC_CHTR_OP_DELROW) &&
     289                 :            :             (aRecHeader.nOpCode != EXC_CHTR_OP_DELCOL) )
     290                 :            :         {
     291                 :            :             OSL_FAIL( "XclImpChangeTrack::ReadChTrInsert - unknown action" );
     292                 :          0 :             return;
     293                 :            :         }
     294                 :            : 
     295                 :          0 :         ScRange aRange;
     296         [ #  # ]:          0 :         aRange.aStart.SetTab( ReadTabNum() );
     297                 :          0 :         aRange.aEnd.SetTab( aRange.aStart.Tab() );
     298         [ #  # ]:          0 :         pStrm->Ignore( 2 );
     299         [ #  # ]:          0 :         Read2DRange( aRange );
     300                 :            : 
     301         [ #  # ]:          0 :         if( aRecHeader.nOpCode & EXC_CHTR_OP_COLFLAG )
     302                 :          0 :             aRange.aEnd.SetRow( MAXROW );
     303                 :            :         else
     304                 :          0 :             aRange.aEnd.SetCol( MAXCOL );
     305                 :            : 
     306                 :          0 :         sal_Bool bValid = pStrm->IsValid();
     307         [ #  # ]:          0 :         if( FoundNestedMode() )
     308         [ #  # ]:          0 :             ReadNestedRecords();
     309                 :            : 
     310         [ #  # ]:          0 :         if( bValid )
     311                 :            :         {
     312         [ #  # ]:          0 :             if( aRecHeader.nOpCode & EXC_CHTR_OP_DELFLAG )
     313         [ #  # ]:          0 :                 DoDeleteRange( aRange );
     314                 :            :             else
     315         [ #  # ]:          0 :                 DoInsertRange( aRange );
     316                 :            :         }
     317                 :            :     }
     318                 :            : }
     319                 :            : 
     320                 :          0 : void XclImpChangeTrack::ReadChTrInfo()
     321                 :            : {
     322         [ #  # ]:          0 :     pStrm->DisableDecryption();
     323         [ #  # ]:          0 :     pStrm->Ignore( 32 );
     324         [ #  # ]:          0 :     String sUsername( pStrm->ReadUniString() );
     325         [ #  # ]:          0 :     if( !pStrm->IsValid() ) return;
     326                 :            : 
     327         [ #  # ]:          0 :     if( sUsername.Len() )
     328 [ #  # ][ #  # ]:          0 :         pChangeTrack->SetUser( sUsername );
     329         [ #  # ]:          0 :     pStrm->Seek( 148 );
     330         [ #  # ]:          0 :     if( !pStrm->IsValid() ) return;
     331                 :            : 
     332                 :          0 :     DateTime aDateTime( DateTime::EMPTY );
     333         [ #  # ]:          0 :     ReadDateTime( aDateTime );
     334         [ #  # ]:          0 :     if( pStrm->IsValid() )
     335 [ #  # ][ #  # ]:          0 :         pChangeTrack->SetFixDateTimeLocal( aDateTime );
                 [ #  # ]
     336                 :            : }
     337                 :            : 
     338                 :          0 : void XclImpChangeTrack::ReadChTrCellContent()
     339                 :            : {
     340                 :          0 :     *pStrm >> aRecHeader;
     341         [ #  # ]:          0 :     if( CheckRecord( EXC_CHTR_OP_CELL ) )
     342                 :            :     {
     343                 :          0 :         ScAddress aPosition;
     344         [ #  # ]:          0 :         SCTAB nTab = ReadTabNum();
     345                 :          0 :         aPosition.SetTab( nTab );
     346                 :            :         sal_uInt16 nValueType;
     347         [ #  # ]:          0 :         *pStrm >> nValueType;
     348                 :          0 :         sal_uInt16 nOldValueType = (nValueType >> 3) & EXC_CHTR_TYPE_MASK;
     349                 :          0 :         sal_uInt16 nNewValueType = nValueType & EXC_CHTR_TYPE_MASK;
     350         [ #  # ]:          0 :         pStrm->Ignore( 2 );
     351         [ #  # ]:          0 :         Read2DAddress( aPosition );
     352                 :            :         sal_uInt16 nOldSize;
     353         [ #  # ]:          0 :         *pStrm >> nOldSize;
     354                 :            :         OSL_ENSURE( (nOldSize == 0) == (nOldValueType == EXC_CHTR_TYPE_EMPTY),
     355                 :            :             "XclImpChangeTrack::ReadChTrCellContent - old value mismatch" );
     356         [ #  # ]:          0 :         pStrm->Ignore( 4 );
     357   [ #  #  #  # ]:          0 :         switch( nValueType & EXC_CHTR_TYPE_FORMATMASK )
     358                 :            :         {
     359                 :          0 :             case 0x0000:                            break;
     360         [ #  # ]:          0 :             case 0x1100:    pStrm->Ignore( 16 );    break;
     361         [ #  # ]:          0 :             case 0x1300:    pStrm->Ignore( 8 );     break;
     362                 :            :             default:        OSL_FAIL( "XclImpChangeTrack::ReadChTrCellContent - unknown format info" );
     363                 :            :         }
     364                 :            : 
     365                 :            :         ScBaseCell* pOldCell;
     366                 :            :         ScBaseCell* pNewCell;
     367                 :            :         sal_uInt32 nOldFormat;
     368                 :            :         sal_uInt32 nNewFormat;
     369         [ #  # ]:          0 :         ReadCell( pOldCell, nOldFormat, nOldValueType, aPosition );
     370         [ #  # ]:          0 :         ReadCell( pNewCell, nNewFormat, nNewValueType, aPosition );
     371 [ #  # ][ #  # ]:          0 :         if( !pStrm->IsValid() || (pStrm->GetRecLeft() > 0) )
         [ #  # ][ #  # ]
     372                 :            :         {
     373                 :            :             OSL_FAIL( "XclImpChangeTrack::ReadChTrCellContent - bytes left, action ignored" );
     374         [ #  # ]:          0 :             if( pOldCell )
     375         [ #  # ]:          0 :                 pOldCell->Delete();
     376         [ #  # ]:          0 :             if( pNewCell )
     377         [ #  # ]:          0 :                 pNewCell->Delete();
     378                 :            :         }
     379                 :            :         else
     380                 :            :         {
     381                 :            :             ScChangeActionContent* pNewAction =
     382         [ #  # ]:          0 :                 pChangeTrack->AppendContentOnTheFly( aPosition, pOldCell, pNewCell, nOldFormat, nNewFormat );
     383         [ #  # ]:          0 :             DoAcceptRejectAction( pNewAction );
     384                 :            :         }
     385                 :            :     }
     386                 :          0 : }
     387                 :            : 
     388                 :          0 : void XclImpChangeTrack::ReadChTrTabId()
     389                 :            : {
     390         [ #  # ]:          0 :     if( nTabIdCount == 0 )  // read only 1st time, otherwise calculated by <ReadChTrInsertTab()>
     391                 :          0 :         nTabIdCount = static_cast< sal_uInt16 >( pStrm->GetRecLeft() >> 1 );
     392                 :          0 : }
     393                 :            : 
     394                 :          0 : void XclImpChangeTrack::ReadChTrMoveRange()
     395                 :            : {
     396                 :          0 :     *pStrm >> aRecHeader;
     397         [ #  # ]:          0 :     if( CheckRecord( EXC_CHTR_OP_MOVE ) )
     398                 :            :     {
     399                 :          0 :         ScRange aSourceRange;
     400                 :          0 :         ScRange aDestRange;
     401         [ #  # ]:          0 :         aDestRange.aStart.SetTab( ReadTabNum() );
     402                 :          0 :         aDestRange.aEnd.SetTab( aDestRange.aStart.Tab() );
     403         [ #  # ]:          0 :         Read2DRange( aSourceRange );
     404         [ #  # ]:          0 :         Read2DRange( aDestRange );
     405         [ #  # ]:          0 :         aSourceRange.aStart.SetTab( ReadTabNum() );
     406                 :          0 :         aSourceRange.aEnd.SetTab( aSourceRange.aStart.Tab() );
     407                 :            : 
     408                 :          0 :         sal_Bool bValid = pStrm->IsValid();
     409         [ #  # ]:          0 :         if( FoundNestedMode() )
     410         [ #  # ]:          0 :             ReadNestedRecords();
     411                 :            : 
     412         [ #  # ]:          0 :         if( bValid )
     413                 :            :         {
     414         [ #  # ]:          0 :             pChangeTrack->AppendMove( aSourceRange, aDestRange, NULL );
     415         [ #  # ]:          0 :             DoAcceptRejectAction( pChangeTrack->GetLast() );
     416                 :            :         }
     417                 :            :     }
     418                 :          0 : }
     419                 :            : 
     420                 :          0 : void XclImpChangeTrack::ReadChTrInsertTab()
     421                 :            : {
     422                 :          0 :     *pStrm >> aRecHeader;
     423         [ #  # ]:          0 :     if( CheckRecord( EXC_CHTR_OP_INSTAB ) )
     424                 :            :     {
     425                 :          0 :         SCTAB nTab = ReadTabNum();
     426         [ #  # ]:          0 :         if( pStrm->IsValid() )
     427                 :            :         {
     428                 :          0 :             nTabIdCount++;
     429         [ #  # ]:          0 :             DoInsertRange( ScRange( 0, 0, nTab, MAXCOL, MAXROW, nTab ) );
     430                 :            :         }
     431                 :            :     }
     432                 :          0 : }
     433                 :            : 
     434                 :          0 : void XclImpChangeTrack::InitNestedMode()
     435                 :            : {
     436                 :            :     OSL_ENSURE( eNestedMode == nmBase, "XclImpChangeTrack::InitNestedMode - unexpected nested mode" );
     437         [ #  # ]:          0 :     if( eNestedMode == nmBase )
     438                 :          0 :         eNestedMode = nmFound;
     439                 :          0 : }
     440                 :            : 
     441                 :          0 : void XclImpChangeTrack::ReadNestedRecords()
     442                 :            : {
     443                 :            :     OSL_ENSURE( eNestedMode == nmFound, "XclImpChangeTrack::StartNestedMode - missing nested mode" );
     444         [ #  # ]:          0 :     if( eNestedMode == nmFound )
     445                 :            :     {
     446                 :          0 :         eNestedMode = nmNested;
     447                 :          0 :         ReadRecords();
     448                 :            :     }
     449                 :          0 : }
     450                 :            : 
     451                 :          0 : sal_Bool XclImpChangeTrack::EndNestedMode()
     452                 :            : {
     453                 :            :     OSL_ENSURE( eNestedMode != nmBase, "XclImpChangeTrack::EndNestedMode - missing nested mode" );
     454                 :          0 :     sal_Bool bReturn = (eNestedMode == nmNested);
     455                 :          0 :     eNestedMode = nmBase;
     456                 :          0 :     return bReturn;
     457                 :            : }
     458                 :            : 
     459                 :          0 : void XclImpChangeTrack::ReadRecords()
     460                 :            : {
     461                 :          0 :     sal_Bool bExitLoop = false;
     462                 :            : 
     463 [ #  # ][ #  # ]:          0 :     while( !bExitLoop && !bGlobExit && pStrm->StartNextRecord() )
         [ #  # ][ #  # ]
     464                 :            :     {
     465   [ #  #  #  #  :          0 :         switch( pStrm->GetRecId() )
          #  #  #  #  #  
                      # ]
     466                 :            :         {
     467                 :          0 :             case 0x000A:    bGlobExit = sal_True;           break;
     468                 :          0 :             case 0x0137:    ReadChTrInsert();               break;
     469                 :          0 :             case 0x0138:    ReadChTrInfo();                 break;
     470                 :          0 :             case 0x013B:    ReadChTrCellContent();          break;
     471                 :          0 :             case 0x013D:    ReadChTrTabId();                break;
     472                 :          0 :             case 0x0140:    ReadChTrMoveRange();            break;
     473                 :          0 :             case 0x014D:    ReadChTrInsertTab();            break;
     474                 :            :             case 0x014E:
     475                 :          0 :             case 0x0150:    InitNestedMode();               break;
     476                 :            :             case 0x014F:
     477                 :          0 :             case 0x0151:    bExitLoop = EndNestedMode();    break;
     478                 :            :         }
     479                 :            :     }
     480                 :          0 : }
     481                 :            : 
     482                 :         55 : void XclImpChangeTrack::Apply()
     483                 :            : {
     484         [ -  + ]:         55 :     if( pChangeTrack )
     485                 :            :     {
     486 [ #  # ][ #  # ]:          0 :         pChangeTrack->SetUser( sOldUsername );
     487                 :          0 :         pChangeTrack->SetUseFixDateTime( false );
     488                 :            : 
     489         [ #  # ]:          0 :         GetDoc().SetChangeTrack( pChangeTrack );
     490                 :          0 :         pChangeTrack = NULL;
     491                 :            : 
     492         [ #  # ]:          0 :         ScChangeViewSettings aSettings;
     493                 :          0 :         aSettings.SetShowChanges( sal_True );
     494 [ #  # ][ #  # ]:          0 :         GetDoc().SetChangeViewSettings( aSettings );
     495                 :            :     }
     496                 :         55 : }
     497                 :            : 
     498                 :            : //___________________________________________________________________
     499                 :            : // class XclImpChTrFmlConverter
     500                 :            : 
     501                 :          0 : XclImpChTrFmlConverter::~XclImpChTrFmlConverter()
     502                 :            : {
     503         [ #  # ]:          0 : }
     504                 :            : 
     505                 :            : // virtual, called from ExcToSc8::Convert()
     506                 :          0 : bool XclImpChTrFmlConverter::Read3DTabReference( sal_uInt16 /*nIxti*/, SCTAB& rFirstTab, SCTAB& rLastTab,
     507                 :            :                                                  ExternalTabInfo& rExtInfo )
     508                 :            : {
     509                 :          0 :     return rChangeTrack.Read3DTabRefInfo( rFirstTab, rLastTab, rExtInfo );
     510 [ +  - ][ +  - ]:         24 : }
     511                 :            : 
     512                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10