2004-11-17 [colin] 0.9.12cvs156.1
[claws.git] / src / prefs_account.c
index 1459c550caeb81a1be92c974d68ed5da392b26ff..83cb8c4646569ac99abdd7844d9d93cfabe86b39 100644 (file)
@@ -89,6 +89,7 @@ static struct Basic {
 
 static struct Receive {
        GtkWidget *pop3_frame;
+       GtkWidget *use_apop_chkbtn;
        GtkWidget *rmmail_chkbtn;
        GtkWidget *leave_time_entry;
        GtkWidget *getall_chkbtn;
@@ -135,18 +136,12 @@ static struct Compose {
        GtkWidget *autoreplyto_entry;
 } compose;
 
-#if USE_GPGME
 static struct Privacy {
+       GtkWidget *default_privacy_system;
        GtkWidget *default_encrypt_chkbtn;
        GtkWidget *default_sign_chkbtn;
-       GtkWidget *gnupg_mime_radiobtn;
-       GtkWidget *gnupg_inline_radiobtn;
-       GtkWidget *defaultkey_radiobtn;
-       GtkWidget *emailkey_radiobtn;
-       GtkWidget *customkey_radiobtn;
-       GtkWidget *customkey_entry;
+       GtkWidget *save_clear_text_chkbtn;
 } privacy;
-#endif /* USE_GPGME */
 
 #if USE_OPENSSL
 static struct SSLPrefs {
@@ -209,6 +204,9 @@ 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_set_string_from_optmenu      (PrefParam *pparam);
+static void prefs_account_set_optmenu_from_string      (PrefParam *pparam);
+
 static void prefs_account_imap_auth_type_set_data_from_optmenu
                                                        (PrefParam *pparam);
 static void prefs_account_imap_auth_type_set_optmenu   (PrefParam *pparam);
@@ -219,10 +217,6 @@ static void prefs_account_smtp_auth_type_set_optmenu       (PrefParam *pparam);
 static void prefs_account_enum_set_data_from_radiobtn  (PrefParam *pparam);
 static void prefs_account_enum_set_radiobtn            (PrefParam *pparam);
 
-#if USE_GPGME
-static void prefs_account_gnupg_inline_warning         (GtkWidget *widget);
-#endif /* USE_GPGME */
-
 static void prefs_account_crosspost_set_data_from_colormenu(PrefParam *pparam);
 static void prefs_account_crosspost_set_colormenu(PrefParam *pparam);
 
@@ -290,6 +284,10 @@ static PrefParam param[] = {
         &receive.inbox_entry, prefs_set_data_from_entry, prefs_set_entry},
 
        /* Receive */
+       {"use_apop_auth", "FALSE", &tmp_ac_prefs.use_apop_auth, P_BOOL,
+        &receive.use_apop_chkbtn,
+        prefs_set_data_from_toggle, prefs_set_toggle},
+
        {"remove_mail", "TRUE", &tmp_ac_prefs.rmmail, P_BOOL,
         &receive.rmmail_chkbtn,
         prefs_set_data_from_toggle, prefs_set_toggle},
@@ -402,26 +400,19 @@ static PrefParam param[] = {
         &compose.autoreplyto_entry,
         prefs_set_data_from_entry, prefs_set_entry},
 
-#if USE_GPGME
        /* Privacy */
+       {"default_privacy_system", "", &tmp_ac_prefs.default_privacy_system, P_STRING,
+        &privacy.default_privacy_system,
+        prefs_account_set_string_from_optmenu, prefs_account_set_optmenu_from_string},
        {"default_encrypt", "FALSE", &tmp_ac_prefs.default_encrypt, P_BOOL,
         &privacy.default_encrypt_chkbtn,
         prefs_set_data_from_toggle, prefs_set_toggle},
        {"default_sign", "FALSE", &tmp_ac_prefs.default_sign, P_BOOL,
         &privacy.default_sign_chkbtn,
         prefs_set_data_from_toggle, prefs_set_toggle},
-       {"default_gnupg_mode", NULL, &tmp_ac_prefs.default_gnupg_mode, P_ENUM,
-        &privacy.gnupg_mime_radiobtn,
-        prefs_account_enum_set_data_from_radiobtn,
-        prefs_account_enum_set_radiobtn},
-       {"sign_key", NULL, &tmp_ac_prefs.sign_key, P_ENUM,
-        &privacy.defaultkey_radiobtn,
-        prefs_account_enum_set_data_from_radiobtn,
-        prefs_account_enum_set_radiobtn},
-       {"sign_key_id", NULL, &tmp_ac_prefs.sign_key_id, P_STRING,
-        &privacy.customkey_entry,
-        prefs_set_data_from_entry, prefs_set_entry},
-#endif /* USE_GPGME */
+       {"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},
 
 #if USE_OPENSSL
        /* SSL */
@@ -539,9 +530,7 @@ static void prefs_account_basic_create              (void);
 static void prefs_account_receive_create       (void);
 static void prefs_account_send_create          (void);
 static void prefs_account_compose_create       (void);
-#if USE_GPGME
 static void prefs_account_privacy_create       (void);
-#endif /* USE_GPGME */
 #if USE_OPENSSL
 static void prefs_account_ssl_create           (void);
 #endif /* USE_OPENSSL */
@@ -580,7 +569,7 @@ PrefsAccount *prefs_account_new(void)
 
 void prefs_account_read_config(PrefsAccount *ac_prefs, const gchar *label)
 {
-       const gchar *p = label;
+       const guchar *p = label;
        gint id;
 
        g_return_if_fail(ac_prefs != NULL);
@@ -594,10 +583,16 @@ void prefs_account_read_config(PrefsAccount *ac_prefs, const gchar *label)
        if (id < 0) g_warning("wrong account id: %d\n", id);
        ac_prefs->account_id = id;
 
+       if (ac_prefs->protocol == A_APOP) {
+               debug_print("converting protocol A_APOP to new prefs.\n");
+               ac_prefs->protocol = A_POP3;
+               ac_prefs->use_apop_auth = TRUE;
+       }
+
        prefs_custom_header_read_config(ac_prefs);
 }
 
-void prefs_account_save_config_all(GList *account_list)
+void prefs_account_write_config_all(GList *account_list)
 {
        GList *cur;
        gchar *rcpath;
@@ -656,6 +651,33 @@ static gint prefs_account_get_new_id(void)
        return last_id + 1;
 }
 
+void update_privacy_system_menu() {
+       GtkWidget *menu;
+       GtkWidget *menuitem;
+       GSList *system_ids, *cur;
+
+       menu = gtk_menu_new();
+
+       menuitem = gtk_menu_item_new_with_label(_("None"));
+       gtk_widget_show(menuitem);
+       g_object_set_data(G_OBJECT(menuitem), MENU_VAL_ID, "");
+       gtk_menu_append(GTK_MENU(menu), menuitem);
+
+       system_ids = privacy_get_system_ids();
+       for (cur = system_ids; cur != NULL; cur = g_slist_next(cur)) {
+               gchar *id = (gchar *) cur->data;
+               const gchar *name;
+               
+               name = privacy_system_get_name(id);
+               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);
+               gtk_menu_append(GTK_MENU(menu), menuitem);
+       }
+
+       gtk_option_menu_set_menu(GTK_OPTION_MENU(privacy.default_privacy_system), menu);
+}
+
 PrefsAccount *prefs_account_open(PrefsAccount *ac_prefs)
 {
        gboolean new_account = FALSE;
@@ -684,6 +706,8 @@ PrefsAccount *prefs_account_open(PrefsAccount *ac_prefs)
 
        tmp_ac_prefs = *ac_prefs;
 
+       update_privacy_system_menu();
+
        if (new_account) {
                PrefsAccount *def_ac;
                gchar *buf;
@@ -711,17 +735,15 @@ PrefsAccount *prefs_account_open(PrefsAccount *ac_prefs)
                                     _("Preferences for new account"));
                gtk_widget_hide(dialog.apply_btn);
        } else {
+               gchar *title;
                prefs_set_dialog(param);
-               gtk_window_set_title(GTK_WINDOW(dialog.window),
-                                    _("Account preferences"));
+               title = g_strdup_printf (_("%s - Account preferences"),
+                               ac_prefs->account_name);
+               gtk_window_set_title(GTK_WINDOW(dialog.window), title);
+               g_free (title);
                gtk_widget_show(dialog.apply_btn);
        }
 
-       if (ac_prefs->protocol != A_LOCAL) {
-               gtk_widget_set_sensitive(basic.smtpserv_entry, TRUE);
-               gtk_widget_set_sensitive(basic.smtpserv_label, TRUE);
-       }
-
        pop_bfr_smtp_tm_set_sens (NULL, NULL);
        
        gtk_widget_show(dialog.window);
@@ -768,10 +790,8 @@ static void prefs_account_create(void)
        SET_NOTEBOOK_LABEL(dialog.notebook, _("Send"), page++);
        prefs_account_compose_create();
        SET_NOTEBOOK_LABEL(dialog.notebook, _("Compose"), page++);
-#if USE_GPGME
        prefs_account_privacy_create();
        SET_NOTEBOOK_LABEL(dialog.notebook, _("Privacy"), page++);
-#endif /* USE_GPGME */
 #if USE_OPENSSL
        prefs_account_ssl_create();
        SET_NOTEBOOK_LABEL(dialog.notebook, _("SSL"), page++);
@@ -935,15 +955,15 @@ static void prefs_account_basic_create(void)
 
        optmenu_menu = gtk_menu_new ();
 
-       MENUITEM_ADD (optmenu_menu, menuitem, _("POP3 (normal)"),  A_POP3);
-       SET_ACTIVATE (menuitem);
-       MENUITEM_ADD (optmenu_menu, menuitem, _("POP3 (APOP auth)"),  A_APOP);
+       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, _("None (local)"), A_LOCAL);
+       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);
@@ -1109,6 +1129,7 @@ static void prefs_account_receive_create(void)
        GtkWidget *vbox1;
        GtkWidget *frame1;
        GtkWidget *vbox2;
+       GtkWidget *use_apop_chkbtn;
        GtkWidget *rmmail_chkbtn;
        GtkWidget *hbox_spc;
        GtkWidget *leave_time_label;
@@ -1147,6 +1168,9 @@ static void prefs_account_receive_create(void)
        gtk_container_add (GTK_CONTAINER (frame1), vbox2);
        gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
 
+       PACK_CHECK_BUTTON (vbox2, use_apop_chkbtn,
+                          _("Use secure authentication (APOP)"));
+
        PACK_CHECK_BUTTON (vbox2, rmmail_chkbtn,
                           _("Remove messages on server when received"));
 
@@ -1304,6 +1328,7 @@ static void prefs_account_receive_create(void)
                 _("`Get all' checks for new messages on this account"));
 
        receive.pop3_frame               = frame1;
