inital gtk2 patch
[claws.git] / src / prefs_folder_item.c
index 45ff47628291edeb2743856843d79577dd3264a6..7a5c1f99bc6d9229af47e3198aafc40aa8932e25 100644 (file)
 #include "manage_window.h"
 #include "utils.h"
 #include "addr_compl.h"
+#include "prefs_common.h"
 #include "prefs_scoring.h"
 #include "gtkutils.h"
 #include "filtering.h"
 #include "folder_item_prefs.h"
+#include "gtk/colorsel.h"
+
+#if USE_ASPELL
+#include "gtkaspell.h"
+#endif
+
+#define ASSIGN_STRING(string, value) \
+       { \
+               g_free(string); \
+               string = (value); \
+       }
 
 struct FolderItemGeneralPage
 {
@@ -53,10 +65,9 @@ struct FolderItemGeneralPage
        GtkWidget *entry_simplify_subject;
        GtkWidget *checkbtn_folder_chmod;
        GtkWidget *entry_folder_chmod;
-       GtkWidget *folder_color;
        GtkWidget *folder_color_btn;
 
-       GtkWidget *color_dialog;
+       gint       folder_color;
 };
 
 struct FolderItemComposePage
@@ -75,18 +86,16 @@ struct FolderItemComposePage
        GtkWidget *entry_default_reply_to;
        GtkWidget *checkbtn_enable_default_account;
        GtkWidget *optmenu_default_account;
+#if USE_ASPELL
+       GtkWidget *checkbtn_enable_default_dictionary;
+       GtkWidget *optmenu_default_dictionary;
+#endif
 };
 
 
 gint prefs_folder_item_chmod_mode              (gchar *folder_chmod);
 
-static void set_button_color(guint rgbvalue, GtkWidget *button);
 static void folder_color_set_dialog(GtkWidget *widget, gpointer data);
-static void folder_color_set_dialog_ok(GtkWidget *widget, gpointer data);
-static void folder_color_set_dialog_cancel(GtkWidget *widget, gpointer data);
-static void folder_color_set_dialog_key_pressed(GtkWidget *widget,
-                                               GdkEventKey *event,
-                                               gpointer data);
 
 #define SAFE_STRING(str) \
        (str) ? (str) : ""
