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

Generated by: LCOV version 1.10