+       receive.use_apop_chkbtn          = use_apop_chkbtn;
        receive.rmmail_chkbtn            = rmmail_chkbtn;
        receive.leave_time_entry         = leave_time_entry;
        receive.getall_chkbtn            = getall_chkbtn;
@@ -1361,7 +1386,7 @@ static void prefs_account_send_create(void)
        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"));
+       PACK_CHECK_BUTTON (vbox2, msgid_chkbtn, _("Generate Message-ID"));
 
        hbox = gtk_hbox_new (FALSE, 12);
        gtk_widget_show (hbox);
@@ -1659,24 +1684,16 @@ static void prefs_account_compose_create(void)
        compose.autoreplyto_entry  = autoreplyto_entry;
 }
 
-#if USE_GPGME
 static void prefs_account_privacy_create(void)
 {
        GtkWidget *vbox1;
-       GtkWidget *frame_mode;
-       GtkWidget *vbox_mode;
-       GtkWidget *frame1;
        GtkWidget *vbox2;
        GtkWidget *hbox1;
        GtkWidget *label;
+       GtkWidget *default_privacy_system;
        GtkWidget *default_encrypt_chkbtn;
        GtkWidget *default_sign_chkbtn;
-       GtkWidget *gnupg_mime_radiobtn;
-       GtkWidget *gnupg_inline_radiobtn;
-       GtkWidget *defaultkey_radiobtn;
-       GtkWidget *emailkey_radiobtn;
-       GtkWidget *customkey_radiobtn;
-       GtkWidget *customkey_entry;
+       GtkWidget *save_clear_text_chkbtn;
 
        vbox1 = gtk_vbox_new (FALSE, VSPACING);
        gtk_widget_show (vbox1);
@@ -1687,104 +1704,30 @@ static void prefs_account_privacy_create(void)
        gtk_widget_show (vbox2);
        gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
 
-       PACK_CHECK_BUTTON (vbox2, default_encrypt_chkbtn,
-                          _("Encrypt message by default"));
-       PACK_CHECK_BUTTON (vbox2, default_sign_chkbtn,
-                          _("Sign message by default"));
-                           
-       PACK_FRAME (vbox1, frame_mode, _("Default mode"));
-       
-       vbox_mode = gtk_vbox_new (FALSE, 0);
-       gtk_widget_show (vbox_mode);
-       gtk_container_add (GTK_CONTAINER (frame_mode), vbox_mode);
-       gtk_container_set_border_width (GTK_CONTAINER (vbox_mode), 8);
-
-       gnupg_mime_radiobtn = gtk_radio_button_new_with_label
-               (NULL, _("Use PGP/MIME"));
-       gtk_widget_show (gnupg_mime_radiobtn);
-       gtk_box_pack_start (GTK_BOX (vbox_mode), gnupg_mime_radiobtn,
-                           FALSE, FALSE, 0);
-       gtk_object_set_user_data (GTK_OBJECT (gnupg_mime_radiobtn),
-                                 GINT_TO_POINTER (GNUPG_MODE_DETACH));
-
-       gnupg_inline_radiobtn = gtk_radio_button_new_with_label_from_widget
-               (GTK_RADIO_BUTTON (gnupg_mime_radiobtn),
-                _("Use Inline"));
-       gtk_widget_show (gnupg_inline_radiobtn);
-       gtk_box_pack_start (GTK_BOX (vbox_mode), gnupg_inline_radiobtn,
-                           FALSE, FALSE, 0);
-       gtk_object_set_user_data (GTK_OBJECT (gnupg_inline_radiobtn),
-                                 GINT_TO_POINTER (GNUPG_MODE_INLINE));
-       g_signal_connect (G_OBJECT (gnupg_inline_radiobtn), "clicked",
-                         prefs_account_gnupg_inline_warning, NULL);
-
-
-       PACK_FRAME (vbox1, frame1, _("Sign key"));
-
-       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), 8);
-
-       defaultkey_radiobtn = gtk_radio_button_new_with_label
-               (NULL, _("Use default GnuPG key"));
-       gtk_widget_show (defaultkey_radiobtn);
-       gtk_box_pack_start (GTK_BOX (vbox2), defaultkey_radiobtn,
-                           FALSE, FALSE, 0);
-       g_object_set_data (G_OBJECT (defaultkey_radiobtn),
-                          MENU_VAL_ID,
-                          GINT_TO_POINTER (SIGN_KEY_DEFAULT));
-
-       emailkey_radiobtn = gtk_radio_button_new_with_label_from_widget
-               (GTK_RADIO_BUTTON (defaultkey_radiobtn),
-                _("Select key by your email address"));
-       gtk_widget_show (emailkey_radiobtn);
-       gtk_box_pack_start (GTK_BOX (vbox2), emailkey_radiobtn,
-                           FALSE, FALSE, 0);
-       g_object_set_data (G_OBJECT (emailkey_radiobtn),
-                          MENU_VAL_ID,
-                          GINT_TO_POINTER (SIGN_KEY_BY_FROM));
-
-       customkey_radiobtn = gtk_radio_button_new_with_label_from_widget
-               (GTK_RADIO_BUTTON (defaultkey_radiobtn),
-                _("Specify key manually"));
-       gtk_widget_show (customkey_radiobtn);
-       gtk_box_pack_start (GTK_BOX (vbox2), customkey_radiobtn,
-                           FALSE, FALSE, 0);
-       g_object_set_data (G_OBJECT (customkey_radiobtn),
-                          MENU_VAL_ID,
-                          GINT_TO_POINTER (SIGN_KEY_CUSTOM));
-
-       hbox1 = gtk_hbox_new (FALSE, 8);
+       hbox1 = gtk_hbox_new(FALSE, 8);
        gtk_widget_show (hbox1);
