diff options
Diffstat (limited to 'mail/mail-account-gui.c')
-rw-r--r-- | mail/mail-account-gui.c | 1141 |
1 files changed, 403 insertions, 738 deletions
diff --git a/mail/mail-account-gui.c b/mail/mail-account-gui.c index 669be6b39c..514ffd717d 100644 --- a/mail/mail-account-gui.c +++ b/mail/mail-account-gui.c @@ -29,48 +29,40 @@ #include <string.h> #include <stdarg.h> +#include <bonobo.h> +#include <bonobo/bonobo-stream-memory.h> #include <gal/widgets/e-unicode.h> #include <gal/widgets/e-gui-utils.h> -#include "evolution-folder-selector-button.h" +#include "shell/evolution-shell-client.h" #include "mail-account-gui.h" #include "mail-session.h" #include "mail-send-recv.h" -#include "mail-signature-editor.h" -#include "mail-composer-prefs.h" +#include "e-msg-composer.h" #define d(x) extern char *default_drafts_folder_uri, *default_sent_folder_uri; -extern EvolutionShellClient *global_shell_client; static void save_service (MailAccountGuiService *gsvc, GHashTable *extra_conf, MailConfigService *service); static void service_changed (GtkEntry *entry, gpointer user_data); -struct { - char *label; - char *value; -} ssl_options[] = { - { N_("Always"), "always" }, - { N_("Whenever Possible"), "when-possible" }, - { N_("Never"), "never" } -}; - -static int num_ssl_options = sizeof (ssl_options) / sizeof (ssl_options[0]); - static gboolean is_email (const char *address) { - /* This is supposed to check if the address's domain could be - an FQDN but alas, it's not worth the pain and suffering. */ - const char *at; + const char *at, *hname; at = strchr (address, '@'); /* make sure we have an '@' and that it's not the first or last char */ if (!at || at == address || *(at + 1) == '\0') return FALSE; - return TRUE; + hname = at + 1; + /* make sure the first and last chars aren't '.' */ + if (*hname == '.' || hname[strlen (hname) - 1] == '.') + return FALSE; + + return strchr (hname, '.') != NULL; } static GtkWidget * @@ -107,7 +99,6 @@ mail_account_gui_identity_complete (MailAccountGui *gui, GtkWidget **incomplete) if (incomplete) *incomplete = get_focused_widget (GTK_WIDGET (gui->full_name), GTK_WIDGET (gui->email_address), - GTK_WIDGET (gui->reply_to), NULL); return FALSE; } @@ -117,18 +108,6 @@ mail_account_gui_identity_complete (MailAccountGui *gui, GtkWidget **incomplete) if (incomplete) *incomplete = get_focused_widget (GTK_WIDGET (gui->email_address), GTK_WIDGET (gui->full_name), - GTK_WIDGET (gui->reply_to), - NULL); - return FALSE; - } - - /* make sure that if the reply-to field is filled in, that it is valid */ - text = gtk_entry_get_text (gui->reply_to); - if (text && *text && !is_email (text)) { - if (incomplete) - *incomplete = get_focused_widget (GTK_WIDGET (gui->reply_to), - GTK_WIDGET (gui->email_address), - GTK_WIDGET (gui->full_name), NULL); return FALSE; } @@ -136,19 +115,12 @@ mail_account_gui_identity_complete (MailAccountGui *gui, GtkWidget **incomplete) return TRUE; } -static void -auto_detected_foreach (gpointer key, gpointer value, gpointer user_data) -{ - g_free (key); - g_free (value); -} - static gboolean -service_complete (MailAccountGuiService *service, GHashTable *extra_config, GtkWidget **incomplete) +service_complete (MailAccountGuiService *service, GtkWidget **incomplete) { const CamelProvider *prov = service->provider; - GtkWidget *path; char *text; + GtkWidget *path; if (!prov) return TRUE; @@ -206,135 +178,13 @@ service_complete (MailAccountGuiService *service, GHashTable *extra_config, GtkW gboolean mail_account_gui_source_complete (MailAccountGui *gui, GtkWidget **incomplete) { - return service_complete (&gui->source, gui->extra_config, incomplete); -} - -void -mail_account_gui_auto_detect_extra_conf (MailAccountGui *gui) -{ - MailAccountGuiService *service = &gui->source; - CamelProvider *prov = service->provider; - GHashTable *auto_detected; - GtkWidget *path; - CamelURL *url; - char *text; - - if (!prov) - return; - - /* transports don't have a path */ - if (service->path) - path = GTK_WIDGET (service->path); - else - path = NULL; - - url = g_new0 (CamelURL, 1); - camel_url_set_protocol (url, prov->protocol); - - if (CAMEL_PROVIDER_ALLOWS (prov, CAMEL_URL_PART_HOST)) { - text = g_strdup (gtk_entry_get_text (service->hostname)); - if (*text) { - char *port; - - port = strchr (text, ':'); - if (port) { - *port++ = '\0'; - camel_url_set_port (url, atoi (port)); - } - - camel_url_set_host (url, text); - } - g_free (text); - } - - if (CAMEL_PROVIDER_ALLOWS (prov, CAMEL_URL_PART_USER)) { - text = g_strdup (gtk_entry_get_text (service->username)); - g_strstrip (text); - camel_url_set_user (url, text); - g_free (text); - } - - if (path && CAMEL_PROVIDER_ALLOWS (prov, CAMEL_URL_PART_PATH)) { - text = gtk_entry_get_text (service->path); - if (text && *text) - camel_url_set_path (url, text); - } - - camel_provider_auto_detect (prov, url, &auto_detected, NULL); - camel_url_free (url); - - if (auto_detected) { - CamelProviderConfEntry *entries; - GtkToggleButton *toggle; - GtkSpinButton *spin; - GtkEntry *entry; - char *value; - int i; - - entries = service->provider->extra_conf; - - for (i = 0; entries[i].type != CAMEL_PROVIDER_CONF_END; i++) { - if (!entries[i].name) - continue; - - value = g_hash_table_lookup (auto_detected, entries[i].name); - if (!value) - continue; - - switch (entries[i].type) { - case CAMEL_PROVIDER_CONF_CHECKBOX: - toggle = g_hash_table_lookup (gui->extra_config, entries[i].name); - gtk_toggle_button_set_active (toggle, atoi (value)); - break; - - case CAMEL_PROVIDER_CONF_ENTRY: - entry = g_hash_table_lookup (gui->extra_config, entries[i].name); - if (value) - gtk_entry_set_text (entry, value); - break; - - case CAMEL_PROVIDER_CONF_CHECKSPIN: - { - gboolean enable; - double val; - char *name; - - toggle = g_hash_table_lookup (gui->extra_config, entries[i].name); - name = g_strdup_printf ("%s_value", entries[i].name); - spin = g_hash_table_lookup (gui->extra_config, name); - g_free (name); - - enable = *value++ == 'y'; - gtk_toggle_button_set_active (toggle, enable); - g_assert (*value == ':'); - val = strtod (++value, NULL); - gtk_spin_button_set_value (spin, val); - } - break; - default: - } - } - - g_hash_table_foreach (auto_detected, auto_detected_foreach, NULL); - g_hash_table_destroy (auto_detected); - } + return service_complete (&gui->source, incomplete); } gboolean mail_account_gui_transport_complete (MailAccountGui *gui, GtkWidget **incomplete) { - /* If it's both source and transport, there's nothing extra to - * configure on the transport page. - */ - if (CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT (gui->transport.provider)) { - if (gui->transport.provider == gui->source.provider) - return TRUE; - if (incomplete) - *incomplete = GTK_WIDGET (gui->transport.type); - return FALSE; - } - - if (!service_complete (&gui->transport, NULL, incomplete)) + if (!service_complete (&gui->transport, incomplete)) return FALSE; /* FIXME? */ @@ -434,27 +284,7 @@ build_auth_menu (MailAccountGuiService *service, GList *all_authtypes, if (first) { gtk_option_menu_set_history (service->authtype, history); - gtk_signal_emit_by_name (GTK_OBJECT (first), "activate"); - } -} - -static void -transport_provider_set_available (MailAccountGui *gui, CamelProvider *provider, - gboolean available) -{ - GtkWidget *menuitem; - - menuitem = gtk_object_get_data (GTK_OBJECT (gui->transport.type), - provider->protocol); - g_return_if_fail (menuitem != NULL); - gtk_widget_set_sensitive (menuitem, available); - - if (available) { - gpointer number = gtk_object_get_data (GTK_OBJECT (menuitem), "number"); - - gtk_signal_emit_by_name (GTK_OBJECT (menuitem), "activate"); - gtk_option_menu_set_history (gui->transport.type, - GPOINTER_TO_UINT (number)); + gtk_signal_emit_by_name (GTK_OBJECT (first), "activate", service); } } @@ -466,13 +296,6 @@ source_type_changed (GtkWidget *widget, gpointer user_data) CamelProvider *provider; provider = gtk_object_get_data (GTK_OBJECT (widget), "provider"); - - /* If the previously-selected provider has a linked transport, - * disable it. - */ - if (gui->source.provider && - CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT (gui->source.provider)) - transport_provider_set_available (gui, gui->source.provider, FALSE); gui->source.provider = provider; @@ -518,6 +341,23 @@ source_type_changed (GtkWidget *widget, gpointer user_data) if (!dwidget) dwidget = GTK_WIDGET (gui->source.path); + if (!strcmp (provider->protocol, "mbox") + || !strcmp(provider->protocol, "spool")) { + char *path; + + if (getenv ("MAIL")) + path = g_strdup (getenv ("MAIL")); + else + path = g_strdup_printf (SYSTEM_MAIL_DIR "/%s", g_get_user_name ()); + gtk_entry_set_text (gui->source.path, path); + g_free (path); + } else if (!strcmp (provider->protocol, "maildir") && + getenv ("MAILDIR")) { + gtk_entry_set_text (gui->source.path, getenv ("MAILDIR")); + } else { + gtk_entry_set_text (gui->source.path, ""); + } + gtk_widget_show (GTK_WIDGET (file_entry)); gtk_widget_show (label); } else { @@ -529,13 +369,13 @@ source_type_changed (GtkWidget *widget, gpointer user_data) /* ssl */ #ifdef HAVE_SSL if (provider && provider->flags & CAMEL_PROVIDER_SUPPORTS_SSL) - gtk_widget_show (gui->source.ssl_hbox); + gtk_widget_show (GTK_WIDGET (gui->source.use_ssl)); else - gtk_widget_hide (gui->source.ssl_hbox); - gtk_widget_hide (gui->source.no_ssl); + gtk_widget_hide (GTK_WIDGET (gui->source.use_ssl)); + gtk_widget_hide (GTK_WIDGET (gui->source.no_ssl)); #else - gtk_widget_hide (gui->source.ssl_hbox); - gtk_widget_show (gui->source.no_ssl); + gtk_widget_hide (GTK_WIDGET (gui->source.use_ssl)); + gtk_widget_show (GTK_WIDGET (gui->source.no_ssl)); #endif /* auth */ @@ -557,9 +397,6 @@ source_type_changed (GtkWidget *widget, gpointer user_data) gtk_widget_grab_focus (dwidget); mail_account_gui_build_extra_conf (gui, gui && gui->account && gui->account->source ? gui->account->source->url : NULL); - - if (provider && CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT (provider)) - transport_provider_set_available (gui, provider, TRUE); } @@ -587,13 +424,15 @@ transport_type_changed (GtkWidget *widget, gpointer user_data) gui->transport.provider = provider; /* description */ - gtk_label_set_text (gui->transport.description, provider->description); + if (provider) + gtk_label_set_text (gui->transport.description, provider->description); + else + gtk_label_set_text (gui->transport.description, ""); frame = glade_xml_get_widget (gui->xml, "transport_frame"); - if (!CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT (provider) && - (CAMEL_PROVIDER_ALLOWS (provider, CAMEL_URL_PART_HOST) || - (CAMEL_PROVIDER_ALLOWS (provider, CAMEL_URL_PART_AUTH) && - !CAMEL_PROVIDER_NEEDS (provider, CAMEL_URL_PART_AUTH)))) { + if (CAMEL_PROVIDER_ALLOWS (provider, CAMEL_URL_PART_HOST) || + (CAMEL_PROVIDER_ALLOWS (provider, CAMEL_URL_PART_AUTH) && + !CAMEL_PROVIDER_NEEDS (provider, CAMEL_URL_PART_AUTH))) { gtk_widget_show (frame); label = glade_xml_get_widget (gui->xml, "transport_host_label"); @@ -609,13 +448,13 @@ transport_type_changed (GtkWidget *widget, gpointer user_data) /* ssl */ #ifdef HAVE_SSL if (provider && provider->flags & CAMEL_PROVIDER_SUPPORTS_SSL) - gtk_widget_show (gui->transport.ssl_hbox); + gtk_widget_show (GTK_WIDGET (gui->transport.use_ssl)); else - gtk_widget_hide (gui->transport.ssl_hbox); - gtk_widget_hide (gui->transport.no_ssl); + gtk_widget_hide (GTK_WIDGET (gui->transport.use_ssl)); + gtk_widget_hide (GTK_WIDGET (gui->transport.no_ssl)); #else - gtk_widget_hide (gui->transport.ssl_hbox); - gtk_widget_show (gui->transport.no_ssl); + gtk_widget_hide (GTK_WIDGET (gui->transport.use_ssl)); + gtk_widget_show (GTK_WIDGET (gui->transport.no_ssl)); #endif /* auth */ @@ -628,8 +467,7 @@ transport_type_changed (GtkWidget *widget, gpointer user_data) gtk_widget_hide (frame); frame = glade_xml_get_widget (gui->xml, "transport_auth_frame"); - if (!CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT (provider) && - CAMEL_PROVIDER_ALLOWS (provider, CAMEL_URL_PART_AUTH)) { + if (CAMEL_PROVIDER_ALLOWS (provider, CAMEL_URL_PART_AUTH)) { gtk_widget_show (frame); label = glade_xml_get_widget (gui->xml, "transport_user_label"); @@ -655,7 +493,7 @@ service_changed (GtkEntry *entry, gpointer user_data) MailAccountGuiService *service = user_data; gtk_widget_set_sensitive (GTK_WIDGET (service->check_supported), - service_complete (service, NULL, NULL)); + service_complete (service, NULL)); } static void @@ -722,8 +560,6 @@ mail_account_gui_build_extra_conf (MailAccountGui *gui, const char *url_string) { CamelURL *url; GtkWidget *mailcheck_frame, *main_vbox, *cur_vbox; - GtkWidget *hostname_label, *username_label, *path_label; - GtkWidget *hostname, *username, *path; CamelProviderConfEntry *entries; GList *children, *child; char *name; @@ -734,18 +570,6 @@ mail_account_gui_build_extra_conf (MailAccountGui *gui, const char *url_string) else url = NULL; - hostname_label = glade_xml_get_widget (gui->xml, "source_host_label"); - gtk_label_parse_uline (GTK_LABEL (hostname_label), _("_Host:")); - hostname = glade_xml_get_widget (gui->xml, "source_host"); - - username_label = glade_xml_get_widget (gui->xml, "source_user_label"); - gtk_label_parse_uline (GTK_LABEL (username_label), _("User_name:")); - username = glade_xml_get_widget (gui->xml, "source_user"); - - path_label = glade_xml_get_widget (gui->xml, "source_path_label"); - gtk_label_parse_uline (GTK_LABEL (path_label), _("_Path:")); - path = glade_xml_get_widget (gui->xml, "source_path"); - main_vbox = glade_xml_get_widget (gui->xml, "extra_vbox"); mailcheck_frame = glade_xml_get_widget (gui->xml, "extra_mailcheck_frame"); @@ -816,30 +640,12 @@ mail_account_gui_build_extra_conf (MailAccountGui *gui, const char *url_string) cur_vbox = main_vbox; break; - case CAMEL_PROVIDER_CONF_LABEL: - if (entries[i].name && entries[i].text) { - GtkWidget *label; - - if (!strcmp (entries[i].name, "username")) { - gtk_label_parse_uline (GTK_LABEL (username_label), _(entries[i].text)); - } else if (!strcmp (entries[i].name, "hostname")) { - gtk_label_parse_uline (GTK_LABEL (hostname_label), _(entries[i].text)); - } else if (!strcmp (entries[i].name, "path")) { - gtk_label_parse_uline (GTK_LABEL (path_label), _(entries[i].text)); - } else { - /* make a new label */ - label = gtk_label_new (_(entries[i].text)); - gtk_box_pack_start (GTK_BOX (cur_vbox), label, FALSE, FALSE, 0); - } - } - break; - case CAMEL_PROVIDER_CONF_CHECKBOX: { GtkWidget *checkbox; gboolean active; - checkbox = gtk_check_button_new_with_label (_(entries[i].text)); + checkbox = gtk_check_button_new_with_label (entries[i].text); if (url) active = camel_url_get_param (url, entries[i].name) != NULL; else @@ -857,44 +663,25 @@ mail_account_gui_build_extra_conf (MailAccountGui *gui, const char *url_string) GtkWidget *hbox, *label, *entry; const char *text; - if (!strcmp (entries[i].name, "username")) { - gtk_label_parse_uline (GTK_LABEL (username_label), _(entries[i].text)); - label = username_label; - entry = username; - } else if (!strcmp (entries[i].name, "hostname")) { - gtk_label_parse_uline (GTK_LABEL (hostname_label), _(entries[i].text)); - label = hostname_label; - entry = hostname; - } else if (!strcmp (entries[i].name, "path")) { - gtk_label_parse_uline (GTK_LABEL (path_label), _(entries[i].text)); - label = path_label; - entry = path; - } else { - /* make a new text entry with label */ - hbox = gtk_hbox_new (FALSE, 8); - label = gtk_label_new (_(entries[i].text)); - entry = gtk_entry_new (); - - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - gtk_box_pack_end (GTK_BOX (hbox), entry, TRUE, TRUE, 0); - - gtk_box_pack_start (GTK_BOX (cur_vbox), hbox, FALSE, FALSE, 0); - g_hash_table_insert (gui->extra_config, entries[i].name, entry); - } - + hbox = gtk_hbox_new (FALSE, 8); + label = gtk_label_new (entries[i].text); + entry = gtk_entry_new (); if (url) text = camel_url_get_param (url, entries[i].name); else text = entries[i].value; - if (text) gtk_entry_set_text (GTK_ENTRY (entry), text); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + gtk_box_pack_end (GTK_BOX (hbox), entry, TRUE, TRUE, 0); + + gtk_box_pack_start (GTK_BOX (cur_vbox), hbox, FALSE, FALSE, 0); + g_hash_table_insert (gui->extra_config, entries[i].name, entry); if (entries[i].depname) { setup_toggle (entry, entries[i].depname, gui); setup_toggle (label, entries[i].depname, gui); } - break; } @@ -906,8 +693,7 @@ mail_account_gui_build_extra_conf (MailAccountGui *gui, const char *url_string) double min, def, max; gboolean enable; - /* FIXME: this is pretty fucked... */ - data = _(entries[i].text); + data = entries[i].text; p = strstr (data, "%s"); g_return_if_fail (p != NULL); @@ -1025,34 +811,53 @@ extract_values (MailAccountGuiService *source, GHashTable *extra_config, CamelUR } +extern EvolutionShellClient *global_shell_client; + static void -folder_selected (EvolutionFolderSelectorButton *button, - GNOME_Evolution_Folder *corba_folder, - gpointer user_data) +set_folder_picker_label (GtkButton *button, const char *name) { - char **folder_name = user_data; + char *string; - g_free (*folder_name); - *folder_name = g_strdup (corba_folder->physicalUri); + string = e_utf8_to_gtk_string (GTK_WIDGET (button), name); + gtk_label_set_text (GTK_LABEL (GTK_BIN (button)->child), string); + g_free (string); } -GtkWidget *mail_account_gui_folder_selector_button_new (char *widget_name, char *string1, char *string2, int int1, int int2); - -GtkWidget * -mail_account_gui_folder_selector_button_new (char *widget_name, - char *string1, char *string2, - int int1, int int2) +static void +folder_picker_clicked (GtkButton *button, gpointer user_data) { - return (GtkWidget *)gtk_type_new (EVOLUTION_TYPE_FOLDER_SELECTOR_BUTTON); + MailAccountGuiFolder *folder = user_data; + const char *allowed_types[] = { "mail", NULL }; + char *physical_uri, *evolution_uri; + + physical_uri = evolution_uri = NULL; + evolution_shell_client_user_select_folder ( + global_shell_client, + GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (button))), + _("Select Folder"), folder->uri, + allowed_types, &evolution_uri, &physical_uri); + if (!physical_uri || !*physical_uri) { + g_free (physical_uri); + g_free (evolution_uri); + return; + } + + g_free (folder->uri); + folder->uri = physical_uri; + g_free (folder->name); + folder->name = g_strdup (g_basename (evolution_uri)); + g_free (evolution_uri); + set_folder_picker_label (button, folder->name); } + static gboolean setup_service (MailAccountGuiService *gsvc, MailConfigService *service) { CamelURL *url = camel_url_new (service->url, NULL); gboolean has_auth = FALSE; - if (url == NULL || gsvc->provider == NULL) + if (url == NULL) return FALSE; if (url->user && CAMEL_PROVIDER_ALLOWS (gsvc->provider, CAMEL_URL_PART_USER)) @@ -1074,24 +879,8 @@ setup_service (MailAccountGuiService *gsvc, MailConfigService *service) gtk_entry_set_text (gsvc->path, url->path); if (gsvc->provider->flags & CAMEL_PROVIDER_SUPPORTS_SSL) { - GList *children, *item; - const char *use_ssl; - int i; - - use_ssl = camel_url_get_param (url, "use_ssl"); - if (!use_ssl) - use_ssl = "never"; - else if (!*use_ssl) /* old config code just used an empty string as the value */ - use_ssl = "always"; - - children = gtk_container_children (GTK_CONTAINER (gtk_option_menu_get_menu (gsvc->use_ssl))); - for (item = children, i = 0; item; item = item->next, i++) { - if (!strcmp (use_ssl, ssl_options[i].value)) { - gtk_option_menu_set_history (gsvc->use_ssl, i); - gtk_signal_emit_by_name (item->data, "activate", gsvc); - break; - } - } + gboolean use_ssl = camel_url_get_param (url, "use_ssl") != NULL; + gtk_toggle_button_set_active (gsvc->use_ssl, use_ssl); } if (url->authmech && CAMEL_PROVIDER_ALLOWS (gsvc->provider, CAMEL_URL_PART_AUTH)) { @@ -1136,411 +925,308 @@ provider_compare (const CamelProvider *p1, const CamelProvider *p2) } } -static void -ssl_option_activate (GtkWidget *widget, gpointer user_data) -{ - MailAccountGuiService *service = user_data; - - service->ssl_selected = widget; -} +/* + * Signature editor + * + */ -static void -construct_ssl_menu (MailAccountGuiService *service) -{ - GtkWidget *menu, *item = NULL; - int i; - - menu = gtk_menu_new (); - - for (i = 0; i < num_ssl_options; i++) { - item = gtk_menu_item_new_with_label (_(ssl_options[i].label)); - gtk_object_set_data (GTK_OBJECT (item), "use_ssl", ssl_options[i].value); - gtk_signal_connect (GTK_OBJECT (item), "activate", - ssl_option_activate, service); - gtk_widget_show (item); - gtk_menu_append (GTK_MENU (menu), item); - } - - gtk_option_menu_remove_menu (service->use_ssl); - gtk_option_menu_set_menu (service->use_ssl, menu); +struct _ESignatureEditor { + MailAccountGui *gui; + GtkWidget *win; + GtkWidget *control; - gtk_option_menu_set_history (service->use_ssl, i - 1); - gtk_signal_emit_by_name (GTK_OBJECT (item), "activate", service); -} + gchar *filename; + gboolean html; + gboolean has_changed; +}; +typedef struct _ESignatureEditor ESignatureEditor; -static void -clear_menu (GtkWidget *menu) -{ - while (GTK_MENU_SHELL (menu)->children) - gtk_container_remove (GTK_CONTAINER (menu), GTK_MENU_SHELL (menu)->children->data); -} +#define E_SIGNATURE_EDITOR(o) ((ESignatureEditor *) o) -static inline int -sig_get_index (MailConfigSignature *sig) +#define DEFAULT_WIDTH 600 +#define DEFAULT_HEIGHT 500 + +enum { REPLY_YES = 0, REPLY_NO, REPLY_CANCEL }; + +static void +destroy_editor (ESignatureEditor *editor) { - return sig->id + (mail_config_get_signatures_random () ? 2 : 1); + gtk_widget_destroy (editor->win); + g_free (editor->filename); + g_free (editor); } -static gint -sig_get_gui_index (MailAccountGui *gui, gboolean text) -{ - MailConfigSignature *sig = text ? gui->text_signature : gui->html_signature; - gboolean random = text ? gui->text_random : gui->html_random; +static void +menu_file_save_error (BonoboUIComponent *uic, CORBA_Environment *ev) { + e_notice (GTK_WINDOW (uic), GNOME_MESSAGE_BOX_ERROR, + _("Could not save signature file.")); - if (random) - return 1; - else if (!sig) - return 0; - else - return sig_get_index (sig); + g_warning ("Exception while saving signature (%s)", + bonobo_exception_get_text (ev)); } static void -sig_fill_options (MailAccountGui *gui) +menu_file_save_cb (BonoboUIComponent *uic, + void *data, + const char *path) { - GtkWidget *menu_text, *menu_html; - GtkWidget *mi; - GList *l; - MailConfigSignature *sig; - - menu_text = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_text)); - menu_html = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_html)); - - clear_menu (menu_text); - clear_menu (menu_html); + ESignatureEditor *editor; + Bonobo_PersistFile pfile_iface; + CORBA_Environment ev; - gtk_menu_append (GTK_MENU (menu_text), gtk_menu_item_new_with_label (_("None"))); - gtk_menu_append (GTK_MENU (menu_html), gtk_menu_item_new_with_label (_("None"))); + editor = E_SIGNATURE_EDITOR (data); + if (editor->html) { + CORBA_exception_init (&ev); + + pfile_iface = bonobo_object_client_query_interface (bonobo_widget_get_server (BONOBO_WIDGET (editor->control)), + "IDL:Bonobo/PersistFile:1.0", NULL); + Bonobo_PersistFile_save (pfile_iface, editor->filename, &ev); + + if (ev._major != CORBA_NO_EXCEPTION) + menu_file_save_error (uic, &ev); + + CORBA_exception_free (&ev); + } else { + BonoboStream *stream; + CORBA_Environment ev; + Bonobo_PersistStream pstream_iface; + + CORBA_exception_init (&ev); - if (mail_config_get_signatures_random ()) { - gtk_menu_append (GTK_MENU (menu_text), gtk_menu_item_new_with_label (_("Random"))); - gtk_menu_append (GTK_MENU (menu_html), gtk_menu_item_new_with_label (_("Random"))); - } + stream = bonobo_stream_open (BONOBO_IO_DRIVER_FS, editor->filename, + Bonobo_Storage_WRITE | Bonobo_Storage_CREATE, 0); + + pstream_iface = bonobo_object_client_query_interface + (bonobo_widget_get_server (BONOBO_WIDGET (editor->control)), + "IDL:Bonobo/PersistStream:1.0", NULL); + + Bonobo_PersistStream_save (pstream_iface, + (Bonobo_Stream) bonobo_object_corba_objref (BONOBO_OBJECT (stream)), + "text/plain", &ev); + + if (ev._major != CORBA_NO_EXCEPTION) + menu_file_save_error (uic, &ev); - for (l = mail_config_get_signature_list (); l; l = l->next) { - sig = l->data; - mi = gtk_menu_item_new_with_label (sig->name); - gtk_object_set_data (GTK_OBJECT (mi), "sig", sig); - gtk_menu_append (GTK_MENU (menu_text), mi); - - mi = gtk_menu_item_new_with_label (sig->name); - gtk_object_set_data (GTK_OBJECT (mi), "sig", sig); - gtk_menu_append (GTK_MENU (menu_html), mi); + CORBA_exception_free (&ev); + bonobo_object_unref (BONOBO_OBJECT (stream)); } } static void -sig_select_text_sig (MailAccountGui *gui) +exit_dialog_cb (int reply, ESignatureEditor *editor) { - gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_text), sig_get_gui_index (gui, TRUE)); + switch (reply) { + case REPLY_YES: + menu_file_save_cb (NULL, editor, NULL); + destroy_editor (editor); + break; + case REPLY_NO: + destroy_editor (editor); + break; + case REPLY_CANCEL: + default: + } } static void -sig_select_html_sig (MailAccountGui *gui) +do_exit (ESignatureEditor *editor) { - gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_html), sig_get_gui_index (gui, FALSE)); + if (editor->has_changed) { + GtkWidget *dialog; + GtkWidget *label; + gint button; + + dialog = gnome_dialog_new (_("Save signature"), + GNOME_STOCK_BUTTON_YES, /* Save */ + GNOME_STOCK_BUTTON_NO, /* Don't save */ + GNOME_STOCK_BUTTON_CANCEL, /* Cancel */ + NULL); + + label = gtk_label_new (_("This signature has been changed, but hasn't been saved.\n" + "\nDo you wish to save your changes?")); + gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + gnome_dialog_set_parent (GNOME_DIALOG (dialog), GTK_WINDOW (editor->win)); + gnome_dialog_set_default (GNOME_DIALOG (dialog), 0); + button = gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); + + exit_dialog_cb (button, editor); + } else + destroy_editor (editor); } -static void -sig_changed_text (GtkWidget *w, MailAccountGui *gui) +static int +delete_event_cb (GtkWidget *w, GdkEvent *event, ESignatureEditor *editor) { - GtkWidget *active; - int index; - - active = gtk_menu_get_active (GTK_MENU (w)); - index = g_list_index (GTK_MENU_SHELL (w)->children, active); - - gui->text_signature = (MailConfigSignature *) gtk_object_get_data (GTK_OBJECT (active), "sig"); - gui->text_random = index == 1; - - gtk_widget_set_sensitive (GTK_WIDGET (gui->sig_edit_text), gui->text_signature != NULL); + do_exit (editor); } static void -sig_changed_html (GtkWidget *w, MailAccountGui *gui) +menu_file_close_cb (BonoboUIComponent *uic, gpointer data, const gchar *path) { - GtkWidget *active; - int index; - - active = gtk_menu_get_active (GTK_MENU (w)); - index = g_list_index (GTK_MENU_SHELL (w)->children, active); + ESignatureEditor *editor; - gui->html_signature = (MailConfigSignature *) gtk_object_get_data (GTK_OBJECT (active), "sig"); - gui->html_random = index == 1; - - gtk_widget_set_sensitive (GTK_WIDGET (gui->sig_edit_html), gui->html_signature != NULL); + editor = E_SIGNATURE_EDITOR (data); + do_exit (editor); } static void -sig_edit_text (GtkWidget *w, MailAccountGui *gui) +menu_file_save_close_cb (BonoboUIComponent *uic, gpointer data, const gchar *path) { - MailConfigSignature *sig = gui->text_signature; - - if (!sig) - return; + ESignatureEditor *editor; - if (sig->filename && *sig->filename) - mail_signature_editor (sig); - else - e_notice (NULL, GNOME_MESSAGE_BOX_ERROR, - _("Please specify signature filename\nin Andvanced section of signature settings.")); -} + editor = E_SIGNATURE_EDITOR (data); -static void -sig_edit_html (GtkWidget *w, MailAccountGui *gui) -{ - MailConfigSignature *sig = gui->html_signature; - - if (!sig) - return; - - if (sig->filename && *sig->filename) - mail_signature_editor (sig); - else - e_notice (NULL, GNOME_MESSAGE_BOX_ERROR, - _("Please specify signature filename\nin Andvanced section of signature settings.")); + menu_file_save_cb (uic, editor, path); + destroy_editor (editor); } -static void -sig_switch_to_list (GtkWidget *w, MailAccountGui *gui) -{ - gtk_window_set_transient_for (GTK_WINDOW (gtk_widget_get_toplevel (w)), NULL); - gdk_window_raise (GTK_WIDGET (gui->dialog)->window); - gtk_notebook_set_page (GTK_NOTEBOOK (glade_xml_get_widget (gui->dialog->gui, "notebook")), 3); -} +static BonoboUIVerb verbs [] = { + + BONOBO_UI_VERB ("FileSave", menu_file_save_cb), + BONOBO_UI_VERB ("FileClose", menu_file_close_cb), + BONOBO_UI_VERB ("FileSaveClose", menu_file_save_close_cb), + + BONOBO_UI_VERB_END +}; static void -sig_set_and_write (MailAccountGui *gui) +load_signature (ESignatureEditor *editor) { - gui->account->id->text_signature = gui->text_signature; - gui->account->id->text_random = gui->text_random; - gui->account->id->html_signature = gui->html_signature; - gui->account->id->html_random = gui->html_random; + CORBA_Environment ev; - mail_config_write_account_sig (gui->account, -1); + if (editor->html) { + Bonobo_PersistFile pfile_iface; + + pfile_iface = bonobo_object_client_query_interface (bonobo_widget_get_server (BONOBO_WIDGET (editor->control)), + "IDL:Bonobo/PersistFile:1.0", NULL); + CORBA_exception_init (&ev); + Bonobo_PersistFile_load (pfile_iface, editor->filename, &ev); + CORBA_exception_free (&ev); + } else { + Bonobo_PersistStream pstream_iface; + BonoboStream *stream; + gchar *data, *html; + + data = e_msg_composer_get_sig_file_content (editor->filename, FALSE); + html = g_strdup_printf ("<PRE>\n%s", data); + g_free (data); + + pstream_iface = bonobo_object_client_query_interface + (bonobo_widget_get_server (BONOBO_WIDGET (editor->control)), + "IDL:Bonobo/PersistStream:1.0", NULL); + CORBA_exception_init (&ev); + stream = bonobo_stream_mem_create (html, strlen (html), TRUE, FALSE); + + if (stream == NULL) { + g_warning ("Couldn't create memory stream\n"); + } else { + BonoboObject *stream_object; + Bonobo_Stream corba_stream; + + stream_object = BONOBO_OBJECT (stream); + corba_stream = bonobo_object_corba_objref (stream_object); + Bonobo_PersistStream_load (pstream_iface, corba_stream, + "text/html", &ev); + } + + Bonobo_Unknown_unref (pstream_iface, &ev); + CORBA_Object_release (pstream_iface, &ev); + CORBA_exception_free (&ev); + bonobo_object_unref (BONOBO_OBJECT (stream)); + + g_free (html); + } } static void -sig_new_text (GtkWidget *w, MailAccountGui *gui) +launch_signature_editor (MailAccountGui *gui, const gchar *filename, gboolean html) { - if (!gui->dialog) - return; + ESignatureEditor *editor; + BonoboUIComponent *component; + BonoboUIContainer *container; + gchar *title; - sig_switch_to_list (w, gui); - - gui->text_signature = mail_composer_prefs_new_signature (NULL, FALSE); - gui->text_random = FALSE; + if (!filename || !*filename) + return; - gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_text), sig_get_index (gui->text_signature)); + editor = g_new0 (ESignatureEditor, 1); - sig_set_and_write (gui); - gtk_widget_set_sensitive (gui->sig_edit_text, TRUE); -} + editor->html = html; + editor->filename = g_strdup (filename); + editor->has_changed = TRUE; -static void -sig_new_html (GtkWidget *w, MailAccountGui *gui) -{ - if (!gui->dialog) - return; + title = g_strdup_printf ("Edit %ssignature (%s)", html ? "HTML " : "", filename); + editor->win = bonobo_window_new ("e-sig-editor", title); + editor->gui = gui; + gtk_window_set_default_size (GTK_WINDOW (editor->win), DEFAULT_WIDTH, DEFAULT_HEIGHT); + gtk_window_set_policy (GTK_WINDOW (editor->win), FALSE, TRUE, FALSE); + gtk_window_set_modal (GTK_WINDOW (editor->win), TRUE); + g_free (title); - sig_switch_to_list (w, gui); + container = bonobo_ui_container_new (); + bonobo_ui_container_set_win (container, BONOBO_WINDOW (editor->win)); - gui->html_signature = mail_composer_prefs_new_signature (NULL, TRUE); - gui->html_random = FALSE; + component = bonobo_ui_component_new_default (); + bonobo_ui_component_set_container (component, bonobo_object_corba_objref (BONOBO_OBJECT (container))); + bonobo_ui_component_add_verb_list_with_data (component, verbs, editor); + bonobo_ui_util_set_ui (component, EVOLUTION_DATADIR, "evolution-signature-editor.xml", "evolution-signature-editor"); - gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_html), sig_get_index (gui->html_signature)); + editor->control = bonobo_widget_new_control ("OAFIID:GNOME_GtkHTML_Editor", + bonobo_ui_component_get_container (component)); - sig_set_and_write (gui); - gtk_widget_set_sensitive (gui->sig_edit_html, TRUE); + if (editor->control == NULL) { + g_warning ("Cannot get 'OAFIID:GNOME_GtkHTML_Editor'."); + + destroy_editor (editor); + return; + } + + load_signature (editor); + + gtk_signal_connect (GTK_OBJECT (editor->win), "delete_event", + GTK_SIGNAL_FUNC (delete_event_cb), editor); + + bonobo_window_set_contents (BONOBO_WINDOW (editor->win), editor->control); + bonobo_widget_set_property (BONOBO_WIDGET (editor->control), "FormatHTML", html, NULL); + gtk_widget_show (GTK_WIDGET (editor->win)); + gtk_widget_show (GTK_WIDGET (editor->control)); + gtk_widget_grab_focus (editor->control); } static void -setup_signatures (MailAccountGui *gui) +edit_signature (GtkWidget *w, MailAccountGui *gui) { - gui->text_signature = gui->account->id->text_signature; - gui->text_random = gui->account->id->text_random; - gui->html_signature = gui->account->id->html_signature; - gui->html_random = gui->account->id->html_random; - - sig_select_text_sig (gui); - sig_select_html_sig (gui); - - gtk_widget_set_sensitive (GTK_WIDGET (gui->sig_edit_text), gui->text_signature != NULL); - gtk_widget_set_sensitive (GTK_WIDGET (gui->sig_edit_html), gui->html_signature != NULL); + launch_signature_editor (gui, gtk_entry_get_text (GTK_ENTRY (gnome_file_entry_gtk_entry (gui->signature))), FALSE); } static void -sig_event_client (MailConfigSigEvent event, MailConfigSignature *sig, MailAccountGui *gui) +edit_html_signature (GtkWidget *w, MailAccountGui *gui) { - switch (event) { - case MAIL_CONFIG_SIG_EVENT_ADDED: { - GtkWidget *menu; - GtkWidget *mi; - - d(printf ("accounts ADDED\n")); - mi = gtk_menu_item_new_with_label (sig->name); - gtk_object_set_data (GTK_OBJECT (mi), "sig", sig); - gtk_widget_show (mi); - menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_text)); - gtk_menu_append (GTK_MENU (menu), mi); - - mi = gtk_menu_item_new_with_label (sig->name); - gtk_object_set_data (GTK_OBJECT (mi), "sig", sig); - gtk_widget_show (mi); - menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_html)); - gtk_menu_append (GTK_MENU (GTK_MENU (menu)), mi); - - break; - } - case MAIL_CONFIG_SIG_EVENT_NAME_CHANGED: { - GtkWidget *menu; - GtkWidget *mi; - - d(printf ("gui NAME CHANGED\n")); - menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_text)); - gtk_widget_ref (menu); - gtk_option_menu_remove_menu (GTK_OPTION_MENU (gui->sig_option_text)); - mi = g_list_nth_data (GTK_MENU_SHELL (menu)->children, sig_get_index (sig)); - gtk_label_set_text (GTK_LABEL (GTK_BIN (mi)->child), sig->name); - gtk_option_menu_set_menu (GTK_OPTION_MENU (gui->sig_option_text), menu); - gtk_widget_unref (menu); - gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_text), sig_get_gui_index (gui, TRUE)); - - menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_html)); - gtk_widget_ref (menu); - gtk_option_menu_remove_menu (GTK_OPTION_MENU (gui->sig_option_html)); - mi = g_list_nth_data (GTK_MENU_SHELL (menu)->children, sig_get_index (sig)); - gtk_label_set_text (GTK_LABEL (GTK_BIN (mi)->child), sig->name); - gtk_option_menu_set_menu (GTK_OPTION_MENU (gui->sig_option_html), menu); - gtk_widget_unref (menu); - gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_html), sig_get_gui_index (gui, FALSE)); - - break; - } - case MAIL_CONFIG_SIG_EVENT_DELETED: { - GtkWidget *menu; - GtkWidget *mi; - - d(printf ("gui DELETED\n")); - - if (sig == gui->text_signature) { - gui->text_signature = NULL; - gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_text), - sig_get_gui_index (gui, TRUE)); - } - - if (sig == gui->html_signature) { - gui->html_signature = NULL; - gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_html), - sig_get_gui_index (gui, FALSE)); - } - - menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_text)); - mi = g_list_nth_data (GTK_MENU_SHELL (menu)->children, sig_get_index (sig)); - gtk_container_remove (GTK_CONTAINER (menu), mi); - - menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_html)); - mi = g_list_nth_data (GTK_MENU_SHELL (menu)->children, sig_get_index (sig)); - gtk_container_remove (GTK_CONTAINER (menu), mi); + launch_signature_editor (gui, gtk_entry_get_text (GTK_ENTRY (gnome_file_entry_gtk_entry (gui->html_signature))), TRUE); +} - break; - } - case MAIL_CONFIG_SIG_EVENT_RANDOM_ON: { - GtkWidget *menu; - GtkWidget *mi; - - d(printf ("gui RANDOM ON\n")); - - mi = gtk_menu_item_new_with_label (_("Random")); - menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_text)); - gtk_menu_insert (GTK_MENU (menu), mi, 1); - gtk_widget_show (mi); - - mi = gtk_menu_item_new_with_label (_("Random")); - menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_html)); - gtk_menu_insert (GTK_MENU (menu), mi, 1); - gtk_widget_show (mi); - - break; - } - case MAIL_CONFIG_SIG_EVENT_RANDOM_OFF: { - GtkWidget *menu; - GtkWidget *mi; - - d(printf ("gui RANDOM OFF\n")); - - if (gui->text_random) { - gui->text_random = FALSE; - gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_text), - sig_get_gui_index (gui, TRUE)); - } - - if (gui->html_random) { - gui->html_random = FALSE; - gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_html), - sig_get_gui_index (gui, FALSE)); - } - - menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_text)); - mi = g_list_nth_data (GTK_MENU_SHELL (menu)->children, 1); - gtk_container_remove (GTK_CONTAINER (menu), mi); - - menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_html)); - mi = g_list_nth_data (GTK_MENU_SHELL (menu)->children, 1); - gtk_container_remove (GTK_CONTAINER (menu), mi); - - break; - } - default: - ; - } +static void +signature_changed (GtkWidget *entry, MailAccountGui *gui) +{ + gtk_widget_set_sensitive (GTK_WIDGET (gui->edit_signature), + *gtk_entry_get_text (GTK_ENTRY (gnome_file_entry_gtk_entry (gui->signature))) != 0); } static void -prepare_signatures (MailAccountGui *gui) +html_signature_changed (GtkWidget *entry, MailAccountGui *gui) { - gui->sig_option_text = glade_xml_get_widget (gui->xml, "option-sig-text"); - gui->sig_option_html = glade_xml_get_widget (gui->xml, "option-sig-html"); - - sig_fill_options (gui); - - gtk_signal_connect (GTK_OBJECT (gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_text))), - "selection-done", sig_changed_text, gui); - gtk_signal_connect (GTK_OBJECT (gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_html))), - "selection-done", sig_changed_html, gui); - - gui->sig_new_text = glade_xml_get_widget (gui->xml, "button-sig-new-text"); - gtk_signal_connect (GTK_OBJECT (gui->sig_new_text), "clicked", GTK_SIGNAL_FUNC (sig_new_text), gui); - gui->sig_new_html = glade_xml_get_widget (gui->xml, "button-sig-new-html"); - gtk_signal_connect (GTK_OBJECT (gui->sig_new_html), "clicked", GTK_SIGNAL_FUNC (sig_new_html), gui); - gui->sig_edit_text = glade_xml_get_widget (gui->xml, "button-sig-edit-text"); - gtk_signal_connect (GTK_OBJECT (gui->sig_edit_text), "clicked", GTK_SIGNAL_FUNC (sig_edit_text), gui); - gui->sig_edit_html = glade_xml_get_widget (gui->xml, "button-sig-edit-html"); - gtk_signal_connect (GTK_OBJECT (gui->sig_edit_html), "clicked", GTK_SIGNAL_FUNC (sig_edit_html), gui); - - if (!gui->dialog) { - gtk_widget_hide (glade_xml_get_widget (gui->xml, "label-sig-text")); - gtk_widget_hide (glade_xml_get_widget (gui->xml, "label-sig-html")); - gtk_widget_hide (gui->sig_option_text); - gtk_widget_hide (gui->sig_option_html); - gtk_widget_hide (gui->sig_new_text); - gtk_widget_hide (gui->sig_new_html); - gtk_widget_hide (gui->sig_edit_text); - gtk_widget_hide (gui->sig_edit_html); - } else { - mail_config_signature_register_client ((MailConfigSignatureClient) sig_event_client, gui); - } + gtk_widget_set_sensitive (GTK_WIDGET (gui->edit_html_signature), + *gtk_entry_get_text (GTK_ENTRY (gnome_file_entry_gtk_entry (gui->html_signature))) != 0); } MailAccountGui * -mail_account_gui_new (MailConfigAccount *account, MailAccountsTab *dialog) +mail_account_gui_new (MailConfigAccount *account) { MailAccountGui *gui; - const char *allowed_types[] = { "mail", NULL }; gui = g_new0 (MailAccountGui, 1); gui->account = account; - gui->dialog = dialog; gui->xml = glade_xml_new (EVOLUTION_GLADEDIR "/mail-config.glade", NULL); /* Management */ @@ -1555,22 +1241,41 @@ mail_account_gui_new (MailConfigAccount *account, MailAccountsTab *dialog) /* Identity */ gui->full_name = GTK_ENTRY (glade_xml_get_widget (gui->xml, "identity_full_name")); gui->email_address = GTK_ENTRY (glade_xml_get_widget (gui->xml, "identity_address")); - gui->reply_to = GTK_ENTRY (glade_xml_get_widget (gui->xml, "identity_reply_to")); gui->organization = GTK_ENTRY (glade_xml_get_widget (gui->xml, "identity_organization")); - - prepare_signatures (gui); + gui->signature = GNOME_FILE_ENTRY (glade_xml_get_widget (gui->xml, "fileentry_signature")); + gui->html_signature = GNOME_FILE_ENTRY (glade_xml_get_widget (gui->xml, "fileentry_html_signature")); + gui->has_html_signature = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui->xml, "check_html_signature")); + gnome_file_entry_set_default_path (gui->signature, g_get_home_dir ()); + gnome_file_entry_set_default_path (gui->html_signature, g_get_home_dir ()); + gui->edit_signature = GTK_BUTTON (glade_xml_get_widget (gui->xml, "button_edit_signature")); + gtk_widget_set_sensitive (GTK_WIDGET (gui->edit_signature), FALSE); + gui->edit_html_signature = GTK_BUTTON (glade_xml_get_widget (gui->xml, "button_edit_html_signature")); + gtk_widget_set_sensitive (GTK_WIDGET (gui->edit_html_signature), FALSE); + + gtk_signal_connect (GTK_OBJECT (gnome_file_entry_gtk_entry (gui->signature)), "changed", signature_changed, gui); + gtk_signal_connect (GTK_OBJECT (gnome_file_entry_gtk_entry (gui->html_signature)), "changed", + html_signature_changed, gui); + gtk_signal_connect (GTK_OBJECT (gui->edit_signature), "clicked", edit_signature, gui); + gtk_signal_connect (GTK_OBJECT (gui->edit_html_signature), "clicked", edit_html_signature, gui); if (account->id) { if (account->id->name) e_utf8_gtk_entry_set_text (gui->full_name, account->id->name); if (account->id->address) gtk_entry_set_text (gui->email_address, account->id->address); - if (account->id->reply_to) - gtk_entry_set_text (gui->reply_to, account->id->reply_to); if (account->id->organization) e_utf8_gtk_entry_set_text (gui->organization, account->id->organization); - - setup_signatures (gui); + if (account->id->signature) { + gnome_file_entry_set_default_path (gui->signature, account->id->signature); + gtk_entry_set_text (GTK_ENTRY (gnome_file_entry_gtk_entry (gui->signature)), + account->id->signature); + } + if (account->id->html_signature) { + gnome_file_entry_set_default_path (gui->html_signature, account->id->html_signature); + gtk_entry_set_text (GTK_ENTRY (gnome_file_entry_gtk_entry (gui->html_signature)), + account->id->html_signature); + } + gtk_toggle_button_set_active (gui->has_html_signature, account->id->has_html_signature); } /* Source */ @@ -1586,9 +1291,7 @@ mail_account_gui_new (MailConfigAccount *account, MailAccountsTab *dialog) gui->source.path = GTK_ENTRY (glade_xml_get_widget (gui->xml, "source_path")); gtk_signal_connect (GTK_OBJECT (gui->source.path), "changed", GTK_SIGNAL_FUNC (service_changed), &gui->source); - gui->source.ssl_hbox = glade_xml_get_widget (gui->xml, "source_ssl_hbox"); - gui->source.use_ssl = GTK_OPTION_MENU (glade_xml_get_widget (gui->xml, "source_use_ssl")); - construct_ssl_menu (&gui->source); + gui->source.use_ssl = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui->xml, "source_use_ssl")); gui->source.no_ssl = glade_xml_get_widget (gui->xml, "source_ssl_disabled"); gui->source.authtype = GTK_OPTION_MENU (glade_xml_get_widget (gui->xml, "source_auth_omenu")); gui->source.remember = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui->xml, "source_remember_password")); @@ -1608,9 +1311,7 @@ mail_account_gui_new (MailConfigAccount *account, MailAccountsTab *dialog) gui->transport.username = GTK_ENTRY (glade_xml_get_widget (gui->xml, "transport_user")); gtk_signal_connect (GTK_OBJECT (gui->transport.username), "changed", GTK_SIGNAL_FUNC (service_changed), &gui->transport); - gui->transport.ssl_hbox = glade_xml_get_widget (gui->xml, "transport_ssl_hbox"); - gui->transport.use_ssl = GTK_OPTION_MENU (glade_xml_get_widget (gui->xml, "transport_use_ssl")); - construct_ssl_menu (&gui->transport); + gui->transport.use_ssl = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui->xml, "transport_use_ssl")); gui->transport.no_ssl = glade_xml_get_widget (gui->xml, "transport_ssl_disabled"); gui->transport_needs_auth = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui->xml, "transport_needs_auth")); gtk_signal_connect (GTK_OBJECT (gui->transport_needs_auth), "toggled", transport_needs_auth_toggled, gui); @@ -1622,43 +1323,29 @@ mail_account_gui_new (MailConfigAccount *account, MailAccountsTab *dialog) /* Drafts folder */ gui->drafts_folder_button = GTK_BUTTON (glade_xml_get_widget (gui->xml, "drafts_button")); - gtk_signal_connect (GTK_OBJECT (gui->drafts_folder_button), "selected", - GTK_SIGNAL_FUNC (folder_selected), &gui->drafts_folder_uri); - if (account->drafts_folder_uri) - gui->drafts_folder_uri = g_strdup (account->drafts_folder_uri); - else - gui->drafts_folder_uri = g_strdup (default_drafts_folder_uri); - evolution_folder_selector_button_construct (EVOLUTION_FOLDER_SELECTOR_BUTTON (gui->drafts_folder_button), - global_shell_client, - _("Select Folder"), - gui->drafts_folder_uri, - allowed_types); + gtk_signal_connect (GTK_OBJECT (gui->drafts_folder_button), "clicked", + GTK_SIGNAL_FUNC (folder_picker_clicked), &gui->drafts_folder); + if (account->drafts_folder_uri) { + gui->drafts_folder.uri = g_strdup (account->drafts_folder_uri); + gui->drafts_folder.name = g_strdup (account->drafts_folder_name); + } else { + gui->drafts_folder.uri = g_strdup (default_drafts_folder_uri); + gui->drafts_folder.name = g_strdup (strrchr (default_drafts_folder_uri, '/') + 1); + } + set_folder_picker_label (gui->drafts_folder_button, gui->drafts_folder.name); /* Sent folder */ gui->sent_folder_button = GTK_BUTTON (glade_xml_get_widget (gui->xml, "sent_button")); - gtk_signal_connect (GTK_OBJECT (gui->sent_folder_button), "selected", - GTK_SIGNAL_FUNC (folder_selected), &gui->sent_folder_uri); - if (account->sent_folder_uri) - gui->sent_folder_uri = g_strdup (account->sent_folder_uri); - else - gui->sent_folder_uri = g_strdup (default_sent_folder_uri); - evolution_folder_selector_button_construct (EVOLUTION_FOLDER_SELECTOR_BUTTON (gui->sent_folder_button), - global_shell_client, - _("Select Folder"), - gui->sent_folder_uri, - allowed_types); - - /* Always Cc */ - gui->always_cc = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui->xml, "always_cc")); - gtk_toggle_button_set_active (gui->always_cc, account->always_cc); - gui->cc_addrs = GTK_ENTRY (glade_xml_get_widget (gui->xml, "cc_addrs")); - e_utf8_gtk_entry_set_text (gui->cc_addrs, account->cc_addrs); - - /* Always Bcc */ - gui->always_bcc = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui->xml, "always_bcc")); - gtk_toggle_button_set_active (gui->always_bcc, account->always_bcc); - gui->bcc_addrs = GTK_ENTRY (glade_xml_get_widget (gui->xml, "bcc_addrs")); - e_utf8_gtk_entry_set_text (gui->bcc_addrs, account->bcc_addrs); + gtk_signal_connect (GTK_OBJECT (gui->sent_folder_button), "clicked", + GTK_SIGNAL_FUNC (folder_picker_clicked), &gui->sent_folder); + if (account->sent_folder_uri) { + gui->sent_folder.uri = g_strdup (account->sent_folder_uri); + gui->sent_folder.name = g_strdup (account->sent_folder_name); + } else { + gui->sent_folder.uri = g_strdup (default_sent_folder_uri); + gui->sent_folder.name = g_strdup (strrchr (default_sent_folder_uri, '/') + 1); + } + set_folder_picker_label (gui->sent_folder_button, gui->sent_folder.name); /* Security */ gui->pgp_key = GTK_ENTRY (glade_xml_get_widget (gui->xml, "pgp_key")); @@ -1668,8 +1355,6 @@ mail_account_gui_new (MailConfigAccount *account, MailAccountsTab *dialog) gtk_toggle_button_set_active (gui->pgp_encrypt_to_self, account->pgp_encrypt_to_self); gui->pgp_always_sign = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui->xml, "pgp_always_sign")); gtk_toggle_button_set_active (gui->pgp_always_sign, account->pgp_always_sign); - -#if defined (HAVE_NSS) && defined (SMIME_SUPPORTED) gui->smime_key = GTK_ENTRY (glade_xml_get_widget (gui->xml, "smime_key")); if (account->smime_key) e_utf8_gtk_entry_set_text (gui->smime_key, account->smime_key); @@ -1677,15 +1362,16 @@ mail_account_gui_new (MailConfigAccount *account, MailAccountsTab *dialog) gtk_toggle_button_set_active (gui->smime_encrypt_to_self, account->smime_encrypt_to_self); gui->smime_always_sign = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui->xml, "smime_always_sign")); gtk_toggle_button_set_active (gui->smime_always_sign, account->smime_always_sign); -#else + +#if !defined(HAVE_NSS) || !defined(SMIME_SUPPORTED) { /* Since we don't have NSS, hide the S/MIME config options */ GtkWidget *frame; frame = glade_xml_get_widget (gui->xml, "smime_frame"); - gtk_widget_destroy (frame); + gtk_widget_set_sensitive (frame, FALSE); } -#endif /* HAVE_NSS && SMIME_SUPPORTED */ +#endif return gui; } @@ -1730,11 +1416,7 @@ mail_account_gui_setup (MailAccountGui *gui, GtkWidget *top) item = NULL; if (provider->object_types[CAMEL_PROVIDER_STORE] && provider->flags & CAMEL_PROVIDER_IS_SOURCE) { item = gtk_menu_item_new_with_label (provider->name); - gtk_object_set_data (GTK_OBJECT (gui->source.type), - provider->protocol, item); gtk_object_set_data (GTK_OBJECT (item), "provider", provider); - gtk_object_set_data (GTK_OBJECT (item), "number", - GUINT_TO_POINTER (si)); gtk_signal_connect (GTK_OBJECT (item), "activate", GTK_SIGNAL_FUNC (source_type_changed), gui); @@ -1758,11 +1440,7 @@ mail_account_gui_setup (MailAccountGui *gui, GtkWidget *top) if (provider->object_types[CAMEL_PROVIDER_TRANSPORT]) { item = gtk_menu_item_new_with_label (provider->name); - gtk_object_set_data (GTK_OBJECT (gui->transport.type), - provider->protocol, item); gtk_object_set_data (GTK_OBJECT (item), "provider", provider); - gtk_object_set_data (GTK_OBJECT (item), "number", - GUINT_TO_POINTER (ti)); gtk_signal_connect (GTK_OBJECT (item), "activate", GTK_SIGNAL_FUNC (transport_type_changed), gui); @@ -1770,9 +1448,6 @@ mail_account_gui_setup (MailAccountGui *gui, GtkWidget *top) gtk_menu_append (GTK_MENU (transports), item); gtk_widget_show (item); - - if (CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT (provider)) - gtk_widget_set_sensitive (item, FALSE); if (!ftransport) { ftransport = item; @@ -1856,10 +1531,10 @@ mail_account_gui_setup (MailAccountGui *gui, GtkWidget *top) } if (fstore) - gtk_signal_emit_by_name (GTK_OBJECT (fstore), "activate"); + gtk_signal_emit_by_name (GTK_OBJECT (fstore), "activate", gui); if (ftransport) - gtk_signal_emit_by_name (GTK_OBJECT (ftransport), "activate"); + gtk_signal_emit_by_name (GTK_OBJECT (ftransport), "activate", gui); if (source_proto) { setup_service (&gui->source, gui->account->source); @@ -1899,7 +1574,7 @@ save_service (MailAccountGuiService *gsvc, GHashTable *extra_config, if (CAMEL_PROVIDER_ALLOWS (gsvc->provider, CAMEL_URL_PART_USER)) { str = gtk_entry_get_text (gsvc->username); if (str && *str) - url->user = g_strstrip (g_strdup (str)); + url->user = g_strdup (str); } if (CAMEL_PROVIDER_ALLOWS (gsvc->provider, CAMEL_URL_PART_AUTH) && @@ -1934,14 +1609,8 @@ save_service (MailAccountGuiService *gsvc, GHashTable *extra_config, } if (gsvc->provider->flags & CAMEL_PROVIDER_SUPPORTS_SSL) { - const char *use_ssl; - - use_ssl = gtk_object_get_data (GTK_OBJECT (gsvc->ssl_selected), "use_ssl"); - - /* set the value to either "always" or "when-possible" - but don't bother setting it for "never" */ - if (strcmp (use_ssl, "never")) - camel_url_set_param (url, "use_ssl", use_ssl); + if (gtk_toggle_button_get_active (gsvc->use_ssl)) + camel_url_set_param (url, "use_ssl", ""); } if (extra_config) @@ -1964,7 +1633,7 @@ mail_account_gui_save (MailAccountGui *gui) const MailConfigAccount *old_account; CamelProvider *provider = NULL; CamelURL *source_url = NULL, *url; - char *new_name, *string; + gchar *new_name; gboolean old_enabled; if (!mail_account_gui_identity_complete (gui, NULL) || @@ -1994,16 +1663,16 @@ mail_account_gui_save (MailAccountGui *gui) account->id = g_new0 (MailConfigIdentity, 1); account->id->name = e_utf8_gtk_entry_get_text (gui->full_name); account->id->address = e_utf8_gtk_entry_get_text (gui->email_address); - account->id->reply_to = e_utf8_gtk_entry_get_text (gui->reply_to); account->id->organization = e_utf8_gtk_entry_get_text (gui->organization); - - sig_set_and_write (gui); + account->id->signature = gnome_file_entry_get_full_path (gui->signature, TRUE); + account->id->html_signature = gnome_file_entry_get_full_path (gui->html_signature, TRUE); + account->id->has_html_signature = gtk_toggle_button_get_active (gui->has_html_signature); old_enabled = account->source && account->source->enabled; service_destroy (account->source); account->source = g_new0 (MailConfigService, 1); save_service (&gui->source, gui->extra_config, account->source); - if (account->source->url) { + if (account->source && account->source->url) { provider = camel_session_get_provider (session, account->source->url, NULL); source_url = provider ? camel_url_new (account->source->url, NULL) : NULL; @@ -2016,19 +1685,20 @@ mail_account_gui_save (MailAccountGui *gui) service_destroy (account->transport); account->transport = g_new0 (MailConfigService, 1); - if (CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT (gui->transport.provider)) - save_service (&gui->transport, gui->extra_config, account->transport); - else - save_service (&gui->transport, NULL, account->transport); + save_service (&gui->transport, NULL, account->transport); /* Check to make sure that the Drafts folder uri is "valid" before assigning it */ - url = source_url && gui->drafts_folder_uri ? camel_url_new (gui->drafts_folder_uri, NULL) : NULL; - if (mail_config_get_account_by_source_url (gui->drafts_folder_uri) || + url = source_url && gui->drafts_folder.uri ? camel_url_new (gui->drafts_folder.uri, NULL) : NULL; + if (mail_config_get_account_by_source_url (gui->drafts_folder.uri) || (url && provider->url_equal (source_url, url))) { + g_free (account->drafts_folder_name); + account->drafts_folder_name = g_strdup (gui->drafts_folder.name); g_free (account->drafts_folder_uri); - account->drafts_folder_uri = g_strdup (gui->drafts_folder_uri); + account->drafts_folder_uri = g_strdup (gui->drafts_folder.uri); } else { /* assign defaults - the uri is unknown to us (probably pointed to an old source url) */ + g_free (account->drafts_folder_name); + account->drafts_folder_name = g_strdup (strrchr (default_drafts_folder_uri, '/') + 1); g_free (account->drafts_folder_uri); account->drafts_folder_uri = g_strdup (default_drafts_folder_uri); } @@ -2037,13 +1707,17 @@ mail_account_gui_save (MailAccountGui *gui) camel_url_free (url); /* Check to make sure that the Sent folder uri is "valid" before assigning it */ - url = source_url && gui->sent_folder_uri ? camel_url_new (gui->sent_folder_uri, NULL) : NULL; - if (mail_config_get_account_by_source_url (gui->sent_folder_uri) || + url = source_url && gui->sent_folder.uri ? camel_url_new (gui->sent_folder.uri, NULL) : NULL; + if (mail_config_get_account_by_source_url (gui->sent_folder.uri) || (url && provider->url_equal (source_url, url))) { + g_free (account->sent_folder_name); + account->sent_folder_name = g_strdup (gui->sent_folder.name); g_free (account->sent_folder_uri); - account->sent_folder_uri = g_strdup (gui->sent_folder_uri); + account->sent_folder_uri = g_strdup (gui->sent_folder.uri); } else { /* assign defaults - the uri is unknown to us (probably pointed to an old source url) */ + g_free (account->sent_folder_name); + account->sent_folder_name = g_strdup (strrchr (default_sent_folder_uri, '/') + 1); g_free (account->sent_folder_uri); account->sent_folder_uri = g_strdup (default_sent_folder_uri); } @@ -2054,22 +1728,14 @@ mail_account_gui_save (MailAccountGui *gui) if (source_url) camel_url_free (source_url); - account->always_cc = gtk_toggle_button_get_active (gui->always_cc); - account->cc_addrs = e_utf8_gtk_entry_get_text (gui->cc_addrs); - account->always_bcc = gtk_toggle_button_get_active (gui->always_bcc); - account->bcc_addrs = e_utf8_gtk_entry_get_text (gui->bcc_addrs); - g_free (account->pgp_key); account->pgp_key = e_utf8_gtk_entry_get_text (gui->pgp_key); account->pgp_encrypt_to_self = gtk_toggle_button_get_active (gui->pgp_encrypt_to_self); account->pgp_always_sign = gtk_toggle_button_get_active (gui->pgp_always_sign); - -#if defined (HAVE_NSS) && defined (SMIME_SUPPORTED) g_free (account->smime_key); account->smime_key = e_utf8_gtk_entry_get_text (gui->smime_key); account->smime_encrypt_to_self = gtk_toggle_button_get_active (gui->smime_encrypt_to_self); account->smime_always_sign = gtk_toggle_button_get_active (gui->smime_always_sign); -#endif /* HAVE_NSS && SMIME_SUPPORTED */ if (!mail_config_find_account (account)) mail_config_add_account (account); @@ -2084,13 +1750,12 @@ mail_account_gui_save (MailAccountGui *gui) void mail_account_gui_destroy (MailAccountGui *gui) { - if (gui->dialog) - mail_config_signature_unregister_client ((MailConfigSignatureClient) sig_event_client, gui); - gtk_object_unref (GTK_OBJECT (gui->xml)); if (gui->extra_config) g_hash_table_destroy (gui->extra_config); - g_free (gui->drafts_folder_uri); - g_free (gui->sent_folder_uri); + g_free (gui->drafts_folder.name); + g_free (gui->drafts_folder.uri); + g_free (gui->sent_folder.name); + g_free (gui->sent_folder.uri); g_free (gui); } |