@@ -108,9 +117,6 @@ void prefs_folder_item_general_create_widget_func(PrefsPage * _page,
        GtkWidget *entry_folder_chmod;
        GtkWidget *folder_color;
        GtkWidget *folder_color_btn;
-       GtkWidget *menu;
-       GtkWidget *menuitem;
-       gint account_index, index;
 
        page->item         = item;
 
@@ -169,23 +175,22 @@ void prefs_folder_item_general_create_widget_func(PrefsPage * _page,
        gtk_table_attach_defaults(GTK_TABLE(table), folder_color, 0, 1, 
                         rowcount, rowcount + 1);
 
-       hbox = gtk_hbox_new (FALSE, 0);
-       gtk_widget_show (hbox);
+       hbox = gtk_hbox_new(FALSE, 0);
+       gtk_widget_show(hbox);
        gtk_table_attach_defaults(GTK_TABLE(table), hbox, 1, 2, 
                                  rowcount, rowcount + 1);
 
        folder_color_btn = gtk_button_new_with_label("");
-       gtk_widget_show (hbox);
-       gtk_widget_set_usize(folder_color_btn, 36, 26);
-       gtk_box_pack_start (GTK_BOX (hbox), folder_color_btn, FALSE, FALSE, 0);
+       gtk_widget_set_size_request(folder_color_btn, 36, 26);
+       gtk_box_pack_start (GTK_BOX(hbox), folder_color_btn, FALSE, FALSE, 0);
 
-       page->item->prefs->color = item->prefs->color;
+       page->folder_color = item->prefs->color;
 
-       gtk_signal_connect(GTK_OBJECT(folder_color_btn), "clicked",
-                          GTK_SIGNAL_FUNC(folder_color_set_dialog),
-                          page);
+       g_signal_connect(G_OBJECT(folder_color_btn), "clicked",
+                        G_CALLBACK(folder_color_set_dialog),
+                        page);
 
-       set_button_color(item->prefs->color, folder_color_btn);
+       gtkut_set_widget_bgcolor_rgb(folder_color_btn, item->prefs->color);
 
        rowcount++;
 
@@ -194,7 +199,6 @@ void prefs_folder_item_general_create_widget_func(PrefsPage * _page,
        page->entry_simplify_subject = entry_simplify_subject;
        page->checkbtn_folder_chmod = checkbtn_folder_chmod;
        page->entry_folder_chmod = entry_folder_chmod;
-       page->folder_color = folder_color;
        page->folder_color_btn = folder_color_btn;
 
        page->page.widget = table;
@@ -202,7 +206,7 @@ void prefs_folder_item_general_create_widget_func(PrefsPage * _page,
 
 void prefs_folder_item_general_destroy_widget_func(PrefsPage *_page) 
 {
-       struct FolderItemGeneralPage *page = (struct FolderItemGeneralPage *) _page;
+       /* struct FolderItemGeneralPage *page = (struct FolderItemGeneralPage *) _page; */
 }
 
 void prefs_folder_item_general_save_func(PrefsPage *_page) 
@@ -210,20 +214,15 @@ void prefs_folder_item_general_save_func(PrefsPage *_page)
        gchar *buf;
        struct FolderItemGeneralPage *page = (struct FolderItemGeneralPage *) _page;
        FolderItemPrefs *prefs = page->item->prefs;
-       GtkWidget *menu;
-       GtkWidget *menuitem;
        gboolean   old_simplify_val;
        gchar     *old_simplify_str;
 
        g_return_if_fail(prefs != NULL);
 
-       old_simplify_val = prefs->enable_simplify_subject;
-       old_simplify_str = prefs->simplify_subject_regexp;
-
        prefs->enable_simplify_subject =
            gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_simplify_subject));
-       prefs->simplify_subject_regexp = 
-           gtk_editable_get_chars(GTK_EDITABLE(page->entry_simplify_subject), 0, -1);
+       ASSIGN_STRING(prefs->simplify_subject_regexp,
+           gtk_editable_get_chars(GTK_EDITABLE(page->entry_simplify_subject), 0, -1));
        
 /*
        if (page->item == page->folderview->summaryview->folder_item &&
@@ -235,15 +234,13 @@ void prefs_folder_item_general_save_func(PrefsPage *_page)
                folderview_select(page->folderview, page->item);
        }
 */
-       if (old_simplify_str) g_free(old_simplify_str);
-
        prefs->enable_folder_chmod = 
            gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_folder_chmod));
        buf = gtk_editable_get_chars(GTK_EDITABLE(page->entry_folder_chmod), 0, -1);
        prefs->folder_chmod = prefs_folder_item_chmod_mode(buf);
        g_free(buf);
 
-       prefs->color = page->item->prefs->color;
+       prefs->color = page->folder_color;
        /* update folder view */
        if (prefs->color > 0)
                folder_item_update(page->item, F_ITEM_UPDATE_MSGCNT);
@@ -271,8 +268,17 @@ void prefs_folder_item_compose_create_widget_func(PrefsPage * _page,
        GtkWidget *optmenu_default_account;
        GtkWidget *optmenu_default_account_menu;
        GtkWidget *optmenu_default_account_menuitem;
+#if USE_ASPELL
+       GtkWidget *checkbtn_enable_default_dictionary;
+       GtkWidget *optmenu_default_dictionary;
+       GtkWidget *optmenu_default_dictionary_menu;
+       GtkWidget *opemenu_default_dictionary_menuitem;
+#endif
        GList *cur_ac;
        GList *account_list;
+#if USE_ASPELL
+       gchar *dictionary;
+#endif
        PrefsAccount *ac_prefs;
        GtkOptionMenu *optmenu;
        GtkWidget *menu;
@@ -282,7 +288,12 @@ void prefs_folder_item_compose_create_widget_func(PrefsPage * _page,
        page->item         = item;
 
        /* Table */
-       table = gtk_table_new(5, 2, FALSE);
+#if USE_ASPELL
+# define TABLEHEIGHT 6
+#else
+# define TABLEHEIGHT 5
+#endif
+       table = gtk_table_new(TABLEHEIGHT, 2, FALSE);
        gtk_widget_show(table);
        gtk_table_set_row_spacings(GTK_TABLE(table), -1);
        rowcount = 0;
@@ -372,8 +383,6 @@ void prefs_folder_item_compose_create_widget_func(PrefsPage * _page,
                index++;                        
        }
 
-       page->item->prefs->default_account = item->prefs->default_account;
-
        optmenu = GTK_OPTION_MENU(optmenu_default_account);
        gtk_option_menu_set_menu(optmenu, optmenu_default_account_menu);
 
@@ -387,6 +396,39 @@ void prefs_folder_item_compose_create_widget_func(PrefsPage * _page,
 
        rowcount++;
 
+#if USE_ASPELL
+       /* Default dictionary */
+       checkbtn_enable_default_dictionary = gtk_check_button_new_with_label(_("Default dictionary: "));
+       gtk_widget_show(checkbtn_enable_default_dictionary);
+       gtk_table_attach(GTK_TABLE(table), checkbtn_enable_default_dictionary, 0, 1,
+                        rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_dictionary),
+                                    item->prefs->enable_default_dictionary);
+
+       optmenu_default_dictionary = gtk_option_menu_new();
+       gtk_widget_show(optmenu_default_dictionary);
+       gtk_table_attach_defaults(GTK_TABLE(table), optmenu_default_dictionary, 1, 2,
+                               rowcount, rowcount + 1);
+
+       gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu_default_dictionary), 
+                                gtkaspell_dictionary_option_menu_new(
+                                        prefs_common.aspell_path));
+
+       dictionary = item->prefs->default_dictionary;
+
+       optmenu = GTK_OPTION_MENU(optmenu_default_dictionary);
+
+       menu = gtk_option_menu_get_menu(optmenu);
+       if (dictionary)
+               gtkaspell_set_dictionary_menu_active_item(optmenu_default_dictionary, dictionary);
+       menuitem = gtk_menu_get_active(GTK_MENU(menu));
+       gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
+
+       SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_dictionary, optmenu_default_dictionary);
+
+       rowcount++;
+#endif
+
        page->window = GTK_WIDGET(window);
        page->table = table;
        page->checkbtn_request_return_receipt = checkbtn_request_return_receipt;
