aboutsummaryrefslogtreecommitdiffstats
path: root/composer/e-composer-header-table.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-header-table.c
parentee50e5d68e4f1a793541f1ee4979818ed4940173 (diff)
downloadgsoc2013-evolution-16068d9b4191ea142a9e75a50eb8d260ed2bb406.tar
gsoc2013-evolution-16068d9b4191ea142a9e75a50eb8d260ed2bb406.tar.gz
gsoc2013-evolution-16068d9b4191ea142a9e75a50eb8d260ed2bb406.tar.bz2
gsoc2013-evolution-16068d9b4191ea142a9e75a50eb8d260ed2bb406.tar.lz
gsoc2013-evolution-16068d9b4191ea142a9e75a50eb8d260ed2bb406.tar.xz
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-header-table.c')
-rw-r--r--composer/e-composer-header-table.c1104
1 files changed, 1104 insertions, 0 deletions
diff --git a/composer/e-composer-header-table.c b/composer/e-composer-header-table.c
new file mode 100644
index 0000000000..5fdff8e1ee
--- /dev/null
+++ b/composer/e-composer-header-table.c
@@ -0,0 +1,1104 @@
+/* -*- 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-header-table.h"
+
+#include <string.h>
+#include <glib/gi18n.h>
+#include <libedataserverui/e-name-selector.h>
+
+#include "e-signature-combo-box.h"
+
+#include "e-composer-from-header.h"
+#include "e-composer-name-header.h"
+#include "e-composer-post-header.h"
+#include "e-composer-text-header.h"
+
+#define E_COMPOSER_HEADER_TABLE_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE \
+ ((obj), E_TYPE_COMPOSER_HEADER_TABLE, EComposerHeaderTablePrivate))
+
+#define E_COMPOSER_HEADER_TABLE_GET_FROM_HEADER(table) \
+ (E_COMPOSER_FROM_HEADER (e_composer_header_table_get_header \
+ (E_COMPOSER_HEADER_TABLE (table), E_COMPOSER_HEADER_FROM)))
+
+#define E_COMPOSER_HEADER_TABLE_GET_REPLY_TO_HEADER(table) \
+ (E_COMPOSER_TEXT_HEADER (e_composer_header_table_get_header \
+ (E_COMPOSER_HEADER_TABLE (table), E_COMPOSER_HEADER_REPLY_TO)))
+
+#define E_COMPOSER_HEADER_TABLE_GET_TO_HEADER(table) \
+ (E_COMPOSER_NAME_HEADER (e_composer_header_table_get_header \
+ (E_COMPOSER_HEADER_TABLE (table), E_COMPOSER_HEADER_TO)))
+
+#define E_COMPOSER_HEADER_TABLE_GET_CC_HEADER(table) \
+ (E_COMPOSER_NAME_HEADER (e_composer_header_table_get_header \
+ (E_COMPOSER_HEADER_TABLE (table), E_COMPOSER_HEADER_CC)))
+
+#define E_COMPOSER_HEADER_TABLE_GET_BCC_HEADER(table) \
+ (E_COMPOSER_NAME_HEADER (e_composer_header_table_get_header \
+ (E_COMPOSER_HEADER_TABLE (table), E_COMPOSER_HEADER_BCC)))
+
+#define E_COMPOSER_HEADER_TABLE_GET_POST_TO_HEADER(table) \
+ (E_COMPOSER_POST_HEADER (e_composer_header_table_get_header \
+ (E_COMPOSER_HEADER_TABLE (table), E_COMPOSER_HEADER_POST_TO)))
+
+#define E_COMPOSER_HEADER_TABLE_GET_SUBJECT_HEADER(table) \
+ (E_COMPOSER_TEXT_HEADER (e_composer_header_table_get_header \
+ (E_COMPOSER_HEADER_TABLE (table), E_COMPOSER_HEADER_SUBJECT)))
+
+#define HEADER_TOOLTIP_TO \
+ _("Enter the recipients of the message")
+#define HEADER_TOOLTIP_CC \
+ _("Enter the addresses that will receive a " \
+ "carbon copy of the message")
+#define HEADER_TOOLTIP_BCC \
+ _("Enter the addresses that will receive a " \
+ "carbon copy of the message without appearing " \
+ "in the recipient list of the message")
+
+enum {
+ PROP_0,
+ PROP_ACCOUNT,
+ PROP_ACCOUNT_LIST,
+ PROP_ACCOUNT_NAME,
+ PROP_DESTINATIONS_BCC,
+ PROP_DESTINATIONS_CC,
+ PROP_DESTINATIONS_TO,
+ PROP_POST_TO,
+ PROP_REPLY_TO,
+ PROP_SIGNATURE,
+ PROP_SIGNATURE_LIST,
+ PROP_SUBJECT
+};
+
+struct _EComposerHeaderTablePrivate {
+ EComposerHeader *headers[E_COMPOSER_NUM_HEADERS];
+ GtkWidget *signature_label;
+ GtkWidget *signature_combo_box;
+ ENameSelector *name_selector;
+};
+
+static gpointer parent_class;
+
+static void
+g_value_set_destinations (GValue *value,
+ EDestination **destinations)
+{
+ GValueArray *value_array;
+ GValue element;
+ gint ii;
+
+ memset (&element, 0, sizeof (GValue));
+ g_value_init (&element, E_TYPE_DESTINATION);
+
+ /* Preallocate some reasonable number. */
+ value_array = g_value_array_new (64);
+
+ for (ii = 0; destinations[ii] != NULL; ii++) {
+ g_value_set_object (&element, destinations[ii]);
+ g_value_array_append (value_array, &element);
+ }
+
+ g_value_take_boxed (value, value_array);
+}
+
+static EDestination **
+g_value_dup_destinations (const GValue *value)
+{
+ EDestination **destinations;
+ GValueArray *value_array;
+ GValue *element;
+ gint ii;
+
+ value_array = g_value_get_boxed (value);
+ destinations = g_new0 (EDestination *, value_array->n_values + 1);
+
+ for (ii = 0; ii < value_array->n_values; ii++) {
+ element = g_value_array_get_nth (value_array, ii);
+ destinations[ii] = g_value_dup_object (element);
+ }
+
+ return destinations;
+}
+
+static void
+g_value_set_string_list (GValue *value,
+ GList *list)
+{
+ GValueArray *value_array;
+ GValue element;
+
+ memset (&element, 0, sizeof (GValue));
+ g_value_init (&element, G_TYPE_STRING);
+
+ value_array = g_value_array_new (g_list_length (list));
+
+ while (list != NULL) {
+ g_value_set_string (&element, list->data);
+ g_value_array_append (value_array, &element);
+ }
+
+ g_value_take_boxed (value, value_array);
+}
+
+static GList *
+g_value_dup_string_list (const GValue *value)
+{
+ GValueArray *value_array;
+ GList *list = NULL;
+ GValue *element;
+ gint ii;
+
+ value_array = g_value_get_boxed (value);
+
+ for (ii = 0; ii < value_array->n_values; ii++) {
+ element = g_value_array_get_nth (value_array, ii);
+ list = g_list_prepend (list, g_value_dup_string (element));
+ }
+
+ return g_list_reverse (list);
+}
+
+static void
+composer_header_table_notify_header (EComposerHeader *header,
+ const gchar *property_name)
+{
+ GtkWidget *parent;
+
+ parent = gtk_widget_get_parent (header->input_widget);
+ g_return_if_fail (E_IS_COMPOSER_HEADER_TABLE (parent));
+ g_object_notify (G_OBJECT (parent), property_name);
+}
+
+static void
+composer_header_table_notify_widget (GtkWidget *widget,
+ const gchar *property_name)
+{
+ GtkWidget *parent;
+
+ parent = gtk_widget_get_parent (widget);
+ g_return_if_fail (E_IS_COMPOSER_HEADER_TABLE (parent));
+ g_object_notify (G_OBJECT (parent), property_name);
+}
+
+static void
+composer_header_table_bind_header (const gchar *property_name,
+ const gchar *signal_name,
+ EComposerHeader *header)
+{
+ /* Propagate the signal as "notify::property_name". */
+
+ g_signal_connect (
+ header, signal_name,
+ G_CALLBACK (composer_header_table_notify_header),
+ (gpointer) property_name);
+}
+
+static void
+composer_header_table_bind_widget (const gchar *property_name,
+ const gchar *signal_name,
+ GtkWidget *widget)
+{
+ /* Propagate the signal as "notify::property_name". */
+
+ g_signal_connect (
+ widget, signal_name,
+ G_CALLBACK (composer_header_table_notify_widget),
+ (gpointer) property_name);
+}
+
+static void
+composer_header_table_from_changed_cb (EComposerHeaderTable *table)
+{
+ EAccount *account;
+ EComposerPostHeader *post_header;
+ EComposerTextHeader *text_header;
+ const gchar *reply_to;
+
+ /* Keep "Post-To" and "Reply-To" synchronized with "From" */
+
+ account = e_composer_header_table_get_account (table);
+
+ post_header = E_COMPOSER_HEADER_TABLE_GET_POST_TO_HEADER (table);
+ e_composer_post_header_set_account (post_header, account);
+
+ reply_to = (account != NULL) ? account->id->reply_to : NULL;
+ text_header = E_COMPOSER_HEADER_TABLE_GET_REPLY_TO_HEADER (table);
+ e_composer_text_header_set_text (text_header, reply_to);
+}
+
+static GObject *
+composer_header_table_constructor (GType type,
+ guint n_construct_properties,
+ GObjectConstructParam *construct_properties)
+{
+ GObject *object;
+ EComposerHeaderTablePrivate *priv;
+ guint rows, ii;
+
+ /* Chain up to parent's constructor() method. */
+ object = G_OBJECT_CLASS (parent_class)->constructor (
+ type, n_construct_properties, construct_properties);
+
+ priv = E_COMPOSER_HEADER_TABLE_GET_PRIVATE (object);
+
+ rows = G_N_ELEMENTS (priv->headers);
+ gtk_table_resize (GTK_TABLE (object), rows, 4);
+ gtk_table_set_row_spacings (GTK_TABLE (object), 0);
+ gtk_table_set_col_spacings (GTK_TABLE (object), 6);
+
+ /* Use "ypadding" instead of "row-spacing" because some rows may
+ * be invisible and we don't want spacing around them. */
+
+ for (ii = 0; ii < rows; ii++) {
+ gtk_table_attach (
+ GTK_TABLE (object), priv->headers[ii]->title_widget,
+ 0, 1, ii, ii + 1, GTK_FILL, GTK_FILL, 0, 3);
+ gtk_table_attach (
+ GTK_TABLE (object), priv->headers[ii]->input_widget,
+ 1, 4, ii, ii + 1, GTK_FILL | GTK_EXPAND, 0, 0, 3);
+ }
+
+ ii = E_COMPOSER_HEADER_FROM;
+
+ /* Leave room in the "From" row for signature stuff. */
+ gtk_container_child_set (
+ GTK_CONTAINER (object),
+ priv->headers[ii]->input_widget,
+ "right-attach", 2, NULL);
+
+ /* Now add the signature stuff. */
+ gtk_table_attach (
+ GTK_TABLE (object), priv->signature_label,
+ 2, 3, ii, ii + 1, 0, 0, 0, 3);
+ gtk_table_attach (
+ GTK_TABLE (object), priv->signature_combo_box,
+ 3, 4, ii, ii + 1, 0, 0, 0, 3);
+
+ return object;
+}
+
+static void
+composer_header_table_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ EDestination **destinations;
+ GList *list;
+
+ switch (property_id) {
+ case PROP_ACCOUNT:
+ e_composer_header_table_set_account (
+ E_COMPOSER_HEADER_TABLE (object),
+ g_value_get_object (value));
+ return;
+
+ case PROP_ACCOUNT_LIST:
+ e_composer_header_table_set_account_list (
+ E_COMPOSER_HEADER_TABLE (object),
+ g_value_get_object (value));
+ return;
+
+ case PROP_ACCOUNT_NAME:
+ e_composer_header_table_set_account_name (
+ E_COMPOSER_HEADER_TABLE (object),
+ g_value_get_string (value));
+ return;
+
+ case PROP_DESTINATIONS_BCC:
+ destinations = g_value_dup_destinations (value);
+ e_composer_header_table_set_destinations_bcc (
+ E_COMPOSER_HEADER_TABLE (object),
+ destinations);
+ e_destination_freev (destinations);
+ return;
+
+ case PROP_DESTINATIONS_CC:
+ destinations = g_value_dup_destinations (value);
+ e_composer_header_table_set_destinations_cc (
+ E_COMPOSER_HEADER_TABLE (object),
+ destinations);
+ e_destination_freev (destinations);
+ return;
+
+ case PROP_DESTINATIONS_TO:
+ destinations = g_value_dup_destinations (value);
+ e_composer_header_table_set_destinations_to (
+ E_COMPOSER_HEADER_TABLE (object),
+ destinations);
+ e_destination_freev (destinations);
+ return;
+
+ case PROP_POST_TO:
+ list = g_value_dup_string_list (value);
+ e_composer_header_table_set_post_to_list (
+ E_COMPOSER_HEADER_TABLE (object), list);
+ g_list_foreach (list, (GFunc) g_free, NULL);
+ g_list_free (list);
+ return;
+
+ case PROP_REPLY_TO:
+ e_composer_header_table_set_reply_to (
+ E_COMPOSER_HEADER_TABLE (object),
+ g_value_get_string (value));
+ return;
+
+ case PROP_SIGNATURE:
+ e_composer_header_table_set_signature (
+ E_COMPOSER_HEADER_TABLE (object),
+ g_value_get_object (value));
+ return;
+
+ case PROP_SIGNATURE_LIST:
+ e_composer_header_table_set_signature_list (
+ E_COMPOSER_HEADER_TABLE (object),
+ g_value_get_object (value));
+ return;
+
+ case PROP_SUBJECT:
+ e_composer_header_table_set_subject (
+ E_COMPOSER_HEADER_TABLE (object),
+ g_value_get_string (value));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+composer_header_table_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ EDestination **destinations;
+ GList *list;
+
+ switch (property_id) {
+ case PROP_ACCOUNT:
+ g_value_set_object (
+ value,
+ e_composer_header_table_get_account (
+ E_COMPOSER_HEADER_TABLE (object)));
+ return;
+
+ case PROP_ACCOUNT_LIST:
+ g_value_set_object (
+ value,
+ e_composer_header_table_get_account_list (
+ E_COMPOSER_HEADER_TABLE (object)));
+ return;
+
+ case PROP_ACCOUNT_NAME:
+ g_value_set_string (
+ value,
+ e_composer_header_table_get_account_name (
+ E_COMPOSER_HEADER_TABLE (object)));
+ return;
+
+ case PROP_DESTINATIONS_BCC:
+ destinations =
+ e_composer_header_table_get_destinations_bcc (
+ E_COMPOSER_HEADER_TABLE (object));
+ g_value_set_destinations (value, destinations);
+ e_destination_freev (destinations);
+ return;
+
+ case PROP_DESTINATIONS_CC:
+ destinations =
+ e_composer_header_table_get_destinations_cc (
+ E_COMPOSER_HEADER_TABLE (object));
+ g_value_set_destinations (value, destinations);
+ e_destination_freev (destinations);
+ return;
+
+ case PROP_DESTINATIONS_TO:
+ destinations =
+ e_composer_header_table_get_destinations_to (
+ E_COMPOSER_HEADER_TABLE (object));
+ g_value_set_destinations (value, destinations);
+ e_destination_freev (destinations);
+ return;
+
+ case PROP_POST_TO:
+ list = e_composer_header_table_get_post_to (
+ E_COMPOSER_HEADER_TABLE (object));
+ g_value_set_string_list (value, list);
+ g_list_foreach (list, (GFunc) g_free, NULL);
+ g_list_free (list);
+ return;
+
+ case PROP_REPLY_TO:
+ g_value_set_string (
+ value,
+ e_composer_header_table_get_reply_to (
+ E_COMPOSER_HEADER_TABLE (object)));
+ return;
+
+ case PROP_SIGNATURE:
+ g_value_set_object (
+ value,
+ e_composer_header_table_get_signature (
+ E_COMPOSER_HEADER_TABLE (object)));
+ return;
+
+ case PROP_SIGNATURE_LIST:
+ g_value_set_object (
+ value,
+ e_composer_header_table_get_signature_list (
+ E_COMPOSER_HEADER_TABLE (object)));
+ return;
+
+ case PROP_SUBJECT:
+ g_value_set_string (
+ value,
+ e_composer_header_table_get_subject (
+ E_COMPOSER_HEADER_TABLE (object)));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+composer_header_table_dispose (GObject *object)
+{
+ EComposerHeaderTablePrivate *priv;
+ gint ii;
+
+ priv = E_COMPOSER_HEADER_TABLE_GET_PRIVATE (object);
+
+ for (ii = 0; ii < G_N_ELEMENTS (priv->headers); ii++) {
+ if (priv->headers[ii] != NULL) {
+ g_object_unref (priv->headers[ii]);
+ priv->headers[ii] = NULL;
+ }
+ }
+
+ if (priv->signature_combo_box != NULL) {
+ g_object_unref (priv->signature_combo_box);
+ priv->signature_combo_box = NULL;
+ }
+
+ if (priv->name_selector != NULL) {
+ g_object_unref (priv->name_selector);
+ priv->name_selector = NULL;
+ }
+
+ /* Chain up to parent's dispose() method. */
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+composer_header_table_class_init (EComposerHeaderTableClass *class)
+{
+ GObjectClass *object_class;
+ GParamSpec *element_spec;
+
+ parent_class = g_type_class_peek_parent (class);
+ g_type_class_add_private (class, sizeof (EComposerHeaderTablePrivate));
+
+ object_class = G_OBJECT_CLASS (class);
+ object_class->constructor = composer_header_table_constructor;
+ object_class->set_property = composer_header_table_set_property;
+ object_class->get_property = composer_header_table_get_property;
+ object_class->dispose = composer_header_table_dispose;
+
+ g_object_class_install_property (
+ object_class,
+ PROP_ACCOUNT,
+ g_param_spec_object (
+ "account",
+ NULL,
+ NULL,
+ E_TYPE_ACCOUNT,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_ACCOUNT_LIST,
+ g_param_spec_object (
+ "account-list",
+ NULL,
+ NULL,
+ E_TYPE_ACCOUNT_LIST,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_ACCOUNT_NAME,
+ g_param_spec_string (
+ "account-name",
+ NULL,
+ NULL,
+ NULL,
+ G_PARAM_READWRITE));
+
+ /* floating reference */
+ element_spec = g_param_spec_object (
+ "value-array-element",
+ NULL,
+ NULL,
+ E_TYPE_DESTINATION,
+ G_PARAM_READWRITE);
+
+ g_object_class_install_property (
+ object_class,
+ PROP_DESTINATIONS_BCC,
+ g_param_spec_value_array (
+ "destinations-bcc",
+ NULL,
+ NULL,
+ element_spec,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_DESTINATIONS_CC,
+ g_param_spec_value_array (
+ "destinations-cc",
+ NULL,
+ NULL,
+ element_spec,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_DESTINATIONS_TO,
+ g_param_spec_value_array (
+ "destinations-to",
+ NULL,
+ NULL,
+ element_spec,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_REPLY_TO,
+ g_param_spec_string (
+ "reply-to",
+ NULL,
+ NULL,
+ NULL,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_SIGNATURE,
+ g_param_spec_object (
+ "signature",
+ NULL,
+ NULL,
+ E_TYPE_SIGNATURE,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_SIGNATURE_LIST,
+ g_param_spec_object (
+ "signature-list",
+ NULL,
+ NULL,
+ E_TYPE_SIGNATURE_LIST,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_SUBJECT,
+ g_param_spec_string (
+ "subject",
+ NULL,
+ NULL,
+ NULL,
+ G_PARAM_READWRITE));
+}
+
+static void
+composer_header_table_init (EComposerHeaderTable *table)
+{
+ EComposerHeader *header;
+ ENameSelector *name_selector;
+ GtkWidget *widget;
+
+ table->priv = E_COMPOSER_HEADER_TABLE_GET_PRIVATE (table);
+
+ name_selector = e_name_selector_new ();
+ table->priv->name_selector = name_selector;
+
+ header = e_composer_from_header_new (_("Fr_om:"));
+ composer_header_table_bind_header ("account", "changed", header);
+ composer_header_table_bind_header ("account-list", "refreshed", header);
+ composer_header_table_bind_header ("account-name", "changed", header);
+ g_signal_connect_swapped (
+ header, "changed", G_CALLBACK (
+ composer_header_table_from_changed_cb), table);
+ table->priv->headers[E_COMPOSER_HEADER_FROM] = header;
+
+ header = e_composer_text_header_new_label (_("_Reply-To:"));
+ composer_header_table_bind_header ("reply-to", "changed", header);
+ table->priv->headers[E_COMPOSER_HEADER_REPLY_TO] = header;
+
+ header = e_composer_name_header_new (_("_To:"), name_selector);
+ e_composer_header_set_input_tooltip (header, HEADER_TOOLTIP_TO);
+ composer_header_table_bind_header ("destinations-to", "changed", header);
+ table->priv->headers[E_COMPOSER_HEADER_TO] = header;
+
+ header = e_composer_name_header_new (_("_Cc:"), name_selector);
+ e_composer_header_set_input_tooltip (header, HEADER_TOOLTIP_CC);
+ composer_header_table_bind_header ("destinations-cc", "changed", header);
+ table->priv->headers[E_COMPOSER_HEADER_CC] = header;
+
+ header = e_composer_name_header_new (_("_Bcc:"), name_selector);
+ e_composer_header_set_input_tooltip (header, HEADER_TOOLTIP_BCC);
+ composer_header_table_bind_header ("destinations-bcc", "changed", header);
+ table->priv->headers[E_COMPOSER_HEADER_BCC] = header;
+
+ header = e_composer_post_header_new (_("_Post To:"));
+ composer_header_table_bind_header ("post-to", "changed", header);
+ table->priv->headers[E_COMPOSER_HEADER_POST_TO] = header;
+
+ header = e_composer_text_header_new_label (_("S_ubject:"));
+ composer_header_table_bind_header ("subject", "changed", header);
+ table->priv->headers[E_COMPOSER_HEADER_SUBJECT] = header;
+
+ widget = e_signature_combo_box_new ();
+ composer_header_table_bind_widget ("signature", "changed", widget);
+ composer_header_table_bind_widget ("signature-list", "refreshed", widget);
+ table->priv->signature_combo_box = g_object_ref_sink (widget);
+
+ widget = gtk_label_new_with_mnemonic (_("Si_gnature:"));
+ gtk_label_set_mnemonic_widget (
+ GTK_LABEL (widget), table->priv->signature_combo_box);
+ table->priv->signature_label = g_object_ref_sink (widget);
+}
+
+GType
+e_composer_header_table_get_type (void)
+{
+ static GType type = 0;
+
+ if (G_UNLIKELY (type == 0)) {
+ static const GTypeInfo type_info = {
+ sizeof (EComposerHeaderTableClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) composer_header_table_class_init,
+ (GClassFinalizeFunc) NULL,
+ NULL, /* class_data */
+ sizeof (EComposerHeaderTable),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) composer_header_table_init,
+ NULL /* value_table */
+ };
+
+ type = g_type_register_static (
+ GTK_TYPE_TABLE, "EComposerHeaderTable", &type_info, 0);
+ }
+
+ return type;
+}
+
+GtkWidget *
+e_composer_header_table_new (void)
+{
+ return g_object_new (E_TYPE_COMPOSER_HEADER_TABLE, NULL);
+}
+
+EComposerHeader *
+e_composer_header_table_get_header (EComposerHeaderTable *table,
+ EComposerHeaderType type)
+{
+ g_return_val_if_fail (E_IS_COMPOSER_HEADER_TABLE (table), NULL);
+ g_return_val_if_fail (type < E_COMPOSER_NUM_HEADERS, NULL);
+ g_return_val_if_fail (type >= 0, NULL);
+
+ return table->priv->headers[type];
+}
+
+gboolean
+e_composer_header_table_get_header_visible (EComposerHeaderTable *table,
+ EComposerHeaderType type)
+{
+ EComposerHeader *header;
+
+ header = e_composer_header_table_get_header (table, type);
+ return e_composer_header_get_visible (header);
+}
+
+void
+e_composer_header_table_set_header_visible (EComposerHeaderTable *table,
+ EComposerHeaderType type,
+ gboolean visible)
+{
+ EComposerHeader *header;
+
+ header = e_composer_header_table_get_header (table, type);
+ e_composer_header_set_visible (header, visible);
+
+ /* Signature widgets track the "From" header. */
+ if (type == E_COMPOSER_HEADER_FROM) {
+ if (visible) {
+ gtk_widget_show (table->priv->signature_label);
+ gtk_widget_show (table->priv->signature_combo_box);
+ } else {
+ gtk_widget_hide (table->priv->signature_label);
+ gtk_widget_hide (table->priv->signature_combo_box);
+ }
+ }
+}
+
+gboolean
+e_composer_header_table_get_header_sensitive (EComposerHeaderTable *table,
+ EComposerHeaderType type)
+{
+ EComposerHeader *header;
+
+ header = e_composer_header_table_get_header (table, type);
+ return e_composer_header_get_sensitive (header);
+}
+
+void
+e_composer_header_table_set_header_sensitive (EComposerHeaderTable *table,
+ EComposerHeaderType type,
+ gboolean sensitive)
+{
+ EComposerHeader *header;
+
+ header = e_composer_header_table_get_header (table, type);
+ e_composer_header_set_sensitive (header, sensitive);
+}
+
+EAccount *
+e_composer_header_table_get_account (EComposerHeaderTable *table)
+{
+ EComposerFromHeader *header;
+
+ g_return_val_if_fail (E_IS_COMPOSER_HEADER_TABLE (table), NULL);
+
+ header = E_COMPOSER_HEADER_TABLE_GET_FROM_HEADER (table);
+ return e_composer_from_header_get_active (header);
+}
+
+gboolean
+e_composer_header_table_set_account (EComposerHeaderTable *table,
+ EAccount *account)
+{
+ EComposerFromHeader *header;
+
+ g_return_val_if_fail (E_IS_COMPOSER_HEADER_TABLE (table), FALSE);
+
+ header = E_COMPOSER_HEADER_TABLE_GET_FROM_HEADER (table);
+ return e_composer_from_header_set_active (header, account);
+}
+
+EAccountList *
+e_composer_header_table_get_account_list (EComposerHeaderTable *table)
+{
+ EComposerFromHeader *header;
+
+ g_return_val_if_fail (E_IS_COMPOSER_HEADER_TABLE (table), NULL);
+
+ header = E_COMPOSER_HEADER_TABLE_GET_FROM_HEADER (table);
+ return e_composer_from_header_get_account_list (header);
+}
+
+void
+e_composer_header_table_set_account_list (EComposerHeaderTable *table,
+ EAccountList *account_list)
+{
+ EComposerFromHeader *header;
+
+ g_return_if_fail (E_IS_COMPOSER_HEADER_TABLE (table));
+
+ header = E_COMPOSER_HEADER_TABLE_GET_FROM_HEADER (table);
+ e_composer_from_header_set_account_list (header, account_list);
+}
+
+const gchar *
+e_composer_header_table_get_account_name (EComposerHeaderTable *table)
+{
+ EComposerFromHeader *header;
+
+ g_return_val_if_fail (E_IS_COMPOSER_HEADER_TABLE (table), NULL);
+
+ header = E_COMPOSER_HEADER_TABLE_GET_FROM_HEADER (table);
+ return e_composer_from_header_get_active_name (header);
+}
+
+gboolean
+e_composer_header_table_set_account_name (EComposerHeaderTable *table,
+ const gchar *account_name)
+{
+ EComposerFromHeader *header;
+
+ g_return_val_if_fail (E_IS_COMPOSER_HEADER_TABLE (table), FALSE);
+
+ header = E_COMPOSER_HEADER_TABLE_GET_FROM_HEADER (table);
+ return e_composer_from_header_set_active_name (header, account_name);
+}
+
+EDestination **
+e_composer_header_table_get_destinations (EComposerHeaderTable *table)
+{
+ EDestination **destinations;
+ EDestination **to, **cc, **bcc;
+ gint total, n_to, n_cc, n_bcc;
+
+ g_return_val_if_fail (E_IS_COMPOSER_HEADER_TABLE (table), NULL);
+
+ to = e_composer_header_table_get_destinations_to (table);
+ for (n_to = 0; to != NULL && to[n_to] != NULL; n_to++);
+
+ cc = e_composer_header_table_get_destinations_cc (table);
+ for (n_cc = 0; cc != NULL && cc[n_cc] != NULL; n_cc++);
+
+ bcc = e_composer_header_table_get_destinations_bcc (table);
+ for (n_bcc = 0; bcc != NULL && bcc[n_bcc] != NULL; n_bcc++);
+
+ total = n_to + n_cc + n_bcc;
+ destinations = g_new0 (EDestination *, total + 1);
+
+ while (n_bcc > 0 && total > 0)
+ destinations[--total] = g_object_ref (bcc[--n_bcc]);
+
+ while (n_cc > 0 && total > 0)
+ destinations[--total] = g_object_ref (cc[--n_cc]);
+
+ while (n_to > 0 && total > 0)
+ destinations[--total] = g_object_ref (to[--n_to]);
+
+ /* Counters should all be zero now. */
+ g_assert (total == 0 && n_to == 0 && n_cc == 0 && n_bcc == 0);
+
+ e_destination_freev (to);
+ e_destination_freev (cc);
+ e_destination_freev (bcc);
+
+ return destinations;
+}
+
+EDestination **
+e_composer_header_table_get_destinations_bcc (EComposerHeaderTable *table)
+{
+ EComposerNameHeader *header;
+
+ g_return_val_if_fail (E_IS_COMPOSER_HEADER_TABLE (table), NULL);
+
+ header = E_COMPOSER_HEADER_TABLE_GET_BCC_HEADER (table);
+ return e_composer_name_header_get_destinations (header);
+}
+
+void
+e_composer_header_table_set_destinations_bcc (EComposerHeaderTable *table,
+ EDestination **destinations)
+{
+ EComposerNameHeader *header;
+
+ g_return_if_fail (E_IS_COMPOSER_HEADER_TABLE (table));
+
+ header = E_COMPOSER_HEADER_TABLE_GET_BCC_HEADER (table);
+ e_composer_name_header_set_destinations (header, destinations);
+
+ if (destinations != NULL && *destinations != NULL)
+ e_composer_header_table_set_header_visible (
+ table, E_COMPOSER_HEADER_BCC, TRUE);
+}
+
+EDestination **
+e_composer_header_table_get_destinations_cc (EComposerHeaderTable *table)
+{
+ EComposerNameHeader *header;
+
+ g_return_val_if_fail (E_IS_COMPOSER_HEADER_TABLE (table), NULL);
+
+ header = E_COMPOSER_HEADER_TABLE_GET_CC_HEADER (table);
+ return e_composer_name_header_get_destinations (header);
+}
+
+void
+e_composer_header_table_set_destinations_cc (EComposerHeaderTable *table,
+ EDestination **destinations)
+{
+ EComposerNameHeader *header;
+
+ g_return_if_fail (E_IS_COMPOSER_HEADER_TABLE (table));
+
+ header = E_COMPOSER_HEADER_TABLE_GET_CC_HEADER (table);
+ e_composer_name_header_set_destinations (header, destinations);
+
+ if (destinations != NULL && *destinations != NULL)
+ e_composer_header_table_set_header_visible (
+ table, E_COMPOSER_HEADER_CC, TRUE);
+}
+
+EDestination **
+e_composer_header_table_get_destinations_to (EComposerHeaderTable *table)
+{
+ EComposerNameHeader *header;
+
+ g_return_val_if_fail (E_IS_COMPOSER_HEADER_TABLE (table), NULL);
+
+ header = E_COMPOSER_HEADER_TABLE_GET_TO_HEADER (table);
+ return e_composer_name_header_get_destinations (header);
+}
+
+void
+e_composer_header_table_set_destinations_to (EComposerHeaderTable *table,
+ EDestination **destinations)
+{
+ EComposerNameHeader *header;
+
+ g_return_if_fail (E_IS_COMPOSER_HEADER_TABLE (table));
+
+ header = E_COMPOSER_HEADER_TABLE_GET_TO_HEADER (table);
+ e_composer_name_header_set_destinations (header, destinations);
+}
+
+GList *
+e_composer_header_table_get_post_to (EComposerHeaderTable *table)
+{
+ EComposerPostHeader *header;
+
+ g_return_val_if_fail (E_IS_COMPOSER_HEADER_TABLE (table), NULL);
+
+ header = E_COMPOSER_HEADER_TABLE_GET_POST_TO_HEADER (table);
+ return e_composer_post_header_get_folders (header);
+}
+
+void
+e_composer_header_table_set_post_to_base (EComposerHeaderTable *table,
+ const gchar *base_url,
+ const gchar *folders)
+{
+ EComposerPostHeader *header;
+
+ g_return_if_fail (E_IS_COMPOSER_HEADER_TABLE (table));
+
+ header = E_COMPOSER_HEADER_TABLE_GET_POST_TO_HEADER (table);
+ e_composer_post_header_set_folders_base (header, base_url, folders);
+}
+
+void
+e_composer_header_table_set_post_to_list (EComposerHeaderTable *table,
+ GList *folders)
+{
+ EComposerPostHeader *header;
+
+ g_return_if_fail (E_IS_COMPOSER_HEADER_TABLE (table));
+
+ header = E_COMPOSER_HEADER_TABLE_GET_POST_TO_HEADER (table);
+ e_composer_post_header_set_folders (header, folders);
+}
+
+const gchar *
+e_composer_header_table_get_reply_to (EComposerHeaderTable *table)
+{
+ EComposerTextHeader *header;
+
+ g_return_val_if_fail (E_IS_COMPOSER_HEADER_TABLE (table), NULL);
+
+ header = E_COMPOSER_HEADER_TABLE_GET_REPLY_TO_HEADER (table);
+ return e_composer_text_header_get_text (header);
+}
+
+void
+e_composer_header_table_set_reply_to (EComposerHeaderTable *table,
+ const gchar *reply_to)
+{
+ EComposerTextHeader *header;
+
+ g_return_if_fail (E_IS_COMPOSER_HEADER_TABLE (table));
+
+ header = E_COMPOSER_HEADER_TABLE_GET_REPLY_TO_HEADER (table);
+ e_composer_text_header_set_text (header, reply_to);
+
+ if (reply_to != NULL && *reply_to != '\0')
+ e_composer_header_table_set_header_visible (
+ table, E_COMPOSER_HEADER_REPLY_TO, TRUE);
+}
+
+ESignature *
+e_composer_header_table_get_signature (EComposerHeaderTable *table)
+{
+ ESignatureComboBox *combo_box;
+
+ g_return_val_if_fail (E_IS_COMPOSER_HEADER_TABLE (table), NULL);
+
+ combo_box = E_SIGNATURE_COMBO_BOX (table->priv->signature_combo_box);
+ return e_signature_combo_box_get_active (combo_box);
+}
+
+gboolean
+e_composer_header_table_set_signature (EComposerHeaderTable *table,
+ ESignature *signature)
+{
+ ESignatureComboBox *combo_box;
+
+ g_return_val_if_fail (E_IS_COMPOSER_HEADER_TABLE (table), FALSE);
+
+ combo_box = E_SIGNATURE_COMBO_BOX (table->priv->signature_combo_box);
+ return e_signature_combo_box_set_active (combo_box, signature);
+}
+
+ESignatureList *
+e_composer_header_table_get_signature_list (EComposerHeaderTable *table)
+{
+ ESignatureComboBox *combo_box;
+
+ g_return_val_if_fail (E_IS_COMPOSER_HEADER_TABLE (table), NULL);
+
+ combo_box = E_SIGNATURE_COMBO_BOX (table->priv->signature_combo_box);
+ return e_signature_combo_box_get_signature_list (combo_box);
+}
+
+void
+e_composer_header_table_set_signature_list (EComposerHeaderTable *table,
+ ESignatureList *signature_list)
+{
+ ESignatureComboBox *combo_box;
+
+ g_return_if_fail (E_IS_COMPOSER_HEADER_TABLE (table));
+
+ combo_box = E_SIGNATURE_COMBO_BOX (table->priv->signature_combo_box);
+ e_signature_combo_box_set_signature_list (combo_box, signature_list);
+}
+
+const gchar *
+e_composer_header_table_get_subject (EComposerHeaderTable *table)
+{
+ EComposerTextHeader *header;
+
+ g_return_val_if_fail (E_IS_COMPOSER_HEADER_TABLE (table), NULL);
+
+ header = E_COMPOSER_HEADER_TABLE_GET_SUBJECT_HEADER (table);
+ return e_composer_text_header_get_text (header);
+}
+
+void
+e_composer_header_table_set_subject (EComposerHeaderTable *table,
+ const gchar *subject)
+{
+ EComposerTextHeader *header;
+
+ g_return_if_fail (E_IS_COMPOSER_HEADER_TABLE (table));
+
+ header = E_COMPOSER_HEADER_TABLE_GET_SUBJECT_HEADER (table);
+ e_composer_text_header_set_text (header, subject);
+}