mirror of https://gitlab.com/basile.b/dexed.git
198 lines
5.2 KiB
Plaintext
198 lines
5.2 KiB
Plaintext
unit ce_editor;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, FileUtil, ExtendedNotebook, Forms, Controls,
|
|
Graphics, SynEditKeyCmds, ComCtrls, SynEditHighlighter, ExtCtrls, Menus,
|
|
SynEditHighlighterFoldBase, SynMacroRecorder, SynPluginSyncroEdit, SynEdit,
|
|
SynHighlighterLFM, ce_widget, ce_d2syn, ce_synmemo, ce_common;
|
|
|
|
type
|
|
{ TCEEditorWidget }
|
|
TCEEditorWidget = class(TCEWidget)
|
|
imgList: TImageList;
|
|
PageControl: TExtendedNotebook;
|
|
macRecorder: TSynMacroRecorder;
|
|
editorStatus: TStatusBar;
|
|
procedure PageControlChange(Sender: TObject);
|
|
procedure PageControlCloseTabClicked(Sender: TObject);
|
|
protected
|
|
procedure autoWidgetUpdate; override;
|
|
private
|
|
// http://bugs.freepascal.org/view.php?id=26329
|
|
fSyncEdit: TSynPluginSyncroEdit;
|
|
procedure focusedEditorChanged;
|
|
procedure memoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
|
|
procedure memoMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
|
procedure memoChange(Sender: TObject);
|
|
procedure memoMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
|
|
function getCurrentEditor: TCESynMemo;
|
|
function getEditor(index: NativeInt): TCESynMemo;
|
|
function getEditorCount: NativeInt;
|
|
function getEditorIndex: NativeInt;
|
|
procedure identifierToD2Syn(const aMemo: TCESynMemo);
|
|
public
|
|
constructor create(aOwner: TComponent); override;
|
|
procedure addEditor;
|
|
procedure removeEditor(const aIndex: NativeInt);
|
|
//
|
|
property currentEditor: TCESynMemo read getCurrentEditor;
|
|
property editor[index: NativeInt]: TCESynMemo read getEditor;
|
|
property editorCount: NativeInt read getEditorCount;
|
|
property editorIndex: NativeInt read getEditorIndex;
|
|
end;
|
|
|
|
implementation
|
|
{$R *.lfm}
|
|
|
|
uses
|
|
ce_main;
|
|
|
|
constructor TCEEditorWidget.create(aOwner: TComponent);
|
|
var
|
|
bmp: TBitmap;
|
|
begin
|
|
inherited;
|
|
fID := 'ID_EDIT';
|
|
fSyncEdit := TSynPluginSyncroEdit.Create(self);
|
|
bmp := TBitmap.Create;
|
|
try
|
|
imgList.GetBitmap(0,bmp);
|
|
fSyncEdit.GutterGlyph.Assign(bmp);
|
|
finally
|
|
bmp.Free;
|
|
end;
|
|
end;
|
|
|
|
function TCEEditorWidget.getEditorCount: NativeInt;
|
|
begin
|
|
result := pageControl.PageCount;
|
|
end;
|
|
|
|
function TCEEditorWidget.getEditorIndex: NativeInt;
|
|
begin
|
|
if pageControl.PageCount > 0 then
|
|
result := pageControl.PageIndex
|
|
else result := -1;
|
|
end;
|
|
|
|
function TCEEditorWidget.getCurrentEditor: TCESynMemo;
|
|
begin
|
|
if pageControl.PageCount = 0 then result := nil
|
|
else result := TCESynMemo(pageControl.ActivePage.Controls[0]);
|
|
end;
|
|
|
|
function TCEEditorWidget.getEditor(index: NativeInt): TCESynMemo;
|
|
begin
|
|
result := TCESynMemo(pageControl.Pages[index].Controls[0]);
|
|
end;
|
|
|
|
procedure TCEEditorWidget.focusedEditorChanged;
|
|
var
|
|
curr: TCESynMemo;
|
|
md: string;
|
|
begin
|
|
curr := getCurrentEditor;
|
|
macRecorder.Editor := curr;
|
|
fSyncEdit.Editor := curr;
|
|
identifierToD2Syn(curr);
|
|
md := getModuleName(curr.Lines);
|
|
if md = '' then md := extractFileName(curr.fileName);
|
|
pageControl.ActivePage.Caption := md;
|
|
end;
|
|
|
|
procedure TCEEditorWidget.PageControlChange(Sender: TObject);
|
|
begin
|
|
//http://bugs.freepascal.org/view.php?id=26320
|
|
focusedEditorChanged;
|
|
end;
|
|
|
|
procedure TCEEditorWidget.PageControlCloseTabClicked(Sender: TObject);
|
|
begin
|
|
// closeBtn not implemented
|
|
mainForm.actFileClose.Execute;
|
|
end;
|
|
|
|
procedure TCEEditorWidget.addEditor;
|
|
var
|
|
sheet: TTabSheet;
|
|
memo: TCESynMemo;
|
|
begin
|
|
fNeedAutoUpdate := true;
|
|
sheet := pageControl.AddTabSheet;
|
|
memo := TCESynMemo.Create(sheet);
|
|
//
|
|
memo.Align:=alClient;
|
|
memo.Parent := sheet;
|
|
//
|
|
memo.OnKeyDown := @memoKeyDown;
|
|
memo.OnKeyUp := @memoKeyDown;
|
|
memo.OnMouseDown := @memoMouseDown;
|
|
memo.OnChange := @memoChange;
|
|
memo.OnMouseMove := @memoMouseMove;
|
|
//
|
|
//http://bugs.freepascal.org/view.php?id=26320
|
|
focusedEditorChanged;
|
|
end;
|
|
|
|
procedure TCEEditorWidget.removeEditor(const aIndex: NativeInt);
|
|
begin
|
|
editor[aIndex].OnChange:= nil;
|
|
pageControl.Pages[aIndex].Free;
|
|
end;
|
|
|
|
procedure TCEEditorWidget.identifierToD2Syn(const aMemo: TCESynMemo);
|
|
begin
|
|
D2Syn.CurrentIdentifier := aMemo.GetWordAtRowCol(aMemo.LogicalCaretXY);
|
|
end;
|
|
|
|
procedure TCEEditorWidget.memoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
|
|
begin
|
|
fNeedAutoUpdate := true;
|
|
if (sender is TCESynMemo) then
|
|
identifierToD2Syn(TCESynMemo(Sender));
|
|
end;
|
|
|
|
procedure TCEEditorWidget.memoMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
|
begin
|
|
fNeedAutoUpdate := true;
|
|
if (sender is TCESynMemo) then
|
|
identifierToD2Syn(TCESynMemo(Sender));
|
|
end;
|
|
|
|
procedure TCEEditorWidget.memoMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
|
|
begin
|
|
if ssLeft in Shift then
|
|
fNeedAutoUpdate := true;
|
|
end;
|
|
|
|
procedure TCEEditorWidget.memoChange(Sender: TObject);
|
|
var
|
|
ed: TCESynMemo;
|
|
begin
|
|
fNeedAutoUpdate := true;
|
|
ed := TCESynMemo(sender);
|
|
ed.modified := true;
|
|
end;
|
|
|
|
procedure TCEEditorWidget.autoWidgetUpdate;
|
|
const
|
|
modstr: array[boolean] of string = ('...', 'MODIFIED');
|
|
var
|
|
ed: TCESynMemo;
|
|
begin
|
|
ed := getCurrentEditor;
|
|
if ed <> nil then
|
|
begin
|
|
editorStatus.Panels[0].Text := format('%d : %d',[ed.CaretY, ed.CaretX]);
|
|
editorStatus.Panels[1].Text := modstr[ed.modified];
|
|
editorStatus.Panels[2].Text := ed.fileName;
|
|
end;
|
|
end;
|
|
|
|
end.
|
|
|