diff options
-rw-r--r-- | composer/ChangeLog | 28 | ||||
-rw-r--r-- | composer/e-msg-composer-hdrs.c | 87 | ||||
-rw-r--r-- | composer/e-msg-composer-hdrs.h | 11 | ||||
-rw-r--r-- | composer/e-msg-composer.c | 157 | ||||
-rw-r--r-- | composer/e-msg-composer.h | 27 |
5 files changed, 268 insertions, 42 deletions
diff --git a/composer/ChangeLog b/composer/ChangeLog index d900bee606..d783aad3d3 100644 --- a/composer/ChangeLog +++ b/composer/ChangeLog @@ -1,3 +1,31 @@ +2001-03-12 Jeffrey Stedfast <fejj@ximian.com> + + * e-msg-composer.h: Added view_replyto member. + + * e-msg-composer.c (e_msg_composer_get_visible_flags): Find out if + we want to view the Reply-To header. + (e_msg_composer_set_view_replyto): A new function to set the state + of the replyto header. + (menu_view_replyto_cb): Callback for setting the ReplyTo state. + (set_config): Make static. + (setup_ui): Setup the ReplyTo bonobo stuff. + (load_from_property_bag): More defaults for the ReplyTo, yay. + (load_from_gnome_config): Again... + (e_msg_composer_get_view_bcc): Implemented. + (e_msg_composer_get_view_cc): Implemented. + (e_msg_composer_get_view_from): Implemented. + (e_msg_composer_get_view_replyto): Implemented. + + * e-msg-composer-hdrs.c (e_msg_composer_hdrs_get_reply_to_entry): + New function, yay. + (e_msg_composer_hdrs_get_reply_to): Another new function. + (e_msg_composer_hdrs_set_reply_to): Yet another new function... + (create_headers): Create the reply-to header. + (attach_headers): Attach the reply_to. + (headers_set_visibility): Set the reply_to visibility. + (e_msg_composer_hdrs_to_message): Set the message's reply-to here + based on the user-set reply-to header. + 2001-03-06 Miguel de Icaza <miguel@ximian.com> * e-msg-composer.c (set_config): New function. Used to store diff --git a/composer/e-msg-composer-hdrs.c b/composer/e-msg-composer-hdrs.c index 57ae25a5f8..f6858ee492 100644 --- a/composer/e-msg-composer-hdrs.c +++ b/composer/e-msg-composer-hdrs.c @@ -46,10 +46,11 @@ /* Indexes in the GtkTable assigned to various items */ #define LINE_FROM 0 -#define LINE_TO 1 -#define LINE_CC 2 -#define LINE_BCC 3 -#define LINE_SUBJECT 4 +#define LINE_REPLYTO 1 +#define LINE_TO 2 +#define LINE_CC 3 +#define LINE_BCC 4 +#define LINE_SUBJECT 5 typedef struct { GtkWidget *label; @@ -65,7 +66,7 @@ struct _EMsgComposerHdrsPrivate { GSList *from_options; /* Standard headers. */ - Pair from, to, cc, bcc, subject; + Pair from, reply_to, to, cc, bcc, subject; }; @@ -174,7 +175,6 @@ create_from_optionmenu (EMsgComposerHdrs *hdrs) omenu = gtk_option_menu_new (); menu = gtk_menu_new (); - accounts = mail_config_get_accounts (); while (accounts) { @@ -346,6 +346,17 @@ create_headers (EMsgComposerHdrs *hdrs) priv->from.entry = create_from_optionmenu (hdrs); /* + * Reply-To: + */ + priv->reply_to.label = gtk_label_new (_("Reply-To:")); + priv->reply_to.entry = e_entry_new (); + gtk_object_set (GTK_OBJECT (priv->reply_to.entry), + "editable", TRUE, + "use_ellipsis", TRUE, + "allow_newlines", FALSE, + NULL); + + /* * Subject: */ priv->subject.label = gtk_label_new (_("Subject:")); @@ -391,7 +402,7 @@ attach_couple (EMsgComposerHdrs *hdrs, Pair *pair, int line) pair->label, 0, 1, line, line + 1, GTK_FILL, GTK_FILL, pad, pad); - + gtk_table_attach ( GTK_TABLE (hdrs), pair->entry, 1, 2, @@ -405,6 +416,7 @@ attach_headers (EMsgComposerHdrs *hdrs) EMsgComposerHdrsPrivate *p = hdrs->priv; attach_couple (hdrs, &p->from, LINE_FROM); + attach_couple (hdrs, &p->reply_to, LINE_REPLYTO); attach_couple (hdrs, &p->to, LINE_TO); attach_couple (hdrs, &p->cc, LINE_CC); attach_couple (hdrs, &p->bcc, LINE_BCC); @@ -429,6 +441,7 @@ headers_set_visibility (EMsgComposerHdrs *h, gint visible_flags) EMsgComposerHdrsPrivate *p = h->priv; set_pair_visibility (h, &p->from, visible_flags & E_MSG_COMPOSER_VISIBLE_FROM); + set_pair_visibility (h, &p->reply_to, visible_flags & E_MSG_COMPOSER_VISIBLE_REPLYTO); set_pair_visibility (h, &p->cc, visible_flags & E_MSG_COMPOSER_VISIBLE_CC); set_pair_visibility (h, &p->bcc, visible_flags & E_MSG_COMPOSER_VISIBLE_BCC); set_pair_visibility (h, &p->subject, visible_flags & E_MSG_COMPOSER_VISIBLE_SUBJECT); @@ -620,8 +633,8 @@ void e_msg_composer_hdrs_to_message (EMsgComposerHdrs *hdrs, CamelMimeMessage *msg) { + CamelInternetAddress *addr; gchar *subject; - CamelInternetAddress *from; g_return_if_fail (hdrs != NULL); g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs)); @@ -632,9 +645,15 @@ e_msg_composer_hdrs_to_message (EMsgComposerHdrs *hdrs, camel_mime_message_set_subject (msg, subject); g_free (subject); - from = e_msg_composer_hdrs_get_from (hdrs); - camel_mime_message_set_from (msg, from); - camel_object_unref (CAMEL_OBJECT (from)); + addr = e_msg_composer_hdrs_get_from (hdrs); + camel_mime_message_set_from (msg, addr); + camel_object_unref (CAMEL_OBJECT (addr)); + + addr = e_msg_composer_hdrs_get_reply_to (hdrs); + if (addr) { + camel_mime_message_set_reply_to (msg, addr); + camel_object_unref (CAMEL_OBJECT (addr)); + } set_recipients (msg, hdrs->priv->to.entry, CAMEL_RECIPIENT_TYPE_TO); set_recipients (msg, hdrs->priv->cc.entry, CAMEL_RECIPIENT_TYPE_CC); @@ -686,8 +705,10 @@ e_msg_composer_hdrs_set_from_account (EMsgComposerHdrs *hdrs, account = gtk_object_get_data (GTK_OBJECT (item), "account"); if ((account_name && !strcmp (account_name, account->name)) || (!account_name && account->default_account)) { + /* set the correct optionlist item */ gtk_option_menu_set_history (omenu, i); gtk_signal_emit_by_name (GTK_OBJECT (item), "activate", hdrs); + return; } @@ -697,6 +718,17 @@ e_msg_composer_hdrs_set_from_account (EMsgComposerHdrs *hdrs, } void +e_msg_composer_hdrs_set_reply_to (EMsgComposerHdrs *hdrs, + const char *reply_to) +{ + g_return_if_fail (hdrs != NULL); + g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs)); + + bonobo_widget_set_property (BONOBO_WIDGET (hdrs->priv->reply_to.entry), + "text", reply_to, NULL); +} + +void e_msg_composer_hdrs_set_to (EMsgComposerHdrs *hdrs, const GList *to_list) { @@ -761,6 +793,30 @@ e_msg_composer_hdrs_get_from (EMsgComposerHdrs *hdrs) return addr; } +CamelInternetAddress * +e_msg_composer_hdrs_get_reply_to (EMsgComposerHdrs *hdrs) +{ + CamelInternetAddress *addr; + gchar *reply_to; + + g_return_val_if_fail (hdrs != NULL, NULL); + g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL); + + gtk_object_get (GTK_OBJECT (hdrs->priv->reply_to.entry), + "text", &reply_to, NULL); + + addr = camel_internet_address_new (); + if (camel_address_unformat (CAMEL_ADDRESS (addr), reply_to) == -1) { + g_free (reply_to); + camel_object_unref (CAMEL_OBJECT (addr)); + return NULL; + } + + g_free (reply_to); + + return addr; +} + /* FIXME this is currently unused and broken. */ GList * e_msg_composer_hdrs_get_to (EMsgComposerHdrs *hdrs) @@ -813,6 +869,15 @@ e_msg_composer_hdrs_get_subject (EMsgComposerHdrs *hdrs) GtkWidget * +e_msg_composer_hdrs_get_reply_to_entry (EMsgComposerHdrs *hdrs) +{ + g_return_val_if_fail (hdrs != NULL, NULL); + g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL); + + return hdrs->priv->reply_to.entry; +} + +GtkWidget * e_msg_composer_hdrs_get_to_entry (EMsgComposerHdrs *hdrs) { g_return_val_if_fail (hdrs != NULL, NULL); diff --git a/composer/e-msg-composer-hdrs.h b/composer/e-msg-composer-hdrs.h index 9a32aee0fc..7d8d985825 100644 --- a/composer/e-msg-composer-hdrs.h +++ b/composer/e-msg-composer-hdrs.h @@ -66,9 +66,10 @@ struct _EMsgComposerHdrsClass { typedef enum { E_MSG_COMPOSER_VISIBLE_FROM = 1, - E_MSG_COMPOSER_VISIBLE_CC = 2, - E_MSG_COMPOSER_VISIBLE_BCC = 4, - E_MSG_COMPOSER_VISIBLE_SUBJECT = 8 + E_MSG_COMPOSER_VISIBLE_REPLYTO = 2, + E_MSG_COMPOSER_VISIBLE_CC = 4, + E_MSG_COMPOSER_VISIBLE_BCC = 8, + E_MSG_COMPOSER_VISIBLE_SUBJECT = 16 } EMsgComposerHeaderVisibleFlags; @@ -80,6 +81,8 @@ void e_msg_composer_hdrs_to_message (EMsgComposerHdrs *hdrs, void e_msg_composer_hdrs_set_from_account (EMsgComposerHdrs *hdrs, const char *account_name); +void e_msg_composer_hdrs_set_reply_to (EMsgComposerHdrs *hdrs, + const char *reply_to); void e_msg_composer_hdrs_set_to (EMsgComposerHdrs *hdrs, const GList *to_list); void e_msg_composer_hdrs_set_cc (EMsgComposerHdrs *hdrs, @@ -90,11 +93,13 @@ void e_msg_composer_hdrs_set_subject (EMsgComposerHdrs *hdrs, const char *subject); CamelInternetAddress *e_msg_composer_hdrs_get_from (EMsgComposerHdrs *hdrs); +CamelInternetAddress *e_msg_composer_hdrs_get_reply_to (EMsgComposerHdrs *hdrs); GList *e_msg_composer_hdrs_get_to (EMsgComposerHdrs *hdrs); GList *e_msg_composer_hdrs_get_cc (EMsgComposerHdrs *hdrs); GList *e_msg_composer_hdrs_get_bcc (EMsgComposerHdrs *hdrs); char *e_msg_composer_hdrs_get_subject (EMsgComposerHdrs *hdrs); +GtkWidget *e_msg_composer_hdrs_get_reply_to_entry (EMsgComposerHdrs *hdrs); GtkWidget *e_msg_composer_hdrs_get_to_entry (EMsgComposerHdrs *hdrs); GtkWidget *e_msg_composer_hdrs_get_cc_entry (EMsgComposerHdrs *hdrs); GtkWidget *e_msg_composer_hdrs_get_bcc_entry (EMsgComposerHdrs *hdrs); diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c index 088161a1fe..7edc282f1e 100644 --- a/composer/e-msg-composer.c +++ b/composer/e-msg-composer.c @@ -642,7 +642,7 @@ set_editor_text (EMsgComposer *composer, const char *sig_file, const char *text) bonobo_object_unref (BONOBO_OBJECT(stream)); } -void +static void set_config (EMsgComposer *composer, char *key, int val) { if (composer->property_bag){ @@ -748,46 +748,47 @@ struct _save_info { int quitok; }; -static void save_done(CamelFolder *folder, CamelMimeMessage *msg, CamelMessageInfo *info, int ok, void *data) +static void +save_done (CamelFolder *folder, CamelMimeMessage *msg, CamelMessageInfo *info, int ok, void *data) { struct _save_info *si = data; if (ok && si->quitok) - gtk_widget_destroy((GtkWidget *)si->composer); + gtk_widget_destroy (GTK_WIDGET (si->composer)); else - gtk_object_unref((GtkObject *)si->composer); + gtk_object_unref (GTK_OBJECT (si->composer)); - g_free(info); - g_free(si); + g_free (info); + g_free (si); } static void -save_draft(EMsgComposer *composer, int quitok) +save_draft (EMsgComposer *composer, int quitok) { CamelMimeMessage *msg; CamelMessageInfo *info; extern CamelFolder *drafts_folder; struct _save_info *si; - + composer->send_html = TRUE; /* always save drafts as HTML to keep formatting */ - msg = e_msg_composer_get_message(composer); - + msg = e_msg_composer_get_message (composer); + info = g_new0 (CamelMessageInfo, 1); info->flags = CAMEL_MESSAGE_DRAFT; - - si = g_malloc(sizeof(*si)); + + si = g_malloc (sizeof (*si)); si->composer = composer; - gtk_object_ref((GtkObject *)composer); + gtk_object_ref (GTK_OBJECT (composer)); si->quitok = quitok; - - mail_append_mail(drafts_folder, msg, info, save_done, si); - camel_object_unref((CamelObject *)msg); + + mail_append_mail (drafts_folder, msg, info, save_done, si); + camel_object_unref (CAMEL_OBJECT (msg)); } static void menu_file_save_draft_cb (BonoboUIComponent *uic, void *data, const char *path) { - save_draft(E_MSG_COMPOSER(data), FALSE); + save_draft (E_MSG_COMPOSER (data), FALSE); } static void @@ -1088,8 +1089,8 @@ fs_selection_get (GtkWidget *widget, GtkSelectionData *sdata, g_free (buffer); gtk_object_remove_data (GTK_OBJECT (widget), "ev_file_buffer"); } - #endif + static void menu_file_insert_file_cb (BonoboUIComponent *uic, void *data, @@ -1172,6 +1173,19 @@ menu_view_from_cb (BonoboUIComponent *component, } static void +menu_view_replyto_cb (BonoboUIComponent *component, + const char *path, + Bonobo_UIComponent_EventType type, + const char *state, + gpointer user_data) +{ + if (type != Bonobo_UIComponent_STATE_CHANGED) + return; + + e_msg_composer_set_view_replyto (E_MSG_COMPOSER (user_data), atoi (state)); +} + +static void menu_view_bcc_cb (BonoboUIComponent *component, const char *path, Bonobo_UIComponent_EventType type, @@ -1250,6 +1264,14 @@ setup_ui (EMsgComposer *composer) composer->uic, "ViewFrom", menu_view_from_cb, composer); + /* View/ReplyTo */ + bonobo_ui_component_set_prop ( + composer->uic, "/commands/ViewReplyTo", + "state", composer->view_replyto ? "1" : "0", NULL); + bonobo_ui_component_add_listener ( + composer->uic, "ViewReplyTo", + menu_view_replyto_cb, composer); + /* View/BCC */ bonobo_ui_component_set_prop ( composer->uic, "/commands/ViewBCC", @@ -1571,6 +1593,7 @@ load_from_property_bag (EMsgComposer *composer) Bonobo_PropertyBag bag = composer->property_bag; composer->view_from = load_with_failue_control (bag, "ViewFrom", 1); + composer->view_replyto = load_with_failue_control (bag, "ViewReplyTo", 0); composer->view_bcc = load_with_failue_control (bag, "ViewBCC", 0); composer->view_cc = load_with_failue_control (bag, "ViewCC", 1); composer->view_subject = load_with_failue_control (bag, "ViewSubject", 1); @@ -1580,6 +1603,7 @@ static void load_from_gnome_config (EMsgComposer *composer) { composer->view_from = get_config_value ("ViewFrom=1"); + composer->view_replyto = get_config_value ("ViewReplyTo=0"); composer->view_bcc = get_config_value ("ViewBCC=0"); composer->view_cc = get_config_value ("ViewCC=1"); composer->view_subject = get_config_value ("ViewSubject=1"); @@ -1612,6 +1636,8 @@ e_msg_composer_get_visible_flags (EMsgComposer *composer) if (composer->view_from) flags |= E_MSG_COMPOSER_VISIBLE_FROM; + if (composer->view_replyto) + flags |= E_MSG_COMPOSER_VISIBLE_REPLYTO; if (composer->view_cc) flags |= E_MSG_COMPOSER_VISIBLE_CC; if (composer->view_bcc) @@ -2501,6 +2527,23 @@ e_msg_composer_set_view_bcc (EMsgComposer *composer, gboolean view_bcc) } /** + * e_msg_composer_get_view_bcc: + * @composer: A message composer widget + * + * Get the status of the "View BCC header" flag. + * + * Return value: The status of the "View BCC header" flag. + **/ +gboolean +e_msg_composer_get_view_bcc (EMsgComposer *composer) +{ + g_return_val_if_fail (composer != NULL, FALSE); + g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE); + + return composer->view_bcc; +} + +/** * e_msg_composer_set_view_cc: * @composer: A message composer widget * @state: whether to show or hide the cc view @@ -2528,6 +2571,23 @@ e_msg_composer_set_view_cc (EMsgComposer *composer, gboolean view_cc) } /** + * e_msg_composer_get_view_cc: + * @composer: A message composer widget + * + * Get the status of the "View CC header" flag. + * + * Return value: The status of the "View CC header" flag. + **/ +gboolean +e_msg_composer_get_view_cc (EMsgComposer *composer) +{ + g_return_val_if_fail (composer != NULL, FALSE); + g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE); + + return composer->view_cc; +} + +/** * e_msg_composer_set_view_from: * @composer: A message composer widget * @state: whether to show or hide the From selector @@ -2555,6 +2615,67 @@ e_msg_composer_set_view_from (EMsgComposer *composer, gboolean view_from) } /** + * e_msg_composer_get_view_from: + * @composer: A message composer widget + * + * Get the status of the "View From header" flag. + * + * Return value: The status of the "View From header" flag. + **/ +gboolean +e_msg_composer_get_view_from (EMsgComposer *composer) +{ + g_return_val_if_fail (composer != NULL, FALSE); + g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE); + + return composer->view_from; +} + +/** + * e_msg_composer_set_view_from: + * @composer: A message composer widget + * @state: whether to show or hide the From selector + * + * Controls the state of the From selector + */ +void +e_msg_composer_set_view_replyto (EMsgComposer *composer, gboolean view_replyto) +{ + g_return_if_fail (composer != NULL); + g_return_if_fail (E_IS_MSG_COMPOSER (composer)); + + if ((composer->view_replyto && view_replyto) || + (!composer->view_replyto && !view_replyto)) + return; + + composer->view_replyto = view_replyto; + bonobo_ui_component_set_prop ( + composer->uic, "/commands/ViewReplyTo", + "state", composer->view_replyto ? "1" : "0", NULL); + set_config (composer, "ViewReplyTo", composer->view_replyto); + e_msg_composer_set_hdrs_visible + (E_MSG_COMPOSER_HDRS (composer->hdrs), + e_msg_composer_get_visible_flags (composer)); +} + +/** + * e_msg_composer_get_view_replyto: + * @composer: A message composer widget + * + * Get the status of the "View Reply-To header" flag. + * + * Return value: The status of the "View Reply-To header" flag. + **/ +gboolean +e_msg_composer_get_view_replyto (EMsgComposer *composer) +{ + g_return_val_if_fail (composer != NULL, FALSE); + g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE); + + return composer->view_replyto; +} + +/** * e_msg_composer_guess_mime_type: * @file_name: filename * diff --git a/composer/e-msg-composer.h b/composer/e-msg-composer.h index e03a89bfa6..5cca0590ac 100644 --- a/composer/e-msg-composer.h +++ b/composer/e-msg-composer.h @@ -76,14 +76,15 @@ struct _EMsgComposer { char *sig_file; gboolean attachment_bar_visible : 1; - gboolean send_html : 1; - gboolean pgp_sign : 1; - gboolean pgp_encrypt : 1; - gboolean view_from : 1; - gboolean view_bcc : 1; - gboolean view_cc : 1; - gboolean view_subject: 1; - gboolean has_changed : 1; + gboolean send_html : 1; + gboolean pgp_sign : 1; + gboolean pgp_encrypt : 1; + gboolean view_from : 1; + gboolean view_replyto : 1; + gboolean view_bcc : 1; + gboolean view_cc : 1; + gboolean view_subject : 1; + gboolean has_changed : 1; }; struct _EMsgComposerClass { @@ -127,21 +128,27 @@ void e_msg_composer_set_send_html (EMsgComposer *compose gboolean e_msg_composer_get_view_from (EMsgComposer *composer); void e_msg_composer_set_view_from (EMsgComposer *composer, gboolean view_from); + +gboolean e_msg_composer_get_view_replyto (EMsgComposer *composer); +void e_msg_composer_set_view_replyto (EMsgComposer *composer, + gboolean view_replyto); + gboolean e_msg_composer_get_view_bcc (EMsgComposer *composer); void e_msg_composer_set_view_bcc (EMsgComposer *composer, gboolean view_bcc); gboolean e_msg_composer_get_view_cc (EMsgComposer *composer); void e_msg_composer_set_view_cc (EMsgComposer *composer, gboolean view_cc); -void e_msg_composer_set_pgp_sign (EMsgComposer *composer, - gboolean pgp_sign); const MailConfigAccount *e_msg_composer_get_preferred_account (EMsgComposer *composer); +void e_msg_composer_set_pgp_sign (EMsgComposer *composer, + gboolean pgp_sign); gboolean e_msg_composer_get_pgp_sign (EMsgComposer *composer); void e_msg_composer_set_pgp_encrypt (EMsgComposer *composer, gboolean pgp_encrypt); gboolean e_msg_composer_get_pgp_encrypt (EMsgComposer *composer); + void e_msg_composer_clear_inlined_table (EMsgComposer *composer); gchar * e_msg_composer_guess_mime_type (const gchar *file_name); |