2007-01-17 [colin] 2.7.1cvs12
[claws.git] / src / prefs_account.c
index 0152dc43932e826978f4f48e46abf9dfb1a9ab6c..cb64f4051a5dcb5cc7ac965be878b49f30efcb2f 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2006 Hiroyuki Yamamoto and the Sylpheed-Claws team
+ * Copyright (C) 1999-2007 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
@@ -54,6 +54,7 @@
 #include "imap.h"
 #include "remotefolder.h"
 #include "base64.h"
+#include "combobox.h"
 
 static gboolean cancelled;
 static gboolean new_account;
@@ -69,6 +70,14 @@ static GtkWidget *signature_edit_button;
 
 static GSList *prefs_pages = NULL;
 
+struct BasicProtocol {
+       GtkWidget *combobox;
+       GtkWidget *label;
+       GtkWidget *descrlabel;
+       GtkWidget *no_imap_warn_icon;
+       GtkWidget *no_imap_warn_label;
+};
+
 static struct Basic {
        GtkWidget *acname_entry;
        GtkWidget *default_chkbtn;
@@ -79,7 +88,7 @@ static struct Basic {
 
        GtkWidget *serv_frame;
        GtkWidget *serv_table;
-       GtkWidget *protocol_optmenu;
+       gpointer *protocol_optmenu;
        GtkWidget *recvserv_label;
        GtkWidget *smtpserv_label;
        GtkWidget *nntpserv_label;
@@ -123,6 +132,7 @@ static struct Receive {
        GtkWidget *imap_auth_type_optmenu;
        GtkWidget *imapdir_label;
        GtkWidget *imapdir_entry;
+       GtkWidget *subsonly_chkbtn;
 
        GtkWidget *frame_maxarticle;
        GtkWidget *maxarticle_label;
@@ -131,7 +141,6 @@ static struct Receive {
 } receive;
 
 static struct Send {
-       GtkWidget *date_chkbtn;
        GtkWidget *msgid_chkbtn;
        GtkWidget *customhdr_chkbtn;
        GtkWidget *smtp_auth_chkbtn;
@@ -155,6 +164,12 @@ static struct Compose {
        GtkWidget *autobcc_entry;
        GtkWidget *autoreplyto_chkbtn;
        GtkWidget *autoreplyto_entry;
+#ifdef USE_ASPELL
+       GtkWidget *checkbtn_enable_default_dictionary;
+       GtkWidget *optmenu_default_dictionary;
+       GtkWidget *checkbtn_enable_default_alt_dictionary;
+       GtkWidget *optmenu_default_alt_dictionary;
+#endif
 } compose;
 
 static struct Privacy {
@@ -163,6 +178,7 @@ static struct Privacy {
        GtkWidget *default_encrypt_reply_chkbtn;
        GtkWidget *default_sign_chkbtn;
        GtkWidget *save_clear_text_chkbtn;
+       GtkWidget *encrypt_to_self_chkbtn;
 } privacy;
 
 #if USE_OPENSSL
@@ -220,11 +236,20 @@ static struct Advanced {
        GtkWidget *trash_folder_entry;
 } advanced;
 
-static void prefs_account_fix_size                     (void);
+static char *protocol_names[] = {
+       N_("POP3"),
+       NULL,           /* APOP, deprecated */
+       NULL,           /* RPOP, deprecated */
+       N_("IMAP4"),
+       N_("News (NNTP)"),
+       N_("Local mbox file"),
+       N_("None (SMTP only)")
+};
 
 static void prefs_account_protocol_set_data_from_optmenu(PrefParam *pparam);
 static void prefs_account_protocol_set_optmenu         (PrefParam *pparam);
-static void prefs_account_protocol_activated           (GtkMenuItem *menuitem);
+static void prefs_account_protocol_changed             (GtkComboBox *combobox,
+                                                       gpointer data);
 
 static void prefs_account_set_string_from_optmenu      (PrefParam *pparam);
 static void prefs_account_set_optmenu_from_string      (PrefParam *pparam);
@@ -247,6 +272,13 @@ static void prefs_account_nntpauth_toggled(GtkToggleButton *button,
 static void prefs_account_mailcmd_toggled(GtkToggleButton *button,
                                          gpointer user_data);
 
+#if USE_ASPELL
+static void prefs_account_compose_default_dictionary_set_string_from_optmenu
+                                                       (PrefParam *pparam);
+static void prefs_account_compose_default_dictionary_set_optmenu_from_string
+                                                       (PrefParam *pparam);
+#endif
+
 static gchar *privacy_prefs;
 
 static PrefParam param[] = {
@@ -268,7 +300,7 @@ static PrefParam param[] = {
         &basic.org_entry, prefs_set_data_from_entry, prefs_set_entry},
 
        {"protocol", NULL, &tmp_ac_prefs.protocol, P_ENUM,
-        &basic.protocol_optmenu,
+        (GtkWidget **)&basic.protocol_optmenu,
         prefs_account_protocol_set_data_from_optmenu,
         prefs_account_protocol_set_optmenu},
 
@@ -352,10 +384,6 @@ static PrefParam param[] = {
         prefs_set_data_from_spinbtn, prefs_set_spinbtn},
 
        /* Send */
-       {"add_date", "TRUE", &tmp_ac_prefs.add_date, P_BOOL,
-        &p_send.date_chkbtn,
-        prefs_set_data_from_toggle, prefs_set_toggle},
-
        {"generate_msgid", "TRUE", &tmp_ac_prefs.gen_msgid, P_BOOL,
         &p_send.msgid_chkbtn,
         prefs_set_data_from_toggle, prefs_set_toggle},
@@ -427,6 +455,26 @@ static PrefParam param[] = {
         &compose.autoreplyto_entry,
         prefs_set_data_from_entry, prefs_set_entry},
 
+#if USE_ASPELL
+       {"enable_default_dictionary", "", &tmp_ac_prefs.enable_default_dictionary, P_BOOL,
+        &compose.checkbtn_enable_default_dictionary,
+        prefs_set_data_from_toggle, prefs_set_toggle},
+
+       {"default_dictionary", NULL, &tmp_ac_prefs.default_dictionary, P_STRING,
+        &compose.optmenu_default_dictionary,
+        prefs_account_compose_default_dictionary_set_string_from_optmenu,
+        prefs_account_compose_default_dictionary_set_optmenu_from_string},
+
+       {"enable_default_alt_dictionary", "", &tmp_ac_prefs.enable_default_alt_dictionary, P_BOOL,
+        &compose.checkbtn_enable_default_alt_dictionary,
+        prefs_set_data_from_toggle, prefs_set_toggle},
+
+       {"default_alt_dictionary", NULL, &tmp_ac_prefs.default_alt_dictionary, P_STRING,
+        &compose.optmenu_default_alt_dictionary,
+        prefs_account_compose_default_dictionary_set_string_from_optmenu,
+        prefs_account_compose_default_dictionary_set_optmenu_from_string},
+#endif  
+
        /* Privacy */
        {"default_privacy_system", "", &tmp_ac_prefs.default_privacy_system, P_STRING,
         &privacy.default_privacy_system,
@@ -443,6 +491,9 @@ static PrefParam param[] = {
        {"save_clear_text", "FALSE", &tmp_ac_prefs.save_encrypted_as_clear_text, P_BOOL,
         &privacy.save_clear_text_chkbtn,
         prefs_set_data_from_toggle, prefs_set_toggle},
+       {"encrypt_to_self", "FALSE", &tmp_ac_prefs.encrypt_to_self, P_BOOL,
+        &privacy.encrypt_to_self_chkbtn,
+        prefs_set_data_from_toggle, prefs_set_toggle},
        {"privacy_prefs", "", &privacy_prefs, P_STRING,
         NULL, NULL, NULL},
 #if USE_OPENSSL
@@ -543,6 +594,10 @@ static PrefParam param[] = {
        {"imap_directory", NULL, &tmp_ac_prefs.imap_dir, P_STRING,
         &receive.imapdir_entry, prefs_set_data_from_entry, prefs_set_entry},
 
+       {"imap_subsonly", "TRUE", &tmp_ac_prefs.imap_subsonly, P_BOOL,
+        &receive.subsonly_chkbtn,
+        prefs_set_data_from_toggle, prefs_set_toggle},
+
        {"set_sent_folder", "FALSE", &tmp_ac_prefs.set_sent_folder, P_BOOL,
         &advanced.sent_folder_chkbtn,
         prefs_set_data_from_toggle, prefs_set_toggle},
@@ -627,10 +682,17 @@ static void privacy_system_activated(GtkMenuItem *menuitem)
        
        privacy_enabled = strcmp(system_id, "");
 
+       if (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_DATA) == NULL ||
+           GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menuitem), MENU_VAL_DATA)) == FALSE)
+               privacy_enabled = FALSE;
+
        gtk_widget_set_sensitive (privacy.default_encrypt_chkbtn, privacy_enabled);
        gtk_widget_set_sensitive (privacy.default_encrypt_reply_chkbtn, privacy_enabled);
        gtk_widget_set_sensitive (privacy.default_sign_chkbtn, privacy_enabled);
-       gtk_widget_set_sensitive (privacy.save_clear_text_chkbtn, privacy_enabled);
+       gtk_widget_set_sensitive (privacy.encrypt_to_self_chkbtn, privacy_enabled);
+       gtk_widget_set_sensitive (privacy.save_clear_text_chkbtn, 
+               privacy_enabled && !gtk_toggle_button_get_active(
+                                       GTK_TOGGLE_BUTTON(privacy.encrypt_to_self_chkbtn)));
 }
 
 void update_privacy_system_menu() {
@@ -643,6 +705,7 @@ void update_privacy_system_menu() {
        menuitem = gtk_menu_item_new_with_label(_("None"));
        gtk_widget_show(menuitem);
        g_object_set_data(G_OBJECT(menuitem), MENU_VAL_ID, "");
+       g_object_set_data(G_OBJECT(menuitem), MENU_VAL_DATA, GINT_TO_POINTER(FALSE));
        gtk_menu_append(GTK_MENU(menu), menuitem);
 
        g_signal_connect(G_OBJECT(menuitem), "activate",
@@ -658,6 +721,8 @@ void update_privacy_system_menu() {
                menuitem = gtk_menu_item_new_with_label(name);
                gtk_widget_show(menuitem);
                g_object_set_data_full(G_OBJECT(menuitem), MENU_VAL_ID, id, g_free);
+               g_object_set_data(G_OBJECT(menuitem), MENU_VAL_DATA, GINT_TO_POINTER(TRUE));
+
                gtk_menu_append(GTK_MENU(menu), menuitem);
 
                g_signal_connect(G_OBJECT(menuitem), "activate",
@@ -683,6 +748,19 @@ static void create_widget_func(PrefsPage * _page,
 
        if (notebook == NULL)
                prefs_account_create();
+       else {
+#ifdef USE_ASPELL
+               /* reset gtkaspell menus */
+               gtk_option_menu_remove_menu(GTK_OPTION_MENU(compose.optmenu_default_dictionary));
+               gtk_option_menu_set_menu(GTK_OPTION_MENU(compose.optmenu_default_dictionary), 
+                               gtkaspell_dictionary_option_menu_new(
+                               prefs_common.aspell_path));
+               gtk_option_menu_remove_menu(GTK_OPTION_MENU(compose.optmenu_default_alt_dictionary));
+               gtk_option_menu_set_menu(GTK_OPTION_MENU(compose.optmenu_default_alt_dictionary), 
+                               gtkaspell_dictionary_option_menu_new_with_refresh(
+                               prefs_common.aspell_path, FALSE));
+#endif
+       }
        gtk_box_pack_start (GTK_BOX (vbox), notebook, TRUE, TRUE, 0);
        gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), 0);
 
@@ -707,12 +785,6 @@ static void create_widget_func(PrefsPage * _page,
                        gtk_entry_set_text(GTK_ENTRY(basic.org_entry),
                                           def_ac->organization ? def_ac->organization : "");
                }
-               menu_set_sensitive_all
-                       (GTK_MENU_SHELL
-                               (gtk_option_menu_get_menu
-                                       (GTK_OPTION_MENU
-                                               (basic.protocol_optmenu))),
-                        TRUE);
        } else
                prefs_set_dialog(param);
 
@@ -746,7 +818,7 @@ void prefs_account_init()
        static gchar *path[2];
 
        path[0] = _("Account");
-       path[2] = NULL;
+       path[1] = NULL;
         
        account_page.page.path = path;
        account_page.page.weight = 1000.0;
@@ -947,10 +1019,20 @@ static gint prefs_account_get_new_id(void)
 void destroy_dialog(gpointer data)
 {
        PrefsAccount *ac_prefs = (PrefsAccount *) data;
-       if (!cancelled)
+       if (!cancelled) {
+               gboolean update_fld_list = FALSE;
+               if (ac_prefs->protocol == A_IMAP4 && !new_account) {
+                       if ((&tmp_ac_prefs)->imap_subsonly != ac_prefs->imap_subsonly) {
+                               update_fld_list = TRUE;
+                       } 
+               }
                *ac_prefs = tmp_ac_prefs;
-       else /* the customhdr_list may have changed, update it anyway */
+               if (update_fld_list)
+                       folderview_rescan_tree(ac_prefs->folder, FALSE);
+       } else /* the customhdr_list may have changed, update it anyway */
                ac_prefs->customhdr_list = (&tmp_ac_prefs)->customhdr_list;
+
+       
        gtk_main_quit();
 }
 
@@ -1026,34 +1108,6 @@ static void prefs_account_create(void)
 #endif /* USE_OPENSSL */
        prefs_account_advanced_create();
        SET_NOTEBOOK_LABEL(notebook, _("A_dvanced"), page++);
-
-       prefs_account_fix_size();
-}
-
-/**
- * prefs_account_fix_size:
- * 
- * Fix the window size after creating widgets by selecting "Local"
- * protocol (currently it has the largest size of parameter widgets).
- * Without this the window gets too large.
- **/
-static void prefs_account_fix_size(void)
-{
-       GtkOptionMenu *optmenu = GTK_OPTION_MENU (basic.protocol_optmenu);
-       GtkWidget *menu;
-       GtkWidget *menuitem;
-
-       gtk_option_menu_set_history (optmenu, 4); /* local */
-       menu = gtk_option_menu_get_menu (optmenu);
-       menuitem = gtk_menu_get_active (GTK_MENU (menu));
-       gtk_menu_item_activate (GTK_MENU_ITEM (menuitem));
-}
-
-#define SET_ACTIVATE(menuitem) \
-{ \
-       g_signal_connect(G_OBJECT(menuitem), "activate", \
-                        G_CALLBACK(prefs_account_protocol_activated), \
-                        NULL); \
 }
 
 #define TABLE_YPAD 2
@@ -1073,9 +1127,11 @@ static void prefs_account_basic_create(void)
 
        GtkWidget *serv_frame;
        GtkWidget *vbox2;
+       GtkWidget *optmenubox;
        GtkWidget *optmenu;
-       GtkWidget *optmenu_menu;
-       GtkWidget *menuitem;
+       GtkWidget *optlabel;
+       GtkWidget *no_imap_warn_icon;
+       GtkWidget *no_imap_warn_label;
        GtkWidget *serv_table;
        GtkWidget *recvserv_label;
        GtkWidget *smtpserv_label;
@@ -1094,6 +1150,11 @@ static void prefs_account_basic_create(void)
        GtkWidget *pass_label;
        GtkWidget *uid_entry;
        GtkWidget *pass_entry;
+       GtkListStore *menu;
+       GtkTreeIter iter;
+
+       struct BasicProtocol *protocol_optmenu;
+       gint i;
 
        vbox1 = gtk_vbox_new (FALSE, VSPACING);
        gtk_widget_show (vbox1);
@@ -1115,7 +1176,7 @@ static void prefs_account_basic_create(void)
 
        default_chkbtn = gtk_check_button_new_with_label (_("Set as default"));
        gtk_widget_show (default_chkbtn);
-       gtk_box_pack_end (GTK_BOX (hbox), default_chkbtn, FALSE, FALSE, 0);
+       gtk_box_pack_end (GTK_BOX (hbox), default_chkbtn, TRUE, FALSE, 0);
 
        PACK_FRAME (vbox1, frame1, _("Personal information"));
 
@@ -1162,12 +1223,7 @@ static void prefs_account_basic_create(void)
                          GTK_EXPAND | GTK_SHRINK | GTK_FILL,
                          GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
 
-       PACK_FRAME (vbox1, serv_frame, _("Server information"));
-
-       vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
-       gtk_widget_show (vbox2);
-       gtk_container_add (GTK_CONTAINER (serv_frame), vbox2);
-       gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
+       vbox2 = gtkut_get_options_frame(vbox1, &serv_frame, _("Server information"));
 
        hbox = gtk_hbox_new (FALSE, 8);
        gtk_widget_show (hbox);
@@ -1177,24 +1233,44 @@ static void prefs_account_basic_create(void)
        gtk_widget_show (label);
        gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
 
-       optmenu = gtk_option_menu_new ();
-       gtk_widget_show (optmenu);
-       gtk_box_pack_start (GTK_BOX (hbox), optmenu, FALSE, FALSE, 0);
-
-       optmenu_menu = gtk_menu_new ();
-
-       MENUITEM_ADD (optmenu_menu, menuitem, _("POP3"),  A_POP3);
-       SET_ACTIVATE (menuitem);
-       MENUITEM_ADD (optmenu_menu, menuitem, _("IMAP4"), A_IMAP4);
-       SET_ACTIVATE (menuitem);
-       MENUITEM_ADD (optmenu_menu, menuitem, _("News (NNTP)"), A_NNTP);
-       SET_ACTIVATE (menuitem);
-       MENUITEM_ADD (optmenu_menu, menuitem, _("Local mbox file"), A_LOCAL);
-       SET_ACTIVATE (menuitem);
-       MENUITEM_ADD (optmenu_menu, menuitem, _("None (SMTP only)"), A_NONE);
-       SET_ACTIVATE (menuitem);
-
-       gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu), optmenu_menu);
+       /* Create GtkHBox for protocol combobox and label */
+       optmenubox = gtk_hbox_new(FALSE, 20);
+       gtk_widget_show(optmenubox);
+       gtk_box_pack_start (GTK_BOX (hbox), optmenubox, FALSE, FALSE, 0);
+
+       /* Create and populate the combobox */
+       optmenu = gtkut_sc_combobox_create(NULL, FALSE);
+       gtk_box_pack_start(GTK_BOX (optmenubox), optmenu, FALSE, FALSE, 0);
+
+       menu = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)));
+       for( i = 0; i < NUM_RECV_PROTOCOLS; i++ )
+               if( protocol_names[i] != NULL )
+                       COMBOBOX_ADD (menu, _(protocol_names[i]), i);
+
+       g_signal_connect(G_OBJECT(optmenu), "changed",
+                       G_CALLBACK(prefs_account_protocol_changed), NULL);
+
+       /* Create protocol label, empty for now */
+       optlabel = gtk_label_new("");
+       gtk_label_set_use_markup(GTK_LABEL(optlabel), TRUE);
+       gtk_label_set_justify(GTK_LABEL(optlabel), GTK_JUSTIFY_CENTER);
+       gtk_box_pack_start(GTK_BOX (optmenubox), optlabel, FALSE, FALSE, 0);
+
+       no_imap_warn_icon = gtk_image_new_from_stock
+                        (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_SMALL_TOOLBAR);
+       no_imap_warn_label = gtk_label_new(_("<span weight=\"bold\">Warning: this version of Claws Mail\n"
+                         "has been built without IMAP support.</span>"));
+       gtk_label_set_use_markup(GTK_LABEL(no_imap_warn_label), TRUE);
+
+       gtk_box_pack_start(GTK_BOX (optmenubox), no_imap_warn_icon, FALSE, FALSE, 0);
+       gtk_box_pack_start(GTK_BOX (optmenubox), no_imap_warn_label, FALSE, FALSE, 0);
+       /* Set up a struct to store pointers to necessary widgets */
+       protocol_optmenu = g_new(struct BasicProtocol, 1);
+       protocol_optmenu->combobox = optmenu;
+       protocol_optmenu->label = optlabel;
+       protocol_optmenu->descrlabel = label;
+       protocol_optmenu->no_imap_warn_icon = no_imap_warn_icon;
+       protocol_optmenu->no_imap_warn_label = no_imap_warn_label;
 
        serv_table = gtk_table_new (6, 4, FALSE);
        gtk_widget_show (serv_table);
@@ -1332,7 +1408,7 @@ static void prefs_account_basic_create(void)
 
        basic.serv_frame       = serv_frame;
        basic.serv_table       = serv_table;
-       basic.protocol_optmenu = optmenu;
+       basic.protocol_optmenu = (gpointer)protocol_optmenu;
        basic.recvserv_label   = recvserv_label;
        basic.recvserv_entry   = recvserv_entry;
        basic.smtpserv_label   = smtpserv_label;
@@ -1378,6 +1454,7 @@ static void prefs_account_receive_create(void)
        GtkWidget *imap_frame;
        GtkWidget *imapdir_label;
        GtkWidget *imapdir_entry;
+       GtkWidget *subsonly_chkbtn;
        GtkWidget *local_frame;
        GtkWidget *local_vbox;
        GtkWidget *local_hbox;
@@ -1405,12 +1482,7 @@ static void prefs_account_receive_create(void)
        gtk_container_add (GTK_CONTAINER (notebook), vbox1);
        gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
 
-       PACK_FRAME (vbox1, local_frame, _("Local"));
-
-       local_vbox = gtk_vbox_new (FALSE, 0);
-       gtk_widget_show (local_vbox);
-       gtk_container_add (GTK_CONTAINER (local_frame), local_vbox);
-       gtk_container_set_border_width (GTK_CONTAINER (local_vbox), VBOX_BORDER);
+       local_vbox = gtkut_get_options_frame(vbox1, &local_frame, _("Local"));
 
        local_hbox = gtk_hbox_new (FALSE, 8);
        gtk_widget_show (local_hbox);
@@ -1438,13 +1510,7 @@ static void prefs_account_receive_create(void)
                          G_CALLBACK (prefs_account_select_folder_cb),
                          local_inbox_entry);
 
-       PACK_FRAME (vbox1, frame1, _("POP3"));
-
-       vbox2 = gtk_vbox_new (FALSE, 0);
-       gtk_widget_show (vbox2);
-       gtk_container_add (GTK_CONTAINER (frame1), vbox2);
-       gtk_container_set_border_width (GTK_CONTAINER (vbox2), VBOX_BORDER);
-
+       vbox2 = gtkut_get_options_frame(vbox1, &frame1, _("POP3"));
        PACK_CHECK_BUTTON (vbox2, use_apop_chkbtn,
                           _("Use secure authentication (APOP)"));
 
@@ -1533,12 +1599,7 @@ static void prefs_account_receive_create(void)
                          G_CALLBACK (prefs_account_select_folder_cb),
                          inbox_entry);
 
