2005-08-30 [colin] 1.9.13cvs72
[claws.git] / src / gtk / filesel.c
index e0c7df5ccd42770cc12e3e64bf8e6a78984516d3..2914ee822285ac98213220ab7c14186422177a25 100644 (file)
 #include <gtk/gtkfilechooser.h>
 #include <gtk/gtkfilechooserdialog.h>
 
-#include "intl.h"
 #include "sylpheed.h"
 #include "filesel.h"
 #include "manage_window.h"
 #include "gtkutils.h"
 #include "utils.h"
+#include "codeconv.h"
 
-static GList *filesel_create(const gchar *title, const gchar *path, gboolean multiple_files)
+static gchar *last_selected_dir = NULL;
+static GList *filesel_create(const gchar *title, const gchar *path, 
+                            gboolean multiple_files,
+                            gboolean open, gboolean folder_mode,
+                            const gchar *filter)
 {
        GSList *slist = NULL, *slist_orig = NULL;
        GList *list = NULL;
 
-       gint action = (path != NULL) ? GTK_FILE_CHOOSER_ACTION_SAVE:GTK_FILE_CHOOSER_ACTION_OPEN;
-       gchar * action_btn = (path != NULL) ? GTK_STOCK_SAVE:GTK_STOCK_OPEN;
+       gint action = (open == TRUE) ? 
+                       (folder_mode == TRUE ? GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER:
+                                              GTK_FILE_CHOOSER_ACTION_OPEN):
+                       (folder_mode == TRUE ? GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER:
+                                              GTK_FILE_CHOOSER_ACTION_SAVE);
+                       
+       gchar * action_btn = (open == TRUE) ? GTK_STOCK_OPEN:GTK_STOCK_SAVE;
        GtkWidget *chooser = gtk_file_chooser_dialog_new (title, NULL, action, 
                                GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                               action_btn, GTK_RESPONSE_OK
+                               action_btn, GTK_RESPONSE_ACCEPT
                                NULL);
-       
+       if (filter != NULL) {
+               GtkFileFilter *file_filter = gtk_file_filter_new();
+               gtk_file_filter_add_pattern(file_filter, filter);
+               gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(chooser),
+                                           file_filter);
+       }
+
        manage_window_set_transient (GTK_WINDOW(chooser));
        gtk_window_set_modal(GTK_WINDOW(chooser), TRUE);
-       gtk_window_set_wmclass
-               (GTK_WINDOW(chooser), "file_selection", "Sylpheed");
 
        gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER(chooser), multiple_files);
 
-       if (path) {
+       if (path && strlen(path) > 0) {
                char *filename = NULL;
                char *realpath = strdup(path);
-               if ((filename = strrchr(path,'/')) != NULL) {
-                       filename+=sizeof(char);
-                       *(strrchr(realpath, '/')+sizeof(char)) = '\0';
+               if (path[strlen(path)-1] == G_DIR_SEPARATOR) {
+                       filename = "";
+               } else if ((filename = strrchr(path, G_DIR_SEPARATOR)) != NULL) {
+                       filename++;
+                       *(strrchr(realpath, G_DIR_SEPARATOR)+1) = '\0';
                } else {
                        filename = (char *) path;
                        free(realpath); 
                        realpath = strdup(get_home_dir());
                }
                gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(chooser), realpath);
-               gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(chooser), filename);
+               if (action == GTK_FILE_CHOOSER_ACTION_SAVE)
+                       gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(chooser), filename);
                free(realpath);
+       } else {
+               if (!last_selected_dir)
+                       last_selected_dir = g_strdup_printf("%s%c", get_home_dir(), G_DIR_SEPARATOR);
+
+               gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(chooser), last_selected_dir);
        }
 
-       if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_OK
+       if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_ACCEPT
                slist = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER (chooser));
        
        manage_window_focus_out(chooser, NULL, NULL);
@@ -84,6 +105,17 @@ static GList *filesel_create(const gchar *title, const gchar *path, gboolean mul
 
        slist_orig = slist;
        
+       if (slist) {
+               gchar *tmp = strdup(slist->data);
+               if (last_selected_dir)
+                       g_free(last_selected_dir);
+               
+               if (strrchr(tmp, G_DIR_SEPARATOR))
+                       *(strrchr(tmp, G_DIR_SEPARATOR)+1) = '\0';
+               last_selected_dir = g_strdup(tmp);
+               g_free(tmp);
+       }
+
        while (slist) {
                list = g_list_append(list, slist->data);
                slist = slist->next;
@@ -100,9 +132,9 @@ static GList *filesel_create(const gchar *title, const gchar *path, gboolean mul
  * This opens an Open type dialog.
  * @param title the title of the dialog
  */
-GList *filesel_select_multiple_files(const gchar *title)
+GList *filesel_select_multiple_files_open(const gchar *title)
 {
-       return filesel_create(title, NULL, TRUE);
+       return filesel_create(title, NULL, TRUE, TRUE, FALSE, NULL);
 }
 
 /**
@@ -112,9 +144,11 @@ GList *filesel_select_multiple_files(const gchar *title)
  * @param title the title of the dialog
  * @param path the optional path to save to
  */
-gchar *filesel_select_file(const gchar *title, const gchar *path)
+static gchar *filesel_select_file(const gchar *title, const gchar *path,
+                                 gboolean open, gboolean folder_mode,
+                                 const gchar *filter)
 {
-       GList * list = filesel_create(title, path, FALSE);
+       GList * list = filesel_create(title, path, FALSE, open, folder_mode, filter);
        gchar * result = NULL;
        if (list) {
                result = strdup(list->data);
@@ -122,3 +156,29 @@ gchar *filesel_select_file(const gchar *title, const gchar *path)
        g_list_free(list);
        return result;
 }
+gchar *filesel_select_file_open(const gchar *title, const gchar *path)
+{
+       return filesel_select_file (title, path, TRUE, FALSE, NULL);
+}
+
+gchar *filesel_select_file_open_with_filter(const gchar *title, const gchar *path,
+                                           const gchar *filter)
+{
+       return filesel_select_file (title, path, TRUE, FALSE, filter);
+}
+
+gchar *filesel_select_file_save(const gchar *title, const gchar *path)
+{
+       return filesel_select_file (title, path, FALSE, FALSE, NULL);
+}
+
+gchar *filesel_select_file_open_folder(const gchar *title, const gchar *path)
+{
+       return filesel_select_file (title, path, TRUE, TRUE, NULL);
+}
+
+gchar *filesel_select_file_save_folder(const gchar *title, const gchar *path)
+{
+       return filesel_select_file (title, path, FALSE, TRUE, NULL);
+}
+