@@ -397,6 +439,10 @@ void prefs_folder_item_compose_create_widget_func(PrefsPage * _page,
        page->entry_default_reply_to = entry_default_reply_to;
        page->checkbtn_enable_default_account = checkbtn_enable_default_account;
        page->optmenu_default_account = optmenu_default_account;
+#ifdef USE_ASPELL
+       page->checkbtn_enable_default_dictionary = checkbtn_enable_default_dictionary;
+       page->optmenu_default_dictionary = optmenu_default_dictionary;
+#endif
 
        address_completion_start(page->window);
 
@@ -414,7 +460,6 @@ void prefs_folder_item_compose_destroy_widget_func(PrefsPage *_page)
 
 void prefs_folder_item_compose_save_func(PrefsPage *_page) 
 {
-       gchar *buf;
        struct FolderItemComposePage *page = (struct FolderItemComposePage *) _page;
        FolderItemPrefs *prefs = page->item->prefs;
        GtkWidget *menu;
@@ -432,21 +477,27 @@ void prefs_folder_item_compose_save_func(PrefsPage *_page)
 
        prefs->enable_default_to = 
            gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_default_to));
-       g_free(prefs->default_to);
-       prefs->default_to = 
-           gtk_editable_get_chars(GTK_EDITABLE(page->entry_default_to), 0, -1);
+       ASSIGN_STRING(prefs->default_to,
+           gtk_editable_get_chars(GTK_EDITABLE(page->entry_default_to), 0, -1));
 
        prefs->enable_default_reply_to = 
            gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_default_reply_to));
-       g_free(prefs->default_reply_to);
-       prefs->default_reply_to = 
-           gtk_editable_get_chars(GTK_EDITABLE(page->entry_default_reply_to), 0, -1);
+       ASSIGN_STRING(prefs->default_reply_to,
+           gtk_editable_get_chars(GTK_EDITABLE(page->entry_default_reply_to), 0, -1));
 
        prefs->enable_default_account = 
            gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_default_account));
        menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(page->optmenu_default_account));
        menuitem = gtk_menu_get_active(GTK_MENU(menu));
-       prefs->default_account = GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(menuitem)));
+       prefs->default_account = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
+
+#if USE_ASPELL
+       prefs->enable_default_dictionary =
+           gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_default_dictionary));
+       menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(page->optmenu_default_dictionary));
+       ASSIGN_STRING(prefs->default_dictionary,
+           gtkaspell_get_dictionary_menu_active_item(menu));
+#endif
 
        folder_item_prefs_save_config(page->item);
 }
@@ -465,84 +516,15 @@ gint prefs_folder_item_chmod_mode(gchar *folder_chmod)
        return newmode;
 }
 
