Skip to content

Commit d896680

Browse files
committed
feat: grid export option for exporting the focused grid column only
Refs #2490
1 parent a5ae04b commit d896680

4 files changed

Lines changed: 88 additions & 35 deletions

File tree

extra/locale/heidisql.po

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6845,3 +6845,6 @@ msgstr "Copies selected text with formatting from current editor to clipboard"
68456845

68466846
msgid "Edit value without foreign key lookup"
68476847
msgstr "Edit value without foreign key lookup"
6848+
6849+
msgid "Only focused column (%s)"
6850+
msgstr "Only focused column (%s)"

source/apphelpers.pas

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ TWinControlHelper = class helper for TWinControl
195195
asExportSQLDatabase, asExportSQLServerDatabase, asExportSQLOutput, asExportSQLAddComments, asExportSQLTransactions, asExportSQLRemoveAutoIncrement, asExportSQLRemoveDefiner,
196196
asGridExportWindowWidth, asGridExportWindowHeight, asGridExportOutputCopy, asGridExportOutputFile,
197197
asGridExportFilename, asGridExportRecentFiles, asGridExportEncoding, asGridExportFormat, asGridExportSelection,
198-
asGridExportColumnNames, asGridExportIncludeAutoInc, asGridExportIncludeQuery, asGridExportRemoveLinebreaks, asGridExportOpenFile,
198+
asGridExportColumnNames, asGridExportIncludeAutoInc, asGridExportFocusedColumnOnly, asGridExportIncludeQuery, asGridExportRemoveLinebreaks, asGridExportOpenFile,
199199
asGridExportSeparator, asGridExportEncloser, asGridExportTerminator, asGridExportNull,
200200

201201
asGridExportClpColumnNames, asGridExportClpIncludeAutoInc, asGridExportClpRemoveLinebreaks,
@@ -3695,6 +3695,7 @@ constructor TAppSettings.Create;
36953695
InitSetting(asGridExportSelection, 'GridExportSelection', 1);
36963696
InitSetting(asGridExportColumnNames, 'GridExportColumnNames', 0, True);
36973697
InitSetting(asGridExportIncludeAutoInc, 'GridExportAutoInc', 0, True);
3698+
InitSetting(asGridExportFocusedColumnOnly, 'GridExportFocusedColumnOnly', 0, False);
36983699
InitSetting(asGridExportIncludeQuery, 'GridExportIncludeQuery', 0, False);
36993700
InitSetting(asGridExportRemoveLinebreaks, 'GridExportRemoveLinebreaks', 0, False);
37003701
InitSetting(asGridExportOpenFile, 'GridExportOpenFile', 0, False);

