@@ -866,6 +866,11 @@ TMainForm = class(TExtForm)
866866 procedure actDataCancelChangesExecute(Sender: TObject);
867867 procedure actExportDataExecute(Sender: TObject);
868868 procedure actDataPreviewExecute(Sender: TObject);
869+ function SynCompletionProposalMeasureItem(const AKey: string;
870+ ACanvas: TCanvas; Selected: boolean; Index: integer): TPoint;
871+ function SynCompletionProposalPaintItem(const AKey: string;
872+ ACanvas: TCanvas; X, Y: integer; Selected: boolean; Index: integer
873+ ): boolean;
869874 procedure UpdatePreviewPanel;
870875 procedure actInsertFilesExecute(Sender: TObject);
871876 procedure actDataDeleteExecute(Sender: TObject);
@@ -1309,7 +1314,10 @@ TMainForm = class(TExtForm)
13091314 FCommandStatsQueryCount: Int64;
13101315 FCommandStatsServerUptime: Integer;
13111316 FVariableNames, FSessionVars, FGlobalVars: TStringList;
1312- FProposalItems: TStringList;
1317+ FProposalItems: TProposalItemList;
1318+ FProposalCol1Width: Integer;
1319+ FProposalCol2Width: Integer;
1320+ FProposalCol3Width: Integer;
13131321 FProposalTriggeredByDot: Boolean;
13141322
13151323 procedure SetDelimiter(Value: String);
@@ -1794,6 +1802,7 @@ procedure TMainForm.FormDestroy(Sender: TObject);
17941802 AppSettings.WriteString(asDelimiter, FDelimiter);
17951803 AppSettings.WriteInt(asQuerymemoheight, ScaleFormToDesign(pnlQueryMemo.Height));
17961804 AppSettings.WriteInt(asQueryhelperswidth, ScaleFormToDesign(pnlQueryHelpers.Width));
1805+ // This saves a too small width (mostly 15), probably because the proposal is not visible now:
17971806 AppSettings.WriteInt(asCompletionProposalWidth, ScaleFormToDesign(SynCompletionProposal.Width));
17981807 AppSettings.WriteInt(asCompletionProposalNbLinesInWindow, SynCompletionProposal.LinesInWindow);
17991808 AppSettings.WriteInt(asDbtreewidth, ScaleFormToDesign(pnlLeft.width));
@@ -2071,9 +2080,9 @@ procedure TMainForm.FormCreate(Sender: TObject);
20712080 // We already store and restore the dimensions DPI aware.
20722081 {SynCompletionProposal.Form.Scaled := False;
20732082 SynCompletionProposal.TimerInterval := AppSettings.ReadInt(asCompletionProposalInterval);}
2074- SynCompletionProposal.Width := Min( AppSettings.ReadInt(asCompletionProposalWidth), 1000 );
2083+ // SynCompletionProposal.Width := AppSettings.ReadInt(asCompletionProposalWidth);
20752084 SynCompletionProposal.LinesInWindow := AppSettings.ReadInt(asCompletionProposalNbLinesInWindow);
2076- FProposalItems := TStringList .Create;
2085+ FProposalItems := TProposalItemList .Create;
20772086 FProposalTriggeredByDot := False;
20782087
20792088 // Place progressbar on the statusbar
@@ -3586,6 +3595,85 @@ procedure TMainForm.actDataPreviewExecute(Sender: TObject);
35863595 UpdatePreviewPanel;
35873596end;
35883597
3598+ function TMainForm.SynCompletionProposalMeasureItem(const AKey: string;
3599+ ACanvas: TCanvas; Selected: boolean; Index: integer): TPoint;
3600+ var
3601+ i, X, Y: Integer;
3602+ It: TProposalItem;
3603+ begin
3604+ FProposalCol1Width := 0;
3605+ FProposalCol2Width := 0;
3606+
3607+ ACanvas.Font.Style := [fsBold];
3608+ for i := 0 to SynCompletionProposal.ItemList.Count - 1 do
3609+ begin
3610+ It := FProposalItems[SynCompletionProposal.IndexFromVisibleIndex(i)];
3611+ FProposalCol1Width := Max(FProposalCol1Width, ACanvas.TextWidth(It.LeftText));
3612+ end;
3613+
3614+ ACanvas.Font.Style := [fsItalic];
3615+ for i := 0 to SynCompletionProposal.ItemList.Count - 1 do
3616+ begin
3617+ It := FProposalItems[SynCompletionProposal.IndexFromVisibleIndex(i)];
3618+ FProposalCol2Width := Max(FProposalCol2Width, ACanvas.TextWidth(It.CenterText));
3619+ end;
3620+
3621+ //if SynCompletionProposal.Width < 100 then begin
3622+ // SynCompletionProposal.Width := ImageListMain.Width + FProposalCol1Width + FProposalCol2Width + 100;
3623+ //end;
3624+
3625+ ACanvas.Font.Style := [];
3626+ It := FProposalItems[SynCompletionProposal.IndexFromVisibleIndex(Index)];
3627+ X := ImageListMain.Width + 5 + FProposalCol1Width + 10;
3628+ if It.RightText.IsEmpty then
3629+ Inc(X, ACanvas.TextWidth(It.CenterText))
3630+ else
3631+ Inc(X, FProposalCol2Width + 10 + ACanvas.TextWidth(It.RightText));
3632+ Y := Max(ImageListMain.Height, ACanvas.TextHeight('Wy')) + 4;
3633+ Result := Point(X, Y);
3634+ end;
3635+
3636+ function TMainForm.SynCompletionProposalPaintItem(const AKey: string;
3637+ ACanvas: TCanvas; X, Y: integer; Selected: boolean; Index: integer): boolean;
3638+ var
3639+ It: TProposalItem;
3640+ X1, X2, X3: Integer;
3641+ begin
3642+ It := FProposalItems[SynCompletionProposal.IndexFromVisibleIndex(Index)];
3643+
3644+ if (It.ImageIndex >= 0) and (It.ImageIndex < ImageListMain.Count) then
3645+ ImageListMain.Draw(ACanvas, X + 4, Y + 2, It.ImageIndex, True);
3646+
3647+ X1 := X + ImageListMain.Width + 5;
3648+ X2 := X1 + FProposalCol1Width + 10;
3649+ X3 := X2 + FProposalCol2Width + 10;
3650+
3651+ ACanvas.Brush.Style := bsClear;
3652+
3653+ ACanvas.Font.Style := [];
3654+ if Selected then
3655+ ACanvas.Font.Color := clWhite
3656+ else
3657+ ACanvas.Font.Color := It.LeftColor;
3658+ ACanvas.TextOut(X1, Y + 1, It.LeftText);
3659+
3660+ ACanvas.Font.Style := [];
3661+ if Selected then
3662+ ACanvas.Font.Color := clWhite
3663+ else
3664+ ACanvas.Font.Color := It.CenterColor;
3665+ ACanvas.TextOut(X2, Y + 1, It.CenterText);
3666+
3667+ ACanvas.Font.Style := [fsItalic];
3668+ if Selected then
3669+ ACanvas.Font.Color := clWhite
3670+ else
3671+ ACanvas.Font.Color := It.RightColor;
3672+ ACanvas.TextOut(X3, Y + 1, It.RightText);
3673+
3674+ Result := True;
3675+ end;
3676+
35893677
35903678procedure TMainForm.UpdatePreviewPanel;
35913679var
@@ -6832,7 +6920,6 @@ procedure TMainForm.SynCompletionProposalExecute(Sender: TObject);
68326920 Conn: TDBConnection;
68336921 RoutineEditor: TfrmRoutineEditor;
68346922 Param: TRoutineParam;
6835- DisplayText: String;
68366923 SQLFunc: TSQLFunction;
68376924 DummyPos: Integer=0;
68386925
@@ -6857,8 +6944,7 @@ procedure TMainForm.SynCompletionProposalExecute(Sender: TObject);
68576944 FuncParams.Free;
68586945 end;
68596946
6860- DisplayText := SynCompletionProposalPrettyText(Obj.ImageIndex, _(LowerCase(Obj.ObjType)), Obj.Name, FunctionDeclaration);
6861- FProposalItems.Add(Obj.Name+FunctionDeclaration);
6947+ FProposalItems.AddNew(Obj.Name+FunctionDeclaration, Obj.ImageIndex, _(LowerCase(Obj.ObjType)), Obj.Name, FunctionDeclaration);
68626948 end;
68636949
68646950 procedure AddColumns(const LeftToken: String);
@@ -6897,11 +6983,10 @@ procedure TMainForm.SynCompletionProposalExecute(Sender: TObject);
68976983 end;
68986984 end;
68996985 // Put formatted text and icon into proposal
6900- DisplayText := SynCompletionProposalPrettyText(ColumnIcon, LowerCase(Col.DataType.Name), Col.Name, Col.Comment, AppColorSchemes.First.GridNullColors[Col.DataType.Category]);
69016986 //if CurrentInput.StartsWith(Conn.QuoteChar) then
69026987 // Proposal.ItemList.Add(Conn.QuoteChar + Col.Name)
69036988 //else
6904- FProposalItems.Add (Col.Name);
6989+ FProposalItems.AddNew (Col.Name, ColumnIcon, LowerCase(Col.DataType.Name), Col.Name, Col.Comment, AppColorSchemes.First.GridNullColors[Col.DataType.Category] );
69056990 Inc(ColumnsInList);
69066991 end;
69076992 Columns.Free;
@@ -6942,8 +7027,7 @@ procedure TMainForm.SynCompletionProposalExecute(Sender: TObject);
69427027 try
69437028 Results := Conn.GetResults('SHOW '+UpperCase(rx.Match[1])+' VARIABLES');
69447029 while not Results.Eof do begin
6945- DisplayText := SynCompletionProposalPrettyText(ICONINDEX_PRIMARYKEY, _('Variable'), Results.Col(0), StringReplace(Results.Col(1), '\', '\\', [rfReplaceAll]));
6946- FProposalItems.Add(Results.Col(1));
7030+ FProposalItems.AddNew(Results.Col(1), ICONINDEX_PRIMARYKEY, _('Variable'), Results.Col(0), StringReplace(Results.Col(1), '\', '\\', [rfReplaceAll]));
69477031 Results.Next;
69487032 end;
69497033 except
@@ -7039,8 +7123,7 @@ procedure TMainForm.SynCompletionProposalExecute(Sender: TObject);
70397123
70407124 // All databases
70417125 for i:=0 to Conn.AllDatabases.Count-1 do begin
7042- DisplayText := SynCompletionProposalPrettyText(ICONINDEX_DB, _('database'), Conn.AllDatabases[i], '');
7043- FProposalItems.Add(Conn.AllDatabases[i]);
7126+ FProposalItems.AddNew(Conn.AllDatabases[i], ICONINDEX_DB, _('database'), Conn.AllDatabases[i]);
70447127 end;
70457128
70467129 // Tables from current db
@@ -7056,15 +7139,13 @@ procedure TMainForm.SynCompletionProposalExecute(Sender: TObject);
70567139
70577140 // Functions
70587141 for SQLFunc in Conn.SQLFunctions do begin
7059- DisplayText := SynCompletionProposalPrettyText(ICONINDEX_FUNCTION, _('function'), SQLFunc.Name, SQLFunc.Declaration);
7060- FProposalItems.Add(SQLFunc.Name + SQLFunc.Declaration);
7142+ FProposalItems.AddNew(SQLFunc.Name + SQLFunc.Declaration, ICONINDEX_FUNCTION, _('function'), SQLFunc.Name, SQLFunc.Declaration);
70617143 end;
70627144
70637145
70647146 // Keywords
70657147 for i:=0 to MySQLKeywords.Count-1 do begin
7066- DisplayText := SynCompletionProposalPrettyText(ICONINDEX_KEYWORD, _('keyword'), MySQLKeywords[i], '');
7067- FProposalItems.Add(MySQLKeywords[i]);
7148+ FProposalItems.AddNew(MySQLKeywords[i], ICONINDEX_KEYWORD, _('keyword'), MySQLKeywords[i]);
70687149 end;
70697150
70707151 // Procedure params
@@ -7075,8 +7156,7 @@ procedure TMainForm.SynCompletionProposalExecute(Sender: TObject);
70757156 else if Param.Context = 'OUT' then ImageIndex := 121
70767157 else if Param.Context = 'INOUT' then ImageIndex := 122
70777158 else ImageIndex := -1;
7078- DisplayText := SynCompletionProposalPrettyText(ImageIndex, Param.Datatype, Param.Name, '');
7079- FProposalItems.Add(Param.Name);
7159+ FProposalItems.AddNew(Param.Name, ImageIndex, Param.Datatype, Param.Name);
70807160 end;
70817161 end;
70827162
@@ -7105,10 +7185,10 @@ procedure TMainForm.SynCompletionProposalSearchPosition(var APosition: integer);
71057185 //logsql('SynCompletionProposalSearchPosition CurrentString:'+CurrentStr+' StartsText:');
71067186 for i:=0 to FProposalItems.Count-1 do begin
71077187 if CurrentStr.IsEmpty
7108- or (SearchOnMid and LowerCase(FProposalItems[i]).Contains(LowerCase(CurrentStr)))
7109- or ((not SearchOnMid) and LazStartsText(CurrentStr, FProposalItems[i]))
7188+ or (SearchOnMid and LowerCase(FProposalItems[i].InsertText ).Contains(LowerCase(CurrentStr)))
7189+ or ((not SearchOnMid) and LazStartsText(CurrentStr, FProposalItems[i].InsertText ))
71107190 then
7111- Proposal.ItemList.Add (FProposalItems[i]);
7191+ Proposal.ItemList.AddObject (FProposalItems[i].InsertText, TObject(PtrInt(i)) );
71127192 end;
71137193 Proposal.ItemList.EndUpdate;
71147194end;
0 commit comments