/* SPDX-FileCopyrightText: 2013 Jon Mease Work sponsored by the LiMux project of the city of Munich: SPDX-FileCopyrightText: 2017 Klarälvdalens Datakonsult AB a KDAB Group company SPDX-License-Identifier: GPL-2.0-or-later */ #ifndef _OKULAR_DOCUMENT_COMMANDS_P_H_ #define _OKULAR_DOCUMENT_COMMANDS_P_H_ #include #include #include "area.h" namespace Okular { class Document; class Annotation; class DocumentPrivate; class FormFieldText; class FormFieldButton; class FormFieldChoice; class Page; class OkularUndoCommand : public QUndoCommand { public: virtual bool refreshInternalPageReferences(const QVector &newPagesVector) = 0; }; class AddAnnotationCommand : public OkularUndoCommand { public: AddAnnotationCommand(Okular::DocumentPrivate *docPriv, Okular::Annotation *annotation, int pageNumber); ~AddAnnotationCommand() override; void undo() override; void redo() override; bool refreshInternalPageReferences(const QVector &newPagesVector) override; private: Okular::DocumentPrivate *m_docPriv; Okular::Annotation *m_annotation; int m_pageNumber; bool m_done; }; class RemoveAnnotationCommand : public OkularUndoCommand { public: RemoveAnnotationCommand(Okular::DocumentPrivate *doc, Okular::Annotation *annotation, int pageNumber); ~RemoveAnnotationCommand() override; void undo() override; void redo() override; bool refreshInternalPageReferences(const QVector &newPagesVector) override; private: Okular::DocumentPrivate *m_docPriv; Okular::Annotation *m_annotation; int m_pageNumber; bool m_done; }; class ModifyAnnotationPropertiesCommand : public OkularUndoCommand { public: ModifyAnnotationPropertiesCommand(Okular::DocumentPrivate *docPriv, Okular::Annotation *annotation, int pageNumber, const QDomNode &oldProperties, const QDomNode &newProperties); void undo() override; void redo() override; bool refreshInternalPageReferences(const QVector &newPagesVector) override; private: Okular::DocumentPrivate *m_docPriv; Okular::Annotation *m_annotation; int m_pageNumber; QDomNode m_prevProperties; QDomNode m_newProperties; }; class TranslateAnnotationCommand : public OkularUndoCommand { public: TranslateAnnotationCommand(Okular::DocumentPrivate *docPriv, Okular::Annotation *annotation, int pageNumber, const Okular::NormalizedPoint &delta, bool completeDrag); void undo() override; void redo() override; int id() const override; bool mergeWith(const QUndoCommand *uc) override; Okular::NormalizedPoint minusDelta(); Okular::NormalizedRect translateBoundingRectangle(const Okular::NormalizedPoint &delta); bool refreshInternalPageReferences(const QVector &newPagesVector) override; private: Okular::DocumentPrivate *m_docPriv; Okular::Annotation *m_annotation; int m_pageNumber; Okular::NormalizedPoint m_delta; bool m_completeDrag; }; class AdjustAnnotationCommand : public OkularUndoCommand { public: AdjustAnnotationCommand(Okular::DocumentPrivate *docPriv, Okular::Annotation *annotation, int pageNumber, const Okular::NormalizedPoint &delta1, const Okular::NormalizedPoint &delta2, bool completeDrag); void undo() override; void redo() override; int id() const override; bool mergeWith(const QUndoCommand *uc) override; Okular::NormalizedRect adjustBoundingRectangle(const Okular::NormalizedPoint &delta1, const Okular::NormalizedPoint &delta2); bool refreshInternalPageReferences(const QVector &newPagesVector) override; private: Okular::DocumentPrivate *m_docPriv; Okular::Annotation *m_annotation; int m_pageNumber; Okular::NormalizedPoint m_delta1; Okular::NormalizedPoint m_delta2; bool m_completeDrag; }; class EditTextCommand : public OkularUndoCommand { public: EditTextCommand(const QString &newContents, int newCursorPos, const QString &prevContents, int prevCursorPos, int prevAnchorPos); void undo() override = 0; void redo() override = 0; int id() const override = 0; bool mergeWith(const QUndoCommand *uc) override; private: enum EditType { CharBackspace, ///< Edit made up of one or more single character backspace operations CharDelete, ///< Edit made up of one or more single character delete operations CharInsert, ///< Edit made up of one or more single character insertion operations OtherEdit ///< All other edit operations (these will not be merged together) }; QString oldContentsLeftOfCursor(); QString newContentsLeftOfCursor(); QString oldContentsRightOfCursor(); QString newContentsRightOfCursor(); protected: QString m_newContents; int m_newCursorPos; QString m_prevContents; int m_prevCursorPos; int m_prevAnchorPos; EditType m_editType; }; class EditAnnotationContentsCommand : public EditTextCommand { public: EditAnnotationContentsCommand(Okular::DocumentPrivate *docPriv, Okular::Annotation *annotation, int pageNumber, const QString &newContents, int newCursorPos, const QString &prevContents, int prevCursorPos, int prevAnchorPos); void undo() override; void redo() override; int id() const override; bool mergeWith(const QUndoCommand *uc) override; bool refreshInternalPageReferences(const QVector &newPagesVector) override; private: Okular::DocumentPrivate *m_docPriv; Okular::Annotation *m_annotation; int m_pageNumber; }; class EditFormTextCommand : public EditTextCommand { public: EditFormTextCommand(Okular::DocumentPrivate *docPriv, Okular::FormFieldText *form, int pageNumber, const QString &newContents, int newCursorPos, const QString &prevContents, int prevCursorPos, int prevAnchorPos); void undo() override; void redo() override; int id() const override; bool mergeWith(const QUndoCommand *uc) override; bool refreshInternalPageReferences(const QVector &newPagesVector) override; private: Okular::DocumentPrivate *m_docPriv; Okular::FormFieldText *m_form; int m_pageNumber; }; class EditFormListCommand : public OkularUndoCommand { public: EditFormListCommand(Okular::DocumentPrivate *docPriv, FormFieldChoice *form, int pageNumber, const QList &newChoices, const QList &prevChoices); void undo() override; void redo() override; bool refreshInternalPageReferences(const QVector &newPagesVector) override; private: Okular::DocumentPrivate *m_docPriv; FormFieldChoice *m_form; int m_pageNumber; QList m_newChoices; QList m_prevChoices; }; class EditFormComboCommand : public EditTextCommand { public: EditFormComboCommand(Okular::DocumentPrivate *docPriv, FormFieldChoice *form, int pageNumber, const QString &newContents, int newCursorPos, const QString &prevContents, int prevCursorPos, int prevAnchorPos); void undo() override; void redo() override; int id() const override; bool mergeWith(const QUndoCommand *uc) override; bool refreshInternalPageReferences(const QVector &newPagesVector) override; private: Okular::DocumentPrivate *m_docPriv; FormFieldChoice *m_form; int m_pageNumber; int m_newIndex; int m_prevIndex; }; class EditFormButtonsCommand : public OkularUndoCommand { public: EditFormButtonsCommand(Okular::DocumentPrivate *docPriv, int pageNumber, const QList &formButtons, const QList &newButtonStates); void undo() override; void redo() override; bool refreshInternalPageReferences(const QVector &newPagesVector) override; private: void clearFormButtonStates(); private: Okular::DocumentPrivate *m_docPriv; int m_pageNumber; QList m_formButtons; QList m_pageNumbers; QList m_newButtonStates; QList m_prevButtonStates; }; } #endif /* kate: replace-tabs on; indent-width 4; */