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