-       gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
+       gtk_container_add (GTK_CONTAINER(vbox2), hbox1);
 
-       label = gtk_label_new ("");
-       gtk_widget_show (label);
+       label = gtk_label_new(_("Default privacy system"));
+       gtk_widget_show(label);
        gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
-       gtk_widget_set_size_request (label, 16, -1);
 
-       label = gtk_label_new (_("User or key ID:"));
-       gtk_widget_show (label);
-       gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
+       default_privacy_system = gtk_option_menu_new();
+       gtk_widget_show (default_privacy_system);
+       gtk_box_pack_start (GTK_BOX(hbox1), default_privacy_system, TRUE, TRUE, 0);
 
-       customkey_entry = gtk_entry_new ();
-       gtk_widget_show (customkey_entry);
-       gtk_box_pack_start (GTK_BOX (hbox1), customkey_entry,
-                           TRUE, TRUE, 0);
-
-       SET_TOGGLE_SENSITIVITY (customkey_radiobtn, customkey_entry);
+       PACK_CHECK_BUTTON (vbox2, default_encrypt_chkbtn,
+                          _("Encrypt message by default"));
+       PACK_CHECK_BUTTON (vbox2, default_sign_chkbtn,
+                          _("Sign message by default"));
+       PACK_CHECK_BUTTON (vbox2, save_clear_text_chkbtn,
+                          _("Save sent encrypted messages as clear text"));
 
