diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2009-05-21 00:02:30 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2009-05-21 00:56:55 +0800 |
commit | a1f287ca6bf35d27e5dcb9b89a10f76e9abbd057 (patch) | |
tree | cfc2fe1694a379a53e533d19edcf1205e55d54e5 /composer | |
parent | acabcb0be8e3c983e3400d7f7436f618e0000cfe (diff) | |
download | gsoc2013-evolution-a1f287ca6bf35d27e5dcb9b89a10f76e9abbd057.tar.gz gsoc2013-evolution-a1f287ca6bf35d27e5dcb9b89a10f76e9abbd057.tar.zst gsoc2013-evolution-a1f287ca6bf35d27e5dcb9b89a10f76e9abbd057.zip |
Bug 274117 – Difficult to post a new message to newsgroups
Completely rewrite how composer headers are managed. There's now two
sets of headers (with some overlap): one set is for sending an email
message, the other is for posting to a newsgroup. The correct set of
headers is chosen on-the-fly based on the currently selected account
type. The user's "view" preferences for these two sets are stored
separately, so that switching between an email account and a news
account will no longer stomp on your preferences.
This also eliminates the need for the "Post New Message to Folder" and
"Post a Reply" actions, so they've been removed. Usenet users can now
just highlight a newsgroup in the folder tree and click New or Reply,
and the composer window will show the correct set of headers with the
Post-To field filled in automatically.
Comment #6 in the bug discusses other standard news reader behaviors we
still don't get right, particularly the missing "Followup To" header.
These will be dealt with separately.
Diffstat (limited to 'composer')
-rw-r--r-- | composer/e-composer-actions.c | 132 | ||||
-rw-r--r-- | composer/e-composer-actions.h | 6 | ||||
-rw-r--r-- | composer/e-composer-header-table.c | 547 | ||||
-rw-r--r-- | composer/e-composer-header-table.h | 14 | ||||
-rw-r--r-- | composer/e-composer-header.c | 30 | ||||
-rw-r--r-- | composer/e-composer-header.h | 2 | ||||
-rw-r--r-- | composer/e-composer-private.c | 41 | ||||
-rw-r--r-- | composer/e-composer-private.h | 11 | ||||
-rw-r--r-- | composer/e-msg-composer.c | 177 | ||||
-rw-r--r-- | composer/e-msg-composer.h | 5 | ||||
-rw-r--r-- | composer/evolution-composer.ui | 7 |
11 files changed, 459 insertions, 513 deletions
diff --git a/composer/e-composer-actions.c b/composer/e-composer-actions.c index 56ec7c5db1..247ac7794f 100644 --- a/composer/e-composer-actions.c +++ b/composer/e-composer-actions.c @@ -308,104 +308,6 @@ action_smime_sign_cb (GtkToggleAction *action, gtkhtml_editor_set_changed (editor, TRUE); } -static void -action_view_bcc_cb (GtkToggleAction *action, - EMsgComposer *composer) -{ - EComposerHeaderTable *table; - gboolean active; - - table = e_msg_composer_get_header_table (composer); - active = gtk_toggle_action_get_active (action); - - e_composer_header_table_set_header_visible ( - table, E_COMPOSER_HEADER_BCC, active); -} - -static void -action_view_cc_cb (GtkToggleAction *action, - EMsgComposer *composer) -{ - EComposerHeaderTable *table; - gboolean active; - - table = e_msg_composer_get_header_table (composer); - active = gtk_toggle_action_get_active (action); - - e_composer_header_table_set_header_visible ( - table, E_COMPOSER_HEADER_CC, active); -} - -static void -action_view_from_cb (GtkToggleAction *action, - EMsgComposer *composer) -{ - EComposerHeaderTable *table; - gboolean active; - - table = e_msg_composer_get_header_table (composer); - active = gtk_toggle_action_get_active (action); - - e_composer_header_table_set_header_visible ( - table, E_COMPOSER_HEADER_FROM, active); -} - -static void -action_view_post_to_cb (GtkToggleAction *action, - EMsgComposer *composer) -{ - EComposerHeaderTable *table; - gboolean active; - - table = e_msg_composer_get_header_table (composer); - active = gtk_toggle_action_get_active (action); - - e_composer_header_table_set_header_visible ( - table, E_COMPOSER_HEADER_POST_TO, active); -} - -static void -action_view_reply_to_cb (GtkToggleAction *action, - EMsgComposer *composer) -{ - EComposerHeaderTable *table; - gboolean active; - - table = e_msg_composer_get_header_table (composer); - active = gtk_toggle_action_get_active (action); - - e_composer_header_table_set_header_visible ( - table, E_COMPOSER_HEADER_REPLY_TO, active); -} - -static void -action_view_subject_cb (GtkToggleAction *action, - EMsgComposer *composer) -{ - EComposerHeaderTable *table; - gboolean active; - - table = e_msg_composer_get_header_table (composer); - active = gtk_toggle_action_get_active (action); - - e_composer_header_table_set_header_visible ( - table, E_COMPOSER_HEADER_SUBJECT, active); -} - -static void -action_view_to_cb (GtkToggleAction *action, - EMsgComposer *composer) -{ - EComposerHeaderTable *table; - gboolean active; - - table = e_msg_composer_get_header_table (composer); - active = gtk_toggle_action_get_active (action); - - e_composer_header_table_set_header_visible ( - table, E_COMPOSER_HEADER_TO, active); -} - static GtkActionEntry entries[] = { { "attach", @@ -542,7 +444,7 @@ static GtkToggleActionEntry toggle_entries[] = { N_("S/MIME Sig_n"), NULL, N_("Sign this message with your S/MIME Signature Certificate"), - G_CALLBACK (action_smime_sign_cb), + NULL, /* Handled by property bindings */ FALSE }, { "view-bcc", @@ -550,7 +452,7 @@ static GtkToggleActionEntry toggle_entries[] = { N_("_Bcc Field"), NULL, N_("Toggles whether the BCC field is displayed"), - G_CALLBACK (action_view_bcc_cb), + NULL, /* Handled by property bindings */ FALSE }, { "view-cc", @@ -558,7 +460,7 @@ static GtkToggleActionEntry toggle_entries[] = { N_("_Cc Field"), NULL, N_("Toggles whether the CC field is displayed"), - G_CALLBACK (action_view_cc_cb), + NULL, /* Handled by property bindings */ FALSE }, { "view-from", @@ -566,15 +468,7 @@ static GtkToggleActionEntry toggle_entries[] = { N_("_From Field"), NULL, N_("Toggles whether the From chooser is displayed"), - G_CALLBACK (action_view_from_cb), - FALSE }, - - { "view-post-to", - NULL, - N_("_Post-To Field"), - NULL, - N_("Toggles whether the Post-To field is displayed"), - G_CALLBACK (action_view_post_to_cb), + NULL, /* Handled by property bindings */ FALSE }, { "view-reply-to", @@ -582,24 +476,8 @@ static GtkToggleActionEntry toggle_entries[] = { N_("_Reply-To Field"), NULL, N_("Toggles whether the Reply-To field is displayed"), - G_CALLBACK (action_view_reply_to_cb), + NULL, /* Handled by property bindings */ FALSE }, - - { "view-subject", - NULL, - N_("_Subject Field"), - NULL, - N_("Toggles whether the Subject field is displayed"), - G_CALLBACK (action_view_subject_cb), - FALSE }, - - { "view-to", - NULL, - N_("_To Field"), - NULL, - N_("Toggles whether the To field is displayed"), - G_CALLBACK (action_view_to_cb), - FALSE } }; void diff --git a/composer/e-composer-actions.h b/composer/e-composer-actions.h index c17f3ebc32..da3e470d81 100644 --- a/composer/e-composer-actions.h +++ b/composer/e-composer-actions.h @@ -61,13 +61,7 @@ E_COMPOSER_ACTION ((composer), "view-cc") #define E_COMPOSER_ACTION_VIEW_FROM(composer) \ E_COMPOSER_ACTION ((composer), "view-from") -#define E_COMPOSER_ACTION_VIEW_POST_TO(composer) \ - E_COMPOSER_ACTION ((composer), "view-post-to") #define E_COMPOSER_ACTION_VIEW_REPLY_TO(composer) \ E_COMPOSER_ACTION ((composer), "view-reply-to") -#define E_COMPOSER_ACTION_VIEW_SUBJECT(composer) \ - E_COMPOSER_ACTION ((composer), "view-subject") -#define E_COMPOSER_ACTION_VIEW_TO(composer) \ - E_COMPOSER_ACTION ((composer), "view-to") #endif /* E_COMPOSER_ACTIONS_H */ diff --git a/composer/e-composer-header-table.c b/composer/e-composer-header-table.c index d539565ad2..267bfbf1e7 100644 --- a/composer/e-composer-header-table.c +++ b/composer/e-composer-header-table.c @@ -22,7 +22,9 @@ #include <camel/camel-internet-address.h> #include <libedataserverui/e-name-selector.h> -#include "e-signature-combo-box.h" +#include "e-util/e-binding.h" +#include "e-util/gconf-bridge.h" +#include "widgets/misc/e-signature-combo-box.h" #include "e-composer-from-header.h" #include "e-composer-name-header.h" @@ -33,34 +35,6 @@ (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 \ @@ -71,6 +45,8 @@ "carbon copy of the message without appearing " \ "in the recipient list of the message") +#define GCONF_KEY_PREFIX "/apps/evolution/mail/composer" + enum { PROP_0, PROP_ACCOUNT, @@ -88,6 +64,7 @@ enum { struct _EComposerHeaderTablePrivate { EComposerHeader *headers[E_COMPOSER_NUM_HEADERS]; + guint gconf_bindings[E_COMPOSER_NUM_HEADERS]; GtkWidget *signature_label; GtkWidget *signature_combo_box; ENameSelector *name_selector; @@ -296,26 +273,160 @@ skip_custom: } static void +composer_header_table_setup_mail_headers (EComposerHeaderTable *table) +{ + GConfBridge *bridge; + gint ii; + + bridge = gconf_bridge_get (); + + for (ii = 0; ii < E_COMPOSER_NUM_HEADERS; ii++) { + EComposerHeader *header; + const gchar *key; + guint binding_id; + + binding_id = table->priv->gconf_bindings[ii]; + header = e_composer_header_table_get_header (table, ii); + + if (binding_id > 0) + gconf_bridge_unbind (bridge, binding_id); + + switch (ii) { + case E_COMPOSER_HEADER_BCC: + key = GCONF_KEY_PREFIX "/show_mail_bcc"; + break; + + case E_COMPOSER_HEADER_CC: + key = GCONF_KEY_PREFIX "/show_mail_cc"; + break; + + case E_COMPOSER_HEADER_FROM: + key = GCONF_KEY_PREFIX "/show_mail_from"; + break; + + case E_COMPOSER_HEADER_REPLY_TO: + key = GCONF_KEY_PREFIX "/show_mail_reply_to"; + break; + + default: + key = NULL; + break; + } + + switch (ii) { + case E_COMPOSER_HEADER_BCC: + case E_COMPOSER_HEADER_CC: + case E_COMPOSER_HEADER_FROM: + case E_COMPOSER_HEADER_REPLY_TO: + case E_COMPOSER_HEADER_SUBJECT: + case E_COMPOSER_HEADER_TO: + e_composer_header_set_sensitive (header, TRUE); + e_composer_header_set_visible (header, TRUE); + break; + + default: + e_composer_header_set_sensitive (header, FALSE); + e_composer_header_set_visible (header, FALSE); + break; + } + + if (key != NULL) + binding_id = gconf_bridge_bind_property ( + bridge, key, G_OBJECT (header), "visible"); + else + binding_id = 0; + + table->priv->gconf_bindings[ii] = binding_id; + } +} + +static void +composer_header_table_setup_post_headers (EComposerHeaderTable *table) +{ + GConfBridge *bridge; + gint ii; + + bridge = gconf_bridge_get (); + + for (ii = 0; ii < E_COMPOSER_NUM_HEADERS; ii++) { + EComposerHeader *header; + const gchar *key; + guint binding_id; + + binding_id = table->priv->gconf_bindings[ii]; + header = e_composer_header_table_get_header (table, ii); + + if (binding_id > 0) + gconf_bridge_unbind (bridge, binding_id); + + switch (ii) { + case E_COMPOSER_HEADER_FROM: + key = GCONF_KEY_PREFIX "/show_post_from"; + break; + + case E_COMPOSER_HEADER_REPLY_TO: + key = GCONF_KEY_PREFIX "/show_post_reply_to"; + break; + + default: + key = NULL; + break; + } + + switch (ii) { + case E_COMPOSER_HEADER_FROM: + case E_COMPOSER_HEADER_POST_TO: + case E_COMPOSER_HEADER_REPLY_TO: + case E_COMPOSER_HEADER_SUBJECT: + e_composer_header_set_sensitive (header, TRUE); + e_composer_header_set_visible (header, TRUE); + break; + + default: /* this includes TO, CC and BCC */ + e_composer_header_set_sensitive (header, FALSE); + e_composer_header_set_visible (header, FALSE); + break; + } + + if (key != NULL) + binding_id = gconf_bridge_bind_property ( + bridge, key, G_OBJECT (header), "visible"); + else + binding_id = 0; + + table->priv->gconf_bindings[ii] = binding_id; + } +} + +static void composer_header_table_from_changed_cb (EComposerHeaderTable *table) { EAccount *account; + EComposerHeader *header; + EComposerHeaderType type; EComposerPostHeader *post_header; EComposerTextHeader *text_header; EDestination **old_destinations; EDestination **new_destinations; const gchar *reply_to; + const gchar *source_url; gboolean always_cc; gboolean always_bcc; /* Keep "Post-To" and "Reply-To" synchronized with "From" */ account = e_composer_header_table_get_account (table); + source_url = e_account_get_string (account, E_ACCOUNT_SOURCE_URL); - post_header = E_COMPOSER_HEADER_TABLE_GET_POST_TO_HEADER (table); + type = E_COMPOSER_HEADER_POST_TO; + header = e_composer_header_table_get_header (table, type); + post_header = E_COMPOSER_POST_HEADER (header); e_composer_post_header_set_account (post_header, account); + type = E_COMPOSER_HEADER_REPLY_TO; + header = e_composer_header_table_get_header (table, type); reply_to = (account != NULL) ? account->id->reply_to : NULL; - text_header = E_COMPOSER_HEADER_TABLE_GET_REPLY_TO_HEADER (table); + text_header = E_COMPOSER_TEXT_HEADER (header); e_composer_text_header_set_text (text_header, reply_to); always_cc = (account != NULL && account->always_cc); @@ -338,6 +449,27 @@ composer_header_table_from_changed_cb (EComposerHeaderTable *table) old_destinations, always_bcc ? account->bcc_addrs : NULL); e_composer_header_table_set_destinations_bcc (table, new_destinations); e_destination_freev (new_destinations); + + /* XXX We should NOT be checking specific account types here. + * Would prefer EAccount have a "send_method" enum item: + * + * E_ACCOUNT_SEND_METHOD_MAIL + * E_ACCOUNT_SEND_METHOD_POST + * + * And that would dictate which set of headers we show + * in the composer when an account is selected. Alas, + * EAccount has no private storage, so it would require + * an ABI break and I don't want to deal with that now. + * (But would anything besides Evolution be affected?) + * + * Currently only NNTP accounts use the "POST" fields. + */ + if (source_url == NULL) + composer_header_table_setup_mail_headers (table); + else if (g_ascii_strncasecmp (source_url, "nntp:", 5) == 0) + composer_header_table_setup_post_headers (table); + else + composer_header_table_setup_mail_headers (table); } static GObject * @@ -380,6 +512,14 @@ composer_header_table_constructor (GType type, priv->headers[ii]->input_widget, "right-attach", 2, NULL); + e_binding_new ( + G_OBJECT (priv->headers[ii]->input_widget), "visible", + G_OBJECT (priv->signature_label), "visible"); + + e_binding_new ( + G_OBJECT (priv->headers[ii]->input_widget), "visible", + G_OBJECT (priv->signature_combo_box), "visible"); + /* Now add the signature stuff. */ gtk_table_attach ( GTK_TABLE (object), priv->signature_label, @@ -686,6 +826,24 @@ composer_header_table_class_init (EComposerHeaderTableClass *class) element_spec, G_PARAM_READWRITE)); + /* floating reference */ + element_spec = g_param_spec_string ( + "value-array-element", + NULL, + NULL, + NULL, + G_PARAM_READWRITE); + + g_object_class_install_property ( + object_class, + PROP_POST_TO, + g_param_spec_value_array ( + "post-to", + NULL, + NULL, + element_spec, + G_PARAM_READWRITE)); + g_object_class_install_property ( object_class, PROP_REPLY_TO, @@ -733,6 +891,7 @@ composer_header_table_init (EComposerHeaderTable *table) EComposerHeader *header; ENameSelector *name_selector; GtkWidget *widget; + gint ii; table->priv = E_COMPOSER_HEADER_TABLE_GET_PRIVATE (table); @@ -784,6 +943,22 @@ composer_header_table_init (EComposerHeaderTable *table) gtk_label_set_mnemonic_widget ( GTK_LABEL (widget), table->priv->signature_combo_box); table->priv->signature_label = g_object_ref_sink (widget); + + /* XXX EComposerHeader ought to do this itself, but I need to + * make the title_widget and input_widget members private. */ + for (ii = 0; ii < E_COMPOSER_NUM_HEADERS; ii++) { + GObject *src_object; + GObject *dst_object; + + header = table->priv->headers[ii]; + src_object = G_OBJECT (header); + + dst_object = G_OBJECT (header->title_widget); + e_binding_new (src_object, "visible", dst_object, "visible"); + + dst_object = G_OBJECT (header->input_widget); + e_binding_new (src_object, "visible", dst_object, "visible"); + } } GType @@ -829,126 +1004,103 @@ e_composer_header_table_get_header (EComposerHeaderTable *table, 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; + EComposerHeader *header; + EComposerHeaderType type; + EComposerFromHeader *from_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); + type = E_COMPOSER_HEADER_FROM; + header = e_composer_header_table_get_header (table, type); + from_header = E_COMPOSER_FROM_HEADER (header); + + return e_composer_from_header_get_active (from_header); } gboolean e_composer_header_table_set_account (EComposerHeaderTable *table, EAccount *account) { - EComposerFromHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerFromHeader *from_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); + type = E_COMPOSER_HEADER_FROM; + header = e_composer_header_table_get_header (table, type); + from_header = E_COMPOSER_FROM_HEADER (header); + + return e_composer_from_header_set_active (from_header, account); } EAccountList * e_composer_header_table_get_account_list (EComposerHeaderTable *table) { - EComposerFromHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerFromHeader *from_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); + type = E_COMPOSER_HEADER_FROM; + header = e_composer_header_table_get_header (table, type); + from_header = E_COMPOSER_FROM_HEADER (header); + + return e_composer_from_header_get_account_list (from_header); } void e_composer_header_table_set_account_list (EComposerHeaderTable *table, EAccountList *account_list) { - EComposerFromHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerFromHeader *from_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); + type = E_COMPOSER_HEADER_FROM; + header = e_composer_header_table_get_header (table, type); + from_header = E_COMPOSER_FROM_HEADER (header); + + e_composer_from_header_set_account_list (from_header, account_list); } const gchar * e_composer_header_table_get_account_name (EComposerHeaderTable *table) { - EComposerFromHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerFromHeader *from_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); + type = E_COMPOSER_HEADER_FROM; + header = e_composer_header_table_get_header (table, type); + from_header = E_COMPOSER_FROM_HEADER (header); + + return e_composer_from_header_get_active_name (from_header); } gboolean e_composer_header_table_set_account_name (EComposerHeaderTable *table, const gchar *account_name) { - EComposerFromHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerFromHeader *from_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); + type = E_COMPOSER_HEADER_FROM; + header = e_composer_header_table_get_header (table, type); + from_header = E_COMPOSER_FROM_HEADER (header); + + return e_composer_from_header_set_active_name (from_header, account_name); } EDestination ** @@ -994,133 +1146,179 @@ e_composer_header_table_get_destinations (EComposerHeaderTable *table) EDestination ** e_composer_header_table_get_destinations_bcc (EComposerHeaderTable *table) { - EComposerNameHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerNameHeader *name_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); + type = E_COMPOSER_HEADER_BCC; + header = e_composer_header_table_get_header (table, type); + name_header = E_COMPOSER_NAME_HEADER (header); + + return e_composer_name_header_get_destinations (name_header); } void e_composer_header_table_add_destinations_bcc (EComposerHeaderTable *table, EDestination **destinations) { - EComposerNameHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerNameHeader *name_header; g_return_if_fail (E_IS_COMPOSER_HEADER_TABLE (table)); - header = E_COMPOSER_HEADER_TABLE_GET_BCC_HEADER (table); - e_composer_name_header_add_destinations (header, destinations); + type = E_COMPOSER_HEADER_BCC; + header = e_composer_header_table_get_header (table, type); + name_header = E_COMPOSER_NAME_HEADER (header); + + e_composer_name_header_add_destinations (name_header, destinations); if (destinations != NULL && *destinations != NULL) - e_composer_header_table_set_header_visible ( - table, E_COMPOSER_HEADER_BCC, TRUE); + e_composer_header_set_visible (header, TRUE); } void e_composer_header_table_set_destinations_bcc (EComposerHeaderTable *table, EDestination **destinations) { - EComposerNameHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerNameHeader *name_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); + type = E_COMPOSER_HEADER_BCC; + header = e_composer_header_table_get_header (table, type); + name_header = E_COMPOSER_NAME_HEADER (header); + + e_composer_name_header_set_destinations (name_header, destinations); if (destinations != NULL && *destinations != NULL) - e_composer_header_table_set_header_visible ( - table, E_COMPOSER_HEADER_BCC, TRUE); + e_composer_header_set_visible (header, TRUE); } EDestination ** e_composer_header_table_get_destinations_cc (EComposerHeaderTable *table) { - EComposerNameHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerNameHeader *name_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); + type = E_COMPOSER_HEADER_CC; + header = e_composer_header_table_get_header (table, type); + name_header = E_COMPOSER_NAME_HEADER (header); + + return e_composer_name_header_get_destinations (name_header); } void e_composer_header_table_add_destinations_cc (EComposerHeaderTable *table, EDestination **destinations) { - EComposerNameHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerNameHeader *name_header; g_return_if_fail (E_IS_COMPOSER_HEADER_TABLE (table)); - header = E_COMPOSER_HEADER_TABLE_GET_CC_HEADER (table); - e_composer_name_header_add_destinations (header, destinations); + type = E_COMPOSER_HEADER_CC; + header = e_composer_header_table_get_header (table, type); + name_header = E_COMPOSER_NAME_HEADER (header); + + e_composer_name_header_add_destinations (name_header, destinations); if (destinations != NULL && *destinations != NULL) - e_composer_header_table_set_header_visible ( - table, E_COMPOSER_HEADER_CC, TRUE); + e_composer_header_set_visible (header, TRUE); } void e_composer_header_table_set_destinations_cc (EComposerHeaderTable *table, EDestination **destinations) { - EComposerNameHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerNameHeader *name_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); + type = E_COMPOSER_HEADER_CC; + header = e_composer_header_table_get_header (table, type); + name_header = E_COMPOSER_NAME_HEADER (header); + + e_composer_name_header_set_destinations (name_header, destinations); if (destinations != NULL && *destinations != NULL) - e_composer_header_table_set_header_visible ( - table, E_COMPOSER_HEADER_CC, TRUE); + e_composer_header_set_visible (header, TRUE); } EDestination ** e_composer_header_table_get_destinations_to (EComposerHeaderTable *table) { - EComposerNameHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerNameHeader *name_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); + type = E_COMPOSER_HEADER_TO; + header = e_composer_header_table_get_header (table, type); + name_header = E_COMPOSER_NAME_HEADER (header); + + return e_composer_name_header_get_destinations (name_header); } void e_composer_header_table_add_destinations_to (EComposerHeaderTable *table, EDestination **destinations) { - EComposerNameHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerNameHeader *name_header; g_return_if_fail (E_IS_COMPOSER_HEADER_TABLE (table)); - header = E_COMPOSER_HEADER_TABLE_GET_TO_HEADER (table); - e_composer_name_header_add_destinations (header, destinations); + type = E_COMPOSER_HEADER_TO; + header = e_composer_header_table_get_header (table, type); + name_header = E_COMPOSER_NAME_HEADER (header); + + e_composer_name_header_add_destinations (name_header, destinations); } void e_composer_header_table_set_destinations_to (EComposerHeaderTable *table, EDestination **destinations) { - EComposerNameHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerNameHeader *name_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); + type = E_COMPOSER_HEADER_TO; + header = e_composer_header_table_get_header (table, type); + name_header = E_COMPOSER_NAME_HEADER (header); + + e_composer_name_header_set_destinations (name_header, destinations); } GList * e_composer_header_table_get_post_to (EComposerHeaderTable *table) { - EComposerPostHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerPostHeader *post_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); + type = E_COMPOSER_HEADER_POST_TO; + header = e_composer_header_table_get_header (table, type); + post_header = E_COMPOSER_POST_HEADER (header); + + return e_composer_post_header_get_folders (post_header); } void @@ -1128,51 +1326,70 @@ e_composer_header_table_set_post_to_base (EComposerHeaderTable *table, const gchar *base_url, const gchar *folders) { - EComposerPostHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerPostHeader *post_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); + type = E_COMPOSER_HEADER_POST_TO; + header = e_composer_header_table_get_header (table, type); + post_header = E_COMPOSER_POST_HEADER (header); + + e_composer_post_header_set_folders_base (post_header, base_url, folders); } void e_composer_header_table_set_post_to_list (EComposerHeaderTable *table, GList *folders) { - EComposerPostHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerPostHeader *post_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); + type = E_COMPOSER_HEADER_POST_TO; + header = e_composer_header_table_get_header (table, type); + post_header = E_COMPOSER_POST_HEADER (header); + + e_composer_post_header_set_folders (post_header, folders); } const gchar * e_composer_header_table_get_reply_to (EComposerHeaderTable *table) { - EComposerTextHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerTextHeader *text_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); + type = E_COMPOSER_HEADER_REPLY_TO; + header = e_composer_header_table_get_header (table, type); + text_header = E_COMPOSER_TEXT_HEADER (header); + + return e_composer_text_header_get_text (text_header); } void e_composer_header_table_set_reply_to (EComposerHeaderTable *table, const gchar *reply_to) { - EComposerTextHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerTextHeader *text_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); + type = E_COMPOSER_HEADER_REPLY_TO; + header = e_composer_header_table_get_header (table, type); + text_header = E_COMPOSER_TEXT_HEADER (header); + + e_composer_text_header_set_text (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); + e_composer_header_set_visible (header, TRUE); } ESignature * @@ -1224,22 +1441,32 @@ e_composer_header_table_set_signature_list (EComposerHeaderTable *table, const gchar * e_composer_header_table_get_subject (EComposerHeaderTable *table) { - EComposerTextHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerTextHeader *text_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); + type = E_COMPOSER_HEADER_SUBJECT; + header = e_composer_header_table_get_header (table, type); + text_header = E_COMPOSER_TEXT_HEADER (header); + + return e_composer_text_header_get_text (text_header); } void e_composer_header_table_set_subject (EComposerHeaderTable *table, const gchar *subject) { - EComposerTextHeader *header; + EComposerHeader *header; + EComposerHeaderType type; + EComposerTextHeader *text_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); + type = E_COMPOSER_HEADER_SUBJECT; + header = e_composer_header_table_get_header (table, type); + text_header = E_COMPOSER_TEXT_HEADER (header); + + e_composer_text_header_set_text (text_header, subject); } diff --git a/composer/e-composer-header-table.h b/composer/e-composer-header-table.h index 91d64fe22a..817863031c 100644 --- a/composer/e-composer-header-table.h +++ b/composer/e-composer-header-table.h @@ -79,20 +79,6 @@ GtkWidget * e_composer_header_table_new (void); EComposerHeader * e_composer_header_table_get_header (EComposerHeaderTable *table, EComposerHeaderType type); -gboolean e_composer_header_table_get_header_sensitive - (EComposerHeaderTable *table, - EComposerHeaderType type); -void e_composer_header_table_set_header_sensitive - (EComposerHeaderTable *table, - EComposerHeaderType type, - gboolean sensitive); -gboolean e_composer_header_table_get_header_visible - (EComposerHeaderTable *table, - EComposerHeaderType type); -void e_composer_header_table_set_header_visible - (EComposerHeaderTable *table, - EComposerHeaderType type, - gboolean visible); EAccount * e_composer_header_table_get_account (EComposerHeaderTable *table); gboolean e_composer_header_table_set_account diff --git a/composer/e-composer-header.c b/composer/e-composer-header.c index 8cbcf64f1f..272556969d 100644 --- a/composer/e-composer-header.c +++ b/composer/e-composer-header.c @@ -41,6 +41,9 @@ enum { struct _EComposerHeaderPrivate { gchar *label; gboolean button; + + guint sensitive : 1; + guint visible : 1; }; static gpointer parent_class; @@ -302,15 +305,9 @@ e_composer_header_get_label (EComposerHeader *header) gboolean e_composer_header_get_sensitive (EComposerHeader *header) { - gboolean sensitive; - g_return_val_if_fail (E_IS_COMPOSER_HEADER (header), FALSE); - sensitive = GTK_WIDGET_SENSITIVE (header->title_widget); - if (GTK_WIDGET_SENSITIVE (header->input_widget) != sensitive) - g_warning ("%s: Sensitivity is out of sync", G_STRFUNC); - - return sensitive; + return header->priv->sensitive; } void @@ -319,8 +316,7 @@ e_composer_header_set_sensitive (EComposerHeader *header, { g_return_if_fail (E_IS_COMPOSER_HEADER (header)); - gtk_widget_set_sensitive (header->title_widget, sensitive); - gtk_widget_set_sensitive (header->input_widget, sensitive); + header->priv->sensitive = sensitive; g_object_notify (G_OBJECT (header), "sensitive"); } @@ -328,15 +324,9 @@ e_composer_header_set_sensitive (EComposerHeader *header, gboolean e_composer_header_get_visible (EComposerHeader *header) { - gboolean visible; - g_return_val_if_fail (E_IS_COMPOSER_HEADER (header), FALSE); - visible = GTK_WIDGET_VISIBLE (header->title_widget); - if (GTK_WIDGET_VISIBLE (header->input_widget) != visible) - g_warning ("%s: Visibility is out of sync", G_STRFUNC); - - return visible; + return header->priv->visible; } void @@ -345,13 +335,7 @@ e_composer_header_set_visible (EComposerHeader *header, { g_return_if_fail (E_IS_COMPOSER_HEADER (header)); - if (visible) { - gtk_widget_show (header->title_widget); - gtk_widget_show (header->input_widget); - } else { - gtk_widget_hide (header->title_widget); - gtk_widget_hide (header->input_widget); - } + header->priv->visible = visible; g_object_notify (G_OBJECT (header), "visible"); } diff --git a/composer/e-composer-header.h b/composer/e-composer-header.h index d1edd110fe..db9582dc3f 100644 --- a/composer/e-composer-header.h +++ b/composer/e-composer-header.h @@ -59,7 +59,7 @@ struct _EComposerHeaderClass { GType e_composer_header_get_type (void); gchar * e_composer_header_get_label (EComposerHeader *header); gboolean e_composer_header_get_sensitive (EComposerHeader *header); -void e_composer_header_set_sensitive (EComposerHeader *header, +void e_composer_header_set_sensitive (EComposerHeader *header, gboolean sensitive); gboolean e_composer_header_get_visible (EComposerHeader *header); void e_composer_header_set_visible (EComposerHeader *header, diff --git a/composer/e-composer-private.c b/composer/e-composer-private.c index 1729aae9fa..fe5b66ceee 100644 --- a/composer/e-composer-private.c +++ b/composer/e-composer-private.c @@ -90,6 +90,7 @@ e_composer_private_init (EMsgComposer *composer) GtkWidget *send_widget; const gchar *path; gchar *filename; + gint ii; GError *error = NULL; editor = GTKHTML_EDITOR (composer); @@ -165,6 +166,46 @@ e_composer_private_init (EMsgComposer *composer) GTK_BOX (container), widget, TRUE, TRUE, 0, GTK_PACK_START); composer_setup_recent_menu (composer); + + /* Bind headers to their corresponding actions. */ + + for (ii = 0; ii < E_COMPOSER_NUM_HEADERS; ii++) { + EComposerHeaderTable *table; + EComposerHeader *header; + GtkAction *action; + + table = E_COMPOSER_HEADER_TABLE (priv->header_table); + header = e_composer_header_table_get_header (table, ii); + + switch (ii) { + case E_COMPOSER_HEADER_BCC: + action = ACTION (VIEW_BCC); + break; + + case E_COMPOSER_HEADER_CC: + action = ACTION (VIEW_CC); + break; + + case E_COMPOSER_HEADER_FROM: + action = ACTION (VIEW_FROM); + break; + + case E_COMPOSER_HEADER_REPLY_TO: + action = ACTION (VIEW_REPLY_TO); + break; + + default: + continue; + } + + e_mutual_binding_new ( + G_OBJECT (header), "sensitive", + G_OBJECT (action), "sensitive"); + + e_mutual_binding_new ( + G_OBJECT (header), "visible", + G_OBJECT (action), "active"); + } } void diff --git a/composer/e-composer-private.h b/composer/e-composer-private.h index 669af31235..8dc9b4be93 100644 --- a/composer/e-composer-private.h +++ b/composer/e-composer-private.h @@ -28,6 +28,7 @@ #include "e-composer-actions.h" #include "e-composer-autosave.h" #include "e-composer-header-table.h" +#include "e-util/e-binding.h" #include "e-util/gconf-bridge.h" #include "widgets/misc/e-attachment-paned.h" #include "widgets/misc/e-attachment-store.h" @@ -65,16 +66,6 @@ COMPOSER_GCONF_PREFIX "/send_html" #define COMPOSER_GCONF_SPELL_LANGUAGES_KEY \ COMPOSER_GCONF_PREFIX "/spell_languages" -#define COMPOSER_GCONF_VIEW_BCC_KEY \ - COMPOSER_GCONF_PREFIX "/view/Bcc" -#define COMPOSER_GCONF_VIEW_CC_KEY \ - COMPOSER_GCONF_PREFIX "/view/Cc" -#define COMPOSER_GCONF_VIEW_FROM_KEY \ - COMPOSER_GCONF_PREFIX "/view/From" -#define COMPOSER_GCONF_VIEW_POST_TO_KEY \ - COMPOSER_GCONF_PREFIX "/view/PostTo" -#define COMPOSER_GCONF_VIEW_REPLY_TO_KEY \ - COMPOSER_GCONF_PREFIX "/view/ReplyTo" #define COMPOSER_GCONF_WINDOW_PREFIX \ COMPOSER_GCONF_PREFIX "/window" diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c index 9325e0b770..9b526f63ac 100644 --- a/composer/e-msg-composer.c +++ b/composer/e-msg-composer.c @@ -113,37 +113,6 @@ (G_TYPE_INSTANCE_GET_PRIVATE \ ((obj), E_TYPE_MSG_COMPOSER, EMsgComposerPrivate)) -#define E_MSG_COMPOSER_VISIBLE_MASK_SENDER \ - (E_MSG_COMPOSER_VISIBLE_FROM | \ - E_MSG_COMPOSER_VISIBLE_REPLYTO) - -#define E_MSG_COMPOSER_VISIBLE_MASK_BASIC \ - (E_MSG_COMPOSER_VISIBLE_MASK_SENDER | \ - E_MSG_COMPOSER_VISIBLE_SUBJECT) - -#define E_MSG_COMPOSER_VISIBLE_MASK_RECIPIENTS \ - (E_MSG_COMPOSER_VISIBLE_TO | \ - E_MSG_COMPOSER_VISIBLE_CC | \ - E_MSG_COMPOSER_VISIBLE_BCC) - -#define E_MSG_COMPOSER_VISIBLE_MASK_MAIL \ - (E_MSG_COMPOSER_VISIBLE_MASK_BASIC | \ - E_MSG_COMPOSER_VISIBLE_MASK_RECIPIENTS) - -#define E_MSG_COMPOSER_VISIBLE_MASK_POST \ - (E_MSG_COMPOSER_VISIBLE_MASK_BASIC | \ - E_MSG_COMPOSER_VISIBLE_POSTTO) - -typedef enum { - E_MSG_COMPOSER_VISIBLE_FROM = (1 << 0), - E_MSG_COMPOSER_VISIBLE_REPLYTO = (1 << 1), - E_MSG_COMPOSER_VISIBLE_TO = (1 << 2), - E_MSG_COMPOSER_VISIBLE_CC = (1 << 3), - E_MSG_COMPOSER_VISIBLE_BCC = (1 << 4), - E_MSG_COMPOSER_VISIBLE_POSTTO = (1 << 5), - E_MSG_COMPOSER_VISIBLE_SUBJECT = (1 << 7) -} EMsgComposerHeaderVisibleFlags; - enum { SEND, SAVE_DRAFT, @@ -399,6 +368,7 @@ build_message_headers (EMsgComposer *composer, gboolean redirect) { EComposerHeaderTable *table; + EComposerHeader *header; EAccount *account; const gchar *subject; const gchar *reply_to; @@ -449,9 +419,9 @@ build_message_headers (EMsgComposer *composer, } /* To:, Cc:, Bcc: */ - if (e_composer_header_table_get_header_visible (table, E_COMPOSER_HEADER_TO) || - e_composer_header_table_get_header_visible (table, E_COMPOSER_HEADER_CC) || - e_composer_header_table_get_header_visible (table, E_COMPOSER_HEADER_BCC)) { + header = e_composer_header_table_get_header ( + table, E_COMPOSER_HEADER_TO); + if (e_composer_header_get_visible (header)) { EDestination **to, **cc, **bcc; to = e_composer_header_table_get_destinations_to (table); @@ -466,7 +436,9 @@ build_message_headers (EMsgComposer *composer, } /* X-Evolution-PostTo: */ - if (e_composer_header_table_get_header_visible (table, E_COMPOSER_HEADER_POST_TO)) { + header = e_composer_header_table_get_header ( + table, E_COMPOSER_HEADER_POST_TO); + if (e_composer_header_get_visible (header)) { CamelMedium *medium = CAMEL_MEDIUM (msg); const gchar *name = "X-Evolution-PostTo"; GList *list, *iter; @@ -1541,36 +1513,6 @@ msg_composer_constructor (GType type, G_OBJECT (composer), "current-folder"); g_array_append_val (array, binding_id); - binding_id = gconf_bridge_bind_property ( - gconf_bridge_get (), - COMPOSER_GCONF_VIEW_BCC_KEY, - G_OBJECT (ACTION (VIEW_BCC)), "active"); - g_array_append_val (array, binding_id); - - binding_id = gconf_bridge_bind_property ( - gconf_bridge_get (), - COMPOSER_GCONF_VIEW_CC_KEY, - G_OBJECT (ACTION (VIEW_CC)), "active"); - g_array_append_val (array, binding_id); - - binding_id = gconf_bridge_bind_property ( - gconf_bridge_get (), - COMPOSER_GCONF_VIEW_FROM_KEY, - G_OBJECT (ACTION (VIEW_FROM)), "active"); - g_array_append_val (array, binding_id); - - binding_id = gconf_bridge_bind_property ( - gconf_bridge_get (), - COMPOSER_GCONF_VIEW_POST_TO_KEY, - G_OBJECT (ACTION (VIEW_POST_TO)), "active"); - g_array_append_val (array, binding_id); - - binding_id = gconf_bridge_bind_property ( - gconf_bridge_get (), - COMPOSER_GCONF_VIEW_REPLY_TO_KEY, - G_OBJECT (ACTION (VIEW_REPLY_TO)), "active"); - g_array_append_val (array, binding_id); - binding_id = gconf_bridge_bind_window ( gconf_bridge_get (), COMPOSER_GCONF_WINDOW_PREFIX, @@ -2322,87 +2264,6 @@ e_msg_composer_get_type (void) /* Callbacks. */ -static EMsgComposer * -create_composer (gint visible_mask) -{ - EMsgComposer *composer; - EComposerHeaderTable *table; - GtkToggleAction *action; - gboolean active; - - composer = g_object_new (E_TYPE_MSG_COMPOSER, NULL); - table = E_COMPOSER_HEADER_TABLE (composer->priv->header_table); - - /* Configure View Menu */ - - /* If we're mailing, you cannot disable "To". */ - action = GTK_TOGGLE_ACTION (ACTION (VIEW_TO)); - active = visible_mask & E_MSG_COMPOSER_VISIBLE_TO; - gtk_action_set_sensitive (ACTION (VIEW_TO), active); - gtk_toggle_action_set_active (action, active); - - /* Ditto for "Post-To". */ - action = GTK_TOGGLE_ACTION (ACTION (VIEW_POST_TO)); - active = visible_mask & E_MSG_COMPOSER_VISIBLE_POSTTO; - gtk_action_set_sensitive (ACTION (VIEW_POST_TO), active); - gtk_toggle_action_set_active (action, active); - - /* Disable "Cc" if we're posting. */ - if (!(visible_mask & E_MSG_COMPOSER_VISIBLE_CC)) { - action = GTK_TOGGLE_ACTION (ACTION (VIEW_CC)); - gtk_toggle_action_set_active (action, FALSE); - } - - /* Disable "Bcc" if we're posting. */ - if (!(visible_mask & E_MSG_COMPOSER_VISIBLE_BCC)) { - action = GTK_TOGGLE_ACTION (ACTION (VIEW_BCC)); - gtk_toggle_action_set_active (action, FALSE); - } - - action = GTK_TOGGLE_ACTION (ACTION (VIEW_SUBJECT)); - gtk_toggle_action_set_active (action, TRUE); - - return composer; -} - -/** - * e_msg_composer_new_with_type: - * - * Create a new message composer widget. The type can be - * E_MSG_COMPOSER_MAIL, E_MSG_COMPOSER_POST or E_MSG_COMPOSER_MAIL_POST. - * - * Returns: A pointer to the newly created widget - **/ - -EMsgComposer * -e_msg_composer_new_with_type (int type) -{ - EMsgComposer *composer; - gint visible_mask; - - switch (type) { - case E_MSG_COMPOSER_MAIL: - visible_mask = E_MSG_COMPOSER_VISIBLE_MASK_MAIL; - break; - - case E_MSG_COMPOSER_POST: - visible_mask = E_MSG_COMPOSER_VISIBLE_MASK_POST; - break; - - default: - visible_mask = - E_MSG_COMPOSER_VISIBLE_MASK_MAIL | - E_MSG_COMPOSER_VISIBLE_MASK_POST; - break; - } - - composer = create_composer (visible_mask); - - set_editor_text (composer, "", TRUE); - - return composer; -} - /** * e_msg_composer_new: * @@ -2413,7 +2274,7 @@ e_msg_composer_new_with_type (int type) EMsgComposer * e_msg_composer_new (void) { - return e_msg_composer_new_with_type (E_MSG_COMPOSER_MAIL); + return g_object_new (E_TYPE_MSG_COMPOSER, NULL); } static void @@ -2839,25 +2700,13 @@ e_msg_composer_new_with_message (CamelMimeMessage *message) GtkToggleAction *action; struct _camel_header_raw *xev; gint len, i; - EMsgComposerPrivate *p; for (headers = CAMEL_MIME_PART (message)->headers;headers;headers = headers->next) { if (!strcmp (headers->name, "X-Evolution-PostTo")) postto = g_list_append (postto, g_strstrip (g_strdup (headers->value))); } - if (postto != NULL) - composer = create_composer (E_MSG_COMPOSER_VISIBLE_MASK_POST); - else - composer = create_composer (E_MSG_COMPOSER_VISIBLE_MASK_MAIL); - p = composer->priv; - - if (!composer) { - g_list_foreach (postto, (GFunc)g_free, NULL); - g_list_free (postto); - return NULL; - } - + composer = e_msg_composer_new (); table = e_msg_composer_get_header_table (composer); if (postto) { @@ -3061,8 +2910,12 @@ e_msg_composer_new_with_message (CamelMimeMessage *message) while (headers) { if (g_ascii_strcasecmp (headers->name, "References") == 0 || g_ascii_strcasecmp (headers->name, "In-Reply-To") == 0) { - g_ptr_array_add (p->extra_hdr_names, g_strdup (headers->name)); - g_ptr_array_add (p->extra_hdr_values, g_strdup (headers->value)); + g_ptr_array_add ( + composer->priv->extra_hdr_names, + g_strdup (headers->name)); + g_ptr_array_add ( + composer->priv->extra_hdr_values, + g_strdup (headers->value)); } headers = headers->next; diff --git a/composer/e-msg-composer.h b/composer/e-msg-composer.h index 54520ec941..7a279ba230 100644 --- a/composer/e-msg-composer.h +++ b/composer/e-msg-composer.h @@ -68,13 +68,8 @@ struct _EMsgComposerClass { struct _EAttachmentBar; -#define E_MSG_COMPOSER_MAIL 1 -#define E_MSG_COMPOSER_POST 2 -#define E_MSG_COMPOSER_MAIL_POST E_MSG_COMPOSER_MAIL|E_MSG_COMPOSER_POST - GType e_msg_composer_get_type (void); EMsgComposer * e_msg_composer_new (void); -EMsgComposer * e_msg_composer_new_with_type (gint type); EMsgComposer * e_msg_composer_new_with_message (CamelMimeMessage *msg); EMsgComposer * e_msg_composer_new_from_url (const gchar *url); EMsgComposer * e_msg_composer_new_redirect (CamelMimeMessage *message, diff --git a/composer/evolution-composer.ui b/composer/evolution-composer.ui index dc77aae183..c22368383c 100644 --- a/composer/evolution-composer.ui +++ b/composer/evolution-composer.ui @@ -9,9 +9,9 @@ <menuitem action='save'/> <menuitem action='save-as'/> <menuitem action='save-draft'/> - <placeholder name='template-holder'/> + <placeholder name='template-holder'/> <separator/> - <placeholder name='external-editor-holder'/> + <placeholder name='external-editor-holder'/> <separator/> <separator/> <menuitem action='print-preview'/> @@ -29,12 +29,9 @@ <placeholder name='pre-insert-menu'> <menu action='view-menu'> <menuitem action='view-from'/> - <menuitem action='view-to'/> - <menuitem action='view-post-to'/> <menuitem action='view-reply-to'/> <menuitem action='view-cc'/> <menuitem action='view-bcc'/> - <menuitem action='view-subject'/> </menu> </placeholder> <menu action='insert-menu'> |