summaryrefslogtreecommitdiffstats
path: root/externals/qhexedit/commands.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'externals/qhexedit/commands.cpp')
-rw-r--r--externals/qhexedit/commands.cpp115
1 files changed, 115 insertions, 0 deletions
diff --git a/externals/qhexedit/commands.cpp b/externals/qhexedit/commands.cpp
new file mode 100644
index 000000000..303091d1d
--- /dev/null
+++ b/externals/qhexedit/commands.cpp
@@ -0,0 +1,115 @@
+#include "commands.h"
+
+CharCommand::CharCommand(XByteArray * xData, Cmd cmd, int charPos, char newChar, QUndoCommand *parent)
+ : QUndoCommand(parent)
+{
+ _xData = xData;
+ _charPos = charPos;
+ _newChar = newChar;
+ _cmd = cmd;
+}
+
+bool CharCommand::mergeWith(const QUndoCommand *command)
+{
+ const CharCommand *nextCommand = static_cast<const CharCommand *>(command);
+ bool result = false;
+
+ if (_cmd != remove)
+ {
+ if (nextCommand->_cmd == replace)
+ if (nextCommand->_charPos == _charPos)
+ {
+ _newChar = nextCommand->_newChar;
+ result = true;
+ }
+ }
+ return result;
+}
+
+void CharCommand::undo()
+{
+ switch (_cmd)
+ {
+ case insert:
+ _xData->remove(_charPos, 1);
+ break;
+ case replace:
+ _xData->replace(_charPos, _oldChar);
+ _xData->setDataChanged(_charPos, _wasChanged);
+ break;
+ case remove:
+ _xData->insert(_charPos, _oldChar);
+ _xData->setDataChanged(_charPos, _wasChanged);
+ break;
+ }
+}
+
+void CharCommand::redo()
+{
+ switch (_cmd)
+ {
+ case insert:
+ _xData->insert(_charPos, _newChar);
+ break;
+ case replace:
+ _oldChar = _xData->data()[_charPos];
+ _wasChanged = _xData->dataChanged(_charPos);
+ _xData->replace(_charPos, _newChar);
+ break;
+ case remove:
+ _oldChar = _xData->data()[_charPos];
+ _wasChanged = _xData->dataChanged(_charPos);
+ _xData->remove(_charPos, 1);
+ break;
+ }
+}
+
+
+
+ArrayCommand::ArrayCommand(XByteArray * xData, Cmd cmd, int baPos, QByteArray newBa, int len, QUndoCommand *parent)
+ : QUndoCommand(parent)
+{
+ _cmd = cmd;
+ _xData = xData;
+ _baPos = baPos;
+ _newBa = newBa;
+ _len = len;
+}
+
+void ArrayCommand::undo()
+{
+ switch (_cmd)
+ {
+ case insert:
+ _xData->remove(_baPos, _newBa.length());
+ break;
+ case replace:
+ _xData->replace(_baPos, _oldBa);
+ _xData->setDataChanged(_baPos, _wasChanged);
+ break;
+ case remove:
+ _xData->insert(_baPos, _oldBa);
+ _xData->setDataChanged(_baPos, _wasChanged);
+ break;
+ }
+}
+
+void ArrayCommand::redo()
+{
+ switch (_cmd)
+ {
+ case insert:
+ _xData->insert(_baPos, _newBa);
+ break;
+ case replace:
+ _oldBa = _xData->data().mid(_baPos, _len);
+ _wasChanged = _xData->dataChanged(_baPos, _len);
+ _xData->replace(_baPos, _newBa);
+ break;
+ case remove:
+ _oldBa = _xData->data().mid(_baPos, _len);
+ _wasChanged = _xData->dataChanged(_baPos, _len);
+ _xData->remove(_baPos, _len);
+ break;
+ }
+}