diff options
Diffstat (limited to 'composer/e-msg-composer-hdrs.c')
-rw-r--r-- | composer/e-msg-composer-hdrs.c | 171 |
1 files changed, 112 insertions, 59 deletions
diff --git a/composer/e-msg-composer-hdrs.c b/composer/e-msg-composer-hdrs.c index bb1bbe1fec..b59b5b8d2b 100644 --- a/composer/e-msg-composer-hdrs.c +++ b/composer/e-msg-composer-hdrs.c @@ -51,7 +51,9 @@ struct _EMsgComposerHdrsPrivate { /* The tooltips. */ GtkTooltips *tooltips; - + + GSList *from_options; + /* Standard headers. */ GtkWidget *from_entry; GtkWidget *to_entry; @@ -70,7 +72,7 @@ enum { enum { HEADER_ADDRBOOK, - HEADER_COMBOBOX, + HEADER_OPTIONMENU, HEADER_ENTRYBOX }; @@ -124,63 +126,67 @@ address_button_clicked_cb (GtkButton *button, CORBA_exception_free (&ev); } +static void +from_changed (GtkWidget *item, gpointer data) +{ + EMsgComposerHdrs *hdrs = E_MSG_COMPOSER_HDRS (data); + + hdrs->account = gtk_object_get_data (GTK_OBJECT (item), "account"); +} + static GtkWidget * -create_dropdown_entry (EMsgComposerHdrs *hdrs, - const char *name) +create_optionmenu (EMsgComposerHdrs *hdrs, + const char *name) { - GtkWidget *combo; - GList *values = NULL; + GtkWidget *omenu, *menu, *first = NULL; + int i = 0, history = 0; + + omenu = gtk_option_menu_new (); + menu = gtk_menu_new (); - combo = gtk_combo_new (); - gtk_combo_set_use_arrows (GTK_COMBO (combo), TRUE); - gtk_combo_set_case_sensitive (GTK_COMBO (combo), FALSE); if (!strcmp (name, _("From:"))) { - const MailConfigIdentity *id; - const GSList *accounts, *stmp; - GList *tmp; - char *val; + const GSList *accounts; + GtkWidget *item; accounts = mail_config_get_accounts (); - stmp = accounts; - while (stmp) { + while (accounts) { const MailConfigAccount *account; - char *address, *addr_local; - account = stmp->data; - g_assert (account); - g_assert (account->id); - g_assert (account->id->name); - g_assert (account->id->address); + account = accounts->data; - address = camel_internet_address_format_address (account->id->name, account->id->address); - addr_local = e_utf8_to_gtk_string (combo, address); - g_free (address); - values = g_list_append (values, addr_local); - stmp = stmp->next; - } - - if (values) - gtk_combo_set_popdown_strings (GTK_COMBO (combo), values); - - tmp = values; - while (tmp) { - g_free (tmp->data); - tmp = tmp->next; + /* this should never ever fail */ + if (!account || !account->name || !account->id) { + g_assert_not_reached (); + continue; + } + + item = gtk_menu_item_new_with_label (account->name); + 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_widget_show (item); + + accounts = accounts->next; + i++; } - g_list_free (values); - - id = mail_config_get_default_identity (); - g_assert (id); - g_assert (id->name); - g_assert (id->address); - - val = camel_internet_address_format_address (id->name, id->address); - - e_utf8_gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo)->entry), val); - g_free (val); } - return combo; + gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu); + if (first) { + gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), history); + gtk_signal_emit_by_name (GTK_OBJECT (first), "activate", hdrs); + } + + return omenu; } static GtkWidget * @@ -264,8 +270,8 @@ add_header (EMsgComposerHdrs *hdrs, case HEADER_ADDRBOOK: entry = create_addressbook_entry (hdrs, name); break; - case HEADER_COMBOBOX: - entry = create_dropdown_entry (hdrs, name); + case HEADER_OPTIONMENU: + entry = create_optionmenu (hdrs, name); break; default: entry = e_entry_new (); @@ -305,7 +311,7 @@ setup_headers (EMsgComposerHdrs *hdrs) (hdrs, _("From:"), _("Enter the identity you wish to send this message from"), NULL, - HEADER_COMBOBOX); + HEADER_OPTIONMENU); priv->to_entry = add_header (hdrs, _("To:"), _("Enter the recipients of the message"), @@ -339,6 +345,7 @@ destroy (GtkObject *object) { EMsgComposerHdrs *hdrs; EMsgComposerHdrsPrivate *priv; + GSList *l; hdrs = E_MSG_COMPOSER_HDRS (object); priv = hdrs->priv; @@ -352,7 +359,19 @@ destroy (GtkObject *object) } gtk_object_destroy (GTK_OBJECT (priv->tooltips)); - + + l = priv->from_options; + while (l) { + MailConfigAccount *account; + GtkWidget *item = l->data; + + account = gtk_object_get_data (GTK_OBJECT (item), "account"); + account_destroy (account); + + l = l->next; + } + g_slist_free (priv->from_options); + if (GTK_OBJECT_CLASS (parent_class)->destroy != NULL) (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); } @@ -388,19 +407,23 @@ init (EMsgComposerHdrs *hdrs) priv = g_new (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; + hdrs->has_changed = FALSE; } @@ -522,17 +545,38 @@ set_entry (BonoboWidget *bonobo_widget, g_string_free (string, TRUE); } + +/* FIXME: yea, this could be better... but it's doubtful it'll be used much */ void -e_msg_composer_hdrs_set_from (EMsgComposerHdrs *hdrs, - const char *from) +e_msg_composer_hdrs_set_from_account (EMsgComposerHdrs *hdrs, + const char *account_name) { - GtkEntry *entry; + GtkOptionMenu *omenu; + GtkWidget *item; + GSList *l; + int i = 0; g_return_if_fail (hdrs != NULL); g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs)); - entry = GTK_ENTRY (GTK_COMBO (hdrs->priv->from_entry)->entry); - e_utf8_gtk_entry_set_text (entry, from); + omenu = GTK_OPTION_MENU (hdrs->priv->from_entry); + + /* find the item that represents the account and activate it */ + l = hdrs->priv->from_options; + while (l) { + MailConfigAccount *account; + item = l->data; + + account = gtk_object_get_data (GTK_OBJECT (item), "account"); + if (!strcmp (account_name, account->name)) { + gtk_option_menu_set_history (omenu, i); + gtk_signal_emit_by_name (GTK_OBJECT (item), "activate", hdrs); + return; + } + + l = l->next; + i++; + } } void @@ -578,14 +622,23 @@ e_msg_composer_hdrs_set_subject (EMsgComposerHdrs *hdrs, NULL); } + /* FIXME: This should probably return a CamelInternetAddress */ char * e_msg_composer_hdrs_get_from (EMsgComposerHdrs *hdrs) { + const MailConfigAccount *account; + g_return_val_if_fail (hdrs != NULL, NULL); g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL); - return e_utf8_gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (hdrs->priv->from_entry)->entry)); + account = hdrs->account; + if (!account || !account->id) { + /* FIXME: perhaps we should try the default account? */ + return NULL; + } + + return camel_internet_address_format_address (account->id->name, account->id->address); } /* FIXME this is currently unused and broken. */ |