diff options
author | nobody <nobody@localhost> | 2003-04-02 01:15:53 +0800 |
---|---|---|
committer | nobody <nobody@localhost> | 2003-04-02 01:15:53 +0800 |
commit | 2e5b2bbb530b642dda56b332cfd93810ac415098 (patch) | |
tree | e2b63c11a404a5dd99d407c989c8846fd0d5379d /mail/mail-callbacks.c | |
parent | 5cda225087bfdc66e19edb703689e8af655e171c (diff) | |
download | gsoc2013-evolution-EVOLUTION_1_2_4.tar gsoc2013-evolution-EVOLUTION_1_2_4.tar.gz gsoc2013-evolution-EVOLUTION_1_2_4.tar.bz2 gsoc2013-evolution-EVOLUTION_1_2_4.tar.lz gsoc2013-evolution-EVOLUTION_1_2_4.tar.xz gsoc2013-evolution-EVOLUTION_1_2_4.tar.zst gsoc2013-evolution-EVOLUTION_1_2_4.zip |
This commit was manufactured by cvs2svn to create tagEVOLUTION_1_2_4
'EVOLUTION_1_2_4'.
svn path=/tags/EVOLUTION_1_2_4/; revision=20614
Diffstat (limited to 'mail/mail-callbacks.c')
-rw-r--r-- | mail/mail-callbacks.c | 1208 |
1 files changed, 749 insertions, 459 deletions
diff --git a/mail/mail-callbacks.c b/mail/mail-callbacks.c index d1fbb74957..4850ca79d0 100644 --- a/mail/mail-callbacks.c +++ b/mail/mail-callbacks.c @@ -29,24 +29,21 @@ #include <config.h> #endif -#include <time.h> #include <errno.h> - -#include <gtkhtml/gtkhtml.h> - -#include <gconf/gconf.h> -#include <gconf/gconf-client.h> - -#include <gtk/gtkmessagedialog.h> - -#include <libgnomeprint/gnome-print-job.h> -#include <libgnomeprintui/gnome-print-dialog.h> - +#include <time.h> +#include <libgnome/gnome-paper.h> +#include <libgnomeui/gnome-stock.h> +#include <libgnome/gnome-paper.h> +#include <libgnomeprint/gnome-print-master.h> +#include <libgnomeprint/gnome-print-master-preview.h> #include <bonobo/bonobo-widget.h> #include <bonobo/bonobo-socket.h> #include <gal/e-table/e-table.h> +#include <gal/widgets/e-gui-utils.h> +#include <gal/widgets/e-unicode.h> #include <e-util/e-dialog-utils.h> #include <filter/filter-editor.h> +#include <gtkhtml/gtkhtml.h> #include "mail.h" #include "message-browser.h" @@ -66,6 +63,7 @@ #include "subscribe-dialog.h" #include "message-tag-editor.h" #include "message-tag-followup.h" +#include "e-messagebox.h" #include "Evolution.h" #include "evolution-storage.h" @@ -77,40 +75,6 @@ #define FB_WINDOW(fb) GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (fb), GTK_TYPE_WINDOW)) -/* default is default gtk response - if again is != NULL, a checkbox "dont show this again" will appear, and the result stored in *again -*/ -static gboolean -e_question (GtkWindow *parent, int def, gboolean *again, const char *fmt, ...) -{ - GtkWidget *mbox, *check = NULL; - va_list ap; - int button; - char *str; - - va_start (ap, fmt); - str = g_strdup_vprintf (fmt, ap); - va_end (ap); - mbox = gtk_message_dialog_new (parent, GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, - "%s", str); - g_free (str); - gtk_dialog_set_default_response ((GtkDialog *) mbox, def); - if (again) { - check = gtk_check_button_new_with_label (_("Don't show this message again.")); - gtk_box_pack_start ((GtkBox *)((GtkDialog *) mbox)->vbox, check, TRUE, TRUE, 10); - gtk_widget_show (check); - } - - button = gtk_dialog_run ((GtkDialog *) mbox); - if (again) - *again = !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check)); - gtk_widget_destroy (mbox); - - return button == GTK_RESPONSE_YES; -} - - struct _composer_callback_data { unsigned int ref_count; @@ -168,14 +132,14 @@ ccd_unref (struct _composer_callback_data *ccd) static void -composer_destroy_cb (gpointer user_data, GObject *deadbeef) +composer_destroy_cb (GtkWidget *composer, gpointer user_data) { ccd_unref (user_data); } static void -druid_destroy_cb (gpointer user_data, GObject *deadbeef) +druid_destroyed (void) { gtk_main_quit (); } @@ -184,17 +148,37 @@ static gboolean configure_mail (FolderBrowser *fb) { MailConfigDruid *druid; + GtkWidget *dialog; - if (e_question (FB_WINDOW (fb), GTK_RESPONSE_YES, NULL, - _("You have not configured the mail client.\n" - "You need to do this before you can send,\n" - "receive or compose mail.\n" - "Would you like to configure it now?"))) { - druid = mail_config_druid_new (); - g_object_weak_ref ((GObject *) druid, (GWeakNotify) druid_destroy_cb, NULL); - gtk_widget_show ((GtkWidget *) druid); - gtk_grab_add ((GtkWidget *) druid); + dialog = gnome_message_box_new ( + _("You have not configured the mail client.\n" + "You need to do this before you can send,\n" + "receive or compose mail.\n" + "Would you like to configure it now?"), + GNOME_MESSAGE_BOX_QUESTION, + GNOME_STOCK_BUTTON_YES, + GNOME_STOCK_BUTTON_NO, NULL); + + /* + * Focus YES + */ + gnome_dialog_set_default (GNOME_DIALOG (dialog), 0); + gtk_widget_grab_focus (GTK_WIDGET (GNOME_DIALOG (dialog)->buttons->data)); + + e_gnome_dialog_set_parent (GNOME_DIALOG (dialog), FB_WINDOW (fb)); + + switch (gnome_dialog_run_and_close (GNOME_DIALOG (dialog))) { + case 0: + druid = mail_config_druid_new (fb->shell); + gtk_signal_connect (GTK_OBJECT (druid), "destroy", + GTK_SIGNAL_FUNC (druid_destroyed), NULL); + gtk_widget_show (GTK_WIDGET (druid)); + gtk_grab_add (GTK_WIDGET (druid)); gtk_main (); + break; + case 1: + default: + break; } return mail_config_is_configured (); @@ -203,52 +187,69 @@ configure_mail (FolderBrowser *fb) static gboolean check_send_configuration (FolderBrowser *fb) { - EAccount *account; + const MailConfigAccount *account; - if (!mail_config_is_configured ()) { - if (fb == NULL) { - e_notice (NULL, GTK_MESSAGE_WARNING, - _("You need to configure an account\nbefore you can compose mail.")); - return FALSE; - } - - if (!configure_mail (fb)) - return FALSE; - } + /* Check general */ + if (!mail_config_is_configured () && !configure_mail (fb)) + return FALSE; /* Get the default account */ account = mail_config_get_default_account (); /* Check for an identity */ if (!account) { - e_notice (FB_WINDOW (fb), GTK_MESSAGE_WARNING, - _("You need to configure an identity\nbefore you can compose mail.")); + GtkWidget *message; + + message = e_gnome_warning_dialog_parented (_("You need to configure an identity\n" + "before you can compose mail."), + FB_WINDOW (fb)); + + gnome_dialog_set_close (GNOME_DIALOG (message), TRUE); + gtk_widget_show (message); + return FALSE; } /* Check for a transport */ - if (!account->transport->url) { - e_notice (FB_WINDOW (fb), GTK_MESSAGE_WARNING, - _("You need to configure a mail transport\n" - "before you can compose mail.")); + if (!account->transport || !account->transport->url) { + GtkWidget *message; + + message = e_gnome_warning_dialog_parented (_("You need to configure a mail transport\n" + "before you can compose mail."), + GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (fb), + GTK_TYPE_WINDOW))); + + gnome_dialog_set_close (GNOME_DIALOG (message), TRUE); + gtk_widget_show (message); + return FALSE; } return TRUE; } +static void +msgbox_destroyed (GtkWidget *widget, gpointer data) +{ + gboolean *show_again = data; + GtkWidget *checkbox; + + checkbox = e_message_box_get_checkbox (E_MESSAGE_BOX (widget)); + *show_again = !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbox)); +} + static gboolean ask_confirm_for_unwanted_html_mail (EMsgComposer *composer, EDestination **recipients) { - gboolean show_again, res; - GConfClient *gconf; + gboolean show_again = TRUE; GString *str; - int i; + GtkWidget *mbox; + int i, button; - gconf = gconf_client_get_default (); - - if (!gconf_client_get_bool (gconf, "/apps/evolution/mail/prompts/unwanted_html", NULL)) + if (!mail_config_get_confirm_unwanted_html ()) { + g_message ("doesn't want to see confirm html messages!"); return TRUE; + } /* FIXME: this wording sucks */ str = g_string_new (_("You are sending an HTML-formatted message. Please make sure that\n" @@ -256,51 +257,93 @@ ask_confirm_for_unwanted_html_mail (EMsgComposer *composer, EDestination **recip for (i = 0; recipients[i] != NULL; ++i) { if (!e_destination_get_html_mail_pref (recipients[i])) { const char *name; + char *buf; - name = e_destination_get_textrep (recipients[i], FALSE); + name = e_destination_get_textrep (recipients[i]); + buf = e_utf8_to_locale_string (name); - g_string_append_printf (str, " %s\n", name); + g_string_sprintfa (str, " %s\n", buf); + g_free (buf); } } g_string_append (str, _("Send anyway?")); - res = e_question ((GtkWindow *) composer, GTK_RESPONSE_YES, &show_again, "%s", str->str); + + mbox = e_message_box_new (str->str, + E_MESSAGE_BOX_QUESTION, + GNOME_STOCK_BUTTON_YES, + GNOME_STOCK_BUTTON_NO, + NULL); + g_string_free (str, TRUE); - gconf_client_set_bool (gconf, "/apps/evolution/mail/prompts/unwanted_html", show_again, NULL); + gtk_signal_connect (GTK_OBJECT (mbox), "destroy", + msgbox_destroyed, &show_again); + + button = gnome_dialog_run_and_close (GNOME_DIALOG (mbox)); - return res; + if (!show_again) { + mail_config_set_confirm_unwanted_html (show_again); + g_message ("don't show HTML warning again"); + } + + if (button == 0) + return TRUE; + else + return FALSE; } static gboolean ask_confirm_for_empty_subject (EMsgComposer *composer) { - gboolean show_again, res; - GConfClient *gconf; - - gconf = gconf_client_get_default (); + /* FIXME: EMessageBox should really handle this stuff + automagically. What Miguel thinks would be nice is to pass + in a unique id which could be used as a key in the config + file and the value would be an int. -1 for always show or + the button pressed otherwise. This probably means we'd have + to write e_messagebox_run () */ + gboolean show_again = TRUE; + GtkWidget *mbox; + int button; - if (gconf_client_get_bool (gconf, "/apps/evolution/mail/prompts/empty_subject", NULL)) + if (!mail_config_get_prompt_empty_subject ()) return TRUE; - res = e_question ((GtkWindow *) composer, GTK_RESPONSE_YES, &show_again, - _("This message has no subject.\nReally send?")); + mbox = e_message_box_new (_("This message has no subject.\nReally send?"), + E_MESSAGE_BOX_QUESTION, + GNOME_STOCK_BUTTON_YES, + GNOME_STOCK_BUTTON_NO, + NULL); + + gtk_signal_connect (GTK_OBJECT (mbox), "destroy", + msgbox_destroyed, &show_again); - gconf_client_set_bool (gconf, "/apps/evolution/mail/prompts/empty_subject", show_again, NULL); + button = gnome_dialog_run_and_close (GNOME_DIALOG (mbox)); - return res; + mail_config_set_prompt_empty_subject (show_again); + + if (button == 0) + return TRUE; + else + return FALSE; } static gboolean ask_confirm_for_only_bcc (EMsgComposer *composer, gboolean hidden_list_case) { - gboolean show_again, res; + /* FIXME: EMessageBox should really handle this stuff + automagically. What Miguel thinks would be nice is to pass + in a message-id which could be used as a key in the config + file and the value would be an int. -1 for always show or + the button pressed otherwise. This probably means we'd have + to write e_messagebox_run () */ + gboolean show_again = TRUE; + GtkWidget *mbox; + int button; const char *first_text; - GConfClient *gconf; + char *message_text; - gconf = gconf_client_get_default (); - - if (!gconf_client_get_bool (gconf, "/apps/evolution/mail/prompts/only_bcc", NULL)) + if (!mail_config_get_prompt_only_bcc ()) return TRUE; /* If the user is mailing a hidden contact list, it is possible for @@ -317,14 +360,29 @@ ask_confirm_for_only_bcc (EMsgComposer *composer, gboolean hidden_list_case) first_text = _("This message contains only Bcc recipients."); } - res = e_question ((GtkWindow *) composer, GTK_RESPONSE_YES, &show_again, - "%s\n%s", first_text, - _("It is possible that the mail server may reveal the recipients " - "by adding an Apparently-To header.\nSend anyway?")); + message_text = g_strdup_printf ("%s\n%s", first_text, + _("It is possible that the mail server may reveal the recipients " + "by adding an Apparently-To header.\nSend anyway?")); + + mbox = e_message_box_new (message_text, + E_MESSAGE_BOX_QUESTION, + GNOME_STOCK_BUTTON_YES, + GNOME_STOCK_BUTTON_NO, + NULL); - gconf_client_set_bool (gconf, "/apps/evolution/mail/prompts/only_bcc", show_again, NULL); + gtk_signal_connect (GTK_OBJECT (mbox), "destroy", + msgbox_destroyed, &show_again); - return res; + button = gnome_dialog_run_and_close (GNOME_DIALOG (mbox)); + + mail_config_set_prompt_only_bcc (show_again); + + g_free (message_text); + + if (button == 0) + return TRUE; + else + return FALSE; } @@ -375,20 +433,23 @@ composer_send_queued_cb (CamelFolder *folder, CamelMimeMessage *msg, CamelMessag ccd = ccd_new (); /* disconnect the previous signal handlers */ - g_signal_handlers_disconnect_matched(send->composer, G_SIGNAL_MATCH_FUNC, 0, - 0, NULL, composer_send_cb, NULL); - g_signal_handlers_disconnect_matched(send->composer, G_SIGNAL_MATCH_FUNC, 0, - 0, NULL, composer_save_draft_cb, NULL); + gtk_signal_disconnect_by_func (GTK_OBJECT (send->composer), + GTK_SIGNAL_FUNC (composer_send_cb), NULL); + gtk_signal_disconnect_by_func (GTK_OBJECT (send->composer), + GTK_SIGNAL_FUNC (composer_save_draft_cb), NULL); /* reconnect to the signals using a non-NULL ccd for the callback data */ - g_signal_connect (send->composer, "send", G_CALLBACK (composer_send_cb), ccd); - g_signal_connect (send->composer, "save-draft", G_CALLBACK (composer_save_draft_cb), ccd); - - g_object_weak_ref ((GObject *) send->composer, (GWeakNotify) composer_destroy_cb, ccd); + gtk_signal_connect (GTK_OBJECT (send->composer), "send", + GTK_SIGNAL_FUNC (composer_send_cb), ccd); + gtk_signal_connect (GTK_OBJECT (send->composer), "save-draft", + GTK_SIGNAL_FUNC (composer_save_draft_cb), ccd); + gtk_signal_connect (GTK_OBJECT (send->composer), "destroy", + GTK_SIGNAL_FUNC (composer_destroy_cb), ccd); } e_msg_composer_set_enable_autosave (send->composer, TRUE); gtk_widget_show (GTK_WIDGET (send->composer)); + gtk_object_unref (GTK_OBJECT (send->composer)); } camel_message_info_free (info); @@ -402,18 +463,14 @@ composer_send_queued_cb (CamelFolder *folder, CamelMimeMessage *msg, CamelMessag static CamelMimeMessage * composer_get_message (EMsgComposer *composer, gboolean post, gboolean save_html_object_data) { + const MailConfigAccount *account; CamelMimeMessage *message = NULL; EDestination **recipients, **recipients_bcc; - gboolean send_html, confirm_html; CamelInternetAddress *cia; + char *subject; + int i; int hidden = 0, shown = 0; int num = 0, num_bcc = 0; - const char *subject; - GConfClient *gconf; - EAccount *account; - int i; - - gconf = gconf_client_get_default (); /* We should do all of the validity checks based on the composer, and not on the created message, as extra interaction may occur when we get the message @@ -458,7 +515,6 @@ composer_get_message (EMsgComposer *composer, gboolean post, gboolean save_html_ } } } - e_destination_freev (recipients_bcc); } @@ -466,8 +522,15 @@ composer_get_message (EMsgComposer *composer, gboolean post, gboolean save_html_ /* I'm sensing a lack of love, er, I mean recipients. */ if (num == 0 && !post) { - e_notice ((GtkWindow *) composer, GTK_MESSAGE_WARNING, - _("You must specify recipients in order to send this message.")); + GtkWidget *message_box; + + message_box = gnome_message_box_new (_("You must specify recipients in order to " + "send this message."), + GNOME_MESSAGE_BOX_WARNING, + GNOME_STOCK_BUTTON_OK, + NULL); + + gnome_dialog_run_and_close (GNOME_DIALOG (message_box)); goto finished; } @@ -477,17 +540,15 @@ composer_get_message (EMsgComposer *composer, gboolean post, gboolean save_html_ goto finished; } - send_html = gconf_client_get_bool (gconf, "/apps/evolution/mail/composer/send_html", NULL); - confirm_html = gconf_client_get_bool (gconf, "/apps/evolution/mail/prompts/unwanted_html", NULL); - /* Only show this warning if our default is to send html. If it isn't, we've manually switched into html mode in the composer and (presumably) had a good reason for doing this. */ - if (e_msg_composer_get_send_html (composer) && send_html && confirm_html) { + if (e_msg_composer_get_send_html (composer) && mail_config_get_send_html () + && mail_config_get_confirm_unwanted_html ()) { gboolean html_problem = FALSE; if (recipients) { - for (i = 0; recipients[i] != NULL && !html_problem; i++) { + for (i = 0; recipients[i] != NULL && !html_problem; ++i) { if (!e_destination_get_html_mail_pref (recipients[i])) html_problem = TRUE; } @@ -503,9 +564,12 @@ composer_get_message (EMsgComposer *composer, gboolean post, gboolean save_html_ /* Check for no subject */ subject = e_msg_composer_get_subject (composer); if (subject == NULL || subject[0] == '\0') { - if (!ask_confirm_for_empty_subject (composer)) + if (!ask_confirm_for_empty_subject (composer)) { + g_free (subject); goto finished; + } } + g_free (subject); /* actually get the message now, this will sign/encrypt etc */ message = e_msg_composer_get_message (composer, save_html_object_data); @@ -543,7 +607,7 @@ got_post_folder (char *uri, CamelFolder *folder, void *data) *fp = folder; if (folder) - camel_object_ref (folder); + camel_object_ref (CAMEL_OBJECT (folder)); } void @@ -594,7 +658,7 @@ composer_send_cb (EMsgComposer *composer, gpointer user_data) ccd_ref (send->ccd); send->send = !post; send->composer = composer; - g_object_ref (composer); + gtk_object_ref (GTK_OBJECT (composer)); gtk_widget_hide (GTK_WIDGET (composer)); e_msg_composer_set_enable_autosave (composer, FALSE); @@ -628,14 +692,18 @@ save_draft_done (CamelFolder *folder, CamelMimeMessage *msg, CamelMessageInfo *i ccd = ccd_new (); /* disconnect the previous signal handlers */ - g_signal_handlers_disconnect_by_func (sdi->composer, G_CALLBACK (composer_send_cb), NULL); - g_signal_handlers_disconnect_by_func (sdi->composer, G_CALLBACK (composer_save_draft_cb), NULL); + gtk_signal_disconnect_by_func (GTK_OBJECT (sdi->composer), + GTK_SIGNAL_FUNC (composer_send_cb), NULL); + gtk_signal_disconnect_by_func (GTK_OBJECT (sdi->composer), + GTK_SIGNAL_FUNC (composer_save_draft_cb), NULL); /* reconnect to the signals using a non-NULL ccd for the callback data */ - g_signal_connect (sdi->composer, "send", G_CALLBACK (composer_send_cb), ccd); - g_signal_connect (sdi->composer, "save-draft", G_CALLBACK (composer_save_draft_cb), ccd); - - g_object_weak_ref ((GObject *) sdi->composer, (GWeakNotify) composer_destroy_cb, ccd); + gtk_signal_connect (GTK_OBJECT (sdi->composer), "send", + GTK_SIGNAL_FUNC (composer_send_cb), ccd); + gtk_signal_connect (GTK_OBJECT (sdi->composer), "save-draft", + GTK_SIGNAL_FUNC (composer_save_draft_cb), ccd); + gtk_signal_connect (GTK_OBJECT (sdi->composer), "destroy", + GTK_SIGNAL_FUNC (composer_destroy_cb), ccd); } if (ccd->drafts_folder) { @@ -668,7 +736,7 @@ save_draft_done (CamelFolder *folder, CamelMimeMessage *msg, CamelMessageInfo *i gtk_widget_destroy (GTK_WIDGET (sdi->composer)); done: - g_object_unref (sdi->composer); + gtk_object_unref (GTK_OBJECT (sdi->composer)); if (sdi->ccd) ccd_unref (sdi->ccd); g_free (info); @@ -683,7 +751,7 @@ use_default_drafts_cb (int reply, gpointer data) if (reply == 0) { *folder = drafts_folder; - camel_object_ref (drafts_folder); + camel_object_ref (CAMEL_OBJECT (*folder)); } } @@ -694,7 +762,7 @@ save_draft_folder (char *uri, CamelFolder *folder, gpointer data) if (folder) { *save = folder; - camel_object_ref (folder); + camel_object_ref (CAMEL_OBJECT (folder)); } } @@ -703,11 +771,11 @@ composer_save_draft_cb (EMsgComposer *composer, int quit, gpointer user_data) { extern char *default_drafts_folder_uri; extern CamelFolder *drafts_folder; - struct _save_draft_info *sdi; - CamelFolder *folder = NULL; CamelMimeMessage *msg; CamelMessageInfo *info; - EAccount *account; + const MailConfigAccount *account; + struct _save_draft_info *sdi; + CamelFolder *folder = NULL; account = e_msg_composer_get_preferred_account (composer); if (account && account->drafts_folder_uri && @@ -718,17 +786,18 @@ composer_save_draft_cb (EMsgComposer *composer, int quit, gpointer user_data) mail_msg_wait (id); if (!folder) { - if (!e_question ((GtkWindow *) composer, GTK_RESPONSE_YES, NULL, - _("Unable to open the drafts folder for this account.\n" - "Would you like to use the default drafts folder?"))) - return; + GtkWidget *dialog; - folder = drafts_folder; - camel_object_ref (drafts_folder); + dialog = gnome_ok_cancel_dialog_parented (_("Unable to open the drafts folder for this account.\n" + "Would you like to use the default drafts folder?"), + use_default_drafts_cb, &folder, GTK_WINDOW (composer)); + gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); + if (!folder) + return; } } else { folder = drafts_folder; - camel_object_ref (folder); + camel_object_ref (CAMEL_OBJECT (folder)); } msg = e_msg_composer_get_message_draft (composer); @@ -738,32 +807,31 @@ composer_save_draft_cb (EMsgComposer *composer, int quit, gpointer user_data) sdi = g_malloc (sizeof (struct _save_draft_info)); sdi->composer = composer; - g_object_ref (composer); + gtk_object_ref (GTK_OBJECT (composer)); sdi->ccd = user_data; if (sdi->ccd) ccd_ref (sdi->ccd); sdi->quit = quit; mail_append_mail (folder, msg, info, save_draft_done, sdi); - camel_object_unref (folder); - camel_object_unref (msg); + camel_object_unref (CAMEL_OBJECT (folder)); + camel_object_unref (CAMEL_OBJECT (msg)); } static GtkWidget * -create_msg_composer (EAccount *account, gboolean post, const char *url) +create_msg_composer (const MailConfigAccount *account, gboolean post, const char *url) { EMsgComposer *composer; - GConfClient *gconf; gboolean send_html; /* Make sure that we've actually been passed in an account. If one has * not been passed in, grab the default account. */ - if (account == NULL) + if (account == NULL) { account = mail_config_get_default_account (); + } - gconf = gconf_client_get_default (); - send_html = gconf_client_get_bool (gconf, "/apps/evolution/mail/composer/send_html", NULL); + send_html = mail_config_get_send_html (); if (post) composer = e_msg_composer_new_post (); @@ -785,10 +853,10 @@ create_msg_composer (EAccount *account, gboolean post, const char *url) void compose_msg (GtkWidget *widget, gpointer user_data) { + const MailConfigAccount *account; FolderBrowser *fb = FOLDER_BROWSER (user_data); struct _composer_callback_data *ccd; GtkWidget *composer; - EAccount *account; if (FOLDER_BROWSER_IS_DESTROYED (fb) || !check_send_configuration (fb)) return; @@ -802,10 +870,12 @@ compose_msg (GtkWidget *widget, gpointer user_data) ccd = ccd_new (); - g_signal_connect (composer, "send", G_CALLBACK (composer_send_cb), ccd); - g_signal_connect (composer, "save-draft", G_CALLBACK (composer_save_draft_cb), ccd); - - g_object_weak_ref ((GObject *) composer, (GWeakNotify) composer_destroy_cb, ccd); + gtk_signal_connect (GTK_OBJECT (composer), "send", + GTK_SIGNAL_FUNC (composer_send_cb), ccd); + gtk_signal_connect (GTK_OBJECT (composer), "save-draft", + GTK_SIGNAL_FUNC (composer_save_draft_cb), ccd); + gtk_signal_connect (GTK_OBJECT (composer), "destroy", + GTK_SIGNAL_FUNC (composer_destroy_cb), ccd); gtk_widget_show (composer); } @@ -816,7 +886,7 @@ send_to_url (const char *url, const char *parent_uri) { struct _composer_callback_data *ccd; GtkWidget *composer; - EAccount *account = NULL; + MailConfigAccount *account = NULL; /* FIXME: no way to get folder browser? Not without * big pain in the ass, as far as I can tell */ @@ -833,20 +903,22 @@ send_to_url (const char *url, const char *parent_uri) ccd = ccd_new (); - g_signal_connect (composer, "send", G_CALLBACK (composer_send_cb), ccd); - g_signal_connect (composer, "save-draft", G_CALLBACK (composer_save_draft_cb), ccd); - - g_object_weak_ref ((GObject *) composer, (GWeakNotify) composer_destroy_cb, ccd); + gtk_signal_connect (GTK_OBJECT (composer), "send", + GTK_SIGNAL_FUNC (composer_send_cb), ccd); + gtk_signal_connect (GTK_OBJECT (composer), "save-draft", + GTK_SIGNAL_FUNC (composer_save_draft_cb), ccd); + gtk_signal_connect (GTK_OBJECT (composer), "destroy", + GTK_SIGNAL_FUNC (composer_destroy_cb), ccd); gtk_widget_show (composer); } static GList * list_add_addresses (GList *list, const CamelInternetAddress *cia, GHashTable *account_hash, - GHashTable *rcpt_hash, EAccount **me) + GHashTable *rcpt_hash, const MailConfigAccount **me) { + const MailConfigAccount *account; const char *name, *addr; - EAccount *account; int i; for (i = 0; camel_internet_address_get (cia, i, &name, &addr); i++) { @@ -872,10 +944,10 @@ list_add_addresses (GList *list, const CamelInternetAddress *cia, GHashTable *ac return list; } -static EAccount * +static const MailConfigAccount * guess_me (const CamelInternetAddress *to, const CamelInternetAddress *cc, GHashTable *account_hash) { - EAccount *account = NULL; + const MailConfigAccount *account = NULL; const char *addr; int i; @@ -904,12 +976,12 @@ guess_me (const CamelInternetAddress *to, const CamelInternetAddress *cc, GHashT return account; } -static EAccount * -guess_me_from_accounts (const CamelInternetAddress *to, const CamelInternetAddress *cc, EAccountList *accounts) +static const MailConfigAccount * +guess_me_from_accounts (const CamelInternetAddress *to, const CamelInternetAddress *cc, const GSList *accounts) { - EAccount *account, *def; + const MailConfigAccount *account, *def; GHashTable *account_hash; - EIterator *iter; + const GSList *l; account_hash = g_hash_table_new (g_strcase_hash, g_strcase_equal); @@ -919,12 +991,12 @@ guess_me_from_accounts (const CamelInternetAddress *to, const CamelInternetAddre g_hash_table_insert (account_hash, (char *) def->id->address, (void *) def); } - iter = e_list_get_iterator ((EList *) accounts); - while (e_iterator_is_valid (iter)) { - account = (EAccount *) e_iterator_get (iter); + l = accounts; + while (l) { + account = l->data; if (account->id->address) { - EAccount *acnt; + const MailConfigAccount *acnt; /* Accounts with identical email addresses that are enabled * take precedence over the accounts that aren't. If all @@ -933,7 +1005,7 @@ guess_me_from_accounts (const CamelInternetAddress *to, const CamelInternetAddre * account always takes precedence no matter what. */ acnt = g_hash_table_lookup (account_hash, account->id->address); - if (acnt && acnt != def && !acnt->enabled && account->enabled) { + if (acnt && acnt != def && !acnt->source->enabled && account->source->enabled) { g_hash_table_remove (account_hash, acnt->id->address); acnt = NULL; } @@ -942,11 +1014,9 @@ guess_me_from_accounts (const CamelInternetAddress *to, const CamelInternetAddre g_hash_table_insert (account_hash, (char *) account->id->address, (void *) account); } - e_iterator_next (iter); + l = l->next; } - g_object_unref (iter); - account = guess_me (to, cc, account_hash); g_hash_table_destroy (account_hash); @@ -981,22 +1051,18 @@ mail_generate_reply (CamelFolder *folder, CamelMimeMessage *message, const char const CamelInternetAddress *reply_to, *sender, *to_addrs, *cc_addrs; const char *name = NULL, *address = NULL, *source = NULL; const char *message_id, *references, *mlist = NULL; - char *text = NULL, *subject, format[256]; - EAccount *def, *account, *me = NULL; - EAccountList *accounts = NULL; + char *text = NULL, *subject, date_str[100], *format; + const MailConfigAccount *def, *account, *me = NULL; + const GSList *l, *accounts = NULL; GHashTable *account_hash = NULL; CamelMessageInfo *info = NULL; GList *to = NULL, *cc = NULL; EDestination **tov, **ccv; EMsgComposer *composer; CamelMimePart *part; - GConfClient *gconf; - EIterator *iter; time_t date; char *url; - gconf = gconf_client_get_default (); - if (mode == REPLY_POST) { composer = e_msg_composer_new_post (); if (composer != NULL) { @@ -1022,12 +1088,12 @@ mail_generate_reply (CamelFolder *folder, CamelMimeMessage *message, const char g_hash_table_insert (account_hash, (char *) def->id->address, (void *) def); } - iter = e_list_get_iterator ((EList *) accounts); - while (e_iterator_is_valid (iter)) { - account = (EAccount *) e_iterator_get (iter); + l = accounts; + while (l) { + account = l->data; if (account->id->address) { - EAccount *acnt; + const MailConfigAccount *acnt; /* Accounts with identical email addresses that are enabled * take precedence over the accounts that aren't. If all @@ -1036,7 +1102,7 @@ mail_generate_reply (CamelFolder *folder, CamelMimeMessage *message, const char * account always takes precedence no matter what. */ acnt = g_hash_table_lookup (account_hash, account->id->address); - if (acnt && acnt != def && !acnt->enabled && account->enabled) { + if (acnt && acnt != def && !acnt->source->enabled && account->source->enabled) { g_hash_table_remove (account_hash, acnt->id->address); acnt = NULL; } @@ -1045,11 +1111,9 @@ mail_generate_reply (CamelFolder *folder, CamelMimeMessage *message, const char g_hash_table_insert (account_hash, (char *) account->id->address, (void *) account); } - e_iterator_next (iter); + l = l->next; } - g_object_unref (iter); - to_addrs = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_TO); cc_addrs = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_CC); mail_ignore_address (composer, to_addrs); @@ -1076,7 +1140,7 @@ mail_generate_reply (CamelFolder *folder, CamelMimeMessage *message, const char max = camel_address_length (CAMEL_ADDRESS (to_addrs)); for (i = 0; i < max; i++) { camel_internet_address_get (to_addrs, i, &name, &address); - if (!strcasecmp (address, mlist)) + if (!g_strcasecmp (address, mlist)) break; } @@ -1084,7 +1148,7 @@ mail_generate_reply (CamelFolder *folder, CamelMimeMessage *message, const char max = camel_address_length (CAMEL_ADDRESS (cc_addrs)); for (i = 0; i < max; i++) { camel_internet_address_get (cc_addrs, i, &name, &address); - if (!strcasecmp (address, mlist)) + if (!g_strcasecmp (address, mlist)) break; } } @@ -1167,7 +1231,7 @@ mail_generate_reply (CamelFolder *folder, CamelMimeMessage *message, const char } /* set body text here as we want all ignored words to take effect */ - switch (gconf_client_get_int (gconf, "/apps/evolution/mail/format/reply_style", NULL)) { + switch (mail_config_get_default_reply_style ()) { case MAIL_CONFIG_REPLY_DO_NOT_QUOTE: /* do nothing */ break; @@ -1175,7 +1239,7 @@ mail_generate_reply (CamelFolder *folder, CamelMimeMessage *message, const char /* attach the original message as an attachment */ part = mail_tool_make_message_attachment (message); e_msg_composer_attach (composer, part); - camel_object_unref (part); + camel_object_unref (CAMEL_OBJECT (part)); break; case MAIL_CONFIG_REPLY_QUOTED: default: @@ -1188,9 +1252,12 @@ mail_generate_reply (CamelFolder *folder, CamelMimeMessage *message, const char } date = camel_mime_message_get_date (message, NULL); - strftime (format, sizeof (format), _("On %a, %Y-%m-%d at %H:%M, %%s wrote:"), localtime (&date)); + strftime (date_str, sizeof (date_str), _("On %a, %Y-%m-%d at %H:%M, %%s wrote:"), + localtime (&date)); + format = e_utf8_from_locale_string (date_str); text = mail_tool_quote_message (message, format, name && *name ? name : address); mail_ignore (composer, name, address); + g_free (format); if (text) { e_msg_composer_set_body_text (composer, text); g_free (text); @@ -1203,7 +1270,7 @@ mail_generate_reply (CamelFolder *folder, CamelMimeMessage *message, const char if (!subject) subject = g_strdup (""); else { - if (!strncasecmp (subject, "Re: ", 4)) + if (!g_strncasecmp (subject, "Re: ", 4)) subject = g_strndup (subject, MAX_SUBJECT_LEN); else { if (strlen (subject) < MAX_SUBJECT_LEN) { @@ -1298,10 +1365,12 @@ mail_reply (CamelFolder *folder, CamelMimeMessage *msg, const char *uid, int mod ccd->flags |= CAMEL_MESSAGE_ANSWERED_ALL; ccd->set = ccd->flags; - g_signal_connect (composer, "send", G_CALLBACK (composer_send_cb), ccd); - g_signal_connect (composer, "save-draft", G_CALLBACK (composer_save_draft_cb), ccd); - - g_object_weak_ref ((GObject *) composer, (GWeakNotify) composer_destroy_cb, ccd); + gtk_signal_connect (GTK_OBJECT (composer), "send", + GTK_SIGNAL_FUNC (composer_send_cb), ccd); + gtk_signal_connect (GTK_OBJECT (composer), "save-draft", + GTK_SIGNAL_FUNC (composer_save_draft_cb), ccd); + gtk_signal_connect (GTK_OBJECT (composer), "destroy", + GTK_SIGNAL_FUNC (composer_destroy_cb), ccd); gtk_widget_show (GTK_WIDGET (composer)); e_msg_composer_unset_changed (composer); @@ -1352,13 +1421,13 @@ enumerate_msg (MessageList *ml, const char *uid, gpointer data) static EMsgComposer * forward_get_composer (CamelMimeMessage *message, const char *subject) { + const MailConfigAccount *account = NULL; struct _composer_callback_data *ccd; - EAccount *account = NULL; EMsgComposer *composer; if (message) { const CamelInternetAddress *to_addrs, *cc_addrs; - EAccountList *accounts; + const GSList *accounts = NULL; accounts = mail_config_get_accounts (); to_addrs = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_TO); @@ -1381,10 +1450,12 @@ forward_get_composer (CamelMimeMessage *message, const char *subject) if (composer) { ccd = ccd_new (); - g_signal_connect (composer, "send", G_CALLBACK (composer_send_cb), ccd); - g_signal_connect (composer, "save-draft", G_CALLBACK (composer_save_draft_cb), ccd); - - g_object_weak_ref ((GObject *) composer, (GWeakNotify) composer_destroy_cb, ccd); + gtk_signal_connect (GTK_OBJECT (composer), "send", + GTK_SIGNAL_FUNC (composer_send_cb), ccd); + gtk_signal_connect (GTK_OBJECT (composer), "save-draft", + GTK_SIGNAL_FUNC (composer_save_draft_cb), ccd); + gtk_signal_connect (GTK_OBJECT (composer), "destroy", + GTK_SIGNAL_FUNC (composer_destroy_cb), ccd); e_msg_composer_set_headers (composer, account->name, NULL, NULL, NULL, subject); } else { @@ -1495,11 +1566,7 @@ forward_attached (GtkWidget *widget, gpointer user_data) void forward (GtkWidget *widget, gpointer user_data) { - MailConfigForwardStyle style; - GConfClient *gconf; - - gconf = gconf_client_get_default (); - style = gconf_client_get_int (gconf, "/apps/evolution/mail/format/forward_style", NULL); + MailConfigForwardStyle style = mail_config_get_default_forward_style (); if (style == MAIL_CONFIG_FORWARD_ATTACHED) forward_attached (widget, user_data); @@ -1513,7 +1580,7 @@ post_to_url (const char *url) { struct _composer_callback_data *ccd; GtkWidget *composer; - EAccount *account = NULL; + MailConfigAccount *account = NULL; /* FIXME: no way to get folder browser? Not without * big pain in the ass, as far as I can tell */ @@ -1531,10 +1598,12 @@ post_to_url (const char *url) ccd = ccd_new (); - g_signal_connect (composer, "send", G_CALLBACK (composer_send_cb), ccd); - g_signal_connect (composer, "save-draft", G_CALLBACK (composer_save_draft_cb), ccd); - - g_object_weak_ref ((GObject *) composer, (GWeakNotify) composer_destroy_cb, ccd); + gtk_signal_connect (GTK_OBJECT (composer), "send", + GTK_SIGNAL_FUNC (composer_send_cb), ccd); + gtk_signal_connect (GTK_OBJECT (composer), "save-draft", + GTK_SIGNAL_FUNC (composer_save_draft_cb), ccd); + gtk_signal_connect (GTK_OBJECT (composer), "destroy", + GTK_SIGNAL_FUNC (composer_destroy_cb), ccd); gtk_widget_show (composer); } @@ -1568,10 +1637,10 @@ post_reply (GtkWidget *widget, gpointer user_data) static EMsgComposer * redirect_get_composer (CamelMimeMessage *message) { + const MailConfigAccount *account = NULL; const CamelInternetAddress *to_addrs, *cc_addrs; + const GSList *accounts = NULL; struct _composer_callback_data *ccd; - EAccountList *accounts = NULL; - EAccount *account = NULL; EMsgComposer *composer; g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), NULL); @@ -1602,10 +1671,12 @@ redirect_get_composer (CamelMimeMessage *message) if (composer) { ccd = ccd_new (); - g_signal_connect (composer, "send", G_CALLBACK (composer_send_cb), ccd); - g_signal_connect (composer, "save-draft", G_CALLBACK (composer_save_draft_cb), ccd); - - g_object_weak_ref ((GObject *) composer, (GWeakNotify) composer_destroy_cb, ccd); + gtk_signal_connect (GTK_OBJECT (composer), "send", + GTK_SIGNAL_FUNC (composer_send_cb), ccd); + gtk_signal_connect (GTK_OBJECT (composer), "save-draft", + GTK_SIGNAL_FUNC (composer_save_draft_cb), ccd); + gtk_signal_connect (GTK_OBJECT (composer), "destroy", + GTK_SIGNAL_FUNC (composer_destroy_cb), ccd); } else { g_warning ("Could not create composer"); } @@ -1654,20 +1725,16 @@ static void transfer_msg_done (gboolean ok, void *data) { FolderBrowser *fb = data; - gboolean hide_deleted; - GConfClient *gconf; int row; if (ok && !FOLDER_BROWSER_IS_DESTROYED (fb)) { - gconf = gconf_client_get_default (); - hide_deleted = !gconf_client_get_bool (gconf, "/apps/evolution/mail/display/show_deleted", NULL); - row = e_tree_row_of_node (fb->message_list->tree, e_tree_get_cursor (fb->message_list->tree)); /* If this is the last message and deleted messages are hidden, select the previous */ - if ((row + 1 == e_tree_row_count (fb->message_list->tree)) && hide_deleted) + if ((row + 1 == e_tree_row_count (fb->message_list->tree)) + && mail_config_get_hide_deleted ()) message_list_select (fb->message_list, MESSAGE_LIST_SELECT_PREVIOUS, 0, CAMEL_MESSAGE_DELETED, FALSE); else @@ -1675,7 +1742,7 @@ transfer_msg_done (gboolean ok, void *data) 0, 0, FALSE); } - g_object_unref (fb); + gtk_object_unref (GTK_OBJECT (fb)); } static void @@ -1715,7 +1782,7 @@ transfer_msg (FolderBrowser *fb, gboolean delete_from_source) message_list_foreach (fb->message_list, enumerate_msg, uids); if (delete_from_source) { - g_object_ref (fb); + gtk_object_ref (GTK_OBJECT (fb)); mail_transfer_messages (fb->folder, uids, delete_from_source, folder->physicalUri, 0, transfer_msg_done, fb); @@ -1723,7 +1790,6 @@ transfer_msg (FolderBrowser *fb, gboolean delete_from_source) mail_transfer_messages (fb->folder, uids, delete_from_source, folder->physicalUri, 0, NULL, NULL); } - CORBA_free (folder); } @@ -1757,7 +1823,7 @@ find_socket (GtkContainer *container) { GList *children, *tmp; - children = gtk_container_get_children (container); + children = gtk_container_children (container); while (children) { if (BONOBO_IS_SOCKET (children->data)) return children->data; @@ -1770,14 +1836,13 @@ find_socket (GtkContainer *container) g_list_free_1 (children); children = tmp; } - - return NULL; + return NULL; } static void popup_listener_cb (BonoboListener *listener, - const char *event_name, - const CORBA_any *any, + char *event_name, + CORBA_any *any, CORBA_Environment *ev, gpointer user_data) { @@ -1801,17 +1866,18 @@ addrbook_sender (GtkWidget *widget, gpointer user_data) GtkWidget *socket; GPtrArray *uids; int i; - + if (FOLDER_BROWSER_IS_DESTROYED (fb)) return; - - uids = g_ptr_array_new (); - message_list_foreach (fb->message_list, enumerate_msg, uids); + + uids = g_ptr_array_new(); + message_list_foreach(fb->message_list, enumerate_msg, uids); if (uids->len != 1) goto done; - - info = camel_folder_get_message_info (fb->folder, uids->pdata[0]); - if (info == NULL || (addr_str = camel_message_info_from (info)) == NULL) + + info = camel_folder_get_message_info(fb->folder, uids->pdata[0]); + if (info == NULL + || (addr_str = camel_message_info_from(info)) == NULL) goto done; win = gtk_window_new (GTK_WINDOW_TOPLEVEL); @@ -1820,23 +1886,25 @@ addrbook_sender (GtkWidget *widget, gpointer user_data) control = bonobo_widget_new_control ("OAFIID:GNOME_Evolution_Addressbook_AddressPopup", CORBA_OBJECT_NIL); bonobo_widget_set_property (BONOBO_WIDGET (control), - "email", TC_CORBA_string, addr_str, + "email", addr_str, NULL); bonobo_event_source_client_add_listener (bonobo_widget_get_objref (BONOBO_WIDGET (control)), popup_listener_cb, NULL, NULL, win); socket = find_socket (GTK_CONTAINER (control)); - - g_object_weak_ref ((GObject *) socket, (GWeakNotify) gtk_widget_destroy, win); + gtk_signal_connect_object (GTK_OBJECT (socket), + "destroy", + GTK_SIGNAL_FUNC (gtk_widget_destroy), + GTK_OBJECT (win)); gtk_container_add (GTK_CONTAINER (win), control); gtk_widget_show_all (win); done: - for (i = 0; i < uids->len; i++) - g_free (uids->pdata[i]); - g_ptr_array_free (uids, TRUE); + for (i=0; i < uids->len; i++) + g_free(uids->pdata[i]); + g_ptr_array_free(uids, TRUE); } void @@ -1984,7 +2052,6 @@ flag_messages (FolderBrowser *fb, guint32 mask, guint32 set) camel_folder_set_message_flags (fb->folder, uids->pdata[i], mask, set); g_free (uids->pdata[i]); } - camel_folder_thaw (fb->folder); g_ptr_array_free (uids, TRUE); @@ -2009,13 +2076,13 @@ toggle_flags (FolderBrowser *fb, guint32 mask) guint32 flags; flags = ~(camel_folder_get_message_flags (fb->folder, uids->pdata[i])); - + /* if we're flagging a message important, always undelete it too */ if (mask & flags & CAMEL_MESSAGE_FLAGGED) { flags &= ~CAMEL_MESSAGE_DELETED; mask |= CAMEL_MESSAGE_DELETED; } - + /* if we're flagging a message deleted, mark it seen. If * we're undeleting it, we also want it to be seen, so always do this. */ @@ -2023,9 +2090,9 @@ toggle_flags (FolderBrowser *fb, guint32 mask) flags |= CAMEL_MESSAGE_SEEN; mask |= CAMEL_MESSAGE_SEEN; } - + camel_folder_set_message_flags (fb->folder, uids->pdata[i], mask, flags); - + g_free (uids->pdata[i]); } camel_folder_thaw (fb->folder); @@ -2051,7 +2118,7 @@ mark_as_unseen (BonoboUIComponent *uih, void *user_data, const char *path) /* Remove the automatic mark-as-read timer first */ if (fb->seen_id) { - g_source_remove (fb->seen_id); + gtk_timeout_remove (fb->seen_id); fb->seen_id = 0; } @@ -2102,33 +2169,51 @@ struct _tag_editor_data { }; static void -tag_editor_response(GtkWidget *gd, int button, struct _tag_editor_data *data) +tag_editor_ok (GtkWidget *button, gpointer user_data) { + struct _tag_editor_data *data = user_data; CamelFolder *folder; CamelTag *tags, *t; GPtrArray *uids; int i; - - /*if (FOLDER_BROWSER_IS_DESTROYED (data->fb)) - goto done;*/ - - if (button == GTK_RESPONSE_OK - && (tags = message_tag_editor_get_tag_list (data->editor))) { - folder = data->fb->folder; - uids = data->uids; - camel_folder_freeze (folder); - for (i = 0; i < uids->len; i++) { - for (t = tags; t; t = t->next) - camel_folder_set_message_user_tag (folder, uids->pdata[i], t->name, t->value); - } - camel_folder_thaw (folder); - camel_tag_list_free (&tags); + if (FOLDER_BROWSER_IS_DESTROYED (data->fb)) + goto done; + + tags = message_tag_editor_get_tag_list (data->editor); + if (tags == NULL) + goto done; + + folder = data->fb->folder; + uids = data->uids; + + camel_folder_freeze (folder); + for (i = 0; i < uids->len; i++) { + for (t = tags; t; t = t->next) + camel_folder_set_message_user_tag (folder, uids->pdata[i], t->name, t->value); } + camel_folder_thaw (folder); + + camel_tag_list_free (&tags); + + done: + gtk_widget_destroy (GTK_WIDGET (data->editor)); +} - gtk_widget_destroy(gd); +static void +tag_editor_cancel (GtkWidget *button, gpointer user_data) +{ + struct _tag_editor_data *data = user_data; + + gtk_widget_destroy (GTK_WIDGET (data->editor)); +} - g_object_unref (data->fb); +static void +tag_editor_destroy (GnomeDialog *dialog, gpointer user_data) +{ + struct _tag_editor_data *data = user_data; + + gtk_object_unref (GTK_OBJECT (data->fb)); g_ptr_array_free (data->uids, TRUE); g_free (data); } @@ -2164,8 +2249,10 @@ flag_for_followup (BonoboUIComponent *uih, void *user_data, const char *path) camel_message_info_from (info), camel_message_info_subject (info)); } - - g_signal_connect(editor, "response", G_CALLBACK(tag_editor_response), data); + + gnome_dialog_button_connect (GNOME_DIALOG (editor), 0, tag_editor_ok, data); + gnome_dialog_button_connect (GNOME_DIALOG (editor), 1, tag_editor_cancel, data); + gnome_dialog_set_close (GNOME_DIALOG (editor), TRUE); /* special-case... */ if (uids->len == 1) { @@ -2179,6 +2266,9 @@ flag_for_followup (BonoboUIComponent *uih, void *user_data, const char *path) } } + gtk_signal_connect (GTK_OBJECT (editor), "destroy", + tag_editor_destroy, data); + gtk_widget_show (editor); } @@ -2299,10 +2389,12 @@ do_edit_messages (CamelFolder *folder, GPtrArray *uids, GPtrArray *messages, voi ccd->drafts_uid = g_strdup (uids->pdata[i]); } - g_signal_connect (composer, "send", G_CALLBACK (composer_send_cb), ccd); - g_signal_connect (composer, "save-draft", G_CALLBACK (composer_save_draft_cb), ccd); - - g_object_weak_ref ((GObject *) composer, (GWeakNotify) composer_destroy_cb, ccd); + gtk_signal_connect (GTK_OBJECT (composer), "send", + GTK_SIGNAL_FUNC (composer_send_cb), ccd); + gtk_signal_connect (GTK_OBJECT (composer), "save-draft", + GTK_SIGNAL_FUNC (composer_save_draft_cb), ccd); + gtk_signal_connect (GTK_OBJECT (composer), "destroy", + GTK_SIGNAL_FUNC (composer_destroy_cb), ccd); gtk_widget_show (GTK_WIDGET (composer)); } @@ -2313,21 +2405,19 @@ static gboolean are_you_sure (const char *msg, GPtrArray *uids, FolderBrowser *fb) { GtkWidget *dialog; + char *buf; int button, i; - - dialog = gtk_message_dialog_new (FB_WINDOW (fb), GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, - msg, uids->len); - button = gtk_dialog_run ((GtkDialog *) dialog); - gtk_widget_destroy (dialog); - if (button != GTK_RESPONSE_OK) { + buf = g_strdup_printf (msg, uids->len); + dialog = e_gnome_ok_cancel_dialog_parented (buf, NULL, NULL, FB_WINDOW (fb)); + button = gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); + if (button != 0) { for (i = 0; i < uids->len; i++) g_free (uids->pdata[i]); g_ptr_array_free (uids, TRUE); } - return button == GTK_RESPONSE_OK; + return button == 0; } static void @@ -2341,8 +2431,16 @@ edit_msg_internal (FolderBrowser *fb) uids = g_ptr_array_new (); message_list_foreach (fb->message_list, enumerate_msg, uids); - if (uids->len > 10 && !are_you_sure (_("Are you sure you want to edit all %d messages?"), uids, fb)) + if (uids->len > 10 && !are_you_sure (_("Are you sure you want to edit all %d messages?"), uids, fb)) { + int i; + + for (i = 0; i < uids->len; i++) + g_free (uids->pdata[i]); + + g_ptr_array_free (uids, TRUE); + return; + } mail_get_messages (fb->folder, uids, do_edit_messages, fb); } @@ -2356,8 +2454,13 @@ edit_msg (GtkWidget *widget, gpointer user_data) return; if (!folder_browser_is_drafts (fb)) { - e_notice(FB_WINDOW(fb), GTK_MESSAGE_ERROR, - _("You may only edit messages saved\nin the Drafts folder.")); + GtkWidget *dialog; + + dialog = gnome_warning_dialog_parented (_("You may only edit messages saved\n" + "in the Drafts folder."), + FB_WINDOW (fb)); + gnome_dialog_set_close (GNOME_DIALOG (dialog), TRUE); + gtk_widget_show (dialog); return; } @@ -2379,6 +2482,7 @@ do_resend_messages (CamelFolder *folder, GPtrArray *uids, GPtrArray *messages, v } + void resend_msg (GtkWidget *widget, gpointer user_data) { @@ -2389,8 +2493,13 @@ resend_msg (GtkWidget *widget, gpointer user_data) return; if (!folder_browser_is_sent (fb)) { - e_notice (FB_WINDOW (fb), GTK_MESSAGE_ERROR, - _("You may only resend messages\nin the Sent folder.")); + GtkWidget *dialog; + + dialog = gnome_warning_dialog_parented (_("You may only resend messages\n" + "in the Sent folder."), + FB_WINDOW (fb)); + gnome_dialog_set_close (GNOME_DIALOG (dialog), TRUE); + gtk_widget_show (dialog); return; } @@ -2400,13 +2509,20 @@ resend_msg (GtkWidget *widget, gpointer user_data) uids = g_ptr_array_new (); message_list_foreach (fb->message_list, enumerate_msg, uids); - if (uids->len > 10 && !are_you_sure (_("Are you sure you want to resend all %d messages?"), uids, fb)) + if (uids->len > 10 && !are_you_sure (_("Are you sure you want to resend all %d messages?"), uids, fb)) { + int i; + + for (i = 0; i < uids->len; i++) + g_free (uids->pdata[i]); + + g_ptr_array_free (uids, TRUE); + return; + } mail_get_messages (fb->folder, uids, do_resend_messages, fb); } - void search_msg (GtkWidget *widget, gpointer user_data) { @@ -2419,10 +2535,8 @@ search_msg (GtkWidget *widget, gpointer user_data) if (fb->mail_display->current_message == NULL) { GtkWidget *dialog; - dialog = gtk_message_dialog_new (FB_WINDOW(fb), GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, - _("No Message Selected")); - g_signal_connect_swapped (dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog); + dialog = gnome_warning_dialog_parented (_("No Message Selected"), FB_WINDOW (fb)); + gnome_dialog_set_close (GNOME_DIALOG (dialog), TRUE); gtk_widget_show (dialog); return; } @@ -2448,8 +2562,8 @@ save_msg_ok (GtkWidget *widget, gpointer user_data) CamelFolder *folder; GPtrArray *uids; const char *path; + int fd, ret = 0; struct stat st; - gboolean ret = TRUE; path = gtk_file_selection_get_filename (GTK_FILE_SELECTION (user_data)); if (path[0] == '\0') @@ -2458,21 +2572,33 @@ save_msg_ok (GtkWidget *widget, gpointer user_data) /* make sure we can actually save to it... */ if (stat (path, &st) != -1 && !S_ISREG (st.st_mode)) return; - - if (access(path, F_OK) == 0) { - if (access(path, W_OK) != 0) { - e_notice(GTK_WINDOW(user_data), GTK_MESSAGE_ERROR, - _("Cannot save to `%s'\n %s"), path, g_strerror(errno)); - return; - } - - ret = e_question(GTK_WINDOW(user_data), GTK_RESPONSE_NO, NULL, - _("`%s' already exists.\nOverwrite it?"), path); + + fd = open (path, O_RDONLY); + if (fd != -1) { + GtkWidget *dialog; + GtkWidget *text; + + close (fd); + + dialog = gnome_dialog_new (_("Overwrite file?"), + GNOME_STOCK_BUTTON_YES, + GNOME_STOCK_BUTTON_NO, + NULL); + + e_gnome_dialog_set_parent (GNOME_DIALOG (dialog), GTK_WINDOW (user_data)); + + text = gtk_label_new (_("A file by that name already exists.\nOverwrite it?")); + gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), text, TRUE, TRUE, 4); + gtk_window_set_policy (GTK_WINDOW (dialog), FALSE, TRUE, FALSE); + gtk_widget_show (text); + + ret = gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); } - if (ret) { - folder = g_object_get_data ((GObject *) user_data, "folder"); - uids = g_object_steal_data (G_OBJECT (user_data), "uids"); + if (ret == 0) { + folder = gtk_object_get_data (GTK_OBJECT (user_data), "folder"); + uids = gtk_object_get_data (GTK_OBJECT (user_data), "uids"); + gtk_object_remove_no_notify (GTK_OBJECT (user_data), "uids"); mail_save_messages (folder, uids, path, NULL, NULL); gtk_widget_destroy (GTK_WIDGET (user_data)); } @@ -2516,13 +2642,13 @@ save_msg (GtkWidget *widget, gpointer user_data) path = g_strdup_printf ("%s/", g_get_home_dir ()); gtk_file_selection_set_filename (filesel, path); g_free (path); - - g_object_set_data_full ((GObject *) filesel, "uids", uids, save_msg_destroy); - g_object_set_data ((GObject *) filesel, "folder", fb->folder); - - g_signal_connect (filesel->ok_button, "clicked", G_CALLBACK (save_msg_ok), filesel); - g_signal_connect_swapped (filesel->cancel_button, "clicked", - G_CALLBACK (gtk_widget_destroy), filesel); + gtk_object_set_data_full (GTK_OBJECT (filesel), "uids", uids, save_msg_destroy); + gtk_object_set_data (GTK_OBJECT (filesel), "folder", fb->folder); + gtk_signal_connect (GTK_OBJECT (filesel->ok_button), + "clicked", GTK_SIGNAL_FUNC (save_msg_ok), filesel); + gtk_signal_connect_object (GTK_OBJECT (filesel->cancel_button), + "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), + GTK_OBJECT (filesel)); gtk_widget_show (GTK_WIDGET (filesel)); } @@ -2537,15 +2663,11 @@ void delete_msg (GtkWidget *button, gpointer user_data) { FolderBrowser *fb = FOLDER_BROWSER (user_data); - gboolean hide_deleted; - GConfClient *gconf; int deleted, row; if (FOLDER_BROWSER_IS_DESTROYED (fb)) return; - gconf = gconf_client_get_default (); - deleted = flag_messages (fb, CAMEL_MESSAGE_DELETED | CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_DELETED | CAMEL_MESSAGE_SEEN); @@ -2554,11 +2676,10 @@ delete_msg (GtkWidget *button, gpointer user_data) row = e_tree_row_of_node (fb->message_list->tree, e_tree_get_cursor (fb->message_list->tree)); - hide_deleted = !gconf_client_get_bool (gconf, "/apps/evolution/mail/display/show_deleted", NULL); - /* If this is the last message and deleted messages are hidden, select the previous */ - if ((row + 1 == e_tree_row_count (fb->message_list->tree)) && hide_deleted) + if ((row+1 == e_tree_row_count (fb->message_list->tree)) + && mail_config_get_hide_deleted ()) message_list_select (fb->message_list, MESSAGE_LIST_SELECT_PREVIOUS, 0, CAMEL_MESSAGE_DELETED, FALSE); else @@ -2573,6 +2694,153 @@ undelete_msg (GtkWidget *button, gpointer user_data) flag_messages (FOLDER_BROWSER (user_data), CAMEL_MESSAGE_DELETED, 0); } + +#if 0 +static gboolean +confirm_goto_next_folder (FolderBrowser *fb) +{ + GtkWidget *dialog, *label, *checkbox; + int button; + + if (!mail_config_get_confirm_goto_next_folder ()) + return mail_config_get_goto_next_folder (); + + dialog = gnome_dialog_new (_("Go to next folder with unread messages?"), + GNOME_STOCK_BUTTON_YES, + GNOME_STOCK_BUTTON_NO, + NULL); + + e_gnome_dialog_set_parent (GNOME_DIALOG (dialog), FB_WINDOW (fb)); + + label = gtk_label_new (_("There are no more new messages in this folder.\n" + "Would you like to go to the next folder?")); + + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT); + gtk_widget_show (label); + gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), label, TRUE, TRUE, 4); + + checkbox = gtk_check_button_new_with_label (_("Do not ask me again.")); + gtk_object_ref (GTK_OBJECT (checkbox)); + gtk_widget_show (checkbox); + gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), checkbox, TRUE, TRUE, 4); + + button = gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbox))) + mail_config_set_confirm_goto_next_folder (FALSE); + + gtk_object_unref (GTK_OBJECT (checkbox)); + + if (button == 0) { + mail_config_set_goto_next_folder (TRUE); + return TRUE; + } else { + mail_config_set_goto_next_folder (FALSE); + return FALSE; + } +} + +static CamelFolderInfo * +find_current_folder (CamelFolderInfo *root, const char *current_uri) +{ + CamelFolderInfo *node, *current = NULL; + + node = root; + while (node) { + if (!strcmp (current_uri, node->url)) { + current = node; + break; + } + + current = find_current_folder (node->child, current_uri); + if (current) + break; + + node = node->sibling; + } + + return current; +} + +static CamelFolderInfo * +find_next_folder_r (CamelFolderInfo *node) +{ + CamelFolderInfo *next; + + while (node) { + if (node->unread_message_count > 0) + return node; + + next = find_next_folder_r (node->child); + if (next) + return next; + + node = node->sibling; + } + + return NULL; +} + +static CamelFolderInfo * +find_next_folder (CamelFolderInfo *current) +{ + CamelFolderInfo *next; + + /* first search subfolders... */ + next = find_next_folder_r (current->child); + if (next) + return next; + + /* now search siblings... */ + next = find_next_folder_r (current->sibling); + if (next) + return next; + + /* now go up one level (if we can) and search... */ + if (current->parent && current->parent->sibling) { + return find_next_folder_r (current->parent->sibling); + } else { + return NULL; + } +} + +static void +do_evil_kludgy_goto_next_folder_hack (FolderBrowser *fb) +{ + CamelFolderInfo *root, *current, *node; + CORBA_Environment ev; + CamelStore *store; + + store = camel_folder_get_parent_store (fb->folder); + + /* FIXME: loop over all available mail stores? */ + + root = camel_store_get_folder_info (store, "", CAMEL_STORE_FOLDER_INFO_RECURSIVE | + CAMEL_STORE_FOLDER_INFO_SUBSCRIBED, NULL); + + if (!root) + return; + + current = find_current_folder (root, fb->uri); + g_assert (current != NULL); + + node = find_next_folder (current); + if (node) { + g_warning ("doin' my thang..."); + CORBA_exception_init (&ev); + GNOME_Evolution_ShellView_changeCurrentView (fb->shell_view, "evolution:/local/Inbox", &ev); + if (ev._major != CORBA_NO_EXCEPTION) + g_warning ("got an exception"); + CORBA_exception_free (&ev); + } else { + g_warning ("can't find a folder with unread mail?"); + } + + camel_store_free_folder_info (store, root); +} +#endif + void next_msg (GtkWidget *button, gpointer user_data) { @@ -2592,7 +2860,12 @@ next_unread_msg (GtkWidget *button, gpointer user_data) if (FOLDER_BROWSER_IS_DESTROYED (fb)) return; - message_list_select (fb->message_list, MESSAGE_LIST_SELECT_NEXT, 0, CAMEL_MESSAGE_SEEN, TRUE); + if (!message_list_select (fb->message_list, MESSAGE_LIST_SELECT_NEXT, 0, CAMEL_MESSAGE_SEEN, TRUE)) { +#if 0 + if (confirm_goto_next_folder (fb)) + do_evil_kludgy_goto_next_folder_hack (fb); +#endif + } } void @@ -2664,33 +2937,50 @@ expunged_folder (CamelFolder *f, void *data) fb->expunging = NULL; gtk_widget_set_sensitive (GTK_WIDGET (fb->message_list), TRUE); - - /* FIXME: we should check that the focus hasn't changed in the - * mean time, otherwise we steal the focus unecessarily. - * Check :get_toplevel()->focus_widget? */ - if (fb->expunge_mlfocussed) - gtk_widget_grab_focus((GtkWidget *)fb->message_list); } static gboolean confirm_expunge (FolderBrowser *fb) { - gboolean res, show_again; - GConfClient *gconf; - - gconf = gconf_client_get_default (); + GtkWidget *dialog, *label, *checkbox; + int button; - if (!gconf_client_get_bool (gconf, "/apps/evolution/mail/prompts/expunge", NULL)) + if (!mail_config_get_confirm_expunge ()) return TRUE; - res = e_question (FB_WINDOW (fb), GTK_RESPONSE_NO, &show_again, - _("This operation will permanently erase all messages marked as\n" - "deleted. If you continue, you will not be able to recover these messages.\n" - "\nReally erase these messages?")); + dialog = gnome_dialog_new (_("Warning"), + GNOME_STOCK_BUTTON_YES, + GNOME_STOCK_BUTTON_NO, + NULL); + + e_gnome_dialog_set_parent (GNOME_DIALOG (dialog), FB_WINDOW (fb)); + + label = gtk_label_new (_("This operation will permanently erase all messages marked as deleted. If you continue, you will not be able to recover these messages.\n\nReally erase these messages?")); + + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT); + gtk_widget_show (label); + gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), label, TRUE, TRUE, 4); - gconf_client_set_bool (gconf, "/apps/evolution/mail/prompts/expunge", show_again, NULL); + checkbox = gtk_check_button_new_with_label (_("Do not ask me again.")); + gtk_object_ref (GTK_OBJECT (checkbox)); + gtk_widget_show (checkbox); + gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), checkbox, TRUE, TRUE, 4); - return res; + /* Set the 'No' button as the default */ + gnome_dialog_set_default (GNOME_DIALOG (dialog), 1); + + button = gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); + + if (button == 0 && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbox))) + mail_config_set_confirm_expunge (FALSE); + + gtk_object_unref (GTK_OBJECT (checkbox)); + + if (button == 0) + return TRUE; + else + return FALSE; } void @@ -2703,17 +2993,8 @@ expunge_folder (BonoboUIComponent *uih, void *user_data, const char *path) if (fb->folder && (fb->expunging == NULL || fb->folder != fb->expunging) && confirm_expunge (fb)) { CamelMessageInfo *info; - GtkWindow *top; - GtkWidget *focus; - - /* disable the message list so user can't click on them while we expunge */ - - /* nasty hack to find out if some widget inside the message list is focussed ... */ - top = GTK_WINDOW (gtk_widget_get_toplevel((GtkWidget *)fb->message_list)); - focus = top?top->focus_widget:NULL; - while (focus && focus != (GtkWidget *)fb->message_list) - focus = focus->parent; - fb->expunge_mlfocussed = focus == (GtkWidget *)fb->message_list; + + /* hide the deleted messages so user can't click on them while we expunge */ gtk_widget_set_sensitive (GTK_WIDGET (fb->message_list), FALSE); /* Only blank the mail display if the message being @@ -2735,22 +3016,28 @@ expunge_folder (BonoboUIComponent *uih, void *user_data, const char *path) static GtkWidget *filter_editor = NULL; static void -filter_editor_response (GtkWidget *dialog, int button, FolderBrowser *fb) +filter_editor_destroy (GtkWidget *dialog, gpointer user_data) +{ + filter_editor = NULL; +} + +static void +filter_editor_clicked (GtkWidget *dialog, int button, FolderBrowser *fb) { FilterContext *fc; - if (button == GTK_RESPONSE_ACCEPT) { + if (button == 0) { char *user; - fc = g_object_get_data(G_OBJECT(dialog), "context"); + fc = gtk_object_get_data (GTK_OBJECT (dialog), "context"); user = g_strdup_printf ("%s/filters.xml", evolution_dir); rule_context_save ((RuleContext *)fc, user); g_free (user); } - - gtk_widget_destroy(dialog); - - filter_editor = NULL; + + if (button != -1) { + gnome_dialog_close (GNOME_DIALOG (dialog)); + } } static const char *filter_source_names[] = { @@ -2773,23 +3060,32 @@ filter_edit (BonoboUIComponent *uih, void *user_data, const char *path) fc = filter_context_new (); user = g_strdup_printf ("%s/filters.xml", evolution_dir); - system = EVOLUTION_PRIVDATADIR "/filtertypes.xml"; + system = EVOLUTION_DATADIR "/evolution/filtertypes.xml"; rule_context_load ((RuleContext *)fc, system, user); g_free (user); if (((RuleContext *)fc)->error) { - e_notice(FB_WINDOW (fb), GTK_MESSAGE_ERROR, - _("Error loading filter information:\n%s"), - ((RuleContext *)fc)->error); + GtkWidget *dialog; + char *err; + + err = g_strdup_printf (_("Error loading filter information:\n%s"), + ((RuleContext *)fc)->error); + dialog = gnome_warning_dialog_parented (err, FB_WINDOW (fb)); + g_free (err); + + gnome_dialog_set_close (GNOME_DIALOG (dialog), TRUE); + gtk_widget_show (dialog); return; } filter_editor = (GtkWidget *)filter_editor_new (fc, filter_source_names); - /* FIXME: maybe this needs destroy func? */ - gtk_window_set_transient_for ((GtkWindow *) filter_editor, FB_WINDOW (fb)); + gnome_dialog_set_parent (GNOME_DIALOG (filter_editor), FB_WINDOW (fb)); gtk_window_set_title (GTK_WINDOW (filter_editor), _("Filters")); - g_object_set_data_full ((GObject *) filter_editor, "context", fc, (GtkDestroyNotify) g_object_unref); - g_signal_connect (filter_editor, "response", G_CALLBACK (filter_editor_response), fb); + + gtk_object_set_data_full (GTK_OBJECT (filter_editor), "context", fc, (GtkDestroyNotify)gtk_object_unref); + gtk_signal_connect (GTK_OBJECT (filter_editor), "clicked", filter_editor_clicked, fb); + gtk_signal_connect (GTK_OBJECT (filter_editor), "destroy", filter_editor_destroy, NULL); + gnome_dialog_append_buttons(GNOME_DIALOG(filter_editor), GNOME_STOCK_BUTTON_CANCEL, NULL); gtk_widget_show (GTK_WIDGET (filter_editor)); } @@ -2826,13 +3122,11 @@ footer_print_cb (GtkHTML *html, GnomePrintContext *print_context, double x, double y, double width, double height, gpointer user_data) { struct footer_info *info = (struct footer_info *) user_data; - + if (info->local_font) { - char *text = g_strdup_printf (_("Page %d of %d"), info->page_num, info->pages); - /*gdouble tw = gnome_font_get_width_string (info->local_font, text);*/ - /* FIXME: work out how to measure this */ - gdouble tw = strlen (text) * 8; - + gchar *text = g_strdup_printf (_("Page %d of %d"), info->page_num, info->pages); + gdouble tw = gnome_font_get_width_string (info->local_font, text); + gnome_print_gsave (print_context); gnome_print_newpath (print_context); gnome_print_setrgbcolor (print_context, .0, .0, .0); @@ -2840,7 +3134,7 @@ footer_print_cb (GtkHTML *html, GnomePrintContext *print_context, gnome_print_setfont (print_context, info->local_font); gnome_print_show (print_context, text); gnome_print_grestore (print_context); - + g_free (text); info->page_num++; } @@ -2858,16 +3152,15 @@ static struct footer_info * footer_info_new (GtkHTML *html, GnomePrintContext *pc, gdouble *line) { struct footer_info *info; - + info = g_new (struct footer_info, 1); - info->local_font = gnome_font_find_closest ("Helvetica", 10.0); - - if (info->local_font) + info->local_font = gnome_font_new_closest ("Helvetica", GNOME_FONT_BOOK, FALSE, 10); + if (info->local_font) { *line = gnome_font_get_ascender (info->local_font) + gnome_font_get_descender (info->local_font); - + } info->page_num = 1; info->pages = gtk_html_print_get_pages_num (html, pc, 0.0, *line); - + return info; } @@ -2875,43 +3168,51 @@ static void do_mail_print (FolderBrowser *fb, gboolean preview) { GtkHTML *html; - GtkWidget *w = NULL; GnomePrintContext *print_context; - GnomePrintJob *print_master; - GnomePrintConfig *config = NULL; - GtkDialog *dialog; + GnomePrintMaster *print_master; + GnomePrintDialog *dialog; + GnomePrinter *printer = NULL; + GnomePaper *paper; gdouble line = 0.0; + int copies = 1; + int collate = FALSE; struct footer_info *info; - + if (!preview) { - dialog = (GtkDialog *) gnome_print_dialog_new (NULL, _("Print Message"), GNOME_PRINT_DIALOG_COPIES); - gtk_dialog_set_default_response (dialog, GNOME_PRINT_DIALOG_RESPONSE_PRINT); - gtk_window_set_transient_for ((GtkWindow *) dialog, (GtkWindow *) gtk_widget_get_toplevel ((GtkWidget *) fb)); - - switch (gtk_dialog_run (dialog)) { - case GNOME_PRINT_DIALOG_RESPONSE_PRINT: - break; - case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW: + dialog = GNOME_PRINT_DIALOG (gnome_print_dialog_new (_("Print Message"), + GNOME_PRINT_DIALOG_COPIES)); + gnome_dialog_set_default (GNOME_DIALOG (dialog), GNOME_PRINT_PRINT); + e_gnome_dialog_set_parent (GNOME_DIALOG (dialog), FB_WINDOW (fb)); + + switch (gnome_dialog_run (GNOME_DIALOG (dialog))) { + case GNOME_PRINT_PRINT: + break; + case GNOME_PRINT_PREVIEW: preview = TRUE; break; + case -1: + return; default: - gtk_widget_destroy ((GtkWidget *) dialog); + gnome_dialog_close (GNOME_DIALOG (dialog)); return; } - config = gnome_print_dialog_get_config ((GnomePrintDialog *) dialog); - gtk_widget_destroy ((GtkWidget *)dialog); + gnome_print_dialog_get_copies (dialog, &copies, &collate); + printer = gnome_print_dialog_get_printer (dialog); + gnome_dialog_close (GNOME_DIALOG (dialog)); } - if (config) { - print_master = gnome_print_job_new (config); - gnome_print_config_unref (config); - } else - print_master = gnome_print_job_new (NULL); + print_master = gnome_print_master_new (); - /* paper size settings? */ - /*gnome_print_master_set_paper (print_master, paper);*/ - print_context = gnome_print_job_get_context (print_master); + if (printer) + gnome_print_master_set_printer (print_master, printer); + paper = (GnomePaper *) gnome_paper_with_name (_("US-Letter")); + + if (!paper) + paper = (GnomePaper *) gnome_paper_with_name (gnome_paper_name_default ()); + gnome_print_master_set_paper (print_master, paper); + gnome_print_master_set_copies (print_master, copies, collate); + print_context = gnome_print_master_get_context (print_master); html = GTK_HTML (gtk_html_new ()); mail_display_initialize_gtkhtml (fb->mail_display, html); @@ -2921,13 +3222,8 @@ do_mail_print (FolderBrowser *fb, gboolean preview) user's theme. */ fb->mail_display->printing = TRUE; - if (!GTK_WIDGET_REALIZED (GTK_WIDGET (html))) { - /* gtk widgets don't like to be realized outside top level widget - so we put new html widget into gtk window */ - w = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_container_add (GTK_CONTAINER (w), GTK_WIDGET (html)); + if (!GTK_WIDGET_REALIZED (GTK_WIDGET (html))) gtk_widget_realize (GTK_WIDGET (html)); - } mail_display_render (fb->mail_display, html, TRUE); gtk_html_print_set_master (html, print_master); @@ -2937,24 +3233,25 @@ do_mail_print (FolderBrowser *fb, gboolean preview) fb->mail_display->printing = FALSE; - gnome_print_job_close (print_master); - gtk_widget_destroy (GTK_WIDGET (html)); - if (w) - gtk_widget_destroy (w); + gnome_print_master_close (print_master); if (preview){ - GtkWidget *pw; + gboolean landscape = FALSE; + GnomePrintMasterPreview *preview; - pw = gnome_print_job_preview_new (print_master, _("Print Preview")); - gtk_widget_show (pw); + preview = gnome_print_master_preview_new_with_orientation ( + print_master, _("Print Preview"), landscape); + gtk_widget_show (GTK_WIDGET (preview)); } else { - int result = gnome_print_job_print (print_master); + int result = gnome_print_master_print (print_master); - if (result == -1) - e_notice (FB_WINDOW (fb), GTK_MESSAGE_ERROR, _("Printing of message failed")); + if (result == -1){ + e_notice (NULL, GNOME_MESSAGE_BOX_ERROR, + _("Printing of message failed")); + } } - - g_object_unref (print_master); + + /* FIXME: We are leaking the GtkHTML object */ } /* This is pretty evil. FolderBrowser's API should be extended to allow these sorts of @@ -2985,7 +3282,7 @@ done_message_selected (CamelFolder *folder, const char *uid, CamelMimeMessage *m g_free (fb->loaded_uid); fb->loaded_uid = fb->loading_uid; fb->loading_uid = NULL; - + if (msg) do_mail_print (fb, preview); } @@ -3052,12 +3349,10 @@ print_preview_msg (GtkWidget *button, gpointer user_data) static GtkObject *subscribe_dialog = NULL; static void -subscribe_dialog_destroy (GtkObject *dialog, GObject *deadbeef) +subscribe_dialog_destroy (GtkWidget *widget, gpointer user_data) { - if (subscribe_dialog) { - g_object_unref (subscribe_dialog); - subscribe_dialog = NULL; - } + gtk_object_unref (subscribe_dialog); + subscribe_dialog = NULL; } void @@ -3065,9 +3360,8 @@ manage_subscriptions (BonoboUIComponent *uih, void *user_data, const char *path) { if (!subscribe_dialog) { subscribe_dialog = subscribe_dialog_new (); - - g_object_weak_ref ((GObject *) SUBSCRIBE_DIALOG (subscribe_dialog)->app, - (GWeakNotify) subscribe_dialog_destroy, subscribe_dialog); + gtk_signal_connect (GTK_OBJECT (SUBSCRIBE_DIALOG (subscribe_dialog)->app), "destroy", + subscribe_dialog_destroy, NULL); subscribe_dialog_show (subscribe_dialog); } else { @@ -3083,7 +3377,7 @@ local_configure_done(const char *uri, CamelFolder *folder, void *data) FolderBrowser *fb = data; if (FOLDER_BROWSER_IS_DESTROYED (fb)) { - g_object_unref(fb); + gtk_object_unref((GtkObject *)fb); return; } @@ -3091,7 +3385,7 @@ local_configure_done(const char *uri, CamelFolder *folder, void *data) folder = fb->folder; message_list_set_folder(fb->message_list, folder, FALSE); - g_object_unref(fb); + gtk_object_unref((GtkObject *)fb); } void @@ -3107,7 +3401,7 @@ configure_folder (BonoboUIComponent *uih, void *user_data, const char *path) vfolder_edit_rule (fb->uri); } else { message_list_set_folder(fb->message_list, NULL, FALSE); - g_object_ref((GtkObject *)fb); + gtk_object_ref((GtkObject *)fb); mail_local_reconfigure_folder(fb->uri, local_configure_done, fb); } } @@ -3190,19 +3484,18 @@ stop_threads (BonoboUIComponent *uih, void *user_data, const char *path) static void empty_trash_expunged_cb (CamelFolder *folder, void *data) { - camel_object_unref (folder); + camel_object_unref (CAMEL_OBJECT (folder)); } void empty_trash (BonoboUIComponent *uih, void *user_data, const char *path) { + MailConfigAccount *account; CamelProvider *provider; - EAccountList *accounts; + const GSList *accounts; CamelFolder *vtrash; FolderBrowser *fb; CamelException ex; - EAccount *account; - EIterator *iter; fb = user_data ? FOLDER_BROWSER (user_data) : NULL; @@ -3213,12 +3506,11 @@ empty_trash (BonoboUIComponent *uih, void *user_data, const char *path) /* expunge all remote stores */ accounts = mail_config_get_accounts (); - iter = e_list_get_iterator ((EList *) accounts); - while (e_iterator_is_valid (iter)) { - account = (EAccount *) e_iterator_get (iter); + while (accounts) { + account = accounts->data; /* make sure this is a valid source */ - if (account->enabled && account->source->url) { + if (account->source && account->source->enabled && account->source->url) { provider = camel_session_get_provider (session, account->source->url, &ex); if (provider) { /* make sure this store is a remote store */ @@ -3235,16 +3527,14 @@ empty_trash (BonoboUIComponent *uih, void *user_data, const char *path) /* clear the exception for the next round */ camel_exception_clear (&ex); } - - e_iterator_next (iter); + accounts = accounts->next; } - g_object_unref (iter); - /* Now empty the local trash folder */ vtrash = mail_tool_get_trash ("file:/", TRUE, &ex); - if (vtrash) + if (vtrash) { mail_expunge_folder (vtrash, empty_trash_expunged_cb, NULL); + } camel_exception_clear (&ex); } |