(* Tux Commander - UColumns - Panel Columns Settings dialog Copyright (C) 2007 Tomas Bzatek Check for updates on tuxcmd.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) unit UColumns; interface uses SysUtils, Classes, lazglib2, lazgdk3, lazgtk3, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKView, GTKPixbuf; type TFColumns = class(TGTKDialog) TitleFrame: TGTKFrame; TitleLabel: TGTKLabel; TitleEventBox: TGTKEventBox; TitleIcon: TGTKImage; TitleHBox: TGTKHBox; ListView: TGTKListView; ListViewScrolledWindow: TGTKScrolledWindow; ListViewGrid: TGTKGrid; MoveUpButton, MoveDownButton: TGTKButton; procedure FormCreate(Sender: TObject); override; procedure ListViewSelectionChanged(Sender: TObject); procedure MoveUpDownButtonButtonClick(Sender: TObject); procedure ListViewColumnToggled(Sender: TObject; Column: TGTKTreeViewColumn; Item: TGTKListItem); private procedure AddColumnItems; public procedure ApplyColumnList; end; var FColumns: TFColumns; implementation uses ULocale, UConfig; procedure TFColumns.FormCreate(Sender: TObject); var Column: TGTKTreeViewColumn; row_targets: TGtkTargetEntry; VBox: TGTKVBox; begin row_targets.target := PChar('GTK_TREE_MODEL_ROW'); row_targets.flags := guint(GTK_TARGET_SAME_WIDGET); row_targets.info := 1; SetDefaultSize(250, 350); Caption := LANGColumns_Caption; Buttons := [mbOK, mbCancel]; TitleEventBox := TGTKEventBox.Create(Self); TitleLabel := TGTKLabel.Create(Self); TitleLabel.Caption := Format('%s', [LANGColumns_Title]); TitleLabel.UseMarkup := True; TitleLabel.XAlign := 0; TitleLabel.MarginStart := 0; TitleLabel.MarginEnd := 0; TitleLabel.MarginTop := 3; TitleLabel.MarginBottom := 3; TitleEventBox.ControlState := csPrelight; TitleFrame := TGTKFrame.CreateWithoutLabel(Self); TitleFrame.ShadowType := stShadowOut; TitleIcon := TGTKImage.Create(Self); TitleIcon.SetFromIconName('gtk-justify-center', isLargeToolbar); TitleHBox := TGTKHBox.Create(Self); TitleHBox.Homogeneous := False; TitleHBox.AddControlEx(TGTKEventBox.Create(Self), False, False, 5); TitleHBox.AddControlEx(TitleIcon, False, False, 0); TitleHBox.AddControlEx(TitleLabel, True, True, 10); TitleEventBox.AddControl(TitleHBox); TitleFrame.AddControl(TitleEventBox); ClientArea.AddControlEx(TitleFrame, False, True, 0); ListViewGrid := TGTKGrid.Create(Self); ListViewGrid.BorderWidth := 7; ClientArea.AddControlEx(ListViewGrid, True, True, 0); ListView := TGTKListView.CreateTyped(Self, False, [lcBoolean, lcText, lcNumber]); { ListView.Reorderable := True; g_object_set(ListView.FWidget, 'reorderable', integer(True), nil); } gtk_tree_view_enable_model_drag_source(PGtkTreeView(ListView.FWidget), [GDK_BUTTON1_MASK], @row_targets, 1, [GDK_ACTION_MOVE]); gtk_tree_view_enable_model_drag_dest(PGtkTreeView(ListView.FWidget), @row_targets, 1, [GDK_ACTION_MOVE]); ListView.RulesHint := True; ListView.ShowHeaders := False; Column := ListView.Columns.AddTyped(ctToggle); Column.AddAttribute('active', 0); Column.Resizable := False; Column.FixedWidth := 20; Column.SizingMode := smFixed; Column.OnToggled := @ListViewColumnToggled; Column := ListView.Columns.Add; Column.AddAttribute('text', 1); Column.Resizable := False; Column.SizingMode := smAutoSize; ListViewScrolledWindow := TGTKScrolledWindow.Create(Self); ListViewScrolledWindow.AddControl(ListView); ListViewScrolledWindow.HorizScrollBarPolicy := sbAutomatic; ListViewScrolledWindow.VertScrollBarPolicy := sbAutomatic; ListViewScrolledWindow.ShadowType := stShadowIn; ListViewScrolledWindow.MarginTop := 5; ListViewScrolledWindow.MarginBottom := 5; MoveUpButton := TGTKButton.CreateFromIconName(Self, 'gtk-go-up'); MoveUpButton.Tooltip := LANGColumns_MoveUpButtonTooltip; MoveUpButton.CanFocus := False; MoveUpButton.MarginStart := 5; MoveUpButton.MarginEnd := 5; MoveUpButton.MarginTop := 5; MoveUpButton.MarginBottom := 5; MoveDownButton := TGTKButton.CreateFromIconName(Self, 'gtk-go-down'); MoveDownButton.Tooltip := LANGColumns_MoveDownButtonTooltip; MoveDownButton.CanFocus := False; MoveDownButton.MarginStart := 5; MoveDownButton.MarginEnd := 5; MoveDownButton.MarginTop := 5; MoveDownButton.MarginBottom := 5; ListViewGrid.AddControl(0, 1, 3, 4, ListViewScrolledWindow); ListViewGrid.AddControl(3, 2, 1, 1, MoveUpButton); ListViewGrid.AddControl(3, 3, 1, 1, MoveDownButton); VBox := TGTKVBox.Create(Self); VBox.MarginTop := 2; VBox.MarginBottom := 2; ListViewGrid.AddControl(3, 1, 1, 1, VBox); VBox := TGTKVBox.Create(Self); VBox.MarginTop := 2; VBox.MarginBottom := 2; ListViewGrid.AddControl(3, 4, 1, 1, VBox); AddColumnItems; ListView.OnSelectionChanged := @ListViewSelectionChanged; MoveUpButton.OnClick := @MoveUpDownButtonButtonClick; MoveDownButton.OnClick := @MoveUpDownButtonButtonClick; ListView.SetFocus; end; procedure TFColumns.ListViewSelectionChanged(Sender: TObject); begin try MoveUpButton.Enabled := Assigned(ListView.Selected) and (ListView.Selected.Index > 0); MoveDownButton.Enabled := Assigned(ListView.Selected) and (ListView.Selected.Index < ListView.Items.Count - 1); except end; end; procedure TFColumns.MoveUpDownButtonButtonClick(Sender: TObject); var i, Old, New: integer; s: string; b: boolean; begin if Assigned(ListView.Selected) then begin Old := ListView.Selected.Index; if (Sender = MoveUpButton) and (Old > 0) then New := Old - 1 else if (Sender = MoveDownButton) and (Old < ListView.Items.Count - 1) then New := Old + 1 else Exit; b := boolean(ListView.Items[New].AsInteger(0)); ListView.Items[New].SetValue(0, integer(ListView.Items[Old].AsBoolean(0))); // Stupid but works ListView.Items[Old].SetValue(0, integer(b)); s := ListView.Items[New].AsString(1); ListView.Items[New].SetValue(1, ListView.Items[Old].AsString(1)); ListView.Items[Old].SetValue(1, s); i := ListView.Items[New].AsInteger(2); ListView.Items[New].SetValue(2, ListView.Items[Old].AsInteger(2)); ListView.Items[Old].SetValue(2, i); ListView.Items[New].Selected := True; ListView.Items[New].SetCursor(1, False, False, 0.5, 0); end; end; procedure TFColumns.AddColumnItems; var Item: TGTKListItem; i: integer; begin for i := 1 to 10 do begin Item := ListView.Items.Add; Item.SetValue(0, Integer(ConfColumnVisible[i])); Item.SetValue(1, ConfColumnTitlesLong[ConfColumnIDs[i]]); Item.SetValue(2, ConfColumnIDs[i]); end; end; procedure TFColumns.ListViewColumnToggled(Sender: TObject; Column: TGTKTreeViewColumn; Item: TGTKListItem); begin // DebugMsg(['(II) TFColumns.ListViewColumnToggled: Item.AsBoolean(0) = ', Item.AsBoolean(0), ', Item.AsInteger(0) = ', Item.AsInteger(0)]); if Assigned(Item) then Item.SetValue(0, Integer(not Boolean(Item.AsInteger(0)))); end; procedure TFColumns.ApplyColumnList; var i, j: integer; TempIDs, TempArrayI: array[1..ConstNumPanelColumns] of integer; begin // Copy the old items for i := 1 to ConstNumPanelColumns do begin TempIDs[i] := ConfColumnIDs[i]; TempArrayI[i] := ConfColumnSizes[i]; end; // Search for moved columns for i := 0 to ListView.Items.Count - 1 do for j := 1 to ConstNumPanelColumns do if ListView.Items[i].AsInteger(2) = TempIDs[j] then begin ConfColumnIDs[i + 1] := ListView.Items[i].AsInteger(2); ConfColumnSizes[i + 1] := TempArrayI[j]; ConfColumnVisible[i + 1] := boolean(ListView.Items[i].AsInteger(0)); Break; end; end; end.