diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2008-04-03 02:37:22 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@src.gnome.org> | 2008-04-03 02:37:22 +0800 |
commit | 16068d9b4191ea142a9e75a50eb8d260ed2bb406 (patch) | |
tree | 835a7909cd8b352d8c414986f1f5e27697b4de98 /composer/e-composer-private.c | |
parent | ee50e5d68e4f1a793541f1ee4979818ed4940173 (diff) | |
download | gsoc2013-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.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; +} + |