commands.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "commands.h"
  2. CharCommand::CharCommand(XByteArray * xData, Cmd cmd, int charPos, char newChar, QUndoCommand *parent)
  3. : QUndoCommand(parent)
  4. {
  5. _xData = xData;
  6. _charPos = charPos;
  7. _newChar = newChar;
  8. _cmd = cmd;
  9. }
  10. bool CharCommand::mergeWith(const QUndoCommand *command)
  11. {
  12. const CharCommand *nextCommand = static_cast<const CharCommand *>(command);
  13. bool result = false;
  14. if (_cmd != remove)
  15. {
  16. if (nextCommand->_cmd == replace)
  17. if (nextCommand->_charPos == _charPos)
  18. {
  19. _newChar = nextCommand->_newChar;
  20. result = true;
  21. }
  22. }
  23. return result;
  24. }
  25. void CharCommand::undo()
  26. {
  27. switch (_cmd)
  28. {
  29. case insert:
  30. _xData->remove(_charPos, 1);
  31. break;
  32. case replace:
  33. _xData->replace(_charPos, _oldChar);
  34. _xData->setDataChanged(_charPos, _wasChanged);
  35. break;
  36. case remove:
  37. _xData->insert(_charPos, _oldChar);
  38. _xData->setDataChanged(_charPos, _wasChanged);
  39. break;
  40. }
  41. }
  42. void CharCommand::redo()
  43. {
  44. switch (_cmd)
  45. {
  46. case insert:
  47. _xData->insert(_charPos, _newChar);
  48. break;
  49. case replace:
  50. _oldChar = _xData->data()[_charPos];
  51. _wasChanged = _xData->dataChanged(_charPos);
  52. _xData->replace(_charPos, _newChar);
  53. break;
  54. case remove:
  55. _oldChar = _xData->data()[_charPos];
  56. _wasChanged = _xData->dataChanged(_charPos);
  57. _xData->remove(_charPos, 1);
  58. break;
  59. }
  60. }
  61. ArrayCommand::ArrayCommand(XByteArray * xData, Cmd cmd, int baPos, QByteArray newBa, int len, QUndoCommand *parent)
  62. : QUndoCommand(parent)
  63. {
  64. _cmd = cmd;
  65. _xData = xData;
  66. _baPos = baPos;
  67. _newBa = newBa;
  68. _len = len;
  69. }
  70. void ArrayCommand::undo()
  71. {
  72. switch (_cmd)
  73. {
  74. case insert:
  75. _xData->remove(_baPos, _newBa.length());
  76. break;
  77. case replace:
  78. _xData->replace(_baPos, _oldBa);
  79. _xData->setDataChanged(_baPos, _wasChanged);
  80. break;
  81. case remove:
  82. _xData->insert(_baPos, _oldBa);
  83. _xData->setDataChanged(_baPos, _wasChanged);
  84. break;
  85. }
  86. }
  87. void ArrayCommand::redo()
  88. {
  89. switch (_cmd)
  90. {
  91. case insert:
  92. _xData->insert(_baPos, _newBa);
  93. break;
  94. case replace:
  95. _oldBa = _xData->data().mid(_baPos, _len);
  96. _wasChanged = _xData->dataChanged(_baPos, _len);
  97. _xData->replace(_baPos, _newBa);
  98. break;
  99. case remove:
  100. _oldBa = _xData->data().mid(_baPos, _len);
  101. _wasChanged = _xData->dataChanged(_baPos, _len);
  102. _xData->remove(_baPos, _len);
  103. break;
  104. }
  105. }