Skip to content

Commit 938f303

Browse files
committed
feat: add toolbar button for toggling reverse foreign key listing, so the user has the chance to disable its potentially long during query
Refs #1825
1 parent ca48343 commit 938f303

File tree

4 files changed

+71
-5
lines changed

4 files changed

+71
-5
lines changed

extra/locale/heidisql.po

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ msgid ""
77
msgstr ""
88
"Project-Id-Version: HeidiSQL\n"
99
"POT-Creation-Date: 2012-11-05 21:40\n"
10-
"PO-Revision-Date: 2026-02-28 11:20+0100\n"
10+
"PO-Revision-Date: 2026-02-28 15:20+0100\n"
1111
"Last-Translator: Ansgar Becker <anse@heidisql.com>\n"
1212
"Language-Team: English (http://www.transifex.com/projects/p/heidisql/language/en/)\n"
1313
"Language: en\n"
@@ -6794,3 +6794,9 @@ msgstr "Wine support is deprecated. Future versions will not work reliably. Use
67946794

67956795
msgid "deprecated"
67966796
msgstr "deprecated"
6797+
6798+
msgid "Reverse"
6799+
msgstr "Reverse"
6800+
6801+
msgid "Show reverse foreign keys"
6802+
msgstr "Show reverse foreign keys"

source/apphelpers.pas

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ TWinControlHelper = class helper for TWinControl
233233
asThemePreviewWidth, asThemePreviewHeight, asThemePreviewTop, asThemePreviewLeft,
234234
asCreateDbCollation, asRealTrailingZeros,
235235
asSequalSuggestWindowWidth, asSequalSuggestWindowHeight, asSequalSuggestPrompt, asSequalSuggestRecentPrompts,
236-
asReformatter, asReformatterNoDialog, asAlwaysGenerateFilter,
236+
asReformatter, asReformatterNoDialog, asAlwaysGenerateFilter, asDisplayReverseForeignKeys,
237237
asGenerateDataNumRows, asGenerateDataNullAmount, asWebOnceAction, asDisplayLogPanel, asDisplayTreeFilters,
238238
asUnused);
239239
TAppSetting = record
@@ -3783,6 +3783,7 @@ constructor TAppSettings.Create;
37833783
InitSetting(asReformatter, 'Reformatter', 0);
37843784
InitSetting(asReformatterNoDialog, 'ReformatterNoDialog', 0);
37853785
InitSetting(asAlwaysGenerateFilter, 'AlwaysGenerateFilter', 0, False);
3786+
InitSetting(asDisplayReverseForeignKeys, 'DisplayReverseForeignKeys', 0, False);
37863787
InitSetting(asGenerateDataNumRows, 'GenerateDataNumRows', 1000);
37873788
InitSetting(asGenerateDataNullAmount, 'GenerateDataNullAmount', 10);
37883789

source/table_editor.lfm

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,15 @@ object frmTableEditor: TfrmTableEditor
498498
ImageIndex = 26
499499
OnClick = btnClearForeignKeysClick
500500
end
501+
object btnShowReverseForeignKeys: TToolButton
502+
Left = 1
503+
Hint = 'Show reverse foreign keys'
504+
Top = 86
505+
Caption = 'Reverse'
506+
ImageIndex = 40
507+
Style = tbsCheck
508+
OnClick = btnShowReverseForeignKeysClick
509+
end
501510
end
502511
object listForeignKeys: TLazVirtualStringTree
503512
AnchorSideLeft.Control = tlbForeignKeys
@@ -581,23 +590,25 @@ object frmTableEditor: TfrmTableEditor
581590
Top = 0
582591
Width = 178
583592
Anchors = [akTop, akLeft, akRight, akBottom]
593+
AutoWidthLastColumn = True
584594
Columns = <
585595
item
586596
AutoSize = True
587597
Caption = 'Database'
588598
Width = 63
589599
end
590600
item
591-
AutoSize = True
592601
Caption = 'Table'
593-
Width = 44
602+
Width = 111
594603
end>
595604
ColumnClick = False
596605
ReadOnly = True
597606
RowSelect = True
598607
SmallImages = MainForm.ImageListMain
599608
TabOrder = 2
609+
Visible = False
600610
ViewStyle = vsReport
611+
OnDblClick = ListViewReverseForeignKeysDblClick
601612
end
602613
object spltForeignKeyListings: TSplitter
603614
AnchorSideTop.Control = tabForeignKeys
@@ -611,6 +622,7 @@ object frmTableEditor: TfrmTableEditor
611622
Align = alNone
612623
Anchors = [akTop, akBottom]
613624
ResizeAnchor = akRight
625+
Visible = False
614626
end
615627
end
616628
object tabCheckConstraints: TTabSheet

