1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
6
* Copyright (C) 2008 Free Software Foundation, Inc.
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.
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.
18
* You should have received a copy of the GNU General Public License
19
* along with this program. If not, see <http://www.gnu.org/licenses/>.
28
#include "file-utils.h"
30
#include "gtk-utils.h"
32
#include "preferences.h"
35
#define GET_WIDGET(x) (_gtk_builder_get_widget (data->builder, (x)))
36
#define DEFAULT_EXTENSION ".tar.gz"
37
#define BAD_CHARS "/\\*"
38
#define MEGABYTE (1024 * 1024)
41
/* called when the main dialog is closed. */
43
destroy_cb (GtkWidget *widget,
46
g_object_unref (data->builder);
52
update_sensitivity (DlgNewData *data)
54
gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (data->n_encrypt_header_checkbutton), ! data->can_encrypt_header);
55
gtk_widget_set_sensitive (data->n_encrypt_header_checkbutton, data->can_encrypt_header);
56
gtk_widget_set_sensitive (data->n_volume_spinbutton, ! data->can_create_volumes || gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->n_volume_checkbutton)));
61
update_sensitivity_for_ext (DlgNewData *data,
64
const char *mime_type;
67
data->can_encrypt = FALSE;
68
data->can_encrypt_header = FALSE;
69
data->can_create_volumes = FALSE;
71
mime_type = get_mime_type_from_extension (ext);
73
if (mime_type == NULL) {
74
gtk_widget_set_sensitive (data->n_password_entry, FALSE);
75
gtk_widget_set_sensitive (data->n_password_label, FALSE);
76
gtk_widget_set_sensitive (data->n_encrypt_header_checkbutton, FALSE);
77
gtk_widget_set_sensitive (data->n_volume_box, FALSE);
81
for (i = 0; mime_type_desc[i].mime_type != NULL; i++) {
82
if (strcmp (mime_type_desc[i].mime_type, mime_type) == 0) {
83
data->can_encrypt = mime_type_desc[i].capabilities & FR_COMMAND_CAN_ENCRYPT;
84
gtk_widget_set_sensitive (data->n_password_entry, data->can_encrypt);
85
gtk_widget_set_sensitive (data->n_password_label, data->can_encrypt);
87
data->can_encrypt_header = mime_type_desc[i].capabilities & FR_COMMAND_CAN_ENCRYPT_HEADER;
88
gtk_widget_set_sensitive (data->n_encrypt_header_checkbutton, data->can_encrypt_header);
90
data->can_create_volumes = mime_type_desc[i].capabilities & FR_COMMAND_CAN_CREATE_VOLUMES;
91
gtk_widget_set_sensitive (data->n_volume_box, data->can_create_volumes);
97
update_sensitivity (data);
102
get_archive_type (DlgNewData *data)
107
uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (data->dialog));
111
ext = get_archive_filename_extension (uri);
115
idx = egg_file_format_chooser_get_format (EGG_FILE_FORMAT_CHOOSER (data->format_chooser), uri);
116
/*idx = gtk_combo_box_get_active (GTK_COMBO_BOX (data->n_archive_type_combo_box)) - 1;*/
118
return data->supported_types[idx];
120
ext = DEFAULT_EXTENSION;
123
return get_mime_type_index (get_mime_type_from_extension (ext));
129
archive_type_combo_box_changed_cb (GtkComboBox *combo_box,
136
uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (data->dialog));
138
ext = get_archive_filename_extension (uri);
139
idx = gtk_combo_box_get_active (GTK_COMBO_BOX (data->n_archive_type_combo_box)) - 1;
140
if ((ext == NULL) && (idx >= 0))
141
ext = mime_type_desc[data->supported_types[idx]].default_ext;
143
update_sensitivity_for_ext (data, ext);
145
if ((idx >= 0) && (uri != NULL)) {
147
const char *basename;
148
char *basename_noext;
150
char *new_basename_uft8;
152
new_ext = mime_type_desc[data->supported_types[idx]].default_ext;
153
basename = file_name_from_path (uri);
154
if (g_str_has_suffix (basename, ext))
155
basename_noext = g_strndup (basename, strlen (basename) - strlen (ext));
157
basename_noext = g_strdup (basename);
158
new_basename = g_strconcat (basename_noext, new_ext, NULL);
159
new_basename_uft8 = g_uri_unescape_string (new_basename, NULL);
161
gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (data->dialog), new_basename_uft8);
162
update_sensitivity_for_ext (data, new_ext);
164
g_free (new_basename_uft8);
165
g_free (new_basename);
166
g_free (basename_noext);
173
password_entry_changed_cb (GtkEditable *editable,
176
update_sensitivity ((DlgNewData *) user_data);
181
volume_toggled_cb (GtkToggleButton *toggle_button,
184
update_sensitivity ((DlgNewData *) user_data);
189
format_chooser_selection_changed_cb (EggFileFormatChooser *format_chooser,
196
uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (data->dialog));
200
ext = get_archive_filename_extension (uri);
201
n_format = egg_file_format_chooser_get_format (EGG_FILE_FORMAT_CHOOSER (data->format_chooser), uri);
203
ext = mime_type_desc[data->supported_types[n_format - 1]].default_ext;
205
update_sensitivity_for_ext (data, ext);
209
const char *basename;
210
char *basename_noext;
212
char *new_basename_uft8;
214
new_ext = mime_type_desc[data->supported_types[n_format - 1]].default_ext;
215
basename = file_name_from_path (uri);
216
if (g_str_has_suffix (basename, ext))
217
basename_noext = g_strndup (basename, strlen (basename) - strlen (ext));
219
basename_noext = g_strdup (basename);
220
new_basename = g_strconcat (basename_noext, new_ext, NULL);
221
new_basename_uft8 = g_uri_unescape_string (new_basename, NULL);
223
gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (data->dialog), new_basename_uft8);
224
update_sensitivity_for_ext (data, new_ext);
226
g_free (new_basename_uft8);
227
g_free (new_basename);
228
g_free (basename_noext);
234
get_icon_name_for_type (const char *mime_type)
238
if (mime_type != NULL) {
241
name = g_strconcat ("gnome-mime-", mime_type, NULL);
242
for (s = name; *s; ++s)
243
if (! g_ascii_isalpha (*s))
247
if ((name == NULL) || ! gtk_icon_theme_has_icon (gtk_icon_theme_get_default (), name)) {
249
name = g_strdup ("package-x-generic");
257
options_expander_unmap_cb (GtkWidget *widget,
260
egg_file_format_chooser_emit_size_changed ((EggFileFormatChooser *) user_data);
265
dlg_new_archive (FrWindow *window,
266
int *supported_types,
267
const char *default_name)
270
GtkWidget *n_new_button;
272
/*char *default_ext;*/
275
data = g_new0 (DlgNewData, 1);
277
data->builder = _gtk_builder_new_from_file ("new.ui");
278
if (data->builder == NULL) {
283
data->window = window;
284
data->supported_types = supported_types;
285
sort_mime_types_by_description (data->supported_types);
287
/* Get the widgets. */
289
data->dialog = _gtk_builder_get_widget (data->builder, "filechooserdialog");
291
data->n_password_entry = _gtk_builder_get_widget (data->builder, "n_password_entry");
292
data->n_password_label = _gtk_builder_get_widget (data->builder, "n_password_label");
293
data->n_other_options_expander = _gtk_builder_get_widget (data->builder, "n_other_options_expander");
294
data->n_encrypt_header_checkbutton = _gtk_builder_get_widget (data->builder, "n_encrypt_header_checkbutton");
296
data->n_volume_checkbutton = _gtk_builder_get_widget (data->builder, "n_volume_checkbutton");
297
data->n_volume_spinbutton = _gtk_builder_get_widget (data->builder, "n_volume_spinbutton");
298
data->n_volume_box = _gtk_builder_get_widget (data->builder, "n_volume_box");
300
n_new_button = _gtk_builder_get_widget (data->builder, "n_new_button");
302
/* Set widgets data. */
304
gtk_dialog_set_default_response (GTK_DIALOG (data->dialog), GTK_RESPONSE_OK);
305
gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (data->dialog), fr_window_get_open_default_dir (window));
307
if (default_name != NULL)
308
gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (data->dialog), default_name);
312
gtk_button_set_use_stock (GTK_BUTTON (n_new_button), TRUE);
313
gtk_button_set_label (GTK_BUTTON (n_new_button), FR_STOCK_CREATE_ARCHIVE);
314
gtk_expander_set_expanded (GTK_EXPANDER (data->n_other_options_expander), FALSE);
316
settings = g_settings_new (FILE_ROLLER_SCHEMA_GENERAL);
317
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (data->n_encrypt_header_checkbutton), g_settings_get_boolean (settings, PREF_GENERAL_ENCRYPT_HEADER));
318
g_object_unref (settings);
320
settings = g_settings_new (FILE_ROLLER_SCHEMA_BATCH_ADD);
321
gtk_spin_button_set_value (GTK_SPIN_BUTTON (data->n_volume_spinbutton), (double) g_settings_get_int (settings, PREF_BATCH_ADD_VOLUME_SIZE) / MEGABYTE);
322
g_object_unref (settings);
326
data->format_chooser = (EggFileFormatChooser *) egg_file_format_chooser_new ();
327
for (i = 0; data->supported_types[i] != -1; i++) {
328
int idx = data->supported_types[i];
335
for (e = 0; (n_exts < 4) && file_ext_type[e].ext != NULL; e++) {
336
if (strcmp (file_ext_type[e].ext, mime_type_desc[idx].default_ext) == 0)
338
if (strcmp (file_ext_type[e].mime_type, mime_type_desc[idx].mime_type) == 0)
339
exts[n_exts++] = file_ext_type[e].ext;
342
exts[n_exts++] = NULL;
344
/* g_print ("%s => %s, %s, %s, %s\n", mime_type_desc[idx].mime_type, exts[0], exts[1], exts[2], exts[3]); */
346
icon_name = get_icon_name_for_type (mime_type_desc[idx].mime_type);
347
egg_file_format_chooser_add_format (data->format_chooser,
349
_(mime_type_desc[idx].name),
351
mime_type_desc[idx].default_ext,
360
egg_file_format_chooser_set_format (data->format_chooser, 0);
361
gtk_widget_show (GTK_WIDGET (data->format_chooser));
362
gtk_box_pack_start (GTK_BOX (GET_WIDGET ("format_chooser_box")), GTK_WIDGET (data->format_chooser), TRUE, TRUE, 0);
364
gtk_widget_set_vexpand (GET_WIDGET ("extra_widget"), FALSE);
366
/* Set the signals handlers. */
368
/*g_signal_connect (G_OBJECT (data->dialog),
370
G_CALLBACK (new_file_response_cb),
373
g_signal_connect (G_OBJECT (data->dialog),
375
G_CALLBACK (destroy_cb),
379
g_signal_connect_swapped (G_OBJECT (cancel_button),
381
G_CALLBACK (gtk_widget_destroy),
382
G_OBJECT (data->dialog));
383
g_signal_connect (G_OBJECT (add_button),
385
G_CALLBACK (add_clicked_cb),
388
/* FIXME g_signal_connect (G_OBJECT (data->n_archive_type_combo_box),
390
G_CALLBACK (archive_type_combo_box_changed_cb),
392
g_signal_connect (G_OBJECT (data->n_password_entry),
394
G_CALLBACK (password_entry_changed_cb),
396
g_signal_connect (G_OBJECT (data->n_volume_checkbutton),
398
G_CALLBACK (volume_toggled_cb),
400
g_signal_connect (G_OBJECT (data->format_chooser),
402
G_CALLBACK (format_chooser_selection_changed_cb),
404
g_signal_connect_after (GET_WIDGET ("other_oprtions_alignment"),
406
G_CALLBACK (options_expander_unmap_cb),
407
data->format_chooser);
411
update_sensitivity (data);
413
gtk_window_set_modal (GTK_WINDOW (data->dialog), TRUE);
414
gtk_window_set_transient_for (GTK_WINDOW (data->dialog), GTK_WINDOW (data->window));
415
/*gtk_window_present (GTK_WINDOW (data->dialog));*/
422
dlg_new (FrWindow *window)
426
data = dlg_new_archive (window, create_type, NULL);
427
gtk_window_set_title (GTK_WINDOW (data->dialog), C_("File", "New"));
434
dlg_save_as (FrWindow *window,
435
const char *default_name)
439
data = dlg_new_archive (window, save_type, default_name);
440
gtk_window_set_title (GTK_WINDOW (data->dialog), C_("File", "Save"));
447
dlg_new_data_get_password (DlgNewData *data)
449
const char *password = NULL;
452
idx = get_archive_type (data);
456
if (mime_type_desc[idx].capabilities & FR_COMMAND_CAN_ENCRYPT)
457
password = (char*) gtk_entry_get_text (GTK_ENTRY (data->n_password_entry));
464
dlg_new_data_get_encrypt_header (DlgNewData *data)
466
gboolean encrypt_header = FALSE;
469
idx = get_archive_type (data);
473
if (mime_type_desc[idx].capabilities & FR_COMMAND_CAN_ENCRYPT) {
474
const char *password = gtk_entry_get_text (GTK_ENTRY (data->n_password_entry));
475
if (password != NULL) {
476
if (strcmp (password, "") != 0) {
477
if (mime_type_desc[idx].capabilities & FR_COMMAND_CAN_ENCRYPT_HEADER)
478
encrypt_header = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->n_encrypt_header_checkbutton));
483
return encrypt_header;
488
dlg_new_data_get_volume_size (DlgNewData *data)
490
guint volume_size = 0;
493
idx = get_archive_type (data);
497
if ((mime_type_desc[idx].capabilities & FR_COMMAND_CAN_CREATE_VOLUMES)
498
&& gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->n_volume_checkbutton)))
502
value = gtk_spin_button_get_value (GTK_SPIN_BUTTON (data->n_volume_spinbutton));
503
volume_size = floor (value * MEGABYTE);