mirror of https://gitlab.com/basile.b/dexed.git
added editor cache system
This commit is contained in:
parent
4903d8097a
commit
32c1defa71
|
@ -7,10 +7,45 @@ interface
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, SynEdit, ce_d2syn, ce_txtsyn ,SynEditHighlighter,
|
Classes, SysUtils, SynEdit, ce_d2syn, ce_txtsyn ,SynEditHighlighter,
|
||||||
controls, lcltype, LazSynEditText, SynEditKeyCmds, SynHighlighterLFM, SynEditMouseCmds,
|
controls, lcltype, LazSynEditText, SynEditKeyCmds, SynHighlighterLFM, SynEditMouseCmds,
|
||||||
ce_common, ce_observer;
|
ce_common, ce_observer, ce_writableComponent, crc, SynEditFoldedView;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
|
TCESynMemo = class;
|
||||||
|
|
||||||
|
// TextView, TSynEditFoldedView
|
||||||
|
TCEFoldCache = class(TCollectionItem)
|
||||||
|
private
|
||||||
|
fCollapsed: boolean;
|
||||||
|
fLineIndex: Integer;
|
||||||
|
fNestedIndex: Integer;
|
||||||
|
published
|
||||||
|
property isCollapsed: boolean read fCollapsed write fCollapsed;
|
||||||
|
property lineIndex: Integer read fLineIndex write fLineIndex;
|
||||||
|
property nestedIndex: Integer read fNestedIndex write fNestedIndex;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TCESynMemoCache = class(TWritableComponent)
|
||||||
|
private
|
||||||
|
fMemo: TCESynMemo;
|
||||||
|
fFolds: TCollection;
|
||||||
|
fCaretPosition: Integer;
|
||||||
|
fSelectionEnd: Integer;
|
||||||
|
procedure setFolds(someFolds: TCollection);
|
||||||
|
published
|
||||||
|
property caretPosition: Integer read fCaretPosition write fCaretPosition;
|
||||||
|
property selectionEnd: Integer read fSelectionEnd write fSelectionEnd;
|
||||||
|
//property folds: TCollection read fFolds write setFolds;
|
||||||
|
public
|
||||||
|
constructor create(aComponent: TComponent); override;
|
||||||
|
destructor destroy; override;
|
||||||
|
//
|
||||||
|
procedure beforeSave; override;
|
||||||
|
procedure afterLoad; override;
|
||||||
|
procedure save;
|
||||||
|
procedure load;
|
||||||
|
end;
|
||||||
|
|
||||||
TCESynMemoPositions = class
|
TCESynMemoPositions = class
|
||||||
private
|
private
|
||||||
fPos: Integer;
|
fPos: Integer;
|
||||||
|
@ -40,6 +75,8 @@ type
|
||||||
fPositions: TCESynMemoPositions;
|
fPositions: TCESynMemoPositions;
|
||||||
procedure changeNotify(Sender: TObject);
|
procedure changeNotify(Sender: TObject);
|
||||||
procedure identifierToD2Syn;
|
procedure identifierToD2Syn;
|
||||||
|
procedure saveCache;
|
||||||
|
procedure loadCache;
|
||||||
protected
|
protected
|
||||||
procedure SetHighlighter(const Value: TSynCustomHighlighter); override;
|
procedure SetHighlighter(const Value: TSynCustomHighlighter); override;
|
||||||
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
|
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
|
||||||
|
@ -66,6 +103,7 @@ type
|
||||||
//
|
//
|
||||||
property isDSource: boolean read fIsDSource;
|
property isDSource: boolean read fIsDSource;
|
||||||
property isProjectSource: boolean read fIsConfig;
|
property isProjectSource: boolean read fIsConfig;
|
||||||
|
property TextView;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
|
@ -76,7 +114,77 @@ var
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
graphics, ce_interfaces, ce_staticmacro, ce_dcd;
|
graphics, ce_interfaces, ce_staticmacro, ce_dcd, SynEditHighlighterFoldBase;
|
||||||
|
|
||||||
|
{$REGION TCESynMemoCache -------------------------------------------------------}
|
||||||
|
constructor TCESynMemoCache.create(aComponent: TComponent);
|
||||||
|
begin
|
||||||
|
inherited create(nil);
|
||||||
|
if (aComponent is TCESynMemo) then
|
||||||
|
fMemo := TCESynMemo(aComponent);
|
||||||
|
fFolds := TCollection.Create(TCEFoldCache);
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TCESynMemoCache.destroy;
|
||||||
|
begin
|
||||||
|
fFolds.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCESynMemoCache.setFolds(someFolds: TCollection);
|
||||||
|
begin
|
||||||
|
fFolds.Assign(someFolds);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCESynMemoCache.beforeSave;
|
||||||
|
//var
|
||||||
|
// i: Integer;
|
||||||
|
// itm : TCEFoldCache;
|
||||||
|
begin
|
||||||
|
if fMemo = nil then exit;
|
||||||
|
//
|
||||||
|
fCaretPosition := fMemo.SelStart;
|
||||||
|
fSelectionEnd := fMemo.SelEnd;
|
||||||
|
//
|
||||||
|
//TODO-cEditor Cache: folding persistence
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCESynMemoCache.afterLoad;
|
||||||
|
begin
|
||||||
|
if fMemo = nil then exit;
|
||||||
|
//
|
||||||
|
fMemo.SelStart := fCaretPosition;
|
||||||
|
fMemo.SelEnd := fSelectionEnd;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCESynMemoCache.save;
|
||||||
|
var
|
||||||
|
fname: string;
|
||||||
|
tempn: string;
|
||||||
|
begin
|
||||||
|
tempn := fMemo.fileName;
|
||||||
|
if not fileExists(tempn) then exit;
|
||||||
|
//
|
||||||
|
fname := getDocPath + 'editorcache' + DirectorySeparator;
|
||||||
|
ForceDirectories(fname);
|
||||||
|
fname := fname + format('%.8X.txt', [crc32(0, @tempn[1], length(tempn))]);
|
||||||
|
saveToFile(fname);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCESynMemoCache.load;
|
||||||
|
var
|
||||||
|
fname: string;
|
||||||
|
tempn: string;
|
||||||
|
begin
|
||||||
|
tempn := fMemo.fileName;
|
||||||
|
if not fileExists(tempn) then exit;
|
||||||
|
//
|
||||||
|
fname := getDocPath + 'editorcache' + DirectorySeparator;
|
||||||
|
fname := fname + format('%.8X.txt', [crc32(0, @tempn[1], length(tempn))]);
|
||||||
|
//
|
||||||
|
if not fileExists(fname) then exit;
|
||||||
|
loadFromFile(fname);
|
||||||
|
end;
|
||||||
|
{$ENDREGION}
|
||||||
|
|
||||||
{$REGION TCESynMemoPositions ---------------------------------------------------}
|
{$REGION TCESynMemoPositions ---------------------------------------------------}
|
||||||
constructor TCESynMemoPositions.create(aMemo: TCustomSynEdit);
|
constructor TCESynMemoPositions.create(aMemo: TCustomSynEdit);
|
||||||
|
@ -158,6 +266,7 @@ begin
|
||||||
Gutter.SeparatorPart.LineWidth := 1;
|
Gutter.SeparatorPart.LineWidth := 1;
|
||||||
Gutter.SeparatorPart.MarkupInfo.Foreground := clGray;
|
Gutter.SeparatorPart.MarkupInfo.Foreground := clGray;
|
||||||
Gutter.CodeFoldPart.MarkupInfo.Foreground := clGray;
|
Gutter.CodeFoldPart.MarkupInfo.Foreground := clGray;
|
||||||
|
BracketMatchColor.Foreground:=clRed;
|
||||||
//
|
//
|
||||||
MouseLinkColor.Style:= [fsUnderline];
|
MouseLinkColor.Style:= [fsUnderline];
|
||||||
with MouseActions.Add do begin
|
with MouseActions.Add do begin
|
||||||
|
@ -182,6 +291,8 @@ end;
|
||||||
|
|
||||||
destructor TCESynMemo.destroy;
|
destructor TCESynMemo.destroy;
|
||||||
begin
|
begin
|
||||||
|
saveCache;
|
||||||
|
//
|
||||||
subjDocClosing(TCEMultiDocSubject(fMultiDocSubject), self);
|
subjDocClosing(TCEMultiDocSubject(fMultiDocSubject), self);
|
||||||
fMultiDocSubject.Free;
|
fMultiDocSubject.Free;
|
||||||
fPositions.Free;
|
fPositions.Free;
|
||||||
|
@ -250,6 +361,9 @@ begin
|
||||||
Lines.LoadFromFile(aFilename);
|
Lines.LoadFromFile(aFilename);
|
||||||
fFilename := aFilename;
|
fFilename := aFilename;
|
||||||
FileAge(fFilename, fFileDate);
|
FileAge(fFilename, fFileDate);
|
||||||
|
//
|
||||||
|
loadCache;
|
||||||
|
//
|
||||||
fModified := false;
|
fModified := false;
|
||||||
subjDocChanged(TCEMultiDocSubject(fMultiDocSubject), self);
|
subjDocChanged(TCEMultiDocSubject(fMultiDocSubject), self);
|
||||||
end;
|
end;
|
||||||
|
@ -270,6 +384,7 @@ begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCESynMemo.save;
|
procedure TCESynMemo.save;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
Lines.SaveToFile(fFilename);
|
Lines.SaveToFile(fFilename);
|
||||||
FileAge(fFilename, fFileDate);
|
FileAge(fFilename, fFileDate);
|
||||||
|
@ -278,6 +393,30 @@ begin
|
||||||
subjDocChanged(TCEMultiDocSubject(fMultiDocSubject), self);
|
subjDocChanged(TCEMultiDocSubject(fMultiDocSubject), self);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCESynMemo.saveCache;
|
||||||
|
var
|
||||||
|
cache: TCESynMemoCache;
|
||||||
|
begin
|
||||||
|
cache := TCESynMemoCache.create(self);
|
||||||
|
try
|
||||||
|
cache.save;
|
||||||
|
finally
|
||||||
|
cache.free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCESynMemo.loadCache;
|
||||||
|
var
|
||||||
|
cache: TCESynMemoCache;
|
||||||
|
begin
|
||||||
|
cache := TCESynMemoCache.create(self);
|
||||||
|
try
|
||||||
|
cache.load;
|
||||||
|
finally
|
||||||
|
cache.free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TCESynMemo.checkFileDate;
|
procedure TCESynMemo.checkFileDate;
|
||||||
var
|
var
|
||||||
newDate: double;
|
newDate: double;
|
||||||
|
|
Loading…
Reference in New Issue