diff --git a/components/synedit/synedit.pp b/components/synedit/synedit.pp index 297df5f013..3864e2f8ea 100644 --- a/components/synedit/synedit.pp +++ b/components/synedit/synedit.pp @@ -1604,6 +1604,7 @@ begin UpdateCaret; if fStatusChanges <> [] then DoOnStatusChange(fStatusChanges); + fMarkupHighCaret.CheckState; // Todo need a global lock, including the markup end; end; @@ -7312,6 +7313,8 @@ begin EcUnFoldCurrent: FFoldedLinesView.UnFoldAtTextIndex(CaretY-1); {$ENDIF} + EcToggleMarkupWord: + FMarkupHighCaret.ToggleCurrentWord; end; finally DecPaintLock; diff --git a/components/synedit/syneditkeycmds.pp b/components/synedit/syneditkeycmds.pp index 666371956d..e6c293b637 100644 --- a/components/synedit/syneditkeycmds.pp +++ b/components/synedit/syneditkeycmds.pp @@ -177,6 +177,7 @@ const EcFoldLevel0 = EcFoldLevel9 + 1; EcFoldCurrent = 381; EcUnFoldCurrent = 382; + EcToggleMarkupWord = 383; ecDeleteLastChar = 501; // Delete last char (i.e. backspace key) ecDeleteChar = 502; // Delete char at cursor (i.e. delete key) @@ -407,7 +408,7 @@ type {$ENDIF} const - EditorCommandStrs: array[0..111] of TIdentMapEntry = ( + EditorCommandStrs: array[0..112] of TIdentMapEntry = ( (Value: ecNone; Name: 'ecNone'), (Value: ecLeft; Name: 'ecLeft'), (Value: ecRight; Name: 'ecRight'), @@ -519,7 +520,8 @@ const (Value: EcFoldLevel9; Name: 'EcFoldLevel9'), (Value: EcFoldLevel0; Name: 'EcFoldLevel0'), (Value: EcFoldCurrent; Name: 'EcFoldCurrent'), - (Value: EcUnFoldCurrent; Name: 'EcUnFoldCurrent') + (Value: EcUnFoldCurrent; Name: 'EcUnFoldCurrent'), + (Value: EcToggleMarkupWord; Name: 'EcToggleMarkupWord') ); procedure GetEditorCommandValues(Proc: TGetStrProc); @@ -958,6 +960,7 @@ begin AddKey(ecFoldLevel0, ord('0'), [ssAlt,ssShift]); AddKey(ecFoldCurrent, ord('-'), [ssAlt,ssShift]); AddKey(ecUnFoldCurrent, ord('+'), [ssAlt,ssShift]); + AddKey(EcToggleMarkupWord, ord('M'), [ssAlt]); AddKey(ecNormalSelect, ord('N'), [ssCtrl,ssShift]); AddKey(ecColumnSelect, ord('C'), [ssCtrl,ssShift]); AddKey(ecLineSelect, ord('L'), [ssCtrl,ssShift]); diff --git a/components/synedit/syneditmarkuphighall.pp b/components/synedit/syneditmarkuphighall.pp index bbf323231c..ab56ab7957 100644 --- a/components/synedit/syneditmarkuphighall.pp +++ b/components/synedit/syneditmarkuphighall.pp @@ -27,7 +27,8 @@ interface uses Classes, SysUtils, ExtCtrls, SynEditMarkup, SynEditTypes, SynEditSearch, - SynEditMiscClasses, Controls, LCLProc, SynEditHighlighter, SynEditPointClasses; + SynEditMiscClasses, Controls, LCLProc, SynEditHighlighter, SynEditPointClasses, + SynEditMiscProcs; type @@ -103,15 +104,17 @@ type Procedure FindStartPoint; Procedure FindInitialize(Backward: Boolean); + function GetMatchCount: Integer; Procedure ValidateMatches; procedure SetSearchOptions(const AValue : TSynSearchOptions); - procedure SetSearchString(const AValue : String); protected + procedure SetSearchString(const AValue : String); virtual; procedure DoTopLineChanged(OldTopLine : Integer); override; procedure DoLinesInWindoChanged(OldLinesInWindow : Integer); override; procedure DoMarkupChanged(AMarkup: TSynSelectedColor); override; procedure DoTextChanged(StartLine, EndLine: Integer); override; property HideSingleMatch: Boolean read FHideSingleMatch write FHideSingleMatch; + property MatchCount: Integer read GetMatchCount; public constructor Create(ASynEdit : TCustomControl); destructor Destroy; override; @@ -131,19 +134,27 @@ type TSynEditMarkupHighlightAllCaret = class(TSynEditMarkupHighlightAll) private FTimer: TTimer; + FTrim: Boolean; FWaitTime: Integer; FFullWord: Boolean; FFullWordMaxLen: Integer; FIgnoreKeywords: Boolean; FSelection: TSynEditSelection; FHighlighter: TSynCustomHighlighter; + FLowBound, FUpBound, FOldLowBound, FOldUpBound: TPoint; + FToggledWord: String; + FToggledOption: TSynSearchOptions; + FStateChanged: Boolean; procedure SetFullWord(const AValue: Boolean); procedure SetFullWordMaxLen(const AValue: Integer); procedure SetHighlighter(const AValue: TSynCustomHighlighter); procedure SetIgnoreKeywords(const AValue: Boolean); procedure SetSelection(const AValue: TSynEditSelection); + procedure SetTrim(const AValue: Boolean); procedure SetWaitTime(const AValue: Integer); + function LogicalCaret: TPoint; protected + procedure SetSearchString(const AValue : String); override; procedure SelectionChanged(Sender: TObject); procedure DoCaretChanged(OldCaret : TPoint); override; procedure DoTextChanged(StartLine, EndLine : Integer); override; @@ -155,7 +166,10 @@ type public constructor Create(ASynEdit : TCustomControl); destructor Destroy; override; + procedure CheckState; // Todo need a global lock, including the markup + procedure ToggleCurrentWord; property WaitTime: Integer read FWaitTime write SetWaitTime; + property Trim: Boolean read FTrim write SetTrim; property FullWord: Boolean read FFullWord write SetFullWord; property FullWordMaxLen: Integer read FFullWordMaxLen write SetFullWordMaxLen; property IgnoreKeywords: Boolean read FIgnoreKeywords write SetIgnoreKeywords; @@ -361,6 +375,11 @@ begin fSearch.Backwards := Backward; end; +function TSynEditMarkupHighlightAll.GetMatchCount: Integer; +begin + Result := fMatches.Count; +end; + procedure TSynEditMarkupHighlightAll.FindStartPoint; var ptStart, ptEnd, ptFoundStart, ptFoundEnd: TPoint; @@ -405,13 +424,13 @@ begin While (true) do begin if not fSearch.FindNextOne(Lines, ptStart, ptEnd, ptFoundStart, ptFoundEnd) then break; - if ptFoundStart.Y > LastLine - then break; ptStart := ptFoundEnd; - { TODO: skip if all folded } fMatches.StartPoint[Pos] := LogicalToPhysicalPos(ptFoundStart); fMatches.EndPoint[Pos]:= LogicalToPhysicalPos(ptFoundEnd); + + if ptFoundStart.Y > LastLine + then break; inc(Pos); end; @@ -547,15 +566,24 @@ begin if FWaitTime = AValue then exit; FWaitTime := AValue; FTimer.Interval := FWaitTime; + if FWaitTime = 0 then + SearchString := ''; RestartTimer; end; -procedure TSynEditMarkupHighlightAllCaret.SelectionChanged(Sender: TObject); +function TSynEditMarkupHighlightAllCaret.LogicalCaret: TPoint; begin - if (SearchString = GetCurrentText) and (SearchOptions = GetCurrentOption) then - exit; - SearchString := ''; - RestartTimer; + Result := TCustomSynEdit(SynEdit).PhysicalToLogicalPos + (TCustomSynEdit(SynEdit).CaretXY); +end; + +procedure TSynEditMarkupHighlightAllCaret.SetSearchString(const AValue: String); +begin + inherited SetSearchString(AValue); + if AValue = '' then + FLowBound.X := -1; + FOldLowBound := FLowBound; + FOldUpBound := FUpBound; end; procedure TSynEditMarkupHighlightAllCaret.SetFullWord(const AValue: Boolean); @@ -595,18 +623,55 @@ begin FSelection.AddChangeHandler({$IFDEF FPC}@{$ENDIF}SelectionChanged); end; -procedure TSynEditMarkupHighlightAllCaret.DoCaretChanged(OldCaret: TPoint); +procedure TSynEditMarkupHighlightAllCaret.SetTrim(const AValue: Boolean); begin - if (SearchString = GetCurrentText) and (SearchOptions = GetCurrentOption) then + if FTrim = AValue then exit; + FTrim := AValue; + ScrollTimerHandler(self); +end; + +procedure TSynEditMarkupHighlightAllCaret.CheckState; +var + t: String; +begin + if not FStateChanged then exit; + FStateChanged := False; + t := GetCurrentText; + if (SearchString = t) and (SearchOptions = GetCurrentOption) then begin + SearchString := t; // Update old bounds + exit; + end; + if (SearchString <> '') and + ( ((CompareCarets(FLowBound, FOldLowBound) = 0) and + (CompareCarets(LogicalCaret, FUpBound) >= 0) and (MatchCount > 1) ) + OR ((CompareCarets(FUpBound, FOldUpBound) = 0) and + (CompareCarets(LogicalCaret, FLowBound) <= 0) and (MatchCount > 1) ) + ) then begin + ScrollTimerHandler(self); + exit; + end; + SearchString := ''; RestartTimer; end; +procedure TSynEditMarkupHighlightAllCaret.SelectionChanged(Sender: TObject); +begin + FStateChanged := True; // Something changed, paint will be called + inherited; +end; + +procedure TSynEditMarkupHighlightAllCaret.DoCaretChanged(OldCaret: TPoint); +begin + FStateChanged := True; // Something changed, paint will be called + inherited; +end; + procedure TSynEditMarkupHighlightAllCaret.DoTextChanged(StartLine, EndLine: Integer); begin - SearchString := ''; - RestartTimer; + FStateChanged := True; // Something changed, paint will be called + inherited; end; procedure TSynEditMarkupHighlightAllCaret.DoMarkupChanged(AMarkup: TSynSelectedColor); @@ -618,7 +683,7 @@ end; procedure TSynEditMarkupHighlightAllCaret.RestartTimer; begin FTimer.Enabled := False; - if MarkupInfo.IsEnabled then + if (MarkupInfo.IsEnabled) and (FWaitTime > 0) then FTimer.Enabled := True; end; @@ -633,20 +698,43 @@ begin end; function TSynEditMarkupHighlightAllCaret.GetCurrentText: String; + function TrimS(s: String): String; + var + i: Integer; + begin + i := 1; + while (i <= length(s)) and (s[i] in [#1..#32]) do inc(i); + Result := copy(s, i, MaxInt); + i := length(Result); + while (i > 0) and (Result[i] in [#1..#32]) do dec(i); + Result := copy(Result, 1, i); + end; begin - If TCustomSynEdit(SynEdit).SelAvail then - Result := TCustomSynEdit(SynEdit).SelText - else begin - Result := TCustomSynEdit(SynEdit).GetWordAtRowCol - (TCustomSynEdit(SynEdit).PhysicalToLogicalPos(TCustomSynEdit(SynEdit).CaretXY)); + if FToggledWord <> '' then + exit(FToggledWord); + If TCustomSynEdit(SynEdit).SelAvail then begin + if FTrim then + Result := TrimS(TCustomSynEdit(SynEdit).SelText) + else + Result := TCustomSynEdit(SynEdit).SelText; + if TrimS(Result) = '' then Result := ''; + FLowBound := TCustomSynEdit(SynEdit).BlockBegin; + FUpBound := TCustomSynEdit(SynEdit).BlockEnd; + end else begin + Result := TCustomSynEdit(SynEdit).GetWordAtRowCol(LogicalCaret); if FIgnoreKeywords and assigned(FHighlighter) and FHighlighter.IsKeyword(Result) then Result := ''; + FLowBound.Y := LogicalCaret.Y; + FUpBound.Y := LogicalCaret.Y; + TCustomSynEdit(SynEdit).GetWordBoundsAtRowCol(LogicalCaret, FLowBound.X, FUpBound.X); end; end; function TSynEditMarkupHighlightAllCaret.GetCurrentOption: TSynSearchOptions; begin + if FToggledWord <> '' then + exit(FToggledOption); If TCustomSynEdit(SynEdit).SelAvail or not(FFullWord) then Result := [] else @@ -659,10 +747,16 @@ end; constructor TSynEditMarkupHighlightAllCaret.Create(ASynEdit: TCustomControl); begin inherited Create(ASynEdit); + FStateChanged := False; MarkupInfo.Clear; HideSingleMatch := True; FFullWord := False; FWaitTime := 1500; + FTrim := True; + FLowBound := Point(-1, -1); + FUpBound := Point(-1, -1); + FOldLowBound := Point(-1, -1); + FOldUpBound := Point(-1, -1); FTimer := TTimer.Create(nil); FTimer.Enabled := False; FTimer.Interval := FWaitTime; @@ -677,5 +771,29 @@ begin inherited Destroy; end; +procedure TSynEditMarkupHighlightAllCaret.ToggleCurrentWord; +var + s: String; +begin + if FToggledWord = '' then begin + FToggledWord := GetCurrentText; + FToggledOption := GetCurrentOption; + end else begin + s := FToggledWord; + FToggledWord := ''; + if GetCurrentText <> s then begin + FToggledWord := GetCurrentText; + FToggledOption := GetCurrentOption; + end; + end; + SearchString := FToggledWord; + SearchOptions := GetCurrentOption; + if FToggledWord = '' then begin + RestartTimer; + end else begin + ScrollTimerHandler(self); + end; +end; + end. diff --git a/ide/editoroptions.pp b/ide/editoroptions.pp index 3e5be30a67..719cb9791c 100644 --- a/ide/editoroptions.pp +++ b/ide/editoroptions.pp @@ -469,6 +469,8 @@ type FMarkupCurWordFull: Boolean; FMarkupCurWordFullLen: Integer; FMarkupCurWordNoKeyword: Boolean; + FMarkupCurWordTrim: Boolean; + FMarkupCurWordNoTimer: Boolean; // Code tools options (MG: these will move to an unit of their own) fAutoIdentifierCompletion: Boolean; @@ -595,11 +597,14 @@ type read FMarkupCurWordTime write FMarkupCurWordTime default 1500; property MarkupCurWordFull: Boolean read FMarkupCurWordFull write FMarkupCurWordFull default False; - 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 AutoIdentifierCompletion: Boolean @@ -1409,6 +1414,8 @@ begin FMarkupCurWordFull := False; FMarkupCurWordFullLen := 3; FMarkupCurWordNoKeyword := False; + FMarkupCurWordTrim := True; + FMarkupCurWordNoTimer := False; // Code Tools options fCodeTemplateFileName := SetDirSeparators(GetPrimaryConfigPath + '/lazarus.dci'); @@ -1588,6 +1595,12 @@ begin FMarkupCurWordNoKeyword := XMLConfig.GetValue( 'EditorOptions/Display/MarkupCurrentWord/NoKeyword', False); + FMarkupCurWordTrim := + XMLConfig.GetValue( + 'EditorOptions/Display/MarkupCurrentWord/Trim', True); + FMarkupCurWordNoTimer := + XMLConfig.GetValue( + 'EditorOptions/Display/MarkupCurrentWord/NoTimer', False); // Code Tools options fAutoIdentifierCompletion := @@ -1744,6 +1757,10 @@ begin FMarkupCurWordFullLen, 3); XMLConfig.SetDeleteValue('EditorOptions/Display/MarkupCurrentWord/NoKeyword', FMarkupCurWordNoKeyword, False); + XMLConfig.SetDeleteValue('EditorOptions/Display/MarkupCurrentWord/Trim', + FMarkupCurWordTrim, True); + XMLConfig.SetDeleteValue('EditorOptions/Display/MarkupCurrentWord/NoTimer', + FMarkupCurWordNoTimer, False); // Code Tools options XMLConfig.SetDeleteValue('EditorOptions/CodeTools/AutoIdentifierCompletion' @@ -2363,10 +2380,14 @@ begin MarkCaret := TSynEditMarkupHighlightAllCaret(ASynEdit.MarkupByClass[TSynEditMarkupHighlightAllCaret]); if assigned(MarkCaret) then begin MarkCaret.Enabled := FMarkupCurWordEnabled; - MarkCaret.WaitTime := FMarkupCurWordTime; + if FMarkupCurWordNoTimer then + MarkCaret.WaitTime := 0 + else + MarkCaret.WaitTime := FMarkupCurWordTime; MarkCaret.FullWord := FMarkupCurWordFull; MarkCaret.FullWordMaxLen := FMarkupCurWordFullLen; MarkCaret.IgnoreKeywords := FMarkupCurWordNoKeyword; + MarkCaret.Trim := FMarkupCurWordTrim; end; // Code Folding @@ -2410,10 +2431,15 @@ begin MarkCaret := TSynEditMarkupHighlightAllCaret(ASynEdit.MarkupByClass[TSynEditMarkupHighlightAllCaret]); if assigned(MarkCaret) then begin FMarkupCurWordEnabled := MarkCaret.Enabled; - FMarkupCurWordTime := MarkCaret.WaitTime; + FMarkupCurWordNoTimer := MarkCaret.WaitTime = 0; + if FMarkupCurWordNoTimer then + FMarkupCurWordTime := 1500 + else + FMarkupCurWordTime := MarkCaret.WaitTime; FMarkupCurWordFull := MarkCaret.FullWord; FMarkupCurWordFullLen := MarkCaret.FullWordMaxLen; FMarkupCurWordNoKeyword := MarkCaret.IgnoreKeywords; + FMarkupCurWordTrim := MarkCaret.Trim; end; end; diff --git a/ide/frames/editor_codetools_options.lfm b/ide/frames/editor_codetools_options.lfm index 4994e60058..2f14210f77 100644 --- a/ide/frames/editor_codetools_options.lfm +++ b/ide/frames/editor_codetools_options.lfm @@ -5,8 +5,8 @@ inherited EditorCodetoolsOptionsFrame: TEditorCodetoolsOptionsFrame ClientWidth = 496 TabOrder = 0 Visible = False - DesignLeft = 46 - DesignTop = 46 + DesignLeft = 23 + DesignTop = 23 object AutoDelayMaxLabel: TLabel[0] AnchorSideTop.Control = AutoDelayTrackBar AnchorSideTop.Side = asrBottom @@ -86,17 +86,16 @@ inherited EditorCodetoolsOptionsFrame: TEditorCodetoolsOptionsFrame ParentColor = False end object MarkupWordFullLenLabel: TLabel[6] - AnchorSideLeft.Control = Owner + AnchorSideLeft.Control = MarkupWordFullCheckBox AnchorSideTop.Control = MarkupWordEnabledCheckBox AnchorSideTop.Side = asrBottom AnchorSideRight.Control = MarkupWordFullLenSpin - Left = 307 + Left = 230 Height = 16 Top = 236 Width = 137 - Anchors = [akTop, akRight] + BorderSpacing.Left = 230 BorderSpacing.Top = 6 - BorderSpacing.Right = 4 Caption = 'MarkupWordFullLenLabel' ParentColor = False end @@ -234,17 +233,44 @@ inherited EditorCodetoolsOptionsFrame: TEditorCodetoolsOptionsFrame TabOrder = 9 end object MarkupWordFullLenSpin: TSpinEdit[17] - AnchorSideLeft.Control = Owner + AnchorSideLeft.Control = MarkupWordFullLenLabel + AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = MarkupWordEnabledCheckBox AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom - Left = 448 + Left = 373 Height = 19 Top = 236 Width = 48 - Anchors = [akTop, akRight] + BorderSpacing.Left = 6 BorderSpacing.Top = 6 TabOrder = 10 end + object MarkupWordNoTimerCheckBox: TCheckBox[18] + AnchorSideLeft.Control = MarkupWordEnabledCheckBox + AnchorSideTop.Control = AutoDelayLabel + AnchorSideTop.Side = asrBottom + Left = 230 + Height = 19 + Top = 211 + Width = 171 + BorderSpacing.Left = 230 + BorderSpacing.Top = 6 + Caption = 'MarkupWordNoTimerCheckBox' + TabOrder = 11 + end + object MarkupWordTrim: TCheckBox[19] + AnchorSideLeft.Control = MarkupWordNoKeyword + AnchorSideTop.Control = MarkupWordFullCheckBox + AnchorSideTop.Side = asrBottom + Left = 230 + Height = 19 + Top = 261 + Width = 102 + BorderSpacing.Left = 230 + BorderSpacing.Top = 6 + Caption = 'MarkupWordTrim' + TabOrder = 12 + end end diff --git a/ide/frames/editor_codetools_options.lrs b/ide/frames/editor_codetools_options.lrs index 8234c9720a..ff238c683a 100644 --- a/ide/frames/editor_codetools_options.lrs +++ b/ide/frames/editor_codetools_options.lrs @@ -3,7 +3,7 @@ LazarusResources.Add('TEditorCodetoolsOptionsFrame','FORMDATA',[ 'TPF0'#241#28'TEditorCodetoolsOptionsFrame'#27'EditorCodetoolsOptionsFrame'#6 +'Height'#3#184#1#5'Width'#3#240#1#12'ClientHeight'#3#184#1#11'ClientWidth'#3 - +#240#1#8'TabOrder'#2#0#7'Visible'#8#10'DesignLeft'#2'.'#9'DesignTop'#2'.'#0 + +#240#1#8'TabOrder'#2#0#7'Visible'#8#10'DesignLeft'#2#23#9'DesignTop'#2#23#0 +#242#2#0#6'TLabel'#17'AutoDelayMaxLabel'#21'AnchorSideTop.Control'#7#17'Auto' +'DelayTrackBar'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'AnchorSideRight.Con' +'trol'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#3#134#1#6 @@ -32,63 +32,73 @@ LazarusResources.Add('TEditorCodetoolsOptionsFrame','FORMDATA',[ +'MarkupWordTimeTrackBar'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Left'#2#0#6 +'Height'#2#16#3'Top'#3'^'#1#5'Width'#3#128#0#17'BorderSpacing.Top'#2#24#7'Ca' +'ption'#6#20'MarkupWordDelayLabel'#11'ParentColor'#8#0#0#242#2#6#6'TLabel'#22 - +'MarkupWordFullLenLabel'#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSide' - +'Top.Control'#7#25'MarkupWordEnabledCheckBox'#18'AnchorSideTop.Side'#7#9'asr' - +'Bottom'#23'AnchorSideRight.Control'#7#21'MarkupWordFullLenSpin'#4'Left'#3'3' - +#1#6'Height'#2#16#3'Top'#3#236#0#5'Width'#3#137#0#7'Anchors'#11#5'akTop'#7'a' - +'kRight'#0#17'BorderSpacing.Top'#2#6#19'BorderSpacing.Right'#2#4#7'Caption'#6 - +#22'MarkupWordFullLenLabel'#11'ParentColor'#8#0#0#242#2#7#9'TCheckBox AutoId' - +'entifierCompletionCheckBox'#22'AnchorSideLeft.Control'#7#5'Owner'#21'Anchor' - +'SideTop.Control'#7#5'Owner'#4'Left'#2#0#6'Height'#2#19#3'Top'#2#0#5'Width'#3 - +#183#0#7'Caption'#6' AutoIdentifierCompletionCheckBox'#8'TabOrder'#2#0#0#0 - +#242#2#8#9'TCheckBox'#28'AutoRemoveEmptyMethodsOnSave'#22'AnchorSideLeft.Con' - +'trol'#7#5'Owner'#21'AnchorSideTop.Control'#7' AutoIdentifierCompletionCheck' - +'Box'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Left'#2#0#6'Height'#2#19#3'Top' - +#2#25#5'Width'#3#191#0#17'BorderSpacing.Top'#2#6#7'Caption'#6#28'AutoRemoveE' - +'mptyMethodsOnSave'#8'TabOrder'#2#1#0#0#242#2#9#9'TCheckBox'#28'AutoToolTipS' - +'ymbToolsCheckBox'#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSideTop.Co' - +'ntrol'#7#28'AutoRemoveEmptyMethodsOnSave'#18'AnchorSideTop.Side'#7#9'asrBot' - +'tom'#4'Left'#2#0#6'Height'#2#19#3'Top'#2'2'#5'Width'#3#179#0#17'BorderSpaci' - +'ng.Top'#2#6#7'Caption'#6#28'AutoToolTipSymbToolsCheckBox'#8'TabOrder'#2#2#0 - +#0#242#2#10#9'TCheckBox'#26'AutoCodeParametersCheckBox'#22'AnchorSideLeft.Co' - +'ntrol'#7#5'Owner'#21'AnchorSideTop.Control'#7#28'AutoToolTipSymbToolsCheckB' - +'ox'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Left'#2#0#6'Height'#2#19#3'Top' - +#2'K'#5'Width'#3#169#0#17'BorderSpacing.Top'#2#6#7'Caption'#6#26'AutoCodePar' - +'ametersCheckBox'#7'Enabled'#8#8'TabOrder'#2#3#0#0#242#2#11#9'TCheckBox'#27 - +'AutoToolTipExprEvalCheckBox'#22'AnchorSideLeft.Control'#7#5'Owner'#21'Ancho' - +'rSideTop.Control'#7#26'AutoCodeParametersCheckBox'#18'AnchorSideTop.Side'#7 - +#9'asrBottom'#4'Left'#2#0#6'Height'#2#19#3'Top'#2'd'#5'Width'#3#169#0#17'Bor' - +'derSpacing.Top'#2#6#7'Caption'#6#27'AutoToolTipExprEvalCheckBox'#8'TabOrder' - +#2#4#0#0#242#2#12#9'TTrackBar'#17'AutoDelayTrackBar'#22'AnchorSideLeft.Contr' - +'ol'#7#5'Owner'#21'AnchorSideTop.Control'#7#27'AutoToolTipExprEvalCheckBox' - +#18'AnchorSideTop.Side'#7#9'asrBottom'#23'AnchorSideRight.Control'#7#5'Owner' - +#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#2#0#6'Height'#2'('#3'Top'#2 - +'}'#5'Width'#3#240#1#9'Frequency'#3#250#0#3'Max'#3#160#15#3'Min'#3#244#1#8'P' - +'osition'#3#244#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#17'BorderSpa' - ,'cing.Top'#2#6#5'Ctl3D'#8#8'TabOrder'#2#5#0#0#242#2#13#9'TCheckBox'#25'Marku' - +'pWordEnabledCheckBox'#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSideTo' - +'p.Control'#7#14'AutoDelayLabel'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Lef' - +'t'#2#0#6'Height'#2#19#3'Top'#3#211#0#5'Width'#3#170#0#17'BorderSpacing.Top' - +#2#6#7'Caption'#6#25'MarkupWordEnabledCheckBox'#8'TabOrder'#2#6#0#0#242#2#14 - +#9'TTrackBar'#22'MarkupWordTimeTrackBar'#22'AnchorSideLeft.Control'#7#5'Owne' - +'r'#21'AnchorSideTop.Control'#7#19'MarkupWordNoKeyword'#18'AnchorSideTop.Sid' - +'e'#7#9'asrBottom'#23'AnchorSideRight.Control'#7#5'Owner'#20'AnchorSideRight' - +'.Side'#7#9'asrBottom'#4'Left'#2#0#6'Height'#2'('#3'Top'#3#30#1#5'Width'#3 - +#240#1#9'Frequency'#3#250#0#3'Max'#3#160#15#3'Min'#3#244#1#8'Position'#3#244 - +#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#17'BorderSpacing.Top'#2#6#5 - +'Ctl3D'#8#8'TabOrder'#2#7#0#0#242#2#15#9'TCheckBox'#22'MarkupWordFullCheckBo' - +'x'#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSideTop.Control'#7#25'Mar' - +'kupWordEnabledCheckBox'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Left'#2#0#6 - +'Height'#2#19#3'Top'#3#236#0#5'Width'#3#147#0#17'BorderSpacing.Top'#2#6#7'Ca' - +'ption'#6#22'MarkupWordFullCheckBox'#8'TabOrder'#2#8#0#0#242#2#16#9'TCheckBo' - +'x'#19'MarkupWordNoKeyword'#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorS' - +'ideTop.Control'#7#22'MarkupWordFullCheckBox'#18'AnchorSideTop.Side'#7#9'asr' - +'Bottom'#4'Left'#2#0#6'Height'#2#19#3'Top'#3#5#1#5'Width'#3#137#0#17'BorderS' - +'pacing.Top'#2#6#7'Caption'#6#19'MarkupWordNoKeyword'#8'TabOrder'#2#9#0#0#242 - +#2#17#9'TSpinEdit'#21'MarkupWordFullLenSpin'#22'AnchorSideLeft.Control'#7#5 - +'Owner'#21'AnchorSideTop.Control'#7#25'MarkupWordEnabledCheckBox'#18'AnchorS' - +'ideTop.Side'#7#9'asrBottom'#23'AnchorSideRight.Control'#7#5'Owner'#20'Ancho' - +'rSideRight.Side'#7#9'asrBottom'#4'Left'#3#192#1#6'Height'#2#19#3'Top'#3#236 - +#0#5'Width'#2'0'#7'Anchors'#11#5'akTop'#7'akRight'#0#17'BorderSpacing.Top'#2 - +#6#8'TabOrder'#2#10#0#0#0 + +'MarkupWordFullLenLabel'#22'AnchorSideLeft.Control'#7#22'MarkupWordFullCheck' + +'Box'#21'AnchorSideTop.Control'#7#25'MarkupWordEnabledCheckBox'#18'AnchorSid' + +'eTop.Side'#7#9'asrBottom'#23'AnchorSideRight.Control'#7#21'MarkupWordFullLe' + +'nSpin'#4'Left'#3#230#0#6'Height'#2#16#3'Top'#3#236#0#5'Width'#3#137#0#18'Bo' + +'rderSpacing.Left'#3#230#0#17'BorderSpacing.Top'#2#6#7'Caption'#6#22'MarkupW' + +'ordFullLenLabel'#11'ParentColor'#8#0#0#242#2#7#9'TCheckBox AutoIdentifierCo' + +'mpletionCheckBox'#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSideTop.Co' + +'ntrol'#7#5'Owner'#4'Left'#2#0#6'Height'#2#19#3'Top'#2#0#5'Width'#3#183#0#7 + +'Caption'#6' AutoIdentifierCompletionCheckBox'#8'TabOrder'#2#0#0#0#242#2#8#9 + +'TCheckBox'#28'AutoRemoveEmptyMethodsOnSave'#22'AnchorSideLeft.Control'#7#5 + +'Owner'#21'AnchorSideTop.Control'#7' AutoIdentifierCompletionCheckBox'#18'An' + +'chorSideTop.Side'#7#9'asrBottom'#4'Left'#2#0#6'Height'#2#19#3'Top'#2#25#5'W' + +'idth'#3#191#0#17'BorderSpacing.Top'#2#6#7'Caption'#6#28'AutoRemoveEmptyMeth' + +'odsOnSave'#8'TabOrder'#2#1#0#0#242#2#9#9'TCheckBox'#28'AutoToolTipSymbTools' + +'CheckBox'#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSideTop.Control'#7 + +#28'AutoRemoveEmptyMethodsOnSave'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Le' + +'ft'#2#0#6'Height'#2#19#3'Top'#2'2'#5'Width'#3#179#0#17'BorderSpacing.Top'#2 + +#6#7'Caption'#6#28'AutoToolTipSymbToolsCheckBox'#8'TabOrder'#2#2#0#0#242#2#10 + +#9'TCheckBox'#26'AutoCodeParametersCheckBox'#22'AnchorSideLeft.Control'#7#5 + +'Owner'#21'AnchorSideTop.Control'#7#28'AutoToolTipSymbToolsCheckBox'#18'Anch' + +'orSideTop.Side'#7#9'asrBottom'#4'Left'#2#0#6'Height'#2#19#3'Top'#2'K'#5'Wid' + +'th'#3#169#0#17'BorderSpacing.Top'#2#6#7'Caption'#6#26'AutoCodeParametersChe' + +'ckBox'#7'Enabled'#8#8'TabOrder'#2#3#0#0#242#2#11#9'TCheckBox'#27'AutoToolTi' + +'pExprEvalCheckBox'#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSideTop.C' + +'ontrol'#7#26'AutoCodeParametersCheckBox'#18'AnchorSideTop.Side'#7#9'asrBott' + +'om'#4'Left'#2#0#6'Height'#2#19#3'Top'#2'd'#5'Width'#3#169#0#17'BorderSpacin' + +'g.Top'#2#6#7'Caption'#6#27'AutoToolTipExprEvalCheckBox'#8'TabOrder'#2#4#0#0 + +#242#2#12#9'TTrackBar'#17'AutoDelayTrackBar'#22'AnchorSideLeft.Control'#7#5 + +'Owner'#21'AnchorSideTop.Control'#7#27'AutoToolTipExprEvalCheckBox'#18'Ancho' + +'rSideTop.Side'#7#9'asrBottom'#23'AnchorSideRight.Control'#7#5'Owner'#20'Anc' + +'horSideRight.Side'#7#9'asrBottom'#4'Left'#2#0#6'Height'#2'('#3'Top'#2'}'#5 + +'Width'#3#240#1#9'Frequency'#3#250#0#3'Max'#3#160#15#3'Min'#3#244#1#8'Positi' + +'on'#3#244#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#17'BorderSpacing.' + ,'Top'#2#6#5'Ctl3D'#8#8'TabOrder'#2#5#0#0#242#2#13#9'TCheckBox'#25'MarkupWord' + +'EnabledCheckBox'#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSideTop.Con' + +'trol'#7#14'AutoDelayLabel'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Left'#2#0 + +#6'Height'#2#19#3'Top'#3#211#0#5'Width'#3#170#0#17'BorderSpacing.Top'#2#6#7 + +'Caption'#6#25'MarkupWordEnabledCheckBox'#8'TabOrder'#2#6#0#0#242#2#14#9'TTr' + +'ackBar'#22'MarkupWordTimeTrackBar'#22'AnchorSideLeft.Control'#7#5'Owner'#21 + +'AnchorSideTop.Control'#7#19'MarkupWordNoKeyword'#18'AnchorSideTop.Side'#7#9 + +'asrBottom'#23'AnchorSideRight.Control'#7#5'Owner'#20'AnchorSideRight.Side'#7 + +#9'asrBottom'#4'Left'#2#0#6'Height'#2'('#3'Top'#3#30#1#5'Width'#3#240#1#9'Fr' + +'equency'#3#250#0#3'Max'#3#160#15#3'Min'#3#244#1#8'Position'#3#244#1#7'Ancho' + +'rs'#11#5'akTop'#6'akLeft'#7'akRight'#0#17'BorderSpacing.Top'#2#6#5'Ctl3D'#8 + +#8'TabOrder'#2#7#0#0#242#2#15#9'TCheckBox'#22'MarkupWordFullCheckBox'#22'Anc' + +'horSideLeft.Control'#7#5'Owner'#21'AnchorSideTop.Control'#7#25'MarkupWordEn' + +'abledCheckBox'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Left'#2#0#6'Height'#2 + +#19#3'Top'#3#236#0#5'Width'#3#147#0#17'BorderSpacing.Top'#2#6#7'Caption'#6#22 + +'MarkupWordFullCheckBox'#8'TabOrder'#2#8#0#0#242#2#16#9'TCheckBox'#19'Markup' + +'WordNoKeyword'#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSideTop.Contr' + +'ol'#7#22'MarkupWordFullCheckBox'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Le' + +'ft'#2#0#6'Height'#2#19#3'Top'#3#5#1#5'Width'#3#137#0#17'BorderSpacing.Top'#2 + +#6#7'Caption'#6#19'MarkupWordNoKeyword'#8'TabOrder'#2#9#0#0#242#2#17#9'TSpin' + +'Edit'#21'MarkupWordFullLenSpin'#22'AnchorSideLeft.Control'#7#22'MarkupWordF' + +'ullLenLabel'#19'AnchorSideLeft.Side'#7#9'asrBottom'#21'AnchorSideTop.Contro' + +'l'#7#25'MarkupWordEnabledCheckBox'#18'AnchorSideTop.Side'#7#9'asrBottom'#23 + +'AnchorSideRight.Control'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom' + +#4'Left'#3'u'#1#6'Height'#2#19#3'Top'#3#236#0#5'Width'#2'0'#18'BorderSpacing' + +'.Left'#2#6#17'BorderSpacing.Top'#2#6#8'TabOrder'#2#10#0#0#242#2#18#9'TCheck' + +'Box'#25'MarkupWordNoTimerCheckBox'#22'AnchorSideLeft.Control'#7#25'MarkupWo' + +'rdEnabledCheckBox'#21'AnchorSideTop.Control'#7#14'AutoDelayLabel'#18'Anchor' + +'SideTop.Side'#7#9'asrBottom'#4'Left'#3#230#0#6'Height'#2#19#3'Top'#3#211#0#5 + +'Width'#3#171#0#18'BorderSpacing.Left'#3#230#0#17'BorderSpacing.Top'#2#6#7'C' + +'aption'#6#25'MarkupWordNoTimerCheckBox'#8'TabOrder'#2#11#0#0#242#2#19#9'TCh' + +'eckBox'#14'MarkupWordTrim'#22'AnchorSideLeft.Control'#7#19'MarkupWordNoKeyw' + +'ord'#21'AnchorSideTop.Control'#7#22'MarkupWordFullCheckBox'#18'AnchorSideTo' + +'p.Side'#7#9'asrBottom'#4'Left'#3#230#0#6'Height'#2#19#3'Top'#3#5#1#5'Width' + +#2'f'#18'BorderSpacing.Left'#3#230#0#17'BorderSpacing.Top'#2#6#7'Caption'#6 + +#14'MarkupWordTrim'#8'TabOrder'#2#12#0#0#0 ]); diff --git a/ide/frames/editor_codetools_options.pas b/ide/frames/editor_codetools_options.pas index 840c650c55..71f5eb63b0 100644 --- a/ide/frames/editor_codetools_options.pas +++ b/ide/frames/editor_codetools_options.pas @@ -40,6 +40,7 @@ type AutoIdentifierCompletionCheckBox: TCheckBox; AutoToolTipExprEvalCheckBox: TCheckBox; MarkupWordDelayLabel: TLabel; + MarkupWordNoTimerCheckBox: TCheckBox; MarkupWordFullCheckBox: TCheckBox; MarkupWordFullLenSpin: TSpinEdit; MarkupWordFullLenLabel: TLabel; @@ -47,6 +48,7 @@ type MarkupWordMaxLabel: TLabel; MarkupWordMinLabel: TLabel; MarkupWordEnabledCheckBox: TCheckBox; + MarkupWordTrim: TCheckBox; MarkupWordTimeTrackBar: TTrackBar; AutoToolTipSymbToolsCheckBox: TCheckBox; AutoRemoveEmptyMethodsOnSave: TCheckBox; @@ -88,6 +90,8 @@ begin MarkupWordMaxLabel.Caption := '4.0 ' + DlgTimeSecondUnit;; MarkupWordFullLenLabel.Caption := dlgMarkupWordFullLen; MarkupWordNoKeyword.Caption := dlgMarkupWordNoKeyword; + MarkupWordTrim.Caption := dlgMarkupWordTrim; + MarkupWordNoTimerCheckBox.Caption := dlgMarkupWordNoTimer; end; procedure TEditorCodetoolsOptionsFrame.ReadSettings(AOptions: TAbstractIDEOptions); @@ -105,6 +109,8 @@ begin MarkupWordTimeTrackBar.Position := MarkupCurWordTime; MarkupWordFullLenSpin. Value := MarkupCurWordFullLen; MarkupWordNoKeyword.Checked := MarkupCurWordNoKeyword; + MarkupWordTrim.Checked := MarkupCurWordTrim; + MarkupWordNoTimerCheckBox.Checked := MarkupCurWordNoTimer; end; end; @@ -123,6 +129,8 @@ begin MarkupCurWordTime := MarkupWordTimeTrackBar.Position; MarkupCurWordFullLen := MarkupWordFullLenSpin.Value; MarkupCurWordNoKeyword := MarkupWordNoKeyword.Checked; + MarkupCurWordTrim := MarkupWordTrim.Checked; + MarkupCurWordNoTimer := MarkupWordNoTimerCheckBox.Checked; end; end; diff --git a/ide/keymapping.pp b/ide/keymapping.pp index de0f3f7aa7..f015118809 100644 --- a/ide/keymapping.pp +++ b/ide/keymapping.pp @@ -422,6 +422,7 @@ begin EcFoldLevel0: SetResult(VK_0,[ssAlt,ssShift],VK_UNKNOWN,[]); EcFoldCurrent: SetResult(VK_OEM_MINUS,[ssAlt,ssShift],VK_UNKNOWN,[]); EcUnFoldCurrent: SetResult(VK_OEM_PLUS,[ssAlt,ssShift],VK_UNKNOWN,[]); + EcToggleMarkupWord: SetResult(VK_M,[ssAlt],VK_UNKNOWN,[]); // file menu ecNew: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); @@ -753,6 +754,7 @@ begin EcFoldLevel0: SetResult(VK_0,[ssAlt,ssShift],VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[]); EcFoldCurrent: SetResult(VK_OEM_PLUS,[ssAlt,ssShift],VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[]); EcUnFoldCurrent: SetResult(VK_OEM_MINUS,[ssAlt,ssShift],VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[]); + EcToggleMarkupWord: SetResult(VK_M,[ssAlt],VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[]); // file menu ecNew: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[]); @@ -1272,6 +1274,7 @@ begin EcFoldLevel0: SetResult(VK_0,[ssAlt,ssShift],VK_UNKNOWN,[]); EcFoldCurrent: SetResult(VK_OEM_PLUS,[ssAlt,ssShift],VK_UNKNOWN,[]); EcUnFoldCurrent: SetResult(VK_OEM_MINUS,[ssAlt,ssShift],VK_UNKNOWN,[]); + EcToggleMarkupWord: SetResult(VK_M,[ssAlt],VK_UNKNOWN,[]); // file menu ecNew: SetResult(VK_N,[ssMeta],VK_UNKNOWN,[]); @@ -1587,6 +1590,7 @@ begin EcFoldLevel0 : Result:= srkmecUnFoldAll; EcFoldCurrent : Result:= srkmecFoldCurrent; EcUnFoldCurrent : Result:= srkmecUnFoldCurrent; + EcToggleMarkupWord : Result := srkmecToggleMarkupWord; // file menu ecNew : Result:= lisMenuNewOther; @@ -1988,6 +1992,7 @@ begin AddDefault(C, 'Select word', lisMenuSelectWord, ecSelectWord); AddDefault(C, 'Select line', lisMenuSelectLine, ecSelectLine); AddDefault(C, 'Select paragraph', lisMenuSelectParagraph, ecSelectParagraph); + AddDefault(C, 'Toggle Current-Word highlight', srkmecToggleMarkupWord, EcToggleMarkupWord); // editing - without menu items in the IDE bar C:=Categories[AddCategory('text editing commands',srkmCatEditing, diff --git a/ide/lazarusidestrconsts.pas b/ide/lazarusidestrconsts.pas index e09d1bc028..b61e92c194 100644 --- a/ide/lazarusidestrconsts.pas +++ b/ide/lazarusidestrconsts.pas @@ -1194,9 +1194,11 @@ resourcestring dlgTooltipEval = 'Tooltip expression evaluation'; dlgTooltipTools = 'Tooltip symbol Tools'; dlgMarkupWordEnabled = 'Highlight Current Word/Block'; - dlgMarkupWordFull = 'Highlight Current Word match word boundaries'; + dlgMarkupWordFull = 'Current Word match word boundaries'; dlgMarkupWordFullLen = 'Only if shorter than'; dlgMarkupWordNoKeyword = 'Ignore Keywords'; + dlgMarkupWordTrim = 'Trim Spaces'; + dlgMarkupWordNoTimer = 'Disable Timer'; dlgAutoRemoveEmptyMethods = 'Auto remove empty methods'; dlgEdDelay = 'Delay'; dlgTimeSecondUnit = 'sec'; @@ -1927,6 +1929,7 @@ resourcestring srkmecUnFoldAll = 'Unfold all'; srkmecFoldCurrent = 'Fold at Cursor'; srkmecUnFoldCurrent = 'Unfold at Cursor'; + srkmecToggleMarkupWord = 'Toggle Current-Word highlight'; // edit menu srkmecSelectionTabs2Spaces = 'Convert tabs to spaces in selection';