diff options
Diffstat (limited to 'widgets')
-rw-r--r-- | widgets/misc/ChangeLog | 19 | ||||
-rw-r--r-- | widgets/misc/Makefile.am | 1 | ||||
-rw-r--r-- | widgets/misc/e-account-combo-box.c | 86 | ||||
-rw-r--r-- | widgets/misc/e-account-combo-box.h | 21 | ||||
-rw-r--r-- | widgets/misc/e-charset-picker.c | 130 | ||||
-rw-r--r-- | widgets/misc/e-charset-picker.h | 42 | ||||
-rw-r--r-- | widgets/misc/e-signature-combo-box.c | 27 | ||||
-rw-r--r-- | widgets/misc/e-signature-combo-box.h | 25 |
8 files changed, 306 insertions, 45 deletions
diff --git a/widgets/misc/ChangeLog b/widgets/misc/ChangeLog index 13270f833d..e5e59a03e0 100644 --- a/widgets/misc/ChangeLog +++ b/widgets/misc/ChangeLog @@ -1,3 +1,22 @@ +2008-04-02 Matthew Barnes <mbarnes@redhat.com> + + * Makefile.am: + Add EVOLUTION_MAIL_LIBS. + + * e-account-combo-box.c: + * e-account-combo-box.h: + New function e_account_combo_box_get_account_list(). + Emit a "refreshed" signal when the EAccountList changes. + Add an internal reverse-lookup index. + + * e-charset-picker.c (e_charser_add_radio_actions): + New function adds radio actions to an action group. + Will eventually replace e_charset_picker_bonobo_ui_populate(). + + * e-signature-combo-box.c: + * e-signature-combo-box.h: + New function e_signature_combo_box_get_signature_list(). + 2008-03-27 Milan Crha <mcrha@redhat.com> ** Fix for bug #507526 diff --git a/widgets/misc/Makefile.am b/widgets/misc/Makefile.am index ea02028595..bb3d131ffb 100644 --- a/widgets/misc/Makefile.am +++ b/widgets/misc/Makefile.am @@ -138,6 +138,7 @@ libemiscwidgets_la_LIBADD = $(top_builddir)/e-util/libeutil.la \ $(top_builddir)/a11y/libevolution-a11y.la \ $(EVOLUTION_MAIL_LIBS) \ $(GNOME_PLATFORM_LIBS) \ + $(EVOLUTON_MAIL_LIBS) \ $(ICONV_LIBS) libefilterbar_la_SOURCES = \ diff --git a/widgets/misc/e-account-combo-box.c b/widgets/misc/e-account-combo-box.c index 6a96644bfd..37b13866f6 100644 --- a/widgets/misc/e-account-combo-box.c +++ b/widgets/misc/e-account-combo-box.c @@ -1,3 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2008 Novell, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU Lesser General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + #include "e-account-combo-box.h" #include <string.h> @@ -12,12 +31,19 @@ enum { COLUMN_ACCOUNT }; +enum { + REFRESHED, + LAST_SIGNAL +}; + struct _EAccountComboBoxPrivate { EAccountList *account_list; + GHashTable *index; }; static gpointer parent_class; static CamelSession *camel_session; +static guint signal_ids[LAST_SIGNAL]; static gboolean account_combo_box_has_dupes (GList *list, @@ -86,15 +112,9 @@ account_combo_box_refresh_cb (EAccountList *account_list, store = gtk_list_store_new (2, G_TYPE_STRING, E_TYPE_ACCOUNT); model = GTK_TREE_MODEL (store); + index = combo_box->priv->index; - /* Embed a reverse-lookup index into the list store. */ - index = g_hash_table_new_full ( - g_direct_hash, g_direct_equal, - (GDestroyNotify) g_object_unref, - (GDestroyNotify) gtk_tree_row_reference_free); - g_object_set_data_full ( - G_OBJECT (combo_box), "index", index, - (GDestroyNotify) g_hash_table_destroy); + g_hash_table_remove_all (index); if (account_list == NULL) goto skip; @@ -161,6 +181,8 @@ skip: e_account_combo_box_set_active (combo_box, account); if (account != NULL) g_object_unref (account); + + g_signal_emit (combo_box, signal_ids[REFRESHED], 0); } static GObject * @@ -200,11 +222,26 @@ account_combo_box_dispose (GObject *object) priv->account_list = NULL; } + g_hash_table_remove_all (priv->index); + /* Chain up to parent's dispose() method. */ G_OBJECT_CLASS (parent_class)->dispose (object); } static void +account_combo_box_finalize (GObject *object) +{ + EAccountComboBoxPrivate *priv; + + priv = E_ACCOUNT_COMBO_BOX_GET_PRIVATE (object); + + g_hash_table_destroy (priv->index); + + /* Chain up to parent's finalize() method. */ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void account_combo_box_class_init (EAccountComboBoxClass *class) { GObjectClass *object_class; @@ -215,12 +252,30 @@ account_combo_box_class_init (EAccountComboBoxClass *class) object_class = G_OBJECT_CLASS (class); object_class->constructor = account_combo_box_constructor; object_class->dispose = account_combo_box_dispose; + object_class->finalize = account_combo_box_finalize; + + signal_ids[REFRESHED] = g_signal_new ( + "refreshed", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); } static void account_combo_box_init (EAccountComboBox *combo_box) { + GHashTable *index; + + /* Reverse-lookup index */ + index = g_hash_table_new_full ( + g_direct_hash, g_direct_equal, + (GDestroyNotify) g_object_unref, + (GDestroyNotify) gtk_tree_row_reference_free); + combo_box->priv = E_ACCOUNT_COMBO_BOX_GET_PRIVATE (combo_box); + combo_box->priv->index = index; } GType @@ -273,6 +328,14 @@ e_account_combo_box_set_session (CamelSession *session) camel_session = session; } +EAccountList * +e_account_combo_box_get_account_list (EAccountComboBox *combo_box) +{ + g_return_val_if_fail (E_IS_ACCOUNT_COMBO_BOX (combo_box), NULL); + + return combo_box->priv->account_list; +} + void e_account_combo_box_set_account_list (EAccountComboBox *combo_box, EAccountList *account_list) @@ -337,7 +400,6 @@ gboolean e_account_combo_box_set_active (EAccountComboBox *combo_box, EAccount *account) { - GHashTable *index; EAccountList *account_list; GtkTreeRowReference *reference; GtkTreeModel *model; @@ -353,10 +415,6 @@ e_account_combo_box_set_active (EAccountComboBox *combo_box, account_list = combo_box->priv->account_list; g_return_val_if_fail (account_list != NULL, FALSE); - /* Failure here indicates a programming error. */ - index = g_object_get_data (G_OBJECT (combo_box), "index"); - g_assert (index != NULL); - /* NULL means select the default account. */ /* XXX EAccountList misuses const. */ if (account == NULL) @@ -364,7 +422,7 @@ e_account_combo_box_set_active (EAccountComboBox *combo_box, e_account_list_get_default (account_list); /* Lookup the tree row reference for the account. */ - reference = g_hash_table_lookup (index, account); + reference = g_hash_table_lookup (combo_box->priv->index, account); if (reference == NULL) return FALSE; diff --git a/widgets/misc/e-account-combo-box.h b/widgets/misc/e-account-combo-box.h index a4363cf2e2..d5dd26780e 100644 --- a/widgets/misc/e-account-combo-box.h +++ b/widgets/misc/e-account-combo-box.h @@ -1,3 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2008 Novell, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU Lesser General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + #ifndef E_ACCOUNT_COMBO_BOX_H #define E_ACCOUNT_COMBO_BOX_H @@ -43,6 +62,8 @@ struct _EAccountComboBoxClass { GType e_account_combo_box_get_type (void); GtkWidget * e_account_combo_box_new (void); void e_account_combo_box_set_session (CamelSession *session); +EAccountList * e_account_combo_box_get_account_list + (EAccountComboBox *combo_box); void e_account_combo_box_set_account_list (EAccountComboBox *combo_box, EAccountList *account_list); diff --git a/widgets/misc/e-charset-picker.c b/widgets/misc/e-charset-picker.c index 3254c9d42f..2efffdd8b8 100644 --- a/widgets/misc/e-charset-picker.c +++ b/widgets/misc/e-charset-picker.c @@ -28,15 +28,6 @@ #include <string.h> #include <iconv.h> -#include <gtk/gtkhbox.h> -#include <gtk/gtkvbox.h> -#include <gtk/gtkentry.h> -#include <gtk/gtkstock.h> -#include <gtk/gtklabel.h> -#include <gtk/gtkmenuitem.h> -#include <gtk/gtkoptionmenu.h> -#include <gtk/gtksignal.h> - #include <glib/gi18n.h> #include <bonobo/bonobo-ui-node.h> @@ -446,6 +437,127 @@ e_charset_picker_dialog (const char *title, const char *prompt, } /** + * e_charset_add_radio_actions: + * @action_group: a #GtkActionGroup + * @default_charset: the default character set, or %NULL to use the + * locale character set + * @callback: a callback function for actions in the group, or %NULL + * @user_data: user data to be passed to @callback, or %NULL + * + * Adds a set of #GtkRadioActions for available character sets to + * @action_group. The @default_charset (or locale character set if + * @default_charset is %NULL) will be added first, and selected by + * default (except that iso-8859-1 will always be used instead of + * US-ASCII). Any other character sets of the same language class as + * the default will be added next, followed by the remaining character + * sets. + **/ +void +e_charset_add_radio_actions (GtkActionGroup *action_group, + const gchar *default_charset, + GCallback callback, + gpointer user_data) +{ + GtkRadioAction *action = NULL; + GSList *group = NULL; + const gchar *locale_charset; + gint def, ii; + + g_return_if_fail (GTK_IS_ACTION_GROUP (action_group)); + + /* XXX I could try to factor out code common to this + * function and e_charset_picker_bonobo_ui_populate() + * instead of duplicating it, but I expect the latter + * function to be obsolete in the foreseeable future. */ + + g_get_charset (&locale_charset); + if (!g_ascii_strcasecmp (locale_charset, "US-ASCII")) + locale_charset = "iso-8859-1"; + + if (default_charset == NULL) + default_charset = locale_charset; + for (def = 0; def < G_N_ELEMENTS (charsets); def++) + if (!g_ascii_strcasecmp (charsets[def].name, default_charset)) + break; + + for (ii = 0; ii < G_N_ELEMENTS (charsets); ii++) { + gchar *escaped_name; + gchar *charset_label; + gchar **str_array; + + /* Escape underlines in the character set name so + * they're not treated as GtkLabel mnemonics. */ + str_array = g_strsplit (charsets[ii].name, "_", -1); + escaped_name = g_strjoinv ("__", str_array); + g_strfreev (str_array); + + if (charsets[ii].subclass != NULL) + charset_label = g_strdup_printf ( + "%s, %s (%s)", + gettext (classnames[charsets[ii].class]), + gettext (charsets[ii].subclass), + escaped_name); + else if (charsets[ii].class != E_CHARSET_UNKNOWN) + charset_label = g_strdup_printf ( + "%s (%s)", + gettext (classnames[charsets[ii].class]), + escaped_name); + else + charset_label = g_strdup (escaped_name); + + action = gtk_radio_action_new ( + charsets[ii].name, charset_label, NULL, NULL, ii); + + gtk_radio_action_set_group (action, group); + group = gtk_radio_action_get_group (action); + + if (callback != NULL) + g_signal_connect ( + action, "changed", callback, user_data); + + gtk_action_group_add_action ( + action_group, GTK_ACTION (action)); + + g_object_unref (action); + + g_free (escaped_name); + g_free (charset_label); + } + + if (def == G_N_ELEMENTS (charsets)) { + gchar *charset_label; + gchar **str_array; + + /* Escape underlines in the character set name so + * they're not treated as GtkLabel mnemonics. */ + str_array = g_strsplit (default_charset, "_", -1); + charset_label = g_strjoinv ("__", str_array); + g_strfreev (str_array); + + action = gtk_radio_action_new ( + default_charset, charset_label, NULL, NULL, def); + + gtk_radio_action_set_group (action, group); + group = gtk_radio_action_get_group (action); + + if (callback != NULL) + g_signal_connect ( + action, "changed", callback, user_data); + + gtk_action_group_add_action ( + action_group, GTK_ACTION (action)); + + g_object_unref (action); + + g_free (charset_label); + } + + /* Any of the actions in the action group will do. */ + if (action != NULL) + gtk_radio_action_set_current_value (action, def); +} + +/** * e_charset_picker_bonobo_ui_populate: * @uic: Bonobo UI Component * @path: menu path diff --git a/widgets/misc/e-charset-picker.h b/widgets/misc/e-charset-picker.h index 78de722483..35abff0241 100644 --- a/widgets/misc/e-charset-picker.h +++ b/widgets/misc/e-charset-picker.h @@ -18,31 +18,33 @@ * */ -#ifndef _E_CHARSETPICKER_H_ -#define _E_CHARSETPICKER_H_ +#ifndef E_CHARSETPICKER_H +#define E_CHARSETPICKER_H -#include <gtk/gtkwindow.h> +#include <gtk/gtk.h> #include <bonobo/bonobo-ui-component.h> -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ +G_BEGIN_DECLS -GtkWidget *e_charset_picker_new (const char *default_charset); -char *e_charset_picker_get_charset (GtkWidget *picker); +GtkWidget * e_charset_picker_new (const char *default_charset); +char * e_charset_picker_get_charset (GtkWidget *picker); +char * e_charset_picker_dialog (const char *title, + const char *prompt, + const char *default_charset, + GtkWindow *parent); -char *e_charset_picker_dialog (const char *title, const char *prompt, - const char *default_charset, - GtkWindow *parent); +void e_charset_add_radio_actions (GtkActionGroup *action_group, + const gchar *default_charset, + GCallback callback, + gpointer user_data); -/* bonobo equivalents */ -void e_charset_picker_bonobo_ui_populate (BonoboUIComponent *uic, const char *path, - const char *default_charset, - BonoboUIListenerFn cb, gpointer user_data); +void e_charset_picker_bonobo_ui_populate + (BonoboUIComponent *uic, + const char *path, + const char *default_charset, + BonoboUIListenerFn cb, + gpointer user_data); -#ifdef __cplusplus -} -#endif /* __cplusplus */ +G_END_DECLS -#endif /* _E_CHARSETPICKER_H_ */ +#endif /* E_CHARSETPICKER_H */ diff --git a/widgets/misc/e-signature-combo-box.c b/widgets/misc/e-signature-combo-box.c index be19755ef6..3edcc2b364 100644 --- a/widgets/misc/e-signature-combo-box.c +++ b/widgets/misc/e-signature-combo-box.c @@ -1,3 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2008 Novell, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU Lesser General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + #include "e-signature-combo-box.h" #include <glib/gi18n.h> @@ -233,6 +252,14 @@ e_signature_combo_box_new (void) return g_object_new (E_TYPE_SIGNATURE_COMBO_BOX, NULL); } +ESignatureList * +e_signature_combo_box_get_signature_list (ESignatureComboBox *combo_box) +{ + g_return_val_if_fail (E_IS_SIGNATURE_COMBO_BOX (combo_box), NULL); + + return combo_box->priv->signature_list; +} + void e_signature_combo_box_set_signature_list (ESignatureComboBox *combo_box, ESignatureList *signature_list) diff --git a/widgets/misc/e-signature-combo-box.h b/widgets/misc/e-signature-combo-box.h index 31786978ef..4208265911 100644 --- a/widgets/misc/e-signature-combo-box.h +++ b/widgets/misc/e-signature-combo-box.h @@ -1,9 +1,28 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2008 Novell, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU Lesser General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + #ifndef E_SIGNATURE_COMBO_BOX_H #define E_SIGNATURE_COMBO_BOX_H #include <gtk/gtk.h> -#include "e-util/e-signature.h" -#include "e-util/e-signature-list.h" +#include <e-util/e-signature.h> +#include <e-util/e-signature-list.h> /* Standard GObject macros */ #define E_TYPE_SIGNATURE_COMBO_BOX \ @@ -41,6 +60,8 @@ struct _ESignatureComboBoxClass { GType e_signature_combo_box_get_type (void); GtkWidget * e_signature_combo_box_new (void); +ESignatureList *e_signature_combo_box_get_signature_list + (ESignatureComboBox *combo_box); void e_signature_combo_box_set_signature_list (ESignatureComboBox *combo_box, ESignatureList *signature_list); |