add Bcc to default headers in drop-down
[claws.git] / src / prefs_display_header.c
index 7dbcef2b6c549301fa7e024df1ba7aeb3ab329a9..385f32cb64aecd6932b3767fa420e8eed451e098 100644 (file)
@@ -1,10 +1,10 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2005 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2012 Hiroyuki Yamamoto and the Claws Mail team
  *
  * 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
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * 
  */
 
 #ifdef HAVE_CONFIG_H
 #  include "config.h"
+#include "claws-features.h"
 #endif
 
 #include "defs.h"
@@ -54,7 +55,6 @@ static struct DisplayHeader {
        GtkWidget *cancel_btn;
 
        GtkWidget *hdr_combo;
-       GtkWidget *hdr_entry;
        GtkWidget *key_check;
        GtkWidget *headers_list_view;
        GtkWidget *hidden_headers_list_view;
@@ -94,44 +94,38 @@ static void prefs_display_header_insert_header              (GtkListStore *store,
 static GtkWidget *prefs_display_header_list_view_create        (const gchar *name);
 static void prefs_filtering_create_list_view_columns   (GtkWidget *list_view, 
                                                         const gchar *name);
-static void headers_list_model_row_changed             (GtkTreeModel *model, 
-                                                        GtkTreePath *path, 
-                                                        GtkTreeIter *iter, 
-                                                        GtkTreeView *list_view);
 static void headers_list_model_rows_reordered          (GtkTreeModel *model,
                                                         GtkTreePath  *path, 
                                                         GtkTreeIter  *iter,
                                                         gpointer      arg,
                                                         GtkTreeView  *list_view);
                                                         
-static void drag_begin (GtkTreeView *list_view,
-                        GdkDragContext *context,
-                        gpointer data);
-
 static void drag_end   (GtkTreeView *list_view,
                         GdkDragContext *context,
                         gpointer data);
 
+#ifndef GENERIC_UMPC
 static gchar *defaults[] =
 {
        "From",
        "To",
        "Cc",
+       "Bcc",
+       "Subject",
+       "Date", 
        "Reply-To",
+       "Sender",
+       "User-Agent",
+       "X-Mailer",     
        "Newsgroups",
        "Followup-To",
-       "Subject",
-       "Date",
-       "Sender",
        "Organization",
-       "X-Mailer",
        "X-Newsreader",
-       "User-Agent",
        "-Received",
        "-Message-ID",
        "-In-Reply-To",
        "-References",
-       "-Mime-Version",
+       "-MIME-Version",
        "-Content-Type",
        "-Content-Transfer-Encoding",
        "-X-UIDL",
@@ -140,7 +134,37 @@ static gchar *defaults[] =
        "-Priority",
        "-X-Face"
 };
-
+#else
+static gchar *defaults[] =
+{
+       "From",
+       "To",
+       "Cc",
+       "Bcc",
+       "Subject",
+       "Date", 
+       "Newsgroups",
+       "Followup-To",
+       "-Reply-To",
+       "-Sender",
+       "-User-Agent",
+       "-X-Mailer",    
+       "-Organization",
+       "-X-Newsreader",
+       "-Received",
+       "-Message-ID",
+       "-In-Reply-To",
+       "-References",
+       "-MIME-Version",
+       "-Content-Type",
+       "-Content-Transfer-Encoding",
+       "-X-UIDL",
+       "-Precedence",
+       "-Status",
+       "-Priority",
+       "-X-Face"
+};
+#endif
 static void prefs_display_header_set_default(void)
 {
        gint i;
@@ -168,6 +192,7 @@ void prefs_display_header_open(void)
        prefs_display_header_set_dialog();
 
        gtk_widget_show(dispheader.window);
+       gtk_window_set_modal(GTK_WINDOW(dispheader.window), TRUE);
 }
 
 static void prefs_display_header_create(void)
@@ -199,13 +224,13 @@ static void prefs_display_header_create(void)
        GtkWidget *hidden_headers_list_view;
 
        GtkWidget *checkbtn_other_headers;
-
+       gint i;
+       
        debug_print("Creating display header setting window...\n");
 
-       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+       window = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "prefs_display_header");
        gtk_container_set_border_width (GTK_CONTAINER (window), 8);
        gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
-       gtk_window_set_modal (GTK_WINDOW (window), TRUE);
        gtk_window_set_resizable(GTK_WINDOW (window), TRUE);
 
        vbox = gtk_vbox_new (FALSE, 6);
@@ -216,8 +241,8 @@ static void prefs_display_header_create(void)
        gtk_widget_show (btn_hbox);
        gtk_box_pack_end (GTK_BOX (vbox), btn_hbox, FALSE, FALSE, 0);
 
-       gtkut_stock_button_set_create(&confirm_area, &ok_btn, GTK_STOCK_OK,
-                                     &cancel_btn, GTK_STOCK_CANCEL,
+       gtkut_stock_button_set_create(&confirm_area, &cancel_btn, GTK_STOCK_CANCEL,
+                                     &ok_btn, GTK_STOCK_OK,
                                      NULL, NULL);
        gtk_widget_show (confirm_area);
        gtk_box_pack_end (GTK_BOX(btn_hbox), confirm_area, FALSE, FALSE, 0);
@@ -252,14 +277,22 @@ static void prefs_display_header_create(void)
        gtk_widget_show (hdr_label);
        gtk_box_pack_start (GTK_BOX (hbox1), hdr_label, FALSE, FALSE, 0);
 
-       hdr_combo = gtk_combo_new ();
+#if !GTK_CHECK_VERSION(2, 24, 0)
+       hdr_combo = gtk_combo_box_entry_new_text();
+#else
+       hdr_combo = gtk_combo_box_text_new_with_entry();
+#endif
+       for(i=0; i < 9 ; i++)
+#if !GTK_CHECK_VERSION(2, 24, 0)
+               gtk_combo_box_append_text(GTK_COMBO_BOX (hdr_combo),
+#else
+               gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT (hdr_combo),
+#endif
+                       (*defaults[i] == '-') ? defaults[i]+1 : defaults[i]);
+       gtk_combo_box_set_active(GTK_COMBO_BOX(hdr_combo), 0);
        gtk_widget_show (hdr_combo);
        gtk_box_pack_start (GTK_BOX (hbox1), hdr_combo, TRUE, TRUE, 0);
        gtk_widget_set_size_request (hdr_combo, 150, -1);
-       gtkut_combo_set_items (GTK_COMBO (hdr_combo),
-                              "From", "To", "Cc", "Subject", "Date",
-                              "Reply-To", "Sender", "User-Agent", "X-Mailer",
-                              NULL);
 
        list_view_hbox = gtk_hbox_new (FALSE, 10);
        gtk_widget_show (list_view_hbox);
@@ -279,6 +312,8 @@ static void prefs_display_header_create(void)
        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (list_view_scrolledwin),
                                        GTK_POLICY_AUTOMATIC,
                                        GTK_POLICY_AUTOMATIC);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(list_view_scrolledwin),
+                                           GTK_SHADOW_IN);
 
        headers_list_view = prefs_display_header_list_view_create
                                (_("Displayed Headers"));
