diff options
Diffstat (limited to 'composer/e-composer-private.c')
-rw-r--r-- | composer/e-composer-private.c | 290 |
1 files changed, 290 insertions, 0 deletions
diff --git a/composer/e-composer-private.c b/composer/e-composer-private.c new file mode 100644 index 0000000000..f5e3e08c68 --- /dev/null +++ b/composer/e-composer-private.c @@ -0,0 +1,290 @@ +/* -*- 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-composer-private.h" + +static void +composer_setup_charset_menu (EMsgComposer *composer) +{ + GtkUIManager *manager; + const gchar *path; + GList *list; + guint merge_id; + + manager = gtkhtml_editor_get_ui_manager (GTKHTML_EDITOR (composer)); + list = gtk_action_group_list_actions (composer->priv->charset_actions); + path = "/main-menu/edit-menu/pre-spell-check/charset-menu"; + merge_id = gtk_ui_manager_new_merge_id (manager); + + while (list != NULL) { + GtkAction *action = list->data; + + gtk_ui_manager_add_ui ( + manager, merge_id, path, + gtk_action_get_name (action), + gtk_action_get_name (action), + GTK_UI_MANAGER_AUTO, FALSE); + + list = g_list_delete_link (list, list); + } +} + +void +e_composer_private_init (EMsgComposer *composer) +{ + EMsgComposerPrivate *priv = composer->priv; + + GtkhtmlEditor *editor; + GtkUIManager *manager; + GtkWidget *widget; + GtkWidget *expander; + GtkWidget *container; + gchar *filename; + GError *error = NULL; + + editor = GTKHTML_EDITOR (composer); + manager = gtkhtml_editor_get_ui_manager (editor); + + priv->charset_actions = gtk_action_group_new ("charset"); + priv->composer_actions = gtk_action_group_new ("composer"); + + priv->extra_hdr_names = g_ptr_array_new (); + priv->extra_hdr_values = g_ptr_array_new (); + + priv->gconf_bridge_binding_ids = g_array_new ( + FALSE, FALSE, sizeof (guint)); + + priv->inline_images = g_hash_table_new_full ( + g_str_hash, g_str_equal, + (GDestroyNotify) g_free, + (GDestroyNotify) NULL); + + priv->inline_images_by_url = g_hash_table_new_full ( + g_str_hash, g_str_equal, + (GDestroyNotify) g_free, + (GDestroyNotify) camel_object_unref); + + priv->charset = e_composer_get_default_charset (); + + e_composer_actions_init (composer); + + filename = e_composer_find_data_file ("evolution-composer.ui"); + gtk_ui_manager_add_ui_from_file (manager, filename, &error); + composer_setup_charset_menu (composer); + gtk_ui_manager_ensure_update (manager); + g_free (filename); + + if (error != NULL) { + /* Henceforth, bad things start happening. */ + g_critical ("%s", error->message); + g_clear_error (&error); + } + + /* Construct the header table. */ + + widget = e_composer_header_table_new (); + gtk_container_set_border_width (GTK_CONTAINER (widget), 6); + gtk_box_pack_start (GTK_BOX (editor->vbox), widget, FALSE, FALSE, 0); + gtk_box_reorder_child (GTK_BOX (editor->vbox), widget, 2); + priv->header_table = g_object_ref (widget); + gtk_widget_show (widget); + + /* Construct attachment widgets. + * XXX Move this stuff into a new custom widget. */ + + widget = gtk_expander_new (NULL); + gtk_expander_set_expanded (GTK_EXPANDER (widget), FALSE); + gtk_container_set_border_width (GTK_CONTAINER (widget), 6); + gtk_box_pack_start (GTK_BOX (editor->vbox), widget, FALSE, FALSE, 0); + priv->attachment_expander = g_object_ref (widget); + gtk_widget_show (widget); + expander = widget; + + widget = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy ( + GTK_SCROLLED_WINDOW (widget), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type ( + GTK_SCROLLED_WINDOW (widget), GTK_SHADOW_IN); + gtk_container_add (GTK_CONTAINER (expander), widget); + priv->attachment_scrolled_window = g_object_ref (widget); + gtk_widget_show (widget); + container = widget; + + widget = e_attachment_bar_new (NULL); + GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS); + gtk_container_add (GTK_CONTAINER (container), widget); + priv->attachment_bar = g_object_ref (widget); + gtk_widget_show (widget); + + widget = gtk_hbox_new (FALSE, 0); + gtk_expander_set_label_widget (GTK_EXPANDER (expander), widget); + gtk_widget_show (widget); + container = widget; + + widget = gtk_label_new_with_mnemonic (_("Show _Attachment Bar")); + gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 6); + priv->attachment_expander_label = g_object_ref (widget); + gtk_widget_show (widget); + + widget = gtk_image_new_from_icon_name ( + "mail-attachment", GTK_ICON_SIZE_MENU); + gtk_misc_set_alignment (GTK_MISC (widget), 1.0, 0.5); + gtk_widget_set_size_request (widget, 100, -1); + gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0); + priv->attachment_expander_icon = g_object_ref (widget); + gtk_widget_hide (widget); + + widget = gtk_label_new (NULL); + gtk_label_set_use_markup (GTK_LABEL (widget), TRUE); + gtk_misc_set_alignment (GTK_MISC (widget), 1.0, 0.5); + gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 6); + priv->attachment_expander_num = g_object_ref (widget); + gtk_widget_show (widget); +} + +void +e_composer_private_dispose (EMsgComposer *composer) +{ + GConfBridge *bridge; + GArray *array; + guint binding_id; + + bridge = gconf_bridge_get (); + array = composer->priv->gconf_bridge_binding_ids; + + while (array->len > 0) { + binding_id = g_array_index (array, guint, 0); + gconf_bridge_unbind (bridge, binding_id); + g_array_remove_index_fast (array, 0); + } + + if (composer->priv->header_table != NULL) { + g_object_unref (composer->priv->header_table); + composer->priv->header_table = NULL; + } + + if (composer->priv->charset_actions != NULL) { + g_object_unref (composer->priv->charset_actions); + composer->priv->charset_actions = NULL; + } + + if (composer->priv->composer_actions != NULL) { + g_object_unref (composer->priv->composer_actions); + composer->priv->composer_actions = NULL; + } + + g_hash_table_remove_all (composer->priv->inline_images); + g_hash_table_remove_all (composer->priv->inline_images_by_url); + + if (composer->priv->redirect != NULL) { + camel_object_unref (composer->priv->redirect); + composer->priv->redirect = NULL; + } +} + +void +e_composer_private_finalize (EMsgComposer *composer) +{ + GPtrArray *array; + + array = composer->priv->extra_hdr_names; + g_ptr_array_foreach (array, (GFunc) g_free, NULL); + g_ptr_array_free (array, TRUE); + + array = composer->priv->extra_hdr_values; + g_ptr_array_foreach (array, (GFunc) g_free, NULL); + g_ptr_array_free (array, TRUE); + + g_free (composer->priv->charset); + g_free (composer->priv->mime_type); + g_free (composer->priv->mime_body); + + g_hash_table_destroy (composer->priv->inline_images); + g_hash_table_destroy (composer->priv->inline_images_by_url); +} + +gchar * +e_composer_find_data_file (const gchar *basename) +{ + gchar *filename; + + g_return_val_if_fail (basename != NULL, NULL); + + /* Support running directly from the source tree. */ + filename = g_build_filename (".", basename, NULL); + if (g_file_test (filename, G_FILE_TEST_EXISTS)) + return filename; + g_free (filename); + + /* XXX This is kinda broken. */ + filename = g_build_filename (EVOLUTION_UIDIR, basename, NULL); + if (g_file_test (filename, G_FILE_TEST_EXISTS)) + return filename; + g_free (filename); + + g_critical ("Could not locate '%s'", basename); + + return NULL; +} + +gchar * +e_composer_get_default_charset (void) +{ + GConfClient *client; + gchar *charset; + GError *error = NULL; + + client = gconf_client_get_default (); + + charset = gconf_client_get_string ( + client, COMPOSER_GCONF_CHARSET_KEY, &error); + if (error != NULL) { + g_warning ("%s", error->message); + g_clear_error (&error); + } + + /* See what charset the mailer is using. + * XXX We should not have to know where this lives in GConf. + * Need a mail_config_get_default_charset() that does this. */ + if (!charset || charset[0] == '\0') { + g_free (charset); + charset = gconf_client_get_string ( + client, MAIL_GCONF_CHARSET_KEY, NULL); + if (charset != NULL && *charset == '\0') { + g_free (charset); + charset = NULL; + } else if (error != NULL) { + g_warning ("%s", error->message); + g_clear_error (&error); + } + } + + g_object_unref (client); + + if (charset == NULL) + charset = g_strdup (e_iconv_locale_charset ()); + + if (charset == NULL) + charset = g_strdup ("us-ascii"); + + return charset; +} + |