+       privacy.default_privacy_system = default_privacy_system;
        privacy.default_encrypt_chkbtn = default_encrypt_chkbtn;
        privacy.default_sign_chkbtn    = default_sign_chkbtn;
-       privacy.gnupg_mime_radiobtn    = gnupg_mime_radiobtn;
-       privacy.gnupg_inline_radiobtn  = gnupg_inline_radiobtn;
-       privacy.defaultkey_radiobtn    = defaultkey_radiobtn;
-       privacy.emailkey_radiobtn      = emailkey_radiobtn;
-       privacy.customkey_radiobtn     = customkey_radiobtn;
-       privacy.customkey_entry        = customkey_entry;
+       privacy.save_clear_text_chkbtn = save_clear_text_chkbtn;
 }
-#endif /* USE_GPGME */
 
 #if USE_OPENSSL
 
@@ -1986,7 +1929,7 @@ static void prefs_account_crosspost_set_data_from_colormenu(PrefParam *pparam)
        menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(advanced.crosspost_colormenu));
        menuitem = gtk_menu_get_active(GTK_MENU(menu));
        *((gint *)pparam->data) = GPOINTER_TO_INT
-               (gtk_object_get_data(GTK_OBJECT(menuitem), "color"));
+               (g_object_get_data(G_OBJECT(menuitem), "color"));
 }
 
 static void prefs_account_crosspost_set_colormenu(PrefParam *pparam)