@@ -286,10 +321,6 @@ static void prefs_display_header_create(void)
        gtk_container_add(GTK_CONTAINER(list_view_scrolledwin), headers_list_view);
        gtk_tree_view_set_reorderable(GTK_TREE_VIEW(headers_list_view), TRUE);
 
-       g_signal_connect(G_OBJECT(headers_list_view), "drag_begin",                      
-                        G_CALLBACK(drag_begin),
-                        headers_list_view);
-                        
        g_signal_connect(G_OBJECT(headers_list_view), "drag_end",                        
                         G_CALLBACK(drag_end),
                         headers_list_view);
@@ -343,6 +374,8 @@ static void prefs_display_header_create(void)
        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (list_view_scrolledwin),
                                        GTK_POLICY_AUTOMATIC,
                                        GTK_POLICY_AUTOMATIC);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(list_view_scrolledwin),
+                                           GTK_SHADOW_IN);
 
        hidden_headers_list_view = prefs_display_header_list_view_create
                                        (_("Hidden headers"));
@@ -361,14 +394,16 @@ static void prefs_display_header_create(void)
                            G_CALLBACK
                            (prefs_display_header_register_cb),
                            GINT_TO_POINTER(TRUE));
-       del_btn = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
+       del_btn = gtk_button_new_from_stock (GTK_STOCK_DELETE);
        gtk_widget_show (del_btn);
        gtk_box_pack_start (GTK_BOX (btn_vbox), del_btn, FALSE, TRUE, 0);
        g_signal_connect (G_OBJECT       (del_btn), "clicked",
                            G_CALLBACK (prefs_display_header_delete_cb),
                            hidden_headers_list_view);
 
