mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2025-08-26 11:17:57 +08:00
Connect data filter editor to the auto completion object. Fixes issue #1045.
This commit is contained in:
@ -6463,7 +6463,7 @@ object MainForm: TMainForm
|
|||||||
Left = 40
|
Left = 40
|
||||||
Top = 128
|
Top = 128
|
||||||
end
|
end
|
||||||
object SynCompletionProposal1: TSynCompletionProposal
|
object SynCompletionProposal: TSynCompletionProposal
|
||||||
Options = [scoLimitToMatchedText, scoUseInsertList, scoUsePrettyText, scoUseBuiltInTimer, scoEndCharCompletion, scoCompleteWithTab, scoCompleteWithEnter]
|
Options = [scoLimitToMatchedText, scoUseInsertList, scoUsePrettyText, scoUseBuiltInTimer, scoEndCharCompletion, scoCompleteWithTab, scoCompleteWithEnter]
|
||||||
NbLinesInWindow = 12
|
NbLinesInWindow = 12
|
||||||
Width = 350
|
Width = 350
|
||||||
@ -6491,12 +6491,12 @@ object MainForm: TMainForm
|
|||||||
ItemHeight = 18
|
ItemHeight = 18
|
||||||
Images = PngImageListMain
|
Images = PngImageListMain
|
||||||
Margin = 1
|
Margin = 1
|
||||||
OnExecute = SynCompletionProposal1Execute
|
OnExecute = SynCompletionProposalExecute
|
||||||
ShortCut = 16416
|
ShortCut = 16416
|
||||||
Editor = SynMemoQuery
|
Editor = SynMemoQuery
|
||||||
TimerInterval = 500
|
TimerInterval = 500
|
||||||
OnAfterCodeCompletion = SynCompletionProposal1AfterCodeCompletion
|
OnAfterCodeCompletion = SynCompletionProposalAfterCodeCompletion
|
||||||
OnCodeCompletion = SynCompletionProposal1CodeCompletion
|
OnCodeCompletion = SynCompletionProposalCodeCompletion
|
||||||
Left = 40
|
Left = 40
|
||||||
Top = 304
|
Top = 304
|
||||||
EndOfTokenChrW = ',()[]. ='#9
|
EndOfTokenChrW = ',()[]. ='#9
|
||||||
|
@ -314,7 +314,7 @@ type
|
|||||||
ZSQLMonitor1: TZSQLMonitor;
|
ZSQLMonitor1: TZSQLMonitor;
|
||||||
menuExporttables: TMenuItem;
|
menuExporttables: TMenuItem;
|
||||||
popupDbGridHeader: TPopupMenu;
|
popupDbGridHeader: TPopupMenu;
|
||||||
SynCompletionProposal1: TSynCompletionProposal;
|
SynCompletionProposal: TSynCompletionProposal;
|
||||||
OpenDialogSQLFile: TOpenDialog;
|
OpenDialogSQLFile: TOpenDialog;
|
||||||
SaveDialogSQLFile: TSaveDialog;
|
SaveDialogSQLFile: TSaveDialog;
|
||||||
SynEditSearch1: TSynEditSearch;
|
SynEditSearch1: TSynEditSearch;
|
||||||
@ -530,11 +530,11 @@ type
|
|||||||
var AllowChange: Boolean);
|
var AllowChange: Boolean);
|
||||||
procedure btnDataClick(Sender: TObject);
|
procedure btnDataClick(Sender: TObject);
|
||||||
procedure ListTablesChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
|
procedure ListTablesChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
|
||||||
procedure SynCompletionProposal1AfterCodeCompletion(Sender: TObject;
|
procedure SynCompletionProposalAfterCodeCompletion(Sender: TObject;
|
||||||
const Value: WideString; Shift: TShiftState; Index: Integer; EndToken: WideChar);
|
const Value: WideString; Shift: TShiftState; Index: Integer; EndToken: WideChar);
|
||||||
procedure SynCompletionProposal1CodeCompletion(Sender: TObject;
|
procedure SynCompletionProposalCodeCompletion(Sender: TObject;
|
||||||
var Value: WideString; Shift: TShiftState; Index: Integer; EndToken: WideChar);
|
var Value: WideString; Shift: TShiftState; Index: Integer; EndToken: WideChar);
|
||||||
procedure SynCompletionProposal1Execute(Kind: SynCompletionType;
|
procedure SynCompletionProposalExecute(Kind: SynCompletionType;
|
||||||
Sender: TObject; var CurrentInput: WideString; var x, y: Integer;
|
Sender: TObject; var CurrentInput: WideString; var x, y: Integer;
|
||||||
var CanExecute: Boolean);
|
var CanExecute: Boolean);
|
||||||
procedure PageControlMainChange(Sender: TObject);
|
procedure PageControlMainChange(Sender: TObject);
|
||||||
@ -1330,7 +1330,10 @@ begin
|
|||||||
SetVistaFonts(Font);
|
SetVistaFonts(Font);
|
||||||
InheritFont(Font);
|
InheritFont(Font);
|
||||||
InheritFont(tabsetQueryHelpers.Font);
|
InheritFont(tabsetQueryHelpers.Font);
|
||||||
InheritFont(SynCompletionProposal1.Font);
|
InheritFont(SynCompletionProposal.Font);
|
||||||
|
|
||||||
|
// Enable auto completion in data tab, filter editor
|
||||||
|
SynCompletionProposal.AddEditor(SynMemoFilter);
|
||||||
|
|
||||||
// Fix node height on Virtual Trees for current DPI settings
|
// Fix node height on Virtual Trees for current DPI settings
|
||||||
FixVT(DBTree);
|
FixVT(DBTree);
|
||||||
@ -4497,22 +4500,22 @@ end;
|
|||||||
|
|
||||||
|
|
||||||
{ Proposal about to insert a String into synmemo }
|
{ Proposal about to insert a String into synmemo }
|
||||||
procedure TMainForm.SynCompletionProposal1CodeCompletion(Sender: TObject;
|
procedure TMainForm.SynCompletionProposalCodeCompletion(Sender: TObject;
|
||||||
var Value: WideString; Shift: TShiftState; Index: Integer; EndToken: WideChar);
|
var Value: WideString; Shift: TShiftState; Index: Integer; EndToken: WideChar);
|
||||||
begin
|
begin
|
||||||
SynCompletionProposal1.Editor.UndoList.AddGroupBreak;
|
(Sender as TSynCompletionProposal).Form.CurrentEditor.UndoList.AddGroupBreak;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TMainForm.SynCompletionProposal1AfterCodeCompletion(Sender: TObject;
|
procedure TMainForm.SynCompletionProposalAfterCodeCompletion(Sender: TObject;
|
||||||
const Value: WideString; Shift: TShiftState; Index: Integer; EndToken: WideChar);
|
const Value: WideString; Shift: TShiftState; Index: Integer; EndToken: WideChar);
|
||||||
begin
|
begin
|
||||||
SynCompletionProposal1.Editor.UndoList.AddGroupBreak;
|
(Sender as TSynCompletionProposal).Form.CurrentEditor.UndoList.AddGroupBreak;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
{ Proposal-Combobox pops up }
|
{ Proposal-Combobox pops up }
|
||||||
procedure TMainForm.SynCompletionProposal1Execute(Kind: SynCompletionType;
|
procedure TMainForm.SynCompletionProposalExecute(Kind: SynCompletionType;
|
||||||
Sender: TObject; var CurrentInput: WideString; var x, y: Integer;
|
Sender: TObject; var CurrentInput: WideString; var x, y: Integer;
|
||||||
var CanExecute: Boolean);
|
var CanExecute: Boolean);
|
||||||
var
|
var
|
||||||
@ -4528,6 +4531,7 @@ var
|
|||||||
Start,
|
Start,
|
||||||
TokenTypeInt : Integer;
|
TokenTypeInt : Integer;
|
||||||
Attri : TSynHighlighterAttributes;
|
Attri : TSynHighlighterAttributes;
|
||||||
|
Proposal : TSynCompletionProposal;
|
||||||
Editor : TCustomSynEdit;
|
Editor : TCustomSynEdit;
|
||||||
Queries : TWideStringList;
|
Queries : TWideStringList;
|
||||||
const
|
const
|
||||||
@ -4548,8 +4552,8 @@ const
|
|||||||
lntView: Icon := ICONINDEX_VIEW;
|
lntView: Icon := ICONINDEX_VIEW;
|
||||||
else Icon := -1;
|
else Icon := -1;
|
||||||
end;
|
end;
|
||||||
SynCompletionProposal1.InsertList.Add( ObjName );
|
Proposal.InsertList.Add( ObjName );
|
||||||
SynCompletionProposal1.ItemList.Add( WideFormat(ItemPattern, [Icon, ObjType, ObjName]) );
|
Proposal.ItemList.Add( WideFormat(ItemPattern, [Icon, ObjType, ObjName]) );
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure addColumns( tablename: WideString );
|
procedure addColumns( tablename: WideString );
|
||||||
@ -4572,8 +4576,8 @@ const
|
|||||||
if ds = nil then exit;
|
if ds = nil then exit;
|
||||||
for i:=0 to ds.RecordCount-1 do
|
for i:=0 to ds.RecordCount-1 do
|
||||||
begin
|
begin
|
||||||
SynCompletionProposal1.InsertList.Add( ds.FieldByName( 'Field' ).AsWideString );
|
Proposal.InsertList.Add( ds.FieldByName( 'Field' ).AsWideString );
|
||||||
SynCompletionProposal1.ItemList.Add( WideFormat(ItemPattern, [ICONINDEX_FIELD, GetFirstWord(ds.FieldByName('Type').AsString), ds.FieldByName('Field').AsWideString]) );
|
Proposal.ItemList.Add( WideFormat(ItemPattern, [ICONINDEX_FIELD, GetFirstWord(ds.FieldByName('Type').AsString), ds.FieldByName('Field').AsWideString]) );
|
||||||
ds.Next;
|
ds.Next;
|
||||||
end;
|
end;
|
||||||
ds.Close;
|
ds.Close;
|
||||||
@ -4581,16 +4585,17 @@ const
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
Editor := (Sender as TSynCompletionProposal).Editor;
|
Proposal := Sender as TSynCompletionProposal;
|
||||||
|
Editor := Proposal.Form.CurrentEditor;
|
||||||
Editor.GetHighlighterAttriAtRowColEx(Editor.CaretXY, Token, TokenTypeInt, Start, Attri);
|
Editor.GetHighlighterAttriAtRowColEx(Editor.CaretXY, Token, TokenTypeInt, Start, Attri);
|
||||||
if TtkTokenKind(TokenTypeInt) = tkString then begin
|
if TtkTokenKind(TokenTypeInt) = tkString then begin
|
||||||
CanExecute := False;
|
CanExecute := False;
|
||||||
Exit;
|
Exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
SynCompletionProposal1.InsertList.Clear;
|
Proposal.InsertList.Clear;
|
||||||
SynCompletionProposal1.ItemList.Clear;
|
Proposal.ItemList.Clear;
|
||||||
PrevShortToken := SynCompletionProposal1.PreviousToken;
|
PrevShortToken := Proposal.PreviousToken;
|
||||||
PrevShortToken := WideDequotedStr(PrevShortToken, '`');
|
PrevShortToken := WideDequotedStr(PrevShortToken, '`');
|
||||||
|
|
||||||
rx := TRegExpr.Create;
|
rx := TRegExpr.Create;
|
||||||
@ -4609,16 +4614,22 @@ begin
|
|||||||
// spaces are not detected correctly.
|
// spaces are not detected correctly.
|
||||||
|
|
||||||
// 1. find the currently edited sql-statement around the cursor position in synmemo
|
// 1. find the currently edited sql-statement around the cursor position in synmemo
|
||||||
Queries := parsesql(Editor.Text);
|
if Editor = SynMemoFilter then begin
|
||||||
j := 0;
|
// Concat query segments, set in viewdata(), so the below regular expressions can find structure
|
||||||
for i:=0 to Queries.Count-1 do begin
|
sql := DataGridCurrentFullSelect + DataGridCurrentFrom + ' WHERE ' + Editor.Text;
|
||||||
Inc(j, Length(Queries[i])+1);
|
end else begin
|
||||||
if (j >= Editor.SelStart) or (i = Queries.Count-1) then begin
|
// Proposal in one of the query tabs
|
||||||
sql := Queries[i];
|
Queries := parsesql(Editor.Text);
|
||||||
break;
|
j := 0;
|
||||||
|
for i:=0 to Queries.Count-1 do begin
|
||||||
|
Inc(j, Length(Queries[i])+1);
|
||||||
|
if (j >= Editor.SelStart) or (i = Queries.Count-1) then begin
|
||||||
|
sql := Queries[i];
|
||||||
|
break;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
FreeAndNil(Queries);
|
||||||
end;
|
end;
|
||||||
FreeAndNil(Queries);
|
|
||||||
|
|
||||||
// 2. Parse FROM clause to detect relevant table/view, probably aliased
|
// 2. Parse FROM clause to detect relevant table/view, probably aliased
|
||||||
rx.ModifierG := True;
|
rx.ModifierG := True;
|
||||||
@ -4672,11 +4683,11 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if SynCompletionProposal1.ItemList.count = 0 then begin
|
if Proposal.ItemList.count = 0 then begin
|
||||||
// Add databases
|
// Add databases
|
||||||
for i := 0 to Databases.Count - 1 do begin
|
for i := 0 to Databases.Count - 1 do begin
|
||||||
SynCompletionProposal1.InsertList.Add(Databases[i]);
|
Proposal.InsertList.Add(Databases[i]);
|
||||||
SynCompletionProposal1.ItemList.Add(WideFormat(ItemPattern, [ICONINDEX_DB, 'database', Databases[i]]));
|
Proposal.ItemList.Add(WideFormat(ItemPattern, [ICONINDEX_DB, 'database', Databases[i]]));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if ActiveDatabase <> '' then begin
|
if ActiveDatabase <> '' then begin
|
||||||
@ -4687,7 +4698,7 @@ begin
|
|||||||
ds.Next;
|
ds.Next;
|
||||||
end;
|
end;
|
||||||
if Length(CurrentInput) = 0 then // assume that we have already a dbname in memo
|
if Length(CurrentInput) = 0 then // assume that we have already a dbname in memo
|
||||||
SynCompletionProposal1.Position := Databases.Count;
|
Proposal.Position := Databases.Count;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// Add functions
|
// Add functions
|
||||||
@ -4695,14 +4706,14 @@ begin
|
|||||||
// Don't display unsupported functions here
|
// Don't display unsupported functions here
|
||||||
if MySqlFunctions[i].Version > mysql_version then
|
if MySqlFunctions[i].Version > mysql_version then
|
||||||
continue;
|
continue;
|
||||||
SynCompletionProposal1.InsertList.Add( MySQLFunctions[i].Name + MySQLFunctions[i].Declaration );
|
Proposal.InsertList.Add( MySQLFunctions[i].Name + MySQLFunctions[i].Declaration );
|
||||||
SynCompletionProposal1.ItemList.Add( WideFormat(ItemPattern, [ICONINDEX_FUNCTION, 'function', MySQLFunctions[i].Name + '\color{clSilver}' + MySQLFunctions[i].Declaration] ) );
|
Proposal.ItemList.Add( WideFormat(ItemPattern, [ICONINDEX_FUNCTION, 'function', MySQLFunctions[i].Name + '\color{clSilver}' + MySQLFunctions[i].Declaration] ) );
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// Add keywords
|
// Add keywords
|
||||||
for i := 0 to MySQLKeywords.Count - 1 do begin
|
for i := 0 to MySQLKeywords.Count - 1 do begin
|
||||||
SynCompletionProposal1.InsertList.Add( MySQLKeywords[i] );
|
Proposal.InsertList.Add( MySQLKeywords[i] );
|
||||||
SynCompletionProposal1.ItemList.Add( WideFormat(ItemPattern, [ICONINDEX_KEYWORD, 'keyword', MySQLKeywords[i]] ) );
|
Proposal.ItemList.Add( WideFormat(ItemPattern, [ICONINDEX_KEYWORD, 'keyword', MySQLKeywords[i]] ) );
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
@ -9184,7 +9195,7 @@ begin
|
|||||||
QueryTab.Memo.OnDragOver := SynMemoQuery.OnDragOver;
|
QueryTab.Memo.OnDragOver := SynMemoQuery.OnDragOver;
|
||||||
QueryTab.Memo.OnDropFiles := SynMemoQuery.OnDropFiles;
|
QueryTab.Memo.OnDropFiles := SynMemoQuery.OnDropFiles;
|
||||||
QueryTab.Memo.OnStatusChange := SynMemoQuery.OnStatusChange;
|
QueryTab.Memo.OnStatusChange := SynMemoQuery.OnStatusChange;
|
||||||
SynCompletionProposal1.AddEditor(QueryTab.Memo);
|
SynCompletionProposal.AddEditor(QueryTab.Memo);
|
||||||
|
|
||||||
QueryTab.spltHelpers := TSplitter.Create(QueryTab.pnlMemo);
|
QueryTab.spltHelpers := TSplitter.Create(QueryTab.pnlMemo);
|
||||||
QueryTab.spltHelpers.Parent := QueryTab.pnlMemo;
|
QueryTab.spltHelpers.Parent := QueryTab.pnlMemo;
|
||||||
|
Reference in New Issue
Block a user