2
0

undo.inc 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. {
  2. $Id$
  3. "SHEdit" - Text editor with syntax highlighting
  4. Copyright (C) 1999-2000 by Sebastian Guenther ([email protected])
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. }
  11. // TSHTextEdit: Undo/Redo support
  12. function TUndoInfo.Merge(AEdit: TSHTextEdit; AInfo: TUndoInfo): Boolean;
  13. begin
  14. Result := False;
  15. end;
  16. constructor TUndoEdit.Create;
  17. begin
  18. inherited Create;
  19. NumOfChars := 1;
  20. end;
  21. constructor TUndoEdit.Create(ANumOfChars: Integer);
  22. begin
  23. inherited Create;
  24. NumOfChars := ANumOfChars;
  25. end;
  26. function TUndoEdit.Merge(AEdit: TSHTextEdit; AInfo: TUndoInfo): Boolean;
  27. begin
  28. // if (CursorX <> AEdit.CursorX - TUndoEdit(AInfo).NumOfChars) or
  29. // (CursorY <> AEdit.CursorY) then exit(False);
  30. Inc(NumOfChars, TUndoEdit(AInfo).NumOfChars);
  31. if AEdit.CursorY = CursorY + 1 then begin
  32. CursorX := 0;
  33. Inc(CursorY);
  34. end else
  35. Inc(CursorX, TUndoEdit(AInfo).NumOfChars);
  36. Result := True;
  37. end;
  38. procedure TUndoEdit.DoUndo(AEdit: TSHTextEdit);
  39. begin
  40. AEdit.FCursorX := CursorX;
  41. AEdit.FCursorY := CursorY;
  42. AEdit.MultiDelLeft(NumOfChars);
  43. end;
  44. constructor TUndoDelLeft.Create(const ADeletedString: String);
  45. begin
  46. inherited Create;
  47. DeletedString := ADeletedString;
  48. end;
  49. function TUndoDelLeft.Merge(AEdit: TSHTextEdit; AInfo: TUndoInfo): Boolean;
  50. var
  51. l: Integer;
  52. begin
  53. if TUndoDelLeft(AInfo).
  54. DeletedString[Length(TUndoDelLeft(AInfo).DeletedString)] = #13 then
  55. exit(False);
  56. l := Length(TUndoDelLeft(AInfo).DeletedString);
  57. if CursorY <> AEdit.CursorY then exit(False);
  58. if CursorX = AEdit.CursorX + l then begin
  59. DeletedString := TUndoDelLeft(AInfo).DeletedString + DeletedString;
  60. Dec(CursorX, l);
  61. end else if CursorX = AEdit.CursorX then
  62. DeletedString := DeletedString + TUndoDelLeft(AInfo).DeletedString
  63. else
  64. exit(False);
  65. Result := True;
  66. end;
  67. procedure TUndoDelLeft.DoUndo(AEdit: TSHTextEdit);
  68. begin
  69. AEdit.FCursorX := CursorX;
  70. AEdit.FCursorY := CursorY;
  71. AEdit.ExecKeys(DeletedString, False);
  72. end;
  73. procedure TUndoDelRight.DoUndo(AEdit: TSHTextEdit);
  74. var
  75. OldX, OldY: Integer;
  76. begin
  77. OldX := CursorX;
  78. OldY := CursorY;
  79. AEdit.FCursorX := CursorX;
  80. AEdit.FCursorY := CursorY;
  81. AEdit.ExecKeys(DeletedString, False);
  82. AEdit.FCursorX := OldX;
  83. AEdit.FCursorY := OldY;
  84. end;
  85. procedure TSHTextEdit.AddUndoInfo(AInfo: TUndoInfo; CanMerge: Boolean);
  86. var
  87. ok: Boolean;
  88. info: TUndoInfo;
  89. begin
  90. ok := False;
  91. info := LastUndoInfo;
  92. if CanMerge and Assigned(info) and (info.ClassType = AInfo.ClassType) then begin
  93. if info.Merge(Self, AInfo) then begin
  94. AInfo.Free;
  95. AInfo := info;
  96. ok := True;
  97. end;
  98. end;
  99. if not ok then begin
  100. if LastUndoInfo = nil then
  101. LastUndoInfo := AInfo
  102. else begin
  103. AInfo.Prev := LastUndoInfo;
  104. LastUndoInfo.Next := AInfo;
  105. LastUndoInfo := AInfo;
  106. end;
  107. AInfo.CursorX := FCursorX;
  108. AInfo.CursorY := FCursorY;
  109. end;
  110. end;
  111. {
  112. $Log$
  113. Revision 1.2 2000-07-13 11:33:02 michael
  114. + removed logs
  115. }