diff options
| author | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2008-06-07 20:34:49 +0200 |
|---|---|---|
| committer | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2008-06-07 20:34:49 +0200 |
| commit | ecde167da74c86bc047aaf84c5e548cf65a5da98 (patch) | |
| tree | a015dfda84f28a65811e3aa0d369f8f211ec8c60 /UFileTypeSettings.pas | |
| download | tuxcmd-release-0.6.36-dev.tar.xz | |
Initial commitv0.6.36release-0.6.36-dev
Diffstat (limited to 'UFileTypeSettings.pas')
| -rw-r--r-- | UFileTypeSettings.pas | 901 |
1 files changed, 901 insertions, 0 deletions
diff --git a/UFileTypeSettings.pas b/UFileTypeSettings.pas new file mode 100644 index 0000000..3917e43 --- /dev/null +++ b/UFileTypeSettings.pas @@ -0,0 +1,901 @@ +(* + Tux Commander - UFileTypeSettings - The filetype settings dialog + Copyright (C) 2007 Tomas Bzatek <tbzatek@users.sourceforge.net> + 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 UFileTypeSettings; + +interface + +uses + gtk2, SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts, GTKView, GTKUtils, GTKDialogs, + GTKPixbuf, GTKClasses, + UCoreClasses, UGnome; + +type + TFFileTypeSettings = class(TGTKDialog) + TitleFrame: TGTKFrame; + TitleLabel: TGTKLabel; + TitleEventBox: TGTKEventBox; + TitleIcon: TGTKImage; + TitleHBox: TGTKHBox; + ListView, FNameExtListView, ActionsListView: TGTKListView; + ListViewScrolledWindow, FNameExtListViewScrolledWindow, ActionsListViewScrolledWindow: TGTKScrolledWindow; + AssocListFrame, IconFrame: TGTKFrame; + FNameExtLabel, CommandLabel, DescriptionLabel, AssocDescriptionLabel, IconLabel, ColorLabel: TGTKLabel; + AssocListButtonBox, FNameExtButtonBox, ActionsButtonBox, ActionsButtonBox2: TGTKHButtonBox; + AssocListVBox, FNameExtVBox, FNameExtVBox2, FNameExtVBox3, ActionsVBox: TGTKVBox; + AssocListHBox, FNameExtHBox, FNameExtHBox2, ActionsHBox, ActionsHBox2, AssocDescriptionHBox, ColorHBox: TGTKHBox; + AddFiletypeButton, RemoveFiletypeButton, AddExtButton, RemoveExtButton, AddActionButton, RemoveActionButton, + SetDefaultActionButton, BrowseButton, BrowseIconButton: TGTKButton; + ColorButton: TGnomeColorButton; + FNameExtEntry, CommandEntry, DescriptionEntry, AssocDescriptionEntry, IconEntry: TGTKEntry; + RunInTerminalCheckBox, AutodetectCheckBox, DefaultColorCheckBox: TGTKCheckButton; + Notebook: TGTKNotebook; + Table, Table2: TGTKTable; + Icon: TGTKImage; + GnomeIconButton: TGnomeIconEntry; + procedure FormCreate(Sender: TObject); override; + procedure FormDestroy(Sender: TObject); + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure AddFiletypeButtonClick(Sender: TObject); + procedure RemoveFiletypeButtonClick(Sender: TObject); + procedure ListViewSelectionChanged(Sender: TObject); + procedure AddExtButtonClick(Sender: TObject); + procedure RemoveExtButtonClick(Sender: TObject); + procedure FNameExtEntryKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure FNameExtListViewSelectionChanged(Sender: TObject); + procedure AssocDescriptionEntryChanged(Sender: TObject); + procedure ActionsListViewSelectionChanged(Sender: TObject); + procedure AddActionButtonClick(Sender: TObject); + procedure RemoveActionButtonClick(Sender: TObject); + procedure DescriptionEntryChanged(Sender: TObject); + procedure CommandEntryChanged(Sender: TObject); + procedure RunInTerminalCheckBoxToggled(Sender: TObject); + procedure AutodetectCheckBoxToggled(Sender: TObject); + procedure SetDefaultActionButtonClick(Sender: TObject); + procedure BrowseButtonClick(Sender: TObject); + procedure IconEntryChanged(Sender: TObject); + procedure BrowseIconButtonClick(Sender: TObject); + procedure ColorButtonColorChanged(Sender: TObject); + procedure DefaultColorCheckBoxToggled(Sender: TObject); + procedure ListViewCellDataFunc(Sender: TObject; tree_view: PGtkTreeView; tree_column : PGtkTreeViewColumn; cell : PGtkCellRenderer; tree_model : PGtkTreeModel; iter : PGtkTreeIter); + procedure ActionsListViewCellDataFunc(Sender: TObject; tree_view: PGtkTreeView; tree_column : PGtkTreeViewColumn; cell : PGtkCellRenderer; tree_model : PGtkTreeModel; iter : PGtkTreeIter); + procedure GnomeIconButtonIconChanged(Sender: TObject); + public + IntAssocList: TList; + procedure AssignAssocList(List: TList); + procedure FillList; + procedure CleanItems; + private + FUseGnomeIconEntry: boolean; + end; + +var + FFileTypeSettings: TFFileTypeSettings; + +implementation + +uses glib2, ULocale, UFileAssoc, UCoreUtils, UConfig; + + +procedure TFFileTypeSettings.FormCreate(Sender: TObject); +var Column: TGTKTreeViewColumn; + l: TGTKLabel; +begin + FUseGnomeIconEntry := Assigned(gnome_icon_entry_new) and Assigned(gnome_icon_entry_get_filename) and Assigned(gnome_icon_entry_set_filename); + SetDefaultSize(450, 620); + Caption := LANGEditFileTypesCaption; + Buttons := [mbOK, mbCancel]; + ShowSeparator := False; + TitleEventBox := TGTKEventBox.Create(Self); + TitleLabel := TGTKLabel.Create(Self); + TitleLabel.Caption := LANGTitleLabel_Caption; + TitleLabel.UseMarkup := True; + TitleLabel.XAlign := 0; + TitleLabel.XPadding := 0; + TitleLabel.YPadding := 3; + TitleEventBox.ControlState := csPrelight; + TitleFrame := TGTKFrame.CreateWithoutLabel(Self); + TitleFrame.ShadowType := stShadowOut; + TitleIcon := TGTKImage.Create(Self); + TitleIcon.SetFromStock('gtk-copy', 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); + + ListView := TGTKListView.CreateTyped(Self, Application.GTKVersion_2_0_5_Up, [lcText, lcText, lcPointer, lcPixbuf]); + ListView.RulesHint := True; + Column := ListView.Columns.AddTyped(ctImageText);; + Column.Caption := LANGExtensionsColumn; + Column.AddImageAttribute('pixbuf', 3); + Column.AddAttribute('text', 0); + if Application.GTKVersion_2_0_5_Up then Column.SortID := 0; + Column.Resizable := True; + g_object_set(G_OBJECT(Column.FColumn), 'sizing', 2, 'fixed-width', 150, nil); +{ Column.FixedWidth := 300; + Column.SizingMode := smFixed; } + if Application.GTKVersion_2_6_0_Up then Column.SetProperty('ellipsize', 3); + Column := ListView.Columns.Add; + Column.Caption := LANGDescriptionColumn; + Column.AddAttribute('text', 1); + if Application.GTKVersion_2_0_5_Up then Column.SortID := 1; + Column.Resizable := True; + ListViewScrolledWindow := TGTKScrolledWindow.Create(Self); + ListViewScrolledWindow.AddControl(ListView); + ListViewScrolledWindow.HorizScrollBarPolicy := sbAutomatic; + ListViewScrolledWindow.VertScrollBarPolicy := sbAutomatic; + ListViewScrolledWindow.ShadowType := stShadowIn; + AssocListHBox := TGTKHBox.Create(Self); + AssocListVBox := TGTKVBox.Create(Self); + AssocListVBox.AddControlEx(ListViewScrolledWindow, True, True, 4); + AssocListButtonBox := TGTKHButtonBox.Create(Self); + AssocListButtonBox.Layout := blEnd; + AssocListButtonBox.Spacing := 2; + AddFiletypeButton := TGTKButton.CreateFromStock(Self, 'gtk-add'); + RemoveFiletypeButton := TGTKButton.CreateFromStock(Self, 'gtk-remove'); + AssocListButtonBox.AddControlEx(AddFiletypeButton, False, False, 0); + AssocListButtonBox.AddControlEx(RemoveFiletypeButton, False, False, 0); + AssocListVBox.AddControlEx(AssocListButtonBox, False, False, 5); + AssocListFrame := TGTKFrame.Create(Self); + AssocListFrame.Caption := LANGFileTypesList; + AssocListHBox.AddControlEx(AssocListVBox, True, True, 10); + AssocListFrame.AddControl(AssocListHBox); + AssocListFrame.BorderWidth := 7; + ClientArea.AddControlEx(AssocListFrame, True, True, 0); + + Notebook := TGTKNotebook.Create(Self); + Notebook.BorderWidth := 8; + ClientArea.AddControlEx(Notebook, False, False, 0); + + ActionsListViewScrolledWindow := TGTKScrolledWindow.Create(Self); + ActionsListView := TGTKListView.CreateTyped(Self, Application.GTKVersion_2_0_5_Up, [lcText, lcText, lcPointer]); + ActionsListView.RulesHint := True; + Column := ActionsListView.Columns.Add; + Column.Caption := LANGActionName; + Column.AddAttribute('text', 0); + if Application.GTKVersion_2_0_5_Up then Column.SortID := 0; + Column.Resizable := True; + Column.FixedWidth := 180; + Column.SizingMode := smFixed; + Column := ActionsListView.Columns.Add; + Column.Caption := LANGCommand; + Column.AddAttribute('text', 1); + if Application.GTKVersion_2_0_5_Up then Column.SortID := 1; + Column.Resizable := True; + ActionsListViewScrolledWindow.AddControl(ActionsListView); + ActionsListViewScrolledWindow.VertScrollBarPolicy := sbAutomatic; + ActionsListViewScrolledWindow.HorizScrollBarPolicy := sbAutomatic; + ActionsListViewScrolledWindow.ShadowType := stShadowIn; + ActionsListViewScrolledWindow.SetSizeRequest(-1, 95); + ActionsVBox := TGTKVBox.Create(Self); + ActionsButtonBox := TGTKHButtonBox.Create(Self); + ActionsButtonBox.Spacing := 2; + ActionsButtonBox.Layout := blEnd; + ActionsButtonBox2 := TGTKHButtonBox.Create(Self); + ActionsButtonBox2.Layout := blStart; + ActionsHBox := TGTKHBox.Create(Self); + ActionsHBox2 := TGTKHBox.Create(Self); + AddActionButton := TGTKButton.CreateFromStock(Self, 'gtk-add'); + RemoveActionButton := TGTKButton.CreateFromStock(Self, 'gtk-remove'); + SetDefaultActionButton := TGTKButton.Create(Self); + SetDefaultActionButton.Caption := LANGSetDefaultActionButton_Caption; + RunInTerminalCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGRunInTerminalCheckBox_Caption); + RunInTerminalCheckBox.Enabled := False; + AutodetectCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGAutodetectCheckBox_Caption); + AutodetectCheckBox.Checked := True; + ActionsButtonBox.AddControl(AddActionButton); + ActionsButtonBox.AddControl(RemoveActionButton); + ActionsButtonBox2.AddControl(SetDefaultActionButton); + ActionsHBox.AddControlEx(ActionsButtonBox2, True, True, 5); + ActionsHBox.AddControlEx(ActionsButtonBox, True, True, 0); + ActionsVBox.AddControlEx(ActionsListViewScrolledWindow, True, True, 3); + CommandEntry := TGTKEntry.Create(Self); + CommandEntry.Tooltip := LANGCommandEntry_Tooltip; + DescriptionEntry := TGTKEntry.Create(Self); + BrowseButton := TGTKButton.Create(Self); + BrowseButton.Caption := LANGBrowseButton_Caption; + CommandLabel := TGTKLabel.Create(Self); + CommandLabel.Caption := LANGCommandLabel_Caption; + CommandLabel.XAlign := 0; + CommandLabel.FocusControl := CommandEntry; + CommandLabel.UseUnderline := True; + DescriptionLabel := TGTKLabel.Create(Self); + DescriptionLabel.Caption := LANGDescriptionLabel_Caption; + DescriptionLabel.XAlign := 0; + DescriptionLabel.FocusControl := DescriptionEntry; + DescriptionLabel.UseUnderline := True; + Table := TGTKTable.Create(Self); + Table.SetRowColCount(4, 2); + Table.Homogeneous := False; + Table.RowSpacing := 1; + Table.AddControl(0, 0, 1, 1, DescriptionLabel, 0, 0); + Table.AddControl(1, 0, 3, 1, DescriptionEntry, 0, 0); + Table.AddControl(0, 1, 1, 1, CommandLabel, 0, 0); + Table.AddControl(1, 1, 3, 1, CommandEntry, 0, 0); + ActionsHBox2.Homogeneous := False; + ActionsHBox2.AddControlEx(AutodetectCheckBox, True, True, 5); + ActionsHBox2.AddControlEx(RunInTerminalCheckBox, True, True, 5); + ActionsHBox2.AddControlEx(BrowseButton, False, False, 0); + ActionsVBox.AddControlEx(Table, False, False, 1); + ActionsVBox.AddControlEx(ActionsHBox2, False, False, 0); + l := TGTKLabel.Create(Self); + l.SetSizeRequest(0, 4); + ActionsVBox.AddControlEx(l, False, False, 0); + ActionsVBox.AddControlEx(ActionsHBox, False, False, 0); + ActionsVBox.BorderWidth := 8; + + AssocDescriptionLabel := TGTKLabel.Create(Self); + AssocDescriptionLabel.Caption := LANGDescriptionLabel_Caption; + AssocDescriptionEntry := TGTKEntry.Create(Self); + AssocDescriptionLabel.FocusControl := AssocDescriptionEntry; + AssocDescriptionLabel.UseUnderline := True; + AssocDescriptionHBox := TGTKHBox.Create(Self); + AssocDescriptionHBox.Homogeneous := False; + AssocDescriptionHBox.AddControlEx(AssocDescriptionLabel, False, False, 10); + AssocDescriptionHBox.AddControlEx(AssocDescriptionEntry, True, True, 10); + FNameExtListViewScrolledWindow := TGTKScrolledWindow.Create(Self); + FNameExtListViewScrolledWindow.HorizScrollBarPolicy := sbAutomatic; + FNameExtListViewScrolledWindow.VertScrollBarPolicy := sbAutomatic; + FNameExtListViewScrolledWindow.ShadowType := stShadowIn; + FNameExtListView := TGTKListView.CreateTyped(Self, False, [lcText]); + FNameExtListView.ShowHeaders := False; + Column := FNameExtListView.Columns.Add; + Column.AddAttribute('text', 0); + FNameExtListViewScrolledWindow.AddControl(FNameExtListView); + FNameExtVBox2 := TGTKVBox.Create(Self); + FNameExtVBox2.AddControlEx(FNameExtListViewScrolledWindow, True, True, 4); + FNameExtHBox := TGTKHBox.Create(Self); + FNameExtVBox := TGTKVBox.Create(Self); + FNameExtLabel := TGTKLabel.Create(Self); + FNameExtLabel.Caption := LANGFNameExtLabel_Caption; + AddExtButton := TGTKButton.CreateFromStock(Self, 'gtk-add'); + RemoveExtButton := TGTKButton.CreateFromStock(Self, 'gtk-remove'); + FNameExtEntry := TGTKEntry.Create(Self); + FNameExtEntry.SetSizeRequest(0, -1); + FNameExtLabel.FocusControl := FNameExtEntry; + FNameExtLabel.UseUnderline := True; + FNameExtHBox.AddControlEx(FNameExtVBox, True, True, 5); + FNameExtHBox.AddControlEx(FNameExtVBox2, True, True, 10); + FNameExtHBox2 := TGTKHBox.Create(Self); + FNameExtHBox2.Homogeneous := False; + FNameExtHBox2.AddControlEx(FNameExtLabel, False, False, 4); + FNameExtHBox2.AddControlEx(FNameExtEntry, True, True, 1); + FNameExtHBox2.BorderWidth := 2; + FNameExtButtonBox := TGTKHButtonBox.Create(Self); + FNameExtButtonBox.Layout := blEnd; + FNameExtButtonBox.AddControl(AddExtButton); + FNameExtButtonBox.AddControl(RemoveExtButton); + FNameExtButtonBox.BorderWidth := 3; + FNameExtVBox.AddControlEx(FNameExtHBox2, False, False, 2); + FNameExtVBox.AddControlEx(FNameExtButtonBox, False, False, 2); + FNameExtVBox.AddControlEx(TGTKHSeparator.Create(Self), False, False, 2); + ColorHBox := TGTKHBox.Create(Self); + ColorHBox.Homogeneous := False; + ColorHBox.BorderWidth := 2; + ColorLabel := TGTKLabel.Create(Self); + ColorLabel.Caption := LANGColor; + ColorLabel.UseUnderline := True; + ColorButton := TGnomeColorButton.Create(Self); + ColorButton.SetSizeRequest(40, -1); + ColorButton.OnColorChanged := ColorButtonColorChanged; + ColorLabel.FocusControl := ColorButton; + DefaultColorCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGDefaultColor); + DefaultColorCheckBox.OnToggled := DefaultColorCheckBoxToggled; + ColorHBox.AddControlEx(ColorLabel, False, False, 4); + ColorHBox.AddControlEx(ColorButton, False, False, 5); + ColorHBox.AddControlEx(DefaultColorCheckBox, False, False, 5); + FNameExtVBox.AddControlEx(ColorHBox, False, False, 2); + FNameExtVBox.AddControlEx(TGTKLabel.Create(Self), True, True, 0); + IconLabel := TGTKLabel.Create(Self); + IconLabel.Caption := LANGIcon; + IconLabel.UseUnderline := True; + IconEntry := TGTKEntry.Create(Self); + IconEntry.OnChanged := IconEntryChanged; + IconLabel.FocusControl := IconEntry; + BrowseIconButton := TGTKButton.Create(Self); + BrowseIconButton.Caption := LANGBrowseButton_Caption; + BrowseIconButton.OnClick := BrowseIconButtonClick; + Icon := TGTKImage.Create(Self); + Icon.SetSizeRequest(24, 24); + IconFrame := TGTKFrame.CreateWithoutLabel(Self); + IconFrame.ShadowType := stEtchedIn; + IconFrame.AddControl(Icon); + if FUseGnomeIconEntry then begin + GnomeIconButton := TGnomeIconEntry.Create(Self); + GnomeIconButton.OnIconChanged := GnomeIconButtonIconChanged; + end; + + Table2 := TGTKTable.Create(Self); + Table2.SetRowColCount(8, 3); + Table2.AddControl(0, 1, 1, 1, IconLabel, 10, 0); + if FUseGnomeIconEntry then Table2.AddControl(1, 0, 1, 3, GnomeIconButton, 0, 0); + Table2.AddControl(2, 1, 1, 1, IconFrame, 10, 0); + Table2.AddControl(3, 1, 4, 1, IconEntry, 0, 0); + Table2.AddControl(7, 1, 1, 1, BrowseIconButton, 10, 0); + if FUseGnomeIconEntry then begin + Table2.AddControl(2, 0, 6, 1, TGTKLabel.Create(Self), 0, 0); + Table2.AddControl(2, 2, 6, 1, TGTKLabel.Create(Self), 0, 0); + end; + FNameExtVBox3 := TGTKVBox.Create(Self); + FNameExtVBox3.BorderWidth := 10; + FNameExtVBox3.AddControlEx(AssocDescriptionHBox, False, False, 5); + FNameExtVBox3.AddControlEx(TGTKHSeparator.Create(Self), False, False, 3); + FNameExtVBox3.AddControlEx(Table2, False, False, 1); + FNameExtVBox3.AddControlEx(TGTKHSeparator.Create(Self), False, False, 3); + FNameExtVBox3.AddControlEx(FNameExtHBox, True, True, 5); + Notebook.AppendPage(FNameExtVBox3, LANGNotebookPageExtensions); + Notebook.AppendPage(ActionsVBox, LANGNotebookPageActions); + + OnKeyDown := FormKeyDown; + OnDestroy := FormDestroy; + AddFiletypeButton.OnClick := AddFiletypeButtonClick; + RemoveFiletypeButton.OnClick := RemoveFiletypeButtonClick; + ListView.OnSelectionChanged := ListViewSelectionChanged; + AddExtButton.OnClick := AddExtButtonClick; + RemoveExtButton.OnClick := RemoveExtButtonClick; + FNameExtEntry.OnKeyDown := FNameExtEntryKeyDown; + FNameExtListView.OnSelectionChanged := FNameExtListViewSelectionChanged; + AssocDescriptionEntry.OnChanged := AssocDescriptionEntryChanged; + ActionsListView.OnSelectionChanged := ActionsListViewSelectionChanged; + AddActionButton.OnClick := AddActionButtonClick; + RemoveActionButton.OnClick := RemoveActionButtonClick; + DescriptionEntry.OnChanged := DescriptionEntryChanged; + CommandEntry.OnChanged := CommandEntryChanged; + RunInTerminalCheckBox.OnToggled := RunInTerminalCheckBoxToggled; + AutodetectCheckBox.OnToggled := AutodetectCheckBoxToggled; + SetDefaultActionButton.OnClick := SetDefaultActionButtonClick; + BrowseButton.OnClick := BrowseButtonClick; + + ListView.CellDataFunc := ListViewCellDataFunc; + ActionsListView.CellDataFunc := ActionsListViewCellDataFunc; + ListViewSelectionChanged(Self); + ListView.SetFocus; +end; + +procedure TFFileTypeSettings.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin +// if Key = GDK_ESCAPE then ModalResult := mbCancel; +end; + +procedure TFFileTypeSettings.FormDestroy(Sender: TObject); +var i: integer; +begin + if Assigned(IntAssocList) then begin + if IntAssocList.Count > 0 then + for i := 0 to IntAssocList.Count - 1 do + if Assigned(IntAssocList[i]) then TFileAssoc(IntAssocList[i]).Free; + IntAssocList.Clear; + IntAssocList.Free; + end; +end; + +(********************************************************************************************************************************) +procedure TFFileTypeSettings.AssignAssocList(List: TList); +var i, j: integer; + Item: TFileAssoc; + Action: TAssocAction; +begin + IntAssocList := TList.Create; + if List.Count > 0 then + for i := 0 to List.Count - 1 do begin + Item := TFileAssoc.Create; + with Item do begin + Extensions := TFileAssoc(List[i]).Extensions; + FileTypeName := TFileAssoc(List[i]).FileTypeName; + DefaultAction := TFileAssoc(List[i]).DefaultAction; + FileTypeIcon := TFileAssoc(List[i]).FileTypeIcon; + ColorString := TFileAssoc(List[i]).ColorString; + Pixmap := TGDKPixbuf.Create(Self); + Pixmap.FPixbuf := TFileAssoc(List[i]).Pixmap.Copy; + if TFileAssoc(List[i]).ActionList.Count > 0 then + for j := 0 to TFileAssoc(List[i]).ActionList.Count - 1 do begin + Action := TAssocAction.Create; + with Action do begin + ActionName := TAssocAction(TFileAssoc(List[i]).ActionList[j]).ActionName; + ActionCommand := TAssocAction(TFileAssoc(List[i]).ActionList[j]).ActionCommand; + RunInTerminal := TAssocAction(TFileAssoc(List[i]).ActionList[j]).RunInTerminal; + AutodetectGUI := TAssocAction(TFileAssoc(List[i]).ActionList[j]).AutodetectGUI; + end; + Item.ActionList.Add(Action) + end; + end; + IntAssocList.Add(Item); + end; +end; + +procedure TFFileTypeSettings.FillList; + + procedure InternalAddItem(index: integer); + var ListItem: TGTKListItem; + begin + with TFileAssoc(IntAssocList[index]) do begin + ListItem := ListView.Items.Add; + if FileTypeName = ConstFTAMetaDirectory then ListItem.SetValue(0, LANGFileTypeDirectory) else + if FileTypeName = ConstFTAMetaFile then ListItem.SetValue(0, LANGFileTypeFile) else + ListItem.SetValue(0, Extensions); + if (FileTypeName = ConstFTAMetaDirectory) or (FileTypeName = ConstFTAMetaFile) + then ListItem.SetValue(1, LANGFileTypeMetafile) + else ListItem.SetValue(1, FileTypeName); + ListItem.SetValue(2, IntAssocList[index]); + ListItem.SetValue(3, Pixmap.FPixbuf); + end; + end; + +var i: integer; +begin + if Assigned(IntAssocList) and (IntAssocList.Count > 0) then begin + // Directory metaitem first + for i := 0 to IntAssocList.Count - 1 do + if TFileAssoc(IntAssocList[i]).FileTypeName = ConstFTAMetaDirectory then begin + InternalAddItem(i); + Break; + end; + // Then the file metaitem + for i := 0 to IntAssocList.Count - 1 do + if TFileAssoc(IntAssocList[i]).FileTypeName = ConstFTAMetaFile then begin + InternalAddItem(i); + Break; + end; + // ... and the rest + for i := 0 to IntAssocList.Count - 1 do + if (TFileAssoc(IntAssocList[i]).FileTypeName <> ConstFTAMetaDirectory) and + (TFileAssoc(IntAssocList[i]).FileTypeName <> ConstFTAMetaFile) + then InternalAddItem(i); + end; +end; + +procedure TFFileTypeSettings.CleanItems; +var i: integer; +begin + try + if IntAssocList.Count > 0 then + for i := IntAssocList.Count - 1 downto 0 do + with TFileAssoc(IntAssocList[i]) do begin +{ if Length(Trim(Extensions)) = 0 then begin + TFileAssoc(IntAssocList[i]).Free; + IntAssocList.Delete(i); + Continue; + end; + if ActionList.Count > 0 then + for j := ActionList.Count - 1 downto 0 do + if Length(Trim(TAssocAction(ActionList[j]).ActionCommand)) = 0 then begin + TAssocAction(ActionList[j]).Free; + ActionList.Delete(j); + if DefaultAction = j then DefaultAction := 0; + if DefaultAction > j then Dec(DefaultAction); + end; } + if DefaultAction > ActionList.Count - 1 then DefaultAction := 0; + end; + except end; +end; + +(********************************************************************************************************************************) +procedure TFFileTypeSettings.AddFiletypeButtonClick(Sender: TObject); +var Item: TFileAssoc; + ListItem: TGTKListItem; +begin + Notebook.PageIndex := 0; + Item := TFileAssoc.Create; + IntAssocList.Add(Item); + ListItem := ListView.Items.Add; + ListItem.SetValue(2, Item); + ListItem.Selected := True; + ListItem.SetCursor(0, False, not Application.GTKVersion_2_2_0_Up, 0.5, 0); + ListViewSelectionChanged(Self); + AssocDescriptionEntry.SetFocus; +end; + +procedure TFFileTypeSettings.RemoveFiletypeButtonClick(Sender: TObject); +var Item: TFileAssoc; +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)) then begin + Item := ListView.Selected.AsPointer(2); + Item.Free; + IntAssocList.Remove(Item); + ListView.Items.Delete(ListView.Selected.Index); + end; +end; + +procedure TFFileTypeSettings.ListViewSelectionChanged(Sender: TObject); +var b: boolean; + Item: TFileAssoc; + s: string; + i: integer; + ListItem: TGTKListItem; + Color: TGDKColor; +begin + b := Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)); + RemoveFiletypeButton.Enabled := b and (TFileAssoc(ListView.Selected.AsPointer(2)).FileTypeName <> ConstFTAMetaDirectory) and + (TFileAssoc(ListView.Selected.AsPointer(2)).FileTypeName <> ConstFTAMetaFile); + AssocDescriptionEntry.Enabled := RemoveFiletypeButton.Enabled; + FNameExtEntry.Enabled := RemoveFiletypeButton.Enabled; + FNameExtListView.Enabled := RemoveFiletypeButton.Enabled; + AddExtButton.Enabled := RemoveFiletypeButton.Enabled; + RemoveExtButton.Enabled := RemoveFiletypeButton.Enabled; + FNameExtLabel.Enabled := RemoveFiletypeButton.Enabled; + ColorButton.Enabled := RemoveFiletypeButton.Enabled; + DefaultColorCheckBox.Enabled := RemoveFiletypeButton.Enabled; + ColorLabel.Enabled := RemoveFiletypeButton.Enabled; + FNameExtVBox3.Enabled := b; + ActionsVBox.Enabled := b; + if not b then begin + // Visually clean all the fields + DescriptionEntry.Text := ''; + CommandEntry.Text := ''; + AssocDescriptionEntry.Text := ''; + FNameExtListView.Items.Clear; + FNameExtEntry.Text := ''; + IconEntry.Text := ''; + ActionsListView.Items.Clear; + ColorButton.SetDefaultColor; + ColorButton.Color := PGdkColorToGDKColor(GetDefaultBackgroundColor(0)); + DefaultColorCheckBox.Checked := True; + Exit; + end; + Item := ListView.Selected.AsPointer(2); + FNameExtListView.Items.Clear; + if Length(Item.Extensions) > 0 then begin + s := Item.Extensions; + while Pos(';', s) > 0 do begin + FNameExtListView.Items.Add.SetValue(0, Trim(Copy(s, 1, Pos(';', s) - 1))); + Delete(s, 1, Pos(';', s)); + end; + if Length(Trim(s)) > 0 then FNameExtListView.Items.Add.SetValue(0, Trim(s)); + end; + IconEntry.Text := Item.FileTypeIcon; + IconEntryChanged(Self); + if (TFileAssoc(ListView.Selected.AsPointer(2)).FileTypeName = ConstFTAMetaDirectory) or + (TFileAssoc(ListView.Selected.AsPointer(2)).FileTypeName = ConstFTAMetaFile) + then AssocDescriptionEntry.Text := ListView.Selected.AsString(0) + else AssocDescriptionEntry.Text := ListView.Selected.AsString(1); + DefaultColorCheckBox.Checked := not StringToGDKColor(Item.ColorString, Color); + if DefaultColorCheckBox.Checked then ColorButton.SetDefaultColor + else begin + ColorButton.UnsetDefaultColor; + ColorButton.Color := Color; + end; + // Actions + ActionsListView.Items.Clear; + if Item.ActionList.Count > 0 then + for i := 0 to Item.ActionList.Count - 1 do + with TAssocAction(Item.ActionList[i]) do begin + ListItem := ActionsListView.Items.Add; + if Item.DefaultAction = i + then begin + ListItem.SetValue(0, ActionName + LANGDefault); + ListItem.SetValue(1, ActionCommand); + end else begin + ListItem.SetValue(0, ActionName); + ListItem.SetValue(1, ActionCommand); + end; + ListItem.SetValue(2, Item.ActionList[i]); + end; + if ActionsListView.Items.Count > 0 then ActionsListView.Items[0].Selected := True; + ActionsListViewSelectionChanged(Sender); +end; + +procedure TFFileTypeSettings.AddExtButtonClick(Sender: TObject); +var i: integer; + s, sx: string; +begin + if Length(Trim(FNameExtEntry.Text)) = 0 then Exit; + if FNameExtListView.Items.Count > 0 then + for i := 0 to FNameExtListView.Items.Count - 1 do + if ANSIUpperCase(FNameExtListView.Items[i].AsString(0)) = ANSIUpperCase(Trim(FNameExtEntry.Text)) then Exit; + sx := ANSILowerCase(Trim(FNameExtEntry.Text)); + if sx[1] = '.' then Delete(sx, 1, 1); + FNameExtListView.Items.Add.SetValue(0, sx); + s := TFileAssoc(ListView.Selected.AsPointer(2)).Extensions; + if Length(s) > 0 then s := s + ';'; + s := s + sx; + ListView.Selected.SetValue(0, s); + TFileAssoc(ListView.Selected.AsPointer(2)).Extensions := s; + FNameExtEntry.Text := ''; +end; + +procedure TFFileTypeSettings.RemoveExtButtonClick(Sender: TObject); +var s: string; + i: integer; +begin + try + if (FNameExtListView.Items.Count = 0) or (not Assigned(FNameExtListView.Selected)) or + (not Assigned(ListView.Selected)) or (not Assigned(ListView.Selected.AsPointer(2))) then Exit; + s := TFileAssoc(ListView.Selected.AsPointer(2)).Extensions; + i := Pos(FNameExtListView.Selected.AsString(0), s); + if i = 0 then Exit; + Delete(s, i, Length(FNameExtListView.Selected.AsString(0))); + if s = ';' then s := '' else + if (Length(s) >= i) and (s[i] = ';') then Delete(s, i, 1) else + if (Length(s) >= i - 1) and (i > 1) and (s[i - 1] = ';') then Delete(s, i - 1, 1); + ListView.Selected.SetValue(0, s); + TFileAssoc(ListView.Selected.AsPointer(2)).Extensions := s; + FNameExtListView.Items.Delete(FNameExtListView.Selected.Index); + except end; +end; + +procedure TFFileTypeSettings.FNameExtEntryKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + if (Key = GDK_RETURN) or (Key = GDK_KP_ENTER) then AddExtButtonClick(Sender); +end; + +procedure TFFileTypeSettings.FNameExtListViewSelectionChanged(Sender: TObject); +begin + RemoveExtButton.Enabled := (FNameExtListView.Items.Count > 0) and Assigned(FNameExtListView.Selected); +end; + +procedure TFFileTypeSettings.AssocDescriptionEntryChanged(Sender: TObject); +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)) and + (TFileAssoc(ListView.Selected.AsPointer(2)).FileTypeName <> ConstFTAMetaDirectory) and + (TFileAssoc(ListView.Selected.AsPointer(2)).FileTypeName <> ConstFTAMetaFile) then + begin + TFileAssoc(ListView.Selected.AsPointer(2)).FileTypeName := AssocDescriptionEntry.Text; + ListView.Selected.SetValue(1, AssocDescriptionEntry.Text); + end; +end; + +procedure TFFileTypeSettings.ActionsListViewSelectionChanged(Sender: TObject); +var b: boolean; + Action: TAssocAction; +begin + b := (ActionsListView.Items.Count > 0) and Assigned(ActionsListView.Selected) and Assigned(ActionsListView.Selected.AsPointer(2)); + RemoveActionButton.Enabled := b; + SetDefaultActionButton.Enabled := b; + Table.Enabled := b; + BrowseButton.Enabled := b; + RunInTerminalCheckBox.Enabled := b; + AutodetectCheckBox.Enabled := b; + if not b then begin + // Visually clean all the fields + DescriptionEntry.Text := ''; + CommandEntry.Text := ''; + Exit; + end; + Action := ActionsListView.Selected.AsPointer(2); + DescriptionEntry.Text := Action.ActionName; + CommandEntry.Text := Action.ActionCommand; + RunInTerminalCheckBox.Checked := Action.RunInTerminal; + AutodetectCheckBox.Checked := Action.AutodetectGUI; + RunInTerminalCheckBox.Enabled := not AutodetectCheckBox.Checked; +end; + +procedure TFFileTypeSettings.AddActionButtonClick(Sender: TObject); +var Action: TAssocAction; + ListItem: TGTKListItem; +begin + if (not Assigned(ListView.Selected)) or (not Assigned(ListView.Selected.AsPointer(2))) then Exit; + Action := TAssocAction.Create; + TFileAssoc(ListView.Selected.AsPointer(2)).ActionList.Add(Action); + ListItem := ActionsListView.Items.Add; + ListItem.SetValue(2, Action); + ListItem.Selected := True; + ActionsListViewSelectionChanged(Self); + DescriptionEntry.SetFocus; +end; + +procedure TFFileTypeSettings.RemoveActionButtonClick(Sender: TObject); +var Action: TAssocAction; + Item: TFileAssoc; +begin + try + if (ActionsListView.Items.Count = 0) or (not Assigned(ActionsListView.Selected)) or + (not Assigned(ListView.Selected)) or (not Assigned(ListView.Selected.AsPointer(2))) then Exit; + Item := ListView.Selected.AsPointer(2); + Action := ActionsListView.Selected.AsPointer(2); + if (Item.DefaultAction > Item.ActionList.Count - 1) or (Item.ActionList[Item.DefaultAction] = Action) + then Item.DefaultAction := 0; + if Item.DefaultAction > ActionsListView.Selected.Index then Dec(Item.DefaultAction); + Action.Free; + Item.ActionList.Remove(Action); + ActionsListView.Items.Delete(ActionsListView.Selected.Index); + ListViewSelectionChanged(Sender); + except end; +end; + +procedure TFFileTypeSettings.DescriptionEntryChanged(Sender: TObject); +var Item: TFileAssoc; +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)) and + Assigned(ActionsListView.Selected) and Assigned(ActionsListView.Selected.AsPointer(2)) then + begin + TAssocAction(ActionsListView.Selected.AsPointer(2)).ActionName := DescriptionEntry.Text; + Item := ListView.Selected.AsPointer(2); + if (Item.ActionList.Count - 1 >= Item.DefaultAction) and (ActionsListView.Selected.AsPointer(2) = Item.ActionList[Item.DefaultAction]) + then ActionsListView.Selected.SetValue(0, DescriptionEntry.Text + LANGDefault) + else ActionsListView.Selected.SetValue(0, DescriptionEntry.Text); + end; +end; + +procedure TFFileTypeSettings.CommandEntryChanged(Sender: TObject); +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)) and + Assigned(ActionsListView.Selected) and Assigned(ActionsListView.Selected.AsPointer(2)) then + begin + TAssocAction(ActionsListView.Selected.AsPointer(2)).ActionCommand := CommandEntry.Text; + ActionsListView.Selected.SetValue(1, CommandEntry.Text); + end; +end; + +procedure TFFileTypeSettings.RunInTerminalCheckBoxToggled(Sender: TObject); +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)) and + Assigned(ActionsListView.Selected) and Assigned(ActionsListView.Selected.AsPointer(2)) + then TAssocAction(ActionsListView.Selected.AsPointer(2)).RunInTerminal := RunInTerminalCheckBox.Checked; +end; + +procedure TFFileTypeSettings.AutodetectCheckBoxToggled(Sender: TObject); +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)) and + Assigned(ActionsListView.Selected) and Assigned(ActionsListView.Selected.AsPointer(2)) then + begin + TAssocAction(ActionsListView.Selected.AsPointer(2)).AutodetectGUI := AutodetectCheckBox.Checked; + RunInTerminalCheckBox.Enabled := not AutodetectCheckBox.Checked; + end; +end; + +procedure TFFileTypeSettings.SetDefaultActionButtonClick(Sender: TObject); +var SelIdx: integer; +begin + if (ActionsListView.Items.Count = 0) or (not Assigned(ActionsListView.Selected)) or + (not Assigned(ListView.Selected)) or (not Assigned(ListView.Selected.AsPointer(2))) then Exit; + SelIdx := ActionsListView.Selected.Index; + TFileAssoc(ListView.Selected.AsPointer(2)).DefaultAction := SelIdx; + ListViewSelectionChanged(Sender); + ActionsListView.Items[SelIdx].Selected := True; +end; + +procedure TFFileTypeSettings.BrowseButtonClick(Sender: TObject); +var Dialog: TGTKFileSelectionDialog; +begin + if (ActionsListView.Items.Count = 0) or (not Assigned(ActionsListView.Selected)) or + (not Assigned(ListView.Selected)) or (not Assigned(ListView.Selected.AsPointer(2))) then Exit; + Dialog := TGTKFileSelectionDialog.Create(Self); + try + Dialog.ShowFileOpButtons := False; + Dialog.FileName := AppPath; + if Byte(Dialog.Run) = 251 then CommandEntry.Text := Dialog.FileName; + AppPath := IncludeTrailingPathDelimiter(ExtractFilePath(Dialog.FileName)); + finally + Dialog.Free; + end; +end; + +(********************************************************************************************************************************) +procedure TFFileTypeSettings.IconEntryChanged(Sender: TObject); +var Pixmap, DefIcon: TGDKPixbuf; +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)) then begin + if TFileAssoc(ListView.Selected.AsPointer(2)).FileTypeName = ConstFTAMetaDirectory + then DefIcon := FolderIconCached + else DefIcon := FileIconCached; + TFileAssoc(ListView.Selected.AsPointer(2)).FileTypeIcon := IconEntry.Text; + if not FileExists(UTF8ToANSI(IconEntry.Text)) then Icon.CopyFromPixbuf(DefIcon) else + begin + Pixmap := TGDKPixbuf.Create(Self); + Pixmap.LoadFromFile(UTF8ToANSI(IconEntry.Text)); + if Pixmap.FPixbuf <> nil then begin + Pixmap.ScaleSimple(ConfRowHeightReal, ConfRowHeightReal); + Icon.SetFromPixbuf(Pixmap); + end else Icon.CopyFromPixbuf(DefIcon); + Pixmap.FPixbuf := nil; + Pixmap.Free; + end; + ListView.Selected.SetValue(3, Icon.GetPixbuf); + if FUseGnomeIconEntry then + if FileExists(UTF8ToANSI(IconEntry.Text)) then GnomeIconButton.Filename := UTF8ToANSI(IconEntry.Text) + else GnomeIconButton.Filename := ''; + end; +end; + +procedure TFFileTypeSettings.BrowseIconButtonClick(Sender: TObject); +var Dialog: TGTKFileSelectionDialog; +begin + if (not Assigned(ListView.Selected)) or (not Assigned(ListView.Selected.AsPointer(2))) then Exit; + Dialog := TGTKFileSelectionDialog.CreateWithTitle(Self, LANGBrowseForIcon); + try + Dialog.ShowFileOpButtons := False; + if FileExists(UTF8ToANSI(IconEntry.Text)) then Dialog.FileName := IconEntry.Text + else Dialog.FileName := IconPath; + if Byte(Dialog.Run) = 251 then IconEntry.Text := Dialog.FileName; + IconPath := IncludeTrailingPathDelimiter(ExtractFilePath(Dialog.FileName)); + finally + Dialog.Free; + end; +end; + +procedure TFFileTypeSettings.ColorButtonColorChanged(Sender: TObject); +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)) then + TFileAssoc(ListView.Selected.AsPointer(2)).ColorString := GDKColorToString(ColorButton.Color); +end; + +procedure TFFileTypeSettings.DefaultColorCheckBoxToggled(Sender: TObject); +begin + if DefaultColorCheckBox.Checked then ColorButton.SetDefaultColor + else ColorButton.UnsetDefaultColor; + if DefaultColorCheckBox.Checked and Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)) + then TFileAssoc(ListView.Selected.AsPointer(2)).ColorString := ''; +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TFFileTypeSettings.ListViewCellDataFunc(Sender: TObject; tree_view: PGtkTreeView; tree_column : PGtkTreeViewColumn; cell : PGtkCellRenderer; tree_model : PGtkTreeModel; iter : PGtkTreeIter); +var ColumnID: integer; + ImageCol: boolean; + Data: TFileAssoc; + s: Pointer; +begin + if not Application.GTKVersion_2_0_5_Up then Exit; + ColumnID := gtk_tree_view_column_get_sort_column_id(tree_column); + ImageCol := False; + if ColumnID = 0 then ImageCol := GTK_IS_CELL_RENDERER_PIXBUF(cell); + if ImageCol then Exit; + Data := nil; + gtk_tree_model_get(tree_model, iter, 2, @Data, -1); + gtk_tree_model_get(tree_model, iter, ColumnID, @s, -1); + + if Assigned(Data) and (Data is TFileAssoc) and ((Data.FileTypeName = ConstFTAMetaDirectory) or (Data.FileTypeName = ConstFTAMetaFile)) + then + case ColumnID of + 0: g_object_set(cell, 'markup', g_strconcat('<span weight="bold" underline="single">', s, '</span>', nil), nil); + 1: g_object_set(cell, 'markup', g_strconcat('<span style="italic">', s, '</span>', nil), nil); + end + else g_object_set(cell, 'markup', s, nil); +end; + + +procedure TFFileTypeSettings.ActionsListViewCellDataFunc(Sender: TObject; tree_view: PGtkTreeView; tree_column : PGtkTreeViewColumn; cell : PGtkCellRenderer; tree_model : PGtkTreeModel; iter : PGtkTreeIter); +var ColumnID: integer; + ImageCol: boolean; + Data: TAssocAction; + s: Pointer; + Item: TFileAssoc; +begin + if not Application.GTKVersion_2_0_5_Up then Exit; + ColumnID := gtk_tree_view_column_get_sort_column_id(tree_column); + ImageCol := False; + if ColumnID = 0 then ImageCol := GTK_IS_CELL_RENDERER_PIXBUF(cell); + if ImageCol then Exit; + Item := ListView.Selected.AsPointer(2); + if Item = nil then Exit; + Data := nil; + gtk_tree_model_get(tree_model, iter, 2, @Data, -1); + gtk_tree_model_get(tree_model, iter, ColumnID, @s, -1); + + if Assigned(Data) and (Data is TAssocAction) and (Item.ActionList.IndexOf(Data) = Item.DefaultAction) + then g_object_set(cell, 'markup', g_strconcat('<span weight="bold">', s, '</span>', nil), nil) + else g_object_set(cell, 'markup', s, nil); +end; + +(********************************************************************************************************************************) +procedure TFFileTypeSettings.GnomeIconButtonIconChanged(Sender: TObject); +begin + IconEntry.Text := GnomeIconButton.Filename; +end; + + + + +end. + |
