summaryrefslogtreecommitdiff
path: root/src/dlg-add-folder.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dlg-add-folder.c')
-rw-r--r--src/dlg-add-folder.c899
1 files changed, 899 insertions, 0 deletions
diff --git a/src/dlg-add-folder.c b/src/dlg-add-folder.c
new file mode 100644
index 0000000..cd9f430
--- /dev/null
+++ b/src/dlg-add-folder.c
@@ -0,0 +1,899 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * File-Roller
+ *
+ * Copyright (C) 2001, 2003, 2004 Free Software Foundation, Inc.
+ *
+ * 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 Street #330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <gio/gio.h>
+#include "dlg-add-folder.h"
+#include "file-utils.h"
+#include "fr-stock.h"
+#include "fr-window.h"
+#include "mateconf-utils.h"
+#include "gtk-utils.h"
+#include "preferences.h"
+
+typedef struct {
+ FrWindow *window;
+ GtkWidget *dialog;
+ GtkWidget *include_subfold_checkbutton;
+ GtkWidget *add_if_newer_checkbutton;
+ GtkWidget *exclude_symlinks;
+ GtkWidget *include_files_checkbutton;
+ GtkWidget *include_files_entry;
+ GtkWidget *include_files_label;
+ GtkWidget *exclude_files_entry;
+ GtkWidget *exclude_files_label;
+ GtkWidget *exclude_folders_entry;
+ GtkWidget *exclude_folders_label;
+ GtkWidget *load_button;
+ GtkWidget *save_button;
+ GtkWidget *clear_button;
+ char *last_options;
+} DialogData;
+
+
+static void
+open_file_destroy_cb (GtkWidget *widget,
+ DialogData *data)
+{
+ g_free (data->last_options);
+ g_free (data);
+}
+
+
+static gboolean
+utf8_only_spaces (const char *text)
+{
+ const char *scan;
+
+ if (text == NULL)
+ return TRUE;
+
+ for (scan = text; *scan != 0; scan = g_utf8_next_char (scan)) {
+ gunichar c = g_utf8_get_char (scan);
+ if (! g_unichar_isspace (c))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+static void dlg_add_folder_save_last_options (DialogData *data);
+
+
+static int
+file_sel_response_cb (GtkWidget *widget,
+ int response,
+ DialogData *data)
+{
+ GtkFileChooser *file_sel = GTK_FILE_CHOOSER (widget);
+ FrWindow *window = data->window;
+ char *selected_folder;
+ gboolean update, recursive, follow_links;
+ const char *include_files;
+ const char *exclude_files;
+ const char *exclude_folders;
+ char *dest_dir;
+ char *local_filename;
+
+
+ dlg_add_folder_save_last_options (data);
+
+ if ((response == GTK_RESPONSE_CANCEL) || (response == GTK_RESPONSE_DELETE_EVENT)) {
+ gtk_widget_destroy (data->dialog);
+ return TRUE;
+ }
+
+ if (response == GTK_RESPONSE_HELP) {
+ show_help_dialog (GTK_WINDOW (data->dialog), "file-roller-add-options");
+ return TRUE;
+ }
+
+ selected_folder = gtk_file_chooser_get_uri (file_sel);
+
+ /* check folder permissions. */
+
+ if (! check_permissions (selected_folder, R_OK)) {
+ GtkWidget *d;
+ char *utf8_path;
+
+ utf8_path = g_filename_display_name (selected_folder);
+
+ d = _gtk_error_dialog_new (GTK_WINDOW (window),
+ GTK_DIALOG_MODAL,
+ NULL,
+ _("Could not add the files to the archive"),
+ _("You don't have the right permissions to read files from folder \"%s\""),
+ utf8_path);
+ gtk_dialog_run (GTK_DIALOG (d));
+ gtk_widget_destroy (GTK_WIDGET (d));
+
+ g_free (utf8_path);
+ g_free (selected_folder);
+
+ return FALSE;
+ }
+
+ update = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->add_if_newer_checkbutton));
+ recursive = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->include_subfold_checkbutton));
+ follow_links = ! gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->exclude_symlinks));
+
+ include_files = gtk_entry_get_text (GTK_ENTRY (data->include_files_entry));
+ if (utf8_only_spaces (include_files))
+ include_files = "*";
+
+ exclude_files = gtk_entry_get_text (GTK_ENTRY (data->exclude_files_entry));
+ if (utf8_only_spaces (exclude_files))
+ exclude_files = NULL;
+
+ exclude_folders = gtk_entry_get_text (GTK_ENTRY (data->exclude_folders_entry));
+ if (utf8_only_spaces (exclude_folders))
+ exclude_folders = NULL;
+
+ local_filename = g_filename_from_uri (selected_folder, NULL, NULL);
+ dest_dir = build_uri (fr_window_get_current_location (window),
+ file_name_from_path (local_filename),
+ NULL);
+
+ fr_window_archive_add_with_wildcard (window,
+ include_files,
+ exclude_files,
+ exclude_folders,
+ selected_folder,
+ dest_dir,
+ update,
+ follow_links);
+
+ g_free (local_filename);
+ g_free (dest_dir);
+ g_free (selected_folder);
+
+ gtk_widget_destroy (data->dialog);
+
+ return TRUE;
+}
+
+
+static int
+include_subfold_toggled_cb (GtkWidget *widget,
+ gpointer callback_data)
+{
+ DialogData *data = callback_data;
+
+ gtk_widget_set_sensitive (data->exclude_symlinks,
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
+
+ return FALSE;
+}
+
+
+static void load_options_cb (GtkWidget *w, DialogData *data);
+static void save_options_cb (GtkWidget *w, DialogData *data);
+static void clear_options_cb (GtkWidget *w, DialogData *data);
+static void dlg_add_folder_load_last_options (DialogData *data);
+
+
+/* create the "add" dialog. */
+void
+add_folder_cb (GtkWidget *widget,
+ void *callback_data)
+{
+ GtkWidget *file_sel;
+ DialogData *data;
+ GtkWidget *main_box;
+ GtkWidget *vbox;
+ GtkWidget *table;
+ GtkWidget *align;
+
+ data = g_new0 (DialogData, 1);
+
+ data->window = callback_data;
+
+ data->dialog = file_sel =
+ gtk_file_chooser_dialog_new (_("Add a Folder"),
+ GTK_WINDOW (data->window),
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ FR_STOCK_ADD_FOLDER, GTK_RESPONSE_OK,
+ GTK_STOCK_HELP, GTK_RESPONSE_HELP,
+ NULL);
+
+ gtk_window_set_default_size (GTK_WINDOW (data->dialog), 530, 510);
+
+ gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (file_sel), FALSE);
+ gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (file_sel), FALSE);
+ gtk_dialog_set_default_response (GTK_DIALOG (file_sel), GTK_RESPONSE_OK);
+
+ data->add_if_newer_checkbutton = gtk_check_button_new_with_mnemonic (_("Add only if _newer"));
+ data->include_subfold_checkbutton = gtk_check_button_new_with_mnemonic (_("_Include subfolders"));
+ data->exclude_symlinks = gtk_check_button_new_with_mnemonic (_("Exclude folders that are symbolic lin_ks"));
+
+ data->include_files_entry = gtk_entry_new ();
+ gtk_widget_set_tooltip_text (data->include_files_entry, _("example: *.o; *.bak"));
+ data->include_files_label = gtk_label_new_with_mnemonic (_("Include _files:"));
+ gtk_misc_set_alignment (GTK_MISC (data->include_files_label), 0.0, 0.5);
+ gtk_label_set_mnemonic_widget (GTK_LABEL (data->include_files_label), data->include_files_entry);
+
+ data->exclude_files_entry = gtk_entry_new ();
+ gtk_widget_set_tooltip_text (data->exclude_files_entry, _("example: *.o; *.bak"));
+ data->exclude_files_label = gtk_label_new_with_mnemonic (_("E_xclude files:"));
+ gtk_misc_set_alignment (GTK_MISC (data->exclude_files_label), 0.0, 0.5);
+ gtk_label_set_mnemonic_widget (GTK_LABEL (data->exclude_files_label), data->exclude_files_entry);
+
+ data->exclude_folders_entry = gtk_entry_new ();
+ gtk_widget_set_tooltip_text (data->exclude_folders_entry, _("example: *.o; *.bak"));
+ data->exclude_folders_label = gtk_label_new_with_mnemonic (_("_Exclude folders:"));
+ gtk_misc_set_alignment (GTK_MISC (data->exclude_folders_label), 0.0, 0.5);
+ gtk_label_set_mnemonic_widget (GTK_LABEL (data->exclude_folders_label), data->exclude_folders_entry);
+
+ data->load_button = gtk_button_new_with_mnemonic (_("_Load Options"));
+ data->save_button = gtk_button_new_with_mnemonic (_("Sa_ve Options"));
+ data->clear_button = gtk_button_new_with_mnemonic (_("_Reset Options"));
+
+ main_box = gtk_hbox_new (FALSE, 20);
+ gtk_container_set_border_width (GTK_CONTAINER (main_box), 0);
+ gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (file_sel), main_box);
+
+ vbox = gtk_vbox_new (FALSE, 6);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
+ gtk_box_pack_start (GTK_BOX (main_box), vbox, TRUE, TRUE, 0);
+
+ gtk_box_pack_start (GTK_BOX (vbox), data->include_subfold_checkbutton,
+ TRUE, TRUE, 0);
+
+ align = gtk_alignment_new (0, 0, 0, 0);
+ gtk_alignment_set_padding (GTK_ALIGNMENT (align), 0, 0, 12, 0);
+ gtk_container_add (GTK_CONTAINER (align), data->exclude_symlinks);
+ gtk_box_pack_start (GTK_BOX (vbox), align, TRUE, TRUE, 0);
+
+ gtk_box_pack_start (GTK_BOX (vbox), data->add_if_newer_checkbutton,
+ TRUE, TRUE, 0);
+
+ table = gtk_table_new (2, 4, FALSE);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_box_pack_start (GTK_BOX (vbox), table,
+ TRUE, TRUE, 0);
+
+ gtk_table_attach (GTK_TABLE (table),
+ data->include_files_label,
+ 0, 1,
+ 0, 1,
+ GTK_FILL, 0,
+ 0, 0);
+ gtk_table_attach (GTK_TABLE (table),
+ data->include_files_entry,
+ 1, 4,
+ 0, 1,
+ GTK_FILL|GTK_EXPAND, 0,
+ 0, 0);
+ gtk_table_attach (GTK_TABLE (table),
+ data->exclude_files_label,
+ 0, 1,
+ 1, 2,
+ GTK_FILL, 0,
+ 0, 0);
+ gtk_table_attach (GTK_TABLE (table),
+ data->exclude_files_entry,
+ 1, 2,
+ 1, 2,
+ GTK_FILL|GTK_EXPAND, 0,
+ 0, 0);
+ gtk_table_attach (GTK_TABLE (table),
+ data->exclude_folders_label,
+ 2, 3,
+ 1, 2,
+ GTK_FILL, 0,
+ 0, 0);
+ gtk_table_attach (GTK_TABLE (table),
+ data->exclude_folders_entry,
+ 3, 4,
+ 1, 2,
+ GTK_FILL|GTK_EXPAND, 0,
+ 0, 0);
+
+ /**/
+
+ vbox = gtk_vbox_new (FALSE, 5);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
+ gtk_box_pack_start (GTK_BOX (main_box), vbox, FALSE, FALSE, 0);
+
+ gtk_box_pack_start (GTK_BOX (vbox), data->load_button,
+ FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox), data->save_button,
+ FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox), data->clear_button,
+ FALSE, FALSE, 0);
+
+ gtk_widget_show_all (main_box);
+
+ /* set data */
+
+ dlg_add_folder_load_last_options (data);
+
+ /* signals */
+
+ g_signal_connect (G_OBJECT (file_sel),
+ "destroy",
+ G_CALLBACK (open_file_destroy_cb),
+ data);
+ g_signal_connect (G_OBJECT (file_sel),
+ "response",
+ G_CALLBACK (file_sel_response_cb),
+ data);
+ g_signal_connect (G_OBJECT (data->include_subfold_checkbutton),
+ "toggled",
+ G_CALLBACK (include_subfold_toggled_cb),
+ data);
+ g_signal_connect (G_OBJECT (data->load_button),
+ "clicked",
+ G_CALLBACK (load_options_cb),
+ data);
+ g_signal_connect (G_OBJECT (data->save_button),
+ "clicked",
+ G_CALLBACK (save_options_cb),
+ data);
+ g_signal_connect (G_OBJECT (data->clear_button),
+ "clicked",
+ G_CALLBACK (clear_options_cb),
+ data);
+
+ gtk_window_set_modal (GTK_WINDOW (file_sel),TRUE);
+ gtk_widget_show (file_sel);
+}
+
+
+/* load/save the dialog options */
+
+
+static void
+dlg_add_folder_save_last_used_options (DialogData *data,
+ const char *options_path)
+{
+ g_free (data->last_options);
+ data->last_options = g_strdup (file_name_from_path (options_path));
+}
+
+
+static void
+sync_widgets_with_options (DialogData *data,
+ const char *base_dir,
+ const char *filename,
+ const char *include_files,
+ const char *exclude_files,
+ const char *exclude_folders,
+ gboolean update,
+ gboolean recursive,
+ gboolean no_symlinks)
+{
+ if ((base_dir == NULL) || (strcmp (base_dir, "") == 0))
+ base_dir = fr_window_get_add_default_dir (data->window);
+
+ if ((filename != NULL) && (strcmp (filename, base_dir) != 0))
+ gtk_file_chooser_select_uri (GTK_FILE_CHOOSER (data->dialog), filename);
+ else
+ gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (data->dialog), base_dir);
+
+ if (include_files != NULL)
+ gtk_entry_set_text (GTK_ENTRY (data->include_files_entry), include_files);
+ if (exclude_files != NULL)
+ gtk_entry_set_text (GTK_ENTRY (data->exclude_files_entry), exclude_files);
+ if (exclude_folders != NULL)
+ gtk_entry_set_text (GTK_ENTRY (data->exclude_folders_entry), exclude_folders);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (data->add_if_newer_checkbutton), update);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (data->include_subfold_checkbutton), recursive);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (data->exclude_symlinks), no_symlinks);
+}
+
+
+static void
+clear_options_cb (GtkWidget *w,
+ DialogData *data)
+{
+ sync_widgets_with_options (data,
+ gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (data->dialog)),
+ gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (data->dialog)),
+ "",
+ "",
+ "",
+ FALSE,
+ TRUE,
+ FALSE);
+}
+
+
+static gboolean
+dlg_add_folder_load_options (DialogData *data,
+ const char *name)
+{
+ GFile *options_dir;
+ GFile *options_file;
+ char *file_path;
+ GKeyFile *key_file;
+ GError *error = NULL;
+ char *base_dir = NULL;
+ char *filename = NULL;
+ char *include_files = NULL;
+ char *exclude_files = NULL;
+ char *exclude_folders = NULL;
+ gboolean update;
+ gboolean recursive;
+ gboolean no_symlinks;
+
+ options_dir = get_home_relative_file (RC_OPTIONS_DIR);
+ options_file = g_file_get_child (options_dir, name);
+ file_path = g_file_get_path (options_file);
+ key_file = g_key_file_new ();
+ if (! g_key_file_load_from_file (key_file, file_path, G_KEY_FILE_KEEP_COMMENTS, &error)) {
+ if (error->code != G_IO_ERROR_NOT_FOUND)
+ g_warning ("Could not load options file: %s\n", error->message);
+ g_clear_error (&error);
+ g_object_unref (options_file);
+ g_object_unref (options_dir);
+ g_key_file_free (key_file);
+ return FALSE;
+ }
+
+ base_dir = g_key_file_get_string (key_file, "Options", "base_dir", NULL);
+ filename = g_key_file_get_string (key_file, "Options", "filename", NULL);
+ include_files = g_key_file_get_string (key_file, "Options", "include_files", NULL);
+ exclude_files = g_key_file_get_string (key_file, "Options", "exclude_files", NULL);
+ exclude_folders = g_key_file_get_string (key_file, "Options", "exclude_folders", NULL);
+ update = g_key_file_get_boolean (key_file, "Options", "update", NULL);
+ recursive = g_key_file_get_boolean (key_file, "Options", "recursive", NULL);
+ no_symlinks = g_key_file_get_boolean (key_file, "Options", "no_symlinks", NULL);
+
+ sync_widgets_with_options (data,
+ base_dir,
+ filename,
+ include_files,
+ exclude_files,
+ exclude_folders,
+ update,
+ recursive,
+ no_symlinks);
+
+ dlg_add_folder_save_last_used_options (data, file_path);
+
+ g_free (base_dir);
+ g_free (filename);
+ g_free (include_files);
+ g_free (exclude_files);
+ g_free (exclude_folders);
+ g_key_file_free (key_file);
+ g_free (file_path);
+ g_object_unref (options_file);
+ g_object_unref (options_dir);
+
+ return TRUE;
+}
+
+
+static void
+dlg_add_folder_load_last_options (DialogData *data)
+{
+ char *base_dir = NULL;
+ char *filename = NULL;
+ char *include_files = NULL;
+ char *exclude_files = NULL;
+ char *exclude_folders = NULL;
+ gboolean update;
+ gboolean recursive;
+ gboolean no_symlinks;
+
+ base_dir = eel_mateconf_get_string (PREF_ADD_CURRENT_FOLDER, "");
+ filename = eel_mateconf_get_string (PREF_ADD_FILENAME, "");
+ include_files = eel_mateconf_get_string (PREF_ADD_INCLUDE_FILES, "");
+ exclude_files = eel_mateconf_get_string (PREF_ADD_EXCLUDE_FILES, "");
+ exclude_folders = eel_mateconf_get_string (PREF_ADD_EXCLUDE_FOLDERS, "");
+ update = eel_mateconf_get_boolean (PREF_ADD_UPDATE, FALSE);
+ recursive = eel_mateconf_get_boolean (PREF_ADD_RECURSIVE, TRUE);
+ no_symlinks = eel_mateconf_get_boolean (PREF_ADD_NO_SYMLINKS, FALSE);
+
+ sync_widgets_with_options (data,
+ base_dir,
+ filename,
+ include_files,
+ exclude_files,
+ exclude_folders,
+ update,
+ recursive,
+ no_symlinks);
+
+ g_free (base_dir);
+ g_free (filename);
+ g_free (include_files);
+ g_free (exclude_files);
+ g_free (exclude_folders);
+}
+
+
+static void
+get_options_from_widgets (DialogData *data,
+ char **base_dir,
+ char **filename,
+ const char **include_files,
+ const char **exclude_files,
+ const char **exclude_folders,
+ gboolean *update,
+ gboolean *recursive,
+ gboolean *no_symlinks)
+{
+ *base_dir = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (data->dialog));
+ *filename = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (data->dialog));
+ *update = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->add_if_newer_checkbutton));
+ *recursive = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->include_subfold_checkbutton));
+ *no_symlinks = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->exclude_symlinks));
+
+ *include_files = gtk_entry_get_text (GTK_ENTRY (data->include_files_entry));
+ if (utf8_only_spaces (*include_files))
+ *include_files = "";
+
+ *exclude_files = gtk_entry_get_text (GTK_ENTRY (data->exclude_files_entry));
+ if (utf8_only_spaces (*exclude_files))
+ *exclude_files = "";
+
+ *exclude_folders = gtk_entry_get_text (GTK_ENTRY (data->exclude_folders_entry));
+ if (utf8_only_spaces (*exclude_folders))
+ *exclude_folders = "";
+}
+
+
+static void
+dlg_add_folder_save_current_options (DialogData *data,
+ GFile *options_file)
+{
+ char *base_dir;
+ char *filename;
+ const char *include_files;
+ const char *exclude_files;
+ const char *exclude_folders;
+ gboolean update;
+ gboolean recursive;
+ gboolean no_symlinks;
+ GKeyFile *key_file;
+
+ get_options_from_widgets (data,
+ &base_dir,
+ &filename,
+ &include_files,
+ &exclude_files,
+ &exclude_folders,
+ &update,
+ &recursive,
+ &no_symlinks);
+
+ fr_window_set_add_default_dir (data->window, base_dir);
+
+ key_file = g_key_file_new ();
+ g_key_file_set_string (key_file, "Options", "base_dir", base_dir);
+ g_key_file_set_string (key_file, "Options", "filename", filename);
+ g_key_file_set_string (key_file, "Options", "include_files", include_files);
+ g_key_file_set_string (key_file, "Options", "exclude_files", exclude_files);
+ g_key_file_set_string (key_file, "Options", "exclude_folders", exclude_folders);
+ g_key_file_set_boolean (key_file, "Options", "update", update);
+ g_key_file_set_boolean (key_file, "Options", "recursive", recursive);
+ g_key_file_set_boolean (key_file, "Options", "no_symlinks", no_symlinks);
+
+ g_key_file_save (key_file, options_file);
+
+ g_key_file_free (key_file);
+ g_free (base_dir);
+ g_free (filename);
+}
+
+
+static void
+dlg_add_folder_save_last_options (DialogData *data)
+{
+ char *base_dir;
+ char *filename;
+ const char *include_files;
+ const char *exclude_files;
+ const char *exclude_folders;
+ gboolean update;
+ gboolean recursive;
+ gboolean no_symlinks;
+
+ get_options_from_widgets (data,
+ &base_dir,
+ &filename,
+ &include_files,
+ &exclude_files,
+ &exclude_folders,
+ &update,
+ &recursive,
+ &no_symlinks);
+
+ eel_mateconf_set_string (PREF_ADD_CURRENT_FOLDER, base_dir);
+ eel_mateconf_set_string (PREF_ADD_FILENAME, filename);
+ eel_mateconf_set_string (PREF_ADD_INCLUDE_FILES, include_files);
+ eel_mateconf_set_string (PREF_ADD_EXCLUDE_FILES, exclude_files);
+ eel_mateconf_set_string (PREF_ADD_EXCLUDE_FOLDERS, exclude_folders);
+ eel_mateconf_set_boolean (PREF_ADD_UPDATE, update);
+ eel_mateconf_set_boolean (PREF_ADD_RECURSIVE, recursive);
+ eel_mateconf_set_boolean (PREF_ADD_NO_SYMLINKS, no_symlinks);
+
+ g_free (base_dir);
+ g_free (filename);
+}
+
+
+typedef struct {
+ DialogData *data;
+ GtkBuilder *builder;
+ GtkWidget *dialog;
+ GtkWidget *aod_treeview;
+ GtkTreeModel *aod_model;
+} LoadOptionsDialogData;
+
+
+static void
+aod_destroy_cb (GtkWidget *widget,
+ LoadOptionsDialogData *aod_data)
+{
+ g_object_unref (aod_data->builder);
+ g_free (aod_data);
+}
+
+
+static void
+aod_apply_cb (GtkWidget *widget,
+ gpointer callback_data)
+{
+ LoadOptionsDialogData *aod_data = callback_data;
+ DialogData *data = aod_data->data;
+ GtkTreeSelection *selection;
+ GtkTreeIter iter;
+ char *options_name;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (aod_data->aod_treeview));
+ if (! gtk_tree_selection_get_selected (selection, NULL, &iter))
+ return;
+
+ gtk_tree_model_get (aod_data->aod_model, &iter, 1, &options_name, -1);
+
+ dlg_add_folder_load_options (data, options_name);
+ g_free (options_name);
+
+ gtk_widget_destroy (aod_data->dialog);
+}
+
+
+static void
+aod_activated_cb (GtkTreeView *tree_view,
+ GtkTreePath *path,
+ GtkTreeViewColumn *column,
+ gpointer callback_data)
+{
+ aod_apply_cb (NULL, callback_data);
+}
+
+
+static void
+aod_update_option_list (LoadOptionsDialogData *aod_data)
+{
+ GtkListStore *list_store = GTK_LIST_STORE (aod_data->aod_model);
+ GFile *options_dir;
+ GFileEnumerator *file_enum;
+ GFileInfo *info;
+ GError *err = NULL;
+
+ gtk_list_store_clear (list_store);
+
+ options_dir = get_home_relative_file (RC_OPTIONS_DIR);
+ make_directory_tree (options_dir, 0700, NULL);
+
+ file_enum = g_file_enumerate_children (options_dir, G_FILE_ATTRIBUTE_STANDARD_NAME, 0, NULL, &err);
+ if (err != NULL) {
+ g_warning ("Failed to enumerate children: %s", err->message);
+ g_clear_error (&err);
+ g_object_unref (options_dir);
+ return;
+ }
+
+ while ((info = g_file_enumerator_next_file (file_enum, NULL, &err)) != NULL) {
+ const char *name;
+ char *display_name;
+ GtkTreeIter iter;
+
+ if (err != NULL) {
+ g_warning ("Failed to get info while enumerating: %s", err->message);
+ g_clear_error (&err);
+ continue;
+ }
+
+ name = g_file_info_get_name (info);
+ display_name = g_filename_display_name (name);
+
+ gtk_list_store_append (GTK_LIST_STORE (aod_data->aod_model), &iter);
+ gtk_list_store_set (GTK_LIST_STORE (aod_data->aod_model), &iter,
+ 0, name,
+ 1, display_name,
+ -1);
+
+ g_free (display_name);
+ g_object_unref (info);
+ }
+
+ if (err != NULL) {
+ g_warning ("Failed to get info after enumeration: %s", err->message);
+ g_clear_error (&err);
+ }
+
+ g_object_unref (options_dir);
+}
+
+
+static void
+aod_remove_cb (GtkWidget *widget,
+ LoadOptionsDialogData *aod_data)
+{
+ GtkTreeSelection *selection;
+ GtkTreeIter iter;
+ char *filename;
+ GFile *options_dir;
+ GFile *options_file;
+ GError *error = NULL;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (aod_data->aod_treeview));
+ if (! gtk_tree_selection_get_selected (selection, NULL, &iter))
+ return;
+
+ gtk_tree_model_get (aod_data->aod_model, &iter, 1, &filename, -1);
+ gtk_list_store_remove (GTK_LIST_STORE (aod_data->aod_model), &iter);
+
+ options_dir = get_home_relative_file (RC_OPTIONS_DIR);
+ options_file = g_file_get_child (options_dir, filename);
+ if (! g_file_delete (options_file, NULL, &error)) {
+ g_warning ("could not delete the options: %s", error->message);
+ g_clear_error (&error);
+ }
+
+ g_object_unref (options_file);
+ g_object_unref (options_dir);
+ g_free (filename);
+}
+
+
+static void
+load_options_cb (GtkWidget *w,
+ DialogData *data)
+{
+ LoadOptionsDialogData *aod_data;
+ GtkWidget *ok_button;
+ GtkWidget *cancel_button;
+ GtkWidget *remove_button;
+ GtkCellRenderer *renderer;
+ GtkTreeViewColumn *column;
+
+ aod_data = g_new0 (LoadOptionsDialogData, 1);
+
+ aod_data->data = data;
+ aod_data->builder = _gtk_builder_new_from_file ("add-options.ui");
+ if (aod_data->builder == NULL) {
+ g_free (aod_data);
+ return;
+ }
+
+ /* Get the widgets. */
+
+ aod_data->dialog = _gtk_builder_get_widget (aod_data->builder, "add_options_dialog");
+ aod_data->aod_treeview = _gtk_builder_get_widget (aod_data->builder, "aod_treeview");
+
+ ok_button = _gtk_builder_get_widget (aod_data->builder, "aod_okbutton");
+ cancel_button = _gtk_builder_get_widget (aod_data->builder, "aod_cancelbutton");
+ remove_button = _gtk_builder_get_widget (aod_data->builder, "aod_remove_button");
+
+ /* Set the signals handlers. */
+
+ g_signal_connect (G_OBJECT (aod_data->dialog),
+ "destroy",
+ G_CALLBACK (aod_destroy_cb),
+ aod_data);
+ g_signal_connect (G_OBJECT (aod_data->aod_treeview),
+ "row_activated",
+ G_CALLBACK (aod_activated_cb),
+ aod_data);
+ g_signal_connect_swapped (G_OBJECT (cancel_button),
+ "clicked",
+ G_CALLBACK (gtk_widget_destroy),
+ G_OBJECT (aod_data->dialog));
+ g_signal_connect (G_OBJECT (ok_button),
+ "clicked",
+ G_CALLBACK (aod_apply_cb),
+ aod_data);
+ g_signal_connect (G_OBJECT (remove_button),
+ "clicked",
+ G_CALLBACK (aod_remove_cb),
+ aod_data);
+
+ /* Set data. */
+
+ aod_data->aod_model = GTK_TREE_MODEL (gtk_list_store_new (2,
+ G_TYPE_STRING,
+ G_TYPE_STRING));
+ gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (aod_data->aod_model),
+ 0,
+ GTK_SORT_ASCENDING);
+ gtk_tree_view_set_model (GTK_TREE_VIEW (aod_data->aod_treeview),
+ aod_data->aod_model);
+ g_object_unref (aod_data->aod_model);
+
+ /**/
+
+ renderer = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes (NULL,
+ renderer,
+ "text", 0,
+ NULL);
+ gtk_tree_view_column_set_sort_column_id (column, 0);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (aod_data->aod_treeview),
+ column);
+
+ aod_update_option_list (aod_data);
+
+ /* Run */
+
+ gtk_window_set_transient_for (GTK_WINDOW (aod_data->dialog),
+ GTK_WINDOW (data->dialog));
+ gtk_window_set_modal (GTK_WINDOW (aod_data->dialog), TRUE);
+ gtk_widget_show (aod_data->dialog);
+}
+
+
+static void
+save_options_cb (GtkWidget *w,
+ DialogData *data)
+{
+ GFile *options_dir;
+ GFile *options_file;
+ char *opt_filename;
+
+ options_dir = get_home_relative_file (RC_OPTIONS_DIR);
+ make_directory_tree (options_dir, 0700, NULL);
+
+ opt_filename = _gtk_request_dialog_run (
+ GTK_WINDOW (data->dialog),
+ GTK_DIALOG_MODAL,
+ _("Save Options"),
+ _("Options Name:"),
+ (data->last_options != NULL) ? data->last_options : "",
+ 1024,
+ GTK_STOCK_CANCEL,
+ GTK_STOCK_SAVE);
+ if (opt_filename == NULL)
+ return;
+
+ options_file = g_file_get_child_for_display_name (options_dir, opt_filename, NULL);
+ dlg_add_folder_save_current_options (data, options_file);
+ dlg_add_folder_save_last_used_options (data, opt_filename);
+
+ g_free (opt_filename);
+ g_object_unref (options_file);
+ g_object_unref (options_dir);
+}