http://bugzilla.ximian.com/show_bug.cgi?id=3862
This is now doable so I went ahead and implemented it. Ettore thought
that since this is a UI change that I should bring it up on the list, so
here we are.
The other option, of course, is to just leave things sty the way they
are where the composer owns a "copy" of the accounts that existed at the
time that the composer was instantiated.
Jeff
? mail/accounts.xml
? mail/evolution-mail-account.schemas
? mail/fb.c
? mail/mail-account-list.h
? mail/mail-account.c
? mail/mail-account.h
Index: composer/ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/composer/ChangeLog,v
retrieving revision 1.486
diff -u -r1.486 ChangeLog
--- composer/ChangeLog 17 Jan 2003 23:32:07 -0000 1.486
+++ composer/ChangeLog 22 Jan 2003 19:41:40 -0000
@@ -1,3 +1,17 @@
+2003-01-22 Jeffrey Stedfast <[EMAIL PROTECTED]>
+
+ * e-msg-composer-hdrs.c (init): Get the list of accounts here and
+ ref the account-list.
+ (destroy): Unref the accounts list here.
+ (create_from_optionmenu): Connect to the added/changed/removed
+ account-list signals here.
+ (account_added_cb): New callback function that adds the newly
+ added account to the from-dropdown menu.
+ (account_changed_cb): New callback that changes the label for the
+ account that got changed in the dropdown menu.
+ (account_removed_cb): Removes the account from the from dropdown
+ menu.
+
2003-01-17 Jeffrey Stedfast <[EMAIL PROTECTED]>
* evolution-composer.c (impl_Composer_set_headers): Updated to use
Index: composer/e-msg-composer-hdrs.c
===================================================================
RCS file: /cvs/gnome/evolution/composer/e-msg-composer-hdrs.c,v
retrieving revision 1.103
diff -u -r1.103 e-msg-composer-hdrs.c
--- composer/e-msg-composer-hdrs.c 17 Jan 2003 23:32:07 -0000 1.103
+++ composer/e-msg-composer-hdrs.c 22 Jan 2003 19:41:40 -0000
@@ -80,6 +80,7 @@
/* The tooltips. */
GtkTooltips *tooltips;
+ EAccountList *accounts;
GSList *from_options;
/* Standard headers. */
@@ -189,17 +190,115 @@
g_signal_emit (hdrs, signals [FROM_CHANGED], 0);
}
+static void
+account_added_cb (EAccountList *accounts, EAccount *account, EMsgComposerHdrs *hdrs)
+{
+ GtkWidget *item, *menu, *omenu, *toplevel;
+ char *label;
+
+ omenu = e_msg_composer_hdrs_get_from_omenu (hdrs);
+ menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (omenu));
+
+ label = g_strdup_printf ("%s <%s>", account->id->name, account->id->address);
+ item = gtk_menu_item_new_with_label (label);
+ gtk_widget_show (item);
+ g_free (label);
+
+ g_object_ref (account);
+ g_object_set_data ((GObject *) item, "account", account);
+ g_signal_connect (item, "activate", G_CALLBACK (from_changed), hdrs);
+
+ /* 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_shell_append (GTK_MENU_SHELL (menu), item);
+
+ toplevel = gtk_widget_get_toplevel ((GtkWidget *) hdrs);
+ gtk_widget_set_sensitive (toplevel, TRUE);
+}
+
+static void
+account_changed_cb (EAccountList *accounts, EAccount *account, EMsgComposerHdrs *hdrs)
+{
+ GtkWidget *item, *label;
+ EAccount *acnt;
+ GSList *node;
+ char *text;
+
+ node = hdrs->priv->from_options;
+ while (node != NULL) {
+ item = node->data;
+ acnt = g_object_get_data ((GObject *) item, "account");
+ if (acnt == account) {
+ text = g_strdup_printf ("%s <%s>", account->id->name,
+account->id->address);
+ label = gtk_bin_get_child ((GtkBin *) item);
+ gtk_label_set_text ((GtkLabel *) label, text);
+ g_free (text);
+ break;
+ }
+
+ node = node->next;
+ }
+}
+
+static void
+account_removed_cb (EAccountList *accounts, EAccount *account, EMsgComposerHdrs *hdrs)
+{
+ struct _EMsgComposerHdrsPrivate *priv = hdrs->priv;
+ GtkWidget *item, *omenu, *toplevel, *dialog;
+ EAccount *acnt;
+ GSList *node;
+
+ node = priv->from_options;
+ while (node != NULL) {
+ item = node->data;
+ acnt = g_object_get_data ((GObject *) item, "account");
+ if (acnt == account) {
+ if (hdrs->account == account)
+ hdrs->account = NULL;
+
+ priv->from_options = g_slist_remove_link (priv->from_options,
+node);
+ g_slist_free_1 (node);
+ g_object_unref (account);
+ gtk_widget_destroy (item);
+ break;
+ }
+
+ node = node->next;
+ }
+
+ if (hdrs->account == NULL) {
+ if (priv->from_options) {
+ /* the previously selected account was removed,
+ default the new selection to the first account in
+ the menu list */
+ omenu = e_msg_composer_hdrs_get_from_omenu (hdrs);
+
+ item = priv->from_options->data;
+ gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), 0);
+ g_signal_emit_by_name (item, "activate", hdrs);
+ } else {
+ toplevel = gtk_widget_get_toplevel ((GtkWidget *) hdrs);
+ gtk_widget_set_sensitive (toplevel, FALSE);
+
+ dialog = gtk_message_dialog_new ((GtkWindow *) toplevel,
+GTK_DIALOG_MODAL |
+
+GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_WARNING,
+GTK_BUTTONS_OK, "%s",
+ _("Hey you, dunce. You need
+an account to send mail doncha know."));
+ }
+ }
+}
+
static GtkWidget *
create_from_optionmenu (EMsgComposerHdrs *hdrs)
{
- GtkWidget *omenu, *menu, *first = NULL;
- EAccountList *accounts;
- EAccount *account;
- EIterator *iter;
- GPtrArray *addresses;
- GtkWidget *item, *hbox;
+ struct _EMsgComposerHdrsPrivate *priv = hdrs->priv;
+ GtkWidget *hbox, *omenu, *menu, *item, *first = NULL;
int i = 0, history = 0, m, matches;
+ GPtrArray *addresses;
GConfClient *gconf;
+ EAccount *account;
+ EIterator *iter;
int index;
omenu = gtk_option_menu_new ();
@@ -210,8 +309,7 @@
/* Make list of account email addresses */
addresses = g_ptr_array_new ();
- accounts = mail_config_get_accounts ();
- iter = e_list_get_iterator ((EList *) accounts);
+ iter = e_list_get_iterator ((EList *) priv->accounts);
while (e_iterator_is_valid (iter)) {
account = (EAccount *) e_iterator_get (iter);
@@ -290,6 +388,11 @@
g_object_set_data ((GObject *) hbox, "from_menu", omenu);
+ /* listen for changes to the account list so we can auto-update the from menu
+*/
+ g_signal_connect (priv->accounts, "account-added", G_CALLBACK
+(account_added_cb), hdrs);
+ g_signal_connect (priv->accounts, "account-changed", G_CALLBACK
+(account_changed_cb), hdrs);
+ g_signal_connect (priv->accounts, "account-removed", G_CALLBACK
+(account_removed_cb), hdrs);
+
return hbox;
}
Index: mail/ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/mail/ChangeLog,v
retrieving revision 1.2551
diff -u -r1.2551 ChangeLog
--- mail/ChangeLog 22 Jan 2003 16:14:14 -0000 1.2551
+++ mail/ChangeLog 22 Jan 2003 19:41:48 -0000
@@ -1,3 +1,12 @@
+2003-01-22 Jeffrey Stedfast <[EMAIL PROTECTED]>
+
+ * mail-config.c (mail_config_add_account): Emit the account-added
+ event.
+ (mail_config_remove_account): Emit the account-removed event.
+
+ * mail-account-gui.c (mail_account_gui_save): Emit the changed
+ event on the account-list for the changed account.
+
2003-01-22 Radek Doulik <[EMAIL PROTECTED]>
* mail-callbacks.c (do_mail_print): put unrealized html widget
Index: mail/mail-account-gui.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/mail-account-gui.c,v
retrieving revision 1.121
diff -u -r1.121 mail-account-gui.c
--- mail/mail-account-gui.c 17 Jan 2003 23:31:25 -0000 1.121
+++ mail/mail-account-gui.c 22 Jan 2003 19:41:49 -0000
@@ -1823,6 +1823,7 @@
gboolean
mail_account_gui_save (MailAccountGui *gui)
{
+ EAccountList *accounts;
EAccount *account, *new;
CamelProvider *provider = NULL;
CamelURL *source_url = NULL, *url;
@@ -1953,8 +1954,12 @@
e_account_import (account, new);
g_object_unref (new);
- if (is_new)
+ if (is_new) {
mail_config_add_account (account);
+ } else {
+ accounts = mail_config_get_accounts ();
+ g_signal_emit_by_name (accounts, "account-changed", account);
+ }
/* if the account provider is something we can stick
in the folder-tree and not added by some other
Index: mail/mail-config.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/mail-config.c,v
retrieving revision 1.260
diff -u -r1.260 mail-config.c
--- mail/mail-config.c 21 Jan 2003 19:12:37 -0000 1.260
+++ mail/mail-config.c 22 Jan 2003 19:41:50 -0000
@@ -849,6 +849,7 @@
mail_config_add_account (EAccount *account)
{
e_list_append ((EList *) config->accounts, account);
+ g_signal_emit_by_name (config->accounts, "account-added", account);
mail_config_save_accounts ();
}
@@ -885,7 +886,10 @@
gconf_client_set_int (config->gconf,
"/apps/evolution/mail/default_account", cur - 1, NULL);
}
+ g_object_ref (account);
e_list_remove ((EList *) config->accounts, account);
+ g_signal_emit_by_name (config->accounts, "account-removed", account);
+ g_object_unref (account);
mail_config_save_accounts ();
}