mirror of https://gitlab.com/basile.b/dexed.git
784 lines
25 KiB
Plaintext
784 lines
25 KiB
Plaintext
unit u_editoroptions;
|
|
|
|
{$I u_defines.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, Graphics, SynEdit, SynEditMouseCmds, SynEditMiscClasses,
|
|
SynEditKeyCmds, Menus, LCLProc, SynEditTypes,
|
|
u_interfaces, u_observer, u_common, u_writableComponent, u_synmemo,
|
|
u_d2syn, u_txtsyn;
|
|
|
|
type
|
|
|
|
(**
|
|
* Container for the editor and highlither options.
|
|
* The base class is also used to backup the settings
|
|
* to allow a to preview and restore the settings when rejected.
|
|
*
|
|
* note: when adding a new property, the default value must be set in
|
|
* the constructor according to the default value of the member binded
|
|
* to the property.
|
|
*)
|
|
TEditorOptionsBase = class(TWritableLfmTextComponent)
|
|
private
|
|
// note this is how a TComponent can be edited in
|
|
// a basic TTIGrid: in the ctor create the component
|
|
// but expose it as a published TPersistent.
|
|
fD2Syn: TPersistent;
|
|
fTxtSyn: TPersistent;
|
|
//
|
|
fShortCuts: TCollection;
|
|
//
|
|
fDetectIndentationMode: boolean;
|
|
fCurrLineAttribs: TSynSelectedColor;
|
|
fSelAttribs: TSynSelectedColor;
|
|
fFoldedColor: TSynSelectedColor;
|
|
fMouseLinkAttribs: TSynSelectedColor;
|
|
fBracketMatchAttribs: TSynSelectedColor;
|
|
fIdentifierMarkup: TSynSelectedColor;
|
|
fFont: TFont;
|
|
//
|
|
fResetFontSize: boolean;
|
|
fIdentiMatchOpts: TIdentifierMatchOptions;
|
|
fLineNumEvery: Integer;
|
|
fDDocDelay: Integer;
|
|
fAutoDotDelay: Integer;
|
|
fTabWidth: Integer;
|
|
fBlockIdent: Integer;
|
|
fLineSpacing: Integer;
|
|
fCharSpacing: Integer;
|
|
fRightEdge: Integer;
|
|
fBackground: TColor;
|
|
fRightEdgeColor: TColor;
|
|
fOptions1: TSynEditorOptions;
|
|
fOptions2: TSynEditorOptions2;
|
|
fMouseOptions: TSynEditorMouseOptions;
|
|
fCompletionMenuCaseCare: boolean;
|
|
fCompletionMenuAutoClose: boolean;
|
|
fCompletionMenuWidth: integer;
|
|
fCompletionMenuLines: Byte;
|
|
fAutoCloseCurlyBrace: TBraceAutoCloseStyle;
|
|
fPhobosDocRoot: TPathname;
|
|
fAlwaysAdvancedFeatures: boolean;
|
|
fAutoClosedPairs: TAutoClosePairs;
|
|
fSmartDdocNewline: boolean;
|
|
fInsertPlusDdoc: boolean;
|
|
fAutoCallCompletion: boolean;
|
|
fCloseCompletionCharsWithSpace: AnsiString;
|
|
fCloseCompletionChars: AnsiString;
|
|
fTransparentGutter: boolean;
|
|
fDscannerDelay: integer;
|
|
fDscannerEnabled: boolean;
|
|
fScrollPreview: boolean;
|
|
//
|
|
procedure setPhobosDocRoot(value: TPathname);
|
|
procedure setFont(value: TFont);
|
|
procedure setSelCol(value: TSynSelectedColor);
|
|
procedure setFoldedColor(value: TSynSelectedColor);
|
|
procedure setMouseLinkColor(value: TSynSelectedColor);
|
|
procedure setBracketMatchColor(value: TSynSelectedColor);
|
|
procedure setIdentifierMarkup(value: TSynSelectedColor);
|
|
procedure setCurrLineAttribs(value: TSynSelectedColor);
|
|
procedure setD2Syn(value: TPersistent);
|
|
procedure setTxtSyn(value: TPersistent);
|
|
procedure setShortcuts(value: TCollection);
|
|
procedure setDDocDelay(value: Integer);
|
|
procedure setDscannerDelay(value: Integer);
|
|
procedure setAutoDotDelay(value: Integer);
|
|
procedure setCompletionMenuLines(value: byte);
|
|
procedure setLineNumEvery(value: integer);
|
|
procedure setAutoBraceClosingStyle(value: TBraceAutoCloseStyle);
|
|
published
|
|
property alwaysAdvancedFeatures: boolean read fAlwaysAdvancedFeatures write fAlwaysAdvancedFeatures;
|
|
property autoCallCompletion: boolean read fAutoCallCompletion write fAutoCallCompletion;
|
|
property autoCloseCurlyBrace: TBraceAutoCloseStyle read fAutoCloseCurlyBrace write setAutoBraceClosingStyle default TBraceAutoCloseStyle.autoCloseNever;
|
|
property autoClosedPairs: TAutoClosePairs read fAutoClosedPairs write fAutoClosedPairs default[];
|
|
property autoDotDelay: integer read fAutoDotDelay write SetautoDotDelay;
|
|
property background: TColor read fBackground write fBackground default clWhite;
|
|
property blockIndentation: Integer read fBlockIdent write fBlockIdent default 4;
|
|
property bracketMatch: TSynSelectedColor read fBracketMatchAttribs write setBracketMatchColor;
|
|
property characterSpacing: Integer read fCharSpacing write fCharSpacing default 0;
|
|
property closeCompletionCharsWithSpace: AnsiString read fCloseCompletionCharsWithSpace write fCloseCompletionCharsWithSpace;
|
|
property closeCompletionChars: AnsiString read fCloseCompletionChars write fCloseCompletionChars;
|
|
property completionMenuAutoClose: boolean read fCompletionMenuAutoClose write fCompletionMenuAutoClose;
|
|
property completionMenuCaseCare: boolean read fCompletionMenuCaseCare write fCompletionMenuCaseCare;
|
|
property completionMenuLines: byte read fCompletionMenuLines write setCompletionMenuLines;
|
|
property completionMenuWidth: integer read fCompletionMenuWidth write fCompletionMenuWidth;
|
|
property currentLine: TSynSelectedColor read fCurrLineAttribs write setCurrLineAttribs;
|
|
property ddocDelay: Integer read fDDocDelay write setDDocDelay;
|
|
property dscannerDelay: integer read fDscannerDelay write setDscannerDelay;
|
|
property dscannerEnabled: boolean read fDscannerEnabled write fDscannerEnabled;
|
|
property detectIndentMode: boolean read fDetectIndentationMode write fDetectIndentationMode default true;
|
|
property folding: TSynSelectedColor read fFoldedColor write setFoldedColor;
|
|
property font: TFont read fFont write setFont;
|
|
property highlighterDlang: TPersistent read fD2Syn write setD2Syn;
|
|
property highlighterGeneric: TPersistent read fTxtSyn write setTxtSyn;
|
|
property identifierMatch: TSynSelectedColor read fIdentifierMarkup write SetIdentifierMarkup;
|
|
property identifierMatchOptions: TIdentifierMatchOptions read fIdentiMatchOpts write fIdentiMatchOpts default [caseSensitive];
|
|
property lineNumberEvery: integer read fLineNumEvery write setLineNumEvery default 5;
|
|
property lineSpacing: Integer read fLineSpacing write fLineSpacing default 0;
|
|
property mouseLink: TSynSelectedColor read fMouseLinkAttribs write setMouseLinkColor;
|
|
property mouseOptions: TSynEditorMouseOptions read fMouseOptions write fMouseOptions;
|
|
property options1: TSynEditorOptions read fOptions1 write fOptions1;
|
|
property options2: TSynEditorOptions2 read fOptions2 write fOptions2;
|
|
property phobosDocRoot: TPathname read fPhobosDocRoot write setPhobosDocRoot;
|
|
property plusDdoc: boolean read fInsertPlusDdoc write fInsertPlusDdoc;
|
|
property resetFontSize: boolean read fResetFontSize write fResetFontSize default true;
|
|
property rightEdge: Integer read fRightEdge write fRightEdge default 80;
|
|
property rightEdgeColor: TColor read fRightEdgeColor write fRightEdgeColor default clSilver;
|
|
property selection: TSynSelectedColor read fSelAttribs write setSelCol;
|
|
property shortcuts: TCollection read fShortCuts write setShortcuts;
|
|
property scrollPreview: boolean read fScrollPreview write fScrollPreview;
|
|
property smartDdocNewline: boolean read fSmartDdocNewline write fSmartDdocNewline;
|
|
property tabulationWidth: Integer read fTabWidth write fTabWidth default 4;
|
|
property transparentGutter: boolean read fTransparentGutter write fTransparentGutter default false;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
//
|
|
procedure Assign(source: TPersistent); override;
|
|
end;
|
|
|
|
(**
|
|
* Manages and exposes all the editor and highligther options to an TOptionsEditor.
|
|
* It's also responsible to give the current options to a new editor.
|
|
*)
|
|
TEditorOptions = class(TEditorOptionsBase, IEditableOptions, IDocumentObserver, IEditableShortCut)
|
|
private
|
|
fBackup: TEditorOptionsBase;
|
|
|
|
function optionedWantCategory(): string;
|
|
function optionedWantEditorKind: TOptionEditorKind;
|
|
function optionedWantContainer: TPersistent;
|
|
procedure optionedEvent(event: TOptionEditorEvent);
|
|
function optionedOptionsModified: boolean;
|
|
|
|
procedure docNew(document: TDexedMemo);
|
|
procedure docFocused(document: TDexedMemo);
|
|
procedure docChanged(document: TDexedMemo);
|
|
procedure docClosing(document: TDexedMemo);
|
|
|
|
function scedCount: integer;
|
|
function scedGetItem(const index: integer): TEditableShortcut;
|
|
procedure scedSetItem(const index: integer; constref item: TEditableShortcut);
|
|
|
|
procedure applyChangeToEditor(anEditor: TDexedMemo);
|
|
protected
|
|
procedure afterLoad; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure applyChangesFromSelf;
|
|
end;
|
|
|
|
var
|
|
EditorOptions: TEditorOptions;
|
|
|
|
implementation
|
|
|
|
const
|
|
edoptFname = 'editor.txt';
|
|
|
|
{$REGION Standard Comp/Obj -----------------------------------------------------}
|
|
constructor TEditorOptionsBase.Create(AOwner: TComponent);
|
|
var
|
|
i: integer;
|
|
shc: TPersistentShortcut;
|
|
ed: TSynEdit;
|
|
begin
|
|
inherited;
|
|
//
|
|
fPhobosDocRoot := 'https://dlang.org/phobos/';
|
|
fFont := TFont.Create;
|
|
{$IFDEF WINDOWS}
|
|
fFont.Name := 'Consolas';
|
|
{$ELSE}
|
|
fFont.Name := 'DejaVu Sans Mono';
|
|
{$ENDIF}
|
|
fFont.Quality := fqProof;
|
|
fFont.Pitch := fpFixed;
|
|
fFont.Size := 10;
|
|
fResetFontSize:=true;
|
|
//
|
|
fD2Syn := TSynD2Syn.Create(self);
|
|
fD2Syn.Assign(D2Syn);
|
|
fTxtSyn := TSynTxtSyn.Create(self);
|
|
fTxtSyn.Assign(TxtSyn);
|
|
//
|
|
fDetectIndentationMode:=true;
|
|
fDDocDelay:=200;
|
|
fAutoDotDelay:=100;
|
|
fCurrLineAttribs := TSynSelectedColor.Create;
|
|
fSelAttribs := TSynSelectedColor.Create;
|
|
fFoldedColor := TSynSelectedColor.Create;
|
|
fMouseLinkAttribs := TSynSelectedColor.Create;
|
|
fBracketMatchAttribs := TSynSelectedColor.Create;
|
|
fIdentifierMarkup := TSynSelectedColor.Create;
|
|
fCompletionMenuCaseCare := true;
|
|
//
|
|
// note: default values come from TSynEditFoldedView ctor.
|
|
fFoldedColor.Background := clNone;
|
|
fFoldedColor.Foreground := clDkGray;
|
|
fFoldedColor.FrameColor := clDkGray;
|
|
//
|
|
fSelAttribs.Background := 13421772;
|
|
fSelAttribs.Foreground := clNone;
|
|
//
|
|
fMouseLinkAttribs.Style := [fsUnderline, fsBold];
|
|
fMouseLinkAttribs.StyleMask := [];
|
|
fMouseLinkAttribs.Foreground := clNone;
|
|
fMouseLinkAttribs.Background := clNone;
|
|
//
|
|
fBracketMatchAttribs.Foreground := clRed;
|
|
fBracketMatchAttribs.Background := clNone;
|
|
//
|
|
fIdentifierMarkup.Foreground:= clNone;
|
|
fIdentifierMarkup.Background:= clSilver;
|
|
fIdentifierMarkup.BackAlpha:=70;
|
|
fIdentiMatchOpts := [caseSensitive];
|
|
//
|
|
fAutoCloseCurlyBrace:= autoCloseOnNewLineLexically;
|
|
fAutoClosedPairs:= [];
|
|
//
|
|
fCompletionMenuWidth:= 320;
|
|
fCompletionMenuLines:= 15;
|
|
//
|
|
fLineNumEvery := 5;
|
|
rightEdge := 80;
|
|
tabulationWidth := 4;
|
|
blockIndentation := 4;
|
|
fBackground := clWhite;
|
|
fRightEdgeColor := clSilver;
|
|
fSmartDdocNewline:=true;
|
|
fScrollPreview:=true;
|
|
//
|
|
fDscannerEnabled:=true;
|
|
fDscannerDelay:= 2200;
|
|
//
|
|
fCurrLineAttribs.Background := 15789545;
|
|
fCurrLineAttribs.Foreground := clNone;
|
|
//
|
|
fCloseCompletionCharsWithSpace := '*+-/^=~><%';
|
|
fCloseCompletionChars:= '.,;)}]!';
|
|
//
|
|
options1 :=
|
|
[eoAutoIndent, eoBracketHighlight, eoGroupUndo, eoTabsToSpaces, eoTrimTrailingSpaces,
|
|
eoDragDropEditing, eoShowCtrlMouseLinks, eoEnhanceHomeKey, eoTabIndent];
|
|
options2 :=
|
|
[eoEnhanceEndKey, eoFoldedCopyPaste, eoOverwriteBlock];
|
|
//
|
|
mouseOptions := MouseOptions +
|
|
[emAltSetsColumnMode, emDragDropEditing, emCtrlWheelZoom, emShowCtrlMouseLinks];
|
|
//
|
|
fShortCuts := TCollection.Create(TPersistentShortcut);
|
|
ed := TSynEdit.Create(nil);
|
|
try
|
|
// note: cant use a TDexedMemo because it'd be added to the EntitiesConnector
|
|
SetDefaultDexedKeystrokes(ed);
|
|
for i:= 0 to ed.Keystrokes.Count-1 do
|
|
begin
|
|
shc := TPersistentShortcut(fShortCuts.Add);
|
|
shc.actionName:= EditorCommandToCodeString(ed.Keystrokes[i].Command);
|
|
shc.shortcut := ed.Keystrokes[i].ShortCut;
|
|
end;
|
|
finally
|
|
ed.free;
|
|
end;
|
|
end;
|
|
|
|
destructor TEditorOptionsBase.Destroy;
|
|
begin
|
|
fFont.Free;
|
|
fCurrLineAttribs.Free;
|
|
fSelAttribs.Free;
|
|
fShortCuts.Free;
|
|
fFoldedColor.Free;
|
|
fMouseLinkAttribs.Free;
|
|
fBracketMatchAttribs.Free;
|
|
fIdentifierMarkup.Free;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TEditorOptionsBase.Assign(source: TPersistent);
|
|
var
|
|
srcopt: TEditorOptionsBase;
|
|
begin
|
|
if (source is TEditorOptionsBase) then
|
|
begin
|
|
srcopt := TEditorOptionsBase(source);
|
|
//
|
|
fDscannerDelay:=srcopt.fDscannerDelay;
|
|
fDscannerEnabled:=srcopt.dscannerEnabled;
|
|
fTransparentGutter:=srcopt.fTransparentGutter;
|
|
fAlwaysAdvancedFeatures:=srcopt.fAlwaysAdvancedFeatures;
|
|
fResetFontSize:=srcopt.fResetFontSize;
|
|
fAutoCloseCurlyBrace := srcopt.fAutoCloseCurlyBrace;
|
|
fAutoClosedPairs := srcopt.fAutoClosedPairs;
|
|
fCompletionMenuWidth:=srcopt.fCompletionMenuWidth;
|
|
fCompletionMenuLines:=srcopt.fCompletionMenuLines;
|
|
fCompletionMenuCaseCare:=srcopt.fCompletionMenuCaseCare;
|
|
fCompletionMenuAutoClose:= srcopt.fCompletionMenuAutoClose;
|
|
fAutoDotDelay:=srcopt.fAutoDotDelay;
|
|
fDDocDelay:=srcopt.fDDocDelay;
|
|
fFont.Assign(srcopt.fFont);
|
|
fSelAttribs.Assign(srcopt.fSelAttribs);
|
|
fFoldedColor.Assign(srcopt.fFoldedColor);
|
|
fMouseLinkAttribs.Assign(srcopt.fMouseLinkAttribs);
|
|
fBracketMatchAttribs.Assign(srcopt.fBracketMatchAttribs);
|
|
fCurrLineAttribs.Assign(srcopt.fCurrLineAttribs);
|
|
fD2Syn.Assign(srcopt.fD2Syn);
|
|
fTxtSyn.Assign(srcopt.fTxtSyn);
|
|
background := srcopt.background;
|
|
lineNumberEvery := srcopt.lineNumberEvery;
|
|
identifierMatchOptions:=srcopt.identifierMatchOptions;
|
|
detectIndentMode:=srcopt.detectIndentMode;
|
|
fPhobosDocRoot:=srcopt.fPhobosDocRoot;
|
|
fInsertPlusDdoc:= srcopt.fInsertPlusDdoc;
|
|
fAutoCallCompletion:= srcopt.fAutoCallCompletion;
|
|
fCloseCompletionChars:=srcopt.fCloseCompletionChars;
|
|
fCloseCompletionCharsWithSpace:=srcopt.fCloseCompletionCharsWithSpace;
|
|
fScrollPreview:=srcopt.fScrollPreview;
|
|
|
|
fSmartDdocNewline:=srcopt.fSmartDdocNewline;
|
|
if fSmartDdocNewline then
|
|
fOptions1 += [eoAutoIndent];
|
|
|
|
tabulationWidth := srcopt.tabulationWidth;
|
|
blockIndentation := srcopt.blockIndentation;
|
|
lineSpacing := srcopt.lineSpacing;
|
|
characterSpacing := srcopt.characterSpacing;
|
|
options1 := srcopt.options1;
|
|
options2 := srcopt.options2;
|
|
mouseOptions := srcopt.mouseOptions;
|
|
rightEdge := srcopt.rightEdge;
|
|
rightEdgeColor := srcopt.rightEdgeColor;
|
|
fShortCuts.Assign(srcopt.fShortCuts);
|
|
end
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
procedure TEditorOptionsBase.setDDocDelay(value: Integer);
|
|
begin
|
|
if value > 2000 then
|
|
value := 2000
|
|
else if value < 20 then
|
|
value := 20;
|
|
fDDocDelay:=value;
|
|
end;
|
|
|
|
procedure TEditorOptionsBase.setDscannerDelay(value: Integer);
|
|
begin
|
|
if value > 10000 then
|
|
value := 10000
|
|
else if value < 500 then
|
|
value := 500;
|
|
fDscannerDelay:=value;
|
|
end;
|
|
|
|
procedure TEditorOptionsBase.setAutoDotDelay(value: Integer);
|
|
begin
|
|
if value > 2000 then
|
|
value := 2000
|
|
else if value < 0 then
|
|
value := 0;
|
|
fAutoDotDelay:=value;
|
|
end;
|
|
|
|
procedure TEditorOptionsBase.setCompletionMenuLines(value: byte);
|
|
begin
|
|
if value < 5 then
|
|
value := 5
|
|
else if value > 64 then
|
|
value := 64;
|
|
fCompletionMenuLines := value;
|
|
end;
|
|
|
|
procedure TEditorOptionsBase.setLineNumEvery(value: integer);
|
|
begin
|
|
if value < 1 then
|
|
value := 1
|
|
else if value > 10 then
|
|
value := 10;
|
|
fLineNumEvery := value;
|
|
end;
|
|
|
|
procedure TEditorOptionsBase.setAutoBraceClosingStyle(value: TBraceAutoCloseStyle);
|
|
begin
|
|
fAutoCloseCurlyBrace:= value;
|
|
end;
|
|
|
|
procedure TEditorOptionsBase.setShortcuts(value: TCollection);
|
|
begin
|
|
fShortCuts.Assign(value);
|
|
end;
|
|
|
|
procedure TEditorOptionsBase.setFont(value: TFont);
|
|
begin
|
|
fFont.Assign(value);
|
|
end;
|
|
|
|
procedure TEditorOptionsBase.setPhobosDocRoot(value: TPathname);
|
|
begin
|
|
if not DirectoryExists(value) and (value <> 'https://dlang.org/phobos/') then
|
|
value := 'https://dlang.org/phobos/';
|
|
if (value[length(value)] <> DirectorySeparator) and DirectoryExists(value) then
|
|
value += DirectorySeparator;
|
|
fPhobosDocRoot:=value;
|
|
end;
|
|
|
|
procedure TEditorOptionsBase.setSelCol(value: TSynSelectedColor);
|
|
begin
|
|
fSelAttribs.Assign(value);
|
|
end;
|
|
|
|
procedure TEditorOptionsBase.setFoldedColor(value: TSynSelectedColor);
|
|
begin
|
|
fFoldedColor.Assign(value);
|
|
end;
|
|
|
|
procedure TEditorOptionsBase.setMouseLinkColor(value: TSynSelectedColor);
|
|
begin
|
|
fMouseLinkAttribs.Assign(value);
|
|
end;
|
|
|
|
procedure TEditorOptionsBase.setBracketMatchColor(value: TSynSelectedColor);
|
|
begin
|
|
fBracketMatchAttribs.Assign(value);
|
|
end;
|
|
|
|
procedure TEditorOptionsBase.SetIdentifierMarkup(value: TSynSelectedColor);
|
|
begin
|
|
fIdentifierMarkup.Assign(value);
|
|
end;
|
|
|
|
procedure TEditorOptionsBase.setCurrLineAttribs(value: TSynSelectedColor);
|
|
begin
|
|
fCurrLineAttribs.Assign(value);
|
|
end;
|
|
|
|
procedure TEditorOptionsBase.setD2Syn(value: TPersistent);
|
|
begin
|
|
D2Syn.Assign(value);
|
|
end;
|
|
|
|
procedure TEditorOptionsBase.setTxtSyn(value: TPersistent);
|
|
begin
|
|
TxtSyn.Assign(value);
|
|
end;
|
|
|
|
constructor TEditorOptions.Create(AOwner: TComponent);
|
|
var
|
|
fname: string;
|
|
begin
|
|
inherited;
|
|
fBackup := TEditorOptionsBase.Create(self);
|
|
EntitiesConnector.addObserver(self);
|
|
//
|
|
fname := getDocPath + edoptFname;
|
|
if fileExists(fname) then
|
|
loadFromFile(fname);
|
|
end;
|
|
|
|
destructor TEditorOptions.Destroy;
|
|
begin
|
|
saveToFile(getDocPath + edoptFname);
|
|
//
|
|
EntitiesConnector.removeObserver(self);
|
|
inherited;
|
|
end;
|
|
|
|
procedure TEditorOptions.afterLoad;
|
|
var
|
|
ed: TSynEdit;
|
|
shc: TPersistentShortcut;
|
|
i,j: integer;
|
|
exists: boolean;
|
|
begin
|
|
inherited;
|
|
D2Syn.Assign(fD2Syn);
|
|
TxtSyn.Assign(fTxtSyn);
|
|
//
|
|
ed := TSynEdit.Create(nil);
|
|
try
|
|
SetDefaultDexedKeystrokes(ed);
|
|
// new version with more shortcuts
|
|
for i:= 0 to ed.Keystrokes.Count-1 do
|
|
begin
|
|
exists := false;
|
|
for j := 0 to fShortcuts.count-1 do
|
|
begin
|
|
if TPersistentShortcut(fShortCuts.Items[j]).actionName <>
|
|
EditorCommandToCodeString(ed.Keystrokes.Items[i].Command) then
|
|
continue;
|
|
exists := true;
|
|
break;
|
|
end;
|
|
if exists then
|
|
continue;
|
|
shc := TPersistentShortcut(fShortCuts.Add);
|
|
shc.actionName := EditorCommandToCodeString(ed.Keystrokes.Items[i].Command);
|
|
shc.shortcut := ed.Keystrokes.Items[i].ShortCut;
|
|
end;
|
|
// new version wih less shortcuts
|
|
for j := fShortcuts.count-1 downto 0 do
|
|
begin
|
|
exists := false;
|
|
for i:= 0 to ed.Keystrokes.Count-1 do
|
|
begin
|
|
if TPersistentShortcut(fShortCuts.Items[j]).actionName <>
|
|
EditorCommandToCodeString(ed.Keystrokes.Items[i].Command) then
|
|
continue;
|
|
exists := true;
|
|
break;
|
|
end;
|
|
if exists then
|
|
continue;
|
|
fShortCuts.Delete(j);
|
|
end;
|
|
finally
|
|
ed.free;
|
|
end;
|
|
end;
|
|
{$ENDREGION}
|
|
|
|
{$REGION IDocumentObserver ---------------------------------------------------}
|
|
procedure TEditorOptions.docNew(document: TDexedMemo);
|
|
begin
|
|
//apply...des not modify font size to preserve current zoom
|
|
// when called after the options are edited
|
|
applyChangeToEditor(document);
|
|
// must be set manually for a new doc
|
|
document.Font.Size:=self.font.Size;
|
|
end;
|
|
|
|
procedure TEditorOptions.docFocused(document: TDexedMemo);
|
|
begin
|
|
end;
|
|
|
|
procedure TEditorOptions.docChanged(document: TDexedMemo);
|
|
begin
|
|
end;
|
|
|
|
procedure TEditorOptions.docClosing(document: TDexedMemo);
|
|
begin
|
|
fCompletionMenuWidth := document.completionMenu.TheForm.Width;
|
|
fCompletionMenuLines := document.completionMenu.LinesInWindow;
|
|
end;
|
|
{$ENDREGION}
|
|
|
|
{$REGION IEditableShortCut ---------------------------------------------------}
|
|
function TEditorOptions.scedCount: integer;
|
|
begin
|
|
result := fShortCuts.Count;
|
|
end;
|
|
|
|
function TEditorOptions.scedGetItem(const index: integer): TEditableShortcut;
|
|
var
|
|
s: TPersistentShortcut;
|
|
begin
|
|
s := TPersistentShortcut(fShortCuts.Items[index]);
|
|
result.category := 'Code editor';
|
|
result.identifier := s.actionName;
|
|
result.shortcut := s.shortcut;
|
|
// SynEdit shortcuts start with 'ec'
|
|
if result.identifier.length > 2 then
|
|
result.identifier := result.identifier[3..result.identifier.length];
|
|
end;
|
|
|
|
procedure TEditorOptions.scedSetItem(const index: integer; constref item: TEditableShortcut);
|
|
var
|
|
s: TPersistentShortcut;
|
|
begin
|
|
s := TPersistentShortcut(fShortCuts.Items[index]);
|
|
s.shortcut := item.shortcut;
|
|
if index = scedCount - 1 then
|
|
applyChangesFromSelf();
|
|
end;
|
|
{$ENDREGION}
|
|
|
|
{$REGION IEditableOptions ----------------------------------------------------}
|
|
function TEditorOptions.optionedWantCategory(): string;
|
|
begin
|
|
exit('Editor');
|
|
end;
|
|
|
|
function TEditorOptions.optionedWantEditorKind: TOptionEditorKind;
|
|
begin
|
|
exit(oekGeneric);
|
|
end;
|
|
|
|
function TEditorOptions.optionedWantContainer: TPersistent;
|
|
begin
|
|
fD2Syn := D2Syn;
|
|
fTxtSyn := TxtSyn;
|
|
fBackup.Assign(self);
|
|
fBackup.fD2Syn.Assign(D2Syn);
|
|
fBackup.fTxtSyn.Assign(TxtSyn);
|
|
exit(self);
|
|
end;
|
|
|
|
procedure TEditorOptions.optionedEvent(event: TOptionEditorEvent);
|
|
begin
|
|
// restores
|
|
if event = oeeCancel then
|
|
begin
|
|
self.Assign(fBackup);
|
|
D2Syn.Assign(fBackup.fD2Syn);
|
|
TxtSyn.Assign(fBackup.fTxtSyn);
|
|
end;
|
|
// apply, if change/accept event
|
|
// to get a live preview
|
|
if event <> oeeSelectCat then
|
|
applyChangesFromSelf;
|
|
// new backup values based on accepted values.
|
|
if event = oeeAccept then
|
|
begin
|
|
fBackup.Assign(self);
|
|
fBackup.fD2Syn.Assign(D2Syn);
|
|
fBackup.fTxtSyn.Assign(TxtSyn);
|
|
end;
|
|
end;
|
|
|
|
function TEditorOptions.optionedOptionsModified: boolean;
|
|
begin
|
|
exit(false);
|
|
end;
|
|
{$ENDREGION}
|
|
|
|
{$REGION IEditableOptions ----------------------------------------------------}
|
|
procedure TEditorOptions.applyChangesFromSelf;
|
|
var
|
|
multied: IMultiDocHandler;
|
|
i: Integer;
|
|
begin
|
|
multied := getMultiDocHandler;
|
|
for i := 0 to multied.documentCount - 1 do
|
|
applyChangeToEditor(multied.document[i]);
|
|
end;
|
|
|
|
procedure TEditorOptions.applyChangeToEditor(anEditor: TDexedMemo);
|
|
var
|
|
i, j: Integer;
|
|
shc: TPersistentShortcut;
|
|
kst: TSynEditKeyStroke;
|
|
savedSize: integer;
|
|
cs: TSysCharSet;
|
|
c: char;
|
|
begin
|
|
anEditor.D2Highlighter.Assign(D2Syn);
|
|
anEditor.TxtHighlighter.Assign(TxtSyn);
|
|
|
|
anEditor.autoDotDelay:=fAutoDotDelay;
|
|
anEditor.ddocDelay:=fDDocDelay;
|
|
|
|
savedSize := anEditor.Font.Size;
|
|
anEditor.defaultFontSize := font.Size;
|
|
anEditor.Font.Assign(font);
|
|
if not fResetFontSize then
|
|
anEditor.Font.Size := savedSize;
|
|
|
|
anEditor.CppHighlighter.AsmAttri := anEditor.D2Highlighter.inlineAsm;
|
|
anEditor.CppHighlighter.CommentAttri := anEditor.D2Highlighter.comments;
|
|
anEditor.CppHighlighter.DirecAttri := anEditor.D2Highlighter.ddoc;
|
|
anEditor.CppHighlighter.IdentifierAttri := anEditor.D2Highlighter.identifiers;
|
|
anEditor.CppHighlighter.KeyAttri := anEditor.D2Highlighter.keywords;
|
|
anEditor.CppHighlighter.SpaceAttri := anEditor.D2Highlighter.whites;
|
|
anEditor.CppHighlighter.StringAttri := anEditor.D2Highlighter.strings;
|
|
anEditor.CppHighlighter.SymbolAttri := anEditor.D2Highlighter.symbols;
|
|
anEditor.CppHighlighter.NumberAttri := anEditor.D2Highlighter.numbers;
|
|
|
|
anEditor.completionMenu.TheForm.Font.Assign(font);
|
|
anEditor.autoCloseCurlyBrace := fAutoCloseCurlyBrace;
|
|
anEditor.autoClosedPairs := fAutoClosedPairs;
|
|
anEditor.completionMenu.TheForm.Width := fCompletionMenuWidth;
|
|
anEditor.completionMenu.LinesInWindow := fCompletionMenuLines;
|
|
anEditor.completionMenu.CaseSensitive := fCompletionMenuCaseCare;
|
|
TStringList(anEditor.completionMenu.ItemList).CaseSensitive := fCompletionMenuCaseCare;
|
|
|
|
anEditor.Gutter.LineNumberPart.ShowOnlyLineNumbersMultiplesOf:=fLineNumEvery;
|
|
|
|
anEditor.SelectedColor.Assign(fSelAttribs);
|
|
anEditor.FoldedCodeColor.Assign(fFoldedColor);
|
|
anEditor.MouseLinkColor.Assign(fMouseLinkAttribs);
|
|
anEditor.BracketMatchColor.Assign(fBracketMatchAttribs);
|
|
anEditor.HighlightAllColor.Assign(fIdentifierMarkup);
|
|
anEditor.LineHighlightColor.Assign(fCurrLineAttribs);
|
|
anEditor.TabWidth := tabulationWidth;
|
|
anEditor.ExtraLineSpacing := lineSpacing;
|
|
anEditor.ExtraCharSpacing := characterSpacing;
|
|
anEditor.Options := options1;
|
|
anEditor.Options2 := options2;
|
|
anEditor.MouseOptions := mouseOptions;
|
|
anEditor.Color := background;
|
|
anEditor.RightEdge := rightEdge;
|
|
anEditor.RightEdgeColor := rightEdgeColor;
|
|
anEditor.IdentifierMatchOptions:= identifierMatchOptions;
|
|
anEditor.detectIndentMode := detectIndentMode;
|
|
anEditor.phobosDocRoot:=fPhobosDocRoot;
|
|
anEditor.alwaysAdvancedFeatures:=fAlwaysAdvancedFeatures;
|
|
anEditor.smartDdocNewline:= fSmartDdocNewline;
|
|
anEditor.insertPlusDdoc:= fInsertPlusDdoc;
|
|
anEditor.autoCallCompletion:= fAutoCallCompletion;
|
|
anEditor.completionMenuAutoClose:=fCompletionMenuAutoClose;
|
|
anEditor.transparentGutter:=fTransparentGutter;
|
|
anEditor.setDscannerOptions(fDscannerEnabled, fDscannerDelay);
|
|
anEditor.scrollPreview:=fScrollPreview;
|
|
|
|
if not (eoTabsToSpaces in options1) then
|
|
begin
|
|
anEditor.BlockIndent := 0;
|
|
anEditor.BlockTabIndent := 1;
|
|
end
|
|
else
|
|
begin
|
|
anEditor.BlockIndent := blockIndentation;
|
|
anEditor.BlockTabIndent := 0;
|
|
end;
|
|
|
|
cs := [];
|
|
for c in fCloseCompletionCharsWithSpace do
|
|
include(cs, c);
|
|
anEditor.closeCompletionCharsWithSpace:=cs;
|
|
|
|
cs := [];
|
|
for c in fCloseCompletionChars do
|
|
include(cs, c);
|
|
anEditor.closeCompletionChars:=cs;
|
|
|
|
for i := 0 to anEditor.Keystrokes.Count-1 do
|
|
begin
|
|
kst := anEditor.Keystrokes.Items[i];
|
|
kst.ShortCut:= 0;
|
|
kst.ShortCut2:= 0;
|
|
end;
|
|
|
|
for i := 0 to anEditor.Keystrokes.Count-1 do
|
|
begin
|
|
kst := anEditor.Keystrokes.Items[i];
|
|
for j := 0 to fShortCuts.Count-1 do
|
|
begin
|
|
shc := TPersistentShortcut(fShortCuts.Items[j]);
|
|
if shc.actionName = EditorCommandToCodeString(kst.Command) then
|
|
begin
|
|
try
|
|
kst.shortCut := shc.shortcut;
|
|
except
|
|
kst.shortCut := 0;
|
|
end;
|
|
break;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
{$ENDREGION}
|
|
|
|
initialization
|
|
EditorOptions := TEditorOptions.Create(nil);
|
|
|
|
finalization
|
|
EditorOptions.Free;
|
|
end.
|