aboutsummaryrefslogtreecommitdiffstats
path: root/composer/e-composer-private.c
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2008-04-03 02:37:22 +0800
committerMatthew Barnes <mbarnes@src.gnome.org>2008-04-03 02:37:22 +0800
commit16068d9b4191ea142a9e75a50eb8d260ed2bb406 (patch)
tree835a7909cd8b352d8c414986f1f5e27697b4de98 /composer/e-composer-private.c
parentee50e5d68e4f1a793541f1ee4979818ed4940173 (diff)
downloadgsoc2013-evolution-16068d9b4191ea142a9e75a50eb8d260ed2bb406.tar.gz
gsoc2013-evolution-16068d9b4191ea142a9e75a50eb8d260ed2bb406.tar.zst
gsoc2013-evolution-16068d9b4191ea142a9e75a50eb8d260ed2bb406.zip
** Merge the mbarnes-composer branch
2008-04-02 Matthew Barnes <mbarnes@redhat.com> ** Merge the mbarnes-composer branch * configure.in: Bump libgtkhtml requirement to 3.19.1. Add gtkhtml-editor dependency for addressbook, calendar and mail. Remove print-message plugin; new composer implements this natively. * tools/Makefile.am: Remove CORBA rules for the old composer. * addressbook/gui/widgets/Makefile.am: Remove CORBA rules for the old composer. * addressbook/gui/widgets/eab-gui-util.c (eab_send_to_contact_and_email_num_list), (eab_send_contact_list_as_attachment): Adapt to new Bonobo-less composer widget. * calendar/gui/Makefile.am: Remove CORBA rules for the old composer. * calendar/gui/itip-utils.c (comp_from), (comp_to_list), (comp_subject), (comp_content_type), (comp_filename), (comp_description), (append_cal_attachments), (itip_send_comp), (reply_to_calendar_comp): Adapt to new Bonobo-less composer widget. * composer/Makefile.am: Remove CORBA rules for the old composer. * composer/e-msg-composer.c: * composer/e-msg-composer.h: EMsgComposer is now a subclass of GtkhtmlEditor. Extensive refactoring and cleanup, too much to list in detail. * composer/e-composer-header.c: * composer/e-composer-header.h: Add "sensitive" property along with get/set functions. * composer/e-composer-from-header.c: * composer/e-composer-from-header.h: Propagate "refreshed" signal from EAccountComboBox. Add function e_composer_from_header_get_account_list(). * composer/e-composer-private.c: * composer/e-composer-private.h: New files manage composer's private data. Allows other composer files to manipulate private data. * composer/e-msg-composer-hdrs.c: * composer/e-msg-composer-hdrs.h: Remove these files; replaced by EComposerHeaderTable widget. * composer/evolution-composer.c: * composer/evolution-composer.h: Remove these files; composer is now a subclass of GtkhtmlEditor. * composer/e-msg-composer-select-file.c: * composer/e-msg-composer-select-file.h: Remove these files; logic moved to e-msg-composer.c. * composer/listener.c: * composer/listener.h: Remove these files; event handlers moved to e-msg-composer.c. * composer/Composer.idl: * composer/Evolution-Composer.idl: Remove these files; composer is no longer a Bonobo object. * mail/em-composer-prefs (sig_edit_cb), (em_composer_prefs_new_signature): Adapt to new Bonobo-less signature editor. * mail/mail-signature-editor.c: * mail/mail-signature-editor.h: Rewrite the signature editor as a subclass of GtkhtmlEditor. Eliminates Bonobo from the equation. * mail/em-composer-utils.c (composer_get_message), (em_utils_composer_send_cb), (save_draft_done), (em_utils_composer_save_draft_cb), (create_new_composer), (em_utils_compose_new_message), (em_utils_compose_new_message_with_mailto), (em_utils_post_to_folder), (em_utils_post_to_url), (edit_message), (forward_attached), (forward_non_attached), (reply_get_composer), (composer_set_body), (em_utils_reply_to_message), (post_reply_to_message): Adapt to new Bonobo-less composer. * mail/mail-component-factory.c: Composer is no longer needs a Bonobo factory. * mail/mail-config.c: Fix style pattern for EMsgComposer widgets. * plugins/groupwise/mail-send-options.c (org_gnome_composer_send_options): Adapt to streamlined EMsgComposer API. * plugins/exchange-operations/Makefile.am: Add EVOLUTION_MAIL_CFLAGS and EVOLUTION_MAIL_LIBS. * plugins/exchange-operations/exchange-mail-send-options.c (append_to_header), (org_gnome_exchange_send_options): Adapt to streamlined EMsgComposer API. * plugins/mailing-list-actions/mailing-list-actions.c (emla_list_action_do): Adapt to streamlined EMsgComposer API. * po/POTFILES.in: Update file list for new composer. * ui/evolution-composer-entries.xml: Remove this file; obsoleted by new composer. * widgets/misc/Makefile.am: Add EVOLUTION_MAIL_LIBS. * widgets/misc/e-account-combo-box.c: * widgets/misc/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. * widgets/misc/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(). * widgets/misc/e-signature-combo-box.c: * widgets/misc/e-signature-combo-box.h: New function e_signature_combo_box_get_signature_list(). ... separate issue ... * configure.in: Bump eds_minimum_version to 2.23.1 for CAMEL_FOLDER_JUNKED_NOT_DELETED symbol. svn path=/trunk/; revision=35313
Diffstat (limited to 'composer/e-composer-private.c')
-rw-r--r--composer/e-composer-private.c290
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;
+}
+