lazarus/ide/editoroptions.pp
2001-03-19 18:51:57 +00:00

3078 lines
93 KiB
ObjectPascal

unit editoroptions;
{
Author: Mattias Gaertner
Abstract:
Editor options container and editor options dialog.
The editor options are stored in XML format in the
~/.lazarus/editoroptions.xml file.
Currently only for TSynEdit.
ToDo:
- Code template deleting, value editing, saving
- color schemes, key mapping schemes
- Resizing
- SetSynEditSettings
- nicer TColorButton
- create LFM file
}
{$mode objfpc}
interface
{$define NEW_EDITOR_SYNEDIT}
uses
LCLLinux,
Forms, Classes, SysUtils, ComCtrls, Buttons, StdCtrls, ExtCtrls, LazConf,
FileCtrl, Graphics, Controls, Dialogs, LResources,
{$ifdef NEW_EDITOR_SYNEDIT}
SynEdit, SynEditHighlighter, SynHighlighterPas, SynEditAutoComplete,
SynEditKeyCmds,
{$else}
mwcustomedit, mwPasSyn, mwHighlighter,
{$endif}
XMLCfg, CodeTemplateDialog, KeyMapping;
const
AdditionalHiglightAttributes : array[0..4] of string = (
'Text block',
'Execution point',
'Enabled breakpoint','Disabled breakpoint',
'Error line'
);
type
{$ifdef NEW_EDITOR_SYNEDIT}
TPreviewEditor = TSynEdit;
TPreviewPasSyn = TSynPasSyn;
TSynHighlightElement = TSynHighlighterAttributes;
{$else}
TPreviewEditor = TmwCustomEdit;
TPreviewPasSyn = TmwPasSyn;
TSynHighlightElement = TmwHighlightAttributes;
{$endif}
{ Editor Options object used to hold the editor options }
TEditorOptions = class(TPersistent)
private
xmlconfig:TXMLConfig;
// general options
fSynEditOptions: TSynEditorOptions;
fUndoAfterSave:boolean;
fDoubleClickLine:boolean;
fFindTextAtCursor:boolean;
fUseSyntaxHighlight:boolean;
fCreateBackupFiles:boolean;
fBlockIndent:integer;
fUndoLimit:integer;
fTabWidths:integer;
fSyntaxExtensions:Ansistring;
// Display options
fVisibleRightMargin:boolean;
fVisibleGutter:boolean;
fShowLineNumbers:boolean;
fGutterColor:TColor;
fGutterWidth:integer;
fRightMargin:integer;
fRightMarginColor:TColor;
fEditorFont:Ansistring;
fEditorFontHeight:integer;
fExtraLineSpacing:integer;
// Key Mappings options
fKeyMappingScheme:AnsiString;
fKeyMap:TKeyCommandRelationList;
// Color options
fColorScheme:Ansistring;
fTextBlockElement:TSynHighlightElement;
fExecutionPointElement:TSynHighlightElement;
fEnabledBreakPointElement:TSynHighlightElement;
fDisabledBreakPointElement:TSynHighlightElement;
fErrorLineElement:TSynHighlightElement;
// Code tools options
fAutoCodeCompletion:boolean;
fAutoCodeParameters:boolean;
fAutoToolTipExprEval:boolean;
fAutoToolTipSymbTools:boolean;
fAutoDelayInMSec:integer;
fCodeTemplateFileName:Ansistring;
public
constructor Create;
destructor Destroy; override;
procedure Load;
procedure Save;
procedure ReadAttribute(Attri:TSynHighlightElement);
procedure WriteAttribute(Attri:TSynHighlightElement);
procedure GetHighlighterSettings(PasSyn:TPreviewPasSyn);
// read highlight settings from config file
procedure SetHighlighterSettings(PasSyn:TPreviewPasSyn);
// write highlight settings to config file
procedure GetSynEditSettings(ASynEdit:TSynEdit);
// read synedit settings from config file
procedure SetSynEditSettings(ASynEdit:TSynEdit);
// write synedit settings to file
published
// general options
property SynEditOptions:TSynEditorOptions
read fSynEditOptions write fSynEditOptions
default SYNEDIT_DEFAULT_OPTIONS;
property UndoAfterSave:boolean
read fUndoAfterSave write fUndoAfterSave default true;
property DoubleClickLine:boolean
read fDoubleClickLine write fDoubleClickLine default false;
property FindTextAtCursor:boolean
read fFindTextAtCursor write fFindTextAtCursor default true;
property UseSyntaxHighlight:boolean
read fUseSyntaxHighlight write fUseSyntaxHighlight default true;
property CreateBackupFiles:boolean
read fCreateBackupFiles write fCreateBackupFiles default true;
property BlockIndent:integer read fBlockIndent write fBlockIndent default 2;
property UndoLimit:integer read fUndoLimit write fUndoLimit default 32767;
property TabWidths:integer read fTabWidths write fTabWidths default 8;
property SyntaxExtensions:Ansistring
read fSyntaxExtensions write fSyntaxExtensions;
// Display options
property VisibleRightMargin:boolean
read fVisibleRightMargin write fVisibleRightMargin default true;
property VisibleGutter:boolean
read fVisibleGutter write fVisibleGutter default true;
property ShowLineNumbers:boolean
read fShowLineNumbers write fShowLineNumbers default false;
property GutterColor:TColor read fGutterColor write fGutterColor default clBtnFace;
property GutterWidth:integer read fGutterWidth write fGutterWidth default 30;
property RightMargin:integer read fRightMargin write fRightMargin default 80;
property RightMarginColor:integer
read fRightMarginColor write fRightMarginColor default clBtnFace;
property EditorFont:Ansistring read fEditorFont write fEditorFont;
property EditorFontHeight:integer read fEditorFontHeight write FEditorFontHeight;
property ExtraLineSpacing:integer
read fExtraLineSpacing write fExtraLineSpacing default 0;
// Key Mappings
property KeyMappingScheme:Ansistring
read fKeyMappingScheme write fKeyMappingScheme;
property KeyMap:TKeyCommandRelationList read fKeyMap;
// Color options
property ColorScheme:Ansistring read fColorScheme write fColorScheme;
property TextBlockElement:TSynHighlightElement
read fTextBlockElement write fTextBlockElement;
property ExecutionPointElement:TSynHighlightElement
read fExecutionPointElement write fExecutionPointElement;
property EnabledBreakPointElement:TSynHighlightElement
read fEnabledBreakPointElement write fEnabledBreakPointElement;
property DisabledBreakPointElement:TSynHighlightElement
read fDisabledBreakPointElement write fDisabledBreakPointElement;
property ErrorLineElement:TSynHighlightElement
read fErrorLineElement write fErrorLineElement;
// Code Tools options
property AutoCodeCompletion:boolean
read fAutoCodeCompletion write fAutoCodeCompletion default true;
property AutoCodeParameters:boolean
read fAutoCodeParameters write fAutoCodeParameters default true;
property AutoToolTipExprEval:boolean
read fAutoToolTipExprEval write fAutoToolTipExprEval default true;
property AutoToolTipSymbTools:boolean
read fAutoToolTipSymbTools write fAutoToolTipSymbTools default true;
property AutoDelayInMSec:integer
read fAutoDelayInMSec write fAutoDelayInMSec default 1000;
property CodeTemplateFileName:Ansistring
read fCodeTemplateFileName write fCodeTemplateFileName;
end;
{ color button }
TColorButton = class(TCustomControl)
private
FOnColorChanged:TNotifyEvent;
FButtonColor:TColor;
FColorDialog:TColorDialog;
FBorderWidth:integer;
protected
procedure Paint; override;
procedure MouseDown(Button:TMouseButton; Shift:TShiftState;
X,Y:integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure SetButtonColor(Value:TColor);
published
property BorderWidth:integer read FBorderWidth write FBorderWidth;
property ButtonColor:TColor read FButtonColor write SetButtonColor;
property OnColorChanged:TNotifyEvent read FOnColorChanged write FOnColorChanged;
end;
{ Editor Options form }
TEditorOptionsForm = class(TForm)
published
MainNoteBook:TNoteBook;
PreviewPasSyn:TPreviewPasSyn;
// general options
EditorOptionsGroupBox:TGroupBox;
AltSetsColumnModeCheckBox:TCheckBox;
AutoIndentCheckBox:TCheckBox;
DragDropEditingCheckBox:TCheckBox;
DropFilesCheckBox:TCheckBox;
HalfPageScrollCheckBox:TCheckBox;
KeepCaretXCheckBox:TCheckBox;
NoCaretCheckBox:TCheckBox;
NoSelectionCheckBox:TCheckBox;
ScrollByOneLessCheckBox:TCheckBox;
ScrollPastEofCheckBox:TCheckBox;
ScrollPastEolCheckBox:TCheckBox;
ShowScrollHintCheckBox:TCheckBox;
SmartTabsCheckBox:TCheckBox;
TabsToSpacesCheckBox:TCheckBox;
TrimTrailingSpacesCheckBox:TCheckBox;
UndoAfterSaveCheckBox:TCheckBox;
DoubleClickLineCheckBox:TCheckBox;
FindTextAtCursorCheckBox:TCheckBox;
UseSyntaxHighlightCheckBox:TCheckBox;
CreateBackupFilesCheckBox:TCheckBox;
BlockIndentComboBox:TComboBox;
BlockIndentLabel:TLabel;
UndoLimitComboBox:TComboBox;
UndoLimitLabel:TLabel;
TabWidthsComboBox:TComboBox;
TabWidthsLabel:TLabel;
SyntaxExtensionsComboBox:TComboBox;
SyntaxExtensionsLabel:TLabel;
// Display options
MarginAndGutterGroupBox:TGroupBox;
VisibleRightMarginCheckBox:TCheckBox;
VisibleGutterCheckBox:TCheckBox;
ShowLineNumbersCheckBox:TCheckBox;
GutterColorButton:TColorButton;
GutterColorLabel:TLabel;
GutterWidthComboBox:TComboBox;
GutterWidthLabel:TLabel;
RightMarginComboBox:TComboBox;
RightMarginLabel:TLabel;
RightMarginColorButton:TColorButton;
RightMarginColorLabel:TLabel;
EditorFontGroupBox:TGroupBox;
EditorFontComboBox:TComboBox;
EditorFontButton:TButton;
EditorFontLabel:TLabel;
EditorFontHeightLabel:TLabel;
EditorFontHeightComboBox:TComboBox;
ExtraLineSpacingLabel:TLabel;
ExtraLineSpacingComboBox:TComboBox;
DisplayPreview:TPreviewEditor;
// Key Mappings
KeyMappingSchemeLabel:TLabel;
KeyMappingSchemeComboBox:TComboBox;
KeyMappingHelpLabel:TLabel;
KeyMappingListBox:TListBox;
KeyMappingConsistencyCheckButton:TButton;
// Color options
ColorSchemeComboBox:TComboBox;
ColorSchemeLabel:TLabel;
ColorElementLabel:TLabel;
ColorElementListBox:TListBox;
TextAttributesGroupBox:TGroupBox;
TextBoldCheckBox:TCheckBox;
TextItalicCheckBox:TCheckBox;
TextUnderlineCheckBox:TCheckBox;
ForeGroundGroupBox:TGroupBox;
ForeGroundColorButton:TColorButton;
ForeGroundUseDefaultCheckBox:TCheckBox;
BackGroundGroupBox:TGroupBox;
BackGroundColorButton:TColorButton;
BackGroundUseDefaultCheckBox:TCheckBox;
ColorPreview:TPreviewEditor;
// Code Tools options
AutomaticFeaturesGroupBox:TGroupBox;
AutoCodeCompletionCheckBox:TCheckBox;
AutoCodeParametersCheckBox:TCheckBox;
AutoToolTipExprEvalCheckBox:TCheckBox;
AutoToolTipSymbToolsCheckBox:TCheckBox;
AutoDelayLabel:TLabel;
AutoDelayTrackBar:TTrackBar;
AutoDelayMinLabel:TLabel;
AutoDelayMaxLabel:TLabel;
CodeTemplatesGroupBox:TGroupBox;
CodeTemplateFileNameLabel:TLabel;
CodeTemplateFileNameComboBox:TComboBox;
CodeTemplateFileNameButton:TButton;
CodeTemplatesLabel:TLabel;
CodeTemplateListBox:TListBox;
CodeTemplateAddButton:TButton;
CodeTemplateEditButton:TButton;
CodeTemplateDeleteButton:TButton;
CodeTemplateCodeLabel:TLabel;
CodeTemplateCodePreview:TPreviewEditor;
SynAutoComplete:TSynEditAutoComplete;
// buttons at bottom
OkButton:TButton;
CancelButton:TButton;
// general
procedure GeneralCheckBoxOnClick(Sender: TObject);
procedure ComboBoxOnChange(Sender:TObject);
procedure ComboBoxOnExit(Sender:TObject);
procedure ComboBoxOnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure ColorButtonColorChanged(Sender:TObject);
// display
procedure EditorFontButtonClick(Sender:TObject);
// key mapping
procedure KeyMappingListBoxMouseUp(Sender:TObject;
Button:TMouseButton; Shift:TShiftState; X,Y:integer);
procedure KeyMappingConsistencyCheckButtonClick(Sender: TObject);
// color
procedure ColorElementListBoxMouseUp(Sender:TObject;
Button:TMouseButton; Shift:TShiftState; X,Y:integer);
procedure ColorPreviewMouseUp(Sender:TObject;
Button:TMouseButton; Shift:TShiftState; X,Y:integer);
procedure OnSpecialLineColors(Sender: TObject; Line: integer;
var Special: boolean; var FG, BG: TColor);
// code Tools
procedure CodeTemplateListBoxMouseUp(Sender:TObject;
Button:TMouseButton; Shift:TShiftState; X,Y:integer);
procedure CodeTemplateFileNameButtonClick(Sender:TObject);
procedure CodeTemplateButtonClick(Sender:TObject);
// buttons at bottom
procedure OkButtonClick(Sender:TObject);
procedure CancelButtonClick(Sender:TObject);
private
PreviewEdits:array[1..3] of TPreviewEditor;
AddHighlightElements:array [Low(AdditionalHiglightAttributes)..
High(AdditionalHiglightAttributes)] of TSynHighlightElement;
CurHighlightElement:TSynHighlightElement;
procedure SetupButtonBar;
procedure SetupGeneralPage;
procedure SetupDisplayPage;
procedure SetupKeyMappingsPage;
procedure SetupColorPage;
procedure SetupCodeToolsPage;
procedure SetComboBoxText(AComboBox:TComboBox;AText:AnsiString);
procedure FillCodeTemplateListBox;
function KeyMappingRelationToString(Index:integer):AnsiString;
procedure FillKeyMappingListBox;
procedure ShowCurAttribute;
procedure FindCurHighlightElement;
procedure FontDialogNameToFont(FontDialogName:string;AFont:TFont);
procedure InvalidatePreviews;
procedure ShowCurCodeTemplate;
public
constructor Create(AOwner: TComponent); override;
end;
TLazSyntaxHighlighter =
(lshNone, lshText, lshFreePascal, lshDelphi, lshLFM, lshXML);
const
LazSyntaxHighlighterNames : array[TLazSyntaxHighlighter] of string = (
'None',
'Text',
'FreePascal',
'Delphi',
'LFM',
'XML'
);
var
EditorOptionsForm: TEditorOptionsForm;
EditorOpts: TEditorOptions;
function ShowEditorOptionsDialog:TModalResult;
function StrToLazSyntaxHighlighter(s: string): TLazSyntaxHighlighter;
function ExtensionToLazSyntaxHighlighter(Ext:string): TLazSyntaxHighlighter;
implementation
uses math;
function ShowEditorOptionsDialog:TModalResult;
var
EditorOptionsForm: TEditorOptionsForm;
begin
Result:=mrCancel;
EditorOptionsForm:=TEditorOptionsForm.Create(Application);
try
Result:=EditorOptionsForm.ShowModal;
finally
EditorOptionsForm.Free;
end;
end;
function StrToLazSyntaxHighlighter(s: string): TLazSyntaxHighlighter;
begin
for Result:=Low(TLazSyntaxHighlighter) to High(TLazSyntaxHighlighter) do
if (lowercase(s)=lowercase(LazSyntaxHighlighterNames[Result])) then exit;
Result:=lshFreePascal;
end;
function ExtensionToLazSyntaxHighlighter(Ext:string): TLazSyntaxHighlighter;
var s,CurExt:string;
StartPos,EndPos:integer;
begin
if (Ext='') then begin
Result:=lshNone;
exit;
end;
Ext:=lowercase(Ext);
if (Ext[1]='.') then Ext:=copy(Ext,2,length(Ext)-1);
s:=EditorOpts.SyntaxExtensions;
StartPos:=1;
while StartPos<=length(s) do begin
Endpos:=StartPos;
while (EndPos<=length(s)) and (s[EndPos]<>';') do inc(EndPos);
CurExt:=copy(s,Startpos,EndPos-StartPos);
if (CurExt<>'') and (CurExt[1]='.') then begin
CurExt:=copy(CurExt,2,length(CurExt)-1);
end;
if lowercase(CurExt)=Ext then begin
Result:=lshFreePascal;
if (Ext='.dpr') or (Ext='.dpk') or (Ext='.dfm') then Result:=lshDelphi;
exit;
end;
Startpos:=EndPos+1;
end;
if Ext='.xml' then Result:=lshXML
else if Ext='.lfm' then Result:=lshLFM
else if Ext='.txt' then Result:=lshText
else Result:=lshNone;
end;
const
EditOptsConfFileName = 'editoroptions.xml';
ExampleSource : array[1..21] of string = (
'procedure TForm1.Button1Click(Sender: TObject);',
'var',
' Number, I, X: Integer;',
'begin',
' Number := 12345;',
' Caption := ''The number is '' + IntToStr(Number);',
' asm',
' MOV AX,1234h',
' MOV Number,AX',
' end;',
' X := 10;',
' { Search Match, Text Block }',
' for I := 0 to Number do { execution point }',
' begin',
' Inc(X); { Enabled breakpoint }',
' Dec(X); { Disabled breakpoint }',
' X := X + 1.0; { Error line }',
' ListBox1.Items.Add(IntToStr(X));',
' end;',
'end;',
''
);
{ TEditorOptions }
constructor TEditorOptions.Create;
var ConfFileName,SecConfFileName:string;
begin
inherited Create;
ConfFileName:=SetDirSeparators(GetPrimaryConfigPath+'/'+EditOptsConfFileName);
if (not FileExists(ConfFileName)) then begin
SecConfFileName:=SetDirSeparators(
GetSecondaryConfigPath+'/'+EditOptsConfFileName);
if (not FileExists(SecConfFileName)) then begin
// XXX
writeln('editor options config file not found');
end else begin
ConfFileName:=SecConfFileName;
end;
end;
XMLConfig:=TXMLConfig.Create(ConfFileName);
// set defaults
// General options
fSyntaxExtensions:='pp;inc;lfm;lrs;pas;dpr;dfm;dpk';
// Display options
fEditorFont:='courier';
// Key Mappings
fKeyMappingScheme:='default';
fKeyMap:=TKeyCommandRelationList.Create;
// Color options
fColorScheme:='Default';
fTextBlockElement:=
TSynHighlightElement.Create(AdditionalHiglightAttributes[0]);
fExecutionPointElement:=
TSynHighlightElement.Create(AdditionalHiglightAttributes[1]);
fEnabledBreakPointElement:=
TSynHighlightElement.Create(AdditionalHiglightAttributes[2]);
fDisabledBreakPointElement:=
TSynHighlightElement.Create(AdditionalHiglightAttributes[3]);
fErrorLineElement:=
TSynHighlightElement.Create(AdditionalHiglightAttributes[4]);
// Code Tools options
fCodeTemplateFileName:=SetDirSeparators(GetPrimaryConfigPath+'/lazarus.dci');
end;
destructor TEditorOptions.Destroy;
begin
fTextBlockElement.Free;
fExecutionPointElement.Free;
fEnabledBreakPointElement.Free;
fDisabledBreakPointElement.Free;
fErrorLineElement.Free;
XMLConfig.Free;
inherited Destroy;
end;
procedure TEditorOptions.Load;
// load options from XML file
var SynEditOpt:TSynEditorOption;
SynEditOptName:ansistring;
begin
// general options
for SynEditOpt:=Low(TSynEditorOption) to High(TSynEditorOption) do begin
case SynEditOpt of
eoAltSetsColumnMode:SynEditOptName:='AltSetsColumnMode';
eoAutoIndent:SynEditOptName:='AutoIndent';
eoDragDropEditing:SynEditOptName:='DragDropEditing';
eoDropFiles:SynEditOptName:='DropFiles';
eoHalfPageScroll:SynEditOptName:='HalfPageScroll';
eoKeepCaretX:SynEditOptName:='KeepCaretX';
eoNoCaret:SynEditOptName:='NoCaret';
eoNoSelection:SynEditOptName:='NoSelection';
eoScrollByOneLess:SynEditOptName:='ScrollByOneLess';
eoScrollPastEof:SynEditOptName:='ScrollPastEof';
eoScrollPastEol:SynEditOptName:='ScrollPastEol';
eoShowScrollHint:SynEditOptName:='ShowScrollHint';
eoSmartTabs:SynEditOptName:='SmartTabs';
eoTabsToSpaces:SynEditOptName:='TabsToSpaces';
eoTrimTrailingSpaces:SynEditOptName:='TrimTrailingSpaces';
else
SynEditOptName:='';
end;
if SynEditOptName<>'' then begin
if XMLConfig.GetValue('EditorOptions/General/Editor/'+SynEditOptName,
SynEditOpt in SYNEDIT_DEFAULT_OPTIONS) then
Include(fSynEditOptions,SynEditOpt)
else
Exclude(fSynEditOptions,SynEditOpt);
end;
end;
fUndoAfterSave:=
XMLConfig.GetValue('EditorOptions/General/Editor/UndoAfterSave',true);
fDoubleClickLine:=
XMLConfig.GetValue('EditorOptions/General/Editor/DoubleClickLine',false);
fFindTextAtCursor:=
XMLConfig.GetValue('EditorOptions/General/Editor/FindTextAtCursor',true);
fUseSyntaxHighlight:=
XMLConfig.GetValue('EditorOptions/General/Editor/UseSyntaxHighlight',true);
fCreateBackupFiles:=
XMLConfig.GetValue('EditorOptions/General/Editor/CreateBackupFiles',true);
fBlockIndent:=
XMLConfig.GetValue('EditorOptions/General/Editor/BlockIndent',2);
fUndoLimit:=
XMLConfig.GetValue('EditorOptions/General/Editor/UndoLimit',32767);
fTabWidths:=
XMLConfig.GetValue('EditorOptions/General/Editor/TabWidths',8);
fSyntaxExtensions:=
XMLConfig.GetValue('EditorOptions/General/Editor/SyntaxExtensions'
,'pp;inc;lfm;lfc;pas;dpr;dfm;dpk');
// Display options
fVisibleRightMargin:=
XMLConfig.GetValue('EditorOptions/Display/VisibleRightMargin',true);
fVisibleGutter:=
XMLConfig.GetValue('EditorOptions/Display/VisibleGutter',true);
fShowLineNumbers:=
XMLConfig.GetValue('EditorOptions/Display/ShowLineNumbers',false);
fGutterColor:=
XMLConfig.GetValue('EditorOptions/Display/GutterColor',clBtnFace);
fGutterWidth:=
XMLConfig.GetValue('EditorOptions/Display/GutterWidth',30);
fRightMargin:=
XMLConfig.GetValue('EditorOptions/Display/RightMargin',80);
fRightMarginColor:=
XMLConfig.GetValue('EditorOptions/Display/VisibleRightMarginColor'
,clBtnFace);
fEditorFont:=
XMLConfig.GetValue('EditorOptions/Display/EditorFont','courier');
fEditorFontHeight:=
XMLConfig.GetValue('EditorOptions/Display/EditorFontHeight',12);
fExtraLineSpacing:=
XMLConfig.GetValue('EditorOptions/Display/ExtraLineSpacing',1);
// Key Mappings options
fKeyMappingScheme:=
XMLConfig.GetValue('EditorOptions/KeyMapping/Scheme',fKeyMappingScheme);
fKeyMap.LoadFromXMLConfig(XMLConfig
,'EditorOptions/KeyMapping/'+fKeyMappingScheme+'/');
// Color options
fColorScheme:=
XMLConfig.GetValue('EditorOptions/Color/ColorScheme','Default');
ReadAttribute(fTextBlockElement);
ReadAttribute(fExecutionPointElement);
ReadAttribute(fEnabledBreakPointElement);
ReadAttribute(fDisabledBreakPointElement);
ReadAttribute(fErrorLineElement);
// Code Tools options
fAutoCodeCompletion:=
XMLConfig.GetValue('EditorOptions/CodeTools/AutoCodeCompletion',true);
fAutoCodeParameters:=
XMLConfig.GetValue('EditorOptions/CodeTools/AutoCodeParameters',true);
fAutoToolTipExprEval:=
XMLConfig.GetValue('EditorOptions/CodeTools/AutoToolTipExprEval',true);
fAutoToolTipSymbTools:=
XMLConfig.GetValue('EditorOptions/CodeTools/AutoToolTipSymbTools',true);
fAutoDelayInMSec:=
XMLConfig.GetValue('EditorOptions/CodeTools/AutoDelayInMSec',1000);
fCodeTemplateFileName:=
XMLConfig.GetValue('EditorOptions/CodeTools/CodeTemplateFileName'
,SetDirSeparators(GetPrimaryConfigPath+'/lazarus.dci'));
end;
procedure TEditorOptions.Save;
// save options to XML file
var SynEditOpt:TSynEditorOption;
SynEditOptName:ansistring;
begin
// general options
for SynEditOpt:=Low(TSynEditorOption) to High(TSynEditorOption) do begin
case SynEditOpt of
eoAltSetsColumnMode:SynEditOptName:='AltSetsColumnMode';
eoAutoIndent:SynEditOptName:='AutoIndent';
eoDragDropEditing:SynEditOptName:='DragDropEditing';
eoDropFiles:SynEditOptName:='DropFiles';
eoHalfPageScroll:SynEditOptName:='HalfPageScroll';
eoKeepCaretX:SynEditOptName:='KeepCaretX';
eoNoCaret:SynEditOptName:='NoCaret';
eoNoSelection:SynEditOptName:='NoSelection';
eoScrollByOneLess:SynEditOptName:='ScrollByOneLess';
eoScrollPastEof:SynEditOptName:='ScrollPastEof';
eoScrollPastEol:SynEditOptName:='ScrollPastEol';
eoShowScrollHint:SynEditOptName:='ShowScrollHint';
eoSmartTabs:SynEditOptName:='SmartTabs';
eoTabsToSpaces:SynEditOptName:='TabsToSpaces';
eoTrimTrailingSpaces:SynEditOptName:='TrimTrailingSpaces';
else
SynEditOptName:='';
end;
if SynEditOptName<>'' then begin
XMLConfig.SetValue('EditorOptions/General/Editor/'+SynEditOptName,
SynEditOpt in fSynEditOptions);
end;
end;
XMLConfig.SetValue('EditorOptions/General/Editor/UndoAfterSave'
,fUndoAfterSave);
XMLConfig.SetValue('EditorOptions/General/Editor/DoubleClickLine'
,fDoubleClickLine);
XMLConfig.SetValue('EditorOptions/General/Editor/FindTextAtCursor'
,fFindTextAtCursor);
XMLConfig.SetValue('EditorOptions/General/Editor/UseSyntaxHighlight'
,fUseSyntaxHighlight);
XMLConfig.SetValue('EditorOptions/General/Editor/CreateBackupFiles'
,fCreateBackupFiles);
XMLConfig.SetValue('EditorOptions/General/Editor/BlockIndent'
,fBlockIndent);
XMLConfig.SetValue('EditorOptions/General/Editor/UndoLimit'
,fUndoLimit);
XMLConfig.SetValue('EditorOptions/General/Editor/TabWidths'
,fTabWidths);
XMLConfig.SetValue('EditorOptions/General/Editor/SyntaxExtensions'
,fSyntaxExtensions);
// Display options
XMLConfig.SetValue('EditorOptions/Display/VisibleRightMargin'
,fVisibleRightMargin);
XMLConfig.SetValue('EditorOptions/Display/VisibleGutter',fVisibleGutter);
XMLConfig.GetValue('EditorOptions/Display/ShowLineNumbers',fShowLineNumbers);
XMLConfig.GetValue('EditorOptions/Display/GutterColor',fGutterColor);
XMLConfig.SetValue('EditorOptions/Display/GutterWidth',fGutterWidth);
XMLConfig.SetValue('EditorOptions/Display/RightMargin',fRightMargin);
XMLConfig.SetValue('EditorOptions/Display/RightMarginColor',fRightMarginColor);
XMLConfig.SetValue('EditorOptions/Display/EditorFont',fEditorFont);
XMLConfig.SetValue('EditorOptions/Display/EditorFontHeight'
,fEditorFontHeight);
XMLConfig.SetValue('EditorOptions/Display/ExtraLineSpacing'
,fExtraLineSpacing);
// Key Mappings options
XMLConfig.SetValue('EditorOptions/KeyMapping/Scheme',fKeyMappingScheme);
fKeyMap.SaveToXMLConfig(
XMLConfig,'EditorOptions/KeyMapping/'+fKeyMappingScheme+'/');
// Color options
XMLConfig.SetValue('EditorOptions/Color/ColorScheme',fColorScheme);
WriteAttribute(fTextBlockElement);
WriteAttribute(fExecutionPointElement);
WriteAttribute(fEnabledBreakPointElement);
WriteAttribute(fDisabledBreakPointElement);
WriteAttribute(fErrorLineElement);
// Code Tools options
XMLConfig.SetValue('EditorOptions/CodeTools/AutoCodeCompletion'
,fAutoCodeCompletion);
XMLConfig.SetValue('EditorOptions/CodeTools/AutoCodeParameters'
,fAutoCodeParameters);
XMLConfig.SetValue('EditorOptions/CodeTools/AutoToolTipExprEval'
,fAutoToolTipExprEval);
XMLConfig.SetValue('EditorOptions/CodeTools/AutoToolTipSymbTools'
,fAutoToolTipSymbTools);
XMLConfig.SetValue('EditorOptions/CodeTools/AutoDelayInMSec'
,fAutoDelayInMSec);
XMLConfig.SetValue('EditorOptions/CodeTools/CodeTemplateFileName'
,fCodeTemplateFileName);
XMLConfig.Flush;
end;
procedure TEditorOptions.ReadAttribute(Attri:TSynHighlightElement);
var b:boolean;
fs:TFontStyles;
AttriName:string;
a:integer;
DefBGCol,DefFGCol:TColor;
DefFontStyles:TFontStyles;
begin
AttriName:=Attri.Name;
DefFGCol:=clNone;
DefBGCol:=clNone;
DefFontStyles:=[];
if AttriName='Assembler' then begin
DefFGCol:=clGreen;
end else if AttriName='Comment' then begin
DefFGCol:=clBlue;
DefFontStyles:=[fsBold];
end else if AttriName='Reserved word' then begin
DefFontStyles:=[fsBold];
end else if AttriName='Number' then begin
DefFGCol:=clNavy;
end else if AttriName='String' then begin
DefFGCol:=clBlue;
end else if AttriName='Symbol' then begin
DefFGCol:=clRed;
end else if AttriName=AdditionalHiglightAttributes[0] then begin
DefBGCol:=clNavy;
DefFGCol:=clWhite;
end else if AttriName=AdditionalHiglightAttributes[1] then begin
DefBGCol:=clDKGray;
DefFGCol:=clWhite;
end else if AttriName=AdditionalHiglightAttributes[2] then begin
DefBGCol:=clRed;
DefFGCol:=clBlack;
end else if AttriName=AdditionalHiglightAttributes[3] then begin
DefBGCol:=clGreen;
DefFGCol:=clBlack;
end else if AttriName=AdditionalHiglightAttributes[4] then begin
DefBGCol:=$50a0ff;
DefFGCol:=clBlack;
end;
for a:=1 to length(AttriName) do
if (not (AttriName[a] in ['a'..'z','A'..'Z'])) then
AttriName[a]:='_';
Attri.BackGround:=XMLConfig.GetValue(
'EditorOptions/Color/'+ColorScheme+'/'+AttriName+'/BackgroundColor',DefBGCol);
Attri.ForeGround:=XMLConfig.GetValue(
'EditorOptions/Color/'+ColorScheme+'/'+AttriName+'/ForegroundColor',DefFGCol);
fs:=[];
b:=XMLConfig.GetValue(
'EditorOptions/Color/'+ColorScheme+'/'+AttriName+'/Bold'
,fsBold in DefFontStyles);
if b then fs:=fs+[fsBold];
b:=XMLConfig.GetValue(
'EditorOptions/Color/'+ColorScheme+'/'+AttriName+'/Italic'
,fsItalic in DefFontStyles);
if b then fs:=fs+[fsItalic];
b:=XMLConfig.GetValue(
'EditorOptions/Color/'+ColorScheme+'/'+AttriName+'/Underline'
,fsUnderLine in DefFontStyles);
if b then fs:=fs+[fsUnderline];
Attri.Style:=fs;
end;
procedure TEditorOptions.GetHighlighterSettings(PasSyn:TPreviewPasSyn);
begin
ReadAttribute(PasSyn.AsmAttri);
ReadAttribute(PasSyn.CommentAttri);
ReadAttribute(PasSyn.IdentifierAttri);
ReadAttribute(PasSyn.KeyAttri);
ReadAttribute(PasSyn.NumberAttri);
ReadAttribute(PasSyn.SpaceAttri);
ReadAttribute(PasSyn.StringAttri);
ReadAttribute(PasSyn.SymbolAttri);
end;
procedure TEditorOptions.WriteAttribute(Attri:TSynHighlightElement);
var AttriName:string;
a:integer;
begin
AttriName:=Attri.Name;
for a:=1 to length(AttriName) do
if (not (AttriName[a] in ['a'..'z','A'..'Z'])) then
AttriName[a]:='_';
XMLConfig.SetValue(
'EditorOptions/Color/'+ColorScheme+'/'+AttriName+'/BackgroundColor'
,Attri.BackGround);
XMLConfig.SetValue(
'EditorOptions/Color/'+ColorScheme+'/'+AttriName+'/ForegroundColor'
,Attri.ForeGround);
XMLConfig.SetValue(
'EditorOptions/Color/'+ColorScheme+'/'+AttriName+'/Bold'
,fsBold in Attri.Style);
XMLConfig.SetValue(
'EditorOptions/Color/'+ColorScheme+'/'+AttriName+'/Italic'
,fsItalic in Attri.Style);
XMLConfig.SetValue(
'EditorOptions/Color/'+ColorScheme+'/'+AttriName+'/Underline'
,fsUnderline in Attri.Style);
end;
procedure TEditorOptions.SetHighlighterSettings(PasSyn:TPreviewPasSyn);
begin
WriteAttribute(PasSyn.AsmAttri);
WriteAttribute(PasSyn.CommentAttri);
WriteAttribute(PasSyn.IdentifierAttri);
WriteAttribute(PasSyn.KeyAttri);
WriteAttribute(PasSyn.NumberAttri);
WriteAttribute(PasSyn.SpaceAttri);
WriteAttribute(PasSyn.StringAttri);
WriteAttribute(PasSyn.SymbolAttri);
end;
procedure TEditorOptions.GetSynEditSettings(ASynEdit:TSynEdit);
// read synedit setings from config file
begin
// general options
ASynEdit.Options:=fSynEditOptions;
ASynEdit.TabWidth:=fBlockIndent;
// Display options
ASynEdit.Gutter.Visible:=fVisibleGutter;
ASynEdit.Gutter.ShowLineNumbers:=fShowLineNumbers;
ASynEdit.Gutter.Color:=fGutterColor;
ASynEdit.Gutter.Width:=fGutterWidth;
ASynEdit.RightEdge:=fRightMargin;
ASynEdit.RightEdgeColor:=fRightMarginColor;
ASynEdit.Font.Name:=fEditorFont;
ASynEdit.Font.Height:=fEditorFontHeight;
ASynEdit.ExtraLineSpacing:=fExtraLineSpacing;
ASynEdit.MaxUndo:=fUndoLimit;
ASynEdit.SelectedColor.ForeGround:=fTextBlockElement.ForeGround;
ASynEdit.SelectedColor.BackGround:=fTextBlockElement.BackGround;
KeyMap.AssignTo(ASynEdit.KeyStrokes);
end;
procedure TEditorOptions.SetSynEditSettings(ASynEdit:TSynEdit);
// write synedit settings to file
begin
// general options
fSynEditOptions:=ASynEdit.Options;
fTabWidths:=ASynEdit.TabWidth;
// Display options
fVisibleGutter:=ASynEdit.Gutter.Visible;
fShowLineNumbers:=ASynEdit.Gutter.ShowLineNumbers;
fGutterColor:=ASynEdit.Gutter.Color;
fGutterWidth:=ASynEdit.Gutter.Width;
fRightMargin:=ASynEdit.RightEdge;
fEditorFont:=ASynEdit.Font.Name;
fEditorFontHeight:=ASynEdit.Font.Height;
fExtraLineSpacing:=ASynEdit.ExtraLineSpacing;
fUndoLimit:=ASynEdit.MaxUndo;
fTextBlockElement.ForeGround:=ASynEdit.SelectedColor.ForeGround;
fTextBlockElement.BackGround:=ASynEdit.SelectedColor.BackGround;
// XXX: KeyMap
// XXX: update all checkboxes, comboboxes...
end;
{ TColorButton }
procedure TColorButton.Paint;
var PaintRect:TRect;
begin
//inherited Paint;
PaintRect := Bounds(Left, Top, Width, Height);
with Canvas do begin
Brush.Color:=ButtonColor;
FillRect(PaintRect);
end;
DrawFrameControl(Canvas.Handle, PaintRect, DFC_BUTTON
,DFCS_BUTTONPUSH or DFCS_ADJUSTRECT);
end;
procedure TColorButton.SetButtonColor(Value:TColor);
begin
if Value=FButtonColor then exit;
FButtonColor:=Value;
if Assigned(FOnColorChanged) then begin
FOnColorChanged(Self);
end;
Invalidate;
end;
procedure TColorButton.MouseDown(Button:TMouseButton; Shift:TShiftState;
X,Y:integer);
begin
end;
procedure TColorButton.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
end;
procedure TColorButton.MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
var NewColor:TColor;
begin
if FColorDialog<>nil then exit;
if not Enabled then exit;
NewColor:=ButtonColor;
FColorDialog:=TColorDialog.Create(Application);
try
FColorDialog.Color:=ButtonColor;
if FColorDialog.Execute then begin
NewColor:=FColorDialog.Color;
end;
finally
FColorDialog.Free;
FColorDialog:=nil;
end;
ButtonColor:=NewColor;
Invalidate;
end;
{ TEditorOptionsForm }
constructor TEditorOptionsForm.Create(AOwner:TComponent);
var a:integer;
s:Ansistring;
begin
inherited Create(AOwner);
if LazarusResources.Find(ClassName)=nil then begin
SetBounds((Screen.Width-470) div 2,(Screen.Height-480) div 2, 455,459);
Caption:='Editor Options';
PreviewPasSyn:=TPreviewPasSyn.Create(Self);
SynAutoComplete:=TSynEditAutoComplete.Create(Self);
MainNoteBook:=TNoteBook.Create(Self);
with MainNoteBook do begin
Parent:=Self;
Top:=0;
Left:=0;
Width:=Self.Width-4;
Height:=Self.Height-50;
Pages.Strings[0]:='General';
Pages.Add('Display');
Pages.Add('Key Mappings');
Pages.Add('Color');
Pages.Add('Code Tools');
end;
SetupGeneralPage;
SetupDisplayPage;
SetupKeyMappingsPage;
SetupColorPage;
SetupCodeToolsPage;
MainNoteBook.Show;
SetupButtonBar;
end;
for a:=Low(PreviewEdits) to High(PreviewEdits) do
PreviewEdits[a]:=nil;
EditorOpts.GetHighlighterSettings(PreviewPasSyn);
AddHighlightElements[0]:=EditorOpts.TextBlockElement;
AddHighlightElements[1]:=EditorOpts.ExecutionPointElement;
AddHighlightElements[2]:=EditorOpts.EnabledBreakPointElement;
AddHighlightElements[3]:=EditorOpts.DisabledBreakPointElement;
AddHighlightElements[4]:=EditorOpts.ErrorLineElement;
CurHighlightElement:=nil;
with SynAutoComplete do begin
s:=EditorOpts.CodeTemplateFileName;
if FileExists(s) then
try
AutoCompleteList.LoadFromFile(s);
except
writeln('ERROR unable to read code template file ''',s,'''');
Halt;
end;
end;
PreviewEdits[1]:=DisplayPreview;
PreviewEdits[2]:=ColorPreview;
PreviewEdits[3]:=CodeTemplateCodePreview;
for a:=Low(PreviewEdits) to High(PreviewEdits) do begin
if PreviewEdits[a]<>nil then with PreviewEdits[a] do begin
EditorOpts.GetSynEditSettings(PreviewEdits[a]);
if EditorOpts.UseSyntaxHighlight then
Highlighter:=PreviewPasSyn;
EditorOpts.KeyMap.AssignTo(PreviewEdits[a].KeyStrokes);
end;
end;
CodeTemplateCodePreview.Gutter.Visible:=false;
// general options
// display options
// key mappings
// color options
// code Tools options
FindCurHighlightElement;
FillCodeTemplateListBox;
FillKeyMappingListBox;
// with CodeTemplateListBox do
// if Items.Count>0 then Selected[0]:=true;
// ShowCurCodeTemplate;
end;
// general
procedure TEditorOptionsForm.GeneralCheckBoxOnClick(Sender: TObject);
var a:integer;
NewColor:TColor;
procedure SetOption(ACheckBox:TCheckBox;AnOption:TSynEditorOption);
var a:integer;
begin
if Sender=ACheckBox then
for a:=Low(PreviewEdits) to High(PreviewEdits) do
if PreviewEdits[a]<>nil then
if ACheckBox.Checked then
PreviewEdits[a].Options:=PreviewEdits[a].Options+[AnOption]
else
PreviewEdits[a].Options:=PreviewEdits[a].Options-[AnOption]
end;
// GeneralCheckBoxOnClick
begin
{$IFDEF NEW_EDITOR_SYNEDIT}
// general
SetOption(AltSetsColumnModeCheckBox,eoAltSetsColumnMode);
SetOption(AutoIndentCheckBox,eoAutoIndent);
SetOption(DragDropEditingCheckBox,eoDragDropEditing);
SetOption(DropFilesCheckBox,eoDropFiles);
SetOption(HalfPageScrollCheckBox,eoHalfPageScroll);
SetOption(KeepCaretXCheckBox,eoKeepCaretX);
SetOption(NoCaretCheckBox,eoNoCaret);
SetOption(NoSelectionCheckBox,eoNoSelection);
SetOption(ScrollByOneLessCheckBox,eoScrollByOneLess);
SetOption(ScrollPastEoFCheckBox,eoScrollPastEoF);
SetOption(ScrollPastEoLCheckBox,eoScrollPastEoL);
SetOption(ShowScrollHintCheckBox,eoShowScrollHint);
SetOption(SmartTabsCheckBox,eoSmartTabs);
SetOption(TabsToSpacesCheckBox,eoTabsToSpaces);
SetOption(TrimTrailingSpacesCheckBox,eoTrimTrailingSpaces);
{$ELSE}
{$ENDIF}
for a:=Low(PreviewEdits) to High(PreviewEdits) do begin
if PreviewEdits[a]<>nil then begin
{$IFDEF NEW_EDITOR_SYNEDIT}
// general
if Sender=UseSyntaxHighlightCheckBox then
if UseSyntaxHighlightCheckBox.Checked then
PreviewEdits[a].Highlighter:=PreviewPasSyn
else
PreviewEdits[a].Highlighter:=nil;
// display
if (a in [1,2]) then
PreviewEdits[a].Gutter.Visible:=VisibleGutterCheckBox.Checked;
PreviewEdits[a].Gutter.ShowLineNumbers:=ShowLineNumbersCheckBox.Checked;
{$ELSE}
{$ENDIF}
end;
end;
if CurHighlightElement<>nil then begin
if Sender=ForeGroundUseDefaultCheckBox then begin
if not ForeGroundUseDefaultCheckBox.Checked then
NewColor:=ForeGroundColorButton.Color
else
NewColor:=clNone;
if NewColor<>CurHighlightElement.Foreground then begin
CurHighlightElement.Foreground:=NewColor;
InvalidatePreviews;
end;
end;
if Sender=BackGroundUseDefaultCheckBox then begin
if not BackGroundUseDefaultCheckBox.Checked then
NewColor:=BackGroundColorButton.Color
else
NewColor:=clNone;
if NewColor<>CurHighlightElement.Background then begin
CurHighlightElement.Background:=NewColor;
InvalidatePreviews;
end;
end;
if Sender=TextBoldCheckBox then begin
if TextBoldCheckBox.Checked then begin
if not (fsBold in CurHighlightElement.Style) then begin
CurHighlightElement.Style:=CurHighlightElement.Style+[fsBold];
InvalidatePreviews;
end;
end else begin
if (fsBold in CurHighlightElement.Style) then begin
CurHighlightElement.Style:=CurHighlightElement.Style-[fsBold];
InvalidatePreviews;
end;
end;
end;
if Sender=TextItalicCheckBox then begin
if TextItalicCheckBox.Checked then begin
if not (fsItalic in CurHighlightElement.Style) then begin
CurHighlightElement.Style:=CurHighlightElement.Style+[fsItalic];
InvalidatePreviews;
end;
end else begin
if (fsItalic in CurHighlightElement.Style) then begin
CurHighlightElement.Style:=CurHighlightElement.Style-[fsItalic];
InvalidatePreviews;
end;
end;
end;
if Sender=TextUnderlineCheckBox then begin
if TextUnderlineCheckBox.Checked then begin
if not (fsUnderline in CurHighlightElement.Style) then begin
CurHighlightElement.Style:=CurHighlightElement.Style+[fsUnderline];
InvalidatePreviews;
end;
end else begin
if (fsUnderline in CurHighlightElement.Style) then begin
CurHighlightElement.Style:=CurHighlightElement.Style-[fsUnderline];
InvalidatePreviews;
end;
end;
end;
end;
end;
procedure TEditorOptionsForm.ColorButtonColorChanged(Sender:TObject);
var a:integer;
begin
if Sender=ForeGroundColorButton then begin
if CurHighlightElement=nil then exit;
if not ForeGroundUseDefaultCheckBox.Checked then begin
CurHighlightElement.Foreground:=ForeGroundColorButton.ButtonColor;
InvalidatePreviews;
end;
end;
if Sender=BackGroundColorButton then begin
if CurHighlightElement=nil then exit;
if not BackGroundUseDefaultCheckBox.Checked then begin
CurHighlightElement.Background:=BackGroundColorButton.ButtonColor;
InvalidatePreviews;
end;
end;
if Sender=GutterColorButton then begin
for a:=Low(PreviewEdits) to High(PreviewEdits) do begin
if PreviewEdits[a]<>nil then begin
{$IFDEF NEW_EDITOR_SYNEDIT}
PreviewEdits[a].Gutter.Color:=GutterColorButton.ButtonColor;
PreviewEdits[a].Invalidate;
{$ELSE}
PreviewEdits[a].GutterColor:=GutterColorButton.ButtonColor;
{$ENDIF}
end;
end;
end;
if Sender=RightMarginColorButton then begin
for a:=Low(PreviewEdits) to High(PreviewEdits) do begin
if PreviewEdits[a]<>nil then begin
{$IFDEF NEW_EDITOR_SYNEDIT}
PreviewEdits[a].RightEdgeColor:=RightMarginColorButton.ButtonColor;
PreviewEdits[a].Invalidate;
{$ELSE}
{$ENDIF}
end;
end;
end;
end;
procedure TEditorOptionsForm.FontDialogNameToFont(FontDialogName:string;AFont:TFont);
var TmpFont:TFont;
p,p2,index:integer;
s:shortstring;
begin
TmpFont:=TFont.Create;
TmpFont.Assign(AFont);
try
p:=1;
p2:=0;
index:=1;
while (p<=length(FontDialogName)) do begin
if(FontDialogName[p]='-') then begin
s:=copy(FontDialogName,p2+1,p-p2-1);
p2:=p;
case Index of
3:TmpFont.Name:=s;
//8:TmpFont.Height:=StrToIntDef(s,TmpFont.Height);
end;
inc(Index);
end;
inc(p);
end;
AFont.Assign(TmpFont);
finally
TmpFont.Free;
end;
end;
procedure TEditorOptionsForm.EditorFontButtonClick(Sender:TObject);
var FontDialog:TFontDialog;
a:integer;
begin
FontDialog:=TFontDialog.Create(Application);
try
with FontDialog do begin
if Execute then begin
EditorFontComboBox.Text:=FontName;
for a:=Low(PreviewEdits) to High(PreviewEdits) do begin
if PreviewEdits[a]<>nil then
FontDialogNameToFont(FontName,PreviewEdits[a].Font);
end;
EditorFontComboBox.Text:=PreviewEdits[a].Font.Name;
end;
end;
finally
FontDialog.Free;
end;
end;
procedure TEditorOptionsForm.ComboBoxOnExit(Sender:TObject);
var NewVal,a:integer;
begin
if PreviewEdits[1]<>nil then begin
// general
if Sender=BlockIndentComboBox then begin
NewVal:=StrToIntDef(BlockIndentComboBox.Text
,PreviewEdits[1].TabWidth);
SetComboBoxText(BlockIndentComboBox,IntToStr(NewVal));
for a:=Low(PreviewEdits) to High(PreviewEdits) do
if PreviewEdits[a]<>nil then
PreviewEdits[a].TabWidth:=NewVal;
end;
// display
if Sender=EditorFontHeightComboBox then begin
NewVal:=StrToIntDef(EditorFontHeightComboBox.Text
,PreviewEdits[1].Font.Height);
if (NewVal<0) then
if (NewVal>-6) then
NewVal:=-6;
if (NewVal>=0) then
if (NewVal<6) then
NewVal:=6;
if (NewVal>40) then
NewVal:=40;
if (NewVal<-40) then
NewVal:=-40;
SetComboBoxText(EditorFontHeightComboBox,IntToStr(NewVal));
for a:=Low(PreviewEdits) to High(PreviewEdits) do
if PreviewEdits[a]<>nil then
PreviewEdits[a].Font.Height:=NewVal;
end;
if Sender=ExtraLineSpacingComboBox then begin
NewVal:=StrToIntDef(ExtraLineSpacingComboBox.Text
,PreviewEdits[1].ExtraLineSpacing);
SetComboBoxText(ExtraLineSpacingComboBox,IntToStr(NewVal));
for a:=Low(PreviewEdits) to High(PreviewEdits) do
if PreviewEdits[a]<>nil then
PreviewEdits[a].ExtraLineSpacing:=NewVal;
end;
if Sender=GutterWidthComboBox then begin
NewVal:=StrToIntDef(GutterWidthComboBox.Text
,PreviewEdits[1].Gutter.Width);
SetComboBoxText(GutterWidthComboBox,IntToStr(NewVal));
for a:=Low(PreviewEdits) to High(PreviewEdits) do
if PreviewEdits[a]<>nil then
PreviewEdits[a].Gutter.Width:=NewVal;
end;
if Sender=RightMarginComboBox then begin
NewVal:=StrToIntDef(RightMarginComboBox.Text
,PreviewEdits[1].RightEdge);
SetComboBoxText(RightMarginComboBox,IntToStr(NewVal));
for a:=Low(PreviewEdits) to High(PreviewEdits) do
if PreviewEdits[a]<>nil then
PreviewEdits[a].RightEdge:=NewVal;
end;
end;
end;
procedure TEditorOptionsForm.ComboBoxOnKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if (ssCtrl in Shift) and (Key=VK_S) then begin
ComboBoxOnExit(Sender);
end;
end;
procedure TEditorOptionsForm.ComboBoxOnChange(Sender:TObject);
var ComboBox:TComboBox;
begin
ComboBox:=TComboBox(Sender);
if ComboBox.Items.IndexOf(ComboBox.Text)>=0 then
ComboBoxOnExit(Sender);
end;
procedure TEditorOptionsForm.FindCurHighlightElement;
var a:integer;
Old:TSynHighlightElement;
begin
Old:=CurHighlightElement;
CurHighlightElement:=nil;
a:=0;
while a<ColorElementListBox.Items.Count do begin
if ColorElementListBox.Selected[a] then begin
case a of
0:CurHighlightElement:=PreviewPasSyn.AsmAttri;
1:CurHighlightElement:=PreviewPasSyn.CommentAttri;
2:CurHighlightElement:=PreviewPasSyn.IdentifierAttri;
3:CurHighlightElement:=PreviewPasSyn.KeyAttri;
4:CurHighlightElement:=PreviewPasSyn.NumberAttri;
5:CurHighlightElement:=PreviewPasSyn.SpaceAttri;
6:CurHighlightElement:=PreviewPasSyn.StringAttri;
7:CurHighlightElement:=PreviewPasSyn.SymbolAttri;
else
dec(a,8-Low(AdditionalHiglightAttributes));
if a<=High(AdditionalHiglightAttributes) then
CurHighlightElement:=AddHighlightElements[a];
end;
break;
end;
inc(a);
end;
if CurHighlightElement=nil then begin
// none selected -> select one
ColorElementListBox.Selected[0]:=true;
CurHighlightElement:=PreviewPasSyn.AsmAttri;
end;
if Old<>CurHighlightElement then
ShowCurAttribute;
end;
procedure TEditorOptionsForm.InvalidatePreviews;
var a:integer;
begin
for a:=Low(PreviewEdits) to High(PreviewEdits) do
if PreviewEdits[a]<>nil then
PreviewEdits[a].Invalidate;
end;
procedure TEditorOptionsForm.ShowCurAttribute;
begin
if CurHighlightElement=nil then exit;
TextBoldCheckBox.Checked:=fsBold in CurHighlightElement.Style;
TextItalicCheckBox.Checked:=fsItalic in CurHighlightElement.Style;
TextUnderlineCheckBox.Checked:=fsUnderline in CurHighlightElement.Style;
if CurHighlightElement.Foreground=clNone then begin
ForeGroundUseDefaultCheckBox.Checked:=true;
end else begin
ForeGroundUseDefaultCheckBox.Checked:=false;
ForeGroundColorButton.ButtonColor:=CurHighlightElement.Foreground;
end;
if CurHighlightElement.Background=clNone then begin
BackGroundUseDefaultCheckBox.Checked:=true;
end else begin
BackGroundUseDefaultCheckBox.Checked:=false;
BackGroundColorButton.ButtonColor:=CurHighlightElement.Background;
end;
end;
procedure TEditorOptionsForm.KeyMappingListBoxMouseUp(Sender:TObject;
Button:TMouseButton; Shift:TShiftState; X,Y:integer);
var a:integer;
begin
if Button=mbRight then begin
a:=KeyMappingListBox.Items.Count-1;
while (a>=0) and (KeyMappingListBox.Selected[a]=false) do
dec(a);
if a>=0 then begin
if ShowKeyMappingEditForm(a,EditorOpts.KeyMap)=mrOk then begin
// There is a bug in ListBox
//KeyMappingListBox.Items[a]:=KeyMappingRelationToString(a);
// workaround:
FillKeyMappingListBox;
for a:=Low(PreviewEdits) to High(PreviewEdits) do
if PreviewEdits[a]<>nil then
EditorOpts.KeyMap.AssignTo(PreviewEdits[a].KeyStrokes);
end;
end;
end;
end;
type
TKeyMapErrorsForm = class(TForm)
ListBox: TListBox;
BackButton: TButton;
procedure BackButtonClick(Sender: TObject);
public
constructor Create(AOwner: TComponent); override;
end;
constructor TKeyMapErrorsForm.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
if LazarusResources.Find(ClassName)=nil then begin
SetBounds((Screen.Width-410) div 2,(Screen.Height-260) div 2, 400,250);
Caption:='Key mapping errors';
ListBox:=TListBox.Create(Self);
with ListBox do begin
Name:='ListBox';
Parent:=Self;
Left:=0;
Top:=0;
Width:=Self.ClientWidth-4;
Height:=Self.ClientHeight-50;
Show;
end;
BackButton:=TButton.Create(Self);
with BackButton do begin
Name:='BackButton';
Parent:=Self;
Width:=60;
Height:=25;
Caption:='Back';
Left:=((Self.ClientWidth-4)-Width) div 2;
Top:=Self.ClientHeight-38;
OnClick:=@BackButtonClick;
Show;
end;
end;
end;
procedure TKeyMapErrorsForm.BackButtonClick(Sender: TObject);
begin
ModalResult:=mrOk;
end;
procedure TEditorOptionsForm.KeyMappingConsistencyCheckButtonClick(
Sender: TObject);
var Protocol:TStringList;
ErrorCount, Index1, Index2:integer;
ACaption,AText:AnsiString;
KeyMapErrorsForm:TKeyMapErrorsForm;
begin
Protocol:=TStringList.Create;
try
ErrorCount:=KeyStrokesConsistencyErrors(DisplayPreview.KeyStrokes
,Protocol, Index1, Index2);
if ErrorCount>0 then begin
KeyMapErrorsForm:=TKeyMapErrorsForm.Create(Application);
try
KeyMapErrorsForm.ListBox.Items.Assign(Protocol);
KeyMapErrorsForm.ShowModal;
finally
KeyMapErrorsForm.Free;
end;
end else begin
ACaption:='Report';
AText:='No errors in key mapping found.';
Application.MessageBox(PChar(AText),PChar(ACaption),mb_ok);
end;
finally
Protocol.Free;
end;
end;
procedure TEditorOptionsForm.ColorElementListBoxMouseUp(Sender:TObject;
Button:TMouseButton; Shift:TShiftState; X,Y:integer);
begin
FindCurHighlightElement;
end;
procedure TEditorOptionsForm.ColorPreviewMouseUp(Sender:TObject;
Button:TMouseButton; Shift:TShiftState; X,Y:integer);
var NewIndex:integer;
AName,Token:ansistring;
Attri:TSynHighlightElement;
MouseXY,XY:TPoint;
begin
MouseXY:=Point(X,Y);
XY:=ColorPreview.PixelsToRowColumn(MouseXY);
NewIndex:=ColorElementListBox.ItemIndex;
case XY.Y of
13:NewIndex:=8;
14:NewIndex:=9;
16:NewIndex:=10;
17:NewIndex:=11;
18:NewIndex:=12;
else
ColorPreview.GetHighlighterAttriAtRowCol(XY,Token,Attri);
if Attri<>nil then begin
AName:=uppercase(Attri.Name);
if AName='ASSEMBLER' then NewIndex:=0
else if AName='COMMENT' then NewIndex:=1
else if AName='IDENTIFIER' then NewIndex:=2
else if AName='RESERVED WORD' then NewIndex:=3
else if AName='NUMBER' then NewIndex:=4
else if AName='SPACE' then NewIndex:=5
else if AName='STRING' then NewIndex:=6
else if AName='SYMBOL' then NewIndex:=7;
end;
end;
if NewIndex<>ColorElementListBox.ItemIndex then begin
ColorElementListBox.ItemIndex:=NewIndex;
FindCurHighlightElement;
ShowCurAttribute;
end;
end;
procedure TEditorOptionsForm.OnSpecialLineColors(Sender: TObject;
Line: integer; var Special: boolean; var FG, BG: TColor);
var e:TSynHighlightElement;
begin
case Line of
13:e:=EditorOpts.TextBlockElement;
14:e:=EditorOpts.ExecutionPointElement;
16:e:=EditorOpts.EnabledBreakPointElement;
17:e:=EditorOpts.DisabledBreakPointElement;
18:e:=EditorOpts.ErrorLineElement;
else e:=nil;
end;
if e<>nil then begin
Special:=true;
FG:=e.ForeGround;
BG:=e.BackGround;
end;
end;
function TEditorOptionsForm.KeyMappingRelationToString(
Index:integer):AnsiString;
var s:AnsiString;
begin
with EditorOpts.KeyMap.Relations[Index] do begin
Result:=copy(Name,1,37);
SetLength(s,(37-length(Result))*2);
FillChar(s[1],length(s),'.');
Result:=Result+s;
if (Key1=VK_UNKNOWN) and (Key2=VK_UNKNOWN) then
Result:=Result+'none'
else if (Key2=VK_UNKNOWN) then
Result:=Result+KeyAndShiftStateToStr(Key1,Shift1)
else
Result:=Result+KeyAndShiftStateToStr(Key1,Shift1)+' or '+
KeyAndShiftStateToStr(Key2,Shift2);
end;
end;
procedure TEditorOptionsForm.FillKeyMappingListBox;
var a:integer;
begin
with KeyMappingListBox.Items do begin
BeginUpdate;
Clear;
for a:=0 to EditorOpts.KeyMap.Count-1 do
Add(KeyMappingRelationToString(a));
EndUpdate;
end;
end;
procedure TEditorOptionsForm.ShowCurCodeTemplate;
var i,sp,ep:integer;
s:ansistring;
begin
CodeTemplateCodePreview.Lines.Clear;
i:=0;
while i<CodeTemplateListBox.Items.Count do begin
if CodeTemplateListBox.Selected[i] then begin
s:=SynAutoComplete.CompletionValues[i];
sp:=1;
ep:=1;
while ep<=length(s) do begin
if s[ep] in [#10,#13] then begin
CodeTemplateCodePreview.Lines.Add(copy(s,sp,ep-sp));
while (ep<=length(s)) and (s[ep] in [#10,#13]) do inc(ep);
sp:=ep;
end else inc(ep);
end;
if ep>sp then
CodeTemplateCodePreview.Lines.Add(copy(s,sp,ep-sp));
break;
end;
inc(i);
end;
CodeTemplateCodePreview.Invalidate;
end;
procedure TEditorOptionsForm.FillCodeTemplateListBox;
var a:integer;
begin
with CodeTemplateListBox do begin
Items.BeginUpdate;
Items.Clear;
for a:=0 to SynAutoComplete.Completions.Count-1 do begin
Items.Add(SynAutoComplete.Completions[a]
+' - "'+SynAutoComplete.CompletionComments[a]+'"');
end;
Items.EndUpdate;
end;
end;
procedure TEditorOptionsForm.CodeTemplateListBoxMouseUp(Sender:TObject;
Button:TMouseButton; Shift:TShiftState; X,Y:integer);
begin
ShowCurCodeTemplate;
end;
procedure TEditorOptionsForm.CodeTemplateButtonClick(Sender:TObject);
var Token,Comment:ansistring;
Index:integer;
begin
if Sender=CodeTemplateAddButton then begin
Token:='new';
Comment:='(custom)';
if AddCodeTemplate(SynAutoComplete,Token,Comment)=mrOk then begin
SynAutoComplete.AddCompletion(Token, '', Comment);
FillCodeTemplateListBox;
Index:=SynAutoComplete.Completions.IndexOf(Token);
if Index>=0 then
CodeTemplateListBox.Selected[Index]:=true;
ShowCurCodeTemplate;
end;
end else if Sender=CodeTemplateEditButton then begin
Index:=0;
while Index<CodeTemplateListBox.Items.Count do begin
if CodeTemplateListBox.Selected[Index] then break;
inc(Index);
end;
if Index<CodeTemplateListBox.Items.Count then begin
if EditCodeTemplate(SynAutoComplete,Index)=mrOk then begin
CodeTemplateListBox.Items[Index]:=
SynAutoComplete.Completions[Index]
+' - "'+SynAutoComplete.CompletionComments[Index]+'"';
ShowCurCodeTemplate;
end;
end;
end else if Sender=CodeTemplateDeleteButton then begin
// ToDo XXX
end;
end;
procedure TEditorOptionsForm.CodeTemplateFileNameButtonClick(Sender:TObject);
var OpenDialog:TOpenDialog;
begin
OpenDialog:=TOpenDialog.Create(Application);
try
with OpenDialog do begin
Filter:='DCI file (*.dci)|*.dci';
if Execute then
CodeTemplateFileNameComboBox.Text:=FileName;
end;
finally
OpenDialog.Free;
end;
end;
procedure TEditorOptionsForm.SetComboBoxText(AComboBox:TComboBox;
AText:AnsiString);
var a:integer;
begin
a:=AComboBox.Items.IndexOf(AText);
if a>=0 then
AComboBox.ItemIndex:=a
else begin
AComboBox.Items.Add(AText);
AComboBox.ItemIndex:=AComboBox.Items.IndexOf(AText);
end;
end;
procedure TEditorOptionsForm.SetupGeneralPage;
var MaxX,ChkBoxW:integer;
begin
MaxX:=Width-9;
ChkBoxW:=(MaxX-20) div 2;
EditorOptionsGroupBox:=TGroupBox.Create(Self);
with EditorOptionsGroupBox do begin
Name:='EditorOptionsGroupBox';
Parent:=MainNoteBook.Page[0];
Top:=5;
Left:=5;
Width:=MaxX-10;
Height:=24*10;
Caption:='Editor Options';
Show;
end;
// many, many checkboxes ...
AltSetsColumnModeCheckBox:=TCheckBox.Create(Self);
with AltSetsColumnModeCheckBox do begin
Name:='AltSetsColumnModeCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=5;
Left:=5;
Width:=ChkBoxW;
Height:=16;
Caption:='Alt Sets Column Mode';
Checked:=eoAltSetsColumnMode in EditorOpts.SynEditOptions;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
AutoIndentCheckBox:=TCheckBox.Create(Self);
with AutoIndentCheckBox do begin
Name:='AutoIndentCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=AltSetsColumnModeCheckBox.Top+AltSetsColumnModeCheckBox.Height+5;
Left:=AltSetsColumnModeCheckBox.Left;
Width:=ChkBoxW;
Height:=AltSetsColumnModeCheckBox.Height;
Caption:='Auto Indent';
Checked:=eoAutoIndent in EditorOpts.SynEditOptions;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
DragDropEditingCheckBox:=TCheckBox.Create(Self);
with DragDropEditingCheckBox do begin
Name:='DragDropEditingCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=AutoIndentCheckBox.Top+AutoIndentCheckBox.Height+5;
Left:=AltSetsColumnModeCheckBox.Left;
Width:=ChkBoxW;
Height:=AltSetsColumnModeCheckBox.Height;
Caption:='Drag Drop Editing';
Checked:=eoDragDropEditing in EditorOpts.SynEditOptions;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
DropFilesCheckBox:=TCheckBox.Create(Self);
with DropFilesCheckBox do begin
Name:='DropFilesCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=DragDropEditingCheckBox.Top+DragDropEditingCheckBox.Height+5;
Left:=AltSetsColumnModeCheckBox.Left;
Width:=ChkBoxW;
Height:=AltSetsColumnModeCheckBox.Height;
Caption:='Drop Files';
Checked:=eoDropFiles in EditorOpts.SynEditOptions;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
HalfPageScrollCheckBox:=TCheckBox.Create(Self);
with HalfPageScrollCheckBox do begin
Name:='HalfPageScrollCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=DropFilesCheckBox.Top+DropFilesCheckBox.Height+5;
Left:=AltSetsColumnModeCheckBox.Left;
Width:=ChkBoxW;
Height:=AltSetsColumnModeCheckBox.Height;
Caption:='Half Page Scroll';
Checked:=eoHalfPageScroll in EditorOpts.SynEditOptions;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
KeepCaretXCheckBox:=TCheckBox.Create(Self);
with KeepCaretXCheckBox do begin
Name:='KeepCaretXCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=HalfPageScrollCheckBox.Top+HalfPageScrollCheckBox.Height+5;
Left:=AltSetsColumnModeCheckBox.Left;
Width:=ChkBoxW;
Height:=AltSetsColumnModeCheckBox.Height;
Caption:='Keep Caret X';
Checked:=eoKeepCaretX in EditorOpts.SynEditOptions;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
NoCaretCheckBox:=TCheckBox.Create(Self);
with NoCaretCheckBox do begin
Name:='NoCaretCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=KeepCaretXCheckBox.Top+KeepCaretXCheckBox.Height+5;
Left:=AltSetsColumnModeCheckBox.Left;
Width:=ChkBoxW;
Height:=AltSetsColumnModeCheckBox.Height;
Caption:='No Caret';
Checked:=eoNoCaret in EditorOpts.SynEditOptions;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
NoSelectionCheckBox:=TCheckBox.Create(Self);
with NoSelectionCheckBox do begin
Name:='NoSelectionCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=NoCaretCheckBox.Top+NoCaretCheckBox.Height+5;
Left:=AltSetsColumnModeCheckBox.Left;
Width:=ChkBoxW;
Height:=AltSetsColumnModeCheckBox.Height;
Caption:='No Selection';
Checked:=eoNoSelection in EditorOpts.SynEditOptions;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
ScrollByOneLessCheckBox:=TCheckBox.Create(Self);
with ScrollByOneLessCheckBox do begin
Name:='ScrollByOneLessCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=NoSelectionCheckBox.Top+NoSelectionCheckBox.Height+5;
Left:=AltSetsColumnModeCheckBox.Left;
Width:=ChkBoxW;
Height:=AltSetsColumnModeCheckBox.Height;
Caption:='Scroll By One Less';
Checked:=eoScrollByOneLess in EditorOpts.SynEditOptions;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
ScrollPastEoFCheckBox:=TCheckBox.Create(Self);
with ScrollPastEoFCheckBox do begin
Name:='ScrollPastEoFCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=ScrollByOneLessCheckBox.Top+ScrollByOneLessCheckBox.Height+5;
Left:=AltSetsColumnModeCheckBox.Left;
Width:=ChkBoxW;
Height:=AltSetsColumnModeCheckBox.Height;
Caption:='Scroll Past End of File';
Checked:=eoScrollPastEoF in EditorOpts.SynEditOptions;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
ScrollPastEoLCheckBox:=TCheckBox.Create(Self);
with ScrollPastEoLCheckBox do begin
Name:='ScrollPastEoLCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=5;
Left:=AltSetsColumnModeCheckBox.Left+(MaxX div 2)+5;
Width:=ChkBoxW;
Height:=AltSetsColumnModeCheckBox.Height;
Caption:='Scroll Past End of Line';
Checked:=eoScrollPastEoL in EditorOpts.SynEditOptions;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
ShowScrollHintCheckBox:=TCheckBox.Create(Self);
with ShowScrollHintCheckBox do begin
Name:='ShowScrollHintCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=ScrollPastEoLCheckBox.Top+ScrollPastEoLCheckBox.Height+5;
Left:=ScrollPastEoLCheckBox.Left;
Width:=ChkBoxW;
Height:=AltSetsColumnModeCheckBox.Height;
Caption:='Show Scroll Hint';
Checked:=eoShowScrollHint in EditorOpts.SynEditOptions;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
SmartTabsCheckBox:=TCheckBox.Create(Self);
with SmartTabsCheckBox do begin
Name:='SmartTabsCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=ShowScrollHintCheckBox.Top+ShowScrollHintCheckBox.Height+5;
Left:=ShowScrollHintCheckBox.Left;
Width:=ChkBoxW;
Height:=AltSetsColumnModeCheckBox.Height;
Caption:='Smart Tabs';
Checked:=eoSmartTabs in EditorOpts.SynEditOptions;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
TabsToSpacesCheckBox:=TCheckBox.Create(Self);
with TabsToSpacesCheckBox do begin
Name:='TabsToSpacesCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=SmartTabsCheckBox.Top+SmartTabsCheckBox.Height+5;
Left:=ShowScrollHintCheckBox.Left;
Width:=ChkBoxW;
Height:=AltSetsColumnModeCheckBox.Height;
Caption:='Tabs To Spaces';
Checked:=eoTabsToSpaces in EditorOpts.SynEditOptions;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
TrimTrailingSpacesCheckBox:=TCheckBox.Create(Self);
with TrimTrailingSpacesCheckBox do begin
Name:='TrimTrailingSpacesCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=TabsToSpacesCheckBox.Top+TabsToSpacesCheckBox.Height+5;
Left:=ShowScrollHintCheckBox.Left;
Width:=ChkBoxW;
Height:=AltSetsColumnModeCheckBox.Height;
Caption:='Trim Trailing Spaces';
Checked:=eoTrimTrailingSpaces in EditorOpts.SynEditOptions;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
UndoAfterSaveCheckBox:=TCheckBox.Create(Self);
with UndoAfterSaveCheckBox do begin
Name:='UndoAfterSaveCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=TrimTrailingSpacesCheckBox.Top+TrimTrailingSpacesCheckBox.Height+5;
Left:=ShowScrollHintCheckBox.Left;
Width:=ChkBoxW;
Height:=AltSetsColumnModeCheckBox.Height;
Caption:='Undo after save';
Checked:=EditorOpts.UndoAfterSave;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
DoubleClickLineCheckBox:=TCheckBox.Create(Self);
with DoubleClickLineCheckBox do begin
Name:='DoubleClickLineCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=UndoAfterSaveCheckBox.Top+UndoAfterSaveCheckBox.Height+5;
Left:=ShowScrollHintCheckBox.Left;
Width:=ChkBoxW;
Height:=AltSetsColumnModeCheckBox.Height;
Caption:='Double click line';
Checked:=EditorOpts.DoubleClickLine;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
FindTextAtCursorCheckBox:=TCheckBox.Create(Self);
with FindTextAtCursorCheckBox do begin
Name:='FindTextAtCursorCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=DoubleClickLineCheckBox.Top+DoubleClickLineCheckBox.Height+5;
Left:=ShowScrollHintCheckBox.Left;
Width:=ChkBoxW;
Height:=AltSetsColumnModeCheckBox.Height;
Caption:='Find text at cursor';
Checked:=EditorOpts.FindTextAtCursor;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
UseSyntaxHighlightCheckBox:=TCheckBox.Create(Self);
with UseSyntaxHighlightCheckBox do begin
Name:='UseSyntaxHighlightCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=FindTextAtCursorCheckBox.Top+FindTextAtCursorCheckBox.Height+5;
Left:=ShowScrollHintCheckBox.Left;
Width:=ChkBoxW;
Height:=AltSetsColumnModeCheckBox.Height;
Caption:='Use syntax highlight';
Checked:=EditorOpts.UseSyntaxHighlight;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
CreateBackupFilesCheckBox:=TCheckBox.Create(Self);
with CreateBackupFilesCheckBox do begin
Name:='CreateBackupFilesCheckBox';
Parent:=EditorOptionsGroupBox;
Top:=UseSyntaxHighlightCheckBox.Top+UseSyntaxHighlightCheckBox.Height+5;
Left:=ShowScrollHintCheckBox.Left;
Width:=ChkBoxW;
Height:=AltSetsColumnModeCheckBox.Height;
Caption:='Create backup files';
Checked:=EditorOpts.CreateBackupFiles;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
//
BlockIndentComboBox:=TComboBox.Create(Self);
with BlockIndentComboBox do begin
Name:='BlockIndentComboBox';
Parent:=MainNoteBook.Page[0];
Top:=EditorOptionsGroupBox.Top+EditorOptionsGroupBox.Height+8;
Left:=120;
Width:=70;
Items.BeginUpdate;
Items.Add('1');
Items.Add('2');
Items.Add('4');
Items.Add('8');
Items.EndUpdate;
SetComboBoxText(BlockIndentComboBox,IntToStr(EditorOpts.BlockIndent));
OnChange:=@ComboBoxOnChange;
OnKeyDown:=@ComboBoxOnKeyDown;
OnExit:=@ComboBoxOnExit;
Show;
end;
BlockIndentLabel:=TLabel.Create(Self);
with BlockIndentLabel do begin
Name:='BlockIndentLabel';
Parent:=MainNoteBook.Page[0];
Top:=BlockIndentComboBox.Top+2;
Left:=EditorOptionsGroupBox.Left+2;
Width:=BlockIndentComboBox.Left-2-Left;
Caption:='Block indent:';
Show;
end;
UndoLimitComboBox:=TComboBox.Create(Self);
with UndoLimitComboBox do begin
Name:='UndoLimitComboBox';
Parent:=MainNoteBook.Page[0];
Top:=BlockIndentComboBox.Top+BlockIndentComboBox.Height+5;
Left:=BlockIndentComboBox.Left;
Width:=70;
Items.BeginUpdate;
Items.Add('32767');
Items.Add('4096');
Items.Add('512');
Items.EndUpdate;
SetComboBoxText(UndoLimitComboBox,IntToStr(EditorOpts.UndoLimit));
OnChange:=@ComboBoxOnChange;
OnKeyDown:=@ComboBoxOnKeyDown;
OnExit:=@ComboBoxOnExit;
Show;
end;
UndoLimitLabel:=TLabel.Create(Self);
with UndoLimitLabel do begin
Name:='UndoLimitLabel';
Parent:=MainNoteBook.Page[0];
Top:=UndoLimitComboBox.Top+2;
Left:=EditorOptionsGroupBox.Left+2;
Width:=UndoLimitComboBox.Left-Left-2;
Caption:='Undo limit:';
Show;
end;
TabWidthsComboBox:=TComboBox.Create(Self);
with TabWidthsComboBox do begin
Name:='TabWidthsComboBox';
Parent:=MainNoteBook.Page[0];
Top:=UndoLimitComboBox.Top+UndoLimitComboBox.Height+5;
Left:=BlockIndentComboBox.Left;
Width:=70;
Items.BeginUpdate;
Items.Add('1');
Items.Add('2');
Items.Add('4');
Items.Add('8');
Items.EndUpdate;
SetComboBoxText(TabWidthsComboBox,IntToStr(EditorOpts.TabWidths));
Enabled:=false;
OnChange:=@ComboBoxOnChange;
OnKeyDown:=@ComboBoxOnKeyDown;
OnExit:=@ComboBoxOnExit;
Show;
end;
TabWidthsLabel:=TLabel.Create(Self);
with TabWidthsLabel do begin
Name:='TabWidthsLabel';
Parent:=MainNoteBook.Page[0];
Top:=TabWidthsComboBox.Top+2;
Left:=EditorOptionsGroupBox.Left+2;
Width:=TabWidthsComboBox.Left-Left-2;
Caption:='Tab widths:';
Show;
end;
SyntaxExtensionsComboBox:=TComboBox.Create(Self);
with SyntaxExtensionsComboBox do begin
Name:='SyntaxExtensionsComboBox';
Parent:=MainNoteBook.Page[0];
Top:=TabWidthsComboBox.Top+TabWidthsComboBox.Height+5;
Left:=TabWidthsComboBox.Left;
Width:=200;
Items.BeginUpdate;
Items.Add('pp;pas;inc;lfm;lrs;dpr;dpm;dpk');
Items.Add('pp;pas;inc;dpr;dpm;dpk');
Items.Add('pp;pas;inc');
Items.EndUpdate;
SetComboBoxText(SyntaxExtensionsComboBox,EditorOpts.SyntaxExtensions);
OnChange:=@ComboBoxOnChange;
OnKeyDown:=@ComboBoxOnKeyDown;
OnExit:=@ComboBoxOnExit;
Show;
end;
SyntaxExtensionsLabel:=TLabel.Create(Self);
with SyntaxExtensionsLabel do begin
Name:='SyntaxExtensionsLabel';
Parent:=MainNoteBook.Page[0];
Top:=SyntaxExtensionsComboBox.Top+2;
Left:=EditorOptionsGroupBox.Left+2;
Width:=SyntaxExtensionsComboBox.Left-Left-2;
Caption:='Syntax extensions:';
Show;
end;
end;
procedure TEditorOptionsForm.SetupDisplayPage;
var MaxX,MaxY,ChkBoxW,a:integer;
begin
MaxX:=Width-9;
MaxY:=375;
ChkBoxW:=140;
MarginAndGutterGroupBox:=TGroupBox.Create(Self);
with MarginAndGutterGroupBox do begin
Name:='MarginAndGutterGroupBox';
Parent:=MainNoteBook.Page[1];
Top:=5;
Left:=5;
Width:=MaxX-10;
Height:=109;
Caption:='Margin and gutter';
Show;
end;
VisibleRightMarginCheckBox:=TCheckBox.Create(Self);
with VisibleRightMarginCheckBox do begin
Name:='VisibleRightMarginCheckBox';
Parent:=MarginAndGutterGroupBox;
Top:=5;
Left:=5;
Width:=ChkBoxW;
Caption:='Visible right margin';
Checked:=EditorOpts.VisibleRightMargin;
OnClick:=@GeneralCheckBoxOnClick;
Enabled:=false;
Show;
end;
VisibleGutterCheckBox:=TCheckBox.Create(Self);
with VisibleGutterCheckBox do begin
Name:='VisibleGutterCheckBox';
Parent:=MarginAndGutterGroupBox;
Top:=VisibleRightMarginCheckBox.Top+VisibleRightMarginCheckBox.Height+20;
Left:=VisibleRightMarginCheckBox.Left;
Width:=ChkBoxW;
Height:=VisibleRightMarginCheckBox.Height;
Caption:='Visible gutter';
Checked:=EditorOpts.VisibleGutter;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
ShowLineNumbersCheckBox:=TCheckBox.Create(Self);
with ShowLineNumbersCheckBox do begin
Name:='ShowLineNumbersCheckBox';
Parent:=MarginAndGutterGroupBox;
Top:=VisibleGutterCheckBox.Top+VisibleGutterCheckBox.Height+20;
Left:=VisibleGutterCheckBox.Left;
Width:=ChkBoxW;
Height:=VisibleRightMarginCheckBox.Height;
Caption:='Show line numbers';
Checked:=EditorOpts.ShowLineNumbers;
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
RightMarginComboBox:=TComboBox.Create(Self);
with RightMarginComboBox do begin
Name:='RightMarginComboBox';
Parent:=MarginAndGutterGroupBox;
Top:=20;
Left:=180;
Width:=70;
Items.BeginUpdate;
Items.Add('80');
Items.Add('78');
Items.Add('76');
Items.EndUpdate;
SetComboBoxText(RightMarginComboBox,IntToStr(EditorOpts.RightMargin));
OnChange:=@ComboBoxOnChange;
OnKeyDown:=@ComboBoxOnKeyDown;
OnExit:=@ComboBoxOnExit;
Show;
end;
RightMarginLabel:=TLabel.Create(Self);
with RightMarginLabel do begin
Name:='RightMarginLabel';
Parent:=MarginAndGutterGroupBox;
Top:=2;
Left:=RightMarginComboBox.Left+2;
Width:=RightMarginComboBox.Width;
Height:=16;
Caption:='Right margin';
Show;
end;
RightMarginColorButton:=TColorButton.Create(Self);
with RightMarginColorButton do begin
Name:='RightMarginColorButton';
Parent:=MarginAndGutterGroupBox;
Top:=RightMarginComboBox.Top+RightMarginComboBox.Height+20;
Left:=RightMarginComboBox.Left;
Width:=35;
Height:=20;
BorderWidth:=2;
ButtonColor:=EditorOpts.RightMarginColor;
OnColorChanged:=@ColorButtonColorChanged;
Show;
end;
RightMarginColorLabel:=TLabel.Create(Self);
with RightMarginColorLabel do begin
Name:='RightMarginColorLabel';
Parent:=MarginAndGutterGroupBox;
Top:=RightMarginComboBox.Top+RightMarginComboBox.Height;
Left:=RightMarginComboBox.Left+2;
Width:=120;
Caption:='Right margin color';
Show;
end;
GutterWidthComboBox:=TComboBox.Create(Self);
with GutterWidthComboBox do begin
Name:='GutterWidthComboBox';
Parent:=MarginAndGutterGroupBox;
Top:=RightMarginComboBox.Top;
Left:=RightMarginComboBox.Left+RightMarginComboBox.Width+80;
Width:=RightMarginComboBox.Width;
Height:=RightMarginComboBox.Height;
Items.BeginUpdate;
Items.Add('30');
Items.Add('25');
Items.Add('20');
Items.EndUpdate;
SetComboBoxText(GutterWidthComboBox,IntToStr(EditorOpts.GutterWidth));
OnChange:=@ComboBoxOnChange;
OnKeyDown:=@ComboBoxOnKeyDown;
OnExit:=@ComboBoxOnExit;
Show;
end;
GutterWidthLabel:=TLabel.Create(Self);
with GutterWidthLabel do begin
Name:='GutterWidthLabel';
Parent:=MarginAndGutterGroupBox;
Top:=2;
Left:=GutterWidthComboBox.Left+2;
Width:=GutterWidthComboBox.Width;
Height:=16;
Caption:='Gutter width';
Show;
end;
GutterColorButton:=TColorButton.Create(Self);
with GutterColorButton do begin
Name:='GutterColorButton';
Parent:=MarginAndGutterGroupBox;
Top:=GutterWidthComboBox.Top+GutterWidthComboBox.Height+20;
Left:=GutterWidthComboBox.Left;
Width:=35;
Height:=20;
BorderWidth:=2;
ButtonColor:=EditorOpts.GutterColor;
OnColorChanged:=@ColorButtonColorChanged;
Show;
end;
GutterColorLabel:=TLabel.Create(Self);
with GutterColorLabel do begin
Name:='GutterColorLabel';
Parent:=MarginAndGutterGroupBox;
Top:=GutterWidthComboBox.Top+GutterWidthComboBox.Height;
Left:=GutterWidthComboBox.Left+2;
Width:=100;
Caption:='Gutter color';
Show;
end;
EditorFontGroupBox:=TGroupBox.Create(Self);
with EditorFontGroupBox do begin
Name:='EditorFontGroupBox';
Parent:=MainNoteBook.Page[1];
Top:=MarginAndGutterGroupBox.Left+MarginAndGutterGroupBox.Height+5;
Left:=MarginAndGutterGroupBox.Left;
Width:=MarginAndGutterGroupBox.Width;
Height:=120;
Caption:='Default editor font';
Show;
end;
EditorFontComboBox:=TComboBox.Create(Self);
with EditorFontComboBox do begin
Name:='EditorFontComboBox';
Parent:=EditorFontGroupBox;
Top:=23;
Left:=5;
Width:=EditorFontGroupBox.Width-15-Height;
SetComboBoxText(EditorFontComboBox,EditorOpts.EditorFont);
OnChange:=@ComboBoxOnChange;
OnKeyDown:=@ComboBoxOnKeyDown;
OnExit:=@ComboBoxOnExit;
Show;
end;
EditorFontButton:=TButton.Create(Self);
with EditorFontButton do begin
Name:='EditorFontButton';
Parent:=EditorFontGroupBox;
Top:=EditorFontComboBox.Top+2;
Left:=EditorFontComboBox.Left+EditorFontComboBox.Width+3;
Width:=EditorFontComboBox.Height-5;
Height:=Width;
Caption:='...';
OnClick:=@EditorFontButtonClick;
Show;
end;
EditorFontLabel:=TLabel.Create(Self);
with EditorFontLabel do begin
Name:='EditorFontLabel';
Parent:=EditorFontGroupBox;
Top:=5;
Left:=EditorFontComboBox.Left+2;
Width:=EditorFontComboBox.Width;
Caption:='Editor font';
Show;
end;
EditorFontHeightComboBox:=TComboBox.Create(Self);
with EditorFontHeightComboBox do begin
Name:='EditorFontHeightComboBox';
Parent:=EditorFontGroupBox;
Top:=EditorFontComboBox.Top+EditorFontComboBox.Height+23;
Left:=EditorFontComboBox.Left;
Width:=60;
Items.BeginUpdate;
Items.Add('10');
Items.Add('11');
Items.Add('12');
Items.Add('13');
Items.Add('14');
Items.Add('15');
Items.EndUpdate;
SetComboBoxText(EditorFontHeightComboBox
,IntToStr(EditorOpts.EditorFontHeight));
OnChange:=@ComboBoxOnChange;
OnKeyDown:=@ComboBoxOnKeyDown;
OnExit:=@ComboBoxOnExit;
Show;
end;
EditorFontHeightLabel:=TLabel.Create(Self);
with EditorFontHeightLabel do begin
Name:='EditorFontHeightLabel';
Parent:=EditorFontGroupBox;
Top:=EditorFontHeightComboBox.Top-18;
Left:=EditorFontHeightComboBox.Left+2;
Width:=100;
Caption:='Editor font height';
Show;
end;
ExtraLineSpacingComboBox:=TComboBox.Create(Self);
with ExtraLineSpacingComboBox do begin
Name:='ExtraLineSpacingComboBox';
Parent:=EditorFontGroupBox;
Top:=EditorFontHeightComboBox.Top;
Left:=EditorFontHeightComboBox.Left+EditorFontHeightComboBox.Width+100;
Width:=60;
Items.BeginUpdate;
Items.Add('0');
Items.Add('1');
Items.Add('2');
Items.EndUpdate;
SetComboBoxText(ExtraLineSpacingComboBox
,IntToStr(EditorOpts.ExtraLineSpacing));
OnChange:=@ComboBoxOnChange;
OnKeyDown:=@ComboBoxOnKeyDown;
OnExit:=@ComboBoxOnExit;
Show;
end;
ExtraLineSpacingLabel:=TLabel.Create(Self);
with ExtraLineSpacingLabel do begin
Name:='ExtraLineSpacingLabel';
Parent:=EditorFontGroupBox;
Top:=ExtraLineSpacingComboBox.Top-18;
Left:=ExtraLineSpacingComboBox.Left+2;
Width:=100;
Caption:='Extra line spacing';
Show;
end;
DisplayPreview:=TPreviewEditor.Create(Self);
with DisplayPreview do begin
Name:='DisplayPreview';
Parent:=MainNoteBook.Page[1];
BorderStyle:=bsSizeable;
Top:=EditorFontGroupBox.Top+EditorFontGroupBox.Height+5;
Left:=EditorFontGroupBox.Left+2;
Width:=EditorFontGroupBox.Width-2;
Height:=MaxY-Top-2;
Lines.Clear;
Lines.Add('{ Preview }');
for a:=Low(ExampleSource) to High(ExampleSource) do
Lines.Add(ExampleSource[a]);
OnSpecialLineColors:=@Self.OnSpecialLineColors;
ReadOnly:=true;
Show;
end;
end;
procedure TEditorOptionsForm.SetupKeyMappingsPage;
var MaxX,MaxY:integer;
begin
MaxX:=Width-9;
MaxY:=374;
KeyMappingSchemeComboBox:=TComboBox.Create(Self);
with KeyMappingSchemeComboBox do begin
Name:='KeyMappingSchemeComboBox';
Parent:=MainNoteBook.Page[2];
Top:=5;
Left:=170;
Width:=100;
Height:=16;
Text:=EditorOpts.KeyMappingScheme;
Enabled:=false;
Show;
end;
KeyMappingSchemeLabel:=TLabel.Create(Self);
with KeyMappingSchemeLabel do begin
Name:='KeyMappingSchemeLabel';
Parent:=MainNoteBook.Page[2];
Top:=5;
Left:=5;
Width:=KeyMappingSchemeComboBox.Left-Left;
Height:=16;
Caption:='Key Mapping Scheme';
Show;
end;
KeyMappingConsistencyCheckButton:=TButton.Create(Self);
with KeyMappingConsistencyCheckButton do begin
Name:='KeyMappingConsistencyCheckButton';
Parent:=MainNoteBook.Page[2];
Top:=5;
Left:=Max(KeyMappingSchemeComboBox.Left+KeyMappingSchemeComboBox.Width
,MaxX-150);
Width:=130;
Height:=23;
Caption:='Check consistency';
OnClick:=@KeyMappingConsistencyCheckButtonClick;
Show;
end;
KeyMappingHelpLabel:=TLabel.Create(Self);
with KeyMappingHelpLabel do begin
Name:='KeyMappingHelpLabel';
Parent:=MainNoteBook.Page[2];
Top:=KeyMappingSchemeComboBox.Top+KeepCaretXCheckBox.Height+10;
Left:=5;
Width:=MaxX-Left-Left;
Height:=16;
Caption:='Hint: right click on the command you want to edit';
Show;
end;
KeyMappingListBox:=TListBox.Create(Self);
with KeyMappingListBox do begin
Name:='KeyMappingListBox';
Parent:=MainNoteBook.Page[2];
Top:=KeyMappingHelpLabel.Top+KeyMappingHelpLabel.Height+2;
Left:=0;
Width:=MaxX-Left-Left;
Height:=MaxY-Top;
OnMouseUp:=@KeyMappingListBoxMouseUp;
Show;
end;
end;
procedure TEditorOptionsForm.SetupColorPage;
var a,MaxX,MaxY:integer;
begin
MaxX:=Width-9;
MaxY:=375;
ColorSchemeComboBox:=TComboBox.Create(Self);
with ColorSchemeComboBox do begin
Name:='ColorSchemeComboBox';
Parent:=MainNoteBook.Page[3];
Top:=5;
Left:=100;
Width:=100;
Height:=16;
Text:=EditorOpts.ColorScheme;
Enabled:=false;
Show;
end;
ColorSchemeLabel:=TLabel.Create(Self);
with ColorSchemeLabel do begin
Name:='ColorSchemeLabel';
Parent:=MainNoteBook.Page[3];
Top:=5;
Left:=5;
Width:=ColorSchemeComboBox.Left-Left;
Height:=16;
Caption:='Color Scheme';
Show;
end;
ColorElementLabel:=TLabel.Create(Self);
with ColorElementLabel do begin
Name:='ColorElementLabel';
Parent:=MainNoteBook.Page[3];
Top:=ColorSchemeComboBox.Top+ColorSchemeComboBox.Height+12;
Left:=5;
Width:=150;
Height:=16;
Caption:='Element';
Show;
end;
ColorElementListBox:=TListBox.Create(Self);
with ColorElementListBox do begin
Name:='ColorElementListBox';
Parent:=MainNoteBook.Page[3];
Top:=ColorElementLabel.Top+ColorElementLabel.Height+2;
Left:=ColorElementLabel.Left;
Width:=ColorElementLabel.Width;
Height:=160;
MultiSelect:=false;
Items.BeginUpdate;
Items.Add(PreviewPasSyn.AsmAttri.Name);
Items.Add(PreviewPasSyn.CommentAttri.Name);
Items.Add(PreviewPasSyn.IdentifierAttri.Name);
Items.Add(PreviewPasSyn.KeyAttri.Name);
Items.Add(PreviewPasSyn.NumberAttri.Name);
Items.Add(PreviewPasSyn.SpaceAttri.Name);
Items.Add(PreviewPasSyn.StringAttri.Name);
Items.Add(PreviewPasSyn.SymbolAttri.Name);
for a:=Low(AdditionalHiglightAttributes)
to High(AdditionalHiglightAttributes) do
Items.Add(AdditionalHiglightAttributes[a]);
Items.EndUpdate;
OnMouseUp:=@ColorElementListBoxMouseUp;
Selected[0]:=true;
Show;
end;
ForeGroundGroupBox:=TGroupBox.Create(Self);
with ForeGroundGroupBox do begin
Name:='ForeGroundGroupBox';
Parent:=MainNoteBook.Page[3];
Top:=ColorSchemeComboBox.Top+ColorSchemeComboBox.Height+12;
Left:=ColorElementListBox.Left+ColorElementListBox.Width+12;
Width:=MaxX-5-Left;
Height:=60;
Caption:='Foreground color';
Show;
end;
ForeGroundColorButton:=TColorButton.Create(Self);
with ForegroundColorButton do begin
Name:='ForegroundColorButton';
Parent:=ForeGroundGroupBox;
BorderWidth:=2;
Top:=2;
Left:=5;
Width:=70;
Height:=20;
Color:=clRed;
OnColorChanged:=@ColorButtonColorChanged;
Show;
end;
ForeGroundUseDefaultCheckBox:=TCheckBox.Create(Self);
with ForeGroundUseDefaultCheckBox do begin
Name:='ForeGroundUseDefaultCheckBox';
Parent:=ForeGroundGroupBox;
Top:=ForeGroundColorButton.Top+ForeGroundColorButton.Height+2;
Left:=5;
Width:=ForeGroundGroupBox.Width-Left-Left;
Height:=16;
Caption:='Use default for foreground color';
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
BackGroundGroupBox:=TGroupBox.Create(Self);
with BackGroundGroupBox do begin
Name:='BackGroundGroupBox';
Parent:=MainNoteBook.Page[3];
Top:=ForeGroundGroupBox.Top+ForeGroundGroupBox.Height+5;
Left:=ForeGroundGroupBox.Left;
Width:=ForeGroundGroupBox.Width;
Height:=ForeGroundGroupBox.Height;
Caption:='Background color';
Show;
end;
BackGroundColorButton:=TColorButton.Create(Self);
with BackgroundColorButton do begin
Name:='BackgroundColorButton';
Parent:=BackGroundGroupBox;
BorderWidth:=2;
Top:=2;
Left:=5;
Width:=70;
Height:=20;
Color:=clBlue;
OnColorChanged:=@ColorButtonColorChanged;
Show;
end;
BackGroundUseDefaultCheckBox:=TCheckBox.Create(Self);
with BackGroundUseDefaultCheckBox do begin
Name:='BackGroundUseDefaultCheckBox';
Parent:=BackGroundGroupBox;
Top:=BackGroundColorButton.Top+BackGroundColorButton.Height+2;
Left:=5;
Width:=ForeGroundGroupBox.Width-Left-Left;
Height:=16;
Caption:='Use default for background color';
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
TextAttributesGroupBox:=TGroupBox.Create(Self);
with TextAttributesGroupBox do begin
Name:='TextAttributesGroupBox';
Parent:=MainNoteBook.Page[3];
Top:=BackGroundGroupBox.Top+BackGroundGroupBox.Height+5;
Left:=ForeGroundGroupBox.Left;
Width:=ForeGroundGroupBox.Width;
Height:=48;
Caption:='Text attributes';
Show;
end;
TextBoldCheckBox:=TCheckBox.Create(Self);
with TextBoldCheckBox do begin
Name:='TextBoldCheckBox';
Parent:=TextAttributesGroupBox;
Top:=5;
Left:=5;
Width:=50;
Height:=16;
Caption:='Bold';
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
TextItalicCheckBox:=TCheckBox.Create(Self);
with TextItalicCheckBox do begin
Name:='TextItalicCheckBox';
Parent:=TextAttributesGroupBox;
Top:=TextBoldCheckBox.Top;
Left:=TextBoldCheckBox.Left+TextBoldCheckBox.Width+5;
Width:=50;
Height:=TextBoldCheckBox.Height;
Caption:='Italic';
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
TextUnderlineCheckBox:=TCheckBox.Create(Self);
with TextUnderlineCheckBox do begin
Name:='TextUnderlineCheckBox';
Parent:=TextAttributesGroupBox;
Top:=TextBoldCheckBox.Top;
Left:=TextItalicCheckBox.Left+TextItalicCheckBox.Width+5;
Width:=75;
Height:=TextItalicCheckBox.Height;
Caption:='Underline';
OnClick:=@GeneralCheckBoxOnClick;
Show;
end;
ColorPreview:=TPreviewEditor.Create(Self);
with ColorPreview do begin
Name:='ColorPreview';
Parent:=MainNoteBook.Page[3];
Left:=5;
Top:=TextAttributesGroupBox.Top+TextAttributesGroupBox.Height+7;
Width:=MaxX-Left-Left;
Height:=MaxY-Top-Left;
Lines.Clear;
Lines.Add('{ Syntax Highlighting }');
for a:=Low(ExampleSource) to High(ExampleSource) do
Lines.Add(ExampleSource[a]);
OnSpecialLineColors:=@Self.OnSpecialLineColors;
OnMouseDown:=@ColorPreviewMouseUp;
ReadOnly:=true;
Show;
end;
end;
procedure TEditorOptionsForm.SetupCodeToolsPage;
var MaxX:integer;
begin
MaxX:=Width-9;
AutomaticFeaturesGroupBox:=TGroupBox.Create(Self);
with AutomaticFeaturesGroupBox do begin
Name:='AutomaticFeaturesGroupBox';
Parent:=MainNoteBook.Page[4];
Top:=5;
Left:=5;
Width:=MaxX-Left-Left;
Height:=110;
Caption:='Automatic features';
Show;
end;
AutoCodeCompletionCheckBox:=TCheckBox.Create(Self);
with AutoCodeCompletionCheckBox do begin
Name:='AutoCodeCompletionCheckBox';
Parent:=AutomaticFeaturesGroupBox;
Top:=5;
Left:=5;
Width:=200;
Caption:='Code completion';
Checked:=EditorOpts.AutoCodeCompletion;
Show;
end;
AutoCodeParametersCheckBox:=TCheckBox.Create(Self);
with AutoCodeParametersCheckBox do begin
Name:='AutoCodeParametersCheckBox';
Parent:=AutomaticFeaturesGroupBox;
Top:=AutoCodeCompletionCheckBox.Top+AutoCodeCompletionCheckBox.Height+20;
Left:=AutoCodeCompletionCheckBox.Left;
Width:=AutoCodeCompletionCheckBox.Width;
Height:=AutoCodeCompletionCheckBox.Height;
Caption:='Code parameters';
Checked:=EditorOpts.AutoCodeParameters;
Show;
end;
AutoToolTipExprEvalCheckBox:=TCheckBox.Create(Self);
with AutoToolTipExprEvalCheckBox do begin
Name:='AutoToolTipExprEvalCheckBox';
Parent:=AutomaticFeaturesGroupBox;
Top:=AutoCodeParametersCheckBox.Top+AutoCodeParametersCheckBox.Height+20;
Left:=AutoCodeCompletionCheckBox.Left;
Width:=AutoCodeCompletionCheckBox.Width;
Height:=AutoCodeCompletionCheckBox.Height;
Caption:='Tooltip expression evaluation';
Checked:=EditorOpts.AutoToolTipExprEval;
Show;
end;
AutoToolTipSymbToolsCheckBox:=TCheckBox.Create(Self);
with AutoToolTipSymbToolsCheckBox do begin
Name:='AutoToolTipSymbToolsCheckBox';
Parent:=AutomaticFeaturesGroupBox;
Top:=AutoToolTipExprEvalCheckBox.Top+AutoToolTipExprEvalCheckBox.Height+20;
Left:=AutoCodeCompletionCheckBox.Left;
Width:=AutoCodeCompletionCheckBox.Width;
Height:=AutoCodeCompletionCheckBox.Height;
Caption:='Tooltip symbol Tools';
Checked:=EditorOpts.AutoToolTipSymbTools;
Show;
end;
AutoDelayLabel:=TLabel.Create(Self);
with AutoDelayLabel do begin
Name:='AutoDelayLabel';
Parent:=AutomaticFeaturesGroupBox;
Top:=10;
Left:=AutoCodeCompletionCheckBox.Left+AutoCodeCompletionCheckBox.Width+17;
Width:=70;
Caption:='Delay';
Show;
end;
AutoDelayTrackBar:=TTrackBar.Create(Self);
with AutoDelayTrackBar do begin
Name:='AutoDelayTrackBar';
Parent:=AutomaticFeaturesGroupBox;
Top:=32;
Left:=AutoCodeCompletionCheckBox.Left+AutoCodeCompletionCheckBox.Width+15;
Width:=150;
Min:=2;
Max:=6;
Height:=10;
Position:=EditorOpts.AutoDelayInMSec div 250;
TickMarks:=tmBottomRight;
Show;
end;
AutoDelayMinLabel:=TLabel.Create(Self);
with AutoDelayMinLabel do begin
Name:='AutoDelayMinLabel';
Parent:=AutomaticFeaturesGroupBox;
Top:=AutoDelayTrackBar.Top+AutoDelayTrackBar.Height+5;
Left:=AutoCodeCompletionCheckBox.Left+AutoCodeCompletionCheckBox.Width+15;
Width:=70;
Caption:='0.5 sec';
Show;
end;
AutoDelayMaxLabel:=TLabel.Create(Self);
with AutoDelayMaxLabel do begin
Name:='AutoDelayMaxLabel';
Parent:=AutomaticFeaturesGroupBox;
Top:=AutoDelayMinLabel.Top;
Left:=AutoDelayTrackBar.Left+AutoDelayTrackBar.Width-30;
Width:=70;
Caption:='1.5 sec';
Show;
end;
CodeTemplatesGroupBox:=TGroupBox.Create(Self);
with CodeTemplatesGroupBox do begin
Name:='CodeTemplatesGroupBox';
Parent:=MainNoteBook.Page[4];
Top:=AutomaticFeaturesGroupBox.Top+AutomaticFeaturesGroupBox.Height+5;
Left:=AutomaticFeaturesGroupBox.Left;
Width:=AutomaticFeaturesGroupBox.Width;
Height:=250;
Caption:='Code templates';
Show;
end;
CodeTemplateFileNameLabel:=TLabel.Create(Self);
with CodeTemplateFileNameLabel do begin
Name:='CodeTemplateFileNameLabel';
Parent:=CodeTemplatesGroupBox;
Top:=5;
Left:=7;
Width:=110;
Caption:='Template file name';
Show;
end;
CodeTemplateFileNameComboBox:=TComboBox.Create(Self);
with CodeTemplateFileNameComboBox do begin
Name:='CodeTemplateFileNameComboBox';
Parent:=CodeTemplatesGroupBox;
Top:=3;
Left:=CodeTemplateFileNameLabel.Left+CodeTemplateFileNameLabel.Width+2;
Width:=CodeTemplatesGroupBox.Width-12-Left-Height;
Text:=EditorOpts.CodeTemplateFileName;
OnChange:=@ComboBoxOnChange;
OnKeyDown:=@ComboBoxOnKeyDown;
OnExit:=@ComboBoxOnExit;
Show;
end;
CodeTemplateFileNameButton:=TButton.Create(Self);
with CodeTemplateFileNameButton do begin
Name:='CodeTemplateFileNameButton';
Parent:=CodeTemplatesGroupBox;
Top:=CodeTemplateFileNameComboBox.Top+2;
Width:=CodeTemplateFileNameComboBox.Height-5;
Left:=CodeTemplatesGroupBox.Width-9-Width;
Height:=Width;
Caption:='...';
OnClick:=@CodeTemplateFileNameButtonClick;
Show;
end;
CodeTemplatesLabel:=TLabel.Create(Self);
with CodeTemplatesLabel do begin
Name:='CodeTemplatesLabel';
Parent:=CodeTemplatesGroupBox;
Top:=CodeTemplateFileNameLabel.Top+CodeTemplateFileNameLabel.Height+12;
Left:=CodeTemplateFileNameLabel.Left;
Width:=60;
Caption:='Templates';
Show;
end;
CodeTemplateAddButton:=TButton.Create(Self);
with CodeTemplateAddButton do begin
Name:='CodeTemplateAddButton';
Parent:=CodeTemplatesGroupBox;
Top:=CodeTemplateFileNameComboBox.Top+CodeTemplateFileNameComboBox.Height+10;
Width:=50;
Left:=CodeTemplatesGroupBox.Width-Width-9;
Height:=23;
Caption:='Add...';
OnClick:=@CodeTemplateButtonClick;
Show;
end;
CodeTemplateEditButton:=TButton.Create(Self);
with CodeTemplateEditButton do begin
Name:='CodeTemplateEditButton';
Parent:=CodeTemplatesGroupBox;
Top:=CodeTemplateAddButton.Top+CodeTemplateAddButton.Height+5;
Left:=CodeTemplateAddButton.Left;
Width:=CodeTemplateAddButton.Width;
Height:=CodeTemplateAddButton.Height;
Caption:='Edit...';
OnClick:=@CodeTemplateButtonClick;
Show;
end;
CodeTemplateDeleteButton:=TButton.Create(Self);
with CodeTemplateDeleteButton do begin
Name:='CodeTemplateDeleteButton';
Parent:=CodeTemplatesGroupBox;
Top:=CodeTemplateEditButton.Top+CodeTemplateEditButton.Height+5;
Left:=CodeTemplateAddButton.Left;
Width:=CodeTemplateAddButton.Width;
Height:=CodeTemplateAddButton.Height;
Caption:='Delete';
OnClick:=@CodeTemplateButtonClick;
Show;
end;
CodeTemplateListBox:=TListBox.Create(Self);
with CodeTemplateListBox do begin
Name:='CodeTemplateListBox';
Parent:=CodeTemplatesGroupBox;
Top:=CodeTemplatesLabel.Top;
Left:=CodeTemplatesLabel.Left+CodeTemplatesLabel.Width+5;
Width:=CodeTemplateEditButton.Left-5-Left;
Height:=80;
OnMouseUp:=@CodeTemplateListBoxMouseUp;
Show;
end;
CodeTemplateCodeLabel:=TLabel.Create(Self);
with CodeTemplateCodeLabel do begin
Name:='CodeTemplateCodeLabel';
Parent:=CodeTemplatesGroupBox;
Top:=CodeTemplateListBox.Top+CodeTemplateListBox.Height+5;
Left:=CodeTemplatesLabel.Left;
Width:=CodeTemplatesLabel.Width;
Height:=CodeTemplatesLabel.Height;
Caption:='Code';
Show;
end;
CodeTemplateCodePreview:=TPreviewEditor.Create(Self);
with CodeTemplateCodePreview do begin
Name:='CodeTemplateCodePreview';
Parent:=CodeTemplatesGroupBox;
Top:=CodeTemplateCodeLabel.Top;
Left:=CodeTemplateCodeLabel.Left+CodeTemplateCodeLabel.Width+5;
Width:=CodeTemplateEditButton.Left-5-Left;
Height:=CodeTemplatesGroupBox.ClientHeight-20-Top;
Lines.Clear;
Gutter.Visible:=false;
Show;
end;
end;
procedure TEditorOptionsForm.SetupButtonBar;
begin
CancelButton:=TButton.Create(Self);
with CancelButton do begin
Name:='CancelButton';
Parent:=Self;
Width:=70;
Height:=23;
Top:=Self.height-Height-15;
Left:=Self.Width-Width-10;
Caption:='Cancel';
OnClick:=@CancelButtonClick;
Show;
end;
OkButton:=TButton.Create(Self);
with OkButton do begin
Name:='OkButton';
Parent:=Self;
Width:=70;
Height:=23;
Top:=Self.height-Height-15;
Left:=CancelButton.Left-10-Width;
Caption:='Ok';
OnClick:=@OkButtonClick;
Show;
end;
end;
procedure TEditorOptionsForm.OkButtonClick(Sender:TObject);
var AText,ACaption:AnsiString;
begin
// save all values
EditorOpts.SetHighlighterSettings(PreviewPasSyn);
EditorOpts.SetSynEditSettings(PreviewEdits[1]);
// general
EditorOpts.UndoAfterSave:=UndoAfterSaveCheckBox.Checked;
EditorOpts.DoubleClickLine:=DoubleClickLineCheckBox.Checked;
EditorOpts.FindTextAtCursor:=FindTextAtCursorCheckBox.Checked;
EditorOpts.UseSyntaxHighlight:=UseSyntaxHighlightCheckBox.Checked;
EditorOpts.CreateBackupFiles:=CreateBackupFilesCheckBox.Checked;
EditorOpts.SyntaxExtensions:=SyntaxExtensionsComboBox.Text;
// code Tools
EditorOpts.AutoCodeCompletion:=AutoCodeCompletionCheckBox.Checked;
EditorOpts.AutoCodeParameters:=AutoCodeParametersCheckBox.Checked;
EditorOpts.AutoToolTipSymbTools:=AutoToolTipSymbToolsCheckBox.Checked;
EditorOpts.AutoToolTipExprEval:=AutoToolTipExprEvalCheckBox.Checked;
EditorOpts.AutoDelayInMSec:=AutoDelayTrackBar.Position*250;
EditorOpts.CodeTemplateFileName:=CodeTemplateFileNameComboBox.Text;
EditorOpts.Save;
try
SynAutoComplete.AutoCompleteList.SaveToFile(
EditorOpts.CodeTemplateFileName);
except
ACaption:='Error';
AText:=' Unable to write code templates to file '''
+EditorOpts.CodeTemplateFileName+'''! ';
Application.MessageBox(PChar(AText),PChar(ACaption),0);
end;
ModalResult:=mrOk;
end;
procedure TEditorOptionsForm.CancelButtonClick(Sender:TObject);
begin
EditorOpts.Load;
ModalResult:=mrCancel;
end;
initialization
EditorOpts:=TEditorOptions.Create;
finalization
EditorOpts.Free; EditorOpts:=nil;
end.