LCOV - code coverage report
Current view: top level - usr/local/src/libreoffice/sc/inc - chgtrack.hxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 219 0.0 %
Date: 2013-07-09 Functions: 0 123 0.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10