added automatic dot completion menu + moved ctrl+space completion in memo

This commit is contained in:
Basile Burg 2015-05-22 09:22:30 +02:00
parent ef033ed030
commit 4cc3df3e6f
1 changed files with 96 additions and 7 deletions

View File

@ -5,10 +5,10 @@ unit ce_synmemo;
interface interface
uses uses
Classes, SysUtils, controls,lcltype, Forms, graphics, ExtCtrls, crc, SynPluginSyncroEdit, Classes, SysUtils, controls,lcltype, Forms, graphics, ExtCtrls, crc,
SynEditKeyCmds, LazSynEditText, SynEditHighlighter, SynEdit, SynHighlighterLFM, SynPluginSyncroEdit, SynCompletion, SynEditKeyCmds, LazSynEditText, SynEdit,
SynEditMouseCmds, SynEditFoldedView, ce_common, ce_observer, ce_writableComponent, SynHighlighterLFM, SynEditHighlighter, SynEditMouseCmds, SynEditFoldedView,
ce_d2syn, ce_txtsyn; ce_common, ce_observer, ce_writableComponent, ce_d2syn, ce_txtsyn;
type type
@ -92,10 +92,14 @@ type
fCallTipWin: TCEEditorHintWindow; fCallTipWin: TCEEditorHintWindow;
fDDocWin: TCEEditorHintWindow; fDDocWin: TCEEditorHintWindow;
fHintDelay: Integer; fHintDelay: Integer;
fAutoDotDelay: Integer;
fHintTimer: TIdleTimer; fHintTimer: TIdleTimer;
fAutoDotTimer: TIdleTimer;
fCanShowHint: boolean; fCanShowHint: boolean;
fCanAutoDot: boolean;
fOldMousePos: TPoint; fOldMousePos: TPoint;
fSyncEdit: TSynPluginSyncroEdit; fSyncEdit: TSynPluginSyncroEdit;
fCompletion: TSynCompletion;
function getMouseFileBytePos: Integer; function getMouseFileBytePos: Integer;
procedure changeNotify(Sender: TObject); procedure changeNotify(Sender: TObject);
procedure identifierToD2Syn; procedure identifierToD2Syn;
@ -105,9 +109,17 @@ type
procedure setDefaultFontSize(aValue: Integer); procedure setDefaultFontSize(aValue: Integer);
procedure getCallTips; procedure getCallTips;
procedure HintTimerEvent(sender: TObject); procedure HintTimerEvent(sender: TObject);
procedure AutoDotTimerEvent(sender: TObject);
procedure InitHintWins; procedure InitHintWins;
function getIfTemp: boolean; function getIfTemp: boolean;
procedure setHintDelay(aValue: Integer); procedure setHintDelay(aValue: Integer);
procedure setAutoDotDelay(aValue: Integer);
procedure completionExecute(sender: TObject);
procedure getCompletionList;
function completionItemPaint(const AKey: string; ACanvas: TCanvas;X, Y: integer;
Selected: boolean; Index: integer): boolean;
procedure completionCodeCompletion(var Value: string; SourceValue: string;
var SourceStart, SourceEnd: TPoint; KeyChar: TUTF8Char; Shift: TShiftState);
protected protected
procedure MouseLeave; override; procedure MouseLeave; override;
procedure SetVisible(Value: Boolean); override; procedure SetVisible(Value: Boolean); override;
@ -122,6 +134,7 @@ type
published published
property defaultFontSize: Integer read fDefaultFontSize write setDefaultFontSize; property defaultFontSize: Integer read fDefaultFontSize write setDefaultFontSize;
property hintDelay: Integer read fHintDelay write setHintDelay; property hintDelay: Integer read fHintDelay write setHintDelay;
property autoDotDelay: Integer read fAutoDotDelay write setAutoDotDelay;
public public
constructor Create(aOwner: TComponent); override; constructor Create(aOwner: TComponent); override;
destructor destroy; override; destructor destroy; override;
@ -345,7 +358,7 @@ begin
fDefaultFontSize := 10; fDefaultFontSize := 10;
SetDefaultCoeditKeystrokes(Self); // not called in inherited if owner = nil ! SetDefaultCoeditKeystrokes(Self); // not called in inherited if owner = nil !
// //
ShowHint :=false; ShowHint := false;
InitHintWins; InitHintWins;
fHintDelay := 200; fHintDelay := 200;
fHintTimer := TIdleTimer.Create(self); fHintTimer := TIdleTimer.Create(self);
@ -353,6 +366,12 @@ begin
fHintTimer.Interval := fHintDelay; fHintTimer.Interval := fHintDelay;
fHintTimer.OnTimer := @HintTimerEvent; fHintTimer.OnTimer := @HintTimerEvent;
// //
fAutoDotDelay := 200;
fAutoDotTimer := TIdleTimer.Create(self);
fAutoDotTimer.AutoEnabled:=true;
fAutoDotTimer.Interval := fAutoDotDelay;
fAutoDotTimer.OnTimer := @AutoDotTimerEvent;
//
Gutter.LineNumberPart.ShowOnlyLineNumbersMultiplesOf := 5; Gutter.LineNumberPart.ShowOnlyLineNumbersMultiplesOf := 5;
Gutter.LineNumberPart.MarkupInfo.Foreground := clGray; Gutter.LineNumberPart.MarkupInfo.Foreground := clGray;
Gutter.SeparatorPart.LineOffset := 1; Gutter.SeparatorPart.LineOffset := 1;
@ -372,6 +391,13 @@ begin
png.Free; png.Free;
end; end;
// //
fCompletion := TSyncompletion.create(nil);
fCompletion.ShowSizeDrag := true;
fCompletion.Editor := Self;
fCompletion.OnExecute:= @completionExecute;
fCompletion.OnCodeCompletion:=@completionCodeCompletion;
fCompletion.OnPaintItem:= @completionItemPaint;
//
MouseLinkColor.Style:= [fsUnderline]; MouseLinkColor.Style:= [fsUnderline];
with MouseActions.Add do begin with MouseActions.Add do begin
Command := emcMouseLink; Command := emcMouseLink;
@ -400,6 +426,7 @@ begin
subjDocClosing(TCEMultiDocSubject(fMultiDocSubject), self); subjDocClosing(TCEMultiDocSubject(fMultiDocSubject), self);
fMultiDocSubject.Free; fMultiDocSubject.Free;
fPositions.Free; fPositions.Free;
fCompletion.Free;
// //
if fileExists(fTempFileName) then if fileExists(fTempFileName) then
sysutils.DeleteFile(fTempFileName); sysutils.DeleteFile(fTempFileName);
@ -545,9 +572,12 @@ begin
else begin else begin
fDDocWin.Hide; fDDocWin.Hide;
fCallTipWin.Hide; fCallTipWin.Hide;
if fCompletion.IsActive then
fCompletion.Deactivate;
end; end;
end; end;
{$REGION DDoc hints ------------------------------------------------------------}
procedure TCESynMemo.InitHintWins; procedure TCESynMemo.InitHintWins;
begin begin
if fCallTipWin = nil then begin if fCallTipWin = nil then begin
@ -610,6 +640,63 @@ begin
fDDocWin.ActivateHint(fDDocWin.HintRect, str); fDDocWin.ActivateHint(fDDocWin.HintRect, str);
end; end;
end; end;
{$ENDREGION --------------------------------------------------------------------}
{$REGION Completion ------------------------------------------------------------}
procedure TCESynMemo.completionExecute(sender: TObject);
begin
fCompletion.TheForm.Font.Size := Font.Size;
getCompletionList;
end;
procedure TCESynMemo.getCompletionList;
begin
if not DcdWrapper.available then exit;
//
fCompletion.Position := 0;
fCompletion.ItemList.Clear;
DcdWrapper.getComplAtCursor(fCompletion.ItemList);
end;
procedure TCESynMemo.completionCodeCompletion(var Value: string;
SourceValue: string; var SourceStart, SourceEnd: TPoint; KeyChar: TUTF8Char;
Shift: TShiftState);
begin
// warning: '20' depends on ce_dcd, case knd of, string literals length
Value := Value[1..length(Value)-20];
end;
function TCESynMemo.completionItemPaint(const AKey: string; ACanvas: TCanvas;X, Y: integer;
Selected: boolean; Index: integer): boolean;
var
lft, rgt: string;
len: Integer;
begin
// warning: '20' depends on ce_dcd, case knd of, string literals length
result := true;
lft := AKey[1 .. length(AKey)-20];
rgt := AKey[length(AKey)-19 .. length(AKey)];
ACanvas.Font.Style := [fsBold];
len := ACanvas.TextExtent(lft).cx;
ACanvas.TextOut(2 + X , Y, lft);
ACanvas.Font.Style := [fsItalic];
ACanvas.TextOut(2 + X + len + 2, Y, rgt);
end;
procedure TCESynMemo.AutoDotTimerEvent(sender: TObject);
begin
if not fCanAutoDot then exit;
if fAutoDotDelay = 0 then exit;
fCanAutoDot := false;
fCompletion.Execute('', ClientToScreen(point(CaretXPix, top + CaretYPix)));
end;
procedure TCESynMemo.setAutoDotDelay(aValue: Integer);
begin
fAutoDotDelay:=aValue;
fAutoDotTimer.Interval:=fAutoDotDelay;
end;
{$ENDREGION --------------------------------------------------------------------}
procedure TCESynMemo.SetHighlighter(const Value: TSynCustomHighlighter); procedure TCESynMemo.SetHighlighter(const Value: TSynCustomHighlighter);
begin begin
@ -793,8 +880,10 @@ end;
procedure TCESynMemo.KeyUp(var Key: Word; Shift: TShiftState); procedure TCESynMemo.KeyUp(var Key: Word; Shift: TShiftState);
begin begin
if Key in [VK_PRIOR, VK_NEXT, Vk_UP] then case Key of
fPositions.store; VK_PRIOR, VK_NEXT, Vk_UP: fPositions.store;
VK_OEM_PERIOD, VK_DECIMAL: fCanAutoDot := true;
end;
inherited; inherited;
// //
if StaticEditorMacro.automatic then if StaticEditorMacro.automatic then