SynCompletion: Cancel on Topline change (window would be misplaced otherwise)

git-svn-id: trunk@26548 -
This commit is contained in:
martin 2010-07-09 16:25:10 +00:00
parent edd9101c91
commit 662e9519a7
2 changed files with 70 additions and 1 deletions

View File

@ -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);

View File

@ -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);