allow inheriting folder prefs/properties from the move/copy dialogue when creating...
[claws.git] / src / foldersel.c
index 16d76cf6ca32004d296d89b1816e9e7d5e1bfc97..7d054d023591961febe16a7cdd83ec951edae0f3 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2013 Hiroyuki Yamamoto and the Claws Mail team
+ * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
+ * Copyright (C) 1999-2020 the Claws Mail team and Hiroyuki Yamamoto
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -14,7 +14,6 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * 
  */
 
 #include "defs.h"
@@ -42,6 +41,7 @@
 #include "inputdialog.h"
 #include "folder.h"
 #include "prefs_common.h"
+#include "folder_item_prefs.h"
 
 enum {
        FOLDERSEL_FOLDERNAME,
@@ -69,7 +69,8 @@ static GdkPixbuf *foldernoselectopen_pixbuf = NULL;
 
 static GtkWidget *window;
 static GtkWidget *treeview;
-static GtkWidget *entry;
+static GtkWidget *statusbar;
+static gint statusbar_cid;
 static GtkWidget *ok_button;
 static GtkWidget *cancel_button;
 static GtkWidget *new_button;
@@ -251,6 +252,7 @@ static void foldersel_create(const gchar *title)
        gtk_container_set_border_width(GTK_CONTAINER(window), 4);
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
        gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
+       gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG);
 
        gtk_widget_realize(window);
        g_signal_connect(G_OBJECT(window), "delete_event",
@@ -336,10 +338,11 @@ static void foldersel_create(const gchar *title)
 
        gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
 
-       entry = gtk_entry_new();
-       gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
-       gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, FALSE, 0);
-       g_signal_connect(G_OBJECT(entry), "activate",
+       statusbar = gtk_statusbar_new();
+       statusbar_cid = gtk_statusbar_get_context_id(
+                       GTK_STATUSBAR(statusbar), "Select Folder Dialog" );
+       gtk_box_pack_start(GTK_BOX(vbox), statusbar, FALSE, FALSE, 0);
+       g_signal_connect(G_OBJECT(statusbar), "activate",
                         G_CALLBACK(foldersel_entry_activated), NULL);
 
        gtkut_stock_button_set_create(&confirm_area,
@@ -402,43 +405,19 @@ static void foldersel_append_item(GtkTreeStore *store, FolderItem *item,
        static GdkColor color_noselect = {0, COLOR_DIM, COLOR_DIM, COLOR_DIM};
        static GdkColor color_new;
 
-       gtkut_convert_int_to_gdk_color(prefs_common.color_new, &color_new);
+       gtkut_convert_int_to_gdk_color(prefs_common.color[COL_NEW], &color_new);
 
-        name = tmpname = folder_item_get_name(item);
-
-       if (item->stype != F_NORMAL && FOLDER_IS_LOCAL(item->folder)) {
-               switch (item->stype) {
-               case F_INBOX:
-                       if (!strcmp2(item->name, INBOX_DIR))
-                               name = _("Inbox");
-                       break;
-               case F_OUTBOX:
-                       if (!strcmp2(item->name, OUTBOX_DIR))
-                               name = _("Sent");
-                       break;
-               case F_QUEUE:
-                       if (!strcmp2(item->name, QUEUE_DIR))
-                               name = _("Queue");
-                       break;
-               case F_TRASH:
-                       if (!strcmp2(item->name, TRASH_DIR))
-                               name = _("Trash");
-                       break;
-               case F_DRAFT:
-                       if (!strcmp2(item->name, DRAFT_DIR))
-                               name = _("Drafts");
-                       break;
-               default:
-                       break;
-               }
-       }
+       name = folder_item_get_name(item);
 
        if (folder_has_parent_of_type(item, F_QUEUE) && item->total_msgs > 0) {
-               name = g_strdup_printf("%s (%d)", name, item->total_msgs);
+               tmpname = g_strdup_printf("%s (%d)", name, item->total_msgs);
        } else if (item->unread_msgs > 0) {
-               name = g_strdup_printf("%s (%d)", name, item->unread_msgs);
+               tmpname = g_strdup_printf("%s (%d)", name, item->unread_msgs);
        } else
-               name = g_strdup(name);
+               tmpname = g_strdup(name);
+
+       g_free(name);
+       name = tmpname;
 
        pixbuf = item->no_select ? foldernoselect_pixbuf : folder_pixbuf;
        pixbuf_open =
@@ -474,7 +453,7 @@ static void foldersel_append_item(GtkTreeStore *store, FolderItem *item,
                           FOLDERSEL_BOLD, weight,
                           -1);
         
-        g_free(tmpname);
+        g_free(name);
 }
 
 static void foldersel_insert_gnode_in_store(GtkTreeStore *store, GNode *node,
@@ -511,7 +490,7 @@ static void foldersel_set_tree(Folder *cur_folder, FolderSelectionType type)
                }
                
                if (cur_folder && (cur_folder->klass != folder->klass
-                   && strcmp2(cur_folder->name, folder->name) != 0))
+                   && g_strcmp0(cur_folder->name, folder->name) != 0))
                    continue;
                
                foldersel_insert_gnode_in_store(tree_store, folder->node, NULL);
