diff options
Diffstat (limited to 'composer/e-msg-composer-hdrs.c')
-rw-r--r-- | composer/e-msg-composer-hdrs.c | 425 |
1 files changed, 229 insertions, 196 deletions
diff --git a/composer/e-msg-composer-hdrs.c b/composer/e-msg-composer-hdrs.c index 3fa0634e52..57ae25a5f8 100644 --- a/composer/e-msg-composer-hdrs.c +++ b/composer/e-msg-composer-hdrs.c @@ -43,23 +43,29 @@ #define SELECT_NAMES_OAFID "OAFIID:GNOME_Evolution_Addressbook_SelectNames" +/* 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 + +typedef struct { + GtkWidget *label; + GtkWidget *entry; +} Pair; + struct _EMsgComposerHdrsPrivate { GNOME_Evolution_Addressbook_SelectNames corba_select_names; - /* Total number of headers that we have. */ - guint num_hdrs; - /* The tooltips. */ GtkTooltips *tooltips; GSList *from_options; /* Standard headers. */ - GtkWidget *from_entry; - GtkWidget *to_entry; - GtkWidget *cc_entry; - GtkWidget *bcc_entry; - GtkWidget *subject_entry; + Pair from, to, cc, bcc, subject; }; @@ -72,12 +78,6 @@ enum { LAST_SIGNAL }; -enum { - HEADER_ADDRBOOK, - HEADER_OPTIONMENU, - HEADER_ENTRYBOX -}; - static gint signals[LAST_SIGNAL]; @@ -150,7 +150,8 @@ address_button_clicked_cb (GtkButton *button, CORBA_exception_init (&ev); - GNOME_Evolution_Addressbook_SelectNames_activateDialog (priv->corba_select_names, emchas->string, &ev); + GNOME_Evolution_Addressbook_SelectNames_activateDialog ( + priv->corba_select_names, emchas->string, &ev); CORBA_exception_free (&ev); } @@ -164,67 +165,65 @@ from_changed (GtkWidget *item, gpointer data) } static GtkWidget * -create_optionmenu (EMsgComposerHdrs *hdrs, - const char *name) +create_from_optionmenu (EMsgComposerHdrs *hdrs) { GtkWidget *omenu, *menu, *first = NULL; + const GSList *accounts; + GtkWidget *item; int i = 0, history = 0; omenu = gtk_option_menu_new (); menu = gtk_menu_new (); - if (!strcmp (name, _("From:"))) { - const GSList *accounts; - GtkWidget *item; - accounts = mail_config_get_accounts (); - while (accounts) { - const MailConfigAccount *account; - char *label; - char *native_label; - - account = accounts->data; - - /* this should never ever fail */ - if (!account || !account->name || !account->id) { - g_assert_not_reached (); - continue; - } - - if (strcmp (account->name, account->id->address)) - label = g_strdup_printf ("%s <%s> (%s)", account->id->name, - account->id->address, account->name); - else - label = g_strdup_printf ("%s <%s>", account->id->name, account->id->address); - - - native_label = e_utf8_to_gtk_string (GTK_WIDGET (menu), label); - item = gtk_menu_item_new_with_label (native_label); - g_free (native_label); - g_free (label); - - gtk_object_set_data (GTK_OBJECT (item), "account", account_copy (account)); - gtk_signal_connect (GTK_OBJECT (item), "activate", - GTK_SIGNAL_FUNC (from_changed), hdrs); - - if (account->default_account) { - first = item; - history = i; - } - - /* this is so we can later set which one we want */ - hdrs->priv->from_options = g_slist_append (hdrs->priv->from_options, item); - - gtk_menu_append (GTK_MENU (menu), item); - gtk_widget_show (item); - - accounts = accounts->next; - i++; + accounts = mail_config_get_accounts (); + while (accounts) { + const MailConfigAccount *account; + char *label; + char *native_label; + + account = accounts->data; + + /* this should never ever fail */ + if (!account || !account->name || !account->id) { + g_assert_not_reached (); + continue; } + + if (strcmp (account->name, account->id->address)) + label = g_strdup_printf ("%s <%s> (%s)", account->id->name, + account->id->address, account->name); + else + label = g_strdup_printf ("%s <%s>", account->id->name, account->id->address); + + + native_label = e_utf8_to_gtk_string (GTK_WIDGET (menu), label); + item = gtk_menu_item_new_with_label (native_label); + g_free (native_label); + g_free (label); + + gtk_object_set_data (GTK_OBJECT (item), "account", account_copy (account)); + gtk_signal_connect (GTK_OBJECT (item), "activate", + GTK_SIGNAL_FUNC (from_changed), hdrs); + + if (account->default_account) { + first = item; + history = i; + } + + /* this is so we can later set which one we want */ + hdrs->priv->from_options = g_slist_append (hdrs->priv->from_options, item); + + gtk_menu_append (GTK_MENU (menu), item); + gtk_widget_show (item); + + accounts = accounts->next; + i++; } gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu); - if (first) { + + if (first){ gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), history); gtk_signal_emit_by_name (GTK_OBJECT (first), "activate", hdrs); } @@ -261,13 +260,16 @@ create_addressbook_entry (EMsgComposerHdrs *hdrs, CORBA_exception_init (&ev); - GNOME_Evolution_Addressbook_SelectNames_addSection (corba_select_names, name, name, &ev); + GNOME_Evolution_Addressbook_SelectNames_addSection ( + corba_select_names, name, name, &ev); if (ev._major != CORBA_NO_EXCEPTION) { CORBA_exception_free (&ev); return NULL; } - corba_control = GNOME_Evolution_Addressbook_SelectNames_getEntryBySection (corba_select_names, name, &ev); + corba_control = + GNOME_Evolution_Addressbook_SelectNames_getEntryBySection ( + corba_select_names, name, &ev); if (ev._major != CORBA_NO_EXCEPTION) { CORBA_exception_free (&ev); @@ -276,18 +278,47 @@ create_addressbook_entry (EMsgComposerHdrs *hdrs, CORBA_exception_free (&ev); - control_widget = bonobo_widget_new_control_from_objref (corba_control, CORBA_OBJECT_NIL); + control_widget = bonobo_widget_new_control_from_objref ( + corba_control, CORBA_OBJECT_NIL); cf = bonobo_widget_get_control_frame (BONOBO_WIDGET (control_widget)); pb = bonobo_control_frame_get_control_property_bag (cf, NULL); - bonobo_event_source_client_add_listener (pb, addressbook_entry_changed, - "Bonobo/Property:change:entry_changed", - NULL, hdrs); + bonobo_event_source_client_add_listener ( + pb, addressbook_entry_changed, + "Bonobo/Property:change:entry_changed", + NULL, hdrs); return control_widget; } +static Pair +header_new_recipient (EMsgComposerHdrs *hdrs, const gchar *name, const gchar *tip) +{ + EMsgComposerHdrsPrivate *priv; + Pair ret; + + priv = hdrs->priv; + + ret.label = gtk_button_new_with_label (name); + GTK_OBJECT_UNSET_FLAGS (ret.label, GTK_CAN_FOCUS); + gtk_signal_connect_full ( + GTK_OBJECT (ret.label), "clicked", + GTK_SIGNAL_FUNC (address_button_clicked_cb), NULL, + e_msg_composer_hdrs_and_string_create(hdrs, name), + (GtkDestroyNotify) e_msg_composer_hdrs_and_string_free, + FALSE, FALSE); + + gtk_tooltips_set_tip ( + hdrs->priv->tooltips, ret.label, + _("Click here for the address book"), + NULL); + + ret.entry = create_addressbook_entry (hdrs, name); + + return ret; +} + static void entry_changed (GtkWidget *entry, EMsgComposerHdrs *hdrs) { @@ -303,115 +334,131 @@ entry_changed (GtkWidget *entry, EMsgComposerHdrs *hdrs) gtk_signal_emit (GTK_OBJECT (hdrs), signals[HDRS_CHANGED]); } -static GtkWidget * -add_header (EMsgComposerHdrs *hdrs, - const gchar *name, - const gchar *tip, - const gchar *tip_private, - int type) +static void +create_headers (EMsgComposerHdrs *hdrs) +{ + EMsgComposerHdrsPrivate *priv = hdrs->priv; + + /* + * From: + */ + priv->from.label = gtk_label_new (_("From:")); + priv->from.entry = create_from_optionmenu (hdrs); + + /* + * Subject: + */ + priv->subject.label = gtk_label_new (_("Subject:")); + priv->subject.entry = e_entry_new (); + gtk_object_set (GTK_OBJECT (priv->subject.entry), + "editable", TRUE, + "use_ellipsis", TRUE, + "allow_newlines", FALSE, + NULL); + gtk_signal_connect (GTK_OBJECT (priv->subject.entry), "changed", + GTK_SIGNAL_FUNC (entry_changed), hdrs); + + /* + * To: CC: and Bcc: + */ + priv->to = header_new_recipient ( + hdrs, _("To:"), + _("Enter the recipients of the message")); + + priv->cc = header_new_recipient ( + hdrs, _("Cc:"), + _("Enter the addresses that will receive a carbon copy of the message")); + + priv->bcc = header_new_recipient ( + hdrs, _("Bcc:"), + _("Enter the addresses that will receive a carbon copy of " + "the message without appearing in the recipient list of " + "the message.")); +} + +static void +attach_couple (EMsgComposerHdrs *hdrs, Pair *pair, int line) { - EMsgComposerHdrsPrivate *priv; - GtkWidget *label; - GtkWidget *entry; - guint pad; + int pad; - priv = hdrs->priv; - - if (type == HEADER_ADDRBOOK) { - label = gtk_button_new_with_label (name); - GTK_OBJECT_UNSET_FLAGS (label, GTK_CAN_FOCUS); - gtk_signal_connect_full (GTK_OBJECT (label), "clicked", - GTK_SIGNAL_FUNC (address_button_clicked_cb), NULL, - e_msg_composer_hdrs_and_string_create(hdrs, name), - (GtkDestroyNotify) e_msg_composer_hdrs_and_string_free, - FALSE, FALSE); - pad = 2; - gtk_tooltips_set_tip (hdrs->priv->tooltips, label, - _("Click here for the address book"), - NULL); - } else { - label = gtk_label_new (name); + if (GTK_IS_LABEL (pair->label)) pad = GNOME_PAD; - } + else + pad = 2; - gtk_table_attach (GTK_TABLE (hdrs), label, - 0, 1, priv->num_hdrs, priv->num_hdrs + 1, - GTK_FILL, GTK_FILL, - pad, pad); - gtk_widget_show (label); - - switch (type) { - case HEADER_ADDRBOOK: - entry = create_addressbook_entry (hdrs, name); - break; - case HEADER_OPTIONMENU: - entry = create_optionmenu (hdrs, name); - break; - case HEADER_ENTRYBOX: - default: - entry = e_entry_new (); - gtk_object_set (GTK_OBJECT(entry), - "editable", TRUE, - "use_ellipsis", TRUE, - "allow_newlines", FALSE, - NULL); - gtk_signal_connect (GTK_OBJECT (entry), "changed", - GTK_SIGNAL_FUNC (entry_changed), hdrs); - } + gtk_table_attach ( + GTK_TABLE (hdrs), + pair->label, 0, 1, + line, line + 1, + GTK_FILL, GTK_FILL, pad, pad); - if (entry != NULL) { - gtk_widget_show (entry); - - gtk_table_attach (GTK_TABLE (hdrs), entry, - 1, 2, priv->num_hdrs, priv->num_hdrs + 1, - GTK_FILL | GTK_EXPAND, 0, - 2, 2); - - gtk_tooltips_set_tip (hdrs->priv->tooltips, entry, tip, tip_private); + gtk_table_attach ( + GTK_TABLE (hdrs), + pair->entry, 1, 2, + line, line + 1, + GTK_FILL | GTK_EXPAND, 0, 2, 2); +} + +static void +attach_headers (EMsgComposerHdrs *hdrs) +{ + EMsgComposerHdrsPrivate *p = hdrs->priv; + + attach_couple (hdrs, &p->from, LINE_FROM); + attach_couple (hdrs, &p->to, LINE_TO); + attach_couple (hdrs, &p->cc, LINE_CC); + attach_couple (hdrs, &p->bcc, LINE_BCC); + attach_couple (hdrs, &p->subject, LINE_SUBJECT); +} + +static void +set_pair_visibility (EMsgComposerHdrs *h, Pair *pair, gboolean visible) +{ + if (visible){ + gtk_widget_show (pair->label); + gtk_widget_show (pair->entry); + } else { + gtk_widget_hide (pair->label); + gtk_widget_hide (pair->entry); } - - priv->num_hdrs++; - - return entry; } static void -setup_headers (EMsgComposerHdrs *hdrs) +headers_set_visibility (EMsgComposerHdrs *h, gint visible_flags) { - EMsgComposerHdrsPrivate *priv; + EMsgComposerHdrsPrivate *p = h->priv; - priv = hdrs->priv; - - priv->from_entry = add_header - (hdrs, _("From:"), - _("Enter the identity you wish to send this message from"), - NULL, - HEADER_OPTIONMENU); - priv->to_entry = add_header - (hdrs, _("To:"), - _("Enter the recipients of the message"), - NULL, - HEADER_ADDRBOOK); - priv->cc_entry = add_header - (hdrs, _("Cc:"), - _("Enter the addresses that will receive a carbon copy of " - "the message"), - NULL, - HEADER_ADDRBOOK); - priv->bcc_entry = add_header - (hdrs, _("Bcc:"), - _("Enter the addresses that will receive a carbon copy of " - "the message without appearing in the recipient list of " - "the message."), - NULL, - HEADER_ADDRBOOK); - priv->subject_entry = add_header - (hdrs, _("Subject:"), - _("Enter the subject of the mail"), - NULL, - HEADER_ENTRYBOX); + set_pair_visibility (h, &p->from, visible_flags & E_MSG_COMPOSER_VISIBLE_FROM); + 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); +} + +void +e_msg_composer_set_hdrs_visible (EMsgComposerHdrs *hdrs, gint visible_flags) +{ + g_return_if_fail (hdrs != NULL); + g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs)); + + headers_set_visibility (hdrs, visible_flags); + gtk_widget_queue_resize (GTK_WIDGET (hdrs)); } +static void +setup_headers (EMsgComposerHdrs *hdrs, gint visible_flags) +{ + create_headers (hdrs); + attach_headers (hdrs); + + /* + * To: is always visible + */ + gtk_widget_show (hdrs->priv->to.label); + gtk_widget_show (hdrs->priv->to.entry); + + headers_set_visibility (hdrs, visible_flags); +} + /* GtkObject methods. */ @@ -498,25 +545,11 @@ init (EMsgComposerHdrs *hdrs) { EMsgComposerHdrsPrivate *priv; - priv = g_new (EMsgComposerHdrsPrivate, 1); + priv = g_new0 (EMsgComposerHdrsPrivate, 1); - priv->corba_select_names = CORBA_OBJECT_NIL; - - priv->from_options = NULL; - - priv->from_entry = NULL; - priv->to_entry = NULL; - priv->cc_entry = NULL; - priv->bcc_entry = NULL; - priv->subject_entry = NULL; - priv->tooltips = gtk_tooltips_new (); - priv->num_hdrs = 0; - hdrs->priv = priv; - - hdrs->account = NULL; } @@ -544,7 +577,7 @@ e_msg_composer_hdrs_get_type (void) } GtkWidget * -e_msg_composer_hdrs_new (void) +e_msg_composer_hdrs_new (gint visible_flags) { EMsgComposerHdrs *new; EMsgComposerHdrsPrivate *priv; @@ -557,7 +590,7 @@ e_msg_composer_hdrs_new (void) return NULL; } - setup_headers (new); + setup_headers (new, visible_flags); return GTK_WIDGET (new); } @@ -603,9 +636,9 @@ e_msg_composer_hdrs_to_message (EMsgComposerHdrs *hdrs, camel_mime_message_set_from (msg, from); camel_object_unref (CAMEL_OBJECT (from)); - set_recipients (msg, hdrs->priv->to_entry, CAMEL_RECIPIENT_TYPE_TO); - set_recipients (msg, hdrs->priv->cc_entry, CAMEL_RECIPIENT_TYPE_CC); - set_recipients (msg, hdrs->priv->bcc_entry, CAMEL_RECIPIENT_TYPE_BCC); + set_recipients (msg, hdrs->priv->to.entry, CAMEL_RECIPIENT_TYPE_TO); + set_recipients (msg, hdrs->priv->cc.entry, CAMEL_RECIPIENT_TYPE_CC); + set_recipients (msg, hdrs->priv->bcc.entry, CAMEL_RECIPIENT_TYPE_BCC); } @@ -642,7 +675,7 @@ e_msg_composer_hdrs_set_from_account (EMsgComposerHdrs *hdrs, g_return_if_fail (hdrs != NULL); g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs)); - omenu = GTK_OPTION_MENU (hdrs->priv->from_entry); + omenu = GTK_OPTION_MENU (hdrs->priv->from.entry); /* find the item that represents the account and activate it */ l = hdrs->priv->from_options; @@ -670,7 +703,7 @@ e_msg_composer_hdrs_set_to (EMsgComposerHdrs *hdrs, g_return_if_fail (hdrs != NULL); g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs)); - set_entry (BONOBO_WIDGET (hdrs->priv->to_entry), to_list); + set_entry (BONOBO_WIDGET (hdrs->priv->to.entry), to_list); } void @@ -680,7 +713,7 @@ e_msg_composer_hdrs_set_cc (EMsgComposerHdrs *hdrs, g_return_if_fail (hdrs != NULL); g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs)); - set_entry (BONOBO_WIDGET (hdrs->priv->cc_entry), cc_list); + set_entry (BONOBO_WIDGET (hdrs->priv->cc.entry), cc_list); } void @@ -690,7 +723,7 @@ e_msg_composer_hdrs_set_bcc (EMsgComposerHdrs *hdrs, g_return_if_fail (hdrs != NULL); g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs)); - set_entry (BONOBO_WIDGET (hdrs->priv->bcc_entry), bcc_list); + set_entry (BONOBO_WIDGET (hdrs->priv->bcc.entry), bcc_list); } void @@ -701,7 +734,7 @@ e_msg_composer_hdrs_set_subject (EMsgComposerHdrs *hdrs, g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs)); g_return_if_fail (subject != NULL); - gtk_object_set (GTK_OBJECT (hdrs->priv->subject_entry), + gtk_object_set (GTK_OBJECT (hdrs->priv->subject.entry), "text", subject, NULL); } @@ -772,7 +805,7 @@ e_msg_composer_hdrs_get_subject (EMsgComposerHdrs *hdrs) 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->subject_entry), + gtk_object_get (GTK_OBJECT (hdrs->priv->subject.entry), "text", &subject, NULL); return subject; @@ -785,7 +818,7 @@ e_msg_composer_hdrs_get_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->to_entry; + return hdrs->priv->to.entry; } GtkWidget * @@ -794,7 +827,7 @@ e_msg_composer_hdrs_get_cc_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->cc_entry; + return hdrs->priv->cc.entry; } GtkWidget * @@ -803,7 +836,7 @@ e_msg_composer_hdrs_get_bcc_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->bcc_entry; + return hdrs->priv->bcc.entry; } GtkWidget * @@ -812,5 +845,5 @@ e_msg_composer_hdrs_get_subject_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->subject_entry; + return hdrs->priv->subject.entry; } |