source/exportgrid.lfm

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -219,12 +219,14 @@ object frmExportGrid: TfrmExportGrid
219219
Caption = 'NULL value:'
220220
end
221221
object chkIncludeColumnNames: TCheckBox
222+
AnchorSideLeft.Control = grpOptions
222223
AnchorSideTop.Control = grpOptions
223-
Left = 8
224+
Left = 5
224225
Height = 19
225-
Top = 5
226+
Top = 3
226227
Width = 139
227-
BorderSpacing.Around = 5
228+
BorderSpacing.Left = 5
229+
BorderSpacing.Top = 3
228230
Caption = 'Include column names'
229231
Checked = True
230232
State = cbChecked
@@ -288,24 +290,28 @@ object frmExportGrid: TfrmExportGrid
288290
OnChange = editCSVChange
289291
end
290292
object chkIncludeAutoIncrement: TCheckBox
293+
AnchorSideLeft.Control = grpOptions
291294
AnchorSideTop.Control = chkIncludeColumnNames
292295
AnchorSideTop.Side = asrBottom
293-
Left = 8
296+
Left = 5
294297
Height = 19
295-
Top = 29
298+
Top = 25
296299
Width = 185
297-
BorderSpacing.Around = 5
300+
BorderSpacing.Left = 5
301+
BorderSpacing.Top = 3
298302
Caption = 'Include auto increment column'
299303
TabOrder = 1
300304
end
301305
object chkIncludeQuery: TCheckBox
302-
AnchorSideTop.Control = chkIncludeAutoIncrement
306+
AnchorSideLeft.Control = grpOptions
307+
AnchorSideTop.Control = chkFocusedColumnOnly
303308
AnchorSideTop.Side = asrBottom
304-
Left = 8
309+
Left = 5
305310
Height = 19
306-
Top = 53
311+
Top = 69
307312
Width = 114
308-
BorderSpacing.Around = 5
313+
BorderSpacing.Left = 5
314+
BorderSpacing.Top = 3
309315
Caption = 'Include SQL query'
310316
TabOrder = 2
311317
end
@@ -329,27 +335,44 @@ object frmExportGrid: TfrmExportGrid
329335
OnChange = editCSVChange
330336
end
331337
object chkRemoveLinebreaks: TCheckBox
338+
AnchorSideLeft.Control = grpOptions
332339
AnchorSideTop.Control = chkIncludeQuery
333340
AnchorSideTop.Side = asrBottom
334-
Left = 8
341+
Left = 5
335342
Height = 19
336-
Top = 77
343+
Top = 91
337344
Width = 195
338-
BorderSpacing.Around = 5
345+
BorderSpacing.Left = 5
346+
BorderSpacing.Top = 3
339347
Caption = 'Remove linebreaks from contents'
340348
TabOrder = 3
341349
end
342350
object chkOpenFile: TCheckBox
351+
AnchorSideLeft.Control = grpOptions
343352
AnchorSideTop.Control = chkRemoveLinebreaks
344353
AnchorSideTop.Side = asrBottom
345-
Left = 8
354+
Left = 5
346355
Height = 19
347-
Top = 101
356+
Top = 113
348357
Width = 139
349-
BorderSpacing.Around = 5
358+
BorderSpacing.Left = 5
359+
BorderSpacing.Top = 3
350360
Caption = 'Open file after creation'
351361
TabOrder = 4
352362
end
363+
object chkFocusedColumnOnly: TCheckBox
364+
AnchorSideLeft.Control = grpOptions
365+
AnchorSideTop.Control = chkIncludeAutoIncrement
366+
AnchorSideTop.Side = asrBottom
367+
Left = 5
368+
Height = 19
369+
Top = 47
370+
Width = 158
371+
BorderSpacing.Left = 5
372+
BorderSpacing.Top = 3
373+
Caption = 'Only focused column (%s)'
374+
TabOrder = 9
375+
end
353376
end
354377
object btnSetClipboardDefaults: TSpeedButton
355378
AnchorSideBottom.Control = Owner

source/exportgrid.pas

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ interface
3535
TfrmExportGrid = class(TExtForm)
3636
btnOK: TButton;
3737
btnCancel: TButton;
38+
chkFocusedColumnOnly: TCheckBox;
3839
grpSelection: TRadioGroup;
3940
grpOutput: TGroupBox;
4041
radioOutputCopyToClipboard: TRadioButton;
@@ -190,6 +191,7 @@ procedure TfrmExportGrid.FormCreate(Sender: TObject);
190191
grpSelection.ItemIndex := 0; // Always use selected cells in copy mode
191192
chkIncludeColumnNames.Checked := AppSettings.ReadBool(asGridExportClpColumnNames);
192193
chkIncludeAutoIncrement.Checked := AppSettings.ReadBool(asGridExportClpIncludeAutoInc);
194+
chkFocusedColumnOnly.Checked := False;
193195
chkIncludeQuery.Checked := False; // Always off in copy mode
194196
chkRemoveLinebreaks.Checked := AppSettings.ReadBool(asGridExportClpRemoveLinebreaks);
195197
chkOpenFile.Checked := False; // Always off in copy mode
@@ -204,6 +206,7 @@ procedure TfrmExportGrid.FormCreate(Sender: TObject);
204206
grpSelection.ItemIndex := AppSettings.ReadInt(asGridExportSelection);
205207
chkIncludeColumnNames.Checked := AppSettings.ReadBool(asGridExportColumnNames);
206208
chkIncludeAutoIncrement.Checked := AppSettings.ReadBool(asGridExportIncludeAutoInc);
209+
chkFocusedColumnOnly.Checked := AppSettings.ReadBool(asGridExportFocusedColumnOnly);
207210
chkIncludeQuery.Checked := AppSettings.ReadBool(asGridExportIncludeQuery);
208211
chkRemoveLinebreaks.Checked := AppSettings.ReadBool(asGridExportRemoveLinebreaks);
209212
chkOpenFile.Checked := AppSettings.ReadBool(asGridExportOpenFile);
@@ -217,10 +220,17 @@ procedure TfrmExportGrid.FormCreate(Sender: TObject);
217220

218221

219222
procedure TfrmExportGrid.FormShow(Sender: TObject);
223+
var
224+
FocusedCol: String;
220225
begin
221226
// Show dialog. Expect "Grid" property to be set now by the caller.
222227
chkIncludeAutoIncrement.OnClick := CalcSize;
228+
chkFocusedColumnOnly.OnClick := CalcSize;
223229
CalcSize(Sender);
230+
// Show name of focused column
231+
FocusedCol := IfThen(Grid.FocusedColumn > NoColumn, Grid.Header.Columns[Grid.FocusedColumn].Text, '');
232+
chkFocusedColumnOnly.Caption := f_('Only focused column (%s)', [FocusedCol]);
233+
chkFocusedColumnOnly.Enabled := not FocusedCol.IsEmpty;
224234
end;
225235

226236

@@ -237,6 +247,7 @@ procedure TfrmExportGrid.FormClose(Sender: TObject; var Action: TCloseAction);
237247
AppSettings.WriteInt(asGridExportSelection, grpSelection.ItemIndex);
238248
AppSettings.WriteBool(asGridExportColumnNames, chkIncludeColumnNames.Checked);
239249
AppSettings.WriteBool(asGridExportIncludeAutoInc, chkIncludeAutoIncrement.Checked);
250+
AppSettings.WriteBool(asGridExportFocusedColumnOnly, chkFocusedColumnOnly.Checked);
240251
AppSettings.WriteBool(asGridExportIncludeQuery, chkIncludeQuery.Checked);
241252
AppSettings.WriteBool(asGridExportRemoveLinebreaks, chkRemoveLinebreaks.Checked);
242253
AppSettings.WriteBool(asGridExportOpenFile, chkOpenFile.Checked);
@@ -466,11 +477,12 @@ procedure TfrmExportGrid.CalcSize(Sender: TObject);
466477
var
467478
GridData: TDBQuery;
468479
Node: PVirtualNode;
469-
Col, ExcludeCol: TColumnIndex;
480+
Col, ExcludeAutoIncCol, IncludeFocusedCol: TColumnIndex;
470481
ResultCol: Integer;
471482
RowNum: PInt64;
472483
SelectedSize, AllSize: Int64;
473484
CalculatedCount, SelectedCount, AllCount: Int64;
485+
DoIncludeCol: Boolean;
474486
begin
475487
GridData := Mainform.GridResult(Grid);
476488
if not Assigned(GridData) then begin
@@ -479,10 +491,13 @@ procedure TfrmExportGrid.CalcSize(Sender: TObject);
479491
end;
480492
AllSize := 0;
481493
SelectedSize := 0;
482-
chkIncludeAutoIncrement.Enabled := GridData.AutoIncrementColumn > -1;
483-
ExcludeCol := -1;
494+
chkIncludeAutoIncrement.Enabled := (GridData.AutoIncrementColumn > -1) and (not chkFocusedColumnOnly.Checked);
495+
ExcludeAutoIncCol := -1;
484496
if chkIncludeAutoIncrement.Enabled and (not chkIncludeAutoIncrement.Checked) then
485-
ExcludeCol := GridData.AutoIncrementColumn;
497+
ExcludeAutoIncCol := GridData.AutoIncrementColumn;
498+
IncludeFocusedCol := -1;
499+
if chkFocusedColumnOnly.Enabled and chkFocusedColumnOnly.Checked then
500+
IncludeFocusedCol := Grid.FocusedColumn;
486501

487502
Node := GetNextNode(Grid, nil, False);
488503
CalculatedCount := 0;
@@ -500,7 +515,9 @@ procedure TfrmExportGrid.CalcSize(Sender: TObject);
500515
Col := Grid.Header.Columns.GetFirstVisibleColumn(True);
501516
while Col > NoColumn do begin
502517
ResultCol := Col - 1;
503-
if Col <> ExcludeCol then begin
518+
DoIncludeCol := (Col <> ExcludeAutoIncCol) and
519+
((IncludeFocusedCol < 0) or (Col = IncludeFocusedCol));
520+
if DoIncludeCol then begin
504521
Inc(AllSize, GridData.ColumnLengths(ResultCol));
505522
if vsSelected in Node.States then
506523
Inc(SelectedSize, GridData.ColumnLengths(ResultCol));
@@ -639,7 +656,7 @@ function TfrmExportGrid.FormatLatex(Text: String): String;
639656

640657
procedure TfrmExportGrid.btnOKClick(Sender: TObject);
641658
var
642-
Col, ExcludeCol: TColumnIndex;
659+
Col, ExcludeAutoIncCol, IncludeFocusedCol: TColumnIndex;
643660
ResultCol: Integer;
644661
Header, Data, tmp, Encloser, Separator, Terminator, TableName, Filename: String;
645662
Node: PVirtualNode;
@@ -654,6 +671,12 @@ procedure TfrmExportGrid.btnOKClick(Sender: TObject);
654671
Encoding: TEncoding;
655672
Bom: TBytes;
656673
CurrentExportFormat: TGridExportFormat;
674+
675+
function DoIncludeCol: Boolean;
676+
begin
677+
Result := (Col <> ExcludeAutoIncCol) and
678+
((IncludeFocusedCol < 0) or (Col = IncludeFocusedCol))
679+
end;
657680
begin
658681
Filename := GetOutputFilename(editFilename.Text, MainForm.ActiveDbObj);
659682

@@ -682,9 +705,12 @@ procedure TfrmExportGrid.btnOKClick(Sender: TObject);
682705
except
683706
TableName := _('UnknownTable');
684707
end;
685-
ExcludeCol := NoColumn;
686-
if (not chkIncludeAutoIncrement.Checked) or (not chkIncludeAutoIncrement.Enabled) then
687-
ExcludeCol := GridData.AutoIncrementColumn + 1;
708+
ExcludeAutoIncCol := NoColumn;
709+
if chkIncludeAutoIncrement.Enabled and (not chkIncludeAutoIncrement.Checked) then
710+
ExcludeAutoIncCol := GridData.AutoIncrementColumn + 1;
711+
IncludeFocusedCol := NoColumn;
712+
if chkFocusedColumnOnly.Checked then
713+
IncludeFocusedCol := Grid.FocusedColumn;
688714
// Calling (Get)ExportFormat is slow, so we store it in a local variable
689715
CurrentExportFormat := ExportFormat;
690716

@@ -748,7 +774,7 @@ procedure TfrmExportGrid.btnOKClick(Sender: TObject);
748774
CodeIndent(4) + '<tr>' + sLineBreak;
749775
Col := Grid.Header.Columns.GetFirstVisibleColumn(True);
750776
while Col > NoColumn do begin
751-
if Col <> ExcludeCol then
777+
if DoIncludeCol then
752778
Header := Header + CodeIndent(5) + '<th class="col' + IntToStr(Col) + '">' + Grid.Header.Columns[Col].Text + '</th>' + sLineBreak;
753779
Col := Grid.Header.Columns.GetNextVisibleColumn(Col);
754780
end;
@@ -768,7 +794,7 @@ procedure TfrmExportGrid.btnOKClick(Sender: TObject);
768794
while Col > NoColumn do begin
769795
// Alter column name in header if data is not raw.
770796
ResultCol := Col - 1;
771-
if Col <> ExcludeCol then begin
797+
if DoIncludeCol then begin
772798
Data := Grid.Header.Columns[Col].Text;
773799
if (GridData.DataType(ResultCol).Category in [dtcBinary, dtcSpatial]) and (not Mainform.actBlobAsText.Checked) then
774800
Data := 'HEX(' + Data + ')';
@@ -800,15 +826,15 @@ procedure TfrmExportGrid.btnOKClick(Sender: TObject);
800826
Header := Header + '{';
801827
Col := Grid.Header.Columns.GetFirstVisibleColumn(True);
802828
while Col > NoColumn do begin
803-
if Col <> ExcludeCol then
829+
if DoIncludeCol then
804830
Header := Header + ' c ';
805831
Col := Grid.Header.Columns.GetNextVisibleColumn(Col);
806832
end;
807833
Header := Header + '}' + CRLF;
808834
if chkIncludeColumnNames.Checked then begin
809835
Col := Grid.Header.Columns.GetFirstVisibleColumn(True);
810836
while Col > NoColumn do begin
811-
if Col <> ExcludeCol then
837+
if DoIncludeCol then
812838
Header := Header + FormatLatex(Grid.Header.Columns[Col].Text) + Separator;
813839
Col := Grid.Header.Columns.GetNextVisibleColumn(Col);
814840
end;
@@ -825,7 +851,7 @@ procedure TfrmExportGrid.btnOKClick(Sender: TObject);
825851
Header := TrimLeft(Separator);
826852
Col := Grid.Header.Columns.GetFirstVisibleColumn(True);
827853
while Col > NoColumn do begin
828-
if Col <> ExcludeCol then
854+
if DoIncludeCol then
829855
Header := Header + Grid.Header.Columns[Col].Text + Separator;
830856
Col := Grid.Header.Columns.GetNextVisibleColumn(Col);
831857
end;
@@ -853,7 +879,7 @@ procedure TfrmExportGrid.btnOKClick(Sender: TObject);
853879
Header := Header + TrimLeft(Separator);
854880
Col := Grid.Header.Columns.GetFirstVisibleColumn(True);
855881
while Col > NoColumn do begin
856-
if Col <> ExcludeCol then begin
882+
if DoIncludeCol then begin
857883
if chkIncludeColumnNames.Checked then
858884
Header := Header + Grid.Header.Columns[Col].Text + Separator
859885
else
@@ -867,7 +893,7 @@ procedure TfrmExportGrid.btnOKClick(Sender: TObject);
867893
Col := Grid.Header.Columns.GetFirstVisibleColumn(True);
868894
while Col > NoColumn do begin
869895
ResultCol := Col - 1;
870-
if Col <> ExcludeCol then begin
896+
if DoIncludeCol then begin
871897
Header := Header + '---';
872898
if GridData.DataType(ResultCol).Category in [dtcInteger, dtcReal] then
873899
Header := Header + ':';
@@ -935,7 +961,7 @@ procedure TfrmExportGrid.btnOKClick(Sender: TObject);
935961
Col := Grid.Header.Columns.GetFirstVisibleColumn(True);
936962
while Col > NoColumn do begin
937963
ResultCol := Col - 1;
938-
if (Col <> ExcludeCol) and (not GridData.ColIsVirtual(ResultCol)) then
964+
if DoIncludeCol and (not GridData.ColIsVirtual(ResultCol)) then
939965
tmp := tmp + GridData.Connection.QuoteIdent(Grid.Header.Columns[Col].Text)+', ';
940966
Col := Grid.Header.Columns.GetNextVisibleColumn(Col);
941967
end;
@@ -972,7 +998,7 @@ procedure TfrmExportGrid.btnOKClick(Sender: TObject);
972998
Col := Grid.Header.Columns.GetFirstVisibleColumn(True);
973999
while Col > NoColumn do begin
9741000
ResultCol := Col - 1;
975-
if Col <> ExcludeCol then begin
1001+
if DoIncludeCol then begin
9761002
if (GridData.DataType(ResultCol).Category in [dtcBinary, dtcSpatial])
9771003
and (not Mainform.actBlobAsText.Checked) then begin
9781004
Data := GridData.HexValue(ResultCol);

0 commit comments

Comments
 (0)