1 diff --git sc/inc/chgtrack.hxx sc/inc/chgtrack.hxx
2 index 946b862..0735a8d 100644
3 --- sc/inc/chgtrack.hxx
4 +++ sc/inc/chgtrack.hxx
5 @@ -1398,8 +1398,6 @@ public:
6 void NotifyModified( ScChangeTrackMsgType eMsgType,
7 ULONG nStartAction, ULONG nEndAction );
9 - SC_DLLPUBLIC BOOL Load( SvStream& rStrm, USHORT nVer );
10 - SC_DLLPUBLIC BOOL Store( SvStream& rStrm );
11 USHORT GetLoadedFileFormatVersion() const
12 { return nLoadedFileFormatVersion; }
14 @@ -1423,7 +1423,7 @@ public:
15 { return bTime100thSeconds; }
17 void AppendCloned( ScChangeAction* pAppend );
18 - ScChangeTrack* Clone( ScDocument* pDocument ) const;
19 + SC_DLLPUBLIC ScChangeTrack* Clone( ScDocument* pDocument ) const;
20 void MergeActionState( ScChangeAction* pAct, const ScChangeAction* pOtherAct );
22 String ToString() const;
23 diff --git sc/source/core/tool/chgtrack.cxx sc/source/core/tool/chgtrack.cxx
24 index 86d81cc..830f397 100644
25 --- sc/source/core/tool/chgtrack.cxx
26 +++ sc/source/core/tool/chgtrack.cxx
27 @@ -2943,262 +2943,6 @@ void lcl_EnsureSorting( ScStrCollection& rCollection )
32 -BOOL ScChangeTrack::Load( SvStream& rStrm, USHORT nVer )
35 - SetLoadSave( TRUE );
37 - ScReadHeader aGlobalHdr( rStrm );
43 - rStrm >> n16; nLoadedFileFormatVersion = n16;
44 - if ( (nLoadedFileFormatVersion & 0xFF00) > (SC_CHGTRACK_FILEFORMAT & 0xFF00) )
45 - { // inkompatible neuere Version
47 - rStrm.SetError( SCWARN_IMPORT_INFOLOST );
51 - aUserCollection.Load( rStrm );
53 - ULONG nCount, nLastAction, nGeneratedCount;
54 - rStrm >> n32; nCount = n32;
55 - rStrm >> n32; nActionMax = n32;
56 - rStrm >> n32; nLastAction = n32;
58 - rStrm >> n32; nGeneratedCount = n32;
60 - // GeneratedDelContents laden
62 - ScMultipleReadHeader aHdr( rStrm );
63 - for ( ULONG j = 0; j < nGeneratedCount && bOk; j++ )
65 - ScChangeActionContent* pAct;
69 - ScChangeActionType eType;
70 - rStrm >> n8; eType = (ScChangeActionType) n8;
74 - case SC_CAT_CONTENT :
75 - pAct = new ScChangeActionContent( rStrm, aHdr, pDoc, nVer, this );
78 - DBG_ERROR( "ScChangeTrack::Load: unknown GeneratedType" );
87 - pAct->SetType( eType );
88 - if ( pFirstGeneratedDelContent )
89 - pFirstGeneratedDelContent->pPrev = pAct;
90 - pAct->pNext = pFirstGeneratedDelContent;
91 - pFirstGeneratedDelContent = pAct;
92 - aGeneratedTable.Insert( pAct->GetActionNumber(), pAct );
95 - rStrm >> n32; nGeneratedMin = n32;
99 - bOk = ( nGeneratedCount == aGeneratedTable.Count() );
100 - DBG_ASSERT( bOk, "ScChangeTrack::Load: Generated failed" );
103 - // erste Runde: Actions laden
105 - ScMultipleReadHeader aHdr( rStrm );
106 - for ( ULONG j = 0; j < nCount && bOk; j++ )
108 - ScChangeAction* pAct;
113 - rStrm >> n16; nUserIndex = n16;
115 - ScChangeActionType eType;
116 - rStrm >> n8; eType = (ScChangeActionType) n8;
120 - case SC_CAT_INSERT_COLS :
121 - case SC_CAT_INSERT_ROWS :
122 - case SC_CAT_INSERT_TABS :
123 - pAct = new ScChangeActionIns( rStrm, aHdr, this );
125 - case SC_CAT_DELETE_COLS :
126 - case SC_CAT_DELETE_ROWS :
127 - case SC_CAT_DELETE_TABS :
128 - pAct = new ScChangeActionDel( rStrm, aHdr, pDoc, nVer, this );
131 - pAct = new ScChangeActionMove( rStrm, aHdr, this );
133 - case SC_CAT_CONTENT :
134 - pAct = new ScChangeActionContent( rStrm, aHdr, pDoc, nVer, this );
136 - case SC_CAT_REJECT :
137 - pAct = new ScChangeActionReject( rStrm, aHdr, this );
140 - DBG_ERROR( "ScChangeTrack::Load: unknown ScChangeActionType" );
149 - pAct->SetType( eType );
150 - if ( nUserIndex != 0xffff )
152 - StrData* pUser = (StrData*) aUserCollection.At( nUserIndex );
154 - pAct->SetUser( pUser->GetString() );
156 - AppendLoaded( pAct );
162 - nMarkLastSaved = pLast->GetActionNumber();
165 - bOk = ( nMarkLastSaved == nLastAction && nCount == aTable.Count() );
166 - DBG_ASSERT( bOk, "ScChangeTrack::Load: failed" );
168 - // zweite Runde: Links laden und alles verpointern
170 - ScMultipleReadHeader aHdr( rStrm );
171 - for ( ScChangeAction* p = GetFirst(); p && bOk; p = p->GetNext() )
174 - bOk = p->LoadLinks( rStrm, this );
179 - SetLoadSave( FALSE );
181 - // versions between 583 and 633 had the sorting wrong -> correct (after loading the actions)
182 - lcl_EnsureSorting( aUserCollection );
184 - // den aktuellen User erst einfuegen, wenn die Actions bereits ihre User haben
189 - Clear(); // eindeutiger Zustand
190 - rStrm.SetError( SCWARN_IMPORT_INFOLOST );
197 -BOOL ScChangeTrack::Store( SvStream& rStrm )
200 - SetLoadSave( TRUE );
202 - ScWriteHeader aGlobalHdr( rStrm );
204 - rStrm << (UINT16) SC_CHGTRACK_FILEFORMAT;
206 - aUserCollection.Store( rStrm );
208 - ULONG nCount = aTable.Count();
209 - ULONG nLastAction = ( pLast ? pLast->GetActionNumber() : 0 );
210 - ULONG nGeneratedCount = aGeneratedTable.Count();
211 - rStrm << (UINT32) nCount << (UINT32) nActionMax << (UINT32) nLastAction;
212 - rStrm << (UINT32) nGeneratedCount;
214 - // GeneratedDelContents speichern
217 - ScMultipleWriteHeader aHdr( rStrm );
218 - ULONG nNewGeneratedMin = SC_CHGTRACK_GENERATED_START;
219 - for ( ScChangeAction* p = pFirstGeneratedDelContent; p && bOk;
224 - rStrm << (BYTE) p->GetType();
225 - bOk = p->Store( rStrm, aHdr );
227 - ULONG nAct = p->GetActionNumber();
228 - if ( nNewGeneratedMin > nAct )
229 - nNewGeneratedMin = nAct;
231 - nGeneratedMin = nNewGeneratedMin; // evtl. unbenutzten Bereich freigeben
232 - rStrm << (UINT32) nGeneratedMin;
236 - bOk = ( nGeneratedCount == nSave );
237 - DBG_ASSERT( bOk, "ScChangeTrack::Store: failed" );
239 - // erste Runde: Actions speichern
242 - ScMultipleWriteHeader aHdr( rStrm );
243 - StrData* pUserSearch = new StrData( aUser );
245 - for ( ScChangeAction* p = GetFirst(); p && bOk; p = p->GetNext() )
250 - pUserSearch->SetString( p->GetUser() );
251 - if ( aUserCollection.Search( pUserSearch, nUserIndex ) )
252 - rStrm << (UINT16) nUserIndex;
254 - rStrm << (UINT16) 0xffff;
255 - rStrm << (BYTE) p->GetType();
257 - bOk = p->Store( rStrm, aHdr );
261 - delete pUserSearch;
265 - nMarkLastSaved = pLast->GetActionNumber();
268 - bOk = ( nCount == nSave );
269 - DBG_ASSERT( bOk, "ScChangeTrack::Store: failed" );
271 - // zweite Runde: Links speichern
273 - ScMultipleWriteHeader aHdr( rStrm );
274 - for ( ScChangeAction* p = GetFirst(); p && bOk; p = p->GetNext() )
277 - bOk = p->StoreLinks( rStrm );
282 - SetLoadSave( FALSE );
287 void ScChangeTrack::MasterLinks( ScChangeAction* pAppend )
289 ScChangeActionType eType = pAppend->GetType();
290 diff --git sc/source/filter/inc/XclExpChangeTrack.hxx sc/source/filter/inc/XclExpChangeTrack.hxx
291 index 9ec2351..75ab49d 100644
292 --- sc/source/filter/inc/XclExpChangeTrack.hxx
293 +++ sc/source/filter/inc/XclExpChangeTrack.hxx
294 @@ -620,14 +620,13 @@ private:
295 XclExpChTrTabIdBuffer* pTabIdBuffer;
297 ScDocument* pTempDoc; // empty document
298 - ScChangeTrack* pTempChangeTrack; // copy of <pOrigChangeTrack>
300 sal_uInt32 nNewAction; // action number, 1-based
301 XclExpChTrHeader* pHeader; // header record for last GUID
302 sal_uInt8 aGUID[ 16 ]; // GUID for action info records
305 - sal_Bool CreateTempChangeTrack();
306 + SC_DLLPUBLIC ScChangeTrack* CreateTempChangeTrack();
307 void PushActionRecord( const ScChangeAction& rAction );
309 sal_Bool WriteUserNamesStream();
310 diff --git sc/source/filter/xcl97/XclExpChangeTrack.cxx sc/source/filter/xcl97/XclExpChangeTrack.cxx
311 index 4318d4f..79563aa 100644
312 --- sc/source/filter/xcl97/XclExpChangeTrack.cxx
313 +++ sc/source/filter/xcl97/XclExpChangeTrack.cxx
314 @@ -1073,7 +1073,6 @@ XclExpChangeTrack::XclExpChangeTrack( const XclExpRoot& rRoot ) :
316 pTabIdBuffer( NULL ),
318 - pTempChangeTrack( NULL ),
321 bValidGUID( sal_False )
322 @@ -1082,7 +1081,8 @@ XclExpChangeTrack::XclExpChangeTrack( const XclExpRoot& rRoot ) :
323 if( !GetOldRoot().pTabId )
326 - if( !CreateTempChangeTrack() )
327 + ScChangeTrack* pTempChangeTrack = CreateTempChangeTrack();
328 + if (!pTempChangeTrack)
331 pTabIdBuffer = new XclExpChTrTabIdBuffer( GetTabInfo().GetXclTabCount() );
332 @@ -1144,25 +1144,23 @@ XclExpChangeTrack::XclExpChangeTrack( const XclExpRoot& rRoot ) :
334 XclExpChangeTrack::~XclExpChangeTrack()
336 - if( pTempChangeTrack )
337 - delete pTempChangeTrack;
342 -sal_Bool XclExpChangeTrack::CreateTempChangeTrack()
343 +ScChangeTrack* XclExpChangeTrack::CreateTempChangeTrack()
345 // get original change track
346 ScChangeTrack* pOrigChangeTrack = GetDoc().GetChangeTrack();
347 DBG_ASSERT( pOrigChangeTrack, "XclExpChangeTrack::CreateTempChangeTrack - no change track data" );
348 if( !pOrigChangeTrack )
352 // create empty document
353 pTempDoc = new ScDocument;
354 DBG_ASSERT( pTempDoc, "XclExpChangeTrack::CreateTempChangeTrack - no temp document" );
359 // adjust table count
360 SCTAB nOrigCount = GetDoc().GetTableCount();
361 @@ -1177,26 +1175,13 @@ sal_Bool XclExpChangeTrack::CreateTempChangeTrack()
362 if( nOrigCount != pTempDoc->GetTableCount() )
365 - // create empty change track
366 - pTempChangeTrack = new ScChangeTrack( pTempDoc );
367 - DBG_ASSERT( pTempChangeTrack, "XclExpChangeTrack::CreateTempChangeTrack - no temp change track" );
368 - if( !pTempChangeTrack )
371 - // copy original change track
372 - SvMemoryStream aMemStrm;
373 - if( !pOrigChangeTrack->Store( aMemStrm ) )
375 - aMemStrm.Seek( STREAM_SEEK_TO_BEGIN );
376 - if( !pTempChangeTrack->Load( aMemStrm, (USHORT) pTempDoc->GetSrcVersion() ) )
380 + return pOrigChangeTrack->Clone(pTempDoc);
383 void XclExpChangeTrack::PushActionRecord( const ScChangeAction& rAction )
385 XclExpChTrAction* pXclAction = NULL;
386 + ScChangeTrack* pTempChangeTrack = pTempDoc->GetChangeTrack();
387 switch( rAction.GetType() )
390 @@ -1206,7 +1191,8 @@ void XclExpChangeTrack::PushActionRecord( const ScChangeAction& rAction )
391 case SC_CAT_INSERT_COLS:
392 case SC_CAT_DELETE_ROWS:
393 case SC_CAT_DELETE_COLS:
394 - pXclAction = new XclExpChTrInsert( rAction, GetRoot(), *pTabIdBuffer, *pTempChangeTrack );
395 + if (pTempChangeTrack)
396 + pXclAction = new XclExpChTrInsert( rAction, GetRoot(), *pTabIdBuffer, *pTempChangeTrack );
398 case SC_CAT_INSERT_TABS:
400 @@ -1218,7 +1204,8 @@ void XclExpChangeTrack::PushActionRecord( const ScChangeAction& rAction )
404 - pXclAction = new XclExpChTrMoveRange( (const ScChangeActionMove&) rAction, GetRoot(), *pTabIdBuffer, *pTempChangeTrack );
405 + if (pTempChangeTrack)
406 + pXclAction = new XclExpChTrMoveRange( (const ScChangeActionMove&) rAction, GetRoot(), *pTabIdBuffer, *pTempChangeTrack );