diff options
Diffstat (limited to 'sw/inc/IDocumentUndoRedo.hxx')
-rw-r--r-- | sw/inc/IDocumentUndoRedo.hxx | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/sw/inc/IDocumentUndoRedo.hxx b/sw/inc/IDocumentUndoRedo.hxx new file mode 100644 index 0000000000..a35145edc1 --- /dev/null +++ b/sw/inc/IDocumentUndoRedo.hxx @@ -0,0 +1,291 @@ +/* -*- 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 . + */ + +#pragma once + +#include <sal/types.h> + +#include "swundo.hxx" +#include <memory> + +class SwRewriter; +class SwNodes; +class SwUndo; +class SwView; + +namespace sw { + class RepeatContext; +} + +class SAL_LOPLUGIN_ANNOTATE("crosscast") IDocumentUndoRedo +{ +public: + + /** Enable/Disable Undo. + */ + virtual void DoUndo(bool const bDoUndo) = 0; + + /** Is Undo enabled? + */ + virtual bool DoesUndo() const = 0; + + /** Enable/Disable Group Undo. + This determines whether successive Insert/Delete/Overwrite + actions are combined. + */ + virtual void DoGroupUndo(bool const bDoUndo) = 0; + + /** Is Group Undo enabled? + */ + virtual bool DoesGroupUndo() const = 0; + + /** Enable/Disable Undo for Drawing objects. + */ + virtual void DoDrawUndo(bool const bDoUndo) = 0; + + /** Is Undo for Drawing objects enabled? + for Draw-Undo: writer wants to handle actions on Flys on its own. + */ + virtual bool DoesDrawUndo() const = 0; + + /// Enable repair mode. + virtual void DoRepair(bool bRepair) = 0; + /// Is repair mode active? + virtual bool DoesRepair() const = 0; + + /** Set the position at which the document is in the "unmodified" state + to the current position in the Undo stack. + */ + virtual void SetUndoNoModifiedPosition() = 0; + + /** Prevent updates to the "unmodified" state position + via SetUndoNoResetModified(). + */ + virtual void LockUndoNoModifiedPosition() = 0; + + /** Allow updates to the "unmodified" state position + via SetUndoNoResetModified(). + */ + virtual void UnLockUndoNoModifiedPosition() = 0; + + /** Disable (re)setting the document modified flag on Undo/Redo. + */ + virtual void SetUndoNoResetModified() = 0; + + /** Is setting the document modified flag on Undo/Redo disabled? + */ + virtual bool IsUndoNoResetModified() const = 0; + + /** Execute Undo. + + @return true if executing the last Undo action was successful. + */ + virtual bool Undo() = 0; + + /** Opens undo block. + + @remark StartUndo() and EndUndo() do nothing if !DoesUndo(). + + @param nUndoId undo ID for the list action + @param pRewriter rewriter for comments @see SwUndo::GetComment + + If the given nUndoId is equal to zero an undo object with ID + SwUndoId::START will be generated. + + @return the undo ID of the created object + */ + virtual SwUndoId StartUndo(SwUndoId const eUndoId, + SwRewriter const*const pRewriter) = 0; + + /** + Closes undo block. + + @remark StartUndo() and EndUndo() do nothing if !DoesUndo(). + + @param nUndoId undo ID for the list action + @param pRewriter rewriter for comments @see SwUndo::GetComment + + If the given nUndoId is not SwUndoId::EMPTY or SwUndoId::END, the comment of + the resulting list action will be set via the nUndoId, applying the + given pRewriter (if not 0). Otherwise the comment of the resulting + list action is unchanged if it has an UndoId that is not SwUndoId::START + set by StartUndo, and in case the UndoId is SwUndoId::START the comment + of the list action defaults to the comment of the last action + contained in the list action. + */ + virtual SwUndoId EndUndo(SwUndoId const eUndoId, + SwRewriter const*const pRewriter) = 0; + + /** + Delete all Undo actions. + Of course Undo will be disabled during deletion. + */ + virtual void DelAllUndoObj() = 0; + + /** Get Id and comment of last Undo action. + @param o_pStr if not 0, receives comment of last Undo action. + @param o_pId if not 0, receives Id of last Undo action. + @param pView if not nullptr, get the info for this view + @return true if there is a Undo action, false if none + */ + virtual bool GetLastUndoInfo(OUString *const o_pStr, + SwUndoId *const o_pId, + const SwView* pView = nullptr) const = 0; + + /** Get comments of Undo actions. + @return comments of all top-level Undo actions. + */ + virtual SwUndoComments_t GetUndoComments() const = 0; + + /** Execute Redo. + + @return true if executing the first Redo action was successful. + */ + virtual bool Redo() = 0; + + /** Get Id and comment of first Redo action. + @param o_pStr if not 0, receives comment of first Redo action. + @param o_pId if not 0, receives Id of first Redo action. + @param pView if not nullptr, get the info for this view + @return true if there is a Redo action, false if none + */ + virtual bool GetFirstRedoInfo(OUString *const o_pStr, + SwUndoId *const o_pId, + const SwView* pView = nullptr) const = 0; + + /** Get comments of Redo actions. + @return comments of all top-level Redo actions. + */ + virtual SwUndoComments_t GetRedoComments() const = 0; + + /** Repeat the last Undo action. + @return true if repeating the last Undo Redo action was attempted. + */ + virtual bool Repeat(::sw::RepeatContext & rContext, + sal_uInt16 const nRepeatCnt) = 0; + + /** Get Id and comment of last Undo action, if it is Repeat capable. + @param o_pStr if not 0, receives comment of last Undo action + if it is Repeat capable. + @return Id of last Undo action if it is Repeat capable, + or SwUndoId::EMPTY if there is none or it is not Repeat capable. + */ + virtual SwUndoId GetRepeatInfo(OUString *const o_pStr) const = 0; + + /** Add new Undo action. + Takes over ownership of pUndo. + @remark calls ClearRedo(), except for SwUndoId::START/SwUndoId::END. + @remark does nothing if !DoesUndo(). + */ + virtual void AppendUndo(std::unique_ptr<SwUndo> pUndo) = 0; + + /** Delete all Redo actions. + */ + virtual void ClearRedo() = 0; + + /* Is the given nodes array the Undo nodes array? + */ + virtual bool IsUndoNodes(SwNodes const& rNodes) const = 0; + + /** Get the number of Undo actions. + */ + virtual size_t GetUndoActionCount(const bool bCurrentLevel = true) const = 0; + + /** Return undo/redo info for this view. + */ + virtual void SetView(SwView* pView) = 0; + + /// Zero offset means undoing the top undo action. + virtual bool UndoWithOffset(size_t nUndoOffset) = 0; + +protected: + virtual ~IDocumentUndoRedo() {}; +}; + +namespace sw { + +class UndoGuard +{ +public: + + UndoGuard(IDocumentUndoRedo & rUndoRedo) + : m_rUndoRedo(rUndoRedo) + , m_bUndoWasEnabled(rUndoRedo.DoesUndo()) + { + m_rUndoRedo.DoUndo(false); + } + ~UndoGuard() + { + m_rUndoRedo.DoUndo(m_bUndoWasEnabled); + } + + bool UndoWasEnabled() const + { + return m_bUndoWasEnabled; + } + +private: + IDocumentUndoRedo & m_rUndoRedo; + bool const m_bUndoWasEnabled; +}; + +/// Blocks grouping undo actions together into an SfxListUndoAction. +class GroupUndoGuard +{ +public: + + GroupUndoGuard(IDocumentUndoRedo & rUndoRedo) + : m_rUndoRedo(rUndoRedo) + , m_bGroupUndoWasEnabled(rUndoRedo.DoesGroupUndo()) + { + m_rUndoRedo.DoGroupUndo(false); + } + ~GroupUndoGuard() + { + m_rUndoRedo.DoGroupUndo(m_bGroupUndoWasEnabled); + } + +private: + IDocumentUndoRedo & m_rUndoRedo; + bool const m_bGroupUndoWasEnabled; +}; + +class DrawUndoGuard +{ +public: + + DrawUndoGuard(IDocumentUndoRedo & rUndoRedo) + : m_rUndoRedo(rUndoRedo) + , m_bDrawUndoWasEnabled(rUndoRedo.DoesDrawUndo()) + { + m_rUndoRedo.DoDrawUndo(false); + } + ~DrawUndoGuard() + { + m_rUndoRedo.DoDrawUndo(m_bDrawUndoWasEnabled); + } + +private: + IDocumentUndoRedo & m_rUndoRedo; + bool const m_bDrawUndoWasEnabled; +}; + +} // namespace sw + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |