mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2025-08-06 18:24:26 +08:00
215 lines
5.3 KiB
ObjectPascal
215 lines
5.3 KiB
ObjectPascal
unit column_selection;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Classes, Controls, Forms, StdCtrls, CheckLst, ExtCtrls, TntCheckLst, WideStrings, Contnrs;
|
|
|
|
type
|
|
TColumnSelectionForm = class(TForm)
|
|
pnlBevel: TPanel; // This panel has the only duty to display a normal border at the edges of the form
|
|
btnCancel: TButton;
|
|
btnOK: TButton;
|
|
chkSelectAll: TCheckBox;
|
|
chklistColumns: TTNTCheckListBox;
|
|
chkSort: TCheckBox;
|
|
procedure btnCancelClick(Sender: TObject);
|
|
procedure FormShow(Sender: TObject);
|
|
procedure chklistColumnsClickCheck(Sender: TObject);
|
|
procedure chkSelectAllClick(Sender: TObject);
|
|
procedure btnOKClick(Sender: TObject);
|
|
procedure chkSortClick(Sender: TObject);
|
|
procedure FormClose(Sender: TObject; var Action: TCloseAction);
|
|
procedure FormDeactivate(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
private
|
|
{ Private declarations }
|
|
Columns: TObjectList;
|
|
public
|
|
{ Public declarations }
|
|
end;
|
|
|
|
var
|
|
reg_name : String;
|
|
|
|
implementation
|
|
|
|
uses main, helpers;
|
|
|
|
|
|
{$R *.dfm}
|
|
|
|
|
|
|
|
procedure TColumnSelectionForm.FormCreate(Sender: TObject);
|
|
begin
|
|
InheritFont(Font);
|
|
Columns := TObjectList.Create;
|
|
end;
|
|
|
|
|
|
{**
|
|
FormShow
|
|
}
|
|
procedure TColumnSelectionForm.FormShow(Sender: TObject);
|
|
var
|
|
i: Integer;
|
|
Col: TTableColumn;
|
|
begin
|
|
ParseTableStructure(Mainform.SelectedTableCreateStatement, Columns);
|
|
for i:=0 to Columns.Count-1 do begin
|
|
Col := TTableColumn(Columns[i]);
|
|
chklistColumns.Items.Add(Col.Name);
|
|
end;
|
|
|
|
// Check items!
|
|
if Mainform.FDataGridSelect.Count = 0 then // Simply check all items
|
|
ToggleCheckListBox( chklistColumns, True )
|
|
else // Only check selected items
|
|
ToggleCheckListBox( chklistColumns, True, Mainform.FDataGridSelect );
|
|
|
|
// Call check-event to update state of "Select / Deselect all" checkbox
|
|
chklistColumnsClickCheck( Sender );
|
|
|
|
// Restore last used sorting state from registry
|
|
chkSort.Checked := GetRegValue(REGNAME_SORTDISPLAYEDCOLUMNS, chkSort.Checked);
|
|
end;
|
|
|
|
|
|
{**
|
|
OK clicked
|
|
}
|
|
procedure TColumnSelectionForm.btnOKClick(Sender: TObject);
|
|
var
|
|
i : Integer;
|
|
begin
|
|
// Prepare string for storing in registry.
|
|
// Use quote-character as separator to ensure columnnames can
|
|
// be extracted safely later
|
|
Mainform.FDataGridSelect.Clear;
|
|
for i := 0 to chklistColumns.Items.Count - 1 do
|
|
begin
|
|
if chklistColumns.Checked[i] then
|
|
Mainform.FDataGridSelect.Add(chklistColumns.Items[i]);
|
|
end;
|
|
|
|
// If all columns were selected, delete existing superflous reg-value
|
|
// Otherwise, save value
|
|
if Mainform.FDataGridSelect.Count = chklistColumns.Items.Count then
|
|
Mainform.FDataGridSelect.Clear;
|
|
|
|
Mainform.viewdata(Sender);
|
|
|
|
btnCancel.OnClick(Sender);
|
|
end;
|
|
|
|
|
|
{**
|
|
Select / Deselect all
|
|
}
|
|
procedure TColumnSelectionForm.chkSelectAllClick(Sender: TObject);
|
|
begin
|
|
// Avoid executing when checkbox was toggled by code (see proc below)
|
|
if (Sender as TCheckBox).Focused then
|
|
ToggleCheckListBox( chklistColumns, (Sender as TCheckBox).Checked );
|
|
end;
|
|
|
|
|
|
{**
|
|
Click within column list
|
|
Updates state of "Select / deselect all" checkbox
|
|
}
|
|
procedure TColumnSelectionForm.chklistColumnsClickCheck(Sender: TObject);
|
|
var
|
|
i : Integer;
|
|
allSelected, noneSelected : Boolean;
|
|
begin
|
|
allselected := True;
|
|
noneSelected := True;
|
|
for i := 0 to chklistColumns.Items.Count - 1 do
|
|
begin
|
|
if chklistColumns.Checked[i] then
|
|
begin
|
|
noneSelected := False;
|
|
end
|
|
else
|
|
begin
|
|
allSelected := False;
|
|
end;
|
|
end;
|
|
if noneSelected then
|
|
chkSelectAll.State := cbUnchecked
|
|
else if allSelected then
|
|
chkSelectAll.State := cbChecked
|
|
else
|
|
chkSelectAll.State := cbGrayed;
|
|
|
|
end;
|
|
|
|
|
|
{**
|
|
Sort / Unsort the list with fields
|
|
}
|
|
procedure TColumnSelectionForm.chkSortClick(Sender: TObject);
|
|
var
|
|
checkedfields : TStringList;
|
|
i: Integer;
|
|
Col: TTableColumn;
|
|
begin
|
|
// Memorize checked items in a list
|
|
checkedfields := TStringList.Create;
|
|
for i := 0 to chklistColumns.Items.Count - 1 do begin
|
|
if chklistColumns.Checked[i] then
|
|
checkedfields.Add(chklistColumns.Items[i]);
|
|
end;
|
|
|
|
chklistColumns.Sorted := TCheckBox(Sender).Checked;
|
|
|
|
// Setting Sorted to false doesn't resort anything in the list.
|
|
// So we have to add all items again in original order
|
|
if not chklistColumns.Sorted then begin
|
|
// Add all fieldnames again
|
|
chklistColumns.Items.BeginUpdate;
|
|
chklistColumns.Clear;
|
|
for i:=0 to Columns.Count-1 do begin
|
|
Col := TTableColumn(Columns[i]);
|
|
chklistColumns.Items.Add(Col.Name);
|
|
end;
|
|
chklistColumns.Items.EndUpdate;
|
|
end;
|
|
|
|
// check those which are in the checkedfields list
|
|
for i := 0 to chklistColumns.Items.Count-1 do begin
|
|
chklistColumns.Checked[i] := checkedfields.IndexOf( chklistColumns.Items[i] ) > -1;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TColumnSelectionForm.btnCancelClick(Sender: TObject);
|
|
begin
|
|
Mainform.tbtnDataColumns.Down := False;
|
|
Close;
|
|
end;
|
|
|
|
|
|
{**
|
|
Cancel this dialog if the user clicks elsewhere on mainform
|
|
}
|
|
procedure TColumnSelectionForm.FormDeactivate(Sender: TObject);
|
|
begin
|
|
btnCancel.OnClick(Sender);
|
|
end;
|
|
|
|
|
|
{**
|
|
Be sure the form is destroyed after closing.
|
|
}
|
|
procedure TColumnSelectionForm.FormClose(Sender: TObject; var Action:
|
|
TCloseAction);
|
|
begin
|
|
Action := caFree;
|
|
end;
|
|
|
|
|
|
end.
|