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

Generated by: LCOV version 1.11