-       PACK_FRAME(vbox1, frame2, _("NNTP"));
-
-       vbox2 = gtk_vbox_new (FALSE, 0);
-       gtk_widget_show (vbox2);
-       gtk_container_add (GTK_CONTAINER (frame2), vbox2);
-       gtk_container_set_border_width (GTK_CONTAINER (vbox2), VBOX_BORDER);
+       vbox2 = gtkut_get_options_frame(vbox1, &frame2, _("NNTP"));
 
        hbox2 = gtk_hbox_new (FALSE, 8);
        gtk_widget_show (hbox2);
@@ -1564,12 +1625,7 @@ static void prefs_account_receive_create(void)
        gtk_spin_button_set_numeric
                (GTK_SPIN_BUTTON (maxarticle_spinbtn), TRUE);
 
-       PACK_FRAME (vbox1, imap_frame, _("IMAP4"));
-
-       vbox2 = gtk_vbox_new (FALSE, 0);
-       gtk_widget_show (vbox2);
-       gtk_container_add (GTK_CONTAINER (imap_frame), vbox2);
-       gtk_container_set_border_width (GTK_CONTAINER (vbox2), VBOX_BORDER);
+       vbox2 = gtkut_get_options_frame(vbox1, &imap_frame, _("IMAP4"));
 
        hbox1 = gtk_hbox_new (FALSE, 8);
        gtk_widget_show (hbox1);
