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 : #ifndef SC_XCLEXPCHANGETRACK_HXX
21 : #define SC_XCLEXPCHANGETRACK_HXX
22 :
23 : #include <stack>
24 : #include <tools/datetime.hxx>
25 : #include <rtl/uuid.h>
26 : #include "bigrange.hxx"
27 : #include "chgtrack.hxx"
28 : #include "xelink.hxx"
29 : #include "ftools.hxx"
30 : #include "excrecds.hxx"
31 :
32 :
33 : // XclExpUserBView - one UserBView record for each user
34 :
35 0 : class XclExpUserBView : public ExcRecord
36 : {
37 : private:
38 : XclExpString sUsername;
39 : sal_uInt8 aGUID[ 16 ];
40 :
41 : virtual void SaveCont( XclExpStream& rStrm ) SAL_OVERRIDE;
42 :
43 : public:
44 : XclExpUserBView( const OUString& rUsername, const sal_uInt8* pGUID );
45 :
46 0 : inline const sal_uInt8* GetGUID() const { return aGUID; }
47 :
48 : virtual sal_uInt16 GetNum() const SAL_OVERRIDE;
49 : virtual sal_Size GetLen() const SAL_OVERRIDE;
50 : };
51 :
52 :
53 : // XclExpUserBViewList - list of UserBView records
54 :
55 : class XclExpUserBViewList : public ExcEmptyRec
56 : {
57 : private:
58 : std::vector<XclExpUserBView*> aViews;
59 :
60 : public:
61 :
62 : typedef std::vector<XclExpUserBView*>::iterator iterator;
63 : typedef std::vector<XclExpUserBView*>::const_iterator const_iterator;
64 :
65 : XclExpUserBViewList( const ScChangeTrack& rChangeTrack );
66 : virtual ~XclExpUserBViewList();
67 :
68 0 : inline iterator begin () { return aViews.begin(); }
69 :
70 0 : inline iterator end () { return aViews.end(); }
71 :
72 : inline const_iterator begin () const { return aViews.begin(); }
73 :
74 : inline const_iterator end () const { return aViews.end(); }
75 :
76 : virtual void Save( XclExpStream& rStrm ) SAL_OVERRIDE;
77 : };
78 :
79 :
80 : // XclExpUsersViewBegin - begin of view block (one per sheet)
81 :
82 0 : class XclExpUsersViewBegin : public ExcRecord
83 : {
84 : private:
85 : sal_uInt8 aGUID[ 16 ];
86 : sal_uInt32 nCurrTab;
87 :
88 : virtual void SaveCont( XclExpStream& rStrm ) SAL_OVERRIDE;
89 :
90 : public:
91 : XclExpUsersViewBegin( const sal_uInt8* pGUID, sal_uInt32 nTab );
92 : virtual sal_uInt16 GetNum() const SAL_OVERRIDE;
93 : virtual sal_Size GetLen() const SAL_OVERRIDE;
94 : };
95 :
96 :
97 : // XclExpUsersViewEnd - end of view block (one per sheet)
98 :
99 0 : class XclExpUsersViewEnd : public ExcRecord
100 : {
101 : private:
102 : virtual void SaveCont( XclExpStream& rStrm ) SAL_OVERRIDE;
103 :
104 : public:
105 : virtual sal_uInt16 GetNum() const SAL_OVERRIDE;
106 : virtual sal_Size GetLen() const SAL_OVERRIDE;
107 : };
108 :
109 :
110 : // dummy record for "User Names" stream
111 :
112 0 : class XclExpChTr0x0191 : public ExcRecord
113 : {
114 : private:
115 : virtual void SaveCont( XclExpStream& rStrm ) SAL_OVERRIDE;
116 :
117 : public:
118 : virtual sal_uInt16 GetNum() const SAL_OVERRIDE;
119 : virtual sal_Size GetLen() const SAL_OVERRIDE;
120 : };
121 :
122 :
123 : // dummy record for "User Names" stream
124 :
125 0 : class XclExpChTr0x0198 : public ExcRecord
126 : {
127 : private:
128 : virtual void SaveCont( XclExpStream& rStrm ) SAL_OVERRIDE;
129 :
130 : public:
131 : virtual sal_uInt16 GetNum() const SAL_OVERRIDE;
132 : virtual sal_Size GetLen() const SAL_OVERRIDE;
133 : };
134 :
135 :
136 : // dummy record for "User Names" stream
137 :
138 0 : class XclExpChTr0x0192 : public ExcRecord
139 : {
140 : private:
141 : virtual void SaveCont( XclExpStream& rStrm ) SAL_OVERRIDE;
142 :
143 : public:
144 : virtual sal_uInt16 GetNum() const SAL_OVERRIDE;
145 : virtual sal_Size GetLen() const SAL_OVERRIDE;
146 : };
147 :
148 :
149 : // dummy record for "User Names" stream
150 :
151 0 : class XclExpChTr0x0197 : public ExcRecord
152 : {
153 : private:
154 : virtual void SaveCont( XclExpStream& rStrm ) SAL_OVERRIDE;
155 :
156 : public:
157 : virtual sal_uInt16 GetNum() const SAL_OVERRIDE;
158 : virtual sal_Size GetLen() const SAL_OVERRIDE;
159 : };
160 :
161 :
162 : // dummy record without content
163 :
164 : class XclExpChTrEmpty : public ExcRecord
165 : {
166 : private:
167 : sal_uInt16 nRecNum;
168 :
169 : public:
170 0 : inline XclExpChTrEmpty( sal_uInt16 nNum ) : nRecNum( nNum ) {}
171 : virtual ~XclExpChTrEmpty();
172 :
173 : virtual sal_uInt16 GetNum() const SAL_OVERRIDE;
174 : virtual sal_Size GetLen() const SAL_OVERRIDE;
175 : };
176 :
177 :
178 : // dummy record for "Revision Log" stream
179 :
180 0 : class XclExpChTr0x0195 : public ExcRecord
181 : {
182 : private:
183 : virtual void SaveCont( XclExpStream& rStrm ) SAL_OVERRIDE;
184 :
185 : public:
186 : virtual ~XclExpChTr0x0195();
187 :
188 : virtual sal_uInt16 GetNum() const SAL_OVERRIDE;
189 : virtual sal_Size GetLen() const SAL_OVERRIDE;
190 : };
191 :
192 :
193 : // dummy record for "Revision Log" stream
194 :
195 : class XclExpChTr0x0194 : public ExcRecord
196 : {
197 : private:
198 : XclExpString sUsername;
199 : DateTime aDateTime;
200 :
201 : virtual void SaveCont( XclExpStream& rStrm ) SAL_OVERRIDE;
202 :
203 : public:
204 : inline XclExpChTr0x0194( const ScChangeTrack& rChangeTrack );
205 : virtual ~XclExpChTr0x0194();
206 :
207 : virtual sal_uInt16 GetNum() const SAL_OVERRIDE;
208 : virtual sal_Size GetLen() const SAL_OVERRIDE;
209 : };
210 :
211 0 : inline XclExpChTr0x0194::XclExpChTr0x0194( const ScChangeTrack& rChangeTrack ) :
212 0 : sUsername( rChangeTrack.GetUser() ),
213 0 : aDateTime( rChangeTrack.GetFixDateTime() )
214 : {
215 0 : }
216 :
217 :
218 : // XclExpChTrHeader - header record, includes action count
219 :
220 : class XclExpChTrHeader : public ExcRecord
221 : {
222 : private:
223 : sal_uInt8 aGUID[ 16 ];
224 : sal_uInt32 nCount;
225 :
226 : virtual void SaveCont( XclExpStream& rStrm ) SAL_OVERRIDE;
227 :
228 : public:
229 0 : inline XclExpChTrHeader() : nCount( 0 ) {}
230 : virtual ~XclExpChTrHeader();
231 :
232 0 : inline void SetGUID( const sal_uInt8* pGUID ) { memcpy( aGUID, pGUID, 16 ); }
233 0 : inline void SetCount( sal_uInt32 nNew ) { nCount = nNew; }
234 :
235 : virtual sal_uInt16 GetNum() const SAL_OVERRIDE;
236 : virtual sal_Size GetLen() const SAL_OVERRIDE;
237 :
238 : virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE;
239 : };
240 :
241 :
242 : // XclExpChTrInfo - header of action group of a user
243 :
244 : class XclExpChTrInfo : public ExcRecord
245 : {
246 : private:
247 : XclExpString sUsername;
248 : sal_Int32 mnLogNumber;
249 : DateTime aDateTime;
250 : sal_uInt8 aGUID[ 16 ];
251 :
252 : virtual void SaveCont( XclExpStream& rStrm ) SAL_OVERRIDE;
253 :
254 : public:
255 : inline XclExpChTrInfo(
256 : const OUString& rUsername,
257 : const DateTime& rDateTime,
258 : const sal_uInt8* pGUID,
259 : sal_Int32 nLogNumber );
260 : virtual ~XclExpChTrInfo();
261 :
262 : virtual sal_uInt16 GetNum() const SAL_OVERRIDE;
263 : virtual sal_Size GetLen() const SAL_OVERRIDE;
264 :
265 : virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE;
266 : };
267 :
268 0 : inline XclExpChTrInfo::XclExpChTrInfo( const OUString& rUsername, const DateTime& rDateTime, const sal_uInt8* pGUID, sal_Int32 nLogNumber ) :
269 : sUsername( rUsername ),
270 : mnLogNumber( nLogNumber ),
271 0 : aDateTime( rDateTime )
272 : {
273 0 : memcpy( aGUID, pGUID, 16 );
274 0 : }
275 :
276 :
277 : // XclExpChTrTabIdBuffer - buffer for tab id's
278 :
279 : class XclExpChTrTabIdBuffer
280 : {
281 : private:
282 : sal_uInt16* pBuffer;
283 : sal_uInt16* pLast;
284 : sal_uInt16 nBufSize;
285 : sal_uInt16 nLastId;
286 :
287 : public:
288 : XclExpChTrTabIdBuffer( sal_uInt16 nCount );
289 : XclExpChTrTabIdBuffer( const XclExpChTrTabIdBuffer& rCopy );
290 : ~XclExpChTrTabIdBuffer();
291 :
292 : void InitFill( sal_uInt16 nIndex );
293 : void InitFillup();
294 :
295 : sal_uInt16 GetId( sal_uInt16 nIndex ) const;
296 : void Remove();
297 :
298 0 : inline sal_uInt16 GetBufferCount() const
299 0 : { return static_cast< sal_uInt16 >( (pLast - pBuffer) + 1 ); }
300 0 : inline void GetBufferCopy( sal_uInt16* pDest ) const
301 0 : { memcpy( pDest, pBuffer, sizeof(sal_uInt16) * GetBufferCount() ); }
302 : };
303 :
304 :
305 : // XclExpChTrTabId - tab id record
306 :
307 : class XclExpChTrTabId : public ExcRecord
308 : {
309 : private:
310 : sal_uInt16* pBuffer;
311 : sal_uInt16 nTabCount;
312 : bool mbInRevisionHeaders;
313 :
314 0 : inline void Clear() { if( pBuffer ) delete[] pBuffer; pBuffer = NULL; }
315 :
316 : virtual void SaveCont( XclExpStream& rStrm ) SAL_OVERRIDE;
317 :
318 : public:
319 0 : inline XclExpChTrTabId( sal_uInt16 nCount ) :
320 0 : pBuffer( NULL ), nTabCount( nCount ), mbInRevisionHeaders( false ) {}
321 : XclExpChTrTabId( const XclExpChTrTabIdBuffer& rBuffer, bool bInRevisionHeaders = false );
322 : virtual ~XclExpChTrTabId();
323 :
324 : void Copy( const XclExpChTrTabIdBuffer& rBuffer );
325 :
326 : virtual sal_uInt16 GetNum() const SAL_OVERRIDE;
327 : virtual sal_Size GetLen() const SAL_OVERRIDE;
328 :
329 : virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE;
330 : };
331 :
332 :
333 : // XclExpChTrAction - base class for action records
334 :
335 : class XclExpChTrAction : public ExcRecord
336 : {
337 : private:
338 : OUString sUsername;
339 : DateTime aDateTime;
340 : sal_uInt32 nIndex; // action number
341 : XclExpChTrAction* pAddAction; // additional record for this action
342 : bool bAccepted;
343 :
344 : protected:
345 : const XclExpTabInfo& rTabInfo; // for table num export (sc num -> xcl num)
346 : const XclExpChTrTabIdBuffer& rIdBuffer; // for table num export (xcl num -> tab id)
347 : sal_uInt32 nLength; // this is not the record size
348 : sal_uInt16 nOpCode; // EXC_CHTR_OP_***
349 : bool bForceInfo;
350 :
351 : XclExpChTrAction( const XclExpChTrAction& rCopy );
352 :
353 : void SetAddAction( XclExpChTrAction* pAction );
354 : void AddDependentContents(
355 : const ScChangeAction& rAction,
356 : const XclExpRoot& rRoot,
357 : ScChangeTrack& rChangeTrack );
358 :
359 : inline void Write2DAddress( XclExpStream& rStrm, const ScAddress& rAddress ) const;
360 : inline void Write2DRange( XclExpStream& rStrm, const ScRange& rRange ) const;
361 : inline sal_uInt16 GetTabId( SCTAB nTabId ) const;
362 : inline void WriteTabId( XclExpStream& rStrm, SCTAB nTabId ) const;
363 :
364 : // save header data, call SaveActionData()
365 : virtual void SaveCont( XclExpStream& rStrm ) SAL_OVERRIDE;
366 0 : inline sal_Size GetHeaderByteCount() const { return 12; }
367 :
368 : // overload to save action data without header, called by SaveCont()
369 : virtual void SaveActionData( XclExpStream& rStrm ) const = 0;
370 : // overload to get action size without header, called by GetLen()
371 : virtual sal_Size GetActionByteCount() const = 0;
372 :
373 : // do something before writing the record
374 : virtual void PrepareSaveAction( XclExpStream& rStrm ) const;
375 : // do something after writing the record
376 : virtual void CompleteSaveAction( XclExpStream& rStrm ) const;
377 :
378 0 : inline sal_uInt32 GetActionNumber() const { return nIndex; }
379 0 : inline bool GetAccepted() const { return bAccepted; }
380 :
381 : public:
382 : XclExpChTrAction(
383 : const ScChangeAction& rAction,
384 : const XclExpRoot& rRoot,
385 : const XclExpChTrTabIdBuffer& rTabIdBuffer,
386 : sal_uInt16 nNewOpCode = EXC_CHTR_OP_UNKNOWN );
387 : virtual ~XclExpChTrAction();
388 :
389 0 : inline const OUString& GetUsername() const { return sUsername; }
390 0 : inline const DateTime& GetDateTime() const { return aDateTime; }
391 0 : inline const XclExpChTrTabIdBuffer& GetTabIdBuffer() const { return rIdBuffer; }
392 0 : inline bool ForceInfoRecord() const { return bForceInfo; }
393 :
394 : // set own index & return new index
395 : // could be overloaded to use more indexes per action
396 : virtual void SetIndex( sal_uInt32& rIndex );
397 :
398 : virtual void Save( XclExpStream& rStrm ) SAL_OVERRIDE;
399 : virtual sal_Size GetLen() const SAL_OVERRIDE;
400 :
401 0 : inline XclExpChTrAction* GetAddAction() { return pAddAction; }
402 : };
403 :
404 0 : inline void XclExpChTrAction::Write2DAddress( XclExpStream& rStrm, const ScAddress& rAddress ) const
405 : {
406 0 : rStrm << (sal_uInt16) rAddress.Row()
407 0 : << (sal_uInt16) rAddress.Col();
408 0 : }
409 :
410 0 : inline void XclExpChTrAction::Write2DRange( XclExpStream& rStrm, const ScRange& rRange ) const
411 : {
412 0 : rStrm << (sal_uInt16) rRange.aStart.Row()
413 0 : << (sal_uInt16) rRange.aEnd.Row()
414 0 : << (sal_uInt16) rRange.aStart.Col()
415 0 : << (sal_uInt16) rRange.aEnd.Col();
416 0 : }
417 :
418 0 : inline sal_uInt16 XclExpChTrAction::GetTabId( SCTAB nTab ) const
419 : {
420 0 : return rIdBuffer.GetId( rTabInfo.GetXclTab( nTab ) );
421 : }
422 :
423 0 : inline void XclExpChTrAction::WriteTabId( XclExpStream& rStrm, SCTAB nTab ) const
424 : {
425 0 : rStrm << GetTabId( nTab );
426 0 : }
427 :
428 :
429 : // XclExpChTrData - cell content itself
430 :
431 : struct XclExpChTrData
432 : {
433 : XclExpString* pString;
434 : XclExpStringRef mpFormattedString;
435 : const ScFormulaCell* mpFormulaCell;
436 : XclTokenArrayRef mxTokArr;
437 : XclExpRefLog maRefLog;
438 : double fValue;
439 : sal_Int32 nRKValue;
440 : sal_uInt16 nType;
441 : sal_Size nSize;
442 :
443 : XclExpChTrData();
444 : ~XclExpChTrData();
445 : void Clear();
446 :
447 : void WriteFormula(
448 : XclExpStream& rStrm,
449 : const XclExpChTrTabIdBuffer& rTabIdBuffer );
450 : void Write(
451 : XclExpStream& rStrm,
452 : const XclExpChTrTabIdBuffer& rTabIdBuffer );
453 : };
454 :
455 :
456 : // XclExpChTrCellContent - changed cell content
457 :
458 : class XclExpChTrCellContent : public XclExpChTrAction, protected XclExpRoot
459 : {
460 : private:
461 : XclExpChTrData* pOldData;
462 : XclExpChTrData* pNewData;
463 : sal_uInt16 nOldLength; // this is not the record size
464 :
465 : void MakeEmptyChTrData( XclExpChTrData*& rpData );
466 :
467 : protected:
468 : ScAddress aPosition;
469 :
470 : void GetCellData(
471 : const XclExpRoot& rRoot, const ScCellValue& rScCell, XclExpChTrData*& rpData,
472 : sal_uInt32& rXclLength1, sal_uInt16& rXclLength2 );
473 :
474 : virtual void SaveActionData( XclExpStream& rStrm ) const SAL_OVERRIDE;
475 :
476 : public:
477 : XclExpChTrCellContent(
478 : const ScChangeActionContent& rAction,
479 : const XclExpRoot& rRoot,
480 : const XclExpChTrTabIdBuffer& rTabIdBuffer );
481 : virtual ~XclExpChTrCellContent();
482 :
483 : virtual sal_uInt16 GetNum() const SAL_OVERRIDE;
484 : virtual sal_Size GetActionByteCount() const SAL_OVERRIDE;
485 :
486 : virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE;
487 : };
488 :
489 :
490 : // XclExpChTrInsert - insert/delete columns/rows
491 :
492 : class XclExpChTrInsert : public XclExpChTrAction
493 : {
494 : protected:
495 : ScRange aRange;
496 :
497 0 : XclExpChTrInsert( const XclExpChTrInsert& rCopy ) :
498 0 : XclExpChTrAction( rCopy ), aRange( rCopy.aRange ) {}
499 :
500 : virtual void SaveActionData( XclExpStream& rStrm ) const SAL_OVERRIDE;
501 : virtual void PrepareSaveAction( XclExpStream& rStrm ) const SAL_OVERRIDE;
502 : virtual void CompleteSaveAction( XclExpStream& rStrm ) const SAL_OVERRIDE;
503 :
504 : public:
505 : XclExpChTrInsert(
506 : const ScChangeAction& rAction,
507 : const XclExpRoot& rRoot,
508 : const XclExpChTrTabIdBuffer& rTabIdBuffer,
509 : ScChangeTrack& rChangeTrack );
510 : virtual ~XclExpChTrInsert();
511 :
512 : virtual sal_uInt16 GetNum() const SAL_OVERRIDE;
513 : virtual sal_Size GetActionByteCount() const SAL_OVERRIDE;
514 :
515 : virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE;
516 : };
517 :
518 :
519 : // XclExpChTrInsertTab - insert table
520 :
521 : class XclExpChTrInsertTab : public XclExpChTrAction, protected XclExpRoot
522 : {
523 : private:
524 : SCTAB nTab;
525 :
526 : protected:
527 : virtual void SaveActionData( XclExpStream& rStrm ) const SAL_OVERRIDE;
528 :
529 : public:
530 : XclExpChTrInsertTab(
531 : const ScChangeAction& rAction,
532 : const XclExpRoot& rRoot,
533 : const XclExpChTrTabIdBuffer& rTabIdBuffer );
534 : virtual ~XclExpChTrInsertTab();
535 :
536 : virtual sal_uInt16 GetNum() const SAL_OVERRIDE;
537 : virtual sal_Size GetActionByteCount() const SAL_OVERRIDE;
538 :
539 : virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE;
540 : };
541 :
542 :
543 : // XclExpChTrMoveRange - move cell range
544 :
545 : class XclExpChTrMoveRange : public XclExpChTrAction
546 : {
547 : protected:
548 : ScRange aSourceRange;
549 : ScRange aDestRange;
550 :
551 : virtual void SaveActionData( XclExpStream& rStrm ) const SAL_OVERRIDE;
552 : virtual void PrepareSaveAction( XclExpStream& rStrm ) const SAL_OVERRIDE;
553 : virtual void CompleteSaveAction( XclExpStream& rStrm ) const SAL_OVERRIDE;
554 :
555 : public:
556 : XclExpChTrMoveRange(
557 : const ScChangeActionMove& rAction,
558 : const XclExpRoot& rRoot,
559 : const XclExpChTrTabIdBuffer& rTabIdBuffer,
560 : ScChangeTrack& rChangeTrack );
561 : virtual ~XclExpChTrMoveRange();
562 :
563 : virtual sal_uInt16 GetNum() const SAL_OVERRIDE;
564 : virtual sal_Size GetActionByteCount() const SAL_OVERRIDE;
565 :
566 : virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE;
567 : };
568 :
569 :
570 : // XclExpChTr0x019A - additional data for delete action
571 :
572 : class XclExpChTr0x014A : public XclExpChTrInsert
573 : {
574 : protected:
575 : virtual void SaveActionData( XclExpStream& rStrm ) const SAL_OVERRIDE;
576 :
577 : public:
578 : XclExpChTr0x014A( const XclExpChTrInsert& rAction );
579 : virtual ~XclExpChTr0x014A();
580 :
581 : virtual sal_uInt16 GetNum() const SAL_OVERRIDE;
582 : virtual sal_Size GetActionByteCount() const SAL_OVERRIDE;
583 :
584 : virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE;
585 : };
586 :
587 :
588 : // XclExpChangeTrack - exports the "Revision Log" stream
589 :
590 : class XclExpChangeTrack : protected XclExpRoot
591 : {
592 : private:
593 : std::vector<ExcRecord*> aRecList; // list of "Revision Log" stream records
594 : std::stack<XclExpChTrAction*> aActionStack;
595 : XclExpChTrTabIdBuffer* pTabIdBuffer;
596 : std::vector<XclExpChTrTabIdBuffer*> maBuffers;
597 :
598 : ScDocument* pTempDoc; // empty document
599 :
600 : XclExpChTrHeader* pHeader; // header record for last GUID
601 : sal_uInt8 aGUID[ 16 ]; // GUID for action info records
602 : bool bValidGUID;
603 :
604 : ScChangeTrack* CreateTempChangeTrack();
605 : void PushActionRecord( const ScChangeAction& rAction );
606 :
607 : bool WriteUserNamesStream();
608 :
609 : public:
610 : XclExpChangeTrack( const XclExpRoot& rRoot );
611 : virtual ~XclExpChangeTrack();
612 :
613 : void Write();
614 : void WriteXml( XclExpXmlStream& rStrm );
615 : };
616 :
617 : #endif
618 :
619 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|