@@ -2249,17 +2192,19 @@ static gint prefs_account_apply(void)
                alertpanel_error(_("Mail address is not entered."));
                return -1;
        }
-       if ((protocol == A_POP3 || protocol == A_APOP || (protocol == A_LOCAL && !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(basic.mailcmd_chkbtn)))) &&
+       if (((protocol == A_POP3) || 
+            (protocol == A_LOCAL && !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(basic.mailcmd_chkbtn))) || 
+            (protocol == A_NONE)) &&
            *gtk_entry_get_text(GTK_ENTRY(basic.smtpserv_entry)) == '\0') {
                alertpanel_error(_("SMTP server is not entered."));
                return -1;
        }
-       if ((protocol == A_POP3 || protocol == A_APOP || protocol == A_IMAP4) &&
+       if ((protocol == A_POP3 || protocol == A_IMAP4) &&
            *gtk_entry_get_text(GTK_ENTRY(basic.uid_entry)) == '\0') {
                alertpanel_error(_("User ID is not entered."));
                return -1;
        }
-       if ((protocol == A_POP3 || protocol == A_APOP) &&
+       if (protocol == A_POP3 &&
            *gtk_entry_get_text(GTK_ENTRY(basic.recvserv_entry)) == '\0') {
                alertpanel_error(_("POP3 server is not entered."));
                return -1;
@@ -2361,18 +2306,6 @@ static void prefs_account_enum_set_radiobtn(PrefParam *pparam)
        }
 }
 
-#if USE_GPGME
-static void prefs_account_gnupg_inline_warning(GtkWidget *widget)
-{
-       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) &&
-           gtk_notebook_get_current_page(GTK_NOTEBOOK(dialog.notebook)) > 0)
-               alertpanel_warning
-                       (_("Its not recommended to use the old style Inline\n"
-                          "mode for GnuPG messages. It doesn't comply with\n"
-                          "RFC 3156 - MIME Security with OpenPGP."));
-}
-#endif /* USE_GPGME */
-
 static void prefs_account_protocol_set_data_from_optmenu(PrefParam *pparam)
 {
        GtkWidget *menu;
@@ -2390,42 +2323,19 @@ static void prefs_account_protocol_set_optmenu(PrefParam *pparam)
        GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
        GtkWidget *menu;
        GtkWidget *menuitem;
-       GList *children;
-       gint list_order[] = {
-               0,  /* A_POP3  */
-               1,  /* A_APOP  */
-               -1, /* A_RPOP  */
-               2,  /* A_IMAP4 */
-               3,  /* A_NNTP  */
-               4   /* A_LOCAL */
-       };
+       gint index;
 
        protocol = *((RecvProtocol *)pparam->data);
-       if (protocol < 0 || protocol > A_LOCAL) return;
-       if (list_order[protocol] < 0) return;
-       gtk_option_menu_set_history(optmenu, list_order[protocol]);
+       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));
 
