summaryrefslogtreecommitdiff
path: root/sc/source/filter/inc/XclExpChangeTrack.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/filter/inc/XclExpChangeTrack.hxx')
-rw-r--r--sc/source/filter/inc/XclExpChangeTrack.hxx679
1 files changed, 679 insertions, 0 deletions
diff --git a/sc/source/filter/inc/XclExpChangeTrack.hxx b/sc/source/filter/inc/XclExpChangeTrack.hxx
new file mode 100644
index 000000000000..29799635aa2b
--- /dev/null
+++ b/sc/source/filter/inc/XclExpChangeTrack.hxx
@@ -0,0 +1,679 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef SC_XCLEXPCHANGETRACK_HXX
+#define SC_XCLEXPCHANGETRACK_HXX
+
+#include <tools/debug.hxx>
+#include <tools/datetime.hxx>
+#include <rtl/uuid.h>
+#include "bigrange.hxx"
+#include "chgtrack.hxx"
+#include "xelink.hxx"
+#include "ftools.hxx"
+#include "excrecds.hxx"
+
+//___________________________________________________________________
+
+class ScBaseCell;
+
+//___________________________________________________________________
+// XclExpUserBView - one UserBView record for each user
+
+class XclExpUserBView : public ExcRecord
+{
+private:
+ XclExpString sUsername;
+ sal_uInt8 aGUID[ 16 ];
+
+ virtual void SaveCont( XclExpStream& rStrm );
+
+public:
+ XclExpUserBView( const String& rUsername, const sal_uInt8* pGUID );
+
+ inline const sal_uInt8* GetGUID() const { return aGUID; }
+
+ virtual sal_uInt16 GetNum() const;
+ virtual sal_Size GetLen() const;
+};
+
+//___________________________________________________________________
+// XclExpUserBViewList - list of UserBView records
+
+class XclExpUserBViewList : public ExcEmptyRec, private List
+{
+private:
+ inline XclExpUserBView* _First() { return (XclExpUserBView*) List::First(); }
+ inline XclExpUserBView* _Next() { return (XclExpUserBView*) List::Next(); }
+
+public:
+ XclExpUserBViewList( const ScChangeTrack& rChangeTrack );
+ virtual ~XclExpUserBViewList();
+
+ inline const XclExpUserBView* First() { return (const XclExpUserBView*) List::First(); }
+ inline const XclExpUserBView* Next() { return (const XclExpUserBView*) List::Next(); }
+
+ virtual void Save( XclExpStream& rStrm );
+};
+
+//___________________________________________________________________
+// XclExpUsersViewBegin - begin of view block (one per sheet)
+
+class XclExpUsersViewBegin : public ExcRecord
+{
+private:
+ sal_uInt8 aGUID[ 16 ];
+ sal_uInt32 nCurrTab;
+
+ virtual void SaveCont( XclExpStream& rStrm );
+
+public:
+ XclExpUsersViewBegin( const sal_uInt8* pGUID, sal_uInt32 nTab );
+ virtual sal_uInt16 GetNum() const;
+ virtual sal_Size GetLen() const;
+};
+
+//___________________________________________________________________
+// XclExpUsersViewEnd - end of view block (one per sheet)
+
+class XclExpUsersViewEnd : public ExcRecord
+{
+private:
+ virtual void SaveCont( XclExpStream& rStrm );
+
+public:
+ virtual sal_uInt16 GetNum() const;
+ virtual sal_Size GetLen() const;
+};
+
+//___________________________________________________________________
+// dummy record for "User Names" stream
+
+class XclExpChTr0x0191 : public ExcRecord
+{
+private:
+ virtual void SaveCont( XclExpStream& rStrm );
+
+public:
+ virtual sal_uInt16 GetNum() const;
+ virtual sal_Size GetLen() const;
+};
+
+//___________________________________________________________________
+// dummy record for "User Names" stream
+
+class XclExpChTr0x0198 : public ExcRecord
+{
+private:
+ virtual void SaveCont( XclExpStream& rStrm );
+
+public:
+ virtual sal_uInt16 GetNum() const;
+ virtual sal_Size GetLen() const;
+};
+
+//___________________________________________________________________
+// dummy record for "User Names" stream
+
+class XclExpChTr0x0192 : public ExcRecord
+{
+private:
+ virtual void SaveCont( XclExpStream& rStrm );
+
+public:
+ virtual sal_uInt16 GetNum() const;
+ virtual sal_Size GetLen() const;
+};
+
+//___________________________________________________________________
+// dummy record for "User Names" stream
+
+class XclExpChTr0x0197 : public ExcRecord
+{
+private:
+ virtual void SaveCont( XclExpStream& rStrm );
+
+public:
+ virtual sal_uInt16 GetNum() const;
+ virtual sal_Size GetLen() const;
+};
+
+//___________________________________________________________________
+// dummy record without content
+
+class XclExpChTrEmpty : public ExcRecord
+{
+private:
+ sal_uInt16 nRecNum;
+
+public:
+ inline XclExpChTrEmpty( sal_uInt16 nNum ) : nRecNum( nNum ) {}
+ virtual ~XclExpChTrEmpty();
+
+ virtual sal_uInt16 GetNum() const;
+ virtual sal_Size GetLen() const;
+};
+
+//___________________________________________________________________
+// dummy record for "Revision Log" stream
+
+class XclExpChTr0x0195 : public ExcRecord
+{
+private:
+ virtual void SaveCont( XclExpStream& rStrm );
+
+public:
+ virtual ~XclExpChTr0x0195();
+
+ virtual sal_uInt16 GetNum() const;
+ virtual sal_Size GetLen() const;
+};
+
+//___________________________________________________________________
+// dummy record for "Revision Log" stream
+
+class XclExpChTr0x0194 : public ExcRecord
+{
+private:
+ XclExpString sUsername;
+ DateTime aDateTime;
+
+ virtual void SaveCont( XclExpStream& rStrm );
+
+public:
+ inline XclExpChTr0x0194( const ScChangeTrack& rChangeTrack );
+ virtual ~XclExpChTr0x0194();
+
+ virtual sal_uInt16 GetNum() const;
+ virtual sal_Size GetLen() const;
+};
+
+inline XclExpChTr0x0194::XclExpChTr0x0194( const ScChangeTrack& rChangeTrack ) :
+ sUsername( rChangeTrack.GetUser() ),
+ aDateTime( rChangeTrack.GetFixDateTime() )
+{
+}
+
+//___________________________________________________________________
+// XclExpChTrHeader - header record, includes action count
+
+class XclExpChTrHeader : public ExcRecord
+{
+private:
+ sal_uInt8 aGUID[ 16 ];
+ sal_uInt32 nCount;
+
+ virtual void SaveCont( XclExpStream& rStrm );
+
+public:
+ inline XclExpChTrHeader() : nCount( 0 ) {}
+ virtual ~XclExpChTrHeader();
+
+ inline void SetGUID( const sal_uInt8* pGUID ) { memcpy( aGUID, pGUID, 16 ); }
+ inline void SetCount( sal_uInt32 nNew ) { nCount = nNew; }
+
+ virtual sal_uInt16 GetNum() const;
+ virtual sal_Size GetLen() const;
+
+ virtual void SaveXml( XclExpXmlStream& rStrm );
+};
+
+//___________________________________________________________________
+// XclExpChTrInfo - header of action group of a user
+
+class XclExpChTrInfo : public ExcRecord
+{
+private:
+ XclExpString sUsername;
+ sal_Int32 mnLogNumber;
+ DateTime aDateTime;
+ sal_uInt8 aGUID[ 16 ];
+
+ virtual void SaveCont( XclExpStream& rStrm );
+
+public:
+ inline XclExpChTrInfo(
+ const String& rUsername,
+ const DateTime& rDateTime,
+ const sal_uInt8* pGUID,
+ sal_Int32 nLogNumber );
+ virtual ~XclExpChTrInfo();
+
+ virtual sal_uInt16 GetNum() const;
+ virtual sal_Size GetLen() const;
+
+ virtual void SaveXml( XclExpXmlStream& rStrm );
+};
+
+inline XclExpChTrInfo::XclExpChTrInfo( const String& rUsername, const DateTime& rDateTime, const sal_uInt8* pGUID, sal_Int32 nLogNumber ) :
+ sUsername( rUsername ),
+ mnLogNumber( nLogNumber ),
+ aDateTime( rDateTime )
+{
+ memcpy( aGUID, pGUID, 16 );
+}
+
+//___________________________________________________________________
+// XclExpChTrTabIdBuffer - buffer for tab id's
+
+class XclExpChTrTabIdBuffer
+{
+private:
+ sal_uInt16* pBuffer;
+ sal_uInt16* pLast;
+ sal_uInt16 nBufSize;
+ sal_uInt16 nLastId;
+
+public:
+ XclExpChTrTabIdBuffer( sal_uInt16 nCount );
+ XclExpChTrTabIdBuffer( const XclExpChTrTabIdBuffer& rCopy );
+ ~XclExpChTrTabIdBuffer();
+
+ void InitFill( sal_uInt16 nIndex );
+ void InitFillup();
+
+ sal_uInt16 GetId( sal_uInt16 nIndex ) const;
+ void Remove();
+
+ inline sal_uInt16 GetBufferCount() const
+ { return static_cast< sal_uInt16 >( (pLast - pBuffer) + 1 ); }
+ inline void GetBufferCopy( sal_uInt16* pDest ) const
+ { memcpy( pDest, pBuffer, sizeof(sal_uInt16) * GetBufferCount() ); }
+};
+
+//___________________________________________________________________
+// XclExpChTrTabIdBufferList
+
+class XclExpChTrTabIdBufferList : private List
+{
+private:
+ inline XclExpChTrTabIdBuffer* First() { return (XclExpChTrTabIdBuffer*) List::First(); }
+ inline XclExpChTrTabIdBuffer* Next() { return (XclExpChTrTabIdBuffer*) List::Next(); }
+
+public:
+ virtual ~XclExpChTrTabIdBufferList();
+
+ inline void Append( XclExpChTrTabIdBuffer* pNew )
+ { List::Insert( pNew, LIST_APPEND ); }
+};
+
+//___________________________________________________________________
+// XclExpChTrTabId - tab id record
+
+class XclExpChTrTabId : public ExcRecord
+{
+private:
+ sal_uInt16* pBuffer;
+ sal_uInt16 nTabCount;
+ bool mbInRevisionHeaders;
+
+ inline void Clear() { if( pBuffer ) delete[] pBuffer; pBuffer = NULL; }
+
+ virtual void SaveCont( XclExpStream& rStrm );
+
+public:
+ inline XclExpChTrTabId( sal_uInt16 nCount ) :
+ pBuffer( NULL ), nTabCount( nCount ), mbInRevisionHeaders( false ) {}
+ XclExpChTrTabId( const XclExpChTrTabIdBuffer& rBuffer, bool bInRevisionHeaders = false );
+ virtual ~XclExpChTrTabId();
+
+ void Copy( const XclExpChTrTabIdBuffer& rBuffer );
+
+ virtual sal_uInt16 GetNum() const;
+ virtual sal_Size GetLen() const;
+
+ virtual void SaveXml( XclExpXmlStream& rStrm );
+};
+
+//___________________________________________________________________
+// XclExpChTrAction - base class for action records
+
+class XclExpChTrAction : public ExcRecord
+{
+private:
+ String sUsername;
+ DateTime aDateTime;
+ sal_uInt32 nIndex; // action number
+ XclExpChTrAction* pAddAction; // additional record for this action
+ sal_Bool bAccepted;
+
+protected:
+ const XclExpTabInfo& rTabInfo; // for table num export (sc num -> xcl num)
+ const XclExpChTrTabIdBuffer& rIdBuffer; // for table num export (xcl num -> tab id)
+ sal_uInt32 nLength; // this is not the record size
+ sal_uInt16 nOpCode; // EXC_CHTR_OP_***
+ sal_Bool bForceInfo;
+
+ XclExpChTrAction( const XclExpChTrAction& rCopy );
+
+ void SetAddAction( XclExpChTrAction* pAction );
+ void AddDependentContents(
+ const ScChangeAction& rAction,
+ const XclExpRoot& rRoot,
+ ScChangeTrack& rChangeTrack );
+
+ inline void Write2DAddress( XclExpStream& rStrm, const ScAddress& rAddress ) const;
+ inline void Write2DRange( XclExpStream& rStrm, const ScRange& rRange ) const;
+ inline sal_uInt16 GetTabId( SCTAB nTabId ) const;
+ inline void WriteTabId( XclExpStream& rStrm, SCTAB nTabId ) const;
+
+ // save header data, call SaveActionData()
+ virtual void SaveCont( XclExpStream& rStrm );
+ inline sal_Size GetHeaderByteCount() const { return 12; }
+
+ // overload to save action data without header, called by SaveCont()
+ virtual void SaveActionData( XclExpStream& rStrm ) const = 0;
+ // overload to get action size without header, called by GetLen()
+ virtual sal_Size GetActionByteCount() const = 0;
+
+ // do something before writing the record
+ virtual void PrepareSaveAction( XclExpStream& rStrm ) const;
+ // do something after writing the record
+ virtual void CompleteSaveAction( XclExpStream& rStrm ) const;
+
+ inline sal_uInt32 GetActionNumber() const { return nIndex; }
+ inline sal_Bool GetAccepted() const { return bAccepted; }
+
+public:
+ XclExpChTrAction(
+ const ScChangeAction& rAction,
+ const XclExpRoot& rRoot,
+ const XclExpChTrTabIdBuffer& rTabIdBuffer,
+ sal_uInt16 nNewOpCode = EXC_CHTR_OP_UNKNOWN );
+ virtual ~XclExpChTrAction();
+
+ inline const String& GetUsername() const { return sUsername; }
+ inline const DateTime& GetDateTime() const { return aDateTime; }
+ inline const XclExpChTrTabIdBuffer& GetTabIdBuffer() const { return rIdBuffer; }
+ inline sal_Bool ForceInfoRecord() const { return bForceInfo; }
+
+ // set own index & return new index
+ // could be overloaded to use more indexes per action
+ virtual void SetIndex( sal_uInt32& rIndex );
+
+ virtual void Save( XclExpStream& rStrm );
+ virtual sal_Size GetLen() const;
+
+ inline XclExpChTrAction* GetAddAction() { return pAddAction; }
+};
+
+inline void XclExpChTrAction::Write2DAddress( XclExpStream& rStrm, const ScAddress& rAddress ) const
+{
+ rStrm << (sal_uInt16) rAddress.Row()
+ << (sal_uInt16) rAddress.Col();
+}
+
+inline void XclExpChTrAction::Write2DRange( XclExpStream& rStrm, const ScRange& rRange ) const
+{
+ rStrm << (sal_uInt16) rRange.aStart.Row()
+ << (sal_uInt16) rRange.aEnd.Row()
+ << (sal_uInt16) rRange.aStart.Col()
+ << (sal_uInt16) rRange.aEnd.Col();
+}
+
+inline sal_uInt16 XclExpChTrAction::GetTabId( SCTAB nTab ) const
+{
+ return rIdBuffer.GetId( rTabInfo.GetXclTab( nTab ) );
+}
+
+inline void XclExpChTrAction::WriteTabId( XclExpStream& rStrm, SCTAB nTab ) const
+{
+ rStrm << GetTabId( nTab );
+}
+
+//___________________________________________________________________
+// XclExpChTrData - cell content itself
+
+struct XclExpChTrData
+{
+ XclExpString* pString;
+ XclExpStringRef mpFormattedString;
+ const ScFormulaCell* mpFormulaCell;
+ XclTokenArrayRef mxTokArr;
+ XclExpRefLog maRefLog;
+ double fValue;
+ sal_Int32 nRKValue;
+ sal_uInt16 nType;
+ sal_Size nSize;
+
+ XclExpChTrData();
+ ~XclExpChTrData();
+ void Clear();
+
+ void WriteFormula(
+ XclExpStream& rStrm,
+ const XclExpChTrTabIdBuffer& rTabIdBuffer );
+ void Write(
+ XclExpStream& rStrm,
+ const XclExpChTrTabIdBuffer& rTabIdBuffer );
+};
+
+//___________________________________________________________________
+// XclExpChTrCellContent - changed cell content
+
+class XclExpChTrCellContent : public XclExpChTrAction, protected XclExpRoot
+{
+private:
+ XclExpChTrData* pOldData;
+ XclExpChTrData* pNewData;
+ sal_uInt16 nOldLength; // this is not the record size
+
+ void MakeEmptyChTrData( XclExpChTrData*& rpData );
+
+protected:
+ ScAddress aPosition;
+
+ void GetCellData(
+ const XclExpRoot& rRoot,
+ const ScBaseCell* pScCell,
+ XclExpChTrData*& rpData,
+ sal_uInt32& rXclLength1,
+ sal_uInt16& rXclLength2 );
+
+ virtual void SaveActionData( XclExpStream& rStrm ) const;
+
+public:
+ XclExpChTrCellContent(
+ const ScChangeActionContent& rAction,
+ const XclExpRoot& rRoot,
+ const XclExpChTrTabIdBuffer& rTabIdBuffer );
+ virtual ~XclExpChTrCellContent();
+
+ virtual sal_uInt16 GetNum() const;
+ virtual sal_Size GetActionByteCount() const;
+
+ virtual void SaveXml( XclExpXmlStream& rStrm );
+};
+
+//___________________________________________________________________
+// XclExpChTrInsert - insert/delete columns/rows
+
+class XclExpChTrInsert : public XclExpChTrAction
+{
+protected:
+ ScRange aRange;
+
+ XclExpChTrInsert( const XclExpChTrInsert& rCopy ) :
+ XclExpChTrAction( rCopy ), aRange( rCopy.aRange ) {}
+
+ virtual void SaveActionData( XclExpStream& rStrm ) const;
+ virtual void PrepareSaveAction( XclExpStream& rStrm ) const;
+ virtual void CompleteSaveAction( XclExpStream& rStrm ) const;
+
+public:
+ XclExpChTrInsert(
+ const ScChangeAction& rAction,
+ const XclExpRoot& rRoot,
+ const XclExpChTrTabIdBuffer& rTabIdBuffer,
+ ScChangeTrack& rChangeTrack );
+ virtual ~XclExpChTrInsert();
+
+ virtual sal_uInt16 GetNum() const;
+ virtual sal_Size GetActionByteCount() const;
+
+ virtual void SaveXml( XclExpXmlStream& rStrm );
+};
+
+//___________________________________________________________________
+// XclExpChTrInsertTab - insert table
+
+class XclExpChTrInsertTab : public XclExpChTrAction, protected XclExpRoot
+{
+private:
+ SCTAB nTab;
+
+protected:
+ virtual void SaveActionData( XclExpStream& rStrm ) const;
+
+public:
+ XclExpChTrInsertTab(
+ const ScChangeAction& rAction,
+ const XclExpRoot& rRoot,
+ const XclExpChTrTabIdBuffer& rTabIdBuffer );
+ virtual ~XclExpChTrInsertTab();
+
+ virtual sal_uInt16 GetNum() const;
+ virtual sal_Size GetActionByteCount() const;
+
+ virtual void SaveXml( XclExpXmlStream& rStrm );
+};
+
+//___________________________________________________________________
+// XclExpChTrMoveRange - move cell range
+
+class XclExpChTrMoveRange : public XclExpChTrAction
+{
+protected:
+ ScRange aSourceRange;
+ ScRange aDestRange;
+
+ virtual void SaveActionData( XclExpStream& rStrm ) const;
+ virtual void PrepareSaveAction( XclExpStream& rStrm ) const;
+ virtual void CompleteSaveAction( XclExpStream& rStrm ) const;
+
+public:
+ XclExpChTrMoveRange(
+ const ScChangeActionMove& rAction,
+ const XclExpRoot& rRoot,
+ const XclExpChTrTabIdBuffer& rTabIdBuffer,
+ ScChangeTrack& rChangeTrack );
+ virtual ~XclExpChTrMoveRange();
+
+ virtual sal_uInt16 GetNum() const;
+ virtual sal_Size GetActionByteCount() const;
+
+ virtual void SaveXml( XclExpXmlStream& rStrm );
+};
+
+//___________________________________________________________________
+// XclExpChTr0x019A - additional data for delete action
+
+class XclExpChTr0x014A : public XclExpChTrInsert
+{
+protected:
+ virtual void SaveActionData( XclExpStream& rStrm ) const;
+
+public:
+ XclExpChTr0x014A( const XclExpChTrInsert& rAction );
+ virtual ~XclExpChTr0x014A();
+
+ virtual sal_uInt16 GetNum() const;
+ virtual sal_Size GetActionByteCount() const;
+
+ virtual void SaveXml( XclExpXmlStream& rStrm );
+};
+
+//___________________________________________________________________
+// XclExpChTrActionStack - temporary action stack
+
+class XclExpChTrActionStack : private Stack
+{
+public:
+ virtual ~XclExpChTrActionStack();
+
+ void Push( XclExpChTrAction* pNewRec );
+ inline XclExpChTrAction* Pop() { return (XclExpChTrAction*) Stack::Pop(); }
+
+private:
+ using Stack::Push;
+};
+
+//___________________________________________________________________
+// XclExpChTrRecordList - list of "Revision Log" stream records
+
+class XclExpChTrRecordList : private List
+{
+private:
+ inline ExcRecord* First() { return (ExcRecord*) List::First(); }
+ inline ExcRecord* Next() { return (ExcRecord*) List::Next(); }
+
+public:
+ virtual ~XclExpChTrRecordList();
+
+ using List::Count;
+ void Append( ExcRecord* pNewRec );
+ void Save( XclExpStream& rStrm );
+ void SaveXml( XclExpXmlStream& rStrm );
+};
+
+//___________________________________________________________________
+// XclExpChangeTrack - exports the "Revision Log" stream
+
+class XclExpChangeTrack : protected XclExpRoot
+{
+private:
+ XclExpChTrRecordList aRecList;
+ XclExpChTrActionStack aActionStack;
+ XclExpChTrTabIdBufferList aTabIdBufferList;
+ XclExpChTrTabIdBuffer* pTabIdBuffer;
+
+ ScDocument* pTempDoc; // empty document
+
+ sal_uInt32 nNewAction; // action number, 1-based
+ XclExpChTrHeader* pHeader; // header record for last GUID
+ sal_uInt8 aGUID[ 16 ]; // GUID for action info records
+ sal_Bool bValidGUID;
+
+ ScChangeTrack* CreateTempChangeTrack();
+ void PushActionRecord( const ScChangeAction& rAction );
+
+ sal_Bool WriteUserNamesStream();
+
+public:
+ XclExpChangeTrack( const XclExpRoot& rRoot );
+ ~XclExpChangeTrack();
+
+ void Write();
+ void WriteXml( XclExpXmlStream& rStrm );
+};
+
+//___________________________________________________________________
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */