Skip to content

Commit 82ef10e

Browse files
committed
feat: support SynEdit hints when mouse is over function names, tables etc
1 parent 1a2f1f3 commit 82ef10e

File tree

2 files changed

+39
-27
lines changed

2 files changed

+39
-27
lines changed

source/main.lfm

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2988,7 +2988,9 @@ object MainForm: TMainForm
29882988
Font.Quality = fqNonAntialiased
29892989
ParentColor = False
29902990
ParentFont = False
2991+
ParentShowHint = False
29912992
PopupMenu = popupQuery
2993+
ShowHint = True
29922994
TabOrder = 2
29932995
OnDragDrop = SynMemoQueryDragDrop
29942996
OnDragOver = SynMemoQueryDragOver
@@ -3436,6 +3438,7 @@ object MainForm: TMainForm
34363438
OnDropFiles = SynMemoQueryDropFiles
34373439
OnProcessCommand = SynMemoQueryProcessCommand
34383440
OnReplaceText = SynMemoQueryReplaceText
3441+
OnShowHint = SynMemoQueryShowHint
34393442
OnSpecialLineColors = SynMemoQuerySpecialLineColors
34403443
OnStatusChange = SynMemoQueryStatusChange
34413444
inline SynLeftGutterPartList1: TSynGutterPartList