@@ -1588,6 +1644,8 @@ static void prefs_account_receive_create(void)
        MENUITEM_ADD (optmenu_menu, menuitem, _("Automatic"), 0);
        MENUITEM_ADD (optmenu_menu, menuitem, "LOGIN", IMAP_AUTH_LOGIN);
        MENUITEM_ADD (optmenu_menu, menuitem, "CRAM-MD5", IMAP_AUTH_CRAM_MD5);
+       MENUITEM_ADD (optmenu_menu, menuitem, "ANONYMOUS", IMAP_AUTH_ANON);
+       MENUITEM_ADD (optmenu_menu, menuitem, "GSSAPI", IMAP_AUTH_GSSAPI);
 
        gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu), optmenu_menu);
 
@@ -1608,6 +1666,13 @@ static void prefs_account_receive_create(void)
        gtk_widget_show (imapdir_entry);
        gtk_box_pack_start (GTK_BOX (hbox1), imapdir_entry, FALSE, FALSE, 0);
 
+       hbox1 = gtk_hbox_new (FALSE, 8);
+       gtk_widget_show (hbox1);
+       gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 4);
+
+       PACK_CHECK_BUTTON (hbox1, subsonly_chkbtn,
+                          _("Show only subscribed folders"));
+
        PACK_CHECK_BUTTON (vbox1, filter_on_recv_chkbtn,
                           _("Filter messages on receiving"));
 
