From 091df3edb7ea6416d172105c94ab204ee77ab68a Mon Sep 17 00:00:00 2001 From: juha Date: Wed, 6 Jan 2021 11:18:40 +0000 Subject: [PATCH] IDE: Refactor EditorOptions. Class TEditorOptionsDefaults holds only published properties needed for RttiXmlConfig. No useless duplication. git-svn-id: trunk@64340 - --- ide/editoroptions.pp | 2326 ++++++++++++++++++++---------------------- ide/main.pp | 4 +- 2 files changed, 1132 insertions(+), 1198 deletions(-) diff --git a/ide/editoroptions.pp b/ide/editoroptions.pp index eaa3426096..d27648c50d 100644 --- a/ide/editoroptions.pp +++ b/ide/editoroptions.pp @@ -1412,106 +1412,34 @@ type TEditorOptionsBase = class(TIDEEditorOptions) private - FBlockTabIndent: Integer; - FCompletionLongLineHintInMSec: Integer; - FCompletionLongLineHintType: TSynCompletionLongHintType; - FMiddleTabClickClosesOthersModifier: TShiftState; - FMiddleTabClickClosesToRightModifier: TShiftState; - FMultiCaretDefaultColumnSelectMode: TSynPluginMultiCaretDefaultMode; - FMultiCaretDefaultMode: TSynPluginMultiCaretDefaultMode; - FMultiCaretDeleteSkipLineBreak: Boolean; - FPasExtendedKeywordsMode: Boolean; - FHideSingleTabInWindow: Boolean; - FPasStringKeywordMode: TSynPasStringMode; - FScrollOnEditLeftOptions: TSynScrollOnEditLeftOptions; - FScrollOnEditRightOptions: TSynScrollOnEditRightOptions; - FTopInfoView: boolean; {$IFDEF WinIME} FUseMinimumIme: Boolean; {$ENDIF} - XMLConfig: TRttiXMLConfig; - - // general options - fFindTextAtCursor: Boolean; - fShowTabCloseButtons: Boolean; - FMultiLineTab: Boolean; - fShowTabNumbers: Boolean; - fUseTabHistory: Boolean; + // General options + fMultiLineTab: Boolean; fTabPosition: TTabPosition; - fSynEditOptions: TSynEditorOptions; - fSynEditOptions2: TSynEditorOptions2; - fUndoAfterSave: Boolean; - fUseSyntaxHighlight: Boolean; - FCopyWordAtCursorOnCopyNone: Boolean; - FShowGutterHints: Boolean; - fBlockIndent: Integer; - fBlockIndentType: TSynBeautifierIndentType; - FTrimSpaceType: TSynEditStringTrimmingType; - fUndoLimit: Integer; - fTabWidth: Integer; - FBracketHighlightStyle: TSynEditBracketHighlightStyle; - FMultiCaretOnColumnSelect: Boolean; - // Display options - fVisibleRightMargin: Boolean; - fVisibleGutter: Boolean; - fShowLineNumbers: Boolean; - fShowOnlyLineNumbersMultiplesOf: integer; - FShowOverviewGutter: boolean; - fGutterWidth: Integer; - FGutterSeparatorIndex: Integer; - fRightMargin: Integer; - fEditorFont: String; - fEditorFontSize: Integer; - fExtraCharSpacing: Integer; - fExtraLineSpacing: Integer; - fDisableAntialiasing: Boolean; - FDoNotWarnForFont: string; - - // Key Mappings options - fKeyMappingScheme: String; - fKeyMap: TKeyCommandRelationList; - - // Mouse Mappings options - FUserMouseSettings: TEditorMouseOptions; - FTempMouseSettings: TEditorMouseOptions; - - // Color options - fHighlighterList: TEditOptLangList; - FUserColorSchemeGroup: TColorSchemeFactory; - FUserDefinedColors: TEditorUserDefinedWordsList; - - // Markup Current Word - FMarkupCurWordTime: Integer; - FMarkupCurWordFullLen: Integer; - FMarkupCurWordNoKeyword: Boolean; - FMarkupCurWordTrim: Boolean; - FMarkupCurWordNoTimer: Boolean; - - // Code tools options (MG: these will move to an unit of their own) - fAutoBlockCompletion: Boolean; - fAutoCodeParameters: Boolean; - fAutoDelayInMSec: Integer; - fAutoHintDelayInMSec: Integer; - FAutoRemoveEmptyMethods: Boolean; - fAutoToolTipExprEval: Boolean; - fAutoToolTipSymbTools: Boolean; - FDbgHintAutoTypeCastClass: Boolean; - fCodeTemplateFileNameRaw: String; - fCTemplIndentToTokenStart: Boolean; - fAutoDisplayFuncPrototypes: Boolean; - + fShowOverviewGutter: boolean; + fTopInfoView: boolean; + // Code tools options + fDbgHintAutoTypeCastClass: Boolean; + fCompletionLongLineHintType: TSynCompletionLongHintType; // Code Folding - FUseCodeFolding: Boolean; - FUseMarkupWordBracket: Boolean; - FUseMarkupOutline: Boolean; - FReverseFoldPopUpOrder: Boolean; + fReverseFoldPopUpOrder: Boolean; + fUseTabHistory: Boolean; + fMultiCaretOnColumnSelect: Boolean; + fMultiCaretDefaultMode: TSynPluginMultiCaretDefaultMode; + fMultiCaretDeleteSkipLineBreak: Boolean; + fMultiCaretDefaultColumnSelectMode: TSynPluginMultiCaretDefaultMode; + // Highlighter Pas + fPasExtendedKeywordsMode: Boolean; + fPasStringKeywordMode: TSynPasStringMode; // Multi window - FMultiWinEditAccessOrder: TEditorOptionsEditAccessOrderList; - FCtrlMiddleTabClickClosesOthers: Boolean; - FShowFileNameInCaption: Boolean; - + fCtrlMiddleTabClickClosesOthers: Boolean; + fMiddleTabClickClosesOthersModifier: TShiftState; + fMiddleTabClickClosesToRightModifier: TShiftState; + fShowFileNameInCaption: Boolean; // Comment Continue FAnsiCommentContinueEnabled: Boolean; FAnsiCommentMatch: String; @@ -1519,14 +1447,12 @@ type FAnsiCommentPrefix: String; FAnsiIndentMode: TSynCommentIndentFlags; FAnsiIndentAlignMax: integer; - FCurlyCommentContinueEnabled: Boolean; FCurlyCommentMatch: String; FCurlyCommentMatchMode: TSynCommentMatchMode; FCurlyCommentPrefix: String; FCurlyIndentMode: TSynCommentIndentFlags; FCurlyIndentAlignMax: integer; - FSlashCommentContinueEnabled: Boolean; FSlashCommentMatch: String; FSlashCommentMatchMode: TSynCommentMatchMode; @@ -1534,256 +1460,84 @@ type FSlashIndentMode: TSynCommentIndentFlags; FSlashCommentExtend: TSynCommentExtendMode; FSlashIndentAlignMax: integer; - FStringBreakAppend: String; FStringBreakEnabled: Boolean; FStringBreakPrefix: String; - - function GetCodeTemplateFileNameExpand:String; + // Scroll + FScrollOnEditLeftOptions: TSynScrollOnEditLeftOptions; + FScrollOnEditRightOptions: TSynScrollOnEditRightOptions; + procedure InitForRttiXmlConf; protected function GetTabPosition: TTabPosition; override; - procedure GetUserColorSchemeGroupData; virtual; abstract; public + constructor Create; destructor Destroy; override; - procedure Init; - function LoadCodeTemplates(AnAutoComplete: TSynEditAutoComplete): TModalResult; - function SaveCodeTemplates(AnAutoComplete: TSynEditAutoComplete): TModalResult; - procedure TranslateResourceStrings; - - procedure AssignKeyMapTo(ASynEdit: TSynEdit; SimilarEdit: TSynEdit = nil); // Or copy fromSimilarEdit - procedure GetHighlighterSettings(Syn: TSrcIDEHighlighter); // read highlight settings from config file - procedure GetSynEditSettings(ASynEdit: TSynEdit; SimilarEdit: TSynEdit = nil); // read synedit settings from config file - procedure GetSynEditPreviewSettings(APreviewEditor: TObject); - procedure ApplyFontSettingsTo(ASynEdit: TSynEdit); - - function ExtensionToLazSyntaxHighlighter(Ext: String): TLazSyntaxHighlighter; override; - function CreateSyn(LazSynHilighter: TLazSyntaxHighlighter): TSrcIDEHighlighter; - function ReadColorScheme(const LanguageName: String): String; // TODO: rename ReadColorSchemeName - function GetColorSchemeLanguage(aHighLighter: TSynCustomHighlighter; SynColorSchemeName: String = ''): TColorSchemeLanguage; - function ReadPascalColorScheme: String; - procedure WriteColorScheme(const LanguageName, SynColorScheme: String); - procedure ReadHighlighterSettings(Syn: TSrcIDEHighlighter; SynColorScheme: String); - - procedure ReadHighlighterFoldSettings(Syn: TSrcIDEHighlighter; ReadForOptions: Boolean = False); - procedure ReadDefaultsForHighlighterFoldSettings(Syn: TSrcIDEHighlighter); - procedure WriteHighlighterFoldSettings(Syn: TSrcIDEHighlighter); - - procedure ReadHighlighterDivDrawSettings(Syn: TSrcIDEHighlighter); - procedure ReadDefaultsForHighlighterDivDrawSettings(Syn: TSrcIDEHighlighter); - procedure WriteHighlighterDivDrawSettings(Syn: TSrcIDEHighlighter); - - procedure SetMarkupColor(Syn: TSrcIDEHighlighter; - AddHilightAttr: TAdditionalHilightAttribute; - aMarkup: TSynSelectedColor); - procedure SetMarkupColors(aSynEd: TSynEdit); - public - // general options - property SynEditOptions: TSynEditorOptions - read fSynEditOptions write fSynEditOptions default SynEditDefaultOptions; - property SynEditOptions2: TSynEditorOptions2 - read fSynEditOptions2 write fSynEditOptions2 default SynEditDefaultOptions2; - property ShowTabCloseButtons: Boolean - read fShowTabCloseButtons write fShowTabCloseButtons; - published - property MultiLineTab: Boolean - read FMultiLineTab write FMultiLineTab default False; - public - property HideSingleTabInWindow: Boolean - read FHideSingleTabInWindow write FHideSingleTabInWindow; - property ShowTabNumbers: Boolean read fShowTabNumbers write fShowTabNumbers; - property UndoAfterSave: Boolean read fUndoAfterSave - write fUndoAfterSave default True; - property FindTextAtCursor: Boolean - read fFindTextAtCursor write fFindTextAtCursor default True; - property UseSyntaxHighlight: Boolean - read fUseSyntaxHighlight write fUseSyntaxHighlight default True; - property CopyWordAtCursorOnCopyNone: Boolean - read FCopyWordAtCursorOnCopyNone write FCopyWordAtCursorOnCopyNone; - property ShowGutterHints: Boolean read FShowGutterHints - write FShowGutterHints; - property BlockIndent: Integer - read fBlockIndent write fBlockIndent default 2; - property BlockTabIndent: Integer - read FBlockTabIndent write FBlockTabIndent default 0; - property BlockIndentType: TSynBeautifierIndentType - read fBlockIndentType write fBlockIndentType default sbitCopySpaceTab; - property TrimSpaceType: TSynEditStringTrimmingType - read FTrimSpaceType write FTrimSpaceType default settLeaveLine; - property UndoLimit: Integer read fUndoLimit write fUndoLimit default 32767; - property TabWidth: Integer read fTabWidth write fTabWidth default 8; - property BracketHighlightStyle: TSynEditBracketHighlightStyle read FBracketHighlightStyle write FBracketHighlightStyle default sbhsBoth; - - // 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 ShowOnlyLineNumbersMultiplesOf: integer read fShowOnlyLineNumbersMultiplesOf - write fShowOnlyLineNumbersMultiplesOf; - property GutterWidth: Integer - read fGutterWidth write fGutterWidth default 30; - property GutterSeparatorIndex: Integer read FGutterSeparatorIndex - write FGutterSeparatorIndex default 3; - property RightMargin: Integer - read fRightMargin write fRightMargin default 80; - property EditorFont: String read fEditorFont write fEditorFont; - property EditorFontSize: Integer - read fEditorFontSize write fEditorFontSize; - property ExtraCharSpacing: Integer - read fExtraCharSpacing write fExtraCharSpacing default 0; - property ExtraLineSpacing: Integer - read fExtraLineSpacing write fExtraLineSpacing default 1; - property DisableAntialiasing: Boolean - read fDisableAntialiasing write fDisableAntialiasing default DefaultEditorDisableAntiAliasing; - property DoNotWarnForFont: string - read FDoNotWarnForFont write FDoNotWarnForFont; - - // Key Mappings - property KeyMappingScheme: String - read fKeyMappingScheme write fKeyMappingScheme; - property KeyMap: TKeyCommandRelationList read fKeyMap; - - // Mouse Mappings - // Current saved config - property UserMouseSettings: TEditorMouseOptions read FUserMouseSettings; - // Used by the 2 Mouse-option pages, so they share data (un-saved) - property TempMouseSettings: TEditorMouseOptions read FTempMouseSettings; - - // Color options - property HighlighterList: TEditOptLangList read fHighlighterList; - property UserColorSchemeGroup: TColorSchemeFactory read FUserColorSchemeGroup; - property UserDefinedColors: TEditorUserDefinedWordsList read FUserDefinedColors; - - // Markup Current Word - property MarkupCurWordTime: Integer - read FMarkupCurWordTime write FMarkupCurWordTime default 1500; - property MarkupCurWordFullLen: Integer - read FMarkupCurWordFullLen write FMarkupCurWordFullLen default 3; - property MarkupCurWordNoKeyword: Boolean - read FMarkupCurWordNoKeyword write FMarkupCurWordNoKeyword default False; - property MarkupCurWordTrim: Boolean - read FMarkupCurWordTrim write FMarkupCurWordTrim default True; - property MarkupCurWordNoTimer: Boolean - read FMarkupCurWordNoTimer write FMarkupCurWordNoTimer default False; - - // Code Tools options - property AutoBlockCompletion: Boolean - read fAutoBlockCompletion write FAutoBlockCompletion default True; - property AutoCodeParameters: Boolean - read fAutoCodeParameters write fAutoCodeParameters default True; - property AutoToolTipExprEval: Boolean - read fAutoToolTipExprEval write fAutoToolTipExprEval default True; // debugger hints - property AutoToolTipSymbTools: Boolean - read fAutoToolTipSymbTools write fAutoToolTipSymbTools default True; // declaration hints - property AutoDisplayFunctionPrototypes: Boolean - read fAutoDisplayFuncPrototypes write fAutoDisplayFuncPrototypes default True; - - published - property DbgHintAutoTypeCastClass: Boolean - read FDbgHintAutoTypeCastClass write FDbgHintAutoTypeCastClass default True; // declaration hints - public - property AutoDelayInMSec: Integer read fAutoDelayInMSec - write fAutoDelayInMSec default 1000; - property AutoHintDelayInMSec: Integer read fAutoHintDelayInMSec - write fAutoHintDelayInMSec default 1000; - property CodeTemplateFileNameRaw: String - read fCodeTemplateFileNameRaw write fCodeTemplateFileNameRaw; - property CodeTemplateFileNameExpand:String - read GetCodeTemplateFileNameExpand; - property CodeTemplateIndentToTokenStart: Boolean - read fCTemplIndentToTokenStart write fCTemplIndentToTokenStart; - property AutoRemoveEmptyMethods: Boolean read FAutoRemoveEmptyMethods - write FAutoRemoveEmptyMethods default False; - property CompletionLongLineHintInMSec: Integer - read FCompletionLongLineHintInMSec write FCompletionLongLineHintInMSec; - published - property CompletionLongLineHintType: TSynCompletionLongHintType - read FCompletionLongLineHintType write FCompletionLongLineHintType - default sclpExtendRightOnly; - public - // Code Folding - property UseCodeFolding: Boolean - read FUseCodeFolding write FUseCodeFolding default True; - property UseMarkupWordBracket: Boolean - read FUseMarkupWordBracket write FUseMarkupWordBracket default True; - property UseMarkupOutline: Boolean - read FUseMarkupOutline write FUseMarkupOutline default False; - - // Multi window - property MultiWinEditAccessOrder: TEditorOptionsEditAccessOrderList - read FMultiWinEditAccessOrder write FMultiWinEditAccessOrder; - published { use RTTIConf} - property TabPosition: TTabPosition - read fTabPosition write fTabPosition default tpTop; + // general options + property MultiLineTab: Boolean read fMultiLineTab write fMultiLineTab default False; + property TabPosition: TTabPosition read fTabPosition write fTabPosition default tpTop; + // Code Tools options + property DbgHintAutoTypeCastClass: Boolean // declaration hints + read fDbgHintAutoTypeCastClass write fDbgHintAutoTypeCastClass default True; + property CompletionLongLineHintType: TSynCompletionLongHintType + read fCompletionLongLineHintType write fCompletionLongLineHintType + default sclpExtendRightOnly; // General - Misc {$IFDEF WinIME} property UseMinimumIme: Boolean read FUseMinimumIme write FUseMinimumIme default False; {$ENDIF} // Display property ShowOverviewGutter: boolean - read FShowOverviewGutter write FShowOverviewGutter default True; - property TopInfoView: boolean - read FTopInfoView write FTopInfoView default True; + read fShowOverviewGutter write fShowOverviewGutter default True; + property TopInfoView: boolean read fTopInfoView write fTopInfoView default True; // Code Folding property ReverseFoldPopUpOrder: Boolean - read FReverseFoldPopUpOrder write FReverseFoldPopUpOrder default True; + read fReverseFoldPopUpOrder write fReverseFoldPopUpOrder default True; property UseTabHistory: Boolean read fUseTabHistory write fUseTabHistory; - property MultiCaretOnColumnSelect: Boolean - read FMultiCaretOnColumnSelect write FMultiCaretOnColumnSelect default True; - property MultiCaretDefaultMode: TSynPluginMultiCaretDefaultMode - read FMultiCaretDefaultMode write FMultiCaretDefaultMode default mcmMoveAllCarets; - property MultiCaretDeleteSkipLineBreak: Boolean - read FMultiCaretDeleteSkipLineBreak write FMultiCaretDeleteSkipLineBreak default False; - property MultiCaretDefaultColumnSelectMode: TSynPluginMultiCaretDefaultMode - read FMultiCaretDefaultColumnSelectMode write FMultiCaretDefaultColumnSelectMode default mcmCancelOnCaretMove; + property MultiCaretOnColumnSelect: Boolean + read fMultiCaretOnColumnSelect write fMultiCaretOnColumnSelect default True; + property MultiCaretDefaultMode: TSynPluginMultiCaretDefaultMode + read fMultiCaretDefaultMode write fMultiCaretDefaultMode default mcmMoveAllCarets; + property MultiCaretDeleteSkipLineBreak: Boolean + read fMultiCaretDeleteSkipLineBreak write fMultiCaretDeleteSkipLineBreak default False; + property MultiCaretDefaultColumnSelectMode: TSynPluginMultiCaretDefaultMode + read fMultiCaretDefaultColumnSelectMode write fMultiCaretDefaultColumnSelectMode default mcmCancelOnCaretMove; // Highlighter Pas property PasExtendedKeywordsMode: Boolean - read FPasExtendedKeywordsMode write FPasExtendedKeywordsMode default False; + read fPasExtendedKeywordsMode write fPasExtendedKeywordsMode default False; property PasStringKeywordMode: TSynPasStringMode - read FPasStringKeywordMode write FPasStringKeywordMode default spsmDefault; - + read fPasStringKeywordMode write fPasStringKeywordMode default spsmDefault; // Multi window property CtrlMiddleTabClickClosesOthers: Boolean - read FCtrlMiddleTabClickClosesOthers write FCtrlMiddleTabClickClosesOthers stored False default True; + read fCtrlMiddleTabClickClosesOthers write fCtrlMiddleTabClickClosesOthers stored False default True; property MiddleTabClickClosesOthersModifier: TShiftState - read FMiddleTabClickClosesOthersModifier write FMiddleTabClickClosesOthersModifier default [ssCtrl]; + read fMiddleTabClickClosesOthersModifier write fMiddleTabClickClosesOthersModifier default [ssCtrl]; property MiddleTabClickClosesToRightModifier: TShiftState - read FMiddleTabClickClosesToRightModifier write FMiddleTabClickClosesToRightModifier default []; - + read fMiddleTabClickClosesToRightModifier write fMiddleTabClickClosesToRightModifier default []; property ShowFileNameInCaption: Boolean - read FShowFileNameInCaption write FShowFileNameInCaption default False; - - // Commend Continue + read fShowFileNameInCaption write fShowFileNameInCaption default False; + // Comment Continue property AnsiCommentContinueEnabled: Boolean read FAnsiCommentContinueEnabled write FAnsiCommentContinueEnabled; - property AnsiCommentMatch: String - read FAnsiCommentMatch write FAnsiCommentMatch; - property AnsiCommentPrefix: String - read FAnsiCommentPrefix write FAnsiCommentPrefix; + property AnsiCommentMatch: String read FAnsiCommentMatch write FAnsiCommentMatch; + property AnsiCommentPrefix: String read FAnsiCommentPrefix write FAnsiCommentPrefix; property AnsiCommentMatchMode: TSynCommentMatchMode read FAnsiCommentMatchMode write FAnsiCommentMatchMode; property AnsiIndentMode: TSynCommentIndentFlags read FAnsiIndentMode write FAnsiIndentMode; property AnsiIndentAlignMax: integer read FAnsiIndentAlignMax write FAnsiIndentAlignMax; - property CurlyCommentContinueEnabled: Boolean read FCurlyCommentContinueEnabled write FCurlyCommentContinueEnabled; - property CurlyCommentMatch: String - read FCurlyCommentMatch write FCurlyCommentMatch; - property CurlyCommentPrefix: String - read FCurlyCommentPrefix write FCurlyCommentPrefix; + property CurlyCommentMatch: String read FCurlyCommentMatch write FCurlyCommentMatch; + property CurlyCommentPrefix: String read FCurlyCommentPrefix write FCurlyCommentPrefix; property CurlyCommentMatchMode: TSynCommentMatchMode read FCurlyCommentMatchMode write FCurlyCommentMatchMode; property CurlyIndentMode: TSynCommentIndentFlags read FCurlyIndentMode write FCurlyIndentMode; property CurlyIndentAlignMax: integer read FCurlyIndentAlignMax write FCurlyIndentAlignMax; - property SlashCommentContinueEnabled: Boolean read FSlashCommentContinueEnabled write FSlashCommentContinueEnabled; property SlashCommentMatch: String @@ -1798,14 +1552,14 @@ type read FSlashCommentExtend write FSlashCommentExtend; property SlashIndentAlignMax: integer read FSlashIndentAlignMax write FSlashIndentAlignMax; - property StringBreakEnabled: Boolean read FStringBreakEnabled write FStringBreakEnabled; property StringBreakAppend: String read FStringBreakAppend write FStringBreakAppend; property StringBreakPrefix: String read FStringBreakPrefix write FStringBreakPrefix; - // Scroll - property ScrollOnEditLeftOptions: TSynScrollOnEditLeftOptions read FScrollOnEditLeftOptions write FScrollOnEditLeftOptions; - property ScrollOnEditRightOptions: TSynScrollOnEditRightOptions read FScrollOnEditRightOptions write FScrollOnEditRightOptions; + property ScrollOnEditLeftOptions: TSynScrollOnEditLeftOptions + read FScrollOnEditLeftOptions write FScrollOnEditLeftOptions; + property ScrollOnEditRightOptions: TSynScrollOnEditRightOptions + read FScrollOnEditRightOptions write FScrollOnEditRightOptions; end; { TEditorOptionsDefaults } @@ -1813,7 +1567,6 @@ type TEditorOptionsDefaults = class(TEditorOptionsBase) private protected - procedure GetUserColorSchemeGroupData; override; public constructor Create; end; @@ -1822,9 +1575,80 @@ type TEditorOptions = class(TEditorOptionsBase) private + XMLConfig: TRttiXMLConfig; + // General options + fSynEditOptions: TSynEditorOptions; + fSynEditOptions2: TSynEditorOptions2; + fShowTabCloseButtons: Boolean; + fHideSingleTabInWindow: Boolean; + fShowTabNumbers: Boolean; + fUndoAfterSave: Boolean; + fFindTextAtCursor: Boolean; + fUseSyntaxHighlight: Boolean; + fCopyWordAtCursorOnCopyNone: Boolean; + fShowGutterHints: Boolean; + fBlockIndent: Integer; + fBlockTabIndent: Integer; + fBlockIndentType: TSynBeautifierIndentType; + fTrimSpaceType: TSynEditStringTrimmingType; + fUndoLimit: Integer; + fTabWidth: Integer; + fBracketHighlightStyle: TSynEditBracketHighlightStyle; + // Display options + fVisibleRightMargin: Boolean; + fVisibleGutter: Boolean; + fShowLineNumbers: Boolean; + fShowOnlyLineNumbersMultiplesOf: integer; + fGutterWidth: Integer; + fGutterSeparatorIndex: Integer; + fRightMargin: Integer; + fEditorFont: String; + fEditorFontSize: Integer; + fExtraCharSpacing: Integer; + fExtraLineSpacing: Integer; + fDisableAntialiasing: Boolean; + fDoNotWarnForFont: string; + // Key Mappings + fKeyMappingScheme: String; + fKeyMap: TKeyCommandRelationList; + // Mouse Mappings + fUserMouseSettings: TEditorMouseOptions; + fTempMouseSettings: TEditorMouseOptions; + // Color options + fHighlighterList: TEditOptLangList; + fUserColorSchemeGroup: TColorSchemeFactory; + fUserDefinedColors: TEditorUserDefinedWordsList; + // Markup Current Word + fMarkupCurWordTime: Integer; + fMarkupCurWordFullLen: Integer; + fMarkupCurWordNoKeyword: Boolean; + fMarkupCurWordTrim: Boolean; + fMarkupCurWordNoTimer: Boolean; + // Code Tools options + fAutoBlockCompletion: Boolean; + fAutoCodeParameters: Boolean; + fAutoToolTipExprEval: Boolean; + fAutoToolTipSymbTools: Boolean; + fAutoDisplayFuncPrototypes: Boolean; + fAutoDelayInMSec: Integer; + fAutoHintDelayInMSec: Integer; + fCodeTemplateFileNameRaw: String; + fCTemplIndentToTokenStart: Boolean; + fAutoRemoveEmptyMethods: Boolean; + fCompletionLongLineHintInMSec: Integer; + // Code Folding + fUseCodeFolding: Boolean; + fUseMarkupWordBracket: Boolean; + fUseMarkupOutline: Boolean; + // Multi window + fMultiWinEditAccessOrder: TEditorOptionsEditAccessOrderList; + // Default values for RttiXmlConfig using published properties. FDefaultValues: TEditorOptionsDefaults; + procedure Init; + function GetCodeTemplateFileNameExpand: String; + function GetColorSchemeLanguage(aHighLighter: TSynCustomHighlighter; + SynColorSchemeName: String = ''): TColorSchemeLanguage; protected - procedure GetUserColorSchemeGroupData; override; public class function GetGroupCaption: string; override; class function GetInstance: TAbstractIDEOptions; override; @@ -1834,17 +1658,145 @@ type destructor Destroy; override; procedure Load; procedure Save; + function LoadCodeTemplates(AnAutoComplete: TSynEditAutoComplete): TModalResult; + function SaveCodeTemplates(AnAutoComplete: TSynEditAutoComplete): TModalResult; + procedure AssignKeyMapTo(ASynEdit: TSynEdit; SimilarEdit: TSynEdit = nil); // Or copy fromSimilarEdit + function ReadColorScheme(const LanguageName: String): String; // TODO: rename ReadColorSchemeName + function ReadPascalColorScheme: String; + procedure WriteColorScheme(const LanguageName, SynColorScheme: String); + procedure ReadHighlighterSettings(Syn: TSrcIDEHighlighter; SynColorScheme: String); + procedure ReadHighlighterFoldSettings(Syn: TSrcIDEHighlighter; ReadForOptions: Boolean = False); + procedure ReadDefaultsForHighlighterFoldSettings(Syn: TSrcIDEHighlighter); + procedure WriteHighlighterFoldSettings(Syn: TSrcIDEHighlighter); + procedure ReadHighlighterDivDrawSettings(Syn: TSrcIDEHighlighter); + procedure ReadDefaultsForHighlighterDivDrawSettings(Syn: TSrcIDEHighlighter); + procedure WriteHighlighterDivDrawSettings(Syn: TSrcIDEHighlighter); + procedure GetHighlighterSettings(Syn: TSrcIDEHighlighter); // read highlight settings from config file + procedure GetSynEditSettings(ASynEdit: TSynEdit; SimilarEdit: TSynEdit = nil); // read synedit settings from config file + function CreateSyn(LazSynHilighter: TLazSyntaxHighlighter): TSrcIDEHighlighter; + procedure GetSynEditPreviewSettings(APreviewEditor: TObject); + procedure SetMarkupColor(Syn: TSrcIDEHighlighter; + AddHilightAttr: TAdditionalHilightAttribute; + aMarkup: TSynSelectedColor); + procedure SetMarkupColors(aSynEd: TSynEdit); + procedure ApplyFontSettingsTo(ASynEdit: TSynEdit); + function ExtensionToLazSyntaxHighlighter(Ext: String): TLazSyntaxHighlighter; override; + public + // general options + property SynEditOptions: TSynEditorOptions + read fSynEditOptions write fSynEditOptions default SynEditDefaultOptions; + property SynEditOptions2: TSynEditorOptions2 + read fSynEditOptions2 write fSynEditOptions2 default SynEditDefaultOptions2; + property ShowTabCloseButtons: Boolean + read fShowTabCloseButtons write fShowTabCloseButtons; + property HideSingleTabInWindow: Boolean + read FHideSingleTabInWindow write FHideSingleTabInWindow; + property ShowTabNumbers: Boolean read fShowTabNumbers write fShowTabNumbers; + property UndoAfterSave: Boolean read fUndoAfterSave write fUndoAfterSave default True; + property FindTextAtCursor: Boolean + read fFindTextAtCursor write fFindTextAtCursor default True; + property UseSyntaxHighlight: Boolean + read fUseSyntaxHighlight write fUseSyntaxHighlight default True; + property CopyWordAtCursorOnCopyNone: Boolean + read FCopyWordAtCursorOnCopyNone write FCopyWordAtCursorOnCopyNone; + property ShowGutterHints: Boolean read FShowGutterHints write FShowGutterHints; + property BlockIndent: Integer read fBlockIndent write fBlockIndent default 2; + property BlockTabIndent: Integer read FBlockTabIndent write FBlockTabIndent default 0; + property BlockIndentType: TSynBeautifierIndentType + read fBlockIndentType write fBlockIndentType default sbitCopySpaceTab; + property TrimSpaceType: TSynEditStringTrimmingType + read fTrimSpaceType write fTrimSpaceType default settLeaveLine; + property UndoLimit: Integer read fUndoLimit write fUndoLimit default 32767; + property TabWidth: Integer read fTabWidth write fTabWidth default 8; + property BracketHighlightStyle: TSynEditBracketHighlightStyle + read fBracketHighlightStyle write fBracketHighlightStyle default sbhsBoth; + // 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 ShowOnlyLineNumbersMultiplesOf: integer read fShowOnlyLineNumbersMultiplesOf + write fShowOnlyLineNumbersMultiplesOf; + property GutterWidth: Integer read fGutterWidth write fGutterWidth default 30; + property GutterSeparatorIndex: Integer read FGutterSeparatorIndex + write FGutterSeparatorIndex default 3; + property RightMargin: Integer read fRightMargin write fRightMargin default 80; + property EditorFont: String read fEditorFont write fEditorFont; + property EditorFontSize: Integer read fEditorFontSize write fEditorFontSize; + property ExtraCharSpacing: Integer + read fExtraCharSpacing write fExtraCharSpacing default 0; + property ExtraLineSpacing: Integer + read fExtraLineSpacing write fExtraLineSpacing default 1; + property DisableAntialiasing: Boolean read fDisableAntialiasing + write fDisableAntialiasing default DefaultEditorDisableAntiAliasing; + property DoNotWarnForFont: string read FDoNotWarnForFont write FDoNotWarnForFont; + // Key Mappings + property KeyMappingScheme: String read fKeyMappingScheme write fKeyMappingScheme; + property KeyMap: TKeyCommandRelationList read fKeyMap; + // Mouse Mappings + // Current saved config + property UserMouseSettings: TEditorMouseOptions read FUserMouseSettings; + // Used by the 2 Mouse-option pages, so they share data (un-saved) + property TempMouseSettings: TEditorMouseOptions read FTempMouseSettings; + // Color options + property HighlighterList: TEditOptLangList read fHighlighterList; + property UserColorSchemeGroup: TColorSchemeFactory read fUserColorSchemeGroup; + property UserDefinedColors: TEditorUserDefinedWordsList read fUserDefinedColors; + // Markup Current Word + property MarkupCurWordTime: Integer + read fMarkupCurWordTime write fMarkupCurWordTime default 1500; + property MarkupCurWordFullLen: Integer + read fMarkupCurWordFullLen write fMarkupCurWordFullLen default 3; + property MarkupCurWordNoKeyword: Boolean + read fMarkupCurWordNoKeyword write fMarkupCurWordNoKeyword default False; + property MarkupCurWordTrim: Boolean + read fMarkupCurWordTrim write fMarkupCurWordTrim default True; + property MarkupCurWordNoTimer: Boolean + read fMarkupCurWordNoTimer write fMarkupCurWordNoTimer default False; + // Code Tools options + property AutoBlockCompletion: Boolean + read fAutoBlockCompletion write FAutoBlockCompletion default True; + property AutoCodeParameters: Boolean + read fAutoCodeParameters write fAutoCodeParameters default True; + property AutoToolTipExprEval: Boolean + read fAutoToolTipExprEval write fAutoToolTipExprEval default True; // debugger hints + property AutoToolTipSymbTools: Boolean + read fAutoToolTipSymbTools write fAutoToolTipSymbTools default True; // declaration hints + property AutoDisplayFunctionPrototypes: Boolean + read fAutoDisplayFuncPrototypes write fAutoDisplayFuncPrototypes default True; + property AutoDelayInMSec: Integer read fAutoDelayInMSec + write fAutoDelayInMSec default 1000; + property AutoHintDelayInMSec: Integer read fAutoHintDelayInMSec + write fAutoHintDelayInMSec default 1000; + property CodeTemplateFileNameRaw: String + read fCodeTemplateFileNameRaw write fCodeTemplateFileNameRaw; + property CodeTemplateFileNameExpand: String read GetCodeTemplateFileNameExpand; + property CodeTemplateIndentToTokenStart: Boolean + read fCTemplIndentToTokenStart write fCTemplIndentToTokenStart; + property AutoRemoveEmptyMethods: Boolean + read fAutoRemoveEmptyMethods write fAutoRemoveEmptyMethods default False; + property CompletionLongLineHintInMSec: Integer + read fCompletionLongLineHintInMSec write fCompletionLongLineHintInMSec; + // Code Folding + property UseCodeFolding: Boolean + read fUseCodeFolding write fUseCodeFolding default True; + property UseMarkupWordBracket: Boolean + read fUseMarkupWordBracket write fUseMarkupWordBracket default True; + property UseMarkupOutline: Boolean + read fUseMarkupOutline write fUseMarkupOutline default False; + // Multi window + property MultiWinEditAccessOrder: TEditorOptionsEditAccessOrderList + read FMultiWinEditAccessOrder write FMultiWinEditAccessOrder; end; var EditorOpts: TEditorOptions; procedure RepairEditorFontSize(var FontSize: integer); - function BuildBorlandDCIFile(ACustomSynAutoComplete: TCustomSynAutoComplete): Boolean; function ColorSchemeFactory: TColorSchemeFactory; function UserSchemeDirectory(CreateIfNotExists: Boolean = False): String; - procedure InitLocale; implementation @@ -4737,91 +4689,48 @@ begin end; end; +{ TEditorOptionsBase } + +constructor TEditorOptionsBase.Create; +begin + inherited Create; + FScrollOnEditLeftOptions := TSynScrollOnEditLeftOptions.Create; + FScrollOnEditRightOptions := TSynScrollOnEditRightOptions.Create; +end; + destructor TEditorOptionsBase.Destroy; begin - FreeAndNil(FUserDefinedColors); - fKeyMap.Free; - FreeAndNil(FMultiWinEditAccessOrder); - XMLConfig.Free; - FUserMouseSettings.Free; - FTempMouseSettings.Free; FreeAndNil(FScrollOnEditLeftOptions); FreeAndNil(FScrollOnEditRightOptions); inherited Destroy; end; -procedure TEditorOptionsBase.Init; +procedure TEditorOptionsBase.InitForRttiXmlConf; begin // General options - fShowTabCloseButtons := True; - FMultiLineTab := False; - FHideSingleTabInWindow := False; + fMultiLineTab := False; fTabPosition := tpTop; - FCopyWordAtCursorOnCopyNone := True; - FShowGutterHints := True; - fBlockIndent := 2; - FBlockTabIndent := 0; - fBlockIndentType := sbitSpace; - FTrimSpaceType := settEditLine; - fUndoLimit := 32767; - fTabWidth := 8; - FBracketHighlightStyle := sbhsBoth; - FGutterSeparatorIndex := 3; - fSynEditOptions := SynEditDefaultOptions; - fSynEditOptions2 := SynEditDefaultOptions2; - FMultiCaretOnColumnSelect := True; - FMultiCaretDefaultMode := mcmMoveAllCarets; - FMultiCaretDefaultColumnSelectMode := mcmCancelOnCaretMove; - FMultiCaretDeleteSkipLineBreak := False; - + fMultiCaretOnColumnSelect := True; + fMultiCaretDefaultMode := mcmMoveAllCarets; + fMultiCaretDefaultColumnSelectMode := mcmCancelOnCaretMove; + fMultiCaretDeleteSkipLineBreak := False; // Display options - fEditorFont := SynDefaultFontName; - fEditorFontSize := SynDefaultFontSize; - fDisableAntialiasing := DefaultEditorDisableAntiAliasing; - FShowOverviewGutter := True; - FTopInfoView := True; - - // Key Mappings - fKeyMappingScheme := KeyMapSchemeNames[kmsLazarus]; - fKeyMap := TKeyCommandRelationList.Create; - - // Mouse Mappings - FUserMouseSettings := TEditorMouseOptions.Create; - FTempMouseSettings := TEditorMouseOptions.Create; - FUserMouseSettings.LoadUserSchemes; - - // Color options - fHighlighterList := HighlighterListSingleton; - GetUserColorSchemeGroupData; - FUserDefinedColors := TEditorUserDefinedWordsList.Create; - FUserDefinedColors.UseGlobalIDECommandList := True; - - FMarkupCurWordTime := 1500; - FMarkupCurWordFullLen := 3; - FMarkupCurWordNoKeyword := True; - FMarkupCurWordTrim := True; - FMarkupCurWordNoTimer := False; - + fShowOverviewGutter := True; + fTopInfoView := True; // hints - FDbgHintAutoTypeCastClass := True; - + fDbgHintAutoTypeCastClass := True; // Code Tools options - FCompletionLongLineHintType := DefaultCompletionLongLineHintType; - FAutoDisplayFuncPrototypes := True; - + fCompletionLongLineHintType := DefaultCompletionLongLineHintType; // Code folding - FReverseFoldPopUpOrder := True; - + fReverseFoldPopUpOrder := True; // pas highlighter - FPasExtendedKeywordsMode := False; - FPasStringKeywordMode := spsmDefault; - + fPasExtendedKeywordsMode := False; + fPasStringKeywordMode := spsmDefault; // Multi window - FCtrlMiddleTabClickClosesOthers := True; - FMiddleTabClickClosesOthersModifier := [ssCtrl]; - FMiddleTabClickClosesToRightModifier := []; - FShowFileNameInCaption := False; - + fCtrlMiddleTabClickClosesOthers := True; + fMiddleTabClickClosesOthersModifier := [ssCtrl]; + fMiddleTabClickClosesToRightModifier := []; + fShowFileNameInCaption := False; // Comment FAnsiCommentContinueEnabled := False; FAnsiCommentMatch := '^\s?(\*)'; @@ -4859,824 +4768,17 @@ begin FStringBreakPrefix := ''; end; -function TEditorOptionsBase.LoadCodeTemplates(AnAutoComplete: TSynEditAutoComplete - ): TModalResult; - - function ResourceDCIAsText: String; - var - data: TResourceStream; - i: Int64; - begin - data := TResourceStream.Create(HInstance, PChar('lazarus_dci_file'), PChar(RT_RCDATA)); - i := data.Size; - if i > 0 then begin - SetLength(Result, i); - data.Read(Result[1], i); - end; - data.Free; - end; - -var - s: String; - FileVersion, i, j, v: Integer; - NewAutoComplete: TSynEditAutoComplete; - Attr: TStringList; - Added: Boolean; -begin - s := CodeTemplateFileNameExpand; - Result := mrAbort; - if FileExistsUTF8(s) then begin - try - LoadStringsFromFileUTF8(AnAutoComplete.AutoCompleteList, s); - Result := mrOK; - except - Result := mrAbort; - end; - if Result = mrAbort then - exit; - - FileVersion := AnAutoComplete.Completions.Count; - if (FileVersion > 0) then begin - FileVersion := AnAutoComplete.CompletionAttributes[0].IndexOfName(DciFileVersionName); - if (FileVersion >= 0) then - FileVersion := StrToIntDef(AnAutoComplete.CompletionAttributes[0][FileVersion], 0); - end; - if FileVersion < DciFileVersion then begin - // Merge new entries - NewAutoComplete := TSynEditAutoComplete.Create(nil); - NewAutoComplete.AutoCompleteList.Text := ResourceDCIAsText; - Added := False; - for i := 0 to NewAutoComplete.Completions.Count - 1 do begin - j := NewAutoComplete.CompletionAttributes[i].IndexOfName(DciVersionName); - if j < 0 then - continue; - v := StrToIntDef(NewAutoComplete.CompletionAttributes[i][j], 0); - if v <= FileVersion then - continue; - if AnAutoComplete.Completions.IndexOf(NewAutoComplete.Completions[i]) >= 0 then - continue; - Attr := TStringList.Create; - Attr.Assign(NewAutoComplete.CompletionAttributes[i]); // will be owned by AnAutoComplete; - AnAutoComplete.AddCompletion( - NewAutoComplete.Completions[i], - NewAutoComplete.CompletionValues[i], - NewAutoComplete.CompletionComments[i], - Attr); - Added := True; - end; - NewAutoComplete.Free; - if Added then - if BuildBorlandDCIFile(AnAutoComplete) then - SaveCodeTemplates(AnAutoComplete); - end; - end - else begin - AnAutoComplete.AutoCompleteList.Text := ResourceDCIAsText; - end; -end; - -function TEditorOptionsBase.SaveCodeTemplates(AnAutoComplete: TSynEditAutoComplete - ): TModalResult; -begin - try - SaveStringsToFileUTF8(AnAutoComplete.AutoCompleteList, CodeTemplateFileNameExpand); - Result := mrOK; - except - Result := mrAbort; - end; -end; - -procedure TEditorOptionsBase.TranslateResourceStrings; -begin - -end; - -procedure TEditorOptionsBase.AssignKeyMapTo(ASynEdit: TSynEdit; SimilarEdit: TSynEdit); -var - c, i: Integer; -begin - if SimilarEdit<>nil then - ASynEdit.KeyStrokes.Assign(SimilarEdit.Keystrokes) - else - KeyMap.AssignTo(ASynEdit.KeyStrokes, TSourceEditorWindowInterface); - - c := ASynEdit.PluginCount - 1; - while (c >= 0) do begin - - if SimilarEdit<>nil then begin - i := SimilarEdit.PluginCount - 1; - while (i >= 0) and not (SimilarEdit.Plugin[i].ClassType = ASynEdit.Plugin[c].ClassType) do - dec(i); - end - else - i:= -1; - - if (ASynEdit.Plugin[c] is TSynPluginTemplateEdit) then begin - TSynPluginTemplateEdit(ASynEdit.Plugin[c]).Keystrokes.Clear; - TSynPluginTemplateEdit(ASynEdit.Plugin[c]).KeystrokesOffCell.Clear; - if i >= 0 then begin - TSynPluginTemplateEdit(ASynEdit.Plugin[c]).Keystrokes.Assign( - TSynPluginTemplateEdit(SimilarEdit.Plugin[i]).KeyStrokes); - TSynPluginTemplateEdit(ASynEdit.Plugin[c]).KeystrokesOffCell.Assign( - TSynPluginTemplateEdit(SimilarEdit.Plugin[i]).KeystrokesOffCell); - end else begin - KeyMap.AssignTo(TSynPluginTemplateEdit(ASynEdit.Plugin[c]).Keystrokes, - TLazSynPluginTemplateEditForm, ecIdePTmplOffset); - KeyMap.AssignTo(TSynPluginTemplateEdit(ASynEdit.Plugin[c]).KeystrokesOffCell, - TLazSynPluginTemplateEditFormOff, ecIdePTmplOutOffset); - end; - end; - - if (ASynEdit.Plugin[c] is TSynPluginSyncroEdit) then begin - TSynPluginSyncroEdit(ASynEdit.Plugin[c]).KeystrokesSelecting.Clear; - TSynPluginSyncroEdit(ASynEdit.Plugin[c]).Keystrokes.Clear; - TSynPluginSyncroEdit(ASynEdit.Plugin[c]).KeystrokesOffCell.Clear; - if i >= 0 then begin - TSynPluginSyncroEdit(ASynEdit.Plugin[c]).KeystrokesSelecting.Assign( - TSynPluginSyncroEdit(SimilarEdit.Plugin[i]).KeystrokesSelecting); - TSynPluginSyncroEdit(ASynEdit.Plugin[c]).Keystrokes.Assign( - TSynPluginSyncroEdit(SimilarEdit.Plugin[i]).KeyStrokes); - TSynPluginSyncroEdit(ASynEdit.Plugin[c]).KeystrokesOffCell.Assign( - TSynPluginSyncroEdit(SimilarEdit.Plugin[i]).KeystrokesOffCell); - end else begin - KeyMap.AssignTo(TSynPluginSyncroEdit(ASynEdit.Plugin[c]).KeystrokesSelecting, - TLazSynPluginSyncroEditFormSel, ecIdePSyncroSelOffset); - KeyMap.AssignTo(TSynPluginSyncroEdit(ASynEdit.Plugin[c]).Keystrokes, - TLazSynPluginSyncroEditForm, ecIdePSyncroOffset); - KeyMap.AssignTo(TSynPluginSyncroEdit(ASynEdit.Plugin[c]).KeystrokesOffCell, - TLazSynPluginSyncroEditFormOff, ecIdePSyncroOutOffset); - end; - end; - - if (ASynEdit.Plugin[c] is TSynPluginMultiCaret) then begin - // Only ecPluginMultiCaretClearAll - // the others are handled in SynEdit.Keystrokes - TSynPluginMultiCaret(ASynEdit.Plugin[c]).Keystrokes.Clear; - if i >= 0 then begin - TSynPluginMultiCaret(ASynEdit.Plugin[c]).Keystrokes.Assign( - TSynPluginMultiCaret(SimilarEdit.Plugin[i]).KeyStrokes); - end else begin - KeyMap.AssignTo(TSynPluginMultiCaret(ASynEdit.Plugin[c]).Keystrokes, - TLazSynPluginTemplateMultiCaret, 0); //ecIdePTmplOffset); - end; - end; - - dec(c); - end; -end; - -function TEditorOptionsBase.CreateSyn(LazSynHilighter: TLazSyntaxHighlighter): TSrcIDEHighlighter; -begin - if LazSyntaxHighlighterClasses[LazSynHilighter] <> Nil then - begin - Result := LazSyntaxHighlighterClasses[LazSynHilighter].Create(Nil); - GetHighlighterSettings(Result); - end - else - Result := Nil; -end; - -function TEditorOptionsBase.ReadColorScheme(const LanguageName: String): String; -(* The name of the currently chosen color-scheme for that language *) -begin - if LanguageName = '' then - begin - Result := ColorSchemeFactory.ColorSchemeGroupAtPos[0].Name; - exit; - end; - if LanguageName <> TPreviewPasSyn.GetLanguageName then - Result := XMLConfig.GetValue( - 'EditorOptions/Color/Lang' + StrToValidXMLName(LanguageName) + - '/ColorScheme/Value', '') - else - Result := ''; - if ColorSchemeFactory.ColorSchemeGroup[Result] = nil then - Result := ''; - if Result = '' then - Result := ReadPascalColorScheme; -end; - -function TEditorOptionsBase.ReadPascalColorScheme: String; -(* The name of the currently chosen color-scheme for pascal code *) -var - FormatVersion: Integer; -begin - FormatVersion := XMLConfig.GetValue('EditorOptions/Color/Version', EditorOptsFormatVersion); - if FormatVersion > 1 then - Result := XMLConfig.GetValue( - 'EditorOptions/Color/Lang' + StrToValidXMLName( - TPreviewPasSyn.GetLanguageName) + '/ColorScheme/Value', '') - else - Result := XMLConfig.GetValue('EditorOptions/Color/ColorScheme', ''); - if ColorSchemeFactory.ColorSchemeGroup[Result] = nil then - Result := ''; - if (Result = '') then begin - if DefaultColorSchemeName <> '' then - Result := DefaultColorSchemeName - else - Result := ColorSchemeFactory.ColorSchemeGroupAtPos[0].Name; - end; -end; - -function TEditorOptionsBase.GetColorSchemeLanguage(aHighLighter: TSynCustomHighlighter; - SynColorSchemeName: String): TColorSchemeLanguage; -var - Scheme: TColorScheme; -begin - Result := nil; - // initialize with defaults - if SynColorSchemeName = '' then - SynColorSchemeName := ReadColorScheme(aHighLighter.LanguageName); - if (SynColorSchemeName = '') then - exit; - - Scheme := UserColorSchemeGroup.ColorSchemeGroup[SynColorSchemeName]; - if Scheme = nil then - exit; - Result := Scheme.ColorSchemeBySynClass[aHighLighter.ClassType]; -end; - -procedure TEditorOptionsBase.WriteColorScheme(const LanguageName, SynColorScheme: String); -begin - if (LanguageName = '') or (SynColorScheme = '') then - exit; - XMLConfig.SetValue('EditorOptions/Color/Lang' + StrToValidXMLName( - LanguageName) + '/ColorScheme/Value', SynColorScheme); - XMLConfig.SetValue('EditorOptions/Color/Version', EditorOptsFormatVersion); -end; - -procedure TEditorOptionsBase.ReadHighlighterSettings(Syn: TSrcIDEHighlighter; - SynColorScheme: String); -// if SynColorScheme='' then default ColorScheme will be used -var - LangScheme: TColorSchemeLanguage; -begin - LangScheme := GetColorSchemeLanguage(Syn, SynColorScheme); - if LangScheme = nil then - exit; - LangScheme.ApplyTo(Syn); -end; - -procedure TEditorOptionsBase.ReadHighlighterFoldSettings(Syn: TSrcIDEHighlighter; - ReadForOptions: Boolean); -var - ConfName: String; - Path: String; - i, h, idx: Integer; - TheFoldInfo: TEditorOptionsFoldRecord; - DefHl, FoldHl: TSynCustomFoldHighlighter; -begin - h := HighlighterList.FindByHighlighter(Syn); - if h < 0 then - h := HighlighterList.FindByName(Syn.LanguageName); - if h < 0 then exit; - - if (syn is TSynCustomFoldHighlighter) then begin - DefHl := TSynCustomFoldHighlighter(TCustomSynClass(Syn.ClassType).Create(nil)); - try - ReadDefaultsForHighlighterFoldSettings(DefHl); - FoldHl := TSynCustomFoldHighlighter(Syn); - TheFoldInfo := EditorOptionsFoldDefaults[HighlighterList[h].TheType]; - for i := 0 to TheFoldInfo.Count - 1 do begin - idx := TheFoldInfo.Info^[i].Index; - ConfName := TheFoldInfo.Info^[i].Xml; - Path := 'EditorOptions/FoldConfig/Lang' + - StrToValidXMLName(Syn.LanguageName) + '/Type' + ConfName + '/' ; - // try reading the old config first - FoldHl.FoldConfig[idx].Enabled := - XMLConfig.GetValue(Path + 'Enabled/Value', FoldHl.FoldConfig[idx].Enabled); - XMLConfig.ReadObject(Path + 'Settings/', FoldHl.FoldConfig[idx], DefHl.FoldConfig[idx]); - - (* if ReadForOptions=True then Enabled appies only to fmFold,fmHide. - This allows to store what selection was previously active *) - if not ReadForOptions then begin - if (not FoldHl.FoldConfig[idx].Enabled) or (not FUseCodeFolding) then - FoldHl.FoldConfig[idx].Modes := FoldHl.FoldConfig[idx].Modes - [fmFold, fmHide]; - if (not FUseMarkupWordBracket) then - FoldHl.FoldConfig[idx].Modes := FoldHl.FoldConfig[idx].Modes - [fmMarkup]; - if (not FUseMarkupOutline) then - FoldHl.FoldConfig[idx].Modes := FoldHl.FoldConfig[idx].Modes - [fmOutline]; - - FoldHl.FoldConfig[idx].Enabled := FoldHl.FoldConfig[idx].Modes <> []; - end; - - if (FoldHl is TSynPasSyn) and (idx = ord(cfbtIfThen)) then begin - FoldHl.FoldConfig[ord(cfbtIfElse)].Modes := FoldHl.FoldConfig[idx].Modes * [fmOutline]; - FoldHl.FoldConfig[ord(cfbtIfElse)].Enabled := FoldHl.FoldConfig[idx].Enabled and (FoldHl.FoldConfig[ord(cfbtIfElse)].Modes <> []); - end; - - end; - finally - DefHl.Free; - end; - end; -end; - -procedure TEditorOptionsBase.ReadDefaultsForHighlighterFoldSettings(Syn: TSrcIDEHighlighter); -var - i, h: Integer; - TheFoldInfo: TEditorOptionsFoldRecord; -begin - h := HighlighterList.FindByHighlighter(Syn); - if h < 0 then - h := HighlighterList.FindByName(Syn.LanguageName); - if h < 0 then exit; - if (syn is TSynCustomFoldHighlighter) then begin - TheFoldInfo := EditorOptionsFoldDefaults[HighlighterList[h].TheType]; - for i := 0 to TheFoldInfo.Count - 1 do - with TSynCustomFoldHighlighter(Syn).FoldConfig[TheFoldInfo.Info^[i].Index] do - Enabled := TheFoldInfo.Info^[i].Enabled; - end; -end; - -procedure TEditorOptionsBase.WriteHighlighterFoldSettings(Syn: TSrcIDEHighlighter); -var - DefSyn: TSrcIDEHighlighter; - i, h: Integer; - Path: String; - ConfName: String; - TheFoldInfo: TEditorOptionsFoldRecord; -begin - h := HighlighterList.FindByHighlighter(Syn); - if h < 0 then - h := HighlighterList.FindByName(Syn.LanguageName); - if h < 0 then exit; - - DefSyn := TCustomSynClass(Syn.ClassType).Create(Nil); - try - ReadDefaultsForHighlighterFoldSettings(DefSyn); - - if (syn is TSynCustomFoldHighlighter) then begin - TheFoldInfo := EditorOptionsFoldDefaults[HighlighterList[h].TheType]; - for i := 0 to TheFoldInfo.Count - 1 do begin - ConfName := TheFoldInfo.Info^[i].Xml; - Path := 'EditorOptions/FoldConfig/Lang' + - StrToValidXMLName(Syn.LanguageName) + '/Type' + ConfName + '/' ; - XMLConfig.DeletePath(Path + 'Enabled/'); - XMLConfig.WriteObject(Path + 'Settings/', - TSynCustomFoldHighlighter(Syn).FoldConfig[TheFoldInfo.Info^[i].Index], - TSynCustomFoldHighlighter(DefSyn).FoldConfig[TheFoldInfo.Info^[i].Index]); - end; - end; - - finally - DefSyn.Free; - end; -end; - -procedure TEditorOptionsBase.ReadHighlighterDivDrawSettings(Syn: TSrcIDEHighlighter); -var - TheInfo: TEditorOptionsDividerRecord; - Conf: TSynDividerDrawConfig; - ConfName: String; - Path: String; - i, h: Integer; -begin - h := HighlighterList.FindByHighlighter(Syn); - if h < 0 then - h := HighlighterList.FindByName(Syn.LanguageName); - if h < 0 then exit; - TheInfo := EditorOptionsDividerDefaults[HighlighterList[h].TheType]; - - ReadDefaultsForHighlighterDivDrawSettings(Syn); - - // read settings, that are different from the defaults - for i := 0 to TheInfo.Count - 1 do begin - Conf := Syn.DividerDrawConfig[i]; - ConfName := TheInfo.Info^[i].Xml; - Path := 'EditorOptions/DividerDraw/Lang' + StrToValidXMLName(Syn.LanguageName) + - '/Type' + ConfName + '/' ; - Conf.MaxDrawDepth := XMLConfig.GetValue(Path + 'MaxDepth/Value', - Conf.MaxDrawDepth); - Conf.TopColor := XMLConfig.GetValue(Path + 'TopColor/Value', - Conf.TopColor); - Conf.NestColor := XMLConfig.GetValue(Path + 'NestColor/Value', - Conf.NestColor); - end; -end; - -procedure TEditorOptionsBase.ReadDefaultsForHighlighterDivDrawSettings(Syn: TSrcIDEHighlighter); -var - TheInfo: TEditorOptionsDividerRecord; - i, h: Integer; -begin - h := HighlighterList.FindByHighlighter(Syn); - if h < 0 then - h := HighlighterList.FindByName(Syn.LanguageName); - if h < 0 then exit; - TheInfo := EditorOptionsDividerDefaults[HighlighterList[h].TheType]; - for i := 0 to TheInfo.Count - 1 do begin - Syn.DividerDrawConfig[i].MaxDrawDepth := TheInfo.Info^[i].MaxLeveL; - Syn.DividerDrawConfig[i].TopColor := clDefault; - Syn.DividerDrawConfig[i].NestColor := clDefault; - end; -end; - -procedure TEditorOptionsBase.WriteHighlighterDivDrawSettings(Syn: TSrcIDEHighlighter); -var - DefSyn: TSrcIDEHighlighter; - i, h: Integer; - Path: String; - Conf, DefConf: TSynDividerDrawConfig; - TheInfo: TEditorOptionsDividerRecord; - ConfName: String; -begin - h := HighlighterList.FindByHighlighter(Syn); - if h < 0 then - h := HighlighterList.FindByName(Syn.LanguageName); - if h < 0 then exit; - TheInfo := EditorOptionsDividerDefaults[HighlighterList[h].TheType]; - - DefSyn := TCustomSynClass(Syn.ClassType).Create(Nil); - try - ReadDefaultsForHighlighterDivDrawSettings(DefSyn); - for i := 0 to TheInfo.Count - 1 do begin - Conf := Syn.DividerDrawConfig[i]; - DefConf := DefSyn.DividerDrawConfig[i]; // default value - ConfName := TheInfo.Info^[i].Xml; - Path := 'EditorOptions/DividerDraw/Lang' + - StrToValidXMLName(Syn.LanguageName) + '/Type' + ConfName + '/' ; - XMLConfig.SetDeleteValue(Path + 'MaxDepth/Value', Conf.MaxDrawDepth, - DefConf.MaxDrawDepth); - XMLConfig.SetDeleteValue(Path + 'TopColor/Value', Conf.TopColor, - DefConf.TopColor); - XMLConfig.SetDeleteValue(Path + 'NestColor/Value', Conf.NestColor, - DefConf.NestColor); - end; - - finally - DefSyn.Free; - end; -end; - -procedure TEditorOptionsBase.GetHighlighterSettings(Syn: TSrcIDEHighlighter); -// read highlight settings from config file -begin - ReadHighlighterSettings(Syn, ''); - ReadHighlighterFoldSettings(Syn); - ReadHighlighterDivDrawSettings(Syn); - if Syn is TSynPasSyn then begin - TSynPasSyn(Syn).ExtendedKeywordsMode := PasExtendedKeywordsMode; - TSynPasSyn(Syn).StringKeywordMode := PasStringKeywordMode; - end;; -end; - -procedure TEditorOptionsBase.SetMarkupColors(aSynEd: TSynEdit); -var - Scheme: TColorSchemeLanguage; -begin - // Find current color scheme for default colors - if (aSynEd.Highlighter = nil) then begin - aSynEd.Color := clWhite; - aSynEd.Font.Color := clBlack; - exit; - end; - // get current colorscheme: - Scheme := GetColorSchemeLanguage(aSynEd.Highlighter); - if Assigned(Scheme) then Scheme.ApplyTo(aSynEd); -end; - -procedure TEditorOptionsBase.SetMarkupColor(Syn : TSrcIDEHighlighter; - AddHilightAttr : TAdditionalHilightAttribute; aMarkup : TSynSelectedColor); -var - SchemeGrp: TColorScheme; - Scheme: TColorSchemeLanguage; - Attrib: TColorSchemeAttribute; -begin - if assigned(Syn) then begin - Scheme := GetColorSchemeLanguage(Syn); - end else begin - SchemeGrp := UserColorSchemeGroup.ColorSchemeGroup[DefaultColorSchemeName]; - if SchemeGrp = nil then - exit; - Scheme := SchemeGrp.DefaultColors; - end; - - Attrib := Scheme.AttributeByEnum[AddHilightAttr]; - if Attrib <> nil then begin - Attrib.ApplyTo(aMarkup); - exit; - end; - - // set default - aMarkup.Foreground := clNone; - aMarkup.Background := clNone; - aMarkup.FrameColor := clNone; - aMarkup.FrameEdges := sfeAround; - aMarkup.FrameStyle := slsSolid; - aMarkup.Style := []; - aMarkup.StyleMask := []; -end; - -procedure TEditorOptionsBase.ApplyFontSettingsTo(ASynEdit: TSynEdit); -begin - ASynEdit.Font.Size := fEditorFontSize;// set size before name for XLFD ! - ASynEdit.Font.Name := fEditorFont; - if fDisableAntialiasing then - ASynEdit.Font.Quality := fqNonAntialiased - else - ASynEdit.Font.Quality := fqDefault; -end; - -function TEditorOptionsBase.ExtensionToLazSyntaxHighlighter(Ext: String): TLazSyntaxHighlighter; -var - s, CurExt: String; - LangID, StartPos, EndPos: Integer; -begin - Result := lshNone; - if (Ext = '') or (Ext = '.') or (HighlighterList = Nil) then - exit; - Ext := lowercase(Ext); - if (Ext[1] = '.') then - Ext := copy(Ext, 2, length(Ext) - 1); - LangID := 0; - while LangID < HighlighterList.Count do - begin - s := HighlighterList[LangID].FileExtensions; - 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 - CurExt := copy(CurExt, 2, length(CurExt) - 1); - if lowercase(CurExt) = Ext then - begin - Result := HighlighterList[LangID].TheType; - exit; - end; - Startpos := EndPos + 1; - end; - inc(LangID); - end; -end; - -procedure TEditorOptionsBase.GetSynEditSettings(ASynEdit: TSynEdit; - SimilarEdit: TSynEdit); -// read synedit settings from config file -// if SimilarEdit is given it is used for speed up -var - MarkCaret: TSynEditMarkupHighlightAllCaret; - b: TSynBeautifierPascal; - i: Integer; - mw: TSourceSynEditMarkupHighlightAllMulti; - TermsConf: TEditorUserDefinedWords; - Markup: TSynEditMarkup; -begin - // general options - ASynEdit.BeginUpdate(False); - try - ASynEdit.Options := fSynEditOptions; - ASynEdit.Options2 := fSynEditOptions2; - ASynEdit.BlockIndent := fBlockIndent; - ASynEdit.BlockTabIndent := FBlockTabIndent; - (ASynEdit.Beautifier as TSynBeautifier).IndentType := fBlockIndentType; - if ASynEdit.Beautifier is TSynBeautifierPascal then begin - b := ASynEdit.Beautifier as TSynBeautifierPascal; - - if FAnsiCommentContinueEnabled then begin - b.AnsiCommentMode := sccPrefixMatch; - b.AnsiIndentMode := FAnsiIndentMode; - b.AnsiMatch := FAnsiCommentMatch; - b.AnsiPrefix := FAnsiCommentPrefix; - b.AnsiMatchLine := sclMatchPrev; - b.AnsiMatchMode := AnsiCommentMatchMode; - b.AnsiCommentIndent := sbitCopySpaceTab; - b.AnsiIndentFirstLineMax := AnsiIndentAlignMax; - end - else begin - b.AnsiCommentMode := sccNoPrefix; - b.AnsiIndentMode := []; - end; - - if FCurlyCommentContinueEnabled then begin - b.BorCommentMode := sccPrefixMatch; - b.BorIndentMode := FCurlyIndentMode; - b.BorMatch := FCurlyCommentMatch; - b.BorPrefix := FCurlyCommentPrefix; - b.BorMatchLine := sclMatchPrev; - b.BorMatchMode := CurlyCommentMatchMode; - b.BorCommentIndent := sbitCopySpaceTab; - b.BorIndentFirstLineMax := CurlyIndentAlignMax; - end - else begin - b.BorCommentMode := sccNoPrefix; - b.BorIndentMode := []; - end; - - if FSlashCommentContinueEnabled then begin - b.SlashCommentMode := sccPrefixMatch; - b.SlashIndentMode := FSlashIndentMode; - b.SlashMatch := FSlashCommentMatch; - b.SlashPrefix := FSlashCommentPrefix; - b.SlashMatchLine := sclMatchPrev; - b.SlashMatchMode := SlashCommentMatchMode; - b.SlashCommentIndent := sbitCopySpaceTab; - b.ExtendSlashCommentMode := FSlashCommentExtend; - b.SlashIndentFirstLineMax := SlashIndentAlignMax; - end - else begin - b.SlashCommentMode := sccNoPrefix; - b.SlashIndentMode := []; - end; - - b.StringBreakEnabled := FStringBreakEnabled; - b.StringBreakAppend := FStringBreakAppend; - b.StringBreakPrefix := FStringBreakPrefix; - - end; - - ASynEdit.TrimSpaceType := FTrimSpaceType; - ASynEdit.TabWidth := fTabWidth; - ASynEdit.BracketHighlightStyle := FBracketHighlightStyle; - {$IFDEF WinIME} - if ASynEdit is TIDESynEditor then begin - if UseMinimumIme - then TIDESynEditor(ASynEdit).CreateMinimumIme - else TIDESynEditor(ASynEdit).CreateFullIme; - end; - {$ENDIF} - - if ASynEdit is TIDESynEditor then begin - TIDESynEditor(ASynEdit).HighlightUserWordCount := UserDefinedColors.Count; - for i := 0 to UserDefinedColors.Count - 1 do begin - TermsConf := UserDefinedColors.Lists[i]; - mw := TIDESynEditor(ASynEdit).HighlightUserWords[i]; - if TermsConf.GlobalList or (not TermsConf.HasKeyAssigned) - then begin - if TermsConf.GlobalTermsCache = nil then - TermsConf.GlobalTermsCache := mw.Terms - else - mw.Terms := TermsConf.GlobalTermsCache; - end - else begin - if mw.Terms = TermsConf.GlobalTermsCache then - mw.Terms := nil; - if TermsConf.GlobalTermsCache <> nil then - TermsConf.GlobalTermsCache.Clear; - end; - - mw.MarkupInfo.Assign(TermsConf.ColorAttr); - mw.Clear; - mw.Terms.Assign(TermsConf); - mw.RestoreLocalChanges; - if TermsConf.AddTermCmd <> nil then - mw.AddTermCmd := TermsConf.AddTermCmd.Command; - if TermsConf.RemoveTermCmd <> nil then - mw.RemoveTermCmd := TermsConf.RemoveTermCmd.Command; - if TermsConf.ToggleTermCmd <> nil then - mw.ToggleTermCmd := TermsConf.ToggleTermCmd.Command; - mw.KeyAddTermBounds := TermsConf.KeyAddTermBounds; - mw.KeyAddCase := TermsConf.KeyAddCase; - mw.KeyAddWordBoundMaxLen := TermsConf.KeyAddWordBoundMaxLen; - mw.KeyAddSelectBoundMaxLen := TermsConf.KeyAddSelectBoundMaxLen; - mw.KeyAddSelectSmart := TermsConf.KeyAddSelectSmart; - end; - end; - - {$IFnDEF WithoutSynMultiCaret} - if ASynEdit is TIDESynEditor then begin - TIDESynEditor(ASynEdit).MultiCaret.EnableWithColumnSelection := MultiCaretOnColumnSelect; - TIDESynEditor(ASynEdit).MultiCaret.DefaultMode := FMultiCaretDefaultMode; - TIDESynEditor(ASynEdit).MultiCaret.DefaultColumnSelectMode := FMultiCaretDefaultColumnSelectMode; - if FMultiCaretDeleteSkipLineBreak - then TIDESynEditor(ASynEdit).MultiCaret.Options := TIDESynEditor(ASynEdit).MultiCaret.Options + [smcoDeleteSkipLineBreak] - else TIDESynEditor(ASynEdit).MultiCaret.Options := TIDESynEditor(ASynEdit).MultiCaret.Options - [smcoDeleteSkipLineBreak]; - end; - {$ENDIF} - - // Display options - ASynEdit.Gutter.Visible := fVisibleGutter; - ASynEdit.Gutter.AutoSize := true; - ASynEdit.Gutter.LineNumberPart.Visible := fShowLineNumbers; - ASynEdit.Gutter.LineNumberPart(0).ShowOnlyLineNumbersMultiplesOf := - fShowOnlyLineNumbersMultiplesOf; - ASynEdit.RightGutter.Visible := ShowOverviewGutter; - if ASynEdit is TIDESynEditor then - TIDESynEditor(ASynEdit).ShowTopInfo := TopInfoView; - - ASynEdit.Gutter.CodeFoldPart.Visible := FUseCodeFolding; - if not FUseCodeFolding then - ASynEdit.UnfoldAll; - ASynEdit.Gutter.CodeFoldPart.ReversePopMenuOrder := ReverseFoldPopUpOrder; - - ASynEdit.Gutter.Width := fGutterWidth; - ASynEdit.Gutter.SeparatorPart.Visible := FGutterSeparatorIndex <> -1; - if FGutterSeparatorIndex <> -1 then - ASynEdit.Gutter.SeparatorPart(0).Index := FGutterSeparatorIndex; - - ASynEdit.RightEdge := fRightMargin; - if fVisibleRightMargin then - ASynEdit.Options := ASynEdit.Options - [eoHideRightMargin] - else - ASynEdit.Options := ASynEdit.Options + [eoHideRightMargin]; - - ApplyFontSettingsTo(ASynEdit); - //debugln(['TEditorOptions.GetSynEditSettings ',ASynEdit.font.height]); - - ASynEdit.ExtraCharSpacing := fExtraCharSpacing; - ASynEdit.ExtraLineSpacing := fExtraLineSpacing; - ASynEdit.MaxUndo := fUndoLimit; - // The Highlighter on the SynEdit will have been initialized with the configured - // values already (including all the additional-attributes. - // Just copy the colors from the SynEdit's highlighter to the SynEdit's Markup and co - SetMarkupColors(ASynEdit); - - MarkCaret := TSynEditMarkupHighlightAllCaret(ASynEdit.MarkupByClass[TSynEditMarkupHighlightAllCaret]); - if assigned(MarkCaret) then begin - if FMarkupCurWordNoTimer then - MarkCaret.WaitTime := 0 - else - MarkCaret.WaitTime := FMarkupCurWordTime; - MarkCaret.FullWord := FMarkupCurWordFullLen > 0; - MarkCaret.FullWordMaxLen := FMarkupCurWordFullLen; - MarkCaret.IgnoreKeywords := FMarkupCurWordNoKeyword; - MarkCaret.Trim := FMarkupCurWordTrim; - end; - - Markup := ASynEdit.MarkupByClass[TSynEditMarkupFoldColors]; - if (Markup <> nil) then - Markup.Enabled := FUseMarkupOutline; - - AssignKeyMapTo(ASynEdit, SimilarEdit); - - ASynEdit.MouseOptions := [emUseMouseActions]; - ASynEdit.MouseActions.Assign(FUserMouseSettings.MainActions); - ASynEdit.MouseSelActions.Assign(FUserMouseSettings.SelActions); - ASynEdit.MouseTextActions.Assign(FUserMouseSettings.TextActions); - ASynEdit.Gutter.MouseActions.Assign(FUserMouseSettings.GutterActions); - if ASynEdit.Gutter.CodeFoldPart <> nil then begin - ASynEdit.Gutter.CodeFoldPart.MouseActions.Assign(FUserMouseSettings.GutterActionsFold); - ASynEdit.Gutter.CodeFoldPart.MouseActionsCollapsed.Assign(FUserMouseSettings.GutterActionsFoldCol); - ASynEdit.Gutter.CodeFoldPart.MouseActionsExpanded.Assign(FUserMouseSettings.GutterActionsFoldExp); - end; - if ASynEdit.Gutter.LineNumberPart <> nil then begin - ASynEdit.Gutter.LineNumberPart.MouseActions.Assign(FUserMouseSettings.GutterActionsLines); - end; - if ASynEdit.Gutter.ChangesPart<> nil then - ASynEdit.Gutter.ChangesPart.MouseActions.Assign(FUserMouseSettings.GutterActionsChanges); - - if (ASynEdit.Gutter.SeparatorPart <> nil) and (GutterSeparatorIndex = 2) and ShowLineNumbers then - ASynEdit.Gutter.SeparatorPart.MouseActions.Assign(FUserMouseSettings.GutterActionsLines) - else - if (ASynEdit.Gutter.SeparatorPart <> nil) and (GutterSeparatorIndex >= 2) then - ASynEdit.Gutter.SeparatorPart.MouseActions.Assign(FUserMouseSettings.GutterActionsChanges); - if ASynEdit.RightGutter.LineOverviewPart <> nil then begin - ASynEdit.RightGutter.LineOverviewPart.MouseActions.Assign(FUserMouseSettings.GutterActionsOverView); - ASynEdit.RightGutter.LineOverviewPart.MouseActionsForMarks.Assign(FUserMouseSettings.GutterActionsOverViewMarks); - end; - - ASynEdit.ScrollOnEditLeftOptions.Assign(ScrollOnEditLeftOptions); - ASynEdit.ScrollOnEditRightOptions.Assign(ScrollOnEditRightOptions); - finally - ASynEdit.EndUpdate; - end; -end; - -function TEditorOptionsBase.GetCodeTemplateFileNameExpand:String; -begin - result:=fCodeTemplateFileNameRaw; - IDEMacros.SubstituteMacros(result); -end; - function TEditorOptionsBase.GetTabPosition: TTabPosition; begin Result := fTabPosition; end; -procedure TEditorOptionsBase.GetSynEditPreviewSettings(APreviewEditor: TObject); -// read synedit setings from config file -var - ASynEdit: TSynEdit; -begin - if not (APreviewEditor is TSynEdit) then - exit; - ASynEdit := TSynEdit(APreviewEditor); - - // Get real settings - GetSynEditSettings(ASynEdit); - - // Change to preview settings - ASynEdit.Options := ASynEdit.Options - - SynEditPreviewExcludeOptions + SynEditPreviewIncludeOptions; - ASynEdit.Options2 := ASynEdit.Options2 - SynEditPreviewExcludeOptions2; - ASynEdit.ReadOnly := True; -end; - { TEditorOptionsDefaults } constructor TEditorOptionsDefaults.Create; begin inherited Create; - Init; -end; - -procedure TEditorOptionsDefaults.GetUserColorSchemeGroupData; -// The defaults will not change. Reuse global singleton. -begin - FUserColorSchemeGroup := ColorSchemeFactory; + InitForRttiXmlConf; end; { TEditorOptions } @@ -5704,9 +4806,6 @@ var begin inherited Create; InitLocale; - FScrollOnEditLeftOptions := TSynScrollOnEditLeftOptions.Create; - FScrollOnEditRightOptions := TSynScrollOnEditRightOptions.Create; - ConfFileName := AppendPathDelim(GetPrimaryConfigPath) + EditOptsConfFileName; CopySecondaryConfigFile(EditOptsConfFileName); try @@ -5724,32 +4823,80 @@ begin XMLConfig := Nil; end; end; - // set defaults + InitForRttiXmlConf; Init; - // code templates (dci file) fCodeTemplateFileNameRaw := TrimFilename(AppendPathDelim(GetPrimaryConfigPath)+DefaultCodeTemplatesFilename); CopySecondaryConfigFile(DefaultCodeTemplatesFilename); - FMultiWinEditAccessOrder := TEditorOptionsEditAccessOrderList.Create; FMultiWinEditAccessOrder.InitDefaults; - + // Default values for RttiXmlConfig FDefaultValues := TEditorOptionsDefaults.Create; end; destructor TEditorOptions.Destroy; begin FreeAndNil(FDefaultValues); - FreeAndNil(FUserColorSchemeGroup); + FreeAndNil(fMultiWinEditAccessOrder); + FreeAndNil(fUserDefinedColors); + FreeAndNil(fUserColorSchemeGroup); + fUserMouseSettings.Free; + fTempMouseSettings.Free; + fKeyMap.Free; + XMLConfig.Free; inherited Destroy; end; -procedure TEditorOptions.GetUserColorSchemeGroupData; +procedure TEditorOptions.Init; begin + // General options + fSynEditOptions := SynEditDefaultOptions; + fSynEditOptions2 := SynEditDefaultOptions2; + fShowTabCloseButtons := True; + fHideSingleTabInWindow := False; + fCopyWordAtCursorOnCopyNone := True; + fShowGutterHints := True; + fBlockIndent := 2; + FBlockTabIndent := 0; + fBlockIndentType := sbitSpace; + fTrimSpaceType := settEditLine; + fUndoLimit := 32767; + fTabWidth := 8; + fBracketHighlightStyle := sbhsBoth; + // Display options + fGutterSeparatorIndex := 3; + fEditorFont := SynDefaultFontName; + fEditorFontSize := SynDefaultFontSize; + fDisableAntialiasing := DefaultEditorDisableAntiAliasing; + // Key Mappings + fKeyMappingScheme := KeyMapSchemeNames[kmsLazarus]; + fKeyMap := TKeyCommandRelationList.Create; + // Mouse Mappings + fUserMouseSettings := TEditorMouseOptions.Create; + fTempMouseSettings := TEditorMouseOptions.Create; + fUserMouseSettings.LoadUserSchemes; + // Color options + fHighlighterList := HighlighterListSingleton; FUserColorSchemeGroup := TColorSchemeFactory.Create; FUserColorSchemeGroup.Assign(ColorSchemeFactory); // Copy from global singleton. + fUserDefinedColors := TEditorUserDefinedWordsList.Create; + fUserDefinedColors.UseGlobalIDECommandList := True; + // Markup Current Word + fMarkupCurWordTime := 1500; + fMarkupCurWordFullLen := 3; + fMarkupCurWordNoKeyword := True; + fMarkupCurWordTrim := True; + fMarkupCurWordNoTimer := False; + // Code Tools + fAutoDisplayFuncPrototypes := True; +end; + +function TEditorOptions.GetCodeTemplateFileNameExpand: String; +begin + Result := fCodeTemplateFileNameRaw; + IDEMacros.SubstituteMacros(result); end; procedure TEditorOptions.Load; @@ -6167,6 +5314,793 @@ begin end; end; +function TEditorOptions.LoadCodeTemplates(AnAutoComplete: TSynEditAutoComplete + ): TModalResult; + + function ResourceDCIAsText: String; + var + data: TResourceStream; + i: Int64; + begin + data := TResourceStream.Create(HInstance, PChar('lazarus_dci_file'), PChar(RT_RCDATA)); + i := data.Size; + if i > 0 then begin + SetLength(Result, i); + data.Read(Result[1], i); + end; + data.Free; + end; + +var + s: String; + FileVersion, i, j, v: Integer; + NewAutoComplete: TSynEditAutoComplete; + Attr: TStringList; + Added: Boolean; +begin + s := CodeTemplateFileNameExpand; + Result := mrAbort; + if FileExistsUTF8(s) then begin + try + LoadStringsFromFileUTF8(AnAutoComplete.AutoCompleteList, s); + Result := mrOK; + except + Result := mrAbort; + end; + if Result = mrAbort then + exit; + + FileVersion := AnAutoComplete.Completions.Count; + if (FileVersion > 0) then begin + FileVersion := AnAutoComplete.CompletionAttributes[0].IndexOfName(DciFileVersionName); + if (FileVersion >= 0) then + FileVersion := StrToIntDef(AnAutoComplete.CompletionAttributes[0][FileVersion], 0); + end; + if FileVersion < DciFileVersion then begin + // Merge new entries + NewAutoComplete := TSynEditAutoComplete.Create(nil); + NewAutoComplete.AutoCompleteList.Text := ResourceDCIAsText; + Added := False; + for i := 0 to NewAutoComplete.Completions.Count - 1 do begin + j := NewAutoComplete.CompletionAttributes[i].IndexOfName(DciVersionName); + if j < 0 then + continue; + v := StrToIntDef(NewAutoComplete.CompletionAttributes[i][j], 0); + if v <= FileVersion then + continue; + if AnAutoComplete.Completions.IndexOf(NewAutoComplete.Completions[i]) >= 0 then + continue; + Attr := TStringList.Create; + Attr.Assign(NewAutoComplete.CompletionAttributes[i]); // will be owned by AnAutoComplete; + AnAutoComplete.AddCompletion( + NewAutoComplete.Completions[i], + NewAutoComplete.CompletionValues[i], + NewAutoComplete.CompletionComments[i], + Attr); + Added := True; + end; + NewAutoComplete.Free; + if Added then + if BuildBorlandDCIFile(AnAutoComplete) then + SaveCodeTemplates(AnAutoComplete); + end; + end + else begin + AnAutoComplete.AutoCompleteList.Text := ResourceDCIAsText; + end; +end; + +function TEditorOptions.SaveCodeTemplates(AnAutoComplete: TSynEditAutoComplete + ): TModalResult; +begin + try + SaveStringsToFileUTF8(AnAutoComplete.AutoCompleteList, CodeTemplateFileNameExpand); + Result := mrOK; + except + Result := mrAbort; + end; +end; + +procedure TEditorOptions.AssignKeyMapTo(ASynEdit: TSynEdit; SimilarEdit: TSynEdit); +var + c, i: Integer; +begin + if SimilarEdit<>nil then + ASynEdit.KeyStrokes.Assign(SimilarEdit.Keystrokes) + else + KeyMap.AssignTo(ASynEdit.KeyStrokes, TSourceEditorWindowInterface); + + c := ASynEdit.PluginCount - 1; + while (c >= 0) do begin + if SimilarEdit<>nil then begin + i := SimilarEdit.PluginCount - 1; + while (i >= 0) and not (SimilarEdit.Plugin[i].ClassType = ASynEdit.Plugin[c].ClassType) do + dec(i); + end + else + i:= -1; + + if (ASynEdit.Plugin[c] is TSynPluginTemplateEdit) then begin + TSynPluginTemplateEdit(ASynEdit.Plugin[c]).Keystrokes.Clear; + TSynPluginTemplateEdit(ASynEdit.Plugin[c]).KeystrokesOffCell.Clear; + if i >= 0 then begin + TSynPluginTemplateEdit(ASynEdit.Plugin[c]).Keystrokes.Assign( + TSynPluginTemplateEdit(SimilarEdit.Plugin[i]).KeyStrokes); + TSynPluginTemplateEdit(ASynEdit.Plugin[c]).KeystrokesOffCell.Assign( + TSynPluginTemplateEdit(SimilarEdit.Plugin[i]).KeystrokesOffCell); + end else begin + KeyMap.AssignTo(TSynPluginTemplateEdit(ASynEdit.Plugin[c]).Keystrokes, + TLazSynPluginTemplateEditForm, ecIdePTmplOffset); + KeyMap.AssignTo(TSynPluginTemplateEdit(ASynEdit.Plugin[c]).KeystrokesOffCell, + TLazSynPluginTemplateEditFormOff, ecIdePTmplOutOffset); + end; + end; + + if (ASynEdit.Plugin[c] is TSynPluginSyncroEdit) then begin + TSynPluginSyncroEdit(ASynEdit.Plugin[c]).KeystrokesSelecting.Clear; + TSynPluginSyncroEdit(ASynEdit.Plugin[c]).Keystrokes.Clear; + TSynPluginSyncroEdit(ASynEdit.Plugin[c]).KeystrokesOffCell.Clear; + if i >= 0 then begin + TSynPluginSyncroEdit(ASynEdit.Plugin[c]).KeystrokesSelecting.Assign( + TSynPluginSyncroEdit(SimilarEdit.Plugin[i]).KeystrokesSelecting); + TSynPluginSyncroEdit(ASynEdit.Plugin[c]).Keystrokes.Assign( + TSynPluginSyncroEdit(SimilarEdit.Plugin[i]).KeyStrokes); + TSynPluginSyncroEdit(ASynEdit.Plugin[c]).KeystrokesOffCell.Assign( + TSynPluginSyncroEdit(SimilarEdit.Plugin[i]).KeystrokesOffCell); + end else begin + KeyMap.AssignTo(TSynPluginSyncroEdit(ASynEdit.Plugin[c]).KeystrokesSelecting, + TLazSynPluginSyncroEditFormSel, ecIdePSyncroSelOffset); + KeyMap.AssignTo(TSynPluginSyncroEdit(ASynEdit.Plugin[c]).Keystrokes, + TLazSynPluginSyncroEditForm, ecIdePSyncroOffset); + KeyMap.AssignTo(TSynPluginSyncroEdit(ASynEdit.Plugin[c]).KeystrokesOffCell, + TLazSynPluginSyncroEditFormOff, ecIdePSyncroOutOffset); + end; + end; + + if (ASynEdit.Plugin[c] is TSynPluginMultiCaret) then begin + // Only ecPluginMultiCaretClearAll + // the others are handled in SynEdit.Keystrokes + TSynPluginMultiCaret(ASynEdit.Plugin[c]).Keystrokes.Clear; + if i >= 0 then begin + TSynPluginMultiCaret(ASynEdit.Plugin[c]).Keystrokes.Assign( + TSynPluginMultiCaret(SimilarEdit.Plugin[i]).KeyStrokes); + end else begin + KeyMap.AssignTo(TSynPluginMultiCaret(ASynEdit.Plugin[c]).Keystrokes, + TLazSynPluginTemplateMultiCaret, 0); //ecIdePTmplOffset); + end; + end; + + dec(c); + end; +end; + +function TEditorOptions.GetColorSchemeLanguage(aHighLighter: TSynCustomHighlighter; + SynColorSchemeName: String): TColorSchemeLanguage; +var + Scheme: TColorScheme; +begin + Result := nil; + // initialize with defaults + if SynColorSchemeName = '' then + SynColorSchemeName := ReadColorScheme(aHighLighter.LanguageName); + if (SynColorSchemeName = '') then + exit; + Scheme := UserColorSchemeGroup.ColorSchemeGroup[SynColorSchemeName]; + if Scheme = nil then + exit; + Result := Scheme.ColorSchemeBySynClass[aHighLighter.ClassType]; +end; + +function TEditorOptions.ReadColorScheme(const LanguageName: String): String; +(* The name of the currently chosen color-scheme for that language *) +begin + if LanguageName = '' then + begin + Result := ColorSchemeFactory.ColorSchemeGroupAtPos[0].Name; + exit; + end; + if LanguageName <> TPreviewPasSyn.GetLanguageName then + Result := XMLConfig.GetValue( + 'EditorOptions/Color/Lang' + StrToValidXMLName(LanguageName) + + '/ColorScheme/Value', '') + else + Result := ''; + if ColorSchemeFactory.ColorSchemeGroup[Result] = nil then + Result := ''; + if Result = '' then + Result := ReadPascalColorScheme; +end; + +function TEditorOptions.ReadPascalColorScheme: String; +(* The name of the currently chosen color-scheme for pascal code *) +var + FormatVersion: Integer; +begin + FormatVersion := XMLConfig.GetValue('EditorOptions/Color/Version', EditorOptsFormatVersion); + if FormatVersion > 1 then + Result := XMLConfig.GetValue( + 'EditorOptions/Color/Lang' + StrToValidXMLName( + TPreviewPasSyn.GetLanguageName) + '/ColorScheme/Value', '') + else + Result := XMLConfig.GetValue('EditorOptions/Color/ColorScheme', ''); + if ColorSchemeFactory.ColorSchemeGroup[Result] = nil then + Result := ''; + if (Result = '') then begin + if DefaultColorSchemeName <> '' then + Result := DefaultColorSchemeName + else + Result := ColorSchemeFactory.ColorSchemeGroupAtPos[0].Name; + end; +end; + +procedure TEditorOptions.WriteColorScheme(const LanguageName, SynColorScheme: String); +begin + if (LanguageName = '') or (SynColorScheme = '') then + exit; + XMLConfig.SetValue('EditorOptions/Color/Lang' + StrToValidXMLName( + LanguageName) + '/ColorScheme/Value', SynColorScheme); + XMLConfig.SetValue('EditorOptions/Color/Version', EditorOptsFormatVersion); +end; + +procedure TEditorOptions.ReadHighlighterSettings(Syn: TSrcIDEHighlighter; + SynColorScheme: String); +// if SynColorScheme='' then default ColorScheme will be used +var + LangScheme: TColorSchemeLanguage; +begin + LangScheme := GetColorSchemeLanguage(Syn, SynColorScheme); + if LangScheme = nil then + exit; + LangScheme.ApplyTo(Syn); +end; + +procedure TEditorOptions.ReadHighlighterFoldSettings(Syn: TSrcIDEHighlighter; + ReadForOptions: Boolean); +var + ConfName: String; + Path: String; + i, h, idx: Integer; + TheFoldInfo: TEditorOptionsFoldRecord; + DefHl, FoldHl: TSynCustomFoldHighlighter; +begin + h := HighlighterList.FindByHighlighter(Syn); + if h < 0 then + h := HighlighterList.FindByName(Syn.LanguageName); + if h < 0 then exit; + + if (syn is TSynCustomFoldHighlighter) then begin + DefHl := TSynCustomFoldHighlighter(TCustomSynClass(Syn.ClassType).Create(nil)); + try + ReadDefaultsForHighlighterFoldSettings(DefHl); + FoldHl := TSynCustomFoldHighlighter(Syn); + TheFoldInfo := EditorOptionsFoldDefaults[HighlighterList[h].TheType]; + for i := 0 to TheFoldInfo.Count - 1 do begin + idx := TheFoldInfo.Info^[i].Index; + ConfName := TheFoldInfo.Info^[i].Xml; + Path := 'EditorOptions/FoldConfig/Lang' + + StrToValidXMLName(Syn.LanguageName) + '/Type' + ConfName + '/' ; + // try reading the old config first + FoldHl.FoldConfig[idx].Enabled := + XMLConfig.GetValue(Path + 'Enabled/Value', FoldHl.FoldConfig[idx].Enabled); + XMLConfig.ReadObject(Path + 'Settings/', FoldHl.FoldConfig[idx], DefHl.FoldConfig[idx]); + + (* if ReadForOptions=True then Enabled appies only to fmFold,fmHide. + This allows to store what selection was previously active *) + if not ReadForOptions then begin + if (not FoldHl.FoldConfig[idx].Enabled) or (not FUseCodeFolding) then + FoldHl.FoldConfig[idx].Modes := FoldHl.FoldConfig[idx].Modes - [fmFold, fmHide]; + if (not FUseMarkupWordBracket) then + FoldHl.FoldConfig[idx].Modes := FoldHl.FoldConfig[idx].Modes - [fmMarkup]; + if (not FUseMarkupOutline) then + FoldHl.FoldConfig[idx].Modes := FoldHl.FoldConfig[idx].Modes - [fmOutline]; + + FoldHl.FoldConfig[idx].Enabled := FoldHl.FoldConfig[idx].Modes <> []; + end; + + if (FoldHl is TSynPasSyn) and (idx = ord(cfbtIfThen)) then begin + FoldHl.FoldConfig[ord(cfbtIfElse)].Modes := FoldHl.FoldConfig[idx].Modes * [fmOutline]; + FoldHl.FoldConfig[ord(cfbtIfElse)].Enabled := FoldHl.FoldConfig[idx].Enabled and (FoldHl.FoldConfig[ord(cfbtIfElse)].Modes <> []); + end; + + end; + finally + DefHl.Free; + end; + end; +end; + +procedure TEditorOptions.ReadDefaultsForHighlighterFoldSettings(Syn: TSrcIDEHighlighter); +var + i, h: Integer; + TheFoldInfo: TEditorOptionsFoldRecord; +begin + h := HighlighterList.FindByHighlighter(Syn); + if h < 0 then + h := HighlighterList.FindByName(Syn.LanguageName); + if h < 0 then exit; + if (syn is TSynCustomFoldHighlighter) then begin + TheFoldInfo := EditorOptionsFoldDefaults[HighlighterList[h].TheType]; + for i := 0 to TheFoldInfo.Count - 1 do + with TSynCustomFoldHighlighter(Syn).FoldConfig[TheFoldInfo.Info^[i].Index] do + Enabled := TheFoldInfo.Info^[i].Enabled; + end; +end; + +procedure TEditorOptions.WriteHighlighterFoldSettings(Syn: TSrcIDEHighlighter); +var + DefSyn: TSrcIDEHighlighter; + i, h: Integer; + Path: String; + ConfName: String; + TheFoldInfo: TEditorOptionsFoldRecord; +begin + h := HighlighterList.FindByHighlighter(Syn); + if h < 0 then + h := HighlighterList.FindByName(Syn.LanguageName); + if h < 0 then exit; + + DefSyn := TCustomSynClass(Syn.ClassType).Create(Nil); + try + ReadDefaultsForHighlighterFoldSettings(DefSyn); + + if (syn is TSynCustomFoldHighlighter) then begin + TheFoldInfo := EditorOptionsFoldDefaults[HighlighterList[h].TheType]; + for i := 0 to TheFoldInfo.Count - 1 do begin + ConfName := TheFoldInfo.Info^[i].Xml; + Path := 'EditorOptions/FoldConfig/Lang' + + StrToValidXMLName(Syn.LanguageName) + '/Type' + ConfName + '/' ; + XMLConfig.DeletePath(Path + 'Enabled/'); + XMLConfig.WriteObject(Path + 'Settings/', + TSynCustomFoldHighlighter(Syn).FoldConfig[TheFoldInfo.Info^[i].Index], + TSynCustomFoldHighlighter(DefSyn).FoldConfig[TheFoldInfo.Info^[i].Index]); + end; + end; + + finally + DefSyn.Free; + end; +end; + +procedure TEditorOptions.ReadHighlighterDivDrawSettings(Syn: TSrcIDEHighlighter); +var + TheInfo: TEditorOptionsDividerRecord; + Conf: TSynDividerDrawConfig; + ConfName: String; + Path: String; + i, h: Integer; +begin + h := HighlighterList.FindByHighlighter(Syn); + if h < 0 then + h := HighlighterList.FindByName(Syn.LanguageName); + if h < 0 then exit; + TheInfo := EditorOptionsDividerDefaults[HighlighterList[h].TheType]; + + ReadDefaultsForHighlighterDivDrawSettings(Syn); + + // read settings, that are different from the defaults + for i := 0 to TheInfo.Count - 1 do begin + Conf := Syn.DividerDrawConfig[i]; + ConfName := TheInfo.Info^[i].Xml; + Path := 'EditorOptions/DividerDraw/Lang' + StrToValidXMLName(Syn.LanguageName) + + '/Type' + ConfName + '/' ; + Conf.MaxDrawDepth := XMLConfig.GetValue(Path + 'MaxDepth/Value', + Conf.MaxDrawDepth); + Conf.TopColor := XMLConfig.GetValue(Path + 'TopColor/Value', + Conf.TopColor); + Conf.NestColor := XMLConfig.GetValue(Path + 'NestColor/Value', + Conf.NestColor); + end; +end; + +procedure TEditorOptions.ReadDefaultsForHighlighterDivDrawSettings(Syn: TSrcIDEHighlighter); +var + TheInfo: TEditorOptionsDividerRecord; + i, h: Integer; +begin + h := HighlighterList.FindByHighlighter(Syn); + if h < 0 then + h := HighlighterList.FindByName(Syn.LanguageName); + if h < 0 then exit; + TheInfo := EditorOptionsDividerDefaults[HighlighterList[h].TheType]; + for i := 0 to TheInfo.Count - 1 do begin + Syn.DividerDrawConfig[i].MaxDrawDepth := TheInfo.Info^[i].MaxLeveL; + Syn.DividerDrawConfig[i].TopColor := clDefault; + Syn.DividerDrawConfig[i].NestColor := clDefault; + end; +end; + +procedure TEditorOptions.WriteHighlighterDivDrawSettings(Syn: TSrcIDEHighlighter); +var + DefSyn: TSrcIDEHighlighter; + i, h: Integer; + Path: String; + Conf, DefConf: TSynDividerDrawConfig; + TheInfo: TEditorOptionsDividerRecord; + ConfName: String; +begin + h := HighlighterList.FindByHighlighter(Syn); + if h < 0 then + h := HighlighterList.FindByName(Syn.LanguageName); + if h < 0 then exit; + TheInfo := EditorOptionsDividerDefaults[HighlighterList[h].TheType]; + + DefSyn := TCustomSynClass(Syn.ClassType).Create(Nil); + try + ReadDefaultsForHighlighterDivDrawSettings(DefSyn); + for i := 0 to TheInfo.Count - 1 do begin + Conf := Syn.DividerDrawConfig[i]; + DefConf := DefSyn.DividerDrawConfig[i]; // default value + ConfName := TheInfo.Info^[i].Xml; + Path := 'EditorOptions/DividerDraw/Lang' + + StrToValidXMLName(Syn.LanguageName) + '/Type' + ConfName + '/' ; + XMLConfig.SetDeleteValue(Path + 'MaxDepth/Value', Conf.MaxDrawDepth, + DefConf.MaxDrawDepth); + XMLConfig.SetDeleteValue(Path + 'TopColor/Value', Conf.TopColor, + DefConf.TopColor); + XMLConfig.SetDeleteValue(Path + 'NestColor/Value', Conf.NestColor, + DefConf.NestColor); + end; + + finally + DefSyn.Free; + end; +end; + +procedure TEditorOptions.GetHighlighterSettings(Syn: TSrcIDEHighlighter); +// read highlight settings from config file +begin + ReadHighlighterSettings(Syn, ''); + ReadHighlighterFoldSettings(Syn); + ReadHighlighterDivDrawSettings(Syn); + if Syn is TSynPasSyn then begin + TSynPasSyn(Syn).ExtendedKeywordsMode := PasExtendedKeywordsMode; + TSynPasSyn(Syn).StringKeywordMode := PasStringKeywordMode; + end;; +end; + +procedure TEditorOptions.SetMarkupColor(Syn : TSrcIDEHighlighter; + AddHilightAttr : TAdditionalHilightAttribute; aMarkup : TSynSelectedColor); +var + SchemeGrp: TColorScheme; + Scheme: TColorSchemeLanguage; + Attrib: TColorSchemeAttribute; +begin + if assigned(Syn) then begin + Scheme := GetColorSchemeLanguage(Syn); + end else begin + SchemeGrp := UserColorSchemeGroup.ColorSchemeGroup[DefaultColorSchemeName]; + if SchemeGrp = nil then + exit; + Scheme := SchemeGrp.DefaultColors; + end; + + Attrib := Scheme.AttributeByEnum[AddHilightAttr]; + if Attrib <> nil then begin + Attrib.ApplyTo(aMarkup); + exit; + end; + + // set default + aMarkup.Foreground := clNone; + aMarkup.Background := clNone; + aMarkup.FrameColor := clNone; + aMarkup.FrameEdges := sfeAround; + aMarkup.FrameStyle := slsSolid; + aMarkup.Style := []; + aMarkup.StyleMask := []; +end; + +procedure TEditorOptions.SetMarkupColors(aSynEd: TSynEdit); +var + Scheme: TColorSchemeLanguage; +begin + // Find current color scheme for default colors + if (aSynEd.Highlighter = nil) then begin + aSynEd.Color := clWhite; + aSynEd.Font.Color := clBlack; + exit; + end; + // get current colorscheme: + Scheme := GetColorSchemeLanguage(aSynEd.Highlighter); + if Assigned(Scheme) then Scheme.ApplyTo(aSynEd); +end; + +procedure TEditorOptions.ApplyFontSettingsTo(ASynEdit: TSynEdit); +begin + ASynEdit.Font.Size := fEditorFontSize;// set size before name for XLFD ! + ASynEdit.Font.Name := fEditorFont; + if fDisableAntialiasing then + ASynEdit.Font.Quality := fqNonAntialiased + else + ASynEdit.Font.Quality := fqDefault; +end; + +function TEditorOptions.ExtensionToLazSyntaxHighlighter(Ext: String): TLazSyntaxHighlighter; +var + s, CurExt: String; + LangID, StartPos, EndPos: Integer; +begin + Result := lshNone; + if (Ext = '') or (Ext = '.') or (HighlighterList = Nil) then + exit; + Ext := lowercase(Ext); + if (Ext[1] = '.') then + Ext := copy(Ext, 2, length(Ext) - 1); + LangID := 0; + while LangID < HighlighterList.Count do + begin + s := HighlighterList[LangID].FileExtensions; + 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 + CurExt := copy(CurExt, 2, length(CurExt) - 1); + if lowercase(CurExt) = Ext then + begin + Result := HighlighterList[LangID].TheType; + exit; + end; + Startpos := EndPos + 1; + end; + inc(LangID); + end; +end; + +procedure TEditorOptions.GetSynEditSettings(ASynEdit: TSynEdit; SimilarEdit: TSynEdit); +// read synedit settings from config file +// if SimilarEdit is given it is used for speed up +var + MarkCaret: TSynEditMarkupHighlightAllCaret; + b: TSynBeautifierPascal; + i: Integer; + mw: TSourceSynEditMarkupHighlightAllMulti; + TermsConf: TEditorUserDefinedWords; + Markup: TSynEditMarkup; +begin + // general options + ASynEdit.BeginUpdate(False); + try + ASynEdit.Options := fSynEditOptions; + ASynEdit.Options2 := fSynEditOptions2; + ASynEdit.BlockIndent := fBlockIndent; + ASynEdit.BlockTabIndent := FBlockTabIndent; + (ASynEdit.Beautifier as TSynBeautifier).IndentType := fBlockIndentType; + if ASynEdit.Beautifier is TSynBeautifierPascal then begin + b := ASynEdit.Beautifier as TSynBeautifierPascal; + + if FAnsiCommentContinueEnabled then begin + b.AnsiCommentMode := sccPrefixMatch; + b.AnsiIndentMode := FAnsiIndentMode; + b.AnsiMatch := FAnsiCommentMatch; + b.AnsiPrefix := FAnsiCommentPrefix; + b.AnsiMatchLine := sclMatchPrev; + b.AnsiMatchMode := AnsiCommentMatchMode; + b.AnsiCommentIndent := sbitCopySpaceTab; + b.AnsiIndentFirstLineMax := AnsiIndentAlignMax; + end + else begin + b.AnsiCommentMode := sccNoPrefix; + b.AnsiIndentMode := []; + end; + + if FCurlyCommentContinueEnabled then begin + b.BorCommentMode := sccPrefixMatch; + b.BorIndentMode := FCurlyIndentMode; + b.BorMatch := FCurlyCommentMatch; + b.BorPrefix := FCurlyCommentPrefix; + b.BorMatchLine := sclMatchPrev; + b.BorMatchMode := CurlyCommentMatchMode; + b.BorCommentIndent := sbitCopySpaceTab; + b.BorIndentFirstLineMax := CurlyIndentAlignMax; + end + else begin + b.BorCommentMode := sccNoPrefix; + b.BorIndentMode := []; + end; + + if FSlashCommentContinueEnabled then begin + b.SlashCommentMode := sccPrefixMatch; + b.SlashIndentMode := FSlashIndentMode; + b.SlashMatch := FSlashCommentMatch; + b.SlashPrefix := FSlashCommentPrefix; + b.SlashMatchLine := sclMatchPrev; + b.SlashMatchMode := SlashCommentMatchMode; + b.SlashCommentIndent := sbitCopySpaceTab; + b.ExtendSlashCommentMode := FSlashCommentExtend; + b.SlashIndentFirstLineMax := SlashIndentAlignMax; + end + else begin + b.SlashCommentMode := sccNoPrefix; + b.SlashIndentMode := []; + end; + + b.StringBreakEnabled := FStringBreakEnabled; + b.StringBreakAppend := FStringBreakAppend; + b.StringBreakPrefix := FStringBreakPrefix; + + end; + + ASynEdit.TrimSpaceType := FTrimSpaceType; + ASynEdit.TabWidth := fTabWidth; + ASynEdit.BracketHighlightStyle := FBracketHighlightStyle; + {$IFDEF WinIME} + if ASynEdit is TIDESynEditor then begin + if UseMinimumIme + then TIDESynEditor(ASynEdit).CreateMinimumIme + else TIDESynEditor(ASynEdit).CreateFullIme; + end; + {$ENDIF} + + if ASynEdit is TIDESynEditor then begin + TIDESynEditor(ASynEdit).HighlightUserWordCount := UserDefinedColors.Count; + for i := 0 to UserDefinedColors.Count - 1 do begin + TermsConf := UserDefinedColors.Lists[i]; + mw := TIDESynEditor(ASynEdit).HighlightUserWords[i]; + if TermsConf.GlobalList or (not TermsConf.HasKeyAssigned) + then begin + if TermsConf.GlobalTermsCache = nil then + TermsConf.GlobalTermsCache := mw.Terms + else + mw.Terms := TermsConf.GlobalTermsCache; + end + else begin + if mw.Terms = TermsConf.GlobalTermsCache then + mw.Terms := nil; + if TermsConf.GlobalTermsCache <> nil then + TermsConf.GlobalTermsCache.Clear; + end; + + mw.MarkupInfo.Assign(TermsConf.ColorAttr); + mw.Clear; + mw.Terms.Assign(TermsConf); + mw.RestoreLocalChanges; + if TermsConf.AddTermCmd <> nil then + mw.AddTermCmd := TermsConf.AddTermCmd.Command; + if TermsConf.RemoveTermCmd <> nil then + mw.RemoveTermCmd := TermsConf.RemoveTermCmd.Command; + if TermsConf.ToggleTermCmd <> nil then + mw.ToggleTermCmd := TermsConf.ToggleTermCmd.Command; + mw.KeyAddTermBounds := TermsConf.KeyAddTermBounds; + mw.KeyAddCase := TermsConf.KeyAddCase; + mw.KeyAddWordBoundMaxLen := TermsConf.KeyAddWordBoundMaxLen; + mw.KeyAddSelectBoundMaxLen := TermsConf.KeyAddSelectBoundMaxLen; + mw.KeyAddSelectSmart := TermsConf.KeyAddSelectSmart; + end; + end; + + {$IFnDEF WithoutSynMultiCaret} + if ASynEdit is TIDESynEditor then begin + TIDESynEditor(ASynEdit).MultiCaret.EnableWithColumnSelection := MultiCaretOnColumnSelect; + TIDESynEditor(ASynEdit).MultiCaret.DefaultMode := FMultiCaretDefaultMode; + TIDESynEditor(ASynEdit).MultiCaret.DefaultColumnSelectMode := FMultiCaretDefaultColumnSelectMode; + if FMultiCaretDeleteSkipLineBreak + then TIDESynEditor(ASynEdit).MultiCaret.Options := TIDESynEditor(ASynEdit).MultiCaret.Options + [smcoDeleteSkipLineBreak] + else TIDESynEditor(ASynEdit).MultiCaret.Options := TIDESynEditor(ASynEdit).MultiCaret.Options - [smcoDeleteSkipLineBreak]; + end; + {$ENDIF} + + // Display options + ASynEdit.Gutter.Visible := fVisibleGutter; + ASynEdit.Gutter.AutoSize := true; + ASynEdit.Gutter.LineNumberPart.Visible := fShowLineNumbers; + ASynEdit.Gutter.LineNumberPart(0).ShowOnlyLineNumbersMultiplesOf := + fShowOnlyLineNumbersMultiplesOf; + ASynEdit.RightGutter.Visible := ShowOverviewGutter; + if ASynEdit is TIDESynEditor then + TIDESynEditor(ASynEdit).ShowTopInfo := TopInfoView; + + ASynEdit.Gutter.CodeFoldPart.Visible := FUseCodeFolding; + if not FUseCodeFolding then + ASynEdit.UnfoldAll; + ASynEdit.Gutter.CodeFoldPart.ReversePopMenuOrder := ReverseFoldPopUpOrder; + + ASynEdit.Gutter.Width := fGutterWidth; + ASynEdit.Gutter.SeparatorPart.Visible := FGutterSeparatorIndex <> -1; + if FGutterSeparatorIndex <> -1 then + ASynEdit.Gutter.SeparatorPart(0).Index := FGutterSeparatorIndex; + + ASynEdit.RightEdge := fRightMargin; + if fVisibleRightMargin then + ASynEdit.Options := ASynEdit.Options - [eoHideRightMargin] + else + ASynEdit.Options := ASynEdit.Options + [eoHideRightMargin]; + + ApplyFontSettingsTo(ASynEdit); + //debugln(['TEditorOptions.GetSynEditSettings ',ASynEdit.font.height]); + + ASynEdit.ExtraCharSpacing := fExtraCharSpacing; + ASynEdit.ExtraLineSpacing := fExtraLineSpacing; + ASynEdit.MaxUndo := fUndoLimit; + // The Highlighter on the SynEdit will have been initialized with the configured + // values already (including all the additional-attributes. + // Just copy the colors from the SynEdit's highlighter to the SynEdit's Markup and co + SetMarkupColors(ASynEdit); + + MarkCaret := TSynEditMarkupHighlightAllCaret(ASynEdit.MarkupByClass[TSynEditMarkupHighlightAllCaret]); + if assigned(MarkCaret) then begin + if FMarkupCurWordNoTimer then + MarkCaret.WaitTime := 0 + else + MarkCaret.WaitTime := FMarkupCurWordTime; + MarkCaret.FullWord := FMarkupCurWordFullLen > 0; + MarkCaret.FullWordMaxLen := FMarkupCurWordFullLen; + MarkCaret.IgnoreKeywords := FMarkupCurWordNoKeyword; + MarkCaret.Trim := FMarkupCurWordTrim; + end; + + Markup := ASynEdit.MarkupByClass[TSynEditMarkupFoldColors]; + if (Markup <> nil) then + Markup.Enabled := FUseMarkupOutline; + + AssignKeyMapTo(ASynEdit, SimilarEdit); + + ASynEdit.MouseOptions := [emUseMouseActions]; + ASynEdit.MouseActions.Assign(FUserMouseSettings.MainActions); + ASynEdit.MouseSelActions.Assign(FUserMouseSettings.SelActions); + ASynEdit.MouseTextActions.Assign(FUserMouseSettings.TextActions); + ASynEdit.Gutter.MouseActions.Assign(FUserMouseSettings.GutterActions); + if ASynEdit.Gutter.CodeFoldPart <> nil then begin + ASynEdit.Gutter.CodeFoldPart.MouseActions.Assign(FUserMouseSettings.GutterActionsFold); + ASynEdit.Gutter.CodeFoldPart.MouseActionsCollapsed.Assign(FUserMouseSettings.GutterActionsFoldCol); + ASynEdit.Gutter.CodeFoldPart.MouseActionsExpanded.Assign(FUserMouseSettings.GutterActionsFoldExp); + end; + if ASynEdit.Gutter.LineNumberPart <> nil then begin + ASynEdit.Gutter.LineNumberPart.MouseActions.Assign(FUserMouseSettings.GutterActionsLines); + end; + if ASynEdit.Gutter.ChangesPart<> nil then + ASynEdit.Gutter.ChangesPart.MouseActions.Assign(FUserMouseSettings.GutterActionsChanges); + + if (ASynEdit.Gutter.SeparatorPart <> nil) and (GutterSeparatorIndex = 2) and ShowLineNumbers then + ASynEdit.Gutter.SeparatorPart.MouseActions.Assign(FUserMouseSettings.GutterActionsLines) + else + if (ASynEdit.Gutter.SeparatorPart <> nil) and (GutterSeparatorIndex >= 2) then + ASynEdit.Gutter.SeparatorPart.MouseActions.Assign(FUserMouseSettings.GutterActionsChanges); + if ASynEdit.RightGutter.LineOverviewPart <> nil then begin + ASynEdit.RightGutter.LineOverviewPart.MouseActions.Assign(FUserMouseSettings.GutterActionsOverView); + ASynEdit.RightGutter.LineOverviewPart.MouseActionsForMarks.Assign(FUserMouseSettings.GutterActionsOverViewMarks); + end; + + ASynEdit.ScrollOnEditLeftOptions.Assign(ScrollOnEditLeftOptions); + ASynEdit.ScrollOnEditRightOptions.Assign(ScrollOnEditRightOptions); + finally + ASynEdit.EndUpdate; + end; +end; + +function TEditorOptions.CreateSyn(LazSynHilighter: TLazSyntaxHighlighter): TSrcIDEHighlighter; +begin + if LazSyntaxHighlighterClasses[LazSynHilighter] <> Nil then + begin + Result := LazSyntaxHighlighterClasses[LazSynHilighter].Create(Nil); + GetHighlighterSettings(Result); + end + else + Result := Nil; +end; + +procedure TEditorOptions.GetSynEditPreviewSettings(APreviewEditor: TObject); +// read synedit setings from config file +var + ASynEdit: TSynEdit; +begin + if not (APreviewEditor is TSynEdit) then + exit; + ASynEdit := TSynEdit(APreviewEditor); + + // Get real settings + GetSynEditSettings(ASynEdit); + + // Change to preview settings + ASynEdit.Options := ASynEdit.Options + - SynEditPreviewExcludeOptions + SynEditPreviewIncludeOptions; + ASynEdit.Options2 := ASynEdit.Options2 - SynEditPreviewExcludeOptions2; + ASynEdit.ReadOnly := True; +end; + { TColorSchemeAttribute } procedure TColorSchemeAttribute.SetMarkupFoldLineAlpha(AValue: Byte); diff --git a/ide/main.pp b/ide/main.pp index 6218ee8aca..4776488f1f 100644 --- a/ide/main.pp +++ b/ide/main.pp @@ -5314,8 +5314,8 @@ end; procedure TMainIDE.PackageTranslated(APackage: TLazPackage); begin - if APackage=PackageGraph.SynEditPackage then - EditorOpts.TranslateResourceStrings; + //if APackage=PackageGraph.SynEditPackage then + // EditorOpts.TranslateResourceStrings; // ToDo end; function TMainIDE.DoOpenComponent(const UnitFilename: string;