LCOV - code coverage report
Current view: top level - sc/inc - chgtrack.hxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 221 0.0 %
Date: 2014-04-14 Functions: 0 125 0.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10