@@ -1632,7 +1697,7 @@ static void prefs_account_receive_create(void)
 
        receive.imapdir_label           = imapdir_label;
        receive.imapdir_entry           = imapdir_entry;
-
+       receive.subsonly_chkbtn         = subsonly_chkbtn;
        receive.local_frame             = local_frame;
        receive.local_inbox_label       = local_inbox_label;
        receive.local_inbox_entry       = local_inbox_entry;
@@ -1650,7 +1715,6 @@ static void prefs_account_send_create(void)
        GtkWidget *vbox1;
        GtkWidget *vbox2;
        GtkWidget *frame;
-       GtkWidget *date_chkbtn;
        GtkWidget *msgid_chkbtn;
        GtkWidget *hbox;
        GtkWidget *customhdr_chkbtn;
@@ -1676,14 +1740,8 @@ static void prefs_account_send_create(void)
        gtk_container_add (GTK_CONTAINER (notebook), vbox1);
        gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
 
-       PACK_FRAME (vbox1, frame, _("Header"));
+       vbox2 = gtkut_get_options_frame(vbox1, &frame, _("Header"));
 
-       vbox2 = gtk_vbox_new (FALSE, 0);
-       gtk_widget_show (vbox2);
-       gtk_container_add (GTK_CONTAINER (frame), vbox2);
-       gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
-
-       PACK_CHECK_BUTTON (vbox2, date_chkbtn, _("Add Date"));
        PACK_CHECK_BUTTON (vbox2, msgid_chkbtn, _("Generate Message-ID"));
 
        hbox = gtk_hbox_new (FALSE, 12);