-       PACK_CHECK_BUTTON (btn_hbox, checkbtn_other_headers,
+       
+
+       PACK_CHECK_BUTTON (vbox, checkbtn_other_headers,
                           _("Show all unspecified headers"));
        SET_TOGGLE_SENSITIVITY (checkbtn_other_headers, list_view_hbox2);
 
@@ -379,7 +414,6 @@ static void prefs_display_header_create(void)
        dispheader.cancel_btn    = cancel_btn;
 
        dispheader.hdr_combo     = hdr_combo;
-       dispheader.hdr_entry     = GTK_COMBO (hdr_combo)->entry;
 
        dispheader.headers_list_view        = headers_list_view;
        dispheader.hidden_headers_list_view = hidden_headers_list_view;
@@ -398,7 +432,7 @@ void prefs_display_header_read_config(void)
 
        rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
                             DISPLAY_HEADER_RC, NULL);
-       if ((fp = fopen(rcpath, "rb")) == NULL) {
+       if ((fp = g_fopen(rcpath, "rb")) == NULL) {
                if (ENOENT != errno) FILE_OP_ERROR(rcpath, "fopen");
                g_free(rcpath);
                prefs_common.disphdr_list = NULL;
@@ -426,7 +460,7 @@ void prefs_display_header_read_config(void)
        fclose(fp);
 }
 
-void prefs_display_header_write_config(void)
+static void prefs_display_header_write_config(void)
 {
        gchar *rcpath;
        PrefFile *pfile;
@@ -438,7 +472,7 @@ void prefs_display_header_write_config(void)
                             DISPLAY_HEADER_RC, NULL);
 
        if ((pfile = prefs_write_open(rcpath)) == NULL) {
-               g_warning("failed to write configuration to file\n");
+               g_warning("failed to write configuration to file");
                g_free(rcpath);
                return;
        }
@@ -463,7 +497,7 @@ void prefs_display_header_write_config(void)
        g_free(rcpath);
 
        if (prefs_file_close(pfile) < 0) {
-               g_warning("failed to write configuration to file\n");
+               g_warning("failed to write configuration to file");
                return;
        }
 }
@@ -552,11 +586,18 @@ static void prefs_display_header_list_view_set_row(gboolean hidden)
 {
        GtkTreeView *list_view;
        DisplayHeaderProp *dp;
-       const gchar *entry_text;
+       gchar *entry_text;
        GtkTreeModel *model;
 
-       entry_text = gtk_entry_get_text(GTK_ENTRY(dispheader.hdr_entry));
-       if (entry_text[0] == '\0') {
+#if !GTK_CHECK_VERSION(2, 24, 0)
+       entry_text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(dispheader.hdr_combo));
+#else
+       entry_text = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(dispheader.hdr_combo));
+#endif
+       if (!entry_text)
+               entry_text = gtk_editable_get_chars(
+                               GTK_EDITABLE(gtk_bin_get_child(GTK_BIN(dispheader.hdr_combo))),0,-1);
+       if (!entry_text || entry_text[0] == '\0') {
                alertpanel_error(_("Header name is not set."));
                return;
        }
@@ -581,6 +622,8 @@ static void prefs_display_header_list_view_set_row(gboolean hidden)
                                           dp->name, dp);
 
        prefs_display_header_set_list();
