From 662e9519a7883645789c5836ce938d5cd92a4e40 Mon Sep 17 00:00:00 2001 From: martin Date: Fri, 9 Jul 2010 16:25:10 +0000 Subject: [PATCH] SynCompletion: Cancel on Topline change (window would be misplaced otherwise) git-svn-id: trunk@26548 - --- components/synedit/syncompletion.pas | 34 ++++++++++++++++++++++++- components/synedit/synedit.pp | 37 ++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/components/synedit/syncompletion.pas b/components/synedit/syncompletion.pas index 5749880e15..741414d96f 100644 --- a/components/synedit/syncompletion.pas +++ b/components/synedit/syncompletion.pas @@ -144,7 +144,11 @@ type fCurrentEditor: TComponent; FOnMeasureItem: TSynBaseCompletionMeasureItem; FOnPositionChanged: TNotifyEvent; + procedure SetCurrentEditor(const AValue: TComponent); procedure SetLongLineHintTime(const AValue: Integer); + procedure EditorStatusChanged(Sender: TObject; Changes: TSynStatusChanges); + protected + procedure SetVisible(Value: Boolean); override; public constructor Create(AOwner: Tcomponent); override; destructor Destroy; override; @@ -166,7 +170,7 @@ type write SetNbLinesInWindow; property ClSelect: TColor read FClSelect write FClSelect; property CaseSensitive: boolean read FCaseSensitive write FCaseSensitive; - property CurrentEditor: TComponent read fCurrentEditor write fCurrentEditor; + property CurrentEditor: TComponent read fCurrentEditor write SetCurrentEditor; property FontHeight:integer read FFontHeight; property OnSearchPosition:TSynBaseCompletionSearchPosition read FOnSearchPosition write FOnSearchPosition; @@ -812,6 +816,34 @@ begin FHintTimer.Interval := AValue; end; +procedure TSynBaseCompletionForm.EditorStatusChanged(Sender: TObject; + Changes: TSynStatusChanges); +begin + if (scTopLine in Changes) and Assigned(OnCancel) then + OnCancel(Self); +end; + +procedure TSynBaseCompletionForm.SetCurrentEditor(const AValue: TComponent); +begin + if fCurrentEditor = AValue then exit; + if fCurrentEditor <> nil then + TSynEdit(fCurrentEditor).UnRegisterStatusChangedHandler({$IFDEF FPC}@{$ENDIF}EditorStatusChanged); + fCurrentEditor := AValue; + if (fCurrentEditor <> nil) and Visible then + TSynEdit(fCurrentEditor).RegisterStatusChangedHandler({$IFDEF FPC}@{$ENDIF}EditorStatusChanged); +end; + +procedure TSynBaseCompletionForm.SetVisible(Value: Boolean); +begin + inherited SetVisible(Value); + if (fCurrentEditor <> nil) then begin + if Visible then + TSynEdit(fCurrentEditor).RegisterStatusChangedHandler({$IFDEF FPC}@{$ENDIF}EditorStatusChanged) + else + TSynEdit(fCurrentEditor).UnRegisterStatusChangedHandler({$IFDEF FPC}@{$ENDIF}EditorStatusChanged); + end; +end; + procedure TSynBaseCompletionForm.SetItemList(const Value: TStrings); begin FItemList.Assign(Value); diff --git a/components/synedit/synedit.pp b/components/synedit/synedit.pp index 9f4cd02340..d006ece6c1 100644 --- a/components/synedit/synedit.pp +++ b/components/synedit/synedit.pp @@ -306,6 +306,13 @@ type var Command: TSynEditorCommand; var ComboKeyStrokes: TSynEditKeyStrokes); end; + { TSynStatusChangedHandlerList } + + TSynStatusChangedHandlerList = Class(TMethodList) + public + procedure CallStatusChangedHandlers(Sender: TObject; Changes: TSynStatusChanges); + end; + TSynMouseLinkEvent = procedure ( Sender: TObject; X, Y: Integer; var AllowMouseLink: Boolean) of object; @@ -418,6 +425,7 @@ type fTSearch: TSynEditSearch; fHookedCommandHandlers: TList; FHookedKeyTranslationList: TSynHookedKeyTranslationList; + FStatusChangedList: TSynStatusChangedHandlerList; FPlugins: TList; fScrollTimer: TTimer; fScrollDeltaX, fScrollDeltaY: Integer; @@ -798,6 +806,10 @@ type procedure RegisterKeyTranslationHandler(AHandlerProc: THookedKeyTranslationEvent); procedure UnRegisterKeyTranslationHandler(AHandlerProc: THookedKeyTranslationEvent); + + procedure RegisterStatusChangedHandler(AStatusChangeProc: TStatusChangeEvent); + procedure UnRegisterStatusChangedHandler(AStatusChangeProc: TStatusChangeEvent); + function RowColumnToPixels( {$IFDEF SYN_LAZARUS}const {$ENDIF}RowCol: TPoint): TPoint; function SearchReplace(const ASearch, AReplace: string; @@ -1633,6 +1645,7 @@ begin Cursor := crIBeam; fPlugins := TList.Create; FHookedKeyTranslationList := TSynHookedKeyTranslationList.Create; + FStatusChangedList := TSynStatusChangedHandlerList.Create; {$IFDEF SYN_LAZARUS} // needed before setting color fMarkupHighCaret := TSynEditMarkupHighlightAllCaret.Create(self); @@ -1887,6 +1900,7 @@ begin RemoveHandlers; FreeAndNil(FHookedKeyTranslationList); + FreeAndNil(FStatusChangedList); fHookedCommandHandlers:=nil; fPlugins:=nil; FCaret.Lines := nil; @@ -8420,6 +8434,16 @@ begin FHookedKeyTranslationList.Remove(TMEthod(AHandlerProc)); end; +procedure TCustomSynEdit.RegisterStatusChangedHandler(AStatusChangeProc: TStatusChangeEvent); +begin + FStatusChangedList.Add(TMethod(AStatusChangeProc)); +end; + +procedure TCustomSynEdit.UnRegisterStatusChangedHandler(AStatusChangeProc: TStatusChangeEvent); +begin + FStatusChangedList.Remove(TMethod(AStatusChangeProc)); +end; + procedure TCustomSynEdit.NotifyHookedCommandHandlers(AfterProcessing: boolean; var Command: TSynEditorCommand; var AChar: TUTF8Char; Data: pointer); @@ -8474,6 +8498,7 @@ end; procedure TCustomSynEdit.DoOnStatusChange(Changes: TSynStatusChanges); begin + FStatusChangedList.CallStatusChangedHandlers(Self, Changes); if Assigned(fOnStatusChange) then begin fOnStatusChange(Self, fStatusChanges); fStatusChanges := []; @@ -8647,6 +8672,18 @@ begin IsStartOfCombo, Handled, Command, False, ComboKeyStrokes); end; +{ TSynStatusChangedHandlerList } + +procedure TSynStatusChangedHandlerList.CallStatusChangedHandlers(Sender: TObject; + Changes: TSynStatusChanges); +var + i: Integer; +begin + i:=Count; + while NextDownIndex(i) do + TStatusChangeEvent(Items[i])(Sender, Changes); +end; + initialization InitSynDefaultFont; SynDefaultBeautifier := TSynBeautifier.Create(Application);