-#define SET_NTH_SENSITIVE(proto) \
-{ \
-       menuitem = g_list_nth_data(children, list_order[proto]); \
-       if (menuitem) \
-               gtk_widget_set_sensitive(menuitem, TRUE); \
-}
-
-       children = GTK_MENU_SHELL(menu)->children;
-       SET_NTH_SENSITIVE(protocol);
-       if (protocol == A_POP3) {
-               SET_NTH_SENSITIVE(A_APOP);
-       } else if (protocol == A_APOP) {
-               SET_NTH_SENSITIVE(A_POP3);
-       }
-
-#undef SET_NTH_SENSITIVE
-
        menuitem = gtk_menu_get_active(GTK_MENU(menu));
+       gtk_widget_set_sensitive(menuitem, TRUE);
        gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
 }
 
@@ -2502,6 +2412,71 @@ static void prefs_account_smtp_auth_type_set_optmenu(PrefParam *pparam)
        gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
 }
 
+static void prefs_account_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 = g_strdup(g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
+}
+
+static void prefs_account_set_optmenu_from_string(PrefParam *pparam)
+{
+       GtkWidget *optionmenu;
+       GtkWidget *menu;
+       gboolean found = FALSE;
+       GList *children, *cur;
+       gchar *prefsid;
+       guint i = 0;
+
+       g_return_if_fail(*pparam->widget != NULL);
+
+       prefsid = *((gchar **) pparam->data);
+       if (prefsid == NULL)
+               return;
+
+       optionmenu = *pparam->widget;
+       menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(optionmenu));
+       children = gtk_container_children(GTK_CONTAINER(menu));
+       for (cur = children; cur != NULL; cur = g_list_next(cur)) {
+               GtkWidget *item = (GtkWidget *) cur->data;
+               gchar *id;
+
+               id = g_object_get_data(G_OBJECT(item), MENU_VAL_ID);
+               if (id != NULL && strcmp(id, prefsid) == 0) {
+                       found = TRUE;
+                       gtk_option_menu_set_history(GTK_OPTION_MENU(optionmenu), i);
+               }
+               i++;
+       }
+
+       if (!found) {
+               gchar *name;
+               GtkWidget *menuitem;
+
+               name = g_strdup_printf(_("Unsupported (%s)"), 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);
+               gtk_menu_append(GTK_MENU(menu), menuitem);
+               g_free(name);
+
+               gtk_option_menu_set_history(GTK_OPTION_MENU(optionmenu), i);
+       }
+
+       g_list_free(children);
+}
+
 static void prefs_account_protocol_activated(GtkMenuItem *menuitem)
 {
        RecvProtocol protocol;
@@ -2748,6 +2723,83 @@ static void prefs_account_protocol_activated(GtkMenuItem *menuitem)
                gtk_widget_show(advanced.imapdir_label);
                gtk_widget_show(advanced.imapdir_entry);
                break;
+       case A_NONE:
+               gtk_widget_hide(basic.nntpserv_label);
+               gtk_widget_hide(basic.nntpserv_entry);
+               gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
+                                          0, 0);
+               gtk_widget_set_sensitive(basic.nntpauth_chkbtn, FALSE);
+               gtk_widget_hide(basic.nntpauth_chkbtn);
+
+               gtk_widget_set_sensitive(basic.nntpauth_onconnect_chkbtn, FALSE);
+               gtk_widget_hide(basic.nntpauth_onconnect_chkbtn);
+
+               gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
+                                          1, 0);
+               gtk_widget_set_sensitive(basic.recvserv_label, FALSE);
+               gtk_widget_set_sensitive(basic.recvserv_entry, FALSE);
+               gtk_widget_hide(basic.recvserv_label);
+               gtk_widget_hide(basic.recvserv_entry);
+               gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
+                                          2, VSPACING_NARROW);
+               gtk_widget_show(basic.smtpserv_label);
+               gtk_widget_show(basic.smtpserv_entry);
+               gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
+                                          4, VSPACING_NARROW);
+               gtk_widget_hide(basic.localmbox_label);
+               gtk_widget_hide(basic.localmbox_entry);
+               gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
+                                          3, 0);
+               gtk_widget_hide(basic.mailcmd_label);
+               gtk_widget_hide(basic.mailcmd_entry);
+               gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
+                                          6, 0);
+               gtk_widget_hide(basic.mailcmd_chkbtn);
+               gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
+                                          5, 0);
+               gtk_widget_hide(basic.uid_label);
+               gtk_widget_hide(basic.pass_label);
+               gtk_widget_hide(basic.uid_entry);
+               gtk_widget_hide(basic.pass_entry);
+               gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
+                                          7, VSPACING_NARROW);
+
+               gtk_widget_set_sensitive(basic.uid_label,  FALSE);
+               gtk_widget_set_sensitive(basic.pass_label, FALSE);
+               gtk_widget_set_sensitive(basic.uid_entry,  FALSE);
+               gtk_widget_set_sensitive(basic.pass_entry, FALSE);
+               gtk_widget_set_sensitive(receive.pop3_frame, FALSE);
+               gtk_widget_hide(receive.pop3_frame);
+               gtk_widget_hide(receive.imap_frame);
+               gtk_widget_hide(receive.frame_maxarticle);
+               gtk_widget_set_sensitive(receive.recvatgetall_chkbtn, FALSE);
+
+               gtk_widget_set_sensitive(basic.smtpserv_entry, TRUE);
+               gtk_widget_set_sensitive(basic.smtpserv_label, TRUE);
+
+               /* update pop_before_smtp sensitivity */
+               gtk_widget_set_sensitive(p_send.pop_bfr_smtp_chkbtn, FALSE);
+               pop_bfr_smtp_tm_set_sens(NULL, NULL);
+               
+               gtk_toggle_button_set_active
+                       (GTK_TOGGLE_BUTTON(receive.recvatgetall_chkbtn), FALSE);
+
+#if USE_OPENSSL
+               gtk_widget_hide(ssl.pop_frame);
+               gtk_widget_hide(ssl.imap_frame);
+               gtk_widget_hide(ssl.nntp_frame);
+               gtk_widget_show(ssl.send_frame);
+#endif
+               gtk_widget_hide(advanced.popport_hbox);
+               gtk_widget_hide(advanced.imapport_hbox);
+               gtk_widget_hide(advanced.nntpport_hbox);
+               gtk_widget_hide(advanced.crosspost_chkbtn);
+               gtk_widget_hide(advanced.crosspost_colormenu);
+               gtk_widget_hide(advanced.tunnelcmd_chkbtn);
+               gtk_widget_hide(advanced.tunnelcmd_entry);
+               gtk_widget_hide(advanced.imapdir_label);
+               gtk_widget_hide(advanced.imapdir_entry);
+               break;
        case A_POP3:
        default:
                gtk_widget_hide(basic.nntpserv_label);