-static void set_button_color(guint rgbvalue, GtkWidget *button)
-{
-       GtkStyle *newstyle;
-       GdkColor gdk_color;
-
-       gtkut_convert_int_to_gdk_color(rgbvalue, &gdk_color);
-       newstyle = gtk_style_copy(gtk_widget_get_default_style());
-       newstyle->bg[GTK_STATE_NORMAL]   = gdk_color;
-       newstyle->bg[GTK_STATE_PRELIGHT] = gdk_color;
-       newstyle->bg[GTK_STATE_ACTIVE]   = gdk_color;
-       gtk_widget_set_style(GTK_WIDGET(button), newstyle);
-}
-
 static void folder_color_set_dialog(GtkWidget *widget, gpointer data)
 {
        struct FolderItemGeneralPage *page = (struct FolderItemGeneralPage *) data;
-       GtkColorSelectionDialog *dialog;
-       gdouble color[4] = {0.0, 0.0, 0.0, 0.0};
-       guint rgbcolor;
-
-       page->color_dialog = gtk_color_selection_dialog_new(_("Pick color for folder"));
-       gtk_window_set_position(GTK_WINDOW(page->color_dialog), GTK_WIN_POS_CENTER);
-       gtk_window_set_modal(GTK_WINDOW(page->color_dialog), TRUE);
-       gtk_window_set_policy(GTK_WINDOW(page->color_dialog), FALSE, FALSE, FALSE);
-       manage_window_set_transient(GTK_WINDOW(page->color_dialog));
-
-       gtk_signal_connect(GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(page->color_dialog)->ok_button),
-                          "clicked", GTK_SIGNAL_FUNC(folder_color_set_dialog_ok), data);
-       gtk_signal_connect(GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(page->color_dialog)->cancel_button),
-                          "clicked", GTK_SIGNAL_FUNC(folder_color_set_dialog_cancel), data);
-       gtk_signal_connect(GTK_OBJECT(page->color_dialog), "key_press_event",
-                          GTK_SIGNAL_FUNC(folder_color_set_dialog_key_pressed),
-                          data);
-
-       rgbcolor = page->item->prefs->color;
-       color[0] = (gdouble) ((rgbcolor & 0xff0000) >> 16) / 255.0;
-       color[1] = (gdouble) ((rgbcolor & 0x00ff00) >>  8) / 255.0;
-       color[2] = (gdouble)  (rgbcolor & 0x0000ff)        / 255.0;
-
-       dialog = GTK_COLOR_SELECTION_DIALOG(page->color_dialog);
-       gtk_color_selection_set_color(GTK_COLOR_SELECTION(dialog->colorsel), color);
-
-       gtk_widget_show(page->color_dialog);
-}
-
-static void folder_color_set_dialog_ok(GtkWidget *widget, gpointer data)
-{
-       struct FolderItemGeneralPage *page = (struct FolderItemGeneralPage *) data;
-       GtkColorSelection *colorsel = (GtkColorSelection *)
-                               ((GtkColorSelectionDialog *) page->color_dialog)->colorsel;
-       gdouble color[4];
-       guint red, green, blue, rgbvalue;
-
-       gtk_color_selection_get_color(colorsel, color);
-
-       red      = (guint) (color[0] * 255.0);
-       green    = (guint) (color[1] * 255.0);
-       blue     = (guint) (color[2] * 255.0);
-       rgbvalue = (guint) ((red * 0x10000) | (green * 0x100) | blue);
-
-       page->item->prefs->color = rgbvalue;
-       set_button_color(rgbvalue, page->folder_color_btn);
-
-       gtk_widget_destroy(page->color_dialog);
-}
+       gint rgbcolor;
 
-static void folder_color_set_dialog_cancel(GtkWidget *widget, gpointer data)
-{
-       struct FolderItemGeneralPage *page = (struct FolderItemGeneralPage *) data;
-       gtk_widget_destroy(page->color_dialog);
-}
-
-static void folder_color_set_dialog_key_pressed(GtkWidget *widget,
-                                               GdkEventKey *event,
-                                               gpointer data)
-{
-       struct FolderItemGeneralPage *page = (struct FolderItemGeneralPage *) data;
-       gtk_widget_destroy(page->color_dialog);
+       rgbcolor = colorsel_select_color_rgb(_("Pick color for folder"), 
+                                            page->folder_color);
+       gtkut_set_widget_bgcolor_rgb(page->folder_color_btn, rgbcolor);
+       page->folder_color = rgbcolor;
 }
 
 struct FolderItemGeneralPage folder_item_general_page;