@@ -1693,7 +1751,7 @@ static void prefs_account_send_create(void)
        PACK_CHECK_BUTTON (hbox, customhdr_chkbtn,
                           _("Add user-defined header"));
 
-       customhdr_edit_btn = gtk_button_new_with_label (_(" Edit... "));
+       customhdr_edit_btn = gtk_button_new_from_stock (GTK_STOCK_EDIT);
        gtk_widget_show (customhdr_edit_btn);
        gtk_box_pack_start (GTK_BOX (hbox), customhdr_edit_btn,
                            FALSE, FALSE, 0);
@@ -1703,12 +1761,7 @@ static void prefs_account_send_create(void)
 
        SET_TOGGLE_SENSITIVITY (customhdr_chkbtn, customhdr_edit_btn);
 
-       PACK_FRAME (vbox1, frame, _("Authentication"));
-
-       vbox3 = gtk_vbox_new (FALSE, 0);
-       gtk_widget_show (vbox3);
-       gtk_container_add (GTK_CONTAINER (frame), vbox3);
-       gtk_container_set_border_width (GTK_CONTAINER (vbox3), 8);
+       vbox3 = gtkut_get_options_frame(vbox1, &frame, _("Authentication"));
 
        PACK_CHECK_BUTTON (vbox3, smtp_auth_chkbtn,
                _("SMTP Authentication (SMTP AUTH)"));
@@ -1828,7 +1881,6 @@ static void prefs_account_send_create(void)
 
 
        
-       p_send.date_chkbtn      = date_chkbtn;
        p_send.msgid_chkbtn     = msgid_chkbtn;
        p_send.customhdr_chkbtn = customhdr_chkbtn;
 
@@ -1862,18 +1914,21 @@ static void prefs_account_compose_create(void)
        GtkWidget *autobcc_entry;
        GtkWidget *autoreplyto_chkbtn;
        GtkWidget *autoreplyto_entry;
+#if USE_ASPELL
+       GtkWidget *frame_dict;
+       GtkWidget *table_dict;
+       GtkWidget *checkbtn_enable_default_dictionary = NULL;
+       GtkWidget *optmenu_default_dictionary = NULL;
+       GtkWidget *checkbtn_enable_default_alt_dictionary = NULL;
+       GtkWidget *optmenu_default_alt_dictionary = NULL;
+#endif
 
        vbox1 = gtk_vbox_new (FALSE, VSPACING);
        gtk_widget_show (vbox1);
        gtk_container_add (GTK_CONTAINER (notebook), vbox1);
        gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
 
-       PACK_FRAME(vbox1, frame_sig, _("Signature"));
-
-       vbox_sig = gtk_vbox_new (FALSE, VSPACING_NARROW);
-       gtk_widget_show (vbox_sig);
-       gtk_container_add (GTK_CONTAINER (frame_sig), vbox_sig);
-       gtk_container_set_border_width (GTK_CONTAINER (vbox_sig), 8);
+       vbox_sig = gtkut_get_options_frame(vbox1, &frame_sig, _("Signature"));
 
        PACK_CHECK_BUTTON (vbox_sig, checkbtn_autosig,
                           _("Insert signature automatically"));
@@ -1933,11 +1988,7 @@ static void prefs_account_compose_create(void)
        g_signal_connect(G_OBJECT(signature_browse_button), "clicked",
                         G_CALLBACK(prefs_account_signature_browse_cb), NULL);
 
-       #if GTK_CHECK_VERSION(2, 6, 0)
        signature_edit_button = gtk_button_new_from_stock (GTK_STOCK_EDIT);
-       #else
-       signature_edit_button = gtk_button_new_with_label (_(" Edit... "));
-       #endif
        gtk_widget_show (signature_edit_button);
        gtk_box_pack_start (GTK_BOX (hbox2), signature_edit_button, FALSE, FALSE, 0);
        g_signal_connect(G_OBJECT(signature_edit_button), "clicked",
@@ -1991,6 +2042,53 @@ static void prefs_account_compose_create(void)
 
        SET_TOGGLE_SENSITIVITY (autoreplyto_chkbtn, autoreplyto_entry);
 
+#if USE_ASPELL
+       PACK_FRAME (vbox1, frame_dict, _("Spell check dictionaries"));
+
+       table_dict =  gtk_table_new (2, 2, FALSE);
+       gtk_widget_show (table_dict);
+       gtk_container_add (GTK_CONTAINER (frame_dict), table_dict);
+       gtk_container_set_border_width (GTK_CONTAINER (table_dict), 8);
+       gtk_table_set_row_spacings (GTK_TABLE (table_dict), VSPACING_NARROW_2);
+       gtk_table_set_col_spacings (GTK_TABLE (table_dict), 8);
+
+       /* Default dictionary */
+       checkbtn_enable_default_dictionary = gtk_check_button_new_with_label(_("Default dictionary: "));
+       gtk_table_attach(GTK_TABLE(table_dict), checkbtn_enable_default_dictionary, 0, 1,
+                       0, 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_dictionary),
+                       tmp_ac_prefs.enable_default_dictionary);
+
+       optmenu_default_dictionary = gtk_option_menu_new();
+       gtk_table_attach(GTK_TABLE(table_dict), optmenu_default_dictionary, 1, 2,
+                       0, 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
+
+       gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu_default_dictionary), 
+                       gtkaspell_dictionary_option_menu_new(
+                       prefs_common.aspell_path));
+
+       SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_dictionary, optmenu_default_dictionary);
+
+       /* Default dictionary */
+       checkbtn_enable_default_alt_dictionary = gtk_check_button_new_with_label(_("Default alternate dictionary: "));
+       gtk_table_attach(GTK_TABLE(table_dict), checkbtn_enable_default_alt_dictionary, 0, 1,
+                       1, 2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_alt_dictionary),
+                       tmp_ac_prefs.enable_default_alt_dictionary);
+
+       optmenu_default_alt_dictionary = gtk_option_menu_new();
+       gtk_table_attach(GTK_TABLE(table_dict), optmenu_default_alt_dictionary, 1, 2,
+                       1, 2, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
+
+       gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu_default_alt_dictionary), 
+                       gtkaspell_dictionary_option_menu_new_with_refresh(
+                       prefs_common.aspell_path, FALSE));
+
+       SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_alt_dictionary, optmenu_default_alt_dictionary);
+
+       gtk_widget_show_all(table_dict);
+#endif
+
        compose.sigfile_radiobtn = sigfile_radiobtn;
        compose.entry_sigpath      = entry_sigpath;
        compose.checkbtn_autosig   = checkbtn_autosig;
@@ -2002,6 +2100,12 @@ static void prefs_account_compose_create(void)
        compose.autobcc_entry      = autobcc_entry;
        compose.autoreplyto_chkbtn = autoreplyto_chkbtn;
        compose.autoreplyto_entry  = autoreplyto_entry;
+#ifdef USE_ASPELL
+       compose.checkbtn_enable_default_dictionary = checkbtn_enable_default_dictionary;
+       compose.optmenu_default_dictionary = optmenu_default_dictionary;
+       compose.checkbtn_enable_default_alt_dictionary = checkbtn_enable_default_alt_dictionary;
+       compose.optmenu_default_alt_dictionary = optmenu_default_alt_dictionary;
+#endif
 }
 
 static void prefs_account_privacy_create(void)
@@ -2015,6 +2119,7 @@ static void prefs_account_privacy_create(void)
        GtkWidget *default_encrypt_reply_chkbtn;
        GtkWidget *default_sign_chkbtn;
        GtkWidget *save_clear_text_chkbtn;
+       GtkWidget *encrypt_to_self_chkbtn;
 
        vbox1 = gtk_vbox_new (FALSE, VSPACING);
        gtk_widget_show (vbox1);
@@ -2037,21 +2142,26 @@ static void prefs_account_privacy_create(void)
        gtk_widget_show (default_privacy_system);
        gtk_box_pack_start (GTK_BOX(hbox1), default_privacy_system, FALSE, TRUE, 0);
 
+       PACK_CHECK_BUTTON (vbox2, default_sign_chkbtn,
+                          _("Always sign messages"));
        PACK_CHECK_BUTTON (vbox2, default_encrypt_chkbtn,
-                          _("Encrypt message by default"));
+                          _("Always encrypt messages"));
        PACK_CHECK_BUTTON (vbox2, default_encrypt_reply_chkbtn,
-                          _("Encrypt message by default when replying to an "
+                          _("Always encrypt messages when replying to an "
                             "encrypted message"));
-       PACK_CHECK_BUTTON (vbox2, default_sign_chkbtn,
-                          _("Sign message by default"));
+       PACK_CHECK_BUTTON (vbox2, encrypt_to_self_chkbtn,
+                          _("Encrypt sent messages with your own key in addition to recipient's"));
        PACK_CHECK_BUTTON (vbox2, save_clear_text_chkbtn,
                           _("Save sent encrypted messages as clear text"));
 
+       SET_TOGGLE_SENSITIVITY_REVERSE(encrypt_to_self_chkbtn, save_clear_text_chkbtn);
+
        privacy.default_privacy_system = default_privacy_system;
        privacy.default_encrypt_chkbtn = default_encrypt_chkbtn;
        privacy.default_encrypt_reply_chkbtn = default_encrypt_reply_chkbtn;
        privacy.default_sign_chkbtn    = default_sign_chkbtn;
        privacy.save_clear_text_chkbtn = save_clear_text_chkbtn;
+       privacy.encrypt_to_self_chkbtn = encrypt_to_self_chkbtn;
 }
 
 #if USE_OPENSSL
@@ -2121,11 +2231,7 @@ static void prefs_account_ssl_create(void)
        gtk_container_add (GTK_CONTAINER (notebook), vbox1);
        gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
 
-       PACK_FRAME (vbox1, pop_frame, _("POP3"));
-       vbox2 = gtk_vbox_new (FALSE, 0);
-       gtk_widget_show (vbox2);
-       gtk_container_add (GTK_CONTAINER (pop_frame), vbox2);
-       gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
+       vbox2 = gtkut_get_options_frame(vbox1, &pop_frame, _("POP3"));
 
        CREATE_RADIO_BUTTONS(vbox2,
                             pop_nossl_radiobtn,
@@ -2138,11 +2244,7 @@ static void prefs_account_ssl_create(void)
                             _("Use STARTTLS command to start SSL session"),
                             SSL_STARTTLS);
 
-       PACK_FRAME (vbox1, imap_frame, _("IMAP4"));
-       vbox3 = gtk_vbox_new (FALSE, 0);
-       gtk_widget_show (vbox3);
-       gtk_container_add (GTK_CONTAINER (imap_frame), vbox3);
-       gtk_container_set_border_width (GTK_CONTAINER (vbox3), 8);
+       vbox3 = gtkut_get_options_frame(vbox1, &imap_frame, _("IMAP4"));
 
        CREATE_RADIO_BUTTONS(vbox3,
                             imap_nossl_radiobtn,
@@ -2155,11 +2257,7 @@ static void prefs_account_ssl_create(void)
                             _("Use STARTTLS command to start SSL session"),
                             SSL_STARTTLS);
 
-       PACK_FRAME (vbox1, nntp_frame, _("NNTP"));
-       vbox4 = gtk_vbox_new (FALSE, 0);
-       gtk_widget_show (vbox4);
-       gtk_container_add (GTK_CONTAINER (nntp_frame), vbox4);
-       gtk_container_set_border_width (GTK_CONTAINER (vbox4), 8);
+       vbox4 = gtkut_get_options_frame(vbox1, &nntp_frame, _("NNTP"));
 
        nntp_nossl_radiobtn =
                gtk_radio_button_new_with_label (NULL, _("Don't use SSL"));
@@ -2173,11 +2271,7 @@ static void prefs_account_ssl_create(void)
        CREATE_RADIO_BUTTON(vbox4, nntp_ssltunnel_radiobtn, nntp_nossl_radiobtn,
                            _("Use SSL for NNTP connection"), SSL_TUNNEL);
 
