LCOV - code coverage report
Current view: top level - libreoffice/sc/inc - chgtrack.hxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 222 0.0 %
Date: 2012-12-27 Functions: 0 126 0.0 %
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             : #ifndef SC_CHGTRACK_HXX
      21             : #define SC_CHGTRACK_HXX
      22             : 
      23             : #include <deque>
      24             : #include <map>
      25             : #include <set>
      26             : #include <stack>
      27             : 
      28             : #include <tools/datetime.hxx>
      29             : #include <tools/mempool.hxx>
      30             : #include <unotools/options.hxx>
      31             : #include "global.hxx"
      32             : #include "bigrange.hxx"
      33             : #include "scdllapi.h"
      34             : 
      35             : #ifdef SC_CHGTRACK_CXX
      36             : // core/inc
      37             : #include "refupdat.hxx"
      38             : #endif
      39             : 
      40             : class ScBaseCell;
      41             : class ScDocument;
      42             : 
      43             : 
      44             : enum ScChangeActionType
      45             : {
      46             :     SC_CAT_NONE,
      47             :     SC_CAT_INSERT_COLS,
      48             :     SC_CAT_INSERT_ROWS,
      49             :     SC_CAT_INSERT_TABS,
      50             :     SC_CAT_DELETE_COLS,
      51             :     SC_CAT_DELETE_ROWS,
      52             :     SC_CAT_DELETE_TABS,
      53             :     SC_CAT_MOVE,
      54             :     SC_CAT_CONTENT,
      55             :     SC_CAT_REJECT
      56             : };
      57             : 
      58             : 
      59             : enum ScChangeActionState
      60             : {
      61             :     SC_CAS_VIRGIN,
      62             :     SC_CAS_ACCEPTED,
      63             :     SC_CAS_REJECTED
      64             : };
      65             : 
      66             : 
      67             : enum ScChangeActionClipMode
      68             : {
      69             :     SC_CACM_NONE,
      70             :     SC_CACM_CUT,
      71             :     SC_CACM_COPY,
      72             :     SC_CACM_PASTE
      73             : };
      74             : 
      75             : // --- ScChangeActionLinkEntry ---------------------------------------------
      76             : 
      77             : // Inserts itself as the head of a chain (better: linked list?), or before a LinkEntry
      78             : // on delete: automatically remove of what is linked (German original was strange...)
      79             : // ppPrev == &previous->pNext oder address of pointer to head of linked list,
      80             : // *ppPrev == this
      81             : 
      82             : class ScChangeAction;
      83             : 
      84             : class ScChangeActionLinkEntry
      85             : {
      86             :     // not implemented, prevent usage
      87             :     ScChangeActionLinkEntry( const ScChangeActionLinkEntry& );
      88             :     ScChangeActionLinkEntry& operator=( const ScChangeActionLinkEntry& );
      89             : 
      90             : protected:
      91             : 
      92             :     ScChangeActionLinkEntry*    pNext;
      93             :     ScChangeActionLinkEntry**   ppPrev;
      94             :     ScChangeAction*             pAction;
      95             :     ScChangeActionLinkEntry*    pLink;
      96             : 
      97             : public:
      98             : 
      99           0 :     DECL_FIXEDMEMPOOL_NEWDEL( ScChangeActionLinkEntry )
     100             : 
     101           0 :     ScChangeActionLinkEntry(
     102             :             ScChangeActionLinkEntry** ppPrevP,
     103             :             ScChangeAction* pActionP )
     104             :         :   pNext( *ppPrevP ),
     105             :             ppPrev( ppPrevP ),
     106             :             pAction( pActionP ),
     107           0 :             pLink( NULL )
     108             :         {
     109           0 :             if ( pNext )
     110           0 :                 pNext->ppPrev = &pNext;
     111           0 :             *ppPrevP = this;
     112           0 :         }
     113             : 
     114           0 :     virtual ~ScChangeActionLinkEntry()
     115           0 :     {
     116           0 :         ScChangeActionLinkEntry* p = pLink;
     117           0 :         UnLink();
     118           0 :         Remove();
     119           0 :         if ( p )
     120           0 :             delete p;
     121           0 :     }
     122             : 
     123           0 :     void SetLink( ScChangeActionLinkEntry* pLinkP )
     124             :     {
     125           0 :         UnLink();
     126           0 :         if ( pLinkP )
     127             :         {
     128           0 :             pLink = pLinkP;
     129           0 :             pLinkP->pLink = this;
     130             :         }
     131           0 :     }
     132             : 
     133           0 :     void UnLink()
     134             :     {
     135           0 :         if ( pLink )
     136             :         {
     137           0 :             pLink->pLink = NULL;
     138           0 :             pLink = NULL;
     139             :         }
     140           0 :     }
     141             : 
     142           0 :     void Remove()
     143             :     {
     144           0 :         if ( ppPrev )
     145             :         {
     146           0 :             if ( ( *ppPrev = pNext ) != NULL )
     147           0 :                 pNext->ppPrev = ppPrev;
     148           0 :             ppPrev = NULL;  // not inserted
     149             :         }
     150           0 :     }
     151             : 
     152             :     void Insert( ScChangeActionLinkEntry** ppPrevP )
     153             :     {
     154             :         if ( !ppPrev )
     155             :         {
     156             :             ppPrev = ppPrevP;
     157             :             if ( (pNext = *ppPrevP) )
     158             :                 pNext->ppPrev = &pNext;
     159             :             *ppPrevP = this;
     160             :         }
     161             :     }
     162             : 
     163             :     const ScChangeActionLinkEntry*  GetLink() const     { return pLink; }
     164             :     ScChangeActionLinkEntry*        GetLink()           { return pLink; }
     165           0 :     const ScChangeActionLinkEntry*  GetNext() const     { return pNext; }
     166           0 :     ScChangeActionLinkEntry*        GetNext()           { return pNext; }
     167           0 :     const ScChangeAction*           GetAction() const   { return pAction; }
     168           0 :     ScChangeAction*                 GetAction()         { return pAction; }
     169             : };
     170             : 
     171             : // --- ScChangeActionCellListEntry -----------------------------------------
     172             : // this is only for the XML Export in the hxx
     173             : class ScChangeActionContent;
     174             : 
     175             : class ScChangeActionCellListEntry
     176             : {
     177             :     friend class ScChangeAction;
     178             :     friend class ScChangeActionDel;
     179             :     friend class ScChangeActionMove;
     180             :     friend class ScChangeTrack;
     181             : 
     182             :     ScChangeActionCellListEntry*    pNext;
     183             :     ScChangeActionContent*          pContent;
     184             : 
     185           0 :     ScChangeActionCellListEntry(
     186             :         ScChangeActionContent* pContentP,
     187             :         ScChangeActionCellListEntry* pNextP )
     188             :         :   pNext( pNextP ),
     189           0 :             pContent( pContentP )
     190           0 :         {}
     191             : 
     192             : public:
     193             :     const ScChangeActionCellListEntry* GetNext() const { return pNext; } // this is only for the XML Export public
     194             :     const ScChangeActionContent* GetContent() const { return pContent; } // this is only for the XML Export public
     195             : 
     196           0 :     DECL_FIXEDMEMPOOL_NEWDEL( ScChangeActionCellListEntry )
     197             : };
     198             : 
     199             : // --- ScChangeAction -------------------------------------------------------
     200             : 
     201             : class ScChangeTrack;
     202             : class ScChangeActionIns;
     203             : class ScChangeActionDel;
     204             : class ScChangeActionContent;
     205             : 
     206             : class ScChangeAction
     207             : {
     208             :     friend class ScChangeTrack;
     209             :     friend class ScChangeActionIns;
     210             :     friend class ScChangeActionDel;
     211             :     friend class ScChangeActionMove;
     212             :     friend class ScChangeActionContent;
     213             : 
     214             :     // not implemented, prevent usage
     215             :     ScChangeAction( const ScChangeAction& );
     216             :     ScChangeAction& operator=( const ScChangeAction& );
     217             : 
     218             : protected:
     219             : 
     220             :     ScBigRange          aBigRange;          // Ins/Del/MoveTo/ContentPos
     221             :     DateTime            aDateTime;          //! UTC
     222             :     rtl::OUString       aUser;              // who?
     223             :     rtl::OUString       aComment;           // user comment
     224             :     ScChangeAction*     pNext;              // next in linked list
     225             :     ScChangeAction*     pPrev;              // previous in linked list
     226             :     ScChangeActionLinkEntry*    pLinkAny;   // arbitrary links
     227             :     ScChangeActionLinkEntry*    pLinkDeletedIn; // access to insert areas which were
     228             :                                             // deleted or moved or rejected
     229             :     ScChangeActionLinkEntry*    pLinkDeleted;   // links to deleted
     230             :     ScChangeActionLinkEntry*    pLinkDependent; // links to dependent
     231             :     sal_uLong               nAction;
     232             :     sal_uLong               nRejectAction;
     233             :     ScChangeActionType  eType;
     234             :     ScChangeActionState eState;
     235             : 
     236             :     ScChangeAction( ScChangeActionType, const ScRange& );
     237             : 
     238             :     // only to be used in the XML import
     239             :     ScChangeAction( ScChangeActionType,
     240             :                     const ScBigRange&,
     241             :                     const sal_uLong nAction,
     242             :                     const sal_uLong nRejectAction,
     243             :                     const ScChangeActionState eState,
     244             :                     const DateTime& aDateTime,
     245             :                     const rtl::OUString& aUser,
     246             :                     const rtl::OUString& aComment );
     247             : 
     248             :     // only to be used in the XML import
     249             :     ScChangeAction( ScChangeActionType, const ScBigRange&, const sal_uLong nAction);
     250             : 
     251             :     virtual ~ScChangeAction();
     252             : 
     253             :     rtl::OUString GetRefString(
     254             :         const ScBigRange& rRange, ScDocument* pDoc, bool bFlag3D = false) const;
     255             : 
     256           0 :     void SetActionNumber( sal_uLong n ) { nAction = n; }
     257           0 :     void SetRejectAction( sal_uLong n ) { nRejectAction = n; }
     258             :     void SetUser( const rtl::OUString& r );
     259           0 :     void SetType( ScChangeActionType e ) { eType = e; }
     260           0 :     void SetState( ScChangeActionState e ) { eState = e; }
     261             :     void SetRejected();
     262             : 
     263           0 :     ScBigRange& GetBigRange() { return aBigRange; }
     264             : 
     265           0 :     ScChangeActionLinkEntry* AddLink(
     266             :         ScChangeAction* p, ScChangeActionLinkEntry* pL )
     267             :     {
     268             :         ScChangeActionLinkEntry* pLnk =
     269             :             new ScChangeActionLinkEntry(
     270           0 :             &pLinkAny, p );
     271           0 :         pLnk->SetLink( pL );
     272           0 :         return pLnk;
     273             :     }
     274             : 
     275             :     void RemoveAllAnyLinks();
     276             : 
     277           0 :     virtual ScChangeActionLinkEntry*    GetDeletedIn() const
     278           0 :                                             { return pLinkDeletedIn; }
     279           0 :     virtual ScChangeActionLinkEntry**   GetDeletedInAddress()
     280           0 :                                             { return &pLinkDeletedIn; }
     281           0 :     ScChangeActionLinkEntry* AddDeletedIn( ScChangeAction* p )
     282             :     {
     283             :         return new ScChangeActionLinkEntry(
     284           0 :             GetDeletedInAddress(), p );
     285             :     }
     286             : 
     287             :     bool RemoveDeletedIn( const ScChangeAction* );
     288             :     void SetDeletedIn( ScChangeAction* );
     289             : 
     290           0 :     ScChangeActionLinkEntry* AddDeleted( ScChangeAction* p )
     291             :     {
     292           0 :         return new ScChangeActionLinkEntry(&pLinkDeleted, p);
     293             :     }
     294             : 
     295             :     void RemoveAllDeleted();
     296             : 
     297           0 :     ScChangeActionLinkEntry* AddDependent( ScChangeAction* p )
     298             :     {
     299           0 :         return new ScChangeActionLinkEntry(&pLinkDependent, p);
     300             :     }
     301             : 
     302             :     void                RemoveAllDependent();
     303             : 
     304             :     void                RemoveAllLinks();
     305             : 
     306             :     virtual void AddContent( ScChangeActionContent* ) = 0;
     307             :     virtual void DeleteCellEntries() = 0;
     308             : 
     309             :     virtual void UpdateReference( const ScChangeTrack*,
     310             :                      UpdateRefMode, const ScBigRange&,
     311             :                      sal_Int32 nDx, sal_Int32 nDy, sal_Int32 nDz );
     312             : 
     313             :     void Accept();
     314             :     virtual bool Reject(ScDocument* pDoc) = 0;
     315             :     void RejectRestoreContents( ScChangeTrack*, SCsCOL nDx, SCsROW nDy );
     316             : 
     317             :     // used in Reject() instead of IsRejectable()
     318             :     bool IsInternalRejectable() const;
     319             : 
     320             :     // Derived classes that hold a pointer to the
     321             :     // ChangeTrack must return that. Otherwise NULL.
     322             :     virtual const ScChangeTrack* GetChangeTrack() const = 0;
     323             : 
     324             : public:
     325             :     bool IsInsertType() const;
     326             :     bool IsDeleteType() const;
     327             :     bool IsVirgin() const;
     328             :     SC_DLLPUBLIC bool IsAccepted() const;
     329             :     bool IsRejected() const;
     330             : 
     331             :     // Action rejects another Action
     332             :     bool IsRejecting() const;
     333             : 
     334             :     // if action is visible in the document
     335             :     bool IsVisible() const;
     336             : 
     337             :     // if action if touchable
     338             :     bool IsTouchable() const;
     339             : 
     340             :     // if action is an entry in dialog root
     341             :     bool IsDialogRoot() const;
     342             : 
     343             :     // if an entry in a dialog shall be a drop down entry
     344             :     bool IsDialogParent() const;
     345             : 
     346             :     // if action is a delete with subdeletes (aufgeklappt = open ?)
     347             :     bool IsMasterDelete() const;
     348             : 
     349             :     // if action is acceptable/selectable/rejectable
     350             :     bool IsClickable() const;
     351             : 
     352             :     // if action is rejectable
     353             :     bool IsRejectable() const;
     354             : 
     355           0 :     const ScBigRange& GetBigRange() const { return aBigRange; }
     356             :     SC_DLLPUBLIC DateTime GetDateTime() const;        // local time
     357           0 :     const DateTime&     GetDateTimeUTC() const      // UTC time
     358           0 :                             { return aDateTime; }
     359           0 :     ScChangeActionType  GetType() const { return eType; }
     360           0 :     ScChangeActionState GetState() const { return eState; }
     361           0 :     sal_uLong               GetActionNumber() const { return nAction; }
     362           0 :     sal_uLong               GetRejectAction() const { return nRejectAction; }
     363             : 
     364           0 :     ScChangeAction*     GetNext() const { return pNext; }
     365           0 :     ScChangeAction*     GetPrev() const { return pPrev; }
     366             : 
     367             :     bool IsDeletedIn() const;
     368             :     bool IsDeletedIn( const ScChangeAction* ) const;
     369             :     bool IsDeletedInDelType( ScChangeActionType ) const;
     370             :     void RemoveAllDeletedIn();
     371             : 
     372           0 :     const ScChangeActionLinkEntry* GetFirstDeletedEntry() const
     373           0 :                             { return pLinkDeleted; }
     374           0 :     const ScChangeActionLinkEntry* GetFirstDependentEntry() const
     375           0 :                             { return pLinkDependent; }
     376             :     bool HasDependent() const;
     377             :     bool HasDeleted() const;
     378             :                                 // description will be appended to string
     379             :                                 // with bSplitRange only one column/row will be considered for delete
     380             :                                 // (for a listing of entries)
     381             :     virtual void GetDescription(
     382             :         rtl::OUString& rStr, ScDocument* pDoc,
     383             :         bool bSplitRange = false, bool bWarning = true ) const;
     384             : 
     385             :     virtual void GetRefString(
     386             :         rtl::OUString& rStr, ScDocument* pDoc, bool bFlag3D = false ) const;
     387             : 
     388             :                         // for DocumentMerge set old date of the other
     389             :                         // action, fetched by GetDateTimeUTC
     390           0 :     void                SetDateTimeUTC( const DateTime& rDT )
     391           0 :                             { aDateTime = rDT; }
     392             : 
     393             :     SC_DLLPUBLIC const rtl::OUString& GetUser() const;
     394             :     const rtl::OUString& GetComment() const;
     395             : 
     396             :     // set user comment
     397             :     void SetComment( const rtl::OUString& rStr );
     398             : 
     399             :                         // only to be used in the XML import
     400             :     void                SetDeletedInThis( sal_uLong nActionNumber,
     401             :                                 const ScChangeTrack* pTrack );
     402             :                         // only to be used in the XML import
     403             :     void                AddDependent( sal_uLong nActionNumber,
     404             :                                 const ScChangeTrack* pTrack );
     405             : };
     406             : 
     407             : 
     408             : // --- ScChangeActionIns ----------------------------------------------------
     409             : 
     410             : class ScChangeActionIns : public ScChangeAction
     411             : {
     412             :     friend class ScChangeTrack;
     413             : 
     414             :                                 ScChangeActionIns( const ScRange& rRange );
     415             :     virtual                     ~ScChangeActionIns();
     416             : 
     417           0 :     virtual void                AddContent( ScChangeActionContent* ) {}
     418           0 :     virtual void                DeleteCellEntries() {}
     419             : 
     420             :     virtual bool Reject(ScDocument* pDoc);
     421             : 
     422           0 :     virtual const ScChangeTrack*    GetChangeTrack() const { return 0; }
     423             : 
     424             : public:
     425             :     ScChangeActionIns(const sal_uLong nActionNumber,
     426             :             const ScChangeActionState eState,
     427             :             const sal_uLong nRejectingNumber,
     428             :             const ScBigRange& aBigRange,
     429             :             const rtl::OUString& aUser,
     430             :             const DateTime& aDateTime,
     431             :             const rtl::OUString &sComment,
     432             :             const ScChangeActionType eType); // only to use in the XML import
     433             : 
     434             :     virtual void GetDescription(
     435             :         rtl::OUString& rStr, ScDocument* pDoc, bool bSplitRange = false, bool bWarning = true) const;
     436             : };
     437             : 
     438             : 
     439             : // --- ScChangeActionDel ----------------------------------------------------
     440             : 
     441             : class ScChangeActionMove;
     442             : 
     443           0 : class ScChangeActionDelMoveEntry : public ScChangeActionLinkEntry
     444             : {
     445             :     friend class ScChangeActionDel;
     446             :     friend class ScChangeTrack;
     447             : 
     448             :     short               nCutOffFrom;
     449             :     short               nCutOffTo;
     450             : 
     451           0 :     ScChangeActionDelMoveEntry(
     452             :         ScChangeActionDelMoveEntry** ppPrevP,
     453             :         ScChangeActionMove* pMove,
     454             :         short nFrom, short nTo )
     455             :         :   ScChangeActionLinkEntry(
     456             :                 (ScChangeActionLinkEntry**)
     457             :                     ppPrevP,
     458             :                 (ScChangeAction*) pMove ),
     459             :             nCutOffFrom( nFrom ),
     460           0 :             nCutOffTo( nTo )
     461           0 :         {}
     462             : 
     463             :     ScChangeActionDelMoveEntry* GetNext()
     464             :                             {
     465             :                                 return (ScChangeActionDelMoveEntry*)
     466             :                                 ScChangeActionLinkEntry::GetNext();
     467             :                             }
     468           0 :     ScChangeActionMove* GetMove()
     469             :                             {
     470             :                                 return (ScChangeActionMove*)
     471           0 :                                 ScChangeActionLinkEntry::GetAction();
     472             :                             }
     473             : 
     474             : public:
     475           0 :     const ScChangeActionDelMoveEntry*   GetNext() const
     476             :                             {
     477             :                                 return (const ScChangeActionDelMoveEntry*)
     478           0 :                                 ScChangeActionLinkEntry::GetNext();
     479             :                             }
     480             :     const ScChangeActionMove*   GetMove() const
     481             :                             {
     482             :                                 return (const ScChangeActionMove*)
     483             :                                 ScChangeActionLinkEntry::GetAction();
     484             :                             }
     485           0 :     short               GetCutOffFrom() const { return nCutOffFrom; }
     486           0 :     short               GetCutOffTo() const { return nCutOffTo; }
     487             : };
     488             : 
     489             : 
     490             : class ScChangeActionDel : public ScChangeAction
     491             : {
     492             :     friend class ScChangeTrack;
     493             :     friend void ScChangeAction::Accept();
     494             : 
     495             :     ScChangeTrack*      pTrack;
     496             :     ScChangeActionCellListEntry* pFirstCell;
     497             :     ScChangeActionIns*  pCutOff;        // cut insert
     498             :     short               nCutOff;        // +: start  -: end
     499             :     ScChangeActionDelMoveEntry* pLinkMove;
     500             :     SCsCOL              nDx;
     501             :     SCsROW              nDy;
     502             : 
     503             :     ScChangeActionDel( const ScRange& rRange, SCsCOL nDx, SCsROW nDy, ScChangeTrack* );
     504             :     virtual ~ScChangeActionDel();
     505             : 
     506             :     ScChangeActionIns*  GetCutOffInsert() { return pCutOff; }
     507             : 
     508             :     virtual void                AddContent( ScChangeActionContent* );
     509             :     virtual void                DeleteCellEntries();
     510             : 
     511             :             void                UndoCutOffMoves();
     512             :             void                UndoCutOffInsert();
     513             : 
     514             :     virtual void                UpdateReference( const ScChangeTrack*,
     515             :                                     UpdateRefMode, const ScBigRange&,
     516             :                                     sal_Int32 nDx, sal_Int32 nDy, sal_Int32 nDz );
     517             : 
     518             :     virtual bool Reject(ScDocument* pDoc);
     519             : 
     520           0 :     virtual const ScChangeTrack*    GetChangeTrack() const { return pTrack; }
     521             : 
     522             : public:
     523             :     ScChangeActionDel(
     524             :         const sal_uLong nActionNumber, const ScChangeActionState eState,
     525             :         const sal_uLong nRejectingNumber, const ScBigRange& aBigRange,
     526             :         const rtl::OUString& aUser, const DateTime& aDateTime,
     527             :         const rtl::OUString &sComment, const ScChangeActionType eType,
     528             :         const SCsCOLROW nD, ScChangeTrack* pTrack); // only to use in the XML import
     529             :                                             // which of nDx and nDy is set is dependend on the type
     530             : 
     531             :     // is the last in a row (or single)
     532             :     bool IsBaseDelete() const;
     533             : 
     534             :     // is the first in a row (or single)
     535             :     bool IsTopDelete() const;
     536             : 
     537             :     // is part of a row
     538             :     bool IsMultiDelete() const;
     539             : 
     540             :     // is col, belonging to a TabDelete
     541             :     bool IsTabDeleteCol() const;
     542             : 
     543             :     SCsCOL GetDx() const;
     544             :     SCsROW GetDy() const;
     545             :     ScBigRange          GetOverAllRange() const;    // BigRange + (nDx, nDy)
     546             : 
     547             :     const ScChangeActionCellListEntry* GetFirstCellEntry() const
     548             :                             { return pFirstCell; }
     549           0 :     const ScChangeActionDelMoveEntry* GetFirstMoveEntry() const
     550           0 :                             { return pLinkMove; }
     551           0 :     const ScChangeActionIns*    GetCutOffInsert() const { return pCutOff; }
     552           0 :     short               GetCutOffCount() const { return nCutOff; }
     553             : 
     554             :     virtual void GetDescription(
     555             :         rtl::OUString& rStr, ScDocument* pDoc, bool bSplitRange = false, bool bWarning = true ) const;
     556             : 
     557           0 :     void                SetCutOffInsert( ScChangeActionIns* p, short n )
     558           0 :                             { pCutOff = p; nCutOff = n; }   // only to use in the XML import
     559             :                                                                     // this should be protected, but for the XML import it is public
     560             :     // only to use in the XML import
     561             :     // this should be protected, but for the XML import it is public
     562             :     ScChangeActionDelMoveEntry* AddCutOffMove(
     563             :         ScChangeActionMove* pMove, short nFrom, short nTo );
     564             : };
     565             : 
     566             : 
     567             : // --- ScChangeActionMove ---------------------------------------------------
     568             : 
     569             : class ScChangeActionMove : public ScChangeAction
     570             : {
     571             :     friend class ScChangeTrack;
     572             :     friend class ScChangeActionDel;
     573             : 
     574             :     ScBigRange          aFromRange;
     575             :     ScChangeTrack*      pTrack;
     576             :     ScChangeActionCellListEntry* pFirstCell;
     577             :     sal_uLong               nStartLastCut;  // for PasteCut undo
     578             :     sal_uLong               nEndLastCut;
     579             : 
     580           0 :     ScChangeActionMove( const ScRange& rFromRange,
     581             :         const ScRange& rToRange,
     582             :         ScChangeTrack* pTrackP )
     583             :         : ScChangeAction( SC_CAT_MOVE, rToRange ),
     584             :             aFromRange( rFromRange ),
     585             :             pTrack( pTrackP ),
     586             :             pFirstCell( NULL ),
     587             :             nStartLastCut(0),
     588           0 :             nEndLastCut(0)
     589           0 :         {}
     590             :     virtual ~ScChangeActionMove();
     591             : 
     592             :     virtual void                AddContent( ScChangeActionContent* );
     593             :     virtual void                DeleteCellEntries();
     594             : 
     595           0 :             ScBigRange&         GetFromRange() { return aFromRange; }
     596             : 
     597           0 :             void                SetStartLastCut( sal_uLong nVal ) { nStartLastCut = nVal; }
     598           0 :             sal_uLong               GetStartLastCut() const { return nStartLastCut; }
     599           0 :             void                SetEndLastCut( sal_uLong nVal ) { nEndLastCut = nVal; }
     600           0 :             sal_uLong               GetEndLastCut() const { return nEndLastCut; }
     601             : 
     602             :     virtual void                UpdateReference( const ScChangeTrack*,
     603             :                                     UpdateRefMode, const ScBigRange&,
     604             :                                     sal_Int32 nDx, sal_Int32 nDy, sal_Int32 nDz );
     605             : 
     606             :     virtual bool Reject(ScDocument* pDoc);
     607             : 
     608           0 :     virtual const ScChangeTrack*    GetChangeTrack() const { return pTrack; }
     609             : 
     610             : protected:
     611             :     using ScChangeAction::GetRefString;
     612             : 
     613             : public:
     614             :     ScChangeActionMove(const sal_uLong nActionNumber,
     615             :                     const ScChangeActionState eState,
     616             :                     const sal_uLong nRejectingNumber,
     617             :                     const ScBigRange& aToBigRange,
     618             :                     const rtl::OUString& aUser,
     619             :                     const DateTime& aDateTime,
     620             :                     const rtl::OUString &sComment,
     621             :                     const ScBigRange& aFromBigRange,
     622             :                     ScChangeTrack* pTrack); // only to use in the XML import
     623             : 
     624             :     const ScChangeActionCellListEntry* GetFirstCellEntry() const
     625             :                             { return pFirstCell; } // only to use in the XML export
     626             : 
     627           0 :     const ScBigRange&   GetFromRange() const { return aFromRange; }
     628             :     SC_DLLPUBLIC        void                GetDelta( sal_Int32& nDx, sal_Int32& nDy, sal_Int32& nDz ) const;
     629             : 
     630             :     virtual void GetDescription(
     631             :         rtl::OUString& rStr, ScDocument* pDoc, bool bSplitRange = false,
     632             :         bool bWarning = true ) const;
     633             : 
     634             :     virtual void GetRefString(
     635             :         rtl::OUString& rStr, ScDocument* pDoc, bool bFlag3D = false ) const;
     636             : };
     637             : 
     638             : 
     639             : // --- ScChangeActionContent ------------------------------------------------
     640             : 
     641             : enum ScChangeActionContentCellType
     642             : {
     643             :     SC_CACCT_NONE = 0,
     644             :     SC_CACCT_NORMAL,
     645             :     SC_CACCT_MATORG,
     646             :     SC_CACCT_MATREF
     647             : };
     648             : 
     649             : class ScChangeActionContent : public ScChangeAction
     650             : {
     651             :     friend class ScChangeTrack;
     652             : 
     653             :     rtl::OUString aOldValue;
     654             :     rtl::OUString aNewValue;
     655             :     ScBaseCell*         pOldCell;
     656             :     ScBaseCell*         pNewCell;
     657             :     ScChangeActionContent*  pNextContent;   // at the same position
     658             :     ScChangeActionContent*  pPrevContent;
     659             :     ScChangeActionContent*  pNextInSlot;    // in the same slot
     660             :     ScChangeActionContent** ppPrevInSlot;
     661             : 
     662           0 :     void InsertInSlot( ScChangeActionContent** pp )
     663             :     {
     664           0 :         if ( !ppPrevInSlot )
     665             :         {
     666           0 :             ppPrevInSlot = pp;
     667           0 :             if ( ( pNextInSlot = *pp ) != NULL )
     668           0 :                 pNextInSlot->ppPrevInSlot = &pNextInSlot;
     669           0 :             *pp = this;
     670             :         }
     671           0 :     }
     672             : 
     673           0 :     void RemoveFromSlot()
     674             :     {
     675           0 :         if ( ppPrevInSlot )
     676             :         {
     677           0 :             if ( ( *ppPrevInSlot = pNextInSlot ) != NULL )
     678           0 :                 pNextInSlot->ppPrevInSlot = ppPrevInSlot;
     679           0 :             ppPrevInSlot = NULL;    // not inserted
     680             :         }
     681           0 :     }
     682             : 
     683           0 :     ScChangeActionContent*  GetNextInSlot() { return pNextInSlot; }
     684             : 
     685             :     void ClearTrack();
     686             : 
     687             :     static void GetStringOfCell( rtl::OUString& rStr, const ScBaseCell* pCell,
     688             :                                  const ScDocument* pDoc, const ScAddress& rPos );
     689             : 
     690             :     static void GetStringOfCell( rtl::OUString& rStr, const ScBaseCell* pCell,
     691             :                                  const ScDocument* pDoc, sal_uLong nFormat );
     692             : 
     693             :     static void SetValue( rtl::OUString& rStr, ScBaseCell*& pCell, const ScAddress& rPos,
     694             :                           const ScBaseCell* pOrgCell, const ScDocument* pFromDoc,
     695             :                           ScDocument* pToDoc );
     696             : 
     697             :     static void SetValue( rtl::OUString& rStr, ScBaseCell*& pCell, sal_uLong nFormat,
     698             :                           const ScBaseCell* pOrgCell, const ScDocument* pFromDoc,
     699             :                           ScDocument* pToDoc );
     700             : 
     701             :     static void SetCell( rtl::OUString& rStr, ScBaseCell* pCell,
     702             :                          sal_uLong nFormat, const ScDocument* pDoc );
     703             : 
     704             :     static bool NeedsNumberFormat( const ScBaseCell* );
     705             : 
     706             :     void SetValueString( rtl::OUString& rValue, ScBaseCell*& pCell,
     707             :                          const rtl::OUString& rStr, ScDocument* pDoc );
     708             : 
     709             :     void GetValueString( rtl::OUString& rStr, const rtl::OUString& rValue,
     710             :                          const ScBaseCell* pCell ) const;
     711             : 
     712             :     void GetFormulaString( rtl::OUString& rStr, const ScFormulaCell* pCell ) const;
     713             : 
     714           0 :     virtual void                AddContent( ScChangeActionContent* ) {}
     715           0 :     virtual void                DeleteCellEntries() {}
     716             : 
     717             :     virtual void                UpdateReference( const ScChangeTrack*,
     718             :                                     UpdateRefMode, const ScBigRange&,
     719             :                                     sal_Int32 nDx, sal_Int32 nDy, sal_Int32 nDz );
     720             : 
     721             :     virtual bool Reject(ScDocument* pDoc);
     722             : 
     723           0 :     virtual const ScChangeTrack*    GetChangeTrack() const { return 0; }
     724             : 
     725             :     // pRejectActions!=NULL: reject actions get
     726             :     // stacked, no SetNewValue, no Append
     727             :     bool Select( ScDocument*, ScChangeTrack*,
     728             :                  bool bOldest, ::std::stack<ScChangeActionContent*>* pRejectActions );
     729             : 
     730             :     void PutValueToDoc(
     731             :         ScBaseCell* pCell, const rtl::OUString& rValue, ScDocument* pDoc,
     732             :         SCsCOL nDx, SCsROW nDy ) const;
     733             : 
     734             : protected:
     735             :     using ScChangeAction::GetRefString;
     736             : 
     737             : public:
     738             : 
     739           0 :     DECL_FIXEDMEMPOOL_NEWDEL( ScChangeActionContent )
     740             : 
     741           0 :     ScChangeActionContent( const ScRange& rRange )
     742             :         : ScChangeAction( SC_CAT_CONTENT, rRange ),
     743             :             pOldCell( NULL ),
     744             :             pNewCell( NULL ),
     745             :             pNextContent( NULL ),
     746             :             pPrevContent( NULL ),
     747             :             pNextInSlot( NULL ),
     748           0 :             ppPrevInSlot( NULL )
     749           0 :         {}
     750             :     ScChangeActionContent(
     751             :         const sal_uLong nActionNumber,  const ScChangeActionState eState,
     752             :         const sal_uLong nRejectingNumber, const ScBigRange& aBigRange,
     753             :         const rtl::OUString& aUser, const DateTime& aDateTime,
     754             :         const rtl::OUString &sComment, ScBaseCell* pOldCell,
     755             :         ScDocument* pDoc, const rtl::OUString& sOldValue); // to use for XML Import
     756             : 
     757             :     ScChangeActionContent(
     758             :         const sal_uLong nActionNumber, ScBaseCell* pNewCell,
     759             :         const ScBigRange& aBigRange, ScDocument* pDoc,
     760             :         const rtl::OUString& sNewValue); // to use for XML Import of Generated Actions
     761             : 
     762             :     virtual ~ScChangeActionContent();
     763             : 
     764           0 :     ScChangeActionContent*  GetNextContent() const { return pNextContent; }
     765           0 :     ScChangeActionContent*  GetPrevContent() const { return pPrevContent; }
     766             :     ScChangeActionContent*  GetTopContent() const;
     767           0 :     bool IsTopContent() const { return pNextContent == NULL; }
     768             : 
     769             :     virtual ScChangeActionLinkEntry*    GetDeletedIn() const;
     770             :     virtual ScChangeActionLinkEntry**   GetDeletedInAddress();
     771             : 
     772             :     void                PutOldValueToDoc( ScDocument*,
     773             :                             SCsCOL nDx, SCsROW nDy ) const;
     774             :     void                PutNewValueToDoc( ScDocument*,
     775             :                             SCsCOL nDx, SCsROW nDy ) const;
     776             : 
     777             :     void                SetOldValue( const ScBaseCell*,
     778             :                             const ScDocument* pFromDoc,
     779             :                             ScDocument* pToDoc,
     780             :                             sal_uLong nFormat );
     781             :     void                SetOldValue( const ScBaseCell*,
     782             :                             const ScDocument* pFromDoc,
     783             :                             ScDocument* pToDoc );
     784             :     void                SetNewValue( const ScBaseCell*, ScDocument* );
     785             : 
     786             :                         // Used in import filter AppendContentOnTheFly,
     787             :                         // takes ownership of cells.
     788             :     void                SetOldNewCells( ScBaseCell* pOldCell,
     789             :                             sal_uLong nOldFormat, ScBaseCell* pNewCell,
     790             :                             sal_uLong nNewFormat, ScDocument* pDoc );
     791             : 
     792             :     // Use this only in the XML import,
     793             :     // takes ownership of cell.
     794             :     void SetNewCell(
     795             :         ScBaseCell* pCell, ScDocument* pDoc, const rtl::OUString& rFormatted );
     796             : 
     797             :                         // These functions should be protected but for
     798             :                         // the XML import they are public.
     799           0 :     void                SetNextContent( ScChangeActionContent* p )
     800           0 :                             { pNextContent = p; }
     801           0 :     void                SetPrevContent( ScChangeActionContent* p )
     802           0 :                             { pPrevContent = p; }
     803             : 
     804             :     // don't use:
     805             :     // assigns string / creates forumula cell
     806             :     void SetOldValue( const rtl::OUString& rOld, ScDocument* pDoc );
     807             : 
     808             :     void GetOldString( rtl::OUString& rStr ) const;
     809             :     void GetNewString( rtl::OUString& rStr ) const;
     810           0 :     const ScBaseCell*   GetOldCell() const { return pOldCell; }
     811           0 :     const ScBaseCell*   GetNewCell() const { return pNewCell; }
     812             :     virtual void GetDescription(
     813             :         rtl::OUString& rStr, ScDocument* pDoc, bool bSplitRange = false, bool bWarning = true ) const;
     814             : 
     815             :     virtual void GetRefString(
     816             :         rtl::OUString& rStr, ScDocument* pDoc, bool bFlag3D = false ) const;
     817             : 
     818             :     static  ScChangeActionContentCellType   GetContentCellType( const ScBaseCell* );
     819             : 
     820             :     // NewCell
     821             :     bool IsMatrixOrigin() const;
     822             :     // OldCell
     823             :     bool IsOldMatrixReference() const;
     824             : };
     825             : 
     826             : 
     827             : // --- ScChangeActionReject -------------------------------------------------
     828             : 
     829           0 : class ScChangeActionReject : public ScChangeAction
     830             : {
     831             :     friend class ScChangeTrack;
     832             :     friend class ScChangeActionContent;
     833             : 
     834             :     ScChangeActionReject( sal_uLong nReject ) :
     835             :         ScChangeAction( SC_CAT_REJECT, ScRange() )
     836             :     {
     837             :         SetRejectAction( nReject );
     838             :         SetState( SC_CAS_ACCEPTED );
     839             :     }
     840             : 
     841           0 :     virtual void AddContent( ScChangeActionContent* ) {}
     842           0 :     virtual void DeleteCellEntries() {}
     843             : 
     844             :     virtual bool Reject(ScDocument* pDoc);
     845             : 
     846           0 :     virtual const ScChangeTrack* GetChangeTrack() const { return 0; }
     847             : 
     848             : public:
     849             :     ScChangeActionReject(const sal_uLong nActionNumber,
     850             :                     const ScChangeActionState eState,
     851             :                     const sal_uLong nRejectingNumber,
     852             :                     const ScBigRange& aBigRange,
     853             :                     const rtl::OUString& aUser,
     854             :                     const DateTime& aDateTime,
     855             :                     const rtl::OUString &sComment); // only to use in the XML import
     856             : };
     857             : 
     858             : 
     859             : // --- ScChangeTrack --------------------------------------------------------
     860             : 
     861             : enum ScChangeTrackMsgType
     862             : {
     863             :     SC_CTM_NONE,
     864             :     SC_CTM_APPEND,      // Actions appended
     865             :     SC_CTM_REMOVE,      // Actions removed
     866             :     SC_CTM_CHANGE,      // Actions changed
     867             :     SC_CTM_PARENT       // became a parent (and wasn't before)
     868             : };
     869             : 
     870             : struct ScChangeTrackMsgInfo
     871             : {
     872           0 :     DECL_FIXEDMEMPOOL_NEWDEL( ScChangeTrackMsgInfo )
     873             : 
     874             :     ScChangeTrackMsgType    eMsgType;
     875             :     sal_uLong                   nStartAction;
     876             :     sal_uLong                   nEndAction;
     877             : };
     878             : 
     879             : // MsgQueue for notification via ModifiedLink
     880             : typedef std::deque<ScChangeTrackMsgInfo*> ScChangeTrackMsgQueue;
     881             : typedef std::stack<ScChangeTrackMsgInfo*> ScChangeTrackMsgStack;
     882             : typedef std::map<sal_uLong, ScChangeAction*> ScChangeActionMap;
     883             : 
     884             : enum ScChangeTrackMergeState
     885             : {
     886             :     SC_CTMS_NONE,
     887             :     SC_CTMS_PREPARE,
     888             :     SC_CTMS_OWN,
     889             :     SC_CTMS_UNDO,
     890             :     SC_CTMS_OTHER
     891             : };
     892             : 
     893             : // Internally generated actions start at this value (nearly all bits set)
     894             : // and are decremented, to keep values in a table seperated from "normal" actions.
     895             : #define SC_CHGTRACK_GENERATED_START ((sal_uInt32) 0xfffffff0)
     896             : 
     897             : class ScChangeTrack : public utl::ConfigurationListener
     898             : {
     899             :     friend void ScChangeAction::RejectRestoreContents( ScChangeTrack*, SCsCOL, SCsROW );
     900             :     friend bool ScChangeActionDel::Reject( ScDocument* pDoc );
     901             :     friend void ScChangeActionDel::DeleteCellEntries();
     902             :     friend void ScChangeActionMove::DeleteCellEntries();
     903             :     friend bool ScChangeActionMove::Reject( ScDocument* pDoc );
     904             : 
     905             :     static  const SCROW         nContentRowsPerSlot;
     906             :     static  const SCSIZE        nContentSlots;
     907             : 
     908             :     com::sun::star::uno::Sequence< sal_Int8 >   aProtectPass;
     909             :     ScChangeActionMap   aMap;
     910             :     ScChangeActionMap   aGeneratedMap;
     911             :     ScChangeActionMap   aPasteCutMap;
     912             :     ScChangeTrackMsgQueue   aMsgQueue;
     913             :     ScChangeTrackMsgStack   aMsgStackTmp;
     914             :     ScChangeTrackMsgStack   aMsgStackFinal;
     915             :     std::set<rtl::OUString> maUserCollection;
     916             :     rtl::OUString maUser;
     917             :     Link                aModifiedLink;
     918             :     ScRange             aInDeleteRange;
     919             :     DateTime            aFixDateTime;
     920             :     ScChangeAction*     pFirst;
     921             :     ScChangeAction*     pLast;
     922             :     ScChangeActionContent*  pFirstGeneratedDelContent;
     923             :     ScChangeActionContent** ppContentSlots;
     924             :     ScChangeActionMove*     pLastCutMove;
     925             :     ScChangeActionLinkEntry*    pLinkInsertCol;
     926             :     ScChangeActionLinkEntry*    pLinkInsertRow;
     927             :     ScChangeActionLinkEntry*    pLinkInsertTab;
     928             :     ScChangeActionLinkEntry*    pLinkMove;
     929             :     ScChangeTrackMsgInfo*   pBlockModifyMsg;
     930             :     ScDocument*         pDoc;
     931             :     sal_uLong               nActionMax;
     932             :     sal_uLong               nGeneratedMin;
     933             :     sal_uLong               nMarkLastSaved;
     934             :     sal_uLong               nStartLastCut;
     935             :     sal_uLong               nEndLastCut;
     936             :     sal_uLong               nLastMerge;
     937             :     ScChangeTrackMergeState eMergeState;
     938             :     sal_uInt16              nLoadedFileFormatVersion;
     939             :     bool bLoadSave:1;
     940             :     bool bInDelete:1;
     941             :     bool bInDeleteUndo:1;
     942             :     bool bInDeleteTop:1;
     943             :     bool bInPasteCut:1;
     944             :     bool bUseFixDateTime:1;
     945             :     bool bTime100thSeconds:1;
     946             : 
     947             :     // not implemented, prevent usage
     948             :     ScChangeTrack( const ScChangeTrack& );
     949             :     ScChangeTrack& operator=( const ScChangeTrack& );
     950             : 
     951             : #ifdef SC_CHGTRACK_CXX
     952             :     static  SCROW               InitContentRowsPerSlot();
     953             : 
     954             :     // true if one is MM_FORMULA and the other is
     955             :     // not, or if both are and range differs
     956             :     static bool IsMatrixFormulaRangeDifferent(
     957             :         const ScBaseCell* pOldCell, const ScBaseCell* pNewCell );
     958             : 
     959             :     void                Init();
     960             :     void                DtorClear();
     961             :     void                SetLoadSave( bool bVal ) { bLoadSave = bVal; }
     962           0 :     void                SetInDeleteRange( const ScRange& rRange )
     963           0 :                             { aInDeleteRange = rRange; }
     964           0 :     void                SetInDelete( bool bVal )
     965           0 :                             { bInDelete = bVal; }
     966           0 :     void                SetInDeleteTop( bool bVal )
     967           0 :                             { bInDeleteTop = bVal; }
     968           0 :     void                SetInDeleteUndo( bool bVal )
     969           0 :                             { bInDeleteUndo = bVal; }
     970           0 :     void                SetInPasteCut( bool bVal )
     971           0 :                             { bInPasteCut = bVal; }
     972           0 :     void                SetMergeState( ScChangeTrackMergeState eState )
     973           0 :                             { eMergeState = eState; }
     974           0 :     ScChangeTrackMergeState GetMergeState() const { return eMergeState; }
     975           0 :     void                SetLastMerge( sal_uLong nVal ) { nLastMerge = nVal; }
     976           0 :     sal_uLong               GetLastMerge() const { return nLastMerge; }
     977             : 
     978             :     void                SetLastCutMoveRange( const ScRange&, ScDocument* );
     979             : 
     980             :                         // create block of ModifyMsg
     981             :     void                StartBlockModify( ScChangeTrackMsgType,
     982             :                             sal_uLong nStartAction );
     983             :     void                EndBlockModify( sal_uLong nEndAction );
     984             : 
     985             :     void                AddDependentWithNotify( ScChangeAction* pParent,
     986             :                             ScChangeAction* pDependent );
     987             : 
     988             :     void                Dependencies( ScChangeAction* );
     989             :     void UpdateReference( ScChangeAction*, bool bUndo );
     990             :     void UpdateReference( ScChangeAction** ppFirstAction, ScChangeAction* pAct, bool bUndo );
     991             :     void                Append( ScChangeAction* pAppend, sal_uLong nAction );
     992             :     SC_DLLPUBLIC        void                AppendDeleteRange( const ScRange&,
     993             :                                     ScDocument* pRefDoc, SCsTAB nDz,
     994             :                                     sal_uLong nRejectingInsert );
     995             :     void                AppendOneDeleteRange( const ScRange& rOrgRange,
     996             :                             ScDocument* pRefDoc,
     997             :                             SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
     998             :                             sal_uLong nRejectingInsert );
     999             :     void                LookUpContents( const ScRange& rOrgRange,
    1000             :                             ScDocument* pRefDoc,
    1001             :                             SCsCOL nDx, SCsROW nDy, SCsTAB nDz );
    1002             :     void                Remove( ScChangeAction* );
    1003             :     void                MasterLinks( ScChangeAction* );
    1004             : 
    1005             :                                 // Content on top an Position
    1006             :     ScChangeActionContent*  SearchContentAt( const ScBigAddress&,
    1007             :                                     ScChangeAction* pButNotThis ) const;
    1008             :     void                DeleteGeneratedDelContent(
    1009             :                                     ScChangeActionContent* );
    1010             :     ScChangeActionContent*  GenerateDelContent( const ScAddress&,
    1011             :                                     const ScBaseCell*,
    1012             :                                     const ScDocument* pFromDoc );
    1013             :     void                DeleteCellEntries(
    1014             :                                     ScChangeActionCellListEntry*&,
    1015             :                                     ScChangeAction* pDeletor );
    1016             : 
    1017             :                                 // Reject action and all dependent actions,
    1018             :                                 // Table stems from previous GetDependents,
    1019             :                                 // only needed for Insert and Move (MasterType),
    1020             :                                 // is NULL otherwise.
    1021             :                                 // bRecursion == called from reject with table
    1022             :     bool Reject( ScChangeAction*, ScChangeActionMap*, bool bRecursion );
    1023             : 
    1024             : #endif  // SC_CHGTRACK_CXX
    1025             : 
    1026             :             void                ClearMsgQueue();
    1027             :     virtual void                ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 );
    1028             : 
    1029             : public:
    1030             : 
    1031           0 :     static  SCSIZE              ComputeContentSlot( sal_Int32 nRow )
    1032             :                                     {
    1033           0 :                                         if ( nRow < 0 || nRow > MAXROW )
    1034           0 :                                             return nContentSlots - 1;
    1035           0 :                                         return static_cast< SCSIZE >( nRow / nContentRowsPerSlot );
    1036             :                                     }
    1037             : 
    1038             :     SC_DLLPUBLIC ScChangeTrack( ScDocument* );
    1039             :     ScChangeTrack(ScDocument* pDocP, const std::set<rtl::OUString>& aTempUserCollection); // only to use in the XML import
    1040             :     SC_DLLPUBLIC virtual ~ScChangeTrack();
    1041             :     void Clear();
    1042             : 
    1043           0 :     ScChangeActionContent*  GetFirstGenerated() const { return pFirstGeneratedDelContent; }
    1044           0 :     ScChangeAction*     GetFirst() const { return pFirst; }
    1045           0 :     ScChangeAction*     GetLast() const { return pLast; }
    1046           0 :     sal_uLong               GetActionMax() const { return nActionMax; }
    1047           0 :     bool IsGenerated( sal_uLong nAction ) const
    1048           0 :         { return nAction >= nGeneratedMin; }
    1049           0 :     ScChangeAction*     GetAction( sal_uLong nAction ) const
    1050             :     {
    1051           0 :         ScChangeActionMap::const_iterator it = aMap.find( nAction );
    1052           0 :         if( it != aMap.end() )
    1053           0 :             return it->second;
    1054             :         else
    1055           0 :             return NULL;
    1056             :     }
    1057           0 :     ScChangeAction*     GetGenerated( sal_uLong nGenerated ) const
    1058             :     {
    1059           0 :         ScChangeActionMap::const_iterator it = aGeneratedMap.find( nGenerated );
    1060           0 :         if( it != aGeneratedMap.end() )
    1061           0 :             return it->second;
    1062             :         else
    1063           0 :             return NULL;
    1064             :     }
    1065           0 :     ScChangeAction*     GetActionOrGenerated( sal_uLong nAction ) const
    1066             :                             {
    1067           0 :                                 return IsGenerated( nAction ) ?
    1068             :                                     GetGenerated( nAction ) :
    1069           0 :                                     GetAction( nAction );
    1070             :                             }
    1071           0 :     sal_uLong               GetLastSavedActionNumber() const
    1072           0 :                             { return nMarkLastSaved; }
    1073           0 :     void                SetLastSavedActionNumber(sal_uLong nNew)
    1074           0 :                             { nMarkLastSaved = nNew; }
    1075           0 :     ScChangeAction*     GetLastSaved() const
    1076             :     {
    1077           0 :         ScChangeActionMap::const_iterator it = aMap.find( nMarkLastSaved );
    1078           0 :         if( it != aMap.end() )
    1079           0 :             return it->second;
    1080             :         else
    1081           0 :             return NULL;
    1082             :     }
    1083           0 :     ScChangeActionContent** GetContentSlots() const { return ppContentSlots; }
    1084             : 
    1085           0 :     bool IsLoadSave() const { return bLoadSave; }
    1086           0 :     const ScRange&      GetInDeleteRange() const
    1087           0 :                             { return aInDeleteRange; }
    1088           0 :     bool IsInDelete() const { return bInDelete; }
    1089           0 :     bool IsInDeleteTop() const { return bInDeleteTop; }
    1090           0 :     bool IsInDeleteUndo() const { return bInDeleteUndo; }
    1091           0 :     bool IsInPasteCut() const { return bInPasteCut; }
    1092             :     SC_DLLPUBLIC void SetUser( const rtl::OUString& rUser );
    1093             :     SC_DLLPUBLIC const rtl::OUString& GetUser() const;
    1094             :     SC_DLLPUBLIC const std::set<rtl::OUString>& GetUserCollection() const;
    1095           0 :     ScDocument*         GetDocument() const { return pDoc; }
    1096             :                         // for import filter
    1097           0 :     const DateTime&     GetFixDateTime() const { return aFixDateTime; }
    1098             : 
    1099             :                         // set this if the date/time set with
    1100             :                         // SetFixDateTime...() shall be applied to
    1101             :                         // appended actions
    1102           0 :     void                SetUseFixDateTime( bool bVal )
    1103           0 :                             { bUseFixDateTime = bVal; }
    1104             :                         // for MergeDocument, apply original date/time as UTC
    1105           0 :     void                SetFixDateTimeUTC( const DateTime& rDT )
    1106           0 :                             { aFixDateTime = rDT; }
    1107             :                         // for import filter, apply original date/time as local time
    1108           0 :     void                SetFixDateTimeLocal( const DateTime& rDT )
    1109           0 :                             { aFixDateTime = rDT; aFixDateTime.ConvertToUTC(); }
    1110             : 
    1111             :     void                Append( ScChangeAction* );
    1112             : 
    1113             :                                 // pRefDoc may be NULL => no lookup of contents
    1114             :                                 // => no generation of deleted contents
    1115             :     SC_DLLPUBLIC void AppendDeleteRange( const ScRange&,
    1116             :                                     ScDocument* pRefDoc,
    1117             :                                     sal_uLong& nStartAction, sal_uLong& nEndAction,
    1118             :                                     SCsTAB nDz = 0 );
    1119             :                                     // nDz: multi TabDel, LookUpContent must be searched
    1120             :                                     // with an offset of -nDz
    1121             : 
    1122             :                         // after new value was set in the document,
    1123             :                         // old value from RefDoc/UndoDoc
    1124             :     void                AppendContent( const ScAddress& rPos,
    1125             :                             ScDocument* pRefDoc );
    1126             :                         // after new values were set in the document,
    1127             :                         // old values from RefDoc/UndoDoc
    1128             :     void                AppendContentRange( const ScRange& rRange,
    1129             :                             ScDocument* pRefDoc,
    1130             :                             sal_uLong& nStartAction, sal_uLong& nEndAction,
    1131             :                             ScChangeActionClipMode eMode = SC_CACM_NONE );
    1132             :                         // after new value was set in the document,
    1133             :                         // old value from pOldCell, nOldFormat,
    1134             :                         // RefDoc==NULL => Doc
    1135             :     void                AppendContent( const ScAddress& rPos,
    1136             :                             const ScBaseCell* pOldCell,
    1137             :                             sal_uLong nOldFormat, ScDocument* pRefDoc = NULL );
    1138             :                         // after new value was set in the document,
    1139             :                         // old value from pOldCell, format from Doc
    1140             :     void                AppendContent( const ScAddress& rPos,
    1141             :                             const ScBaseCell* pOldCell );
    1142             :                         // after new values were set in the document,
    1143             :                         // old values from RefDoc/UndoDoc.
    1144             :                         // All contents with a cell in RefDoc
    1145             :     void                AppendContentsIfInRefDoc( ScDocument* pRefDoc,
    1146             :                             sal_uLong& nStartAction, sal_uLong& nEndAction );
    1147             : 
    1148             :                         // Meant for import filter, creates and inserts
    1149             :                         // an unconditional content action of the two
    1150             :                         // cells without querying the document, not
    1151             :                         // even for number formats (though the number
    1152             :                         // formatter of the document may be used).
    1153             :                         // The action is returned and may be used to
    1154             :                         // set user name, description, date/time et al.
    1155             :                         // Takes ownership of the cells!
    1156             :     SC_DLLPUBLIC    ScChangeActionContent*  AppendContentOnTheFly( const ScAddress& rPos,
    1157             :                                     ScBaseCell* pOldCell,
    1158             :                                     ScBaseCell* pNewCell,
    1159             :                                     sal_uLong nOldFormat = 0,
    1160             :                                     sal_uLong nNewFormat = 0 );
    1161             : 
    1162             :     // Only use the following two if there is no different solution! (Assign
    1163             :     // string for NewValue or creation of a formula respectively)
    1164             : 
    1165             :     SC_DLLPUBLIC void AppendInsert( const ScRange& );
    1166             : 
    1167             :                                 // pRefDoc may be NULL => no lookup of contents
    1168             :                                 // => no generation of deleted contents
    1169             :     SC_DLLPUBLIC void AppendMove( const ScRange& rFromRange, const ScRange& rToRange,
    1170             :                                   ScDocument* pRefDoc );
    1171             : 
    1172             :                                 // Cut to Clipboard
    1173           0 :     void ResetLastCut()
    1174             :     {
    1175           0 :         nStartLastCut = nEndLastCut = 0;
    1176           0 :         if ( pLastCutMove )
    1177             :         {
    1178           0 :             delete pLastCutMove;
    1179           0 :             pLastCutMove = NULL;
    1180             :         }
    1181           0 :     }
    1182           0 :     bool HasLastCut() const
    1183             :     {
    1184             :         return nEndLastCut > 0 &&
    1185             :             nStartLastCut <= nEndLastCut &&
    1186           0 :             pLastCutMove;
    1187             :     }
    1188             : 
    1189             :     SC_DLLPUBLIC void Undo( sal_uLong nStartAction, sal_uLong nEndAction, bool bMerge = false );
    1190             : 
    1191             :                         // adjust references for MergeDocument
    1192             :                         //! may only be used in a temporary opened document.
    1193             :                         //! the Track (?) is unclean afterwards
    1194             :     void                MergePrepare( ScChangeAction* pFirstMerge, bool bShared = false );
    1195             :     void                MergeOwn( ScChangeAction* pAct, sal_uLong nFirstMerge, bool bShared = false );
    1196             :     static bool MergeIgnore( const ScChangeAction&, sal_uLong nFirstMerge );
    1197             : 
    1198             :                                 // This comment was already really strange in German.
    1199             :                                 // Tried to structure it a little. Hope no information got lost...
    1200             :                                 //
    1201             :                                 // Insert dependents into table.
    1202             :                                 // ScChangeAction is
    1203             :                                 // - "Insert": really dependents
    1204             :                                 // - "Move": dependent contents in FromRange /
    1205             :                                 //           deleted contents in ToRange
    1206             :                                 //      OR   inserts in FromRange or ToRange
    1207             :                                 // - "Delete": a list of deleted (what?)
    1208             :                                 //      OR     for content, different contents at the same position
    1209             :                                 //      OR     MatrixReferences belonging to MatrixOrigin
    1210             :                                 //
    1211             :                                 // With bListMasterDelete (==TRUE ?) all Deletes of a row belonging
    1212             :                                 // to a MasterDelete are listed (possibly it is
    1213             :                                 // "all Deletes belonging...are listed in a row?)
    1214             :                                 //
    1215             :                                 // With bAllFlat (==TRUE ?) all dependents of dependents
    1216             :                                 // will be inserted flatly.
    1217             : 
    1218             :     SC_DLLPUBLIC void GetDependents(
    1219             :         ScChangeAction*, ScChangeActionMap&, bool bListMasterDelete = false, bool bAllFlat = false ) const;
    1220             : 
    1221             :     // Reject visible action (and dependents)
    1222             :     bool Reject( ScChangeAction*, bool bShared = false );
    1223             : 
    1224             :     // Accept visible action (and dependents)
    1225             :     SC_DLLPUBLIC bool Accept( ScChangeAction* );
    1226             : 
    1227             :     void                AcceptAll();    // all Virgins
    1228             :     bool                RejectAll();    // all Virgins
    1229             : 
    1230             :     // Selects a content of several contents at the same
    1231             :     // position and accepts this one and
    1232             :     // the older ones, rejects the more recent ones.
    1233             :     // If bOldest==TRUE then the first OldValue
    1234             :     // of a Virgin-Content-List will be restored.
    1235             :     bool SelectContent( ScChangeAction*, bool bOldest = false );
    1236             : 
    1237             :                         // If ModifiedLink is set, changes go to
    1238             :                         // ScChangeTrackMsgQueue
    1239           0 :     void                SetModifiedLink( const Link& r )
    1240           0 :                             { aModifiedLink = r; ClearMsgQueue(); }
    1241             :     const Link&         GetModifiedLink() const { return aModifiedLink; }
    1242           0 :     ScChangeTrackMsgQueue& GetMsgQueue() { return aMsgQueue; }
    1243             : 
    1244             :     void                NotifyModified( ScChangeTrackMsgType eMsgType,
    1245             :                             sal_uLong nStartAction, sal_uLong nEndAction );
    1246             : 
    1247             :     sal_uInt16              GetLoadedFileFormatVersion() const
    1248             :                             { return nLoadedFileFormatVersion; }
    1249             : 
    1250             :     sal_uLong AddLoadedGenerated(
    1251             :         ScBaseCell* pOldCell, const ScBigRange& aBigRange, const rtl::OUString& sNewValue ); // only to use in the XML import
    1252             :     void                AppendLoaded( ScChangeAction* pAppend ); // this is only for the XML import public, it should be protected
    1253           0 :     void                SetActionMax(sal_uLong nTempActionMax)
    1254           0 :                             { nActionMax = nTempActionMax; } // only to use in the XML import
    1255             : 
    1256           0 :     void                SetProtection( const com::sun::star::uno::Sequence< sal_Int8 >& rPass )
    1257           0 :                             { aProtectPass = rPass; }
    1258           0 :     com::sun::star::uno::Sequence< sal_Int8 >   GetProtection() const
    1259           0 :                                     { return aProtectPass; }
    1260           0 :     bool IsProtected() const { return aProtectPass.getLength() != 0; }
    1261             : 
    1262             :                                 // If time stamps of actions of this
    1263             :                                 // ChangeTrack and a second one are to be
    1264             :                                 // compared including 100th seconds.
    1265           0 :     void SetTime100thSeconds( bool bVal ) { bTime100thSeconds = bVal; }
    1266           0 :     bool IsTime100thSeconds() const { return bTime100thSeconds; }
    1267             : 
    1268             :     void AppendCloned( ScChangeAction* pAppend );
    1269             :     SC_DLLPUBLIC ScChangeTrack* Clone( ScDocument* pDocument ) const;
    1270             :     void MergeActionState( ScChangeAction* pAct, const ScChangeAction* pOtherAct );
    1271             : };
    1272             : 
    1273             : 
    1274             : #endif
    1275             : 
    1276             : 
    1277             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10