#59, add a preset editor

This commit is contained in:
Basile Burg 2016-06-17 14:37:29 +02:00
parent 7c041b5bb9
commit d2fc677f97
2 changed files with 213 additions and 56 deletions

View File

@ -5,9 +5,9 @@ interface
uses uses
Classes, SysUtils, SynEditMiscClasses, Graphics, Controls, StdCtrls, ExtCtrls, Classes, SysUtils, SynEditMiscClasses, Graphics, Controls, StdCtrls, ExtCtrls,
SynEditHighlighter, SynEditTypes, SynEditHighlighter, SynEditTypes, SynEdit, RTTIGrids, Buttons,
ce_interfaces, ce_common, ce_writableComponent, ce_d2syn, ce_observer, ce_interfaces, ce_common, ce_writableComponent, ce_d2syn, ce_observer,
ce_editoroptions; ce_editoroptions, ce_sharedres;
type type
@ -34,7 +34,7 @@ type
fIdentifierMarkup: TSynSelectedColor; fIdentifierMarkup: TSynSelectedColor;
fMouseLinkAttribs: TSynSelectedColor; fMouseLinkAttribs: TSynSelectedColor;
fSelAttribs: TSynSelectedColor; fSelAttribs: TSynSelectedColor;
fd2syn: TSynD2Syn; fd2syn: TPersistent;
fName: string; fName: string;
procedure setBracketMatchColor(value: TSynSelectedColor); procedure setBracketMatchColor(value: TSynSelectedColor);
procedure setCurrLineAttribs(value: TSynSelectedColor); procedure setCurrLineAttribs(value: TSynSelectedColor);
@ -42,10 +42,11 @@ type
procedure setIdentifierMarkup(value: TSynSelectedColor); procedure setIdentifierMarkup(value: TSynSelectedColor);
procedure setMouseLinkColor(value: TSynSelectedColor); procedure setMouseLinkColor(value: TSynSelectedColor);
procedure setSelCol(value: TSynSelectedColor); procedure setSelCol(value: TSynSelectedColor);
procedure setD2syn(value: TSynD2Syn); procedure setD2syn(value: TPersistent);
function getHl: TSynD2Syn;
published published
property name: string read fName write fName; property name: string read fName write fName;
property highlighter: TSynD2Syn read fd2syn write setD2Syn; property highlighter: TPersistent read fd2syn write setD2Syn;
property background: TColor read fBackground write fBackground default clWhite; property background: TColor read fBackground write fBackground default clWhite;
property bracketMatch: TSynSelectedColor read fBracketMatchAttribs write setBracketMatchColor; property bracketMatch: TSynSelectedColor read fBracketMatchAttribs write setBracketMatchColor;
property currentLine: TSynSelectedColor read fCurrLineAttribs write setCurrLineAttribs; property currentLine: TSynSelectedColor read fCurrLineAttribs write setCurrLineAttribs;
@ -65,10 +66,13 @@ type
fCollection: TCollection; fCollection: TCollection;
procedure setCollection(value: TCollection); procedure setCollection(value: TCollection);
function getPreset(index: integer): TCED2SynPreset; function getPreset(index: integer): TCED2SynPreset;
published
property presets: TCollection read fCollection write setCollection;
public public
constructor Create(AOwner: TComponent); override; constructor Create(AOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
function addPreset: TCED2SynPreset; function addPreset: TCED2SynPreset;
function count: integer;
property preset[index: integer]: TCED2SynPreset read getPreset ; default; property preset[index: integer]: TCED2SynPreset read getPreset ; default;
end; end;
@ -78,14 +82,21 @@ type
TCED2SynPresetsLoaderForm = class(TWinControl, ICEEditableOptions) TCED2SynPresetsLoaderForm = class(TWinControl, ICEEditableOptions)
private private
fPresets: TCED2SynPresets; fPresets: TCED2SynPresets;
flstBox: TListBox; fList: TComboBox;
fEditor: TSynEdit;
fPropEd: TTIPropertyGrid;
fBackup: TCED2SynPreset; fBackup: TCED2SynPreset;
function optionedWantCategory(): string; function optionedWantCategory(): string;
function optionedWantEditorKind: TOptionEditorKind; function optionedWantEditorKind: TOptionEditorKind;
function optionedWantContainer: TPersistent; function optionedWantContainer: TPersistent;
procedure optionedEvent(anEvent: TOptionEditorEvent); procedure optionedEvent(anEvent: TOptionEditorEvent);
function optionedOptionsModified: boolean; function optionedOptionsModified: boolean;
procedure lstBoxChange(sender: TObject); procedure lstBoxSelChange(Sender: TObject);
procedure btnAddClick(sender: TObject);
procedure btnDelClick(sender: TObject);
procedure propEdModified(sender: TObject);
procedure updateList;
procedure updateEditor;
public public
constructor Create(AOwner: TComponent); override; constructor Create(AOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
@ -124,11 +135,16 @@ begin
inherited; inherited;
end; end;
procedure TCED2SynPreset.setD2syn(value: TSynD2Syn); procedure TCED2SynPreset.setD2syn(value: TPersistent);
begin begin
fd2syn.Assign(value); fd2syn.Assign(value);
end; end;
function TCED2SynPreset.getHl: TSynD2Syn;
begin
exit(TSynD2Syn(fd2syn));
end;
procedure TCED2SynPreset.setBracketMatchColor(value: TSynSelectedColor); procedure TCED2SynPreset.setBracketMatchColor(value: TSynSelectedColor);
begin begin
fBracketMatchAttribs.Assign(value); fBracketMatchAttribs.Assign(value);
@ -208,6 +224,11 @@ begin
exit(TCED2SynPreset(fCollection.Add)); exit(TCED2SynPreset(fCollection.Add));
end; end;
function TCED2SynPresets.count: integer;
begin
exit(fCollection.Count);
end;
function TCED2SynPresets.getPreset(index: integer): TCED2SynPreset; function TCED2SynPresets.getPreset(index: integer): TCED2SynPreset;
begin begin
exit(TCED2SynPreset(fCollection.Items[index])); exit(TCED2SynPreset(fCollection.Items[index]));
@ -231,49 +252,50 @@ end;
constructor TCED2SynPresetsLoaderForm.Create(AOwner: TComponent); constructor TCED2SynPresetsLoaderForm.Create(AOwner: TComponent);
var var
fname: string; fname: string;
i: integer; pnl: TPanel;
btn: TBitBtn;
begin begin
inherited; inherited;
fBackup:= TCED2SynPreset.Create(nil); fBackup:= TCED2SynPreset.Create(nil);
fPresets:= TCED2SynPresets.Create(self); fPresets:= TCED2SynPresets.Create(self);
fname := getCoeditDocPath + optfname; fname := getCoeditDocPath + optfname;
if fname.fileExists then //if fname.fileExists then
fPresets.loadFromFile(fname) //fPresets.loadFromFile(fname)
else begin //else
// Default begin
with fPresets.addPreset do with fPresets.addPreset do
begin begin
fName :='bright'; fName :='bright';
fBackground := clWhite; fBackground := clWhite;
fd2syn.whites.define(clNone); getHl.whites.define(clNone);
fd2syn.numbers.define($000079F2); getHl.numbers.define($000079F2);
fd2syn.symbols.define(clMaroon); getHl.symbols.define(clMaroon);
fd2syn.identifiers.define(clBlack); getHl.identifiers.define(clBlack);
fd2syn.comments.define(clGreen,[fsItalic]); getHl.comments.define(clGreen,[fsItalic]);
fd2syn.strings.define(clBlue); getHl.strings.define(clBlue);
fd2syn.keywords.define(clNavy,[fsBold]); getHl.keywords.define(clNavy,[fsBold]);
fd2syn.ddoc.define(clTeal); getHl.ddoc.define(clTeal);
fd2syn.inlineAsm.define(clGray,[fsBold]); getHl.inlineAsm.define(clGray,[fsBold]);
fd2syn.special.define(clNavy,[fsBold]); getHl.special.define(clNavy,[fsBold]);
fd2syn.errors.define(clBlack,[],clNone,clRed,slsWaved,sfeBottom,[]); getHl.errors.define(clBlack,[],clNone,clRed,slsWaved,sfeBottom,[]);
fd2syn.attributes.define(clNavy,[fsBold]); getHl.attributes.define(clNavy,[fsBold]);
end; end;
with fPresets.addPreset do with fPresets.addPreset do
begin begin
fName :='dark'; fName :='dark';
fBackground := $00404040; fBackground := $00404040;
fd2syn.whites.define(clNone); getHl.whites.define(clNone);
fd2syn.numbers.define($000079F2,[fsBold]); getHl.numbers.define($F27900,[fsBold]);
fd2syn.symbols.define(clMaroon); getHl.symbols.define(clMaroon);
fd2syn.identifiers.define($00F0EFE1); getHl.identifiers.define($E1EFF0);
fd2syn.comments.define($00C7C7C7,[fsItalic]); getHl.comments.define($C7C7C7,[fsItalic]);
fd2syn.strings.define($ECD284); getHl.strings.define($84D2EC);
fd2syn.keywords.define($0097C793,[fsBold]); getHl.keywords.define($93C797,[fsBold]);
fd2syn.ddoc.define(clTeal); getHl.ddoc.define(clTeal);
fd2syn.inlineAsm.define($00CB84EC,[fsBold]); getHl.inlineAsm.define($EC84CB,[fsBold]);
fd2syn.special.define($0097C793,[fsBold]); getHl.special.define($93C797,[fsBold]);
fd2syn.errors.define($00F0EFE1,[],clNone,clRed,slsWaved,sfeBottom,[]); getHl.errors.define($E1EFF0,[],clNone,clRed,slsWaved,sfeBottom,[]);
fd2syn.attributes.define($0097C793,[fsBold]); getHl.attributes.define($93C797,[fsBold]);
end; end;
with fPresets.addPreset do with fPresets.addPreset do
begin begin
@ -287,25 +309,97 @@ begin
end; end;
with fPresets.addPreset do with fPresets.addPreset do
begin begin
fBackground :=clWhite;
fName :='Mustard'; fName :='Mustard';
fBackground := $78C8D3;
getHl.whites.define(clNone);
getHl.numbers.define($000079F2,[fsBold]);
getHl.symbols.define(clMaroon);
getHl.identifiers.define($1E2331);
getHl.comments.define($4F7184,[fsItalic]);
getHl.strings.define($6D82BA);
getHl.keywords.define($313A5A,[fsBold]);
getHl.ddoc.define($5F8194);
getHl.inlineAsm.define($98B7B4,[fsBold]);
getHl.special.define($313A5A,[fsBold]);
getHl.errors.define($1E2331,[],clNone,clRed,slsWaved,sfeBottom,[]);
getHl.attributes.define($313A5A,[fsBold]);
end; end;
end; end;
// //
flstBox := TListBox.Create(self); fEditor := TSynEdit.Create(self);
flstBox.Align:= alClient; fEditor.Parent:= self;
flstBox.BorderSpacing.Around:= 4; fEditor.Height:= 200;
flstBox.Parent := self; fEditor.Align:= alTop;
flstbox.OnClick:=@lstBoxChange; fEditor.ReadOnly:=true;
for i:= 0 to fPresets.fCollection.Count-1 do fEditor.Font.Assign(EditorOptions.font);
flstBox.AddItem(fPresets[i].name, fPresets[i]); fEditor.Font.Size:=12;
fEditor.Font.Name:=EditorOptions.font.Name;
fEditor.BorderSpacing.Around:= 4;
fEditor.ScrollBars:= ssAutoBoth;
fEditor.Options:= fEditor.Options - [eoScrollPastEof, eoScrollPastEol];
fEditor.SetHighlightSearch('writeln',[]);
fEditor.lines.Add('module preview;');
fEditor.lines.Add('import std.stdio');
fEditor.lines.Add('/// ddoc comment');
fEditor.lines.Add('@safe void main(string[] args)');
fEditor.lines.Add('{');
fEditor.lines.Add(' // writeln is the current identifier');
fEditor.lines.Add(' writeln("this is a string");');
fEditor.lines.Add(' writeln(__DATE__);');
fEditor.lines.Add(' int number = 0xDEADBEEF;');
fEditor.lines.Add(' asm{ xor RAX, RAX; }');
fEditor.lines.Add(' int error = 12G;');
fEditor.lines.Add('}');
pnl := TPanel.Create(self);
pnl.Parent := self;
pnl.BevelOuter:= bvNone;
pnl.BevelInner:= bvNone;
pnl.Align:=alTop;
pnl.BorderSpacing.Around:= 4;
pnl.Height:=30;
// //
fList := TComboBox.Create(self);
fList.Align:= alClient;
fList.BorderSpacing.Around:= 4;
fList.Parent := pnl;
fList.ReadOnly:=true;
fList.OnSelect:= @lstBoxSelChange;
updateList;
//
btn := TBitBtn.Create(self);
btn.Parent := pnl;
btn.Width:= 26;
btn.Align:= alRight;
btn.BorderSpacing.Around:=2;
btn.OnClick:=@btnAddClick;
btn.Hint:='add preset';
AssignPng(btn, 'document_add');
//
btn := TBitBtn.Create(self);
btn.Parent := pnl;
btn.Width:= 26;
btn.Align:= alRight;
btn.BorderSpacing.Around:=2;
btn.OnClick:=@btnDelClick;
btn.Hint:='delete preset';
AssignPng(btn, 'document_delete');
//
fPropEd := TTIPropertyGrid.Create(self);
fPropEd.Parent := self;
fPropEd.Align:= alClient;
fPropEd.DefaultValueFont.Color := clGreen;
fPropEd.OnModified:=@propEdModified;
fPropEd.CheckboxForBoolean:=true;
fPropEd.PropertyEditorHook.AddHandlerModified(@propEdModified);
//
fList.ItemIndex := 0;
lstBoxSelChange(nil);
EntitiesConnector.addObserver(self); EntitiesConnector.addObserver(self);
end; end;
destructor TCED2SynPresetsLoaderForm.Destroy; destructor TCED2SynPresetsLoaderForm.Destroy;
begin begin
//fPresets.saveToFile(getCoeditDocPath + optfname); fPresets.saveToFile(getCoeditDocPath + optfname);
fBackup.Free; fBackup.Free;
EntitiesConnector.removeObserver(self); EntitiesConnector.removeObserver(self);
inherited; inherited;
@ -329,7 +423,11 @@ end;
procedure TCED2SynPresetsLoaderForm.optionedEvent(anEvent: TOptionEditorEvent); procedure TCED2SynPresetsLoaderForm.optionedEvent(anEvent: TOptionEditorEvent);
begin begin
case anEvent of case anEvent of
oeeAccept: fBackup.assignFromOptions; oeeAccept:
begin
fPresets[fList.ItemIndex].assignToOptions;
fBackup.assignFromOptions;
end;
oeeCancel: fBackup.assignToOptions; oeeCancel: fBackup.assignToOptions;
oeeSelectCat: fBackup.assignFromOptions; oeeSelectCat: fBackup.assignFromOptions;
end; end;
@ -340,11 +438,70 @@ begin
exit(false); exit(false);
end; end;
procedure TCED2SynPresetsLoaderForm.lstBoxChange(sender: TObject); procedure TCED2SynPresetsLoaderForm.lstBoxSelChange(Sender: TObject);
begin begin
if flstBox.ItemIndex = -1 then if fList.ItemIndex <> -1 then
begin
fPropEd.TIObject := fPresets[fList.ItemIndex];
fPropEd.SplitterX:= (fPropEd.Width - 20) div 2;
fPropEd.PreferredSplitterX:= fPropEd.SplitterX;
fEditor.Highlighter := fPresets[fList.ItemIndex].getHl;
updateEditor;
end else
fPropEd.TIObject := nil;
end;
procedure TCED2SynPresetsLoaderForm.btnAddClick(sender: TObject);
var
prs: TCED2SynPreset;
begin
prs := fPresets.addPreset;
prs.name := format('preset %d', [fPresets.count]);
updateList;
fList.ItemIndex := prs.Index;
lstBoxSelChange(nil);
end;
procedure TCED2SynPresetsLoaderForm.btnDelClick(sender: TObject);
begin
fPresets.fCollection.Delete(fList.ItemIndex);
updateList;
lstBoxSelChange(nil);
end;
procedure TCED2SynPresetsLoaderForm.propEdModified(sender: TObject);
begin
updateEditor;
end;
procedure TCED2SynPresetsLoaderForm.updateList;
var
i, j: integer;
begin
fList.OnChange:=nil;
j := fList.ItemIndex;
fList.Clear;
for i:= 0 to fPresets.count-1 do
fList.AddItem(fPresets[i].name, fPresets[i]);
if (j <> -1) and (j < fPresets.count) then
fList.ItemIndex := j;
fList.OnChange:=@lstBoxSelChange;
end;
procedure TCED2SynPresetsLoaderForm.updateEditor;
var
p: TCED2SynPreset;
begin
if fList.ItemIndex = -1 then
exit; exit;
fPresets[flstBox.ItemIndex].assignToOptions; p := fPresets[fList.ItemIndex];
fEditor.Color := p.background;
fEditor.SelectedColor := p.selection;
fEditor.HighlightAllColor := p.identifierMatch;
fEditor.LineHighlightColor := p.currentLine;
fEditor.FoldedCodeColor := p.folding;
fEditor.MouseLinkColor := p.mouseLink;
fEditor.BracketMatchColor := p.bracketMatch;
end; end;
{$ENDREGION} {$ENDREGION}

View File

@ -33,7 +33,7 @@ inherited CEOptionEditorWidget: TCEOptionEditorWidget
Left = 0 Left = 0
Height = 451 Height = 451
Top = 0 Top = 0
Width = 140 Width = 150
Align = alLeft Align = alLeft
AutoExpand = True AutoExpand = True
DefaultItemHeight = 16 DefaultItemHeight = 16
@ -48,20 +48,20 @@ inherited CEOptionEditorWidget: TCEOptionEditorWidget
Options = [tvoAutoExpand, tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw] Options = [tvoAutoExpand, tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw]
end end
object pnlEd: TPanel object pnlEd: TPanel
Left = 146 Left = 156
Height = 451 Height = 451
Top = 0 Top = 0
Width = 405 Width = 395
Align = alClient Align = alClient
BevelOuter = bvNone BevelOuter = bvNone
ClientHeight = 451 ClientHeight = 451
ClientWidth = 405 ClientWidth = 395
TabOrder = 1 TabOrder = 1
object inspector: TTIPropertyGrid object inspector: TTIPropertyGrid
Left = 0 Left = 0
Height = 451 Height = 451
Top = 0 Top = 0
Width = 405 Width = 395
Align = alClient Align = alClient
CheckboxForBoolean = False CheckboxForBoolean = False
DefaultValueFont.Color = clWindowText DefaultValueFont.Color = clWindowText
@ -76,7 +76,7 @@ inherited CEOptionEditorWidget: TCEOptionEditorWidget
end end
end end
object Splitter1: TSplitter object Splitter1: TSplitter
Left = 140 Left = 150
Height = 451 Height = 451
Top = 0 Top = 0
Width = 6 Width = 6