aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2013-05-21 09:03:41 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2013-05-21 09:03:41 +0000
commita3484d5c29988bd7af037fc59a9950ffebf8a053 (patch)
treece19024e832b6d2a861b5d6882131b69fd32402e
parentffd8eff6b95428e03018e141e01651c3e258c3bb (diff)
filesel: automatically modify file extension when file type is changed.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@3258 ee746299-78ed-0310-b773-934348b2243d
-rw-r--r--ChangeLog7
-rw-r--r--src/filesel.c49
-rw-r--r--src/filesel.h10
-rw-r--r--src/messageview.c12
-rw-r--r--src/summaryview.c13
5 files changed, 73 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog
index ab76fbe5..dd578203 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2013-05-21
+
+ * src/filesel.[ch]
+ src/messageview.c
+ src/summaryview.c: automatically modify file extension when
+ file type is changed.
+
2013-05-20
* src/textview.c: textview_write_link(): insert space between
diff --git a/src/filesel.c b/src/filesel.c
index 593b54f6..12a93cb4 100644
--- a/src/filesel.c
+++ b/src/filesel.c
@@ -47,7 +47,7 @@ static GSList *filesel_select_file_full (const gchar *title,
const gchar *file,
GtkFileChooserAction action,
gboolean multiple,
- GSList *types,
+ FileselFileType *types,
gint default_type,
gint *selected_type);
@@ -58,6 +58,9 @@ static void filesel_save_expander_set_expanded (GtkWidget *dialog,
gboolean expanded);
static gboolean filesel_save_expander_get_expanded (GtkWidget *dialog);
+static void filesel_combo_changed_cb (GtkComboBox *combo_box,
+ gpointer data);
+
#if GTK_CHECK_VERSION(2, 8, 0)
static GtkFileChooserConfirmation filesel_confirm_overwrite_cb
(GtkFileChooser *chooser,
@@ -160,7 +163,7 @@ static void filesel_save_dir_for_action(GtkFileChooserAction action,
static GSList *filesel_select_file_full(const gchar *title, const gchar *file,
GtkFileChooserAction action,
gboolean multiple,
- GSList *types,
+ FileselFileType *types,
gint default_type, gint *selected_type)
{
gchar *cwd;
@@ -202,23 +205,27 @@ static GSList *filesel_select_file_full(const gchar *title, const gchar *file,
/* create types combo box */
if (types) {
- GSList *cur;
GtkWidget *hbox;
GtkWidget *label;
+ gint i;
hbox = gtk_hbox_new(FALSE, 12);
label = gtk_label_new(_("File type:"));
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
combo = gtk_combo_box_new_text();
- for (cur = types; cur != NULL; cur = cur->next) {
- gtk_combo_box_append_text(GTK_COMBO_BOX(combo), (const gchar *)cur->data);
+ for (i = 0; types[i].type != NULL; i++) {
+ gtk_combo_box_append_text(GTK_COMBO_BOX(combo), types[i].type);
}
gtk_box_pack_start(GTK_BOX(hbox), combo, FALSE, FALSE, 0);
gtk_widget_show_all(hbox);
gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(dialog), hbox);
gtk_combo_box_set_active(GTK_COMBO_BOX(combo), default_type);
+
+ g_object_set_data(G_OBJECT(combo), "types", types);
+ g_signal_connect(GTK_COMBO_BOX(combo), "changed",
+ G_CALLBACK(filesel_combo_changed_cb), dialog);
}
gtk_widget_show(dialog);
@@ -296,7 +303,7 @@ gchar *filesel_save_as(const gchar *file)
return filename;
}
-gchar *filesel_save_as_type(const gchar *file, GSList *types,
+gchar *filesel_save_as_type(const gchar *file, FileselFileType *types,
gint default_type, gint *selected_type)
{
GSList *list;
@@ -304,7 +311,8 @@ gchar *filesel_save_as_type(const gchar *file, GSList *types,
list = filesel_select_file_full(_("Save as"), file,
GTK_FILE_CHOOSER_ACTION_SAVE, FALSE,
- types, default_type, selected_type);
+ types,
+ default_type, selected_type);
if (list) {
filename = (gchar *)list->data;
slist_free_strings(list->next);
@@ -415,6 +423,33 @@ static gboolean filesel_save_expander_get_expanded(GtkWidget *dialog)
return FALSE;
}
+static void filesel_combo_changed_cb(GtkComboBox *combo_box, gpointer data)
+{
+ GtkFileChooser *chooser = data;
+ gint active;
+ gchar *filename;
+ gchar *base;
+ gchar *new_filename;
+ gchar *p;
+ FileselFileType *types;
+
+ active = gtk_combo_box_get_active(combo_box);
+ filename = gtk_file_chooser_get_filename(chooser);
+ types = g_object_get_data(G_OBJECT(combo_box), "types");
+ g_print("active: %d filename: %s\n", active, filename);
+ g_print("type ext: %s\n", types[active].ext);
+ base = g_path_get_basename(filename);
+ p = strrchr(base, '.');
+ if (p)
+ *p = '\0';
+ new_filename = g_strconcat(base, ".", types[active].ext, NULL);
+ g_print("new_filename: %s\n", new_filename);
+ gtk_file_chooser_set_current_name(chooser, new_filename);
+ g_free(new_filename);
+ g_free(base);
+ g_free(filename);
+}
+
#if GTK_CHECK_VERSION(2, 8, 0)
static GtkFileChooserConfirmation filesel_confirm_overwrite_cb
(GtkFileChooser *chooser,
diff --git a/src/filesel.h b/src/filesel.h
index c694ef24..e14397a4 100644
--- a/src/filesel.h
+++ b/src/filesel.h
@@ -23,6 +23,14 @@
#include <glib.h>
#include <gtk/gtkfilechooser.h>
+typedef struct _FileselFileType FileselFileType;
+
+struct _FileselFileType
+{
+ gchar *type;
+ gchar *ext;
+};
+
gchar *filesel_select_file (const gchar *title,
const gchar *file,
GtkFileChooserAction action);
@@ -32,7 +40,7 @@ GSList *filesel_select_files (const gchar *title,
gchar *filesel_save_as (const gchar *file);
gchar *filesel_save_as_type (const gchar *file,
- GSList *types,
+ FileselFileType *types,
gint default_type,
gint *selected_type);
gchar *filesel_select_dir (const gchar *dir);
diff --git a/src/messageview.c b/src/messageview.c
index 0ccff0de..d5428d94 100644
--- a/src/messageview.c
+++ b/src/messageview.c
@@ -913,7 +913,7 @@ void messageview_save_as(MessageView *messageview)
gchar *filename = NULL;
MsgInfo *msginfo;
gchar *src, *dest;
- GSList *types;
+ FileselFileType types[4] = {{NULL, NULL}};
gint selected_type = 0;
gint result;
gboolean all_headers;
@@ -928,11 +928,13 @@ void messageview_save_as(MessageView *messageview)
}
subst_for_filename(filename);
- types = g_slist_append(NULL, _("Original (EML/RFC 822)"));
- types = g_slist_append(types, _("Text"));
- types = g_slist_append(types, _("Text (UTF-8)"));
+ types[0].type = _("Original (EML/RFC 822)");
+ types[0].ext = "eml";
+ types[1].type = _("Text");
+ types[1].ext = "txt";
+ types[2].type = _("Text (UTF-8)");
+ types[2].ext = "txt";
dest = filesel_save_as_type(filename, types, 0, &selected_type);
- g_slist_free(types);
g_free(filename);
if (!dest)
diff --git a/src/summaryview.c b/src/summaryview.c
index c22a431c..d9c93019 100644
--- a/src/summaryview.c
+++ b/src/summaryview.c
@@ -3891,7 +3891,7 @@ void summary_save_as(SummaryView *summaryview)
MsgInfo *msginfo = NULL;
gchar *filename;
gchar *src, *dest;
- GSList *types;
+ FileselFileType types[4] = {{NULL, NULL}};
gint selected_type = 0;
gint result;
gboolean all_headers;
@@ -3912,11 +3912,14 @@ void summary_save_as(SummaryView *summaryview)
}
subst_for_filename(filename);
- types = g_slist_append(NULL, _("Original (EML/RFC 822)"));
- types = g_slist_append(types, _("Text"));
- types = g_slist_append(types, _("Text (UTF-8)"));
+ types[0].type = _("Original (EML/RFC 822)");
+ types[0].ext = "eml";
+ types[1].type = _("Text");
+ types[1].ext = "txt";
+ types[2].type = _("Text (UTF-8)");
+ types[2].ext = "txt";
+
dest = filesel_save_as_type(filename, types, 0, &selected_type);
- g_slist_free(types);
g_free(filename);
if (!dest)