/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
/** A link/connection/dependency between change actions.
Upon construction inserts itself as the head of a chain / linked list, respectively between existing link entries.
Upon destruction removes itself from the list and connects the previous and next entry, if it was the first entry automatically maintaining the head pointer to the list.
ppPrev == &previous->pNext or address of pointer to head of linked list, *ppPrev == this
*/ class ScChangeActionLinkEntry
{
ScChangeActionLinkEntry( const ScChangeActionLinkEntry& ) = delete;
ScChangeActionLinkEntry& operator=( const ScChangeActionLinkEntry& ) = delete;
ScBigRange aBigRange; // Ins/Del/MoveTo/ContentPos
DateTime aDateTime; //! UTC
OUString aUser; // who?
OUString aComment; // user comment
ScChangeAction* pNext; // next in linked list
ScChangeAction* pPrev; // previous in linked list
ScChangeActionLinkEntry* pLinkAny; // arbitrary links
ScChangeActionLinkEntry* pLinkDeletedIn; // access to insert areas which were // deleted or moved or rejected
ScChangeActionLinkEntry* pLinkDeleted; // links to deleted
ScChangeActionLinkEntry* pLinkDependent; // links to dependent
sal_uLong nAction;
sal_uLong nRejectAction;
ScChangeActionType eType;
ScChangeActionState eState;
// only to be used in the XML import
ScChangeAction( ScChangeActionType,
ScBigRange , const sal_uLong nAction, const sal_uLong nRejectAction, const ScChangeActionState eState, const DateTime& aDateTime,
OUString aUser,
OUString aComment );
// only to be used in the XML import
ScChangeAction( ScChangeActionType, ScBigRange , const sal_uLong nAction);
// set user comment void SetComment( const OUString& rStr );
// only to be used in the XML import void SetDeletedInThis( sal_uLong nActionNumber, const ScChangeTrack* pTrack ); // only to be used in the XML import void AddDependent( sal_uLong nActionNumber, const ScChangeTrack* pTrack );
};
// ScChangeActionIns class SAL_DLLPUBLIC_RTTI ScChangeActionIns final : public ScChangeAction
{ friendclass ScChangeTrack;
bool mbEndOfList; /// whether or not a row was auto-inserted at the bottom.
public:
ScChangeActionDel( const sal_uLong nActionNumber, const ScChangeActionState eState, const sal_uLong nRejectingNumber, const ScBigRange& aBigRange, const OUString& aUser, const DateTime& aDateTime, const OUString &sComment, const ScChangeActionType eType, const SCCOLROW nD, ScChangeTrack* pTrack); // only to use in the XML import // which of nDx and nDy is set is dependent on the type virtual ~ScChangeActionDel() override;
// is the last in a row (or single) bool IsBaseDelete() const;
// is the first in a row (or single) bool IsTopDelete() const;
// is part of a row bool IsMultiDelete() const;
// is col, belonging to a TabDelete bool IsTabDeleteCol() const;
void SetCutOffInsert( ScChangeActionIns* p, short n )
{ pCutOff = p; nCutOff = n; } // only to use in the XML import // this should be protected, but for the XML import it is public // only to use in the XML import // this should be protected, but for the XML import it is public
ScChangeActionDelMoveEntry* AddCutOffMove(
ScChangeActionMove* pMove, short nFrom, short nTo );
};
// ScChangeActionMove class ScChangeActionMove final : public ScChangeAction
{ friendclass ScChangeTrack; friendstruct std::default_delete<ScChangeActionMove>; // for std::unique_ptr friendclass ScChangeActionDel;
class SAL_DLLPUBLIC_RTTI ScChangeActionContent final : public ScChangeAction
{ friendclass ScChangeTrack;
ScCellValue maOldCell;
ScCellValue maNewCell;
OUString maOldValue;
OUString maNewValue;
ScChangeActionContent* pNextContent; // at the same position
ScChangeActionContent* pPrevContent;
ScChangeActionContent* pNextInSlot; // in the same slot
ScChangeActionContent** ppPrevInSlot;
ScChangeActionContent( const sal_uLong nActionNumber, const ScChangeActionState eState, const sal_uLong nRejectingNumber, const ScBigRange& aBigRange, const OUString& aUser, const DateTime& aDateTime, const OUString &sComment, ScCellValue aOldCell, const ScDocument& rDoc, const OUString& sOldValue ); // to use for XML Import
ScChangeActionContent( const sal_uLong nActionNumber, ScCellValue aNewCell, const ScBigRange& aBigRange, const ScDocument& rDoc, const OUString& sNewValue ); // to use for XML Import of Generated Actions
// Use this only in the XML import, // takes ownership of cell. void SetNewCell( const ScCellValue& rCell, const ScDocument& rDoc, const OUString& rFormatted );
// These functions should be protected but for // the XML import they are public. void SetNextContent( ScChangeActionContent* p )
{ pNextContent = p; } void SetPrevContent( ScChangeActionContent* p )
{ pPrevContent = p; }
// Internally generated actions start at this value (nearly all bits set) // and are decremented, to keep values in a table separated from "normal" actions. #define SC_CHGTRACK_GENERATED_START (sal_uInt32(0xfffffff0))
class SAL_DLLPUBLIC_RTTI ScChangeTrack final : public utl::ConfigurationListener
{ friendvoid ScChangeAction::RejectRestoreContents( ScChangeTrack*, SCCOL, SCROW ); friendbool ScChangeActionDel::Reject( ScDocument& pDoc ); friendvoid ScChangeActionDel::DeleteCellEntries(); friendvoid ScChangeActionMove::DeleteCellEntries(); friendbool ScChangeActionMove::Reject( ScDocument& pDoc );
// true if one is ScMatrixMode::Formula and the other is // not, or if both are and range differs staticbool IsMatrixFormulaRangeDifferent( const ScCellValue& rOldCell, const ScCellValue& rNewCell );
// Content on top at Position
ScChangeActionContent* SearchContentAt( const ScBigAddress&, const ScChangeAction* pButNotThis ) const; void DeleteGeneratedDelContent(
ScChangeActionContent* );
// Reject action and all dependent actions, // Table stems from previous GetDependents, // only needed for Insert and Move (MasterType), // is NULL otherwise. // bRecursion == called from reject with table bool Reject( ScChangeAction*, ScChangeActionMap*, bool bRecursion );
SC_DLLPUBLIC ScChangeTrack( ScDocument& );
ScChangeTrack(ScDocument& rDocP, std::set<OUString>&& aTempUserCollection); // only to use in the XML import
SC_DLLPUBLIC virtual ~ScChangeTrack() override; void Clear();
// set this if the date/time set with // SetFixDateTime...() shall be applied to // appended actions void SetUseFixDateTime( bool bVal )
{ bUseFixDateTime = bVal; } // for MergeDocument, apply original date/time as UTC void SetFixDateTimeUTC( const DateTime& rDT )
{ aFixDateTime = rDT; } // for import filter, apply original date/time as local time void SetFixDateTimeLocal( const DateTime& rDT )
{ aFixDateTime = rDT; aFixDateTime.ConvertToUTC(); }
void Append( ScChangeAction* );
// pRefDoc may be NULL => no lookup of contents // => no generation of deleted contents
SC_DLLPUBLIC void AppendDeleteRange( const ScRange&,
ScDocument* pRefDoc,
sal_uLong& nStartAction, sal_uLong& nEndAction,
SCTAB nDz = 0 ); // nDz: multi TabDel, LookUpContent must be searched // with an offset of -nDz
// after new value was set in the document, // old value from RefDoc/UndoDoc void AppendContent( const ScAddress& rPos, const ScDocument& rRefDoc ); // after new values were set in the document, // old values from RefDoc/UndoDoc void AppendContentRange( const ScRange& rRange,
ScDocument& rRefDoc,
sal_uLong& nStartAction, sal_uLong& nEndAction,
ScChangeActionClipMode eMode = SC_CACM_NONE ); // after new value was set in the document, // old value from pOldCell, nOldFormat, // RefDoc==NULL => Doc void AppendContent( const ScAddress& rPos, const ScCellValue& rOldCell,
sal_uLong nOldFormat, ScDocument* pRefDoc = nullptr ); // after new value was set in the document, // old value from pOldCell, format from Doc
SC_DLLPUBLIC void AppendContent( const ScAddress& rPos, const ScCellValue& rOldCell ); // after new values were set in the document, // old values from RefDoc/UndoDoc. // All contents with a cell in RefDoc void AppendContentsIfInRefDoc( ScDocument& rRefDoc,
sal_uLong& nStartAction, sal_uLong& nEndAction );
// Meant for import filter, creates and inserts // an unconditional content action of the two // cells without querying the document, not // even for number formats (though the number // formatter of the document may be used). // The action is returned and may be used to // set user name, description, date/time et al. // Takes ownership of the cells!
SC_DLLPUBLIC ScChangeActionContent* AppendContentOnTheFly( const ScAddress& rPos, const ScCellValue& rOldCell, const ScCellValue& rNewCell,
sal_uLong nOldFormat = 0, sal_uLong nNewFormat = 0 );
// Only use the following two if there is no different solution! (Assign // string for NewValue or creation of a formula respectively)
// pRefDoc may be NULL => no lookup of contents // => no generation of deleted contents
SC_DLLPUBLIC void AppendMove( const ScRange& rFromRange, const ScRange& rToRange,
ScDocument* pRefDoc );
// adjust references for MergeDocument //! may only be used in a temporary opened document. //! the Track (?) is unclean afterwards void MergePrepare( const ScChangeAction* pFirstMerge, bool bShared ); void MergeOwn( ScChangeAction* pAct, sal_uLong nFirstMerge, bool bShared ); staticbool MergeIgnore( const ScChangeAction&, sal_uLong nFirstMerge );
// This comment was already really strange in German. // Tried to structure it a little. Hope no information got lost... // // Insert dependents into table. // ScChangeAction is // - "Insert": really dependents // - "Move": dependent contents in FromRange / // deleted contents in ToRange // OR inserts in FromRange or ToRange // - "Delete": a list of deleted (what?) // OR for content, different contents at the same position // OR MatrixReferences belonging to MatrixOrigin
// With bListMasterDelete (==TRUE ?) all Deletes of a row belonging // to a MasterDelete are listed (possibly it is // "all Deletes belonging...are listed in a row?)
// With bAllFlat (==TRUE ?) all dependents of dependents // will be inserted flatly.
void AcceptAll(); // all Virgins bool RejectAll(); // all Virgins
// Selects a content of several contents at the same // position and accepts this one and // the older ones, rejects the more recent ones. // If bOldest==TRUE then the first OldValue // of a Virgin-Content-List will be restored. bool SelectContent( ScChangeAction*, bool bOldest = false );
// If ModifiedLink is set, changes go to // ScChangeTrackMsgQueue void SetModifiedLink( const Link<ScChangeTrack&,void>& r )
{ aModifiedLink = r; ClearMsgQueue(); }
ScChangeTrackMsgQueue& GetMsgQueue();
sal_uLong AddLoadedGenerated( const ScCellValue& rNewCell, const ScBigRange& aBigRange, const OUString& sNewValue ); // only to use in the XML import void AppendLoaded( std::unique_ptr<ScChangeAction> pAppend ); // this is only for the XML import public, it should be protected void SetActionMax(sal_uLong nTempActionMax)
{ nActionMax = nTempActionMax; } // only to use in the XML import
// If time stamps of actions of this // ChangeTrack and a second one are to be // compared including nanoseconds. void SetTimeNanoSeconds( bool bVal ) { bTimeNanoSeconds = bVal; } bool IsTimeNanoSeconds() const { return bTimeNanoSeconds; }
void AppendCloned( ScChangeAction* pAppend );
SC_DLLPUBLIC ScChangeTrack* Clone( ScDocument& rDocument ) const; staticvoid MergeActionState( ScChangeAction* pAct, const ScChangeAction* pOtherAct ); /// Get info about all ScChangeAction elements. void GetChangeTrackInfo(tools::JsonWriter&);
};
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.