-       PACK_FRAME (vbox1, send_frame, _("Send (SMTP)"));
-       vbox5 = gtk_vbox_new (FALSE, 0);
-       gtk_widget_show (vbox5);
-       gtk_container_add (GTK_CONTAINER (send_frame), vbox5);
-       gtk_container_set_border_width (GTK_CONTAINER (vbox5), 8);
+       vbox5 = gtkut_get_options_frame(vbox1, &send_frame, _("Send (SMTP)"));
 
        CREATE_RADIO_BUTTONS(vbox5,
                             smtp_nossl_radiobtn,
@@ -2393,12 +2487,7 @@ static void prefs_account_advanced_create(void)
 
        /* special folder setting (maybe these options are redundant) */
 
-       PACK_FRAME (vbox1, folder_frame, _("Folder"));
-
-       vbox3 = gtk_vbox_new (FALSE, 0);
-       gtk_widget_show (vbox3);
-       gtk_container_add (GTK_CONTAINER (folder_frame), vbox3);
-       gtk_container_set_border_width (GTK_CONTAINER (vbox3), 8);
+       vbox3 = gtkut_get_options_frame(vbox1, &folder_frame, _("Folder"));
 
        table = gtk_table_new (4, 3, FALSE);
        gtk_widget_show (table);
@@ -2475,15 +2564,12 @@ static void prefs_account_advanced_create(void)
 static gint prefs_account_apply(void)
 {
        RecvProtocol protocol;
-       GtkWidget *menu;
-       GtkWidget *menuitem;
        gchar *old_id = NULL;
        gchar *new_id = NULL;
-       
-       menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(basic.protocol_optmenu));
-       menuitem = gtk_menu_get_active(GTK_MENU(menu));
-       protocol = GPOINTER_TO_INT
-               (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
+       struct BasicProtocol *protocol_optmenu = (struct BasicProtocol *) basic.protocol_optmenu;
+       GtkWidget *optmenu = protocol_optmenu->combobox;
+
+       protocol = combobox_get_active_data(GTK_COMBO_BOX(optmenu));
 
        if (*gtk_entry_get_text(GTK_ENTRY(basic.acname_entry)) == '\0') {
                alertpanel_error(_("Account name is not entered."));
@@ -2510,6 +2596,14 @@ static gint prefs_account_apply(void)
                alertpanel_error(_("POP3 server is not entered."));
                return -1;
        }
+       if (protocol == A_POP3 || protocol == A_LOCAL) {
+               const gchar *mailbox = gtk_entry_get_text(GTK_ENTRY(receive.inbox_entry));
+               FolderItem *inbox =  folder_find_item_from_identifier(mailbox);
+               if (inbox == NULL) {
+                       alertpanel_error(_("The default inbox folder doesn't exist."));
+                       return -1;
+               }
+       }
        if (protocol == A_IMAP4 &&
            *gtk_entry_get_text(GTK_ENTRY(basic.recvserv_entry)) == '\0') {
                alertpanel_error(_("IMAP4 server is not entered."));
@@ -2549,6 +2643,7 @@ static gint prefs_account_apply(void)
                g_free(old_id);
                g_free(new_id);
        }
+       
        return 0;
 }
 
@@ -2657,35 +2752,52 @@ static void prefs_account_enum_set_radiobtn(PrefParam *pparam)
 
 static void prefs_account_protocol_set_data_from_optmenu(PrefParam *pparam)
 {
-       GtkWidget *menu;
-       GtkWidget *menuitem;
+       struct BasicProtocol *protocol_optmenu =
+               (struct BasicProtocol *)*pparam->widget;
+       GtkWidget *optmenu = protocol_optmenu->combobox;
 
-       menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
-       menuitem = gtk_menu_get_active(GTK_MENU(menu));
-       *((RecvProtocol *)pparam->data) = GPOINTER_TO_INT
-               (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
+       *((RecvProtocol *)pparam->data) =
+               combobox_get_active_data(GTK_COMBO_BOX(optmenu));
 }
 
 static void prefs_account_protocol_set_optmenu(PrefParam *pparam)
 {
        RecvProtocol protocol;
-       GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
-       GtkWidget *menu;
-       GtkWidget *menuitem;
-       gint index;
+       struct BasicProtocol *protocol_optmenu =
+               (struct BasicProtocol *)*pparam->widget;
+       GtkWidget *optmenu = protocol_optmenu->combobox;
+       GtkWidget *optlabel = protocol_optmenu->label;
+       GtkWidget *descrlabel = protocol_optmenu->descrlabel;
+       gchar *label = NULL;
 
        protocol = *((RecvProtocol *)pparam->data);
-       index = menu_find_option_menu_index
-               (optmenu, GINT_TO_POINTER(protocol), NULL);
-       if (index < 0) return;
-       gtk_option_menu_set_history(optmenu, index);
 
-       menu = gtk_option_menu_get_menu(optmenu);
-       menu_set_insensitive_all(GTK_MENU_SHELL(menu));
-
-       menuitem = gtk_menu_get_active(GTK_MENU(menu));
-       gtk_widget_set_sensitive(menuitem, TRUE);
-       gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
+       /* Set combobox to correct value even if it will be hidden, so
+        * we won't break existing accounts when saving. */
+       combobox_select_by_data(GTK_COMBO_BOX(optmenu), protocol);
+
+       /* Set up widgets accordingly */
+       if( new_account ) {
+               gtk_label_set_text(GTK_LABEL(descrlabel), _("Protocol"));
+               gtk_widget_hide(optlabel);
+               gtk_widget_show(optmenu);
+       } else {
+               gtk_label_set_text(GTK_LABEL(descrlabel), _("Protocol:"));
+               label = g_markup_printf_escaped("<b>%s</b>", protocol_names[protocol]);
+               gtk_label_set_markup(GTK_LABEL(optlabel), label);
+               g_free(label);
+               gtk_widget_hide(optmenu);
+               gtk_widget_show(optlabel);
+#ifndef HAVE_LIBETPAN
+               if (protocol == A_IMAP4) {
+                       gtk_widget_show(protocol_optmenu->no_imap_warn_icon);
+                       gtk_widget_show(protocol_optmenu->no_imap_warn_label);
+               } else {
+                       gtk_widget_hide(protocol_optmenu->no_imap_warn_icon);
+                       gtk_widget_hide(protocol_optmenu->no_imap_warn_label);
+               }
+#endif
+       }
 }
 
 static void prefs_account_imap_auth_type_set_data_from_optmenu(PrefParam *pparam)
@@ -2713,6 +2825,12 @@ static void prefs_account_imap_auth_type_set_optmenu(PrefParam *pparam)
        case IMAP_AUTH_CRAM_MD5:
                gtk_option_menu_set_history(optmenu, 2);
                break;
+       case IMAP_AUTH_ANON:
+               gtk_option_menu_set_history(optmenu, 3);
+               break;
+       case IMAP_AUTH_GSSAPI:
+               gtk_option_menu_set_history(optmenu, 4);
+               break;
        case 0:
        default:
                gtk_option_menu_set_history(optmenu, 0);
@@ -2808,6 +2926,7 @@ static void prefs_account_set_optmenu_from_string(PrefParam *pparam)
                if (id != NULL && strcmp(id, prefsid) == 0) {
                        found = TRUE;
                        gtk_option_menu_set_history(GTK_OPTION_MENU(optionmenu), i);
+                       privacy_system_activated(GTK_MENU_ITEM(item));
                }
                i++;
        }
@@ -2816,28 +2935,37 @@ static void prefs_account_set_optmenu_from_string(PrefParam *pparam)
                gchar *name;
                GtkWidget *menuitem;
 
-               name = g_strdup_printf(_("Unsupported (%s)"), prefsid);
+               name = g_strdup_printf(_("%s (plugin not loaded)"), prefsid);
                menuitem = gtk_menu_item_new_with_label(name);
                gtk_widget_show(menuitem);
-               g_object_set_data_full(G_OBJECT(menuitem), MENU_VAL_ID, g_strdup(prefsid), g_free);
+               g_object_set_data(G_OBJECT(menuitem), MENU_VAL_ID, prefsid);
+               g_object_set_data(G_OBJECT(menuitem), MENU_VAL_DATA, GINT_TO_POINTER(FALSE));
                gtk_menu_append(GTK_MENU(menu), menuitem);
                g_free(name);
 
                gtk_option_menu_set_history(GTK_OPTION_MENU(optionmenu), i);
+               privacy_system_activated(GTK_MENU_ITEM(menuitem));
+               g_signal_connect(G_OBJECT(menuitem), "activate",
+                                G_CALLBACK(privacy_system_activated),
+                                NULL);
        }
 
        g_list_free(children);
 }
 
