added editor position-buffer, controlled with mbX1-mbX2

This commit is contained in:
Basile Burg 2014-11-26 01:57:19 +01:00
parent 547985bcbe
commit 37f281c1df
1 changed files with 73 additions and 1 deletions

View File

@ -10,6 +10,21 @@ uses
ce_common, ce_observer; ce_common, ce_observer;
type type
TCESynMemoPositions = class
private
fPos: Integer;
fMax: Integer;
fList: TFPList;
fMemo: TSynMemo;
public
constructor create(aMemo: TSynMemo);
destructor destroy; override;
procedure store;
procedure back;
procedure next;
end;
TCESynMemo = class(TSynMemo) TCESynMemo = class(TSynMemo)
private private
fFilename: string; fFilename: string;
@ -22,6 +37,7 @@ type
fTempFileName: string; fTempFileName: string;
fMultiDocSubject: TCECustomSubject; fMultiDocSubject: TCECustomSubject;
fStoredFontSize: Integer; fStoredFontSize: Integer;
fPositions: TCESynMemoPositions;
procedure changeNotify(Sender: TObject); procedure changeNotify(Sender: TObject);
procedure identifierToD2Syn; procedure identifierToD2Syn;
protected protected
@ -61,6 +77,50 @@ implementation
uses uses
graphics, ce_interfaces; graphics, ce_interfaces;
constructor TCESynMemoPositions.create(aMemo: TSynMemo);
begin
fList := TFPList.Create;
fMax := 20;
fMemo := aMemo;
fPos := -1;
end;
destructor TCESynMemoPositions.destroy;
begin
fList.Free;
inherited;
end;
procedure TCESynMemoPositions.back;
begin
Inc(fPos);
if fPos < fList.Count then
fMemo.CaretY := Integer(fList.Items[fPos])
else Dec(fPos);
end;
procedure TCESynMemoPositions.next;
begin
Dec(fPos);
if fPos > -1 then
fMemo.CaretY := Integer(fList.Items[fPos])
else Inc(fPos);
end;
procedure TCESynMemoPositions.store;
begin
fPos := 0;
if fList.Count > 0 then
{$WARNINGS OFF}
if Integer(fList.Items[fPos]) = fMemo.CaretY then
exit;
{$WARNINGS ON}
//
fList.Insert(0, Pointer(fMemo.CaretY));
while fList.Count > fMax do
fList.Delete(fList.Count-1);
end;
constructor TCESynMemo.Create(aOwner: TComponent); constructor TCESynMemo.Create(aOwner: TComponent);
begin begin
inherited; inherited;
@ -95,6 +155,7 @@ begin
ShowHint := true; ShowHint := true;
TextBuffer.AddNotifyHandler(senrUndoRedoAdded, @changeNotify); TextBuffer.AddNotifyHandler(senrUndoRedoAdded, @changeNotify);
// //
fPositions := TCESynMemoPositions.create(self);
fMultiDocSubject := TCEMultiDocSubject.create; fMultiDocSubject := TCEMultiDocSubject.create;
subjDocNew(TCEMultiDocSubject(fMultiDocSubject), self); subjDocNew(TCEMultiDocSubject(fMultiDocSubject), self);
end; end;
@ -103,6 +164,7 @@ destructor TCESynMemo.destroy;
begin begin
subjDocClosing(TCEMultiDocSubject(fMultiDocSubject), self); subjDocClosing(TCEMultiDocSubject(fMultiDocSubject), self);
fMultiDocSubject.Free; fMultiDocSubject.Free;
fPositions.Free;
// //
if fileExists(fTempFileName) then if fileExists(fTempFileName) then
sysutils.DeleteFile(fTempFileName); sysutils.DeleteFile(fTempFileName);
@ -154,6 +216,7 @@ procedure TCESynMemo.changeNotify(Sender: TObject);
begin begin
identifierToD2Syn; identifierToD2Syn;
fModified := true; fModified := true;
fPositions.store;
subjDocChanged(TCEMultiDocSubject(fMultiDocSubject), self); subjDocChanged(TCEMultiDocSubject(fMultiDocSubject), self);
end; end;
@ -216,6 +279,9 @@ end;
procedure TCESynMemo.KeyDown(var Key: Word; Shift: TShiftState); procedure TCESynMemo.KeyDown(var Key: Word; Shift: TShiftState);
begin begin
if Key in [VK_PRIOR, VK_NEXT] then
fPositions.store;
//
inherited; inherited;
identifierToD2Syn; identifierToD2Syn;
// //
@ -243,7 +309,13 @@ procedure TCESynMemo.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y:Inte
begin begin
inherited; inherited;
if (Button = mbMiddle) and (Shift = [ssCtrl]) then if (Button = mbMiddle) and (Shift = [ssCtrl]) then
Font.Size := fStoredFontSize; Font.Size := fStoredFontSize
else if Button = mbExtra1 then
fPositions.back
else if Button = mbExtra2 then
fPositions.next
else if Button = mbLeft then
fPositions.store;
end; end;
initialization initialization