| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- {
- $Id$
- "SHEdit" - Text editor with syntax highlighting
- Copyright (C) 1999-2000 by Sebastian Guenther ([email protected])
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- }
- // TSHTextEdit: Undo/Redo support
- function TUndoInfo.Merge(AEdit: TSHTextEdit; AInfo: TUndoInfo): Boolean;
- begin
- Result := False;
- end;
- constructor TUndoEdit.Create;
- begin
- inherited Create;
- NumOfChars := 1;
- end;
- constructor TUndoEdit.Create(ANumOfChars: Integer);
- begin
- inherited Create;
- NumOfChars := ANumOfChars;
- end;
- function TUndoEdit.Merge(AEdit: TSHTextEdit; AInfo: TUndoInfo): Boolean;
- begin
- // if (CursorX <> AEdit.CursorX - TUndoEdit(AInfo).NumOfChars) or
- // (CursorY <> AEdit.CursorY) then exit(False);
- Inc(NumOfChars, TUndoEdit(AInfo).NumOfChars);
- if AEdit.CursorY = CursorY + 1 then begin
- CursorX := 0;
- Inc(CursorY);
- end else
- Inc(CursorX, TUndoEdit(AInfo).NumOfChars);
- Result := True;
- end;
- procedure TUndoEdit.DoUndo(AEdit: TSHTextEdit);
- begin
- AEdit.FCursorX := CursorX;
- AEdit.FCursorY := CursorY;
- AEdit.MultiDelLeft(NumOfChars);
- end;
- constructor TUndoDelLeft.Create(const ADeletedString: String);
- begin
- inherited Create;
- DeletedString := ADeletedString;
- end;
- function TUndoDelLeft.Merge(AEdit: TSHTextEdit; AInfo: TUndoInfo): Boolean;
- var
- l: Integer;
- begin
- if TUndoDelLeft(AInfo).
- DeletedString[Length(TUndoDelLeft(AInfo).DeletedString)] = #13 then
- exit(False);
- l := Length(TUndoDelLeft(AInfo).DeletedString);
- if CursorY <> AEdit.CursorY then exit(False);
- if CursorX = AEdit.CursorX + l then begin
- DeletedString := TUndoDelLeft(AInfo).DeletedString + DeletedString;
- Dec(CursorX, l);
- end else if CursorX = AEdit.CursorX then
- DeletedString := DeletedString + TUndoDelLeft(AInfo).DeletedString
- else
- exit(False);
- Result := True;
- end;
- procedure TUndoDelLeft.DoUndo(AEdit: TSHTextEdit);
- begin
- AEdit.FCursorX := CursorX;
- AEdit.FCursorY := CursorY;
- AEdit.ExecKeys(DeletedString, False);
- end;
- procedure TUndoDelRight.DoUndo(AEdit: TSHTextEdit);
- var
- OldX, OldY: Integer;
- begin
- OldX := CursorX;
- OldY := CursorY;
- AEdit.FCursorX := CursorX;
- AEdit.FCursorY := CursorY;
- AEdit.ExecKeys(DeletedString, False);
- AEdit.FCursorX := OldX;
- AEdit.FCursorY := OldY;
- end;
- procedure TSHTextEdit.AddUndoInfo(AInfo: TUndoInfo; CanMerge: Boolean);
- var
- ok: Boolean;
- info: TUndoInfo;
- begin
- ok := False;
- info := LastUndoInfo;
- if CanMerge and Assigned(info) and (info.ClassType = AInfo.ClassType) then begin
- if info.Merge(Self, AInfo) then begin
- AInfo.Free;
- AInfo := info;
- ok := True;
- end;
- end;
- if not ok then begin
- if LastUndoInfo = nil then
- LastUndoInfo := AInfo
- else begin
- AInfo.Prev := LastUndoInfo;
- LastUndoInfo.Next := AInfo;
- LastUndoInfo := AInfo;
- end;
- AInfo.CursorX := FCursorX;
- AInfo.CursorY := FCursorY;
- end;
- end;
- {
- $Log$
- Revision 1.2 2000-07-13 11:33:02 michael
- + removed logs
-
- }
|