-static void prefs_account_protocol_activated(GtkMenuItem *menuitem)
+static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
 {
        RecvProtocol protocol;
+       struct BasicProtocol *protocol_optmenu = (struct BasicProtocol *)basic.protocol_optmenu;
 
-       protocol = GPOINTER_TO_INT
-               (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
+       protocol = combobox_get_active_data(combobox);
 
+       gtk_widget_hide(protocol_optmenu->no_imap_warn_icon);
+       gtk_widget_hide(protocol_optmenu->no_imap_warn_label);
        switch(protocol) {
        case A_NNTP:
+               gtk_widget_hide(protocol_optmenu->no_imap_warn_icon);
+               gtk_widget_hide(protocol_optmenu->no_imap_warn_label);
                gtk_widget_show(basic.nntpserv_label);
                gtk_widget_show(basic.nntpserv_entry);
                gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
@@ -2922,8 +3050,11 @@ static void prefs_account_protocol_activated(GtkMenuItem *menuitem)
                gtk_widget_hide(advanced.tunnelcmd_entry);
                gtk_widget_hide(receive.imapdir_label);
                gtk_widget_hide(receive.imapdir_entry);
+               gtk_widget_hide(receive.subsonly_chkbtn);
                break;
        case A_LOCAL:
+               gtk_widget_hide(protocol_optmenu->no_imap_warn_icon);
+               gtk_widget_hide(protocol_optmenu->no_imap_warn_label);
                gtk_widget_hide(basic.nntpserv_label);
                gtk_widget_hide(basic.nntpserv_entry);
                gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
@@ -3004,8 +3135,13 @@ static void prefs_account_protocol_activated(GtkMenuItem *menuitem)
                gtk_widget_hide(advanced.tunnelcmd_entry);
                gtk_widget_hide(receive.imapdir_label);
                gtk_widget_hide(receive.imapdir_entry);
+               gtk_widget_hide(receive.subsonly_chkbtn);
                break;
        case A_IMAP4:
+#ifndef HAVE_LIBETPAN
+               gtk_widget_show(protocol_optmenu->no_imap_warn_icon);
+               gtk_widget_show(protocol_optmenu->no_imap_warn_label);
+#endif
                gtk_widget_hide(basic.nntpserv_label);
                gtk_widget_hide(basic.nntpserv_entry);
                gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
@@ -3089,8 +3225,11 @@ static void prefs_account_protocol_activated(GtkMenuItem *menuitem)
                gtk_widget_show(advanced.tunnelcmd_entry);
                gtk_widget_show(receive.imapdir_label);
                gtk_widget_show(receive.imapdir_entry);
+               gtk_widget_show(receive.subsonly_chkbtn);
                break;
        case A_NONE:
+               gtk_widget_hide(protocol_optmenu->no_imap_warn_icon);
+               gtk_widget_hide(protocol_optmenu->no_imap_warn_label);
                gtk_widget_hide(basic.nntpserv_label);
                gtk_widget_hide(basic.nntpserv_entry);
                gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
@@ -3170,9 +3309,12 @@ static void prefs_account_protocol_activated(GtkMenuItem *menuitem)
                gtk_widget_hide(advanced.tunnelcmd_entry);
                gtk_widget_hide(receive.imapdir_label);
                gtk_widget_hide(receive.imapdir_entry);
+               gtk_widget_hide(receive.subsonly_chkbtn);
                break;
        case A_POP3:
        default:
+               gtk_widget_hide(protocol_optmenu->no_imap_warn_icon);
+               gtk_widget_hide(protocol_optmenu->no_imap_warn_label);
                gtk_widget_hide(basic.nntpserv_label);
                gtk_widget_hide(basic.nntpserv_entry);
                gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
@@ -3256,6 +3398,7 @@ static void prefs_account_protocol_activated(GtkMenuItem *menuitem)
                gtk_widget_hide(advanced.tunnelcmd_entry);
                gtk_widget_hide(receive.imapdir_label);
                gtk_widget_hide(receive.imapdir_entry);
+               gtk_widget_hide(receive.subsonly_chkbtn);
                break;
        }
 
@@ -3292,6 +3435,49 @@ static void prefs_account_mailcmd_toggled(GtkToggleButton *button,
        gtk_widget_set_sensitive(basic.pass_entry, !use_mailcmd);
 }
 
+#if USE_ASPELL
+static void prefs_account_compose_default_dictionary_set_string_from_optmenu
+                                                       (PrefParam *pparam)
+{
+       GtkWidget *menu;
+       GtkWidget *menuitem;
+       gchar **str;
+
+       g_return_if_fail(*pparam->widget != NULL);
+
+       menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
+       menuitem = gtk_menu_get_active(GTK_MENU(menu));
+       if (menuitem == NULL)
+               return;
+
+       str = (gchar **) pparam->data;
+       g_free(*str);
+       *str = gtkaspell_get_dictionary_menu_active_item(menu);
+}
+
+static void prefs_account_compose_default_dictionary_set_optmenu_from_string
+                                                       (PrefParam *pparam)
+{
+       GtkWidget *optionmenu;
+       GtkWidget *menu;
+       GtkWidget *menuitem;
+       gchar *dictionary;
+
+       g_return_if_fail(*pparam->widget != NULL);
+
+       dictionary = *((gchar **) pparam->data);
+       if (dictionary == NULL)
+               return;
+
+       optionmenu = *pparam->widget;
+       menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(optionmenu));
+       if (dictionary)
+               gtkaspell_set_dictionary_menu_active_item(optionmenu, dictionary);
+       menuitem = gtk_menu_get_active(GTK_MENU(menu));
+       gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
+}
+#endif
+
 void prefs_account_register_page(PrefsPage *page)
 {
        prefs_pages = g_slist_append(prefs_pages, page);