@@ -545,18 +524,17 @@ static gboolean foldersel_selected(GtkTreeSelection *selection,
        if (selected_item && selected_item->path) {
                gchar *id;
                id = folder_item_get_identifier(selected_item);
-               gtk_entry_set_text(GTK_ENTRY(entry), id);
+               gtk_statusbar_push(GTK_STATUSBAR(statusbar), statusbar_cid, id);
                g_free(id);
-       } else
-       if (root_selectable && selected_item && selected_item->folder &&
-                       (FOLDER_TYPE(selected_item->folder) == F_MH ||
-                        FOLDER_TYPE(selected_item->folder) == F_MBOX ||
-                        FOLDER_TYPE(selected_item->folder) == F_IMAP)) {
+       } else if (root_selectable && selected_item && selected_item->folder &&
+                  (FOLDER_TYPE(selected_item->folder) == F_MH ||
+                   FOLDER_TYPE(selected_item->folder) == F_MBOX ||
+                   FOLDER_TYPE(selected_item->folder) == F_IMAP)) {
                gchar *id = folder_get_identifier(selected_item->folder);
-               gtk_entry_set_text(GTK_ENTRY(entry), id);
+               gtk_statusbar_push(GTK_STATUSBAR(statusbar), statusbar_cid,  id);
                g_free(id);
        } else
-               gtk_entry_set_text(GTK_ENTRY(entry), "");
+               gtk_statusbar_push(GTK_STATUSBAR(statusbar), statusbar_cid, "");
 
        return TRUE;
 }
@@ -592,9 +570,12 @@ static void foldersel_new_folder(GtkButton *button, gpointer data)
                return;
        store = GTK_TREE_STORE(model);
 
-       new_folder = input_dialog(_("New folder"),
-                                 _("Input the name of new folder:"),
-                                 _("NewFolder"));
+       new_folder = input_dialog_with_checkbtn(_("New folder"),
+               _("Input the name of new folder:"),
+               _("NewFolder"),
+               _("Inherit properties and processing rules from parent folder"),
+               &(prefs_common.inherit_folder_props));
+
        if (!new_folder) return;
        AUTORELEASE_STR(new_folder, {g_free(new_folder); return;});
 
@@ -628,6 +609,10 @@ static void foldersel_new_folder(GtkButton *button, gpointer data)
                return;
        }
 
+       if (prefs_common.inherit_folder_props) {
+               folder_item_prefs_copy_prefs(selected_item, new_item);
+       }
+
        /* add new child */
        foldersel_append_item(store, new_item, &new_child, &selected);