00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef _QDOCUMENT_COMMAND_H_
00017 #define _QDOCUMENT_COMMAND_H_
00018
00019 #include "qce-config.h"
00020
00026 #include <QUndoCommand>
00027
00028 #include "qdocument.h"
00029
00030 class QDocumentLine;
00031 class QDocumentLineHandle;
00032 class QDocumentCursorHandle;
00033
00034 class QCE_EXPORT QDocumentCommand : public QUndoCommand
00035 {
00036 public:
00037 enum Command
00038 {
00039 None,
00040 Insert,
00041 Erase,
00042 Replace,
00043 Custom
00044 };
00045
00046 struct TextCommandData
00047 {
00048 QString begin, end;
00049 int lineNumber, startOffset, endOffset;
00050 QList<QDocumentLineHandle*> handles;
00051 };
00052
00053 QDocumentCommand(Command c, QDocument *d, QDocumentCommand *p = 0);
00054 virtual ~QDocumentCommand();
00055
00056 virtual int id() const;
00057
00058 virtual bool mergeWith(const QUndoCommand *command);
00059
00060 virtual void redo();
00061 virtual void undo();
00062
00063 bool isSilent() const;
00064 void setSilent(bool y);
00065
00066 void setTargetCursor(QDocumentCursorHandle *h);
00067
00068 void setRedoOffset(int off);
00069 void setUndoOffset(int off);
00070
00071 static bool isAutoUpdated(const QDocumentCursorHandle *h);
00072 static void enableAutoUpdate(QDocumentCursorHandle *h);
00073 static void disableAutoUpdate(QDocumentCursorHandle *h);
00074 static void discardHandlesFromDocument(QDocument *d);
00075
00076 protected:
00077 bool m_state, m_first;
00078 QDocument *m_doc;
00079 int m_redoOffset, m_undoOffset;
00080
00081 void markRedone(QDocumentLineHandle *h, bool firstTime);
00082 void markUndone(QDocumentLineHandle *h);
00083
00084 void updateTarget(int l, int offset);
00085
00086 void insertText(int line, int pos, const QString& s);
00087 void removeText(int line, int pos, int length);
00088
00089 void insertLines(int after, const QList<QDocumentLineHandle*>& l);
00090 void removeLines(int after, int n);
00091
00092 void updateCursorsOnInsertion(int line, int column, int prefixLength, int numLines, int suffixLength);
00093 void updateCursorsOnDeletion(int line, int column, int prefixLength, int numLines, int suffixLength);
00094
00095 private:
00096 bool m_silent;
00097 Command m_command;
00098 QDocumentCursorHandle *m_cursor;
00099
00100 static QList<QDocumentCursorHandle*> m_autoUpdated;
00101 };
00102
00103 Q_DECLARE_TYPEINFO(QDocumentCommand::TextCommandData, Q_MOVABLE_TYPE);
00104
00105 class QCE_EXPORT QDocumentInsertCommand : public QDocumentCommand
00106 {
00107 public:
00108 QDocumentInsertCommand( int l, int offset,
00109 const QString& text,
00110 QDocument *doc,
00111 QDocumentCommand *p = 0);
00112
00113 virtual ~QDocumentInsertCommand();
00114
00115 virtual bool mergeWith(const QUndoCommand *command);
00116
00117 virtual void redo();
00118 virtual void undo();
00119
00120 private:
00121 TextCommandData m_data;
00122 };
00123
00124 class QCE_EXPORT QDocumentEraseCommand : public QDocumentCommand
00125 {
00126 public:
00127 QDocumentEraseCommand( int bl, int bo,
00128 int el, int eo,
00129 QDocument *doc,
00130 QDocumentCommand *p = 0);
00131
00132 virtual ~QDocumentEraseCommand();
00133
00134 virtual bool mergeWith(const QUndoCommand *command);
00135
00136 virtual void redo();
00137 virtual void undo();
00138
00139 private:
00140 TextCommandData m_data;
00141 };
00142
00143 class QCE_EXPORT QDocumentCommandBlock : public QDocumentCommand
00144 {
00145 public:
00146 QDocumentCommandBlock(QDocument *d);
00147 virtual ~QDocumentCommandBlock();
00148
00149 virtual void redo();
00150 virtual void undo();
00151
00152 void setWeakLock(bool l);
00153 bool isWeakLocked() const;
00154
00155 virtual void addCommand(QDocumentCommand *c);
00156 virtual void removeCommand(QDocumentCommand *c);
00157
00158 private:
00159 bool m_weakLocked;
00160 QList<QDocumentCommand*> m_commands;
00161 };
00162
00163 #endif