1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2
3 /*
4 * Engrampa
5 *
6 * Copyright (C) 2001, 2003, 2004 Free Software Foundation, Inc.
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 */
22
23 #include <config.h>
24 #include <string.h>
25 #include <unistd.h>
26 #include <glib/gi18n.h>
27 #include <gtk/gtk.h>
28 #include "file-utils.h"
29 #include "fr-window.h"
30 #include "gtk-utils.h"
31 #include "preferences.h"
32 #include "dlg-add-files.h"
33
34 #define GET_WIDGET(x) (GTK_WIDGET (gtk_builder_get_object (builder, (x))))
35
36 typedef struct {
37 FrWindow *window;
38 GSettings *settings;
39 GtkWidget *dialog;
40 GtkWidget *add_if_newer_checkbutton;
41 } DialogData;
42
43
44 static void
open_file_destroy_cb(GtkWidget * file_sel,DialogData * data)45 open_file_destroy_cb (GtkWidget *file_sel,
46 DialogData *data)
47 {
48 g_object_unref (data->settings);
49 g_free (data);
50 }
51
52
53 static int
file_sel_response_cb(GtkWidget * widget,int response,DialogData * data)54 file_sel_response_cb (GtkWidget *widget,
55 int response,
56 DialogData *data)
57 {
58 GtkFileChooser *file_sel = GTK_FILE_CHOOSER (widget);
59 FrWindow *window = data->window;
60 char *current_folder;
61 char *uri;
62 gboolean update;
63 GSList *selections, *iter;
64 GList *item_list = NULL;
65
66 current_folder = gtk_file_chooser_get_current_folder_uri (file_sel);
67 uri = gtk_file_chooser_get_uri (file_sel);
68
69 if (current_folder != NULL) {
70 g_settings_set_string (data->settings, PREF_ADD_CURRENT_FOLDER, current_folder);
71 fr_window_set_add_default_dir (window, current_folder);
72 }
73
74 if (uri != NULL)
75 {
76 g_settings_set_string (data->settings, PREF_ADD_FILENAME, uri);
77 g_free (uri);
78 }
79
80
81 if ((response == GTK_RESPONSE_CANCEL) || (response == GTK_RESPONSE_DELETE_EVENT)) {
82 gtk_widget_destroy (data->dialog);
83 g_free (current_folder);
84 return TRUE;
85 }
86
87 if (response == GTK_RESPONSE_HELP) {
88 show_help_dialog (GTK_WINDOW (data->dialog), "engrampa-add-options");
89 g_free (current_folder);
90 return TRUE;
91 }
92
93 /* check folder permissions. */
94
95 if (uri_is_dir (current_folder) && ! check_permissions (current_folder, R_OK)) {
96 GtkWidget *d;
97 char *utf8_path;
98
99 utf8_path = g_filename_display_name (current_folder);
100
101 d = _gtk_error_dialog_new (GTK_WINDOW (window),
102 GTK_DIALOG_MODAL,
103 NULL,
104 _("Could not add the files to the archive"),
105 _("You don't have the right permissions to read files from folder \"%s\""),
106 utf8_path);
107 gtk_dialog_run (GTK_DIALOG (d));
108 gtk_widget_destroy (GTK_WIDGET (d));
109
110 g_free (utf8_path);
111 g_free (current_folder);
112 return FALSE;
113 }
114
115 update = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->add_if_newer_checkbutton));
116
117 /**/
118
119 selections = gtk_file_chooser_get_uris (file_sel);
120 for (iter = selections; iter != NULL; iter = iter->next)
121 item_list = g_list_prepend (item_list, g_file_new_for_uri (iter->data));
122
123 if (item_list != NULL)
124 fr_window_archive_add_files (window, item_list, update);
125
126 gio_file_list_free (item_list);
127 g_slist_free_full (selections, g_free);
128 g_free (current_folder);
129
130 gtk_widget_destroy (data->dialog);
131
132 return TRUE;
133 }
134
135
136 /* create the "add" dialog. */
137 void
add_files_cb(GtkWidget * widget,void * callback_data)138 add_files_cb (GtkWidget *widget,
139 void *callback_data)
140 {
141 GtkBuilder *builder;
142 DialogData *data;
143 char *folder;
144
145 builder = gtk_builder_new_from_resource (ENGRAMPA_RESOURCE_UI_PATH G_DIR_SEPARATOR_S "dlg-add-files.ui");
146
147 data = g_new0 (DialogData, 1);
148 data->window = callback_data;
149 data->settings = g_settings_new (ENGRAMPA_SCHEMA_ADD);
150 data->dialog = GET_WIDGET ("dialog_add_files");
151 data->add_if_newer_checkbutton = GET_WIDGET ("add_if_newer_checkbutton");
152
153 /* set data */
154 folder = g_settings_get_string (data->settings, PREF_ADD_CURRENT_FOLDER);
155 if ((folder == NULL) || (strcmp (folder, "") == 0))
156 folder = g_strdup (fr_window_get_add_default_dir (data->window));
157 gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (GTK_WIDGET (data->dialog)), folder);
158 g_free (folder);
159
160 /* signals */
161 gtk_builder_add_callback_symbols (builder,
162 "on_dlg_add_files_destroy", G_CALLBACK (open_file_destroy_cb),
163 "on_dlg_add_files_response", G_CALLBACK (file_sel_response_cb),
164 NULL);
165 gtk_builder_connect_signals (builder, data);
166
167 g_object_unref (builder);
168
169 gtk_window_set_modal (GTK_WINDOW (data->dialog), TRUE);
170 gtk_widget_show (data->dialog);
171 }
172