Fixed bugs:
[claws.git] / src / prefs_common.c
index 0f7b6ec2da4212c92cc8009e8938663cf19f12fa..1dbba1d58d44cb140b961897cb7e3e48b744e4a7 100644 (file)
@@ -105,6 +105,9 @@ static struct Compose {
        GtkWidget *text_fw_quotefmt;
 
        GtkWidget *checkbtn_autoextedit;
+       GtkWidget *spinbtn_undolevel;
+       GtkObject *spinbtn_undolevel_adj;
+       GtkWidget *checkbtn_reply_account_autosel;
        GtkWidget *checkbtn_forward_account_autosel;
        GtkWidget *checkbtn_reedit_account_autosel;
 
@@ -113,22 +116,24 @@ static struct Compose {
        GtkWidget *checkbtn_wrapquote;
        GtkWidget *checkbtn_wrapatsend;
 
-       GtkWidget *checkbtn_reply_account_autosel;
        GtkWidget *checkbtn_quote;
-       GtkWidget * checkbtn_forward_as_attachment;
-       GtkWidget * checkbtn_smart_wrapping;
-       GtkWidget * checkbtn_block_cursor;
+       GtkWidget *checkbtn_forward_as_attachment;
+       GtkWidget *checkbtn_smart_wrapping;
+       GtkWidget *checkbtn_block_cursor;
+       GtkWidget *checkbtn_reply_with_quote;
+} compose;
 
        /* spelling */
 #if USE_PSPELL
+static struct Spelling {
        GtkWidget *checkbtn_enable_pspell;
        GtkWidget *entry_pspell_path;
        GtkWidget *btn_pspell_path;
        GtkWidget *optmenu_dictionary;
+       GtkWidget *optmenu_sugmode;
+} spelling;
 #endif
 
-} compose;
-
 static struct Quote {
        GtkWidget *entry_quotemark;
        GtkWidget *text_quotefmt;
@@ -215,6 +220,7 @@ static struct MessageColorButtons {
        GtkWidget *quote_level3_btn;
        GtkWidget *uri_btn;
        GtkWidget *tgt_folder_btn;
+       GtkWidget *misspelled_btn;
 } color_buttons;
 
 static GtkWidget *quote_desc_win;
@@ -238,8 +244,10 @@ static void prefs_nextunreadmsgdialog_set_data_from_optmenu(PrefParam *pparam);
 static void prefs_nextunreadmsgdialog_set_optmenu(PrefParam *pparam);
 
 #if USE_PSPELL
-static void prefs_dictionary_set_data_from_optmenu(PrefParam *param);
-static void prefs_dictionary_set_optmenu(PrefParam *pparam);
+static void prefs_dictionary_set_data_from_optmenu     (PrefParam *param);
+static void prefs_dictionary_set_optmenu               (PrefParam *pparam);
+static void prefs_speller_sugmode_set_data_from_optmenu        (PrefParam *pparam);
+static void prefs_speller_sugmode_set_optmenu          (PrefParam *pparam);
 #endif
 
 
@@ -318,7 +326,11 @@ static PrefParam param[] = {
         &compose.checkbtn_autoextedit,
         prefs_set_data_from_toggle, prefs_set_toggle},
 
-       {"linewrap_length", "74", &prefs_common.linewrap_len, P_INT,
+       {"undo_level", "50", &prefs_common.undolevels, P_INT,
+        &compose.spinbtn_undolevel,
+        prefs_set_data_from_spinbtn, prefs_set_spinbtn},
+
+       {"linewrap_length", "72", &prefs_common.linewrap_len, P_INT,
         &compose.spinbtn_linewrap,
         prefs_set_data_from_spinbtn, prefs_set_spinbtn},
        {"linewrap_quotation", "FALSE", &prefs_common.linewrap_quote, P_BOOL,
@@ -339,22 +351,36 @@ static PrefParam param[] = {
         prefs_set_data_from_toggle, prefs_set_toggle},
 #if USE_PSPELL
        {"enable_pspell", "TRUE", &prefs_common.enable_pspell,
-        P_BOOL, &compose.checkbtn_enable_pspell,
+        P_BOOL, &spelling.checkbtn_enable_pspell,
         prefs_set_data_from_toggle, prefs_set_toggle},
        {"pspell_path", "/usr/local/share/pspell/", &prefs_common.pspell_path, 
-        P_STRING, &compose.entry_pspell_path, 
+        P_STRING, &spelling.entry_pspell_path, 
         prefs_set_data_from_entry, prefs_set_entry},
        {"dictionary",  "", &prefs_common.dictionary,
-        P_STRING, &compose.optmenu_dictionary, 
+        P_STRING, &spelling.optmenu_dictionary, 
         prefs_dictionary_set_data_from_optmenu, prefs_dictionary_set_optmenu },
+       {"pspell_sugmode",  "1", &prefs_common.pspell_sugmode,
+        P_INT, &spelling.optmenu_sugmode, 
+        prefs_speller_sugmode_set_data_from_optmenu, prefs_speller_sugmode_set_optmenu },
+       {"misspelled_color", "16711680", &prefs_common.misspelled_col, P_INT,
+        NULL, NULL, NULL},
 #endif
        {"reply_with_quote", "TRUE", &prefs_common.reply_with_quote, P_BOOL,
-        &compose.checkbtn_quote,
-        prefs_set_data_from_toggle, prefs_set_toggle},
+        &compose.checkbtn_reply_with_quote, prefs_set_data_from_toggle, prefs_set_toggle},
+
+       /* Account autoselection */
        {"reply_account_autoselect", "TRUE",
         &prefs_common.reply_account_autosel, P_BOOL,
         &compose.checkbtn_reply_account_autosel,
         prefs_set_data_from_toggle, prefs_set_toggle},
+       {"forward_account_autoselect", "TRUE",
+        &prefs_common.forward_account_autosel, P_BOOL,
+        &compose.checkbtn_forward_account_autosel,
+        prefs_set_data_from_toggle, prefs_set_toggle},
+       {"reedit_account_autoselect", "TRUE",
+        &prefs_common.reedit_account_autosel, P_BOOL,
+        &compose.checkbtn_reedit_account_autosel,
+        prefs_set_data_from_toggle, prefs_set_toggle},
 
        {"show_ruler", "TRUE", &prefs_common.show_ruler, P_BOOL,
         NULL, NULL, NULL},
@@ -366,13 +392,13 @@ static PrefParam param[] = {
         &prefs_common.quotefmt, P_STRING, &quote.text_quotefmt,
         prefs_set_data_from_text, prefs_set_text},
 
-       {"fw_quote_mark", "> ", &prefs_common.fw_quotemark, P_STRING,
+       {"forward_quote_mark", "> ", &prefs_common.fw_quotemark, P_STRING,
         &quote.entry_fw_quotemark,
         prefs_set_data_from_entry, prefs_set_entry},
-       {"fw_quote_format",
+       {"forward_quote_format",
         "\\n\\nBegin forwarded message:\\n\\n"
-        "?d(Date: %d\\n)?f(From: %f\\n)?t(To: %t\\n)?c(Cc: %c\\n)"
-        "?n(Newsgroups: %n\\n)?s(Subject: %s\\n)\\n\\n%M",
+        "?d{Date: %d\\n}?f{From: %f\\n}?t{To: %t\\n}?c{Cc: %c\\n}"
+        "?n{Newsgroups: %n\\n}?s{Subject: %s\\n}\\n\\n%M",
         &prefs_common.fw_quotefmt, P_STRING, &quote.text_fw_quotefmt,
         prefs_set_data_from_text, prefs_set_text},
 
@@ -452,6 +478,8 @@ static PrefParam param[] = {
         &prefs_common.summary_col_visible[S_COL_NUMBER], P_BOOL, NULL, NULL, NULL},
        {"summary_col_show_score", "FALSE",
         &prefs_common.summary_col_visible[S_COL_SCORE], P_BOOL, NULL, NULL, NULL},
+       {"summary_col_show_locked", "FALSE",
+        &prefs_common.summary_col_visible[S_COL_LOCKED], P_BOOL, NULL, NULL, NULL},
 
        {"summary_col_pos_mark", "0",
          &prefs_common.summary_col_pos[S_COL_MARK], P_INT, NULL, NULL, NULL},
@@ -471,6 +499,8 @@ static PrefParam param[] = {
          &prefs_common.summary_col_pos[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
        {"summary_col_pos_score", "8",
         &prefs_common.summary_col_pos[S_COL_SCORE], P_INT, NULL, NULL, NULL},
+       {"summary_col_pos_locked", "9",
+        &prefs_common.summary_col_pos[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
 
        {"summary_col_size_mark", "10",
         &prefs_common.summary_col_size[S_COL_MARK], P_INT, NULL, NULL, NULL},
@@ -490,6 +520,8 @@ static PrefParam param[] = {
         &prefs_common.summary_col_size[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
        {"summary_col_size_score", "40",
         &prefs_common.summary_col_size[S_COL_SCORE], P_INT, NULL, NULL, NULL},
+       {"summary_col_size_locked", "13",
+        &prefs_common.summary_col_size[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
 
        /* Widget size */
        {"folderview_width", "179", &prefs_common.folderview_width, P_INT,
@@ -695,6 +727,7 @@ static void prefs_common_create             (void);
 static void prefs_receive_create       (void);
 static void prefs_send_create          (void);
 static void prefs_compose_create       (void);
+static void prefs_spelling_create      (void);
 static void prefs_quote_create         (void);
 static void prefs_display_create       (void);
 static void prefs_message_create       (void);
@@ -876,6 +909,10 @@ static void prefs_common_create(void)
        SET_NOTEBOOK_LABEL(dialog.notebook, _("Send"),      page++);
        prefs_compose_create();
        SET_NOTEBOOK_LABEL(dialog.notebook, _("Compose"),   page++);
+#if USE_PSPELL
+       prefs_spelling_create();
+       SET_NOTEBOOK_LABEL(dialog.notebook, _("Spell Checker"),   page++);
+#endif 
        prefs_quote_create();
        SET_NOTEBOOK_LABEL(dialog.notebook, _("Quote"),   page++);
        prefs_display_create();
@@ -1192,6 +1229,8 @@ static void prefs_send_create(void)
        SET_MENUITEM(_("Chinese (ISO-2022-CN)"),         CS_ISO_2022_CN);
 #endif /* 0 */
        SET_MENUITEM(_("Korean (EUC-KR)"),               CS_EUC_KR);
+       SET_MENUITEM(_("Thai (TIS-620)"),                CS_TIS_620);
+       SET_MENUITEM(_("Thai (Windows-874)"),            CS_WINDOWS_874);
 
        gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu), optmenu_menu);
 
@@ -1267,19 +1306,50 @@ static void prefs_dictionary_set_optmenu(PrefParam *pparam)
        prefs_dictionary_set_data_from_optmenu(pparam);
 }
 
-static void prefs_compose_checkbtn_enable_pspell_toggle_cb
+static void prefs_speller_sugmode_set_data_from_optmenu(PrefParam *param)
+{
+       gint sugmode;
+       g_return_if_fail(param);
+       g_return_if_fail(param->data);
+       g_return_if_fail(param->widget);
+       g_return_if_fail(*(param->widget));
+
+       sugmode = gtkpspell_get_sugmode_from_option_menu
+               (GTK_OPTION_MENU(*(param->widget)));
+       *((gint *) param->data) = sugmode;
+}
+
+static void prefs_speller_sugmode_set_optmenu(PrefParam *pparam)
+{
+       GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
+       GtkWidget *menu;
+       GtkWidget *menuitem;
+       gint sugmode;
+
+       g_return_if_fail(optmenu != NULL);
+       g_return_if_fail(pparam->data != NULL);
+
+       sugmode = *(gint *) pparam->data;
+       gtkpspell_sugmode_option_menu_set(optmenu, sugmode);
+}
+       
+       
+static void prefs_spelling_checkbtn_enable_pspell_toggle_cb
        (GtkWidget *widget,
         gpointer data)
 {
        gboolean toggled;
 
        toggled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-       gtk_widget_set_sensitive(compose.entry_pspell_path, toggled);
-       gtk_widget_set_sensitive(compose.optmenu_dictionary, toggled);
-       gtk_widget_set_sensitive(compose.btn_pspell_path, toggled);
+
+       gtk_widget_set_sensitive(spelling.entry_pspell_path,   toggled);
+       gtk_widget_set_sensitive(spelling.optmenu_dictionary,  toggled);
+       gtk_widget_set_sensitive(spelling.optmenu_sugmode,     toggled);
+       gtk_widget_set_sensitive(spelling.btn_pspell_path,     toggled);
+       gtk_widget_set_sensitive(color_buttons.misspelled_btn, toggled);
 }
 
-static void prefs_compose_btn_pspell_path_clicked_cb(GtkWidget *widget,
+static void prefs_spelling_btn_pspell_path_clicked_cb(GtkWidget *widget,
                                                     gpointer data)
 {
        gchar *file_path, *tmp;
@@ -1298,22 +1368,156 @@ static void prefs_compose_btn_pspell_path_clicked_cb(GtkWidget *widget,
                prefs_common.pspell_path = g_strdup_printf("%s%s",tmp,G_DIR_SEPARATOR_S);
 
                new_menu = gtkpspell_dictionary_option_menu_new(prefs_common.pspell_path);
-               gtk_option_menu_set_menu(GTK_OPTION_MENU(compose.optmenu_dictionary),
+               gtk_option_menu_set_menu(GTK_OPTION_MENU(spelling.optmenu_dictionary),
                                         new_menu);
 
-               gtk_entry_set_text(GTK_ENTRY(compose.entry_pspell_path), prefs_common.pspell_path);                                      
+               gtk_entry_set_text(GTK_ENTRY(spelling.entry_pspell_path), prefs_common.pspell_path);                                     
                /* select first one */
-               gtk_option_menu_set_history(GTK_OPTION_MENU(compose.optmenu_dictionary), 0);
+               gtk_option_menu_set_history(GTK_OPTION_MENU(spelling.optmenu_dictionary), 0);
                
                prefs_common.dictionary = gtkpspell_get_dictionary_menu_active_item(
-                               gtk_option_menu_get_menu(GTK_OPTION_MENU(compose.optmenu_dictionary)));
+                               gtk_option_menu_get_menu(GTK_OPTION_MENU(spelling.optmenu_dictionary)));
                g_free(tmp);
        
 
        }
 }
+
+static void prefs_spelling_create()
+{
+       GtkWidget *vbox1;
+       GtkWidget *frame_spell;
+       GtkWidget *hbox_spell;
+       GtkWidget *vbox_spell;
+       GtkWidget *hbox_pspell_path;
+       GtkWidget *checkbtn_enable_pspell;
+       GtkWidget *label_pspell_path;
+       GtkWidget *entry_pspell_path;
+       GtkWidget *btn_pspell_path;
+       GtkWidget *spell_table;
+       GtkWidget *label_dictionary;
+       GtkWidget *optmenu_dictionary;
+       GtkWidget *sugmode_label;
+       GtkWidget *sugmode_optmenu;
+       GtkWidget *color_label;
+       GtkWidget *hbox_col;
+       GtkWidget *col_align;
+
+
+       vbox1 = gtk_vbox_new (FALSE, VSPACING);
+       gtk_widget_show (vbox1);
+       gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
+       gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
+
+       /* spell checker defaults */                       
+       PACK_FRAME(vbox1, frame_spell, _("Global spelling checker settings"));
+       vbox_spell = gtk_vbox_new(FALSE, VSPACING_NARROW);
+       gtk_widget_show (vbox_spell);
+       gtk_container_add(GTK_CONTAINER(frame_spell), vbox_spell);
+       gtk_container_set_border_width(GTK_CONTAINER(vbox_spell), 8);
+
+       PACK_CHECK_BUTTON(vbox_spell, checkbtn_enable_pspell, 
+                         _("Enable spell checker (EXPERIMENTAL)"));
+
+       gtk_signal_connect(GTK_OBJECT(checkbtn_enable_pspell), "toggled",
+                          GTK_SIGNAL_FUNC(prefs_spelling_checkbtn_enable_pspell_toggle_cb),
+                          NULL);
+
+       spell_table = gtk_table_new(4, 3, FALSE);
+       gtk_container_set_border_width (GTK_CONTAINER (spell_table), 0);
+       gtk_table_set_row_spacings(GTK_TABLE(spell_table), 8);
+       gtk_table_set_col_spacings(GTK_TABLE(spell_table), 8);
+
+       gtk_box_pack_start(GTK_BOX(vbox_spell), spell_table, TRUE, TRUE, 0);
+
+       
+       label_pspell_path = gtk_label_new (_("Dictionaries path:"));
+       gtk_misc_set_alignment(GTK_MISC(label_pspell_path), 1.0, 0.5);
+       gtk_widget_show(label_pspell_path);
+       gtk_table_attach (GTK_TABLE (spell_table), label_pspell_path, 0, 1, 0, 1,
+                         GTK_FILL, (GTK_EXPAND | GTK_FILL), 0, 0);
+       
+       hbox_pspell_path = gtk_hbox_new (FALSE, 8);
+       gtk_table_attach (GTK_TABLE (spell_table), hbox_pspell_path, 1, 2, 0, 1,
+                         GTK_FILL, (GTK_EXPAND | GTK_FILL), 0, 0);
+       gtk_widget_show(hbox_pspell_path);
+
+       entry_pspell_path = gtk_entry_new();
+       gtk_widget_show(entry_pspell_path);
+       gtk_box_pack_start(GTK_BOX(hbox_pspell_path), entry_pspell_path, TRUE, TRUE, 0);        
+       
+       gtk_widget_set_sensitive(entry_pspell_path, prefs_common.enable_pspell);
+
+       btn_pspell_path = gtk_button_new_with_label(" ... ");
+       gtk_widget_show(btn_pspell_path);
+       gtk_box_pack_start(GTK_BOX(hbox_pspell_path), btn_pspell_path, FALSE, FALSE, 0);
+       gtk_widget_set_sensitive(btn_pspell_path, prefs_common.enable_pspell);
+
+       gtk_signal_connect(GTK_OBJECT(btn_pspell_path), "clicked", 
+                          GTK_SIGNAL_FUNC(prefs_spelling_btn_pspell_path_clicked_cb),
+                          NULL);
+
+       label_dictionary = gtk_label_new(_("Default dictionary:"));
+       gtk_misc_set_alignment(GTK_MISC(label_dictionary), 1.0, 0.5);
+       gtk_widget_show(label_dictionary);
+       gtk_table_attach (GTK_TABLE (spell_table), label_dictionary, 0, 1, 1, 2,
+                         GTK_FILL, (GTK_EXPAND | GTK_FILL), 0, 0);
+
+       optmenu_dictionary = gtk_option_menu_new();
+       gtk_widget_show(optmenu_dictionary);
+       gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu_dictionary), 
+                                gtkpspell_dictionary_option_menu_new(prefs_common.pspell_path));
+       gtk_table_attach (GTK_TABLE (spell_table), optmenu_dictionary, 1, 2, 1, 2,
+                         GTK_FILL, (GTK_EXPAND | GTK_FILL), 0, 0);
+       gtk_widget_set_sensitive(optmenu_dictionary, prefs_common.enable_pspell);
+
+       /* Suggestion mode */
+       sugmode_label = gtk_label_new(_("Default suggestion mode"));
+       gtk_misc_set_alignment(GTK_MISC(sugmode_label), 1.0, 0.5);
+       gtk_widget_show(sugmode_label);
+       gtk_table_attach(GTK_TABLE (spell_table), sugmode_label, 0, 1, 2, 3,
+                        GTK_FILL, (GTK_EXPAND | GTK_FILL), 0, 0);
+
+       sugmode_optmenu = gtk_option_menu_new();
+       gtk_widget_show(sugmode_optmenu);
+       gtk_option_menu_set_menu(GTK_OPTION_MENU(sugmode_optmenu),
+                           gtkpspell_sugmode_option_menu_new(prefs_common.pspell_sugmode));
+       gtk_table_attach(GTK_TABLE(spell_table), sugmode_optmenu, 1, 2, 2, 3,
+                        GTK_FILL, (GTK_EXPAND | GTK_FILL), 0, 0);
+       gtk_widget_set_sensitive(sugmode_optmenu, prefs_common.enable_pspell);
+
+       /* Color */
+       color_label = gtk_label_new(_("Misspelled word color:"));
+       gtk_misc_set_alignment(GTK_MISC(color_label), 1.0, 0.5);
+       gtk_table_attach (GTK_TABLE (spell_table), color_label, 0, 1, 3, 4,
+                         GTK_FILL, GTK_SHRINK, 0, 0);
+       gtk_widget_show(color_label);
+       
+       col_align = gtk_alignment_new(0.0, 0.5, 0, 0);
+       gtk_widget_show(col_align);
+       gtk_table_attach (GTK_TABLE (spell_table), col_align, 1, 2, 3, 4,
+                         GTK_FILL, GTK_SHRINK, 0, 0);
+
+       color_buttons.misspelled_btn = gtk_button_new_with_label ("");
+       set_button_bg_color(color_buttons.misspelled_btn,
+                           prefs_common.misspelled_col);
+       gtk_widget_set_usize (color_buttons.misspelled_btn, 30, 20);
+       gtk_widget_set_sensitive(color_buttons.misspelled_btn, prefs_common.enable_pspell);
+       gtk_signal_connect (GTK_OBJECT (color_buttons.misspelled_btn), "clicked",
+                           GTK_SIGNAL_FUNC(quote_color_set_dialog), "Misspelled word");
+       gtk_container_add(GTK_CONTAINER(col_align), color_buttons.misspelled_btn);
+
+
+       spelling.checkbtn_enable_pspell = checkbtn_enable_pspell;
+       spelling.entry_pspell_path      = entry_pspell_path;
+       spelling.btn_pspell_path        = btn_pspell_path;
+       spelling.optmenu_dictionary     = optmenu_dictionary;
+       spelling.optmenu_sugmode        = sugmode_optmenu;
+}
+
 #endif
 
+
 static void prefs_compose_create(void)
 {
        GtkWidget *vbox1;
@@ -1330,16 +1534,22 @@ static void prefs_compose_create(void)
        GtkWidget *entry_sigsep;
 
        GtkWidget *frame_editor;
+       GtkWidget *hbox_editor;
+       GtkWidget *checkbtn_autoextedit;
+
        GtkWidget *frame_autosel;
         GtkWidget *hbox_autosel;
         GtkWidget *vbox_autosel;
+       GtkWidget *checkbtn_reply_account_autosel;
        GtkWidget *checkbtn_forward_account_autosel;
        GtkWidget *checkbtn_reedit_account_autosel;
 
-       GtkWidget *hbox_editor;
-       GtkWidget *checkbtn_autoextedit;
+       GtkWidget *hbox_undolevel;
+       GtkWidget *label_undolevel;
+       GtkObject *spinbtn_undolevel_adj;
+       GtkWidget *spinbtn_undolevel;
 
-        GtkWidget *vbox_linewrap;
+       GtkWidget *vbox_linewrap;
 
        GtkWidget *hbox3;
        GtkWidget *hbox4;
@@ -1351,25 +1561,11 @@ static void prefs_compose_create(void)
        GtkWidget *checkbtn_wrapatsend;
 
        GtkWidget *frame_reply;
-       GtkWidget *checkbtn_reply_account_autosel;
        GtkWidget *checkbtn_quote;
        GtkWidget *checkbtn_forward_as_attachment;
        GtkWidget *checkbtn_smart_wrapping;
        GtkWidget *checkbtn_block_cursor;
 
-#if USE_PSPELL
-       GtkWidget *frame_spell;
-       GtkWidget *hbox_spell;
-       GtkWidget *vbox_spell;
-       GtkWidget *hbox_pspell_path;
-       GtkWidget *checkbtn_enable_pspell;
-       GtkWidget *label_pspell_path;
-       GtkWidget *entry_pspell_path;
-       GtkWidget *btn_pspell_path;
-       GtkWidget *hbox_dictionary;
-       GtkWidget *label_dictionary;
-       GtkWidget *optmenu_dictionary;
-#endif
        vbox1 = gtk_vbox_new (FALSE, VSPACING);
        gtk_widget_show (vbox1);
        gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
@@ -1412,7 +1608,7 @@ static void prefs_compose_create(void)
 
        gtk_widget_set_usize (entry_sigsep, 64, -1);
 
-        /* Automatic (Smart) Account Selection */
+        /* Account autoselection */
        PACK_FRAME(vbox1, frame_autosel, _("Automatic Account Selection"));
 
        hbox_autosel = gtk_hbox_new (FALSE, VSPACING_NARROW);
@@ -1481,59 +1677,23 @@ static void prefs_compose_create(void)
        PACK_CHECK_BUTTON (vbox1, checkbtn_block_cursor,
                          _("Block cursor"));
 
-#if USE_PSPELL
-       /* spell checker defaults */                       
-       PACK_FRAME(vbox1, frame_spell, _("Global spelling checker settings"));
-       vbox_spell = gtk_vbox_new(FALSE, VSPACING_NARROW);
-       gtk_widget_show (vbox_spell);
-       gtk_container_add(GTK_CONTAINER(frame_spell), vbox_spell);
-       gtk_container_set_border_width(GTK_CONTAINER(vbox_spell), 8);
-
-       PACK_CHECK_BUTTON(vbox_spell, checkbtn_enable_pspell, 
-                         _("Enable spell checker (EXPERIMENTAL)"));
-
-       gtk_signal_connect(GTK_OBJECT(checkbtn_enable_pspell), "toggled",
-                          GTK_SIGNAL_FUNC(prefs_compose_checkbtn_enable_pspell_toggle_cb),
-                          NULL);
-
-       hbox_pspell_path = gtk_hbox_new (FALSE, 8);
-       gtk_widget_show(hbox_pspell_path);
-       gtk_box_pack_start(GTK_BOX(vbox_spell), hbox_pspell_path, TRUE, TRUE, 0);
-
-       label_pspell_path = gtk_label_new (_("Dictionaries path"));
-       gtk_widget_show(label_pspell_path);
-       gtk_box_pack_start(GTK_BOX(hbox_pspell_path), label_pspell_path, FALSE, FALSE, 0);
-       
-       entry_pspell_path = gtk_entry_new();
-       gtk_widget_show(entry_pspell_path);
-       gtk_box_pack_start(GTK_BOX(hbox_pspell_path), entry_pspell_path, FALSE, FALSE, 0);
-       gtk_widget_set_usize(entry_pspell_path, 150, -1);
-       gtk_widget_set_sensitive(entry_pspell_path, prefs_common.enable_pspell);
-
-       btn_pspell_path = gtk_button_new_with_label(_("..."));
-       gtk_widget_show(btn_pspell_path);
-       gtk_box_pack_start(GTK_BOX(hbox_pspell_path), btn_pspell_path, FALSE, FALSE, 0);
-       gtk_widget_set_sensitive(btn_pspell_path, prefs_common.enable_pspell);
-
-       gtk_signal_connect(GTK_OBJECT(btn_pspell_path), "clicked", 
-                          GTK_SIGNAL_FUNC(prefs_compose_btn_pspell_path_clicked_cb),
-                          NULL);
+       PACK_VSPACER (vbox2, vbox3, VSPACING_NARROW_2);
 
-       hbox_dictionary = gtk_hbox_new(FALSE, 8);
-       gtk_widget_show(hbox_dictionary);
-       gtk_box_pack_start(GTK_BOX(vbox_spell), hbox_dictionary, TRUE, TRUE, 0);
+       hbox_undolevel = gtk_hbox_new (FALSE, 8);
+       gtk_widget_show (hbox3);
+       gtk_box_pack_start (GTK_BOX (vbox1), hbox_undolevel, FALSE, FALSE, 0);
 
-       label_dictionary = gtk_label_new(_("Dictionary"));
-       gtk_widget_show(label_dictionary);
-       gtk_box_pack_start(GTK_BOX(hbox_dictionary), label_dictionary, FALSE, FALSE, 0);
+       label_undolevel = gtk_label_new (_("Undo level"));
+       gtk_widget_show (label_undolevel);
+       gtk_box_pack_start (GTK_BOX (hbox_undolevel), label_undolevel, FALSE, FALSE, 0);
 
-       optmenu_dictionary = gtk_option_menu_new();
-       gtk_widget_show(optmenu_dictionary);
-       gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu_dictionary), 
-                                gtkpspell_dictionary_option_menu_new(prefs_common.pspell_path));
-       gtk_box_pack_start(GTK_BOX(hbox_dictionary), optmenu_dictionary, FALSE, FALSE, 0);
-       gtk_widget_set_sensitive(optmenu_dictionary, prefs_common.enable_pspell);
-#endif
+       spinbtn_undolevel_adj = gtk_adjustment_new (50, 0, 100, 1, 10, 10);
+       spinbtn_undolevel = gtk_spin_button_new
+               (GTK_ADJUSTMENT (spinbtn_undolevel_adj), 1, 0);
+       gtk_widget_show (spinbtn_undolevel);
+       gtk_box_pack_start (GTK_BOX (hbox_undolevel), spinbtn_undolevel, FALSE, FALSE, 0);
+       gtk_widget_set_usize (spinbtn_undolevel, 64, -1);
+       gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_undolevel), TRUE);
 
        /*
        compose.checkbtn_quote   = checkbtn_quote;
@@ -1544,9 +1704,13 @@ static void prefs_compose_create(void)
        compose.entry_sigsep     = entry_sigsep;
 
        compose.checkbtn_autoextedit = checkbtn_autoextedit;
-        compose.checkbtn_reply_account_autosel = checkbtn_reply_account_autosel;
+
+        compose.checkbtn_reply_account_autosel   = checkbtn_reply_account_autosel;
        compose.checkbtn_forward_account_autosel = checkbtn_forward_account_autosel;
-       compose.checkbtn_reedit_account_autosel = checkbtn_reedit_account_autosel;
+       compose.checkbtn_reedit_account_autosel  = checkbtn_reedit_account_autosel;
+
+       compose.spinbtn_undolevel     = spinbtn_undolevel;
+       compose.spinbtn_undolevel_adj = spinbtn_undolevel_adj;
 
        compose.spinbtn_linewrap     = spinbtn_linewrap;
        compose.spinbtn_linewrap_adj = spinbtn_linewrap_adj;
@@ -1560,12 +1724,6 @@ static void prefs_compose_create(void)
        compose.checkbtn_block_cursor   =
                checkbtn_block_cursor;
 
-#if USE_PSPELL
-       compose.checkbtn_enable_pspell = checkbtn_enable_pspell;
-       compose.entry_pspell_path      = entry_pspell_path;
-       compose.btn_pspell_path        = btn_pspell_path;
-       compose.optmenu_dictionary     = optmenu_dictionary;
-#endif
 }
 
 static void prefs_quote_create(void)
@@ -1585,6 +1743,8 @@ static void prefs_quote_create(void)
 
        GtkWidget *btn_quotedesc;
 
+       GtkWidget *checkbtn_reply_with_quote;
+
        vbox1 = gtk_vbox_new (FALSE, VSPACING);
        gtk_widget_show (vbox1);
        gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
@@ -1592,6 +1752,8 @@ static void prefs_quote_create(void)
 
        /* reply */
 
+       PACK_CHECK_BUTTON (vbox1, checkbtn_reply_with_quote, _("Reply will quote by default"));
+
        PACK_FRAME (vbox1, frame_quote, _("Reply format"));
 
        vbox_quote = gtk_vbox_new (FALSE, VSPACING_NARROW);
@@ -1681,6 +1843,7 @@ static void prefs_quote_create(void)
        gtk_signal_connect(GTK_OBJECT(btn_quotedesc), "clicked",
                           GTK_SIGNAL_FUNC(prefs_quote_description), NULL);
 
+       compose.checkbtn_reply_with_quote= checkbtn_reply_with_quote;
        quote.entry_quotemark    = entry_quotemark;
        quote.text_quotefmt      = text_quotefmt;
        quote.entry_fw_quotemark = entry_fw_quotemark;
@@ -1738,7 +1901,7 @@ static void prefs_display_create(void)
        gtk_table_attach (GTK_TABLE (table1), entry_textfont, 1, 2, 0, 1,
                          (GTK_EXPAND | GTK_FILL), 0, 0, 0);
 
-       button_textfont = gtk_button_new_with_label ("... ");
+       button_textfont = gtk_button_new_with_label (" ... ");
 
        gtk_widget_show (button_textfont);
        gtk_table_attach (GTK_TABLE (table1), button_textfont, 2, 3, 0, 1,
@@ -1851,7 +2014,7 @@ static void prefs_display_create(void)
        gtk_widget_show (entry_datefmt);
        gtk_box_pack_start (GTK_BOX (hbox1), entry_datefmt, TRUE, TRUE, 0);
 
-       button_datefmt = gtk_button_new_with_label ("... ");
+       button_datefmt = gtk_button_new_with_label (" ... ");
 
        gtk_widget_show (button_datefmt);
        gtk_box_pack_start (GTK_BOX (hbox1), button_datefmt, FALSE, FALSE, 0);
@@ -2656,8 +2819,7 @@ static GtkWidget *date_format_create(GtkButton *button, void *data)
        datefmt_clist = gtk_clist_new_with_titles(2, titles);
        gtk_widget_show(datefmt_clist);
        gtk_container_add(GTK_CONTAINER(scrolledwindow1), datefmt_clist);
-/*     gtk_clist_set_column_width(GTK_CLIST(datefmt_clist), 0, 80);   */
-
+       /* gtk_clist_set_column_width(GTK_CLIST(datefmt_clist), 0, 80); */
        gtk_clist_set_selection_mode(GTK_CLIST(datefmt_clist),
                                     GTK_SELECTION_BROWSE);
 
@@ -2775,7 +2937,6 @@ static void prefs_quote_colors_dialog_create(void)
        GtkWidget *tgt_folder_label;
        GtkWidget *hbbox;
        GtkWidget *ok_btn;
-       //GtkWidget *cancel_btn;
        GtkWidget *recycle_colors_btn;
        GtkWidget *frame_colors;
 
@@ -2941,6 +3102,11 @@ static void quote_color_set_dialog(GtkWidget *widget, gpointer data)
        } else if(g_strcasecmp(type, "TGTFLD") == 0) {
                title = _("Pick color for target folder");
                rgbvalue = prefs_common.tgt_folder_col;
+#if USE_PSPELL         
+       } else if(g_strcasecmp(type, "Misspelled word") == 0) {
+               title = _("Pick color for misspelled word");
+               rgbvalue = prefs_common.misspelled_col;
+#endif         
        } else {   /* Should never be called */
                g_warning("Unrecognized datatype '%s' in quote_color_set_dialog\n", type);
                return;
@@ -3008,6 +3174,11 @@ static void quote_colors_set_dialog_ok(GtkWidget *widget, gpointer data)
                prefs_common.tgt_folder_col = rgbvalue;
                set_button_bg_color(color_buttons.tgt_folder_btn, rgbvalue);
                folderview_set_target_folder_color(prefs_common.tgt_folder_col);
+#if USE_PSPELL         
+       } else if (g_strcasecmp(type, "Misspelled word") == 0) {
+               prefs_common.misspelled_col = rgbvalue;
+               set_button_bg_color(color_buttons.misspelled_btn, rgbvalue);
+#endif         
        } else
                fprintf( stderr, "Unrecognized datatype '%s' in quote_color_set_dialog_ok\n", type );
 
@@ -3073,8 +3244,9 @@ static void prefs_quote_description_create(void)
 {
        GtkWidget *vbox;
        GtkWidget *hbox;
-       GtkWidget *hbbox;
+       GtkWidget *vbox2;
        GtkWidget *label;
+       GtkWidget *hbbox;
        GtkWidget *ok_btn;
 
        quote_desc_win = gtk_window_new(GTK_WINDOW_DIALOG);
@@ -3083,17 +3255,24 @@ static void prefs_quote_description_create(void)
        gtk_container_set_border_width(GTK_CONTAINER(quote_desc_win), 8);
        gtk_window_set_position(GTK_WINDOW(quote_desc_win), GTK_WIN_POS_CENTER);
        gtk_window_set_modal(GTK_WINDOW(quote_desc_win), TRUE);
-       gtk_window_set_policy(GTK_WINDOW(quote_desc_win), FALSE, TRUE, FALSE);
+       gtk_window_set_policy(GTK_WINDOW(quote_desc_win), FALSE, FALSE, FALSE);
 
        vbox = gtk_vbox_new(FALSE, 8);
        gtk_container_add(GTK_CONTAINER(quote_desc_win), vbox);
 
-       hbox = gtk_hbox_new(FALSE, 4);
+       hbox = gtk_hbox_new(FALSE, 8);
        gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
 
+       vbox2 = gtk_vbox_new(FALSE, 8);
+       gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 0);
+
+#define PACK_LABEL() \
+       gtk_box_pack_start(GTK_BOX(vbox2), label, TRUE, TRUE, 0); \
+       gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); \
+       gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+
        label = gtk_label_new
-               ("SYMBOL\n\n"
-                 "%d\n"                /* date */
+               ("%d\n"         /* date */
                 "%f\n"         /* from */
                 "%N\n"         /* full name of sender */
                 "%F\n"         /* first name of sender */
@@ -3102,24 +3281,34 @@ static void prefs_quote_description_create(void)
                 "%t\n"         /* to */
                 "%c\n"         /* cc */
                 "%n\n"         /* newsgroups */
-                "%i\n"         /* message id */
                 "%r\n"         /* references */
-                "\n"
-                "%x\n"
-                "?x(expr)\n"   /* condition */
-                "\n"
-                "%M\n"         /* message body */
+                "%i");         /* message id */
+       PACK_LABEL();
+
+       label = gtk_label_new
+               ("?x{expr}");   /* condition */
+       PACK_LABEL();
+
+       label = gtk_label_new
+               ("%M\n"         /* message body */
                 "%Q\n"         /* quoted message body */
                 "%m\n"         /* message body without signature */
                 "%q\n"         /* quoted message body without signature */
                 "%%");         /* literal percent */
+       PACK_LABEL();
 
-       gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
-       gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
+       label = gtk_label_new
+               ("\\\\\n"       /* literal backslash */
+                "\\?\n"        /* literal question mark */
+                "\\{\n"        /* literal opening curly brace */
+                "\\}");        /* literal closing curly brace */
+       PACK_LABEL();
+
+       vbox2 = gtk_vbox_new(FALSE, 8);
+       gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 0);
 
        label = gtk_label_new
-               (_("DESCRIPTION\n\n"
-                   "Date\n"
+               (_("Date\n"
                   "From\n"
                   "Full Name of Sender\n"
                   "First Name of Sender\n"
@@ -3128,20 +3317,30 @@ static void prefs_quote_description_create(void)
                   "To\n"
                   "Cc\n"
                   "Newsgroups\n"
-                  "Message-ID\n"
                   "References\n"
-                  "\n"
-                  "Display the information\n"
-                  "If the information x is set, displays expr\n"
-                  "\n"
-                  "Message body\n"
+                  "Message-ID"));
+       PACK_LABEL();
+
+       label = gtk_label_new
+               (_("If x is set, displays expr"));
+       PACK_LABEL();
+
+       label = gtk_label_new
+               (_("Message body\n"
                   "Quoted message body\n"
                   "Message body without signature\n"
                   "Quoted message body without signature\n"
                   "Literal %"));
+       PACK_LABEL();
+
+       label = gtk_label_new
+               (_("Literal backslash\n"
+                  "Literal question mark\n"
+                  "Literal opening curly brace\n"
+                  "Literal closing curly brace"));
+       PACK_LABEL();
 
-       gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
-       gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
+#undef PACK_LABEL
 
        gtkut_button_set_create(&hbbox, &ok_btn, _("OK"),
                                NULL, NULL, NULL, NULL);