+       
+       g_free(entry_text);
 }
 
 static void prefs_display_header_register_cb(GtkButton *btn,
@@ -614,16 +657,17 @@ static void prefs_display_header_up(void)
 {
        GtkTreePath *prev, *sel, *try;
        GtkTreeIter isel;
-       GtkListStore *store;
+       GtkListStore *store = NULL;
+       GtkTreeModel *model = NULL;
        GtkTreeIter iprev;
        
        if (!gtk_tree_selection_get_selected
                (gtk_tree_view_get_selection
                        (GTK_TREE_VIEW(dispheader.headers_list_view)),
-                (GtkTreeModel **) &store,      
+                &model,        
                 &isel))
                return;
-
+       store = (GtkListStore *)model;
        sel = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &isel);
        if (!sel)
                return;
@@ -647,17 +691,18 @@ static void prefs_display_header_up(void)
 
 static void prefs_display_header_down(void)
 {
-       GtkListStore *store;
+       GtkListStore *store = NULL;
+       GtkTreeModel *model = NULL;
        GtkTreeIter next, sel;
        GtkTreePath *try;
        
        if (!gtk_tree_selection_get_selected
                (gtk_tree_view_get_selection
                        (GTK_TREE_VIEW(dispheader.headers_list_view)),
-                (GtkTreeModel **) &store,
+                &model,
                 &sel))
                return;
-
+       store = (GtkListStore *)model;
        try = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &sel);
        if (!try) 
                return;
@@ -673,7 +718,7 @@ static gboolean prefs_display_header_key_pressed(GtkWidget *widget,
                                             GdkEventKey *event,
                                             gpointer data)
 {
-       if (event && event->keyval == GDK_Escape)
+       if (event && event->keyval == GDK_KEY_Escape)
                prefs_display_header_cancel();
        return FALSE;
 }
@@ -685,12 +730,14 @@ static void prefs_display_header_ok(void)
                        (GTK_TOGGLE_BUTTON(dispheader.other_headers));
        prefs_display_header_write_config();
        gtk_widget_hide(dispheader.window);
+       gtk_window_set_modal(GTK_WINDOW(dispheader.window), FALSE);
 }
 
 static void prefs_display_header_cancel(void)
 {
        prefs_display_header_read_config();
        gtk_widget_hide(dispheader.window);
+       gtk_window_set_modal(GTK_WINDOW(dispheader.window), FALSE);
 }
 
 static gint prefs_display_header_deleted(GtkWidget *widget, GdkEventAny *event,
@@ -717,7 +764,8 @@ static void prefs_display_header_insert_header(GtkListStore *store,
        /* add new */
        gtk_list_store_append(store, &iter);
        gtk_list_store_set(store, &iter,
-                          PREFS_HDR_HEADER, name,
+                          PREFS_HDR_HEADER,
+                          name,
                           PREFS_HDR_DATA, dp,
                           -1);
 }
@@ -733,7 +781,7 @@ static GtkWidget *prefs_display_header_list_view_create(const gchar *name)
        g_object_unref(G_OBJECT(model));
        
        gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(list_view),
-                                    prefs_common.enable_rules_hint);
+                                    prefs_common.use_stripes_everywhere);
        
        selector = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_view));
        gtk_tree_selection_set_mode(selector, GTK_SELECTION_BROWSE);
@@ -755,17 +803,6 @@ static void prefs_filtering_create_list_view_columns(GtkWidget *list_view,
        gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column);          
 }
 
-/*!
- *\brief       Called as a result of a drag & drop
- */
-static void headers_list_model_row_changed(GtkTreeModel *model, 
-                                          GtkTreePath *path, 
-                                          GtkTreeIter *iter, 
-                                          GtkTreeView *list_view)
-{
-       prefs_display_header_set_list();
-}
-
 /*!
  *\brief       Called as a result of a gtk_list_store_swap()
  */
@@ -778,28 +815,13 @@ static void headers_list_model_rows_reordered(GtkTreeModel *model,
        prefs_display_header_set_list();
 }
 
-static void drag_begin(GtkTreeView *list_view,
-                     GdkDragContext *context,
-                     gpointer data)
-{
-       /* XXX unfortunately a completed drag & drop does not emit 
-        * a "rows_reordered" signal, but a "row_changed" signal.
-        * So during drag and drop, listen to "row_changed", and
-        * update the account list accordingly */
-
-       GtkTreeModel *model = gtk_tree_view_get_model(list_view);
-       g_signal_connect(G_OBJECT(model), "row_changed",
-                        G_CALLBACK(headers_list_model_row_changed),
-                        list_view);
-}
-
+/*!
+ *\brief       Called as a result of a drag & drop
+ */
 static void drag_end(GtkTreeView *list_view,
                    GdkDragContext *context,
                    gpointer data)
 {
-       GtkTreeModel *model = gtk_tree_view_get_model(list_view);
-       g_signal_handlers_disconnect_by_func(G_OBJECT(model),
-                                            G_CALLBACK(headers_list_model_row_changed),
-                                            list_view);
+       prefs_display_header_set_list();
 }