diff --git a/src/ce_d2synpresets.pas b/src/ce_d2synpresets.pas index c29c5b16..9c9f97e1 100644 --- a/src/ce_d2synpresets.pas +++ b/src/ce_d2synpresets.pas @@ -5,9 +5,9 @@ interface uses 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_editoroptions; + ce_editoroptions, ce_sharedres; type @@ -34,7 +34,7 @@ type fIdentifierMarkup: TSynSelectedColor; fMouseLinkAttribs: TSynSelectedColor; fSelAttribs: TSynSelectedColor; - fd2syn: TSynD2Syn; + fd2syn: TPersistent; fName: string; procedure setBracketMatchColor(value: TSynSelectedColor); procedure setCurrLineAttribs(value: TSynSelectedColor); @@ -42,10 +42,11 @@ type procedure setIdentifierMarkup(value: TSynSelectedColor); procedure setMouseLinkColor(value: TSynSelectedColor); procedure setSelCol(value: TSynSelectedColor); - procedure setD2syn(value: TSynD2Syn); + procedure setD2syn(value: TPersistent); + function getHl: TSynD2Syn; published 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 bracketMatch: TSynSelectedColor read fBracketMatchAttribs write setBracketMatchColor; property currentLine: TSynSelectedColor read fCurrLineAttribs write setCurrLineAttribs; @@ -65,10 +66,13 @@ type fCollection: TCollection; procedure setCollection(value: TCollection); function getPreset(index: integer): TCED2SynPreset; + published + property presets: TCollection read fCollection write setCollection; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; function addPreset: TCED2SynPreset; + function count: integer; property preset[index: integer]: TCED2SynPreset read getPreset ; default; end; @@ -78,14 +82,21 @@ type TCED2SynPresetsLoaderForm = class(TWinControl, ICEEditableOptions) private fPresets: TCED2SynPresets; - flstBox: TListBox; + fList: TComboBox; + fEditor: TSynEdit; + fPropEd: TTIPropertyGrid; fBackup: TCED2SynPreset; function optionedWantCategory(): string; function optionedWantEditorKind: TOptionEditorKind; function optionedWantContainer: TPersistent; procedure optionedEvent(anEvent: TOptionEditorEvent); 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 constructor Create(AOwner: TComponent); override; destructor Destroy; override; @@ -124,11 +135,16 @@ begin inherited; end; -procedure TCED2SynPreset.setD2syn(value: TSynD2Syn); +procedure TCED2SynPreset.setD2syn(value: TPersistent); begin fd2syn.Assign(value); end; +function TCED2SynPreset.getHl: TSynD2Syn; +begin + exit(TSynD2Syn(fd2syn)); +end; + procedure TCED2SynPreset.setBracketMatchColor(value: TSynSelectedColor); begin fBracketMatchAttribs.Assign(value); @@ -208,6 +224,11 @@ begin exit(TCED2SynPreset(fCollection.Add)); end; +function TCED2SynPresets.count: integer; +begin + exit(fCollection.Count); +end; + function TCED2SynPresets.getPreset(index: integer): TCED2SynPreset; begin exit(TCED2SynPreset(fCollection.Items[index])); @@ -231,49 +252,50 @@ end; constructor TCED2SynPresetsLoaderForm.Create(AOwner: TComponent); var fname: string; - i: integer; + pnl: TPanel; + btn: TBitBtn; begin inherited; fBackup:= TCED2SynPreset.Create(nil); fPresets:= TCED2SynPresets.Create(self); fname := getCoeditDocPath + optfname; - if fname.fileExists then - fPresets.loadFromFile(fname) - else begin - // Default + //if fname.fileExists then + //fPresets.loadFromFile(fname) + //else + begin with fPresets.addPreset do begin fName :='bright'; fBackground := clWhite; - fd2syn.whites.define(clNone); - fd2syn.numbers.define($000079F2); - fd2syn.symbols.define(clMaroon); - fd2syn.identifiers.define(clBlack); - fd2syn.comments.define(clGreen,[fsItalic]); - fd2syn.strings.define(clBlue); - fd2syn.keywords.define(clNavy,[fsBold]); - fd2syn.ddoc.define(clTeal); - fd2syn.inlineAsm.define(clGray,[fsBold]); - fd2syn.special.define(clNavy,[fsBold]); - fd2syn.errors.define(clBlack,[],clNone,clRed,slsWaved,sfeBottom,[]); - fd2syn.attributes.define(clNavy,[fsBold]); + getHl.whites.define(clNone); + getHl.numbers.define($000079F2); + getHl.symbols.define(clMaroon); + getHl.identifiers.define(clBlack); + getHl.comments.define(clGreen,[fsItalic]); + getHl.strings.define(clBlue); + getHl.keywords.define(clNavy,[fsBold]); + getHl.ddoc.define(clTeal); + getHl.inlineAsm.define(clGray,[fsBold]); + getHl.special.define(clNavy,[fsBold]); + getHl.errors.define(clBlack,[],clNone,clRed,slsWaved,sfeBottom,[]); + getHl.attributes.define(clNavy,[fsBold]); end; with fPresets.addPreset do begin fName :='dark'; fBackground := $00404040; - fd2syn.whites.define(clNone); - fd2syn.numbers.define($000079F2,[fsBold]); - fd2syn.symbols.define(clMaroon); - fd2syn.identifiers.define($00F0EFE1); - fd2syn.comments.define($00C7C7C7,[fsItalic]); - fd2syn.strings.define($ECD284); - fd2syn.keywords.define($0097C793,[fsBold]); - fd2syn.ddoc.define(clTeal); - fd2syn.inlineAsm.define($00CB84EC,[fsBold]); - fd2syn.special.define($0097C793,[fsBold]); - fd2syn.errors.define($00F0EFE1,[],clNone,clRed,slsWaved,sfeBottom,[]); - fd2syn.attributes.define($0097C793,[fsBold]); + getHl.whites.define(clNone); + getHl.numbers.define($F27900,[fsBold]); + getHl.symbols.define(clMaroon); + getHl.identifiers.define($E1EFF0); + getHl.comments.define($C7C7C7,[fsItalic]); + getHl.strings.define($84D2EC); + getHl.keywords.define($93C797,[fsBold]); + getHl.ddoc.define(clTeal); + getHl.inlineAsm.define($EC84CB,[fsBold]); + getHl.special.define($93C797,[fsBold]); + getHl.errors.define($E1EFF0,[],clNone,clRed,slsWaved,sfeBottom,[]); + getHl.attributes.define($93C797,[fsBold]); end; with fPresets.addPreset do begin @@ -287,25 +309,97 @@ begin end; with fPresets.addPreset do begin - fBackground :=clWhite; 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; // - flstBox := TListBox.Create(self); - flstBox.Align:= alClient; - flstBox.BorderSpacing.Around:= 4; - flstBox.Parent := self; - flstbox.OnClick:=@lstBoxChange; - for i:= 0 to fPresets.fCollection.Count-1 do - flstBox.AddItem(fPresets[i].name, fPresets[i]); + fEditor := TSynEdit.Create(self); + fEditor.Parent:= self; + fEditor.Height:= 200; + fEditor.Align:= alTop; + fEditor.ReadOnly:=true; + fEditor.Font.Assign(EditorOptions.font); + 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); end; destructor TCED2SynPresetsLoaderForm.Destroy; begin - //fPresets.saveToFile(getCoeditDocPath + optfname); + fPresets.saveToFile(getCoeditDocPath + optfname); fBackup.Free; EntitiesConnector.removeObserver(self); inherited; @@ -329,7 +423,11 @@ end; procedure TCED2SynPresetsLoaderForm.optionedEvent(anEvent: TOptionEditorEvent); begin case anEvent of - oeeAccept: fBackup.assignFromOptions; + oeeAccept: + begin + fPresets[fList.ItemIndex].assignToOptions; + fBackup.assignFromOptions; + end; oeeCancel: fBackup.assignToOptions; oeeSelectCat: fBackup.assignFromOptions; end; @@ -340,11 +438,70 @@ begin exit(false); end; -procedure TCED2SynPresetsLoaderForm.lstBoxChange(sender: TObject); +procedure TCED2SynPresetsLoaderForm.lstBoxSelChange(Sender: TObject); 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; - 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; {$ENDREGION} diff --git a/src/ce_optionseditor.lfm b/src/ce_optionseditor.lfm index 4d644e7e..ca901848 100644 --- a/src/ce_optionseditor.lfm +++ b/src/ce_optionseditor.lfm @@ -33,7 +33,7 @@ inherited CEOptionEditorWidget: TCEOptionEditorWidget Left = 0 Height = 451 Top = 0 - Width = 140 + Width = 150 Align = alLeft AutoExpand = True DefaultItemHeight = 16 @@ -48,20 +48,20 @@ inherited CEOptionEditorWidget: TCEOptionEditorWidget Options = [tvoAutoExpand, tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw] end object pnlEd: TPanel - Left = 146 + Left = 156 Height = 451 Top = 0 - Width = 405 + Width = 395 Align = alClient BevelOuter = bvNone ClientHeight = 451 - ClientWidth = 405 + ClientWidth = 395 TabOrder = 1 object inspector: TTIPropertyGrid Left = 0 Height = 451 Top = 0 - Width = 405 + Width = 395 Align = alClient CheckboxForBoolean = False DefaultValueFont.Color = clWindowText @@ -76,7 +76,7 @@ inherited CEOptionEditorWidget: TCEOptionEditorWidget end end object Splitter1: TSplitter - Left = 140 + Left = 150 Height = 451 Top = 0 Width = 6