source/table_editor.pas

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ TfrmTableEditor = class(TFrame)
4848
comboCollation: TComboBox;
4949
lblEngine: TLabel;
5050
comboEngine: TComboBox;
51+
btnShowReverseForeignKeys: TToolButton;
5152
treeIndexes: TLazVirtualStringTree;
5253
tlbIndexes: TToolBar;
5354
btnAddIndex: TToolButton;
@@ -101,6 +102,8 @@ TfrmTableEditor = class(TFrame)
101102
btnClearCheckConstraints: TToolButton;
102103
listCheckConstraints: TLazVirtualStringTree;
103104
Copy1: TMenuItem;
105+
procedure btnShowReverseForeignKeysClick(Sender: TObject);
106+
procedure ListViewReverseForeignKeysDblClick(Sender: TObject);
104107
procedure Modification(Sender: TObject);
105108
procedure btnAddColumnClick(Sender: TObject);
106109
procedure btnRemoveColumnClick(Sender: TObject);
@@ -294,6 +297,7 @@ constructor TfrmTableEditor.Create(AOwner: TComponent);
294297
for i in ColNumsCheckboxes do begin
295298
listColumns.Header.Columns[i].Alignment := taCenter;
296299
end;
300+
btnShowReverseForeignKeys.Down := AppSettings.ReadBool(asDisplayReverseForeignKeys);
297301
FixVT(listColumns);
298302
FixVT(treeIndexes);
299303
FixVT(listForeignKeys);
@@ -453,6 +457,7 @@ procedure TfrmTableEditor.Init(Obj: TDBObject);
453457
CreateCodeValid := False;
454458
AlterCodeValid := False;
455459
FReverseForeignKeysLoaded := False;
460+
btnShowReverseForeignKeysClick(Self);
456461
PageControlMainChange(Self); // Foreign key editor needs a hit
457462
// Buttons are randomly moved, since VirtualTree update, see #440
458463
btnSave.Top := Height - btnSave.Height - 3;
@@ -1051,6 +1056,42 @@ procedure TfrmTableEditor.Modification(Sender: TObject);
10511056
end;
10521057
end;
10531058

1059+
procedure TfrmTableEditor.ListViewReverseForeignKeysDblClick(Sender: TObject);
1060+
var
1061+
ClickItem: TListItem;
1062+
Obj: TDBObject;
1063+
begin
1064+
// Create virtual object and let mainform search for it in the tree
1065+
ClickItem := ListViewReverseForeignKeys.Selected;
1066+
if not Assigned(ClickItem) then
1067+
Exit;
1068+
Obj := TDBObject.Create(DBObject.Connection);
1069+
Obj.NodeType := lntTable;
1070+
Obj.Database := ClickItem.Caption;
1071+
Obj.Name := ClickItem.SubItems[0];
1072+
MainForm.ActiveDbObj := Obj;
1073+
end;
1074+
1075+
procedure TfrmTableEditor.btnShowReverseForeignKeysClick(Sender: TObject);
1076+
var
1077+
DoShow: Boolean;
1078+
begin
1079+
DoShow := btnShowReverseForeignKeys.Down;
1080+
if DoShow then begin
1081+
spltForeignKeyListings.Visible := True;
1082+
ListViewReverseForeignKeys.Visible := True;
1083+
spltForeignKeyListings.BringToFront;
1084+
ListViewReverseForeignKeys.BringToFront;
1085+
LoadReverseForeignKeys(Sender);
1086+
end
1087+
else begin
1088+
ListViewReverseForeignKeys.Visible := False;
1089+
spltForeignKeyListings.Visible := False;
1090+
listForeignKeys.Width := listForeignKeys.Parent.Width - tlbForeignKeys.Width;
1091+
end;
1092+
AppSettings.WriteBool(asDisplayReverseForeignKeys, DoShow);
1093+
end;
1094+
10541095

10551096
procedure TfrmTableEditor.btnAddColumnClick(Sender: TObject);
10561097
var
@@ -3086,9 +3127,15 @@ procedure TfrmTableEditor.LoadReverseForeignKeys(Sender: TObject);
30863127
begin
30873128
if FReverseForeignKeysLoaded then
30883129
Exit;
3130+
if not ListViewReverseForeignKeys.Visible then
3131+
Exit;
3132+
if not ObjectExists then // Jump out early when creating a new table
3133+
Exit;
30893134
SqlGet := DBObject.Connection.SqlProvider.GetSql(qGetReverseForeignKeys, DBObject.AsStringMap);
3090-
if SqlGet.IsEmpty then
3135+
if SqlGet.IsEmpty then begin
3136+
MainForm.LogSQL(_('Database does not provide reverse foreign key listing'));
30913137
Exit;
3138+
end;
30923139
ListViewReverseForeignKeys.BeginUpdate;
30933140
ListViewReverseForeignKeys.Clear;
30943141
try

0 commit comments

Comments
 (0)