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.