source/main.pas

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1194,9 +1194,7 @@ TMainForm = class(TExtForm)
11941194
procedure menuTabsInMultipleLinesClick(Sender: TObject);
11951195
procedure actResetPanelDimensionsExecute(Sender: TObject);
11961196
procedure menuAlwaysGenerateFilterClick(Sender: TObject);
1197-
//procedure SynMemoQueryTokenHint(Sender: TObject; Coords: TBufferCoord;
1198-
// const Token: string; TokenType: Integer; Attri: TSynHighlighterAttributes;
1199-
// var HintText: string);
1197+
procedure SynMemoQueryShowHint(Sender: TObject; HintInfo: PHintInfo);
12001198
procedure actCopyGridNodesExecute(Sender: TObject);
12011199
procedure ApplicationException(Sender: TObject; E: Exception);
12021200
procedure actQueryTableExecute(Sender: TObject);
@@ -7069,7 +7067,7 @@ procedure TMainForm.SynMemoQueryProcessCommand(Sender: TObject;
70697067
Exit;
70707068
Editor := Sender as TSynMemo;
70717069
Editor.GetHighlighterAttriAtRowColEx(Editor.CaretXY, CaretToken, CaretTokenTypeInt, CaretStart, CaretAttri);
7072-
if not (TtkTokenKind(CaretTokenTypeInt) in [SynHighlighterSQL.tkString, SynHighlighterSQL.tkComment])
7070+
if not (SynHighlighterSQL.TtkTokenKind(CaretTokenTypeInt) in [SynHighlighterSQL.tkString, SynHighlighterSQL.tkComment])
70737071
then begin
70747072
Proposal := SynCompletionProposal;
70757073
p := Editor.ClientToScreen(Point(Editor.CaretXPix, Editor.CaretYPix + Editor.LineHeight + 1));
@@ -7194,10 +7192,13 @@ procedure TMainForm.SynMemoQueryStatusChange(Sender: TObject; Changes: TSynStatu
71947192
end;
71957193

71967194

7197-
{procedure TMainForm.SynMemoQueryTokenHint(Sender: TObject; Coords: TBufferCoord;
7198-
const Token: string; TokenType: Integer; Attri: TSynHighlighterAttributes;
7199-
var HintText: string);
7195+
procedure TMainForm.SynMemoQueryShowHint(Sender: TObject; HintInfo: PHintInfo);
72007196
var
7197+
Edit: TSynEdit;
7198+
Token: String;
7199+
Attri: TSynHighlighterAttributes;
7200+
TokenType, TokenStart: Integer;
7201+
RowColPos: TPoint;
72017202
SQLFunc: TSQLFunction;
72027203
Conn: TDBConnection;
72037204
AllObjects: TDBObjectList;
@@ -7209,14 +7210,20 @@ procedure TMainForm.SynMemoQueryStatusChange(Sender: TObject; Changes: TSynStatu
72097210
Param: TRoutineParam;
72107211
begin
72117212
// Activate hint for SQL function in query editors
7213+
Edit := Sender as TSynEdit;
7214+
RowColPos := Edit.PixelsToRowColumn(HintInfo.CursorPos);
7215+
if not Edit.GetHighlighterAttriAtRowColEx(RowColPos, Token, TokenType, TokenStart, Attri) then
7216+
Exit;
7217+
7218+
LogSQL('TokenType:'+TokenType.ToString+' Token:"'+Token+'"', lcDebug);
72127219
Conn := ActiveConnection;
72137220
if Assigned(Conn) then begin
7214-
case TtkTokenKind(TokenType) of
7221+
case SynHighlighterSQL.TtkTokenKind(TokenType) of
72157222

72167223
SynHighlighterSQL.tkFunction: begin
72177224
for SQLFunc in ActiveConnection.SQLFunctions do begin
72187225
if SQLFunc.Name.ToUpper = Token.ToUpper then begin
7219-
HintText := SQLFunc.Name + SQLFunc.Declaration + sLineBreak + sLineBreak + SQLFunc.Description;
7226+
HintInfo.HintStr := SQLFunc.Name + SQLFunc.Declaration + sLineBreak + sLineBreak + SQLFunc.Description;
72207227
Break;
72217228
end;
72227229
end;
@@ -7228,15 +7235,15 @@ procedure TMainForm.SynMemoQueryStatusChange(Sender: TObject; Changes: TSynStatu
72287235
AllObjects := Conn.GetDBObjects(Conn.Database);
72297236
for Obj in AllObjects do begin
72307237
if (Obj.NodeType = lntTable) and (Obj.Name.ToLower = Token.ToLower) then begin
7231-
HintText := _(Obj.ObjType) + ' ' + Obj.Name + ':' + sLineBreak +
7238+
HintInfo.HintStr := _(Obj.ObjType) + ' ' + Obj.Name + ':' + sLineBreak +
72327239
_('Rows') + ': ' + FormatNumber(Obj.Rows) + sLineBreak +
72337240
_('Size') + ': ' + FormatByteNumber(Obj.DataLen + Obj.IndexLen) + SLineBreak;
72347241
ColumnNameChars := 0;
72357242
for Column in Obj.TableColumns do begin
72367243
ColumnNameChars := Max(ColumnNameChars, Length(Column.Name));
72377244
end;
72387245
for Column in Obj.TableColumns do begin
7239-
HintText := HintText + Format('%s%'+ColumnNameChars.ToString+'s: %s', [SLineBreak, Column.Name, Column.FullDataType]);
7246+
HintInfo.HintStr := HintInfo.HintStr + Format('%s%'+ColumnNameChars.ToString+'s: %s', [SLineBreak, Column.Name, Column.FullDataType]);
72407247
end;
72417248

72427249
Break;
@@ -7245,50 +7252,52 @@ procedure TMainForm.SynMemoQueryStatusChange(Sender: TObject; Changes: TSynStatu
72457252
end;
72467253
end;
72477254

7248-
SynHighlighterSQL.tkProcName: begin
7255+
{SynHighlighterSQL.tkProcName: begin
7256+
// tkProcName not available in Laz SynEdit
72497257
// Show routine parameters, comment and body
72507258
if (not Conn.IsLockedByThread) and Conn.DbObjectsCached(Conn.Database) then begin
72517259
AllObjects := Conn.GetDBObjects(Conn.Database);
72527260
for Obj in AllObjects do begin
72537261
if (Obj.NodeType in [lntFunction, lntProcedure]) and (Obj.Name.ToLower = Token.ToLower) then begin
72547262
Parameters := TRoutineParamList.Create;
72557263
Conn.ParseRoutineStructure(Obj, Parameters);
7256-
HintText := _(Obj.ObjType) + ' ' + Obj.Name;
7264+
HintInfo.HintStr := _(Obj.ObjType) + ' ' + Obj.Name;
72577265
Params := TStringList.Create;
72587266
for Param in Parameters do begin
72597267
Params.Add(Param.Name + ' ['+Param.Datatype+']');
72607268
end;
7261-
HintText := HintText + '(' + Implode(', ', Params) + ')' + sLineBreak + sLineBreak;
7269+
HintInfo.HintStr := HintInfo.HintStr + '(' + Implode(', ', Params) + ')' + sLineBreak + sLineBreak;
72627270
Params.Free;
72637271
if not Obj.Returns.IsEmpty then
7264-
HintText := HintText + 'Returns: ' + Obj.Returns + sLineBreak + sLineBreak;
7272+
HintInfo.HintStr := HintInfo.HintStr + 'Returns: ' + Obj.Returns + sLineBreak + sLineBreak;
72657273
if not Obj.Comment.IsEmpty then
7266-
HintText := HintText + Obj.Comment + sLineBreak + sLineBreak;
7274+
HintInfo.HintStr := HintInfo.HintStr + Obj.Comment + sLineBreak + sLineBreak;
72677275
if not Obj.Body.IsEmpty then
7268-
HintText := HintText + StrEllipsis(Obj.Body, SIZE_KB);
7269-
HintText := Trim(HintText);
7276+
HintInfo.HintStr := HintInfo.HintStr + StrEllipsis(Obj.Body, SIZE_KB);
7277+
HintInfo.HintStr := Trim(HintInfo.HintStr);
72707278
Break;
72717279
end;
72727280
end;
72737281
end;
7274-
end;
7282+
end;}
72757283

72767284
SynHighlighterSQL.tkDatatype: begin
72777285
for i:=Low(Conn.Datatypes) to High(Conn.Datatypes) do begin
72787286
if Conn.Datatypes[i].Name.ToLower = Token.ToLower then begin
7279-
HintText := WrapText(Conn.Datatypes[i].Description, 100);
7287+
HintInfo.HintStr := WrapText(Conn.Datatypes[i].Description, 100);
72807288
Break;
72817289
end;
72827290
end;
72837291
end;
72847292

72857293
SynHighlighterSQL.tkString: begin
7286-
HintText := _('String:') + ' ' + FormatByteNumber(Length(Token));
7294+
HintInfo.HintStr := _('String:') + ' ' + FormatByteNumber(Length(Token));
72877295
end;
72887296

72897297
end;
72907298
end;
7291-
end;}
7299+
7300+
end;
72927301

72937302
procedure TMainForm.TimerHostUptimeTimer(Sender: TObject);
72947303
var
@@ -12295,7 +12304,7 @@ procedure TMainForm.actNewQueryTabExecute(Sender: TObject);
1229512304
QueryTab.Memo.Parent := QueryTab.pnlMemo;
1229612305
QueryTab.Memo.Align := SynMemoQuery.Align;
1229712306
QueryTab.Memo.Constraints := SynMemoQuery.Constraints;
12298-
//QueryTab.Memo.HintMode := SynMemoQuery.HintMode;
12307+
QueryTab.Memo.ShowHint := SynMemoQuery.ShowHint;
1229912308
QueryTab.Memo.Left := SynMemoQuery.Left;
1230012309
QueryTab.Memo.Options := SynMemoQuery.Options;
1230112310
QueryTab.Memo.Options2 := SynMemoQuery.Options2;
@@ -12323,7 +12332,7 @@ procedure TMainForm.actNewQueryTabExecute(Sender: TObject);
1232312332
QueryTab.Memo.OnProcessCommand := SynMemoQuery.OnProcessCommand;
1232412333
QueryTab.Memo.OnReplaceText := SynMemoQuery.OnReplaceText;
1232512334
//QueryTab.Memo.OnPaintTransient := SynMemoQuery.OnPaintTransient;
12326-
//QueryTab.Memo.OnTokenHint := SynMemoQuery.OnTokenHint;
12335+
QueryTab.Memo.OnShowHint := SynMemoQuery.OnShowHint;
1232712336
QueryTab.MemoLineBreaks := TLineBreaks(AppSettings.ReadInt(asLineBreakStyle));
1232812337
SynCompletionProposal.AddEditor(QueryTab.Memo);
1232912338

@@ -13411,10 +13420,10 @@ procedure TMainForm.SetupSynEditor(Editor: TSynMemo);
1341113420
Editor.RightEdge := BaseEditor.RightEdge;
1341213421
//Editor.MaxScrollWidth := BaseEditor.MaxScrollWidth;
1341313422
Editor.WantTabs := BaseEditor.WantTabs;
13414-
//Editor.HintMode := BaseEditor.HintMode;
13423+
Editor.ShowHint := BaseEditor.ShowHint;
1341513424
Editor.OnKeyPress := BaseEditor.OnKeyPress;
1341613425
Editor.OnMouseWheel := BaseEditor.OnMouseWheel;
13417-
//Editor.OnTokenHint := BaseEditor.OnTokenHint;
13426+
Editor.OnShowHint := BaseEditor.OnShowHint;
1341813427
if Editor <> SynMemoSQLLog then begin
1341913428
//Editor.OnPaintTransient := BaseEditor.OnPaintTransient;
1342013429
end;
@@ -14754,7 +14763,7 @@ procedure TMainForm.ApplicationShowHint(var HintStr: string; var CanShow: Boolea
1475414763
SetHintFontByControl;
1475514764
end
1475614765
else if HintInfo.HintControl is TSynMemo then begin
14757-
// Token hint displaying through SynEdit's OnTokenHint event
14766+
// Token hint displaying through SynEdit's OnShowHint event
1475814767
Editor := TSynMemo(HintInfo.HintControl);
1475914768
SetHintFontByControl(Editor);
1476014769
NewHideTimeout := Min(Length(HintStr) * 100, 60*1000);

0 commit comments

Comments
 (0)