diff options
Diffstat (limited to 'mail/mail-composer-prefs.c')
-rw-r--r-- | mail/mail-composer-prefs.c | 281 |
1 files changed, 251 insertions, 30 deletions
diff --git a/mail/mail-composer-prefs.c b/mail/mail-composer-prefs.c index 08afa547dd..8b2491e5d6 100644 --- a/mail/mail-composer-prefs.c +++ b/mail/mail-composer-prefs.c @@ -29,6 +29,7 @@ #include "composer/e-msg-composer.h" #include <bonobo/bonobo-generic-factory.h> +#include <bonobo/bonobo-object-client.h> #include <gal/widgets/e-gui-utils.h> @@ -111,29 +112,6 @@ mail_composer_prefs_destroy (GtkObject *obj) } static void -colorpicker_set_color (GnomeColorPicker *color, guint32 rgb) -{ - gnome_color_picker_set_i8 (color, (rgb & 0xff0000) >> 16, (rgb & 0xff00) >> 8, rgb & 0xff, 0xff); -} - -static guint32 -colorpicker_get_color (GnomeColorPicker *color) -{ - guint8 r, g, b, a; - guint32 rgb = 0; - - gnome_color_picker_get_i8 (color, &r, &g, &b, &a); - - rgb = r; - rgb <<= 8; - rgb |= g; - rgb <<= 8; - rgb |= b; - - return rgb; -} - -static void attach_style_info (GtkWidget *item, gpointer user_data) { int *style = user_data; @@ -512,6 +490,243 @@ sig_event_client (MailConfigSigEvent event, MailConfigSignature *sig, MailCompos } } +/* + * + * Spell checking cut'n'pasted from gnome-spell/capplet/main.c + * + */ + +#include "Spell.h" + +#define GNOME_SPELL_GCONF_DIR "/GNOME/Spell" +#define SPELL_API_VERSION "0.2" + +static void +spell_select_lang (MailComposerPrefs *prefs, const gchar *abrev) +{ + gint i; + + for (i = 0; i < prefs->language_seq->_length; i ++) { + if (!strcasecmp (abrev, prefs->language_seq->_buffer [i].abrev)) { + gtk_clist_select_row (GTK_CLIST (prefs->language), i, 0); + } + } +} + +static void +spell_set_ui_language (MailComposerPrefs *prefs) +{ + gchar *l, *last, *lang; + + gtk_clist_freeze (GTK_CLIST (prefs->language)); + gtk_clist_unselect_all (GTK_CLIST (prefs->language)); + last = prefs->language_str; + while ((l = strchr (last, ' '))) { + if (l != last) { + lang = g_strndup (last, l - last); + spell_select_lang (prefs, lang); + g_free (lang); + } + + last = l + 1; + } + if (last) + spell_select_lang (prefs, last); + gtk_clist_thaw (GTK_CLIST (prefs->language)); +} + +static void +spell_set_ui (MailComposerPrefs *prefs) +{ + prefs->spell_active = FALSE; + + spell_set_ui_language (prefs); + gnome_color_picker_set_i16 (GNOME_COLOR_PICKER (prefs->colour), + prefs->spell_error_color.red, prefs->spell_error_color.green, prefs->spell_error_color.blue, 0xffff); + + prefs->spell_active = TRUE; +} + +static gchar * +spell_get_language_str (MailComposerPrefs *prefs) +{ + GList *selection = GTK_CLIST (prefs->language)->selection; + GString *str = g_string_new (NULL); + gchar *rv; + + for (; selection; selection = selection->next) { + g_string_append (str, gtk_clist_get_row_data (GTK_CLIST (prefs->language), + GPOINTER_TO_INT (selection->data))); + if (selection->next) + g_string_append_c (str, ' '); + } + + rv = str->str; + g_string_free (str, FALSE); + + return rv; +} + +static void +spell_get_ui (MailComposerPrefs *prefs) +{ + gnome_color_picker_get_i16 (GNOME_COLOR_PICKER (prefs->colour), + &prefs->spell_error_color.red, + &prefs->spell_error_color.green, + &prefs->spell_error_color.blue, NULL); + g_free (prefs->language_str); + prefs->language_str = spell_get_language_str (prefs); +} + +#define GET(t,x,prop,f,c) \ + val = gconf_client_get_without_default (prefs->gconf, GNOME_SPELL_GCONF_DIR x, NULL); \ + if (val) { f; prop = c (gconf_value_get_ ## t (val)); \ + gconf_value_free (val); } + +static void +spell_save_orig (MailComposerPrefs *prefs) +{ + g_free (prefs->language_str_orig); + prefs->language_str_orig = g_strdup (prefs->language_str); + prefs->spell_error_color_orig = prefs->spell_error_color; +} + +/* static void +spell_load_orig (MailComposerPrefs *prefs) +{ + g_free (prefs->language_str); + prefs->language_str = g_strdup (prefs->language_str_orig); + prefs->spell_error_color = prefs->spell_error_color_orig; +} */ + +static void +spell_load_values (MailComposerPrefs *prefs) +{ + GConfValue *val; + + g_free (prefs->language_str); + prefs->language_str = g_strdup (_("en")); + prefs->spell_error_color.red = 0xffff; + prefs->spell_error_color.green = 0; + prefs->spell_error_color.blue = 0; + + GET (int, "/spell_error_color_red", prefs->spell_error_color.red,,); + GET (int, "/spell_error_color_green", prefs->spell_error_color.green,,); + GET (int, "/spell_error_color_blue", prefs->spell_error_color.blue,,); + GET (string, "/language", prefs->language_str, g_free (prefs->language_str), g_strdup); + + spell_save_orig (prefs); +} + +#define SET(t,x,prop) \ + gconf_client_set_ ## t (prefs->gconf, GNOME_SPELL_GCONF_DIR x, prop, NULL); + +static void +spell_save_values (MailComposerPrefs *prefs, gboolean force) +{ + if (force || !gdk_color_equal (&prefs->spell_error_color, &prefs->spell_error_color_orig)) { + SET (int, "/spell_error_color_red", prefs->spell_error_color.red); + SET (int, "/spell_error_color_green", prefs->spell_error_color.green); + SET (int, "/spell_error_color_blue", prefs->spell_error_color.blue); + } + if (force || strcmp (prefs->language_str, prefs->language_str_orig)) { + SET (string, "/language", prefs->language_str); + } + + gconf_client_suggest_sync (prefs->gconf, NULL); +} + +static void +spell_apply (MailComposerPrefs *prefs) +{ + spell_get_ui (prefs); + spell_save_values (prefs, FALSE); +} + +/* static void +spell_revert (MailComposerPrefs *prefs) +{ + spell_load_orig (prefs); + spell_set_ui (prefs); + spell_save_values (prefs, TRUE); +} */ + +static void +spell_changed (gpointer user_data) +{ + MailComposerPrefs *prefs = (MailComposerPrefs *) user_data; + + if (prefs->control) + evolution_config_control_changed (prefs->control); +} + +static void +spell_color_set (GtkWidget *widget, guint r, guint g, guint b, guint a, gpointer user_data) +{ + spell_changed (user_data); +} + +static void +spell_language_changed (GtkWidget *widget, gint row, gint column, GdkEvent *event, gpointer user_data) +{ + spell_changed (user_data); +} + +static void +spell_setup (MailComposerPrefs *prefs) +{ + gint i; + + gtk_clist_freeze (GTK_CLIST (prefs->language)); + for (i = 0; i < prefs->language_seq->_length; i ++) { + gchar *texts [1]; + + texts [0] = _(prefs->language_seq->_buffer [i].name); + gtk_clist_append (GTK_CLIST (prefs->language), texts); + gtk_clist_set_row_data (GTK_CLIST (prefs->language), i, prefs->language_seq->_buffer [i].abrev); + } + gtk_clist_thaw (GTK_CLIST (prefs->language)); + + spell_load_values (prefs); + spell_set_ui (prefs); + + glade_xml_signal_connect_data (prefs->gui, "spellColorSet", GTK_SIGNAL_FUNC (spell_color_set), prefs); + glade_xml_signal_connect_data (prefs->gui, "spellLanguageChanged", GTK_SIGNAL_FUNC (spell_language_changed), prefs); +} + +static gboolean +spell_setup_check_options (MailComposerPrefs *prefs) +{ + BonoboObjectClient *dictionary_client; + GNOME_Spell_Dictionary dict; + CORBA_Environment ev; + gchar *dictionary_id; + + dictionary_id = "OAFIID:GNOME_Spell_Dictionary:" SPELL_API_VERSION; + dictionary_client = bonobo_object_activate (dictionary_id, 0); + + if (!dictionary_client) { + g_warning ("Cannot activate %s", dictionary_id); + + return FALSE; + } + dict = bonobo_object_corba_objref (BONOBO_OBJECT (dictionary_client)); + + CORBA_exception_init (&ev); + prefs->language_seq = GNOME_Spell_Dictionary_getLanguages (dict, &ev); + CORBA_exception_free (&ev); + + gconf_client_add_dir (prefs->gconf, GNOME_SPELL_GCONF_DIR, GCONF_CLIENT_PRELOAD_NONE, NULL); + + spell_setup (prefs); + + return TRUE; +} + +/* + * End of Spell checking + */ + static void mail_composer_prefs_construct (MailComposerPrefs *prefs) { @@ -521,10 +736,12 @@ mail_composer_prefs_construct (MailComposerPrefs *prefs) char *names[][2] = {{"live_spell_check", "chkEnableSpellChecking"}, {"gtk_html_prop_keymap_option", "omenuShortcutsType"}, {NULL, NULL}}; - + + prefs->gconf = gconf_client_get_default (); + gui = glade_xml_new (EVOLUTION_GLADEDIR "/mail-config.glade", "composer_tab"); prefs->gui = gui; - + /* get our toplevel widget */ toplevel = glade_xml_get_widget (gui, "toplevel"); @@ -557,7 +774,7 @@ mail_composer_prefs_construct (MailComposerPrefs *prefs) gtk_option_menu_set_menu (prefs->charset, GTK_WIDGET (menu)); option_menu_connect (prefs->charset, prefs); - /* Spell Checking */ + /* Spell Checking: GtkHTML part */ prefs->pman = GTK_HTML_PROPMANAGER (gtk_html_propmanager_new (NULL)); gtk_signal_connect (GTK_OBJECT (prefs->pman), "changed", toggle_button_toggled, prefs); gtk_object_ref (GTK_OBJECT (prefs->pman)); @@ -565,10 +782,14 @@ mail_composer_prefs_construct (MailComposerPrefs *prefs) gtk_html_propmanager_set_names (prefs->pman, names); gtk_html_propmanager_set_gui (prefs->pman, gui, NULL); - /* + /* Spell Checking: GNOME Spell part */ prefs->colour = GNOME_COLOR_PICKER (glade_xml_get_widget (gui, "colorpickerSpellCheckColor")); - prefs->language = GTK_COMBO (glade_xml_get_widget (gui, "cmboSpellCheckLanguage")); - */ + prefs->language = GTK_CLIST (glade_xml_get_widget (gui, "clistSpellCheckLanguage")); + + if (!spell_setup_check_options (prefs)) { + gtk_widget_hide (GTK_WIDGET (prefs->colour)); + gtk_widget_hide (GTK_WIDGET (prefs->language)); + } /* Forwards and Replies */ prefs->forward_style = GTK_OPTION_MENU (glade_xml_get_widget (gui, "omenuForwardStyle")); @@ -683,8 +904,8 @@ mail_composer_prefs_apply (MailComposerPrefs *prefs) } /* Spell Checking */ - /* FIXME: implement me */ gtk_html_propmanager_apply (prefs->pman); + spell_apply (prefs); /* Forwards and Replies */ menu = gtk_option_menu_get_menu (prefs->forward_style); |