diff --git a/lazproj/coedit.lpi b/lazproj/coedit.lpi index 012c5c5f..af489897 100644 --- a/lazproj/coedit.lpi +++ b/lazproj/coedit.lpi @@ -140,7 +140,7 @@ - + @@ -356,6 +356,11 @@ + + + + + diff --git a/lazproj/coedit.lpr b/lazproj/coedit.lpr index ec5a945e..331a5174 100644 --- a/lazproj/coedit.lpr +++ b/lazproj/coedit.lpr @@ -8,7 +8,7 @@ uses {$ENDIF}{$ENDIF} Interfaces, Forms, lazcontrols, runtimetypeinfocontrols, ce_observer, ce_libman, ce_tools, ce_dcd, ce_main, ce_writableComponent, ce_options, ce_symstring, - ce_staticmacro, ce_inspectors, LResources; + ce_staticmacro, ce_inspectors, LResources, ce_editoroptions; {$R *.res} diff --git a/src/ce_editoroptions.pas b/src/ce_editoroptions.pas new file mode 100644 index 00000000..05b129b2 --- /dev/null +++ b/src/ce_editoroptions.pas @@ -0,0 +1,238 @@ +unit ce_editoroptions; + +{$I ce_defines.inc} + +interface + +uses + Classes, SysUtils, Graphics, SynEdit, SynEditMouseCmds, + ce_interfaces, ce_observer, ce_common, ce_writableComponent, ce_synmemo, + ce_d2syn, ce_txtsyn; + +type + + TDHighligthOptions = class(TPersistent) + + end; + + TTxtHighligthOptions = class(TPersistent) + + end; + + (** + * Container for the editor and highlither options. + * The base class is also used to backup settings + * to allow settings to be previewed in live and restored + * when not accepted. + *) + TCEEditorOptionsBase = class(TWritableLfmTextComponent) + private + fDHlOptions: TPersistent; + fTxtHlOptions: TPersistent; + fFont: TFont; + // + fTabWidth: Integer; + fBlockIdent: Integer; + fLineSpacing: Integer; + fCharSpacing: Integer; + fOptions1: TSynEditorOptions; + fOptions2: TSynEditorOptions2; + fMouseOptions: TSynEditorMouseOptions; + // + procedure setFont(aFont: TFont); + published + property tabulationWidth: Integer read fTabWidth write fTabWidth; + property blockIdentation: Integer read fBlockIdent write fBlockIdent; + property lineSpacing: Integer read fLineSpacing write fLineSpacing; + property characterSpacing: Integer read fCharSpacing write fCharSpacing; + property font: TFont read fFont write setFont; + property options1: TSynEditorOptions read fOptions1 write fOptions1; + property options2: TSynEditorOptions2 read fOptions2 write fOptions2; + property mouseOptions: TSynEditorMouseOptions read fMouseOptions write fMouseOptions; + + property D_colorizer: TPersistent read fDHlOptions; + property TXT_colorizer: TPersistent read fTxtHlOptions; + public + constructor Create(AOwner: TComponent); override; + // + procedure assign(src: TPersistent); override; + end; + + (** + * Manages and exposes all the editor and highligther options to an TCEOptionsEditor. + *) + TCEEditorOptions = class(TCEEditorOptionsBase, ICEEditableOptions, ICEMultiDocObserver) + private + fBackup: TCEEditorOptionsBase; + // + function optionedWantCategory(): string; + function optionedWantEditorKind: TOptionEditorKind; + function optionedWantContainer: TPersistent; + procedure optionedEvent(anEvent: TOptionEditorEvent); + // + procedure docNew(aDoc: TCESynMemo); + procedure docFocused(aDoc: TCESynMemo); + procedure docChanged(aDoc: TCESynMemo); + procedure docClosing(aDoc: TCESynMemo); + // + procedure applyChangesFromSelf; + procedure applyChangeToEditor(anEditor: TCESynMemo); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + end; + +var + EditorOptions: TCEEditorOptions; + +implementation + +{$REGION Standard Comp/Obj -----------------------------------------------------} +constructor TCEEditorOptionsBase.Create(AOwner: TComponent); +begin + inherited; + fDHlOptions := D2Syn; + fTxtHlOptions := TxtSyn; + // + fFont := TFont.Create; + fFont.Size := 10; + fFont.Name := 'Courier New'; + fFont.Quality := fqProof; + fFont.Pitch := fpFixed; + fFont.Size:= 10; + // + tabulationWidth := 4; + blockIdentation := 4; + // + options1 := + [eoAutoIndent, eoBracketHighlight, eoGroupUndo, eoTabsToSpaces, + eoDragDropEditing, eoShowCtrlMouseLinks, eoEnhanceHomeKey, eoTabIndent]; + options2 := + [eoEnhanceEndKey, eoFoldedCopyPaste, eoOverwriteBlock]; + // + mouseOptions := MouseOptions + + [emAltSetsColumnMode, emDragDropEditing, emCtrlWheelZoom, emShowCtrlMouseLinks]; +end; + +constructor TCEEditorOptions.Create(AOwner: TComponent); +begin + inherited; + fBackup := TCEEditorOptionsBase.Create(self); + EntitiesConnector.addObserver(self); +end; + +destructor TCEEditorOptions.Destroy; +begin + EntitiesConnector.removeObserver(self); + inherited; +end; + +procedure TCEEditorOptionsBase.assign(src: TPersistent); +var + srcopt: TCEEditorOptionsBase; +begin + if (src is TCEEditorOptionsBase) then + begin + srcopt := TCEEditorOptionsBase(src); + // + font.Assign(srcopt.font); + tabulationWidth := srcopt.tabulationWidth; + blockIdentation := srcopt.blockIdentation; + lineSpacing := srcopt.lineSpacing; + characterSpacing:= srcopt.characterSpacing; + options1 := srcopt.options1; + options2 := srcopt.options2; + mouseOptions := srcopt.mouseOptions; + end + else inherited; +end; + +procedure TCEEditorOptionsBase.setFont(aFont: TFont); +begin + fFont.Assign(aFont); +end; +{$ENDREGION} + +{$REGION ICEMultiDocObserver ----------------------------------------------------} +procedure TCEEditorOptions.docNew(aDoc: TCESynMemo); +begin + applyChangeToEditor(aDoc); +end; + +procedure TCEEditorOptions.docFocused(aDoc: TCESynMemo); +begin +end; + +procedure TCEEditorOptions.docChanged(aDoc: TCESynMemo); +begin +end; + +procedure TCEEditorOptions.docClosing(aDoc: TCESynMemo); +begin +end; +{$ENDREGION} + +{$REGION ICEEditableOptions ----------------------------------------------------} +function TCEEditorOptions.optionedWantCategory(): string; +begin + exit('Editor'); +end; + +function TCEEditorOptions.optionedWantEditorKind: TOptionEditorKind; +begin + exit(oekAbstract); +end; + +function TCEEditorOptions.optionedWantContainer: TPersistent; +begin + fBackup.Assign(self); + exit(self); +end; + +procedure TCEEditorOptions.optionedEvent(anEvent: TOptionEditorEvent); +begin + // restores + if anEvent = oeeCancel then + self.assign(fBackup); + // apply + applyChangesFromSelf; + // new backup values based on accepted values. + if anEvent = oeeAccept then + fBackup.assign(self); +end; +{$ENDREGION} + +{$REGION ICEEditableOptions ----------------------------------------------------} +procedure TCEEditorOptions.applyChangesFromSelf; +var + multied: ICEMultiDocHandler; + i: Integer; +begin + // editors + multied := getMultiDocHandler; + for i := 0 to multied.documentCount-1 do + applyChangeToEditor(multied.document[i]); + // highlighter(s) + // ... +end; + +procedure TCEEditorOptions.applyChangeToEditor(anEditor: TCESynMemo); +begin + anEditor.Font.Assign(font); + anEditor.TabWidth := tabulationWidth; + anEditor.BlockIndent := blockIdentation; + anEditor.ExtraLineSpacing := lineSpacing; + anEditor.ExtraCharSpacing := characterSpacing; + anEditor.Options := options1; + anEditor.Options2 := options2; + anEditor.MouseOptions := mouseOptions; +end; +{$ENDREGION} + + +initialization + EditorOptions := TCEEditorOptions.Create(nil); +finalization + EditorOptions.Free; +end. + diff --git a/src/ce_synmemo.pas b/src/ce_synmemo.pas index 3ac53bca..50d7b3a2 100644 --- a/src/ce_synmemo.pas +++ b/src/ce_synmemo.pas @@ -7,7 +7,8 @@ interface uses Classes, SysUtils, SynEdit, ce_d2syn, ce_txtsyn ,SynEditHighlighter, controls, lcltype, LazSynEditText, SynEditKeyCmds, SynHighlighterLFM, SynEditMouseCmds, - SynEditFoldedView, crc, ce_common, ce_observer, ce_writableComponent, Forms; + SynEditFoldedView, crc, ce_common, ce_observer, ce_writableComponent, Forms, + graphics; type @@ -129,9 +130,7 @@ var implementation uses - graphics, ce_interfaces, ce_staticmacro, ce_dcd, SynEditHighlighterFoldBase; - - + ce_interfaces, ce_staticmacro, ce_dcd, SynEditHighlighterFoldBase; constructor TCEEditorHintWindow.Create(AOwner: TComponent); begin @@ -318,20 +317,7 @@ constructor TCESynMemo.Create(aOwner: TComponent); begin inherited; SetDefaultKeystrokes; // not called in inherited if owner = nil ! - Font.Quality := fqProof; - Font.Pitch := fpFixed; - Font.Size:= 10; - TabWidth := 4; - BlockIndent := 4; - Options := - [eoAutoIndent, eoBracketHighlight, eoGroupUndo, eoTabsToSpaces, - eoDragDropEditing, eoShowCtrlMouseLinks, eoEnhanceHomeKey, eoTabIndent]; - Options2 := - [eoEnhanceEndKey, eoFoldedCopyPaste, eoOverwriteBlock]; - fStoredFontSize := Font.Size; - - MouseOptions := MouseOptions + - [emAltSetsColumnMode, emDragDropEditing, emCtrlWheelZoom, emShowCtrlMouseLinks]; + fStoredFontSize := 10; Gutter.LineNumberPart.ShowOnlyLineNumbersMultiplesOf := 5; Gutter.LineNumberPart.MarkupInfo.Foreground := clGray; Gutter.SeparatorPart.LineOffset := 1; @@ -541,10 +527,11 @@ end; procedure TCESynMemo.MouseMove(Shift: TShiftState; X, Y: Integer); begin + fMousePos := PixelsToRowColumn(Point(X,Y)); + Application.HideHint; inherited; if ssLeft in Shift then identifierToD2Syn; - fMousePos := PixelsToRowColumn(Point(X,Y)); end; procedure TCESynMemo.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y:Integer);