aboutsummaryrefslogtreecommitdiffstats
path: root/mail/mail-callbacks.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/mail-callbacks.c')
-rw-r--r--mail/mail-callbacks.c1243
1 files changed, 305 insertions, 938 deletions
diff --git a/mail/mail-callbacks.c b/mail/mail-callbacks.c
index 1dfffd2fbb..e60aa49e42 100644
--- a/mail/mail-callbacks.c
+++ b/mail/mail-callbacks.c
@@ -31,6 +31,8 @@
#include <errno.h>
#include <time.h>
#include <libgnome/gnome-paper.h>
+#include <libgnomeui/gnome-dialog.h>
+#include <libgnomeui/gnome-dialog-util.h>
#include <libgnomeui/gnome-stock.h>
#include <libgnome/gnome-paper.h>
#include <libgnomeprint/gnome-print-master.h>
@@ -40,10 +42,8 @@
#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 "mail.h"
-#include "folder-browser-window.h"
#include "message-browser.h"
#include "mail-callbacks.h"
#include "mail-config.h"
@@ -59,8 +59,6 @@
#include "mail-folder-cache.h"
#include "folder-browser.h"
#include "subscribe-dialog.h"
-#include "message-tag-editor.h"
-#include "message-tag-followup.h"
#include "e-messagebox.h"
#include "Evolution.h"
@@ -68,13 +66,59 @@
#include "evolution-shell-client.h"
+#ifndef HAVE_MKSTEMP
+#include <fcntl.h>
+#include <sys/stat.h>
+#endif
#define FB_WINDOW(fb) GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (fb), GTK_TYPE_WINDOW))
+/* These e_gnome_dialog* functions are to handle the brokenness that is gnome-dialog */
+static void
+e_gnome_dialog_parent_destroyed (GtkWidget *parent, GtkWidget *dialog)
+{
+ gnome_dialog_close (GNOME_DIALOG (dialog));
+}
+
+static void
+e_gnome_dialog_set_parent (GnomeDialog *dialog, GtkWindow *parent)
+{
+ gnome_dialog_set_parent (dialog, parent);
+ gtk_signal_connect_while_alive (GTK_OBJECT (parent), "destroy",
+ e_gnome_dialog_parent_destroyed,
+ dialog, GTK_OBJECT (dialog));
+}
+
+static GtkWidget *
+e_gnome_warning_dialog_parented (const char *warning, GtkWindow *parent)
+{
+ GtkWidget *dialog;
+
+ dialog = gnome_warning_dialog_parented (warning, parent);
+ gtk_signal_connect (GTK_OBJECT (parent), "destroy",
+ e_gnome_dialog_parent_destroyed, dialog);
+
+ return dialog;
+}
+
+static GtkWidget *
+e_gnome_ok_cancel_dialog_parented (const char *message, GnomeReplyCallback callback,
+ gpointer data, GtkWindow *parent)
+{
+ GtkWidget *dialog;
+
+ dialog = gnome_ok_cancel_dialog_parented (message, callback, data, parent);
+ gtk_signal_connect (GTK_OBJECT (parent), "destroy",
+ e_gnome_dialog_parent_destroyed, dialog);
+
+ return dialog;
+}
+
+
struct post_send_data {
CamelFolder *folder;
gchar *uid;
- guint32 flags, set;
+ guint32 flags;
};
static void
@@ -167,6 +211,33 @@ check_send_configuration (FolderBrowser *fb)
return TRUE;
}
+void
+send_receive_mail (GtkWidget *widget, gpointer user_data)
+{
+ FolderBrowser *fb = FOLDER_BROWSER (user_data);
+ const MailConfigAccount *account;
+
+ if (FOLDER_BROWSER_IS_DESTROYED (fb))
+ return;
+
+ if (!mail_config_is_configured () && !configure_mail (fb))
+ return;
+
+ account = mail_config_get_default_account ();
+ if (!account || !account->transport) {
+ GtkWidget *dialog;
+
+ dialog = gnome_error_dialog_parented (_("You have not set a mail transport method"),
+ FB_WINDOW (fb));
+ gnome_dialog_set_close (GNOME_DIALOG (dialog), TRUE);
+ gtk_widget_show (dialog);
+
+ return;
+ }
+
+ mail_send_receive (fb->folder);
+}
+
static void
msgbox_destroyed (GtkWidget *widget, gpointer data)
{
@@ -349,11 +420,11 @@ composer_sent_cb (char *uri, CamelMimeMessage *message, gboolean sent, void *dat
if (sent) {
if (send->psd) {
camel_folder_set_message_flags (send->psd->folder, send->psd->uid,
- send->psd->flags, send->psd->set);
+ send->psd->flags, send->psd->flags);
}
gtk_widget_destroy (GTK_WIDGET (send->composer));
} else {
- e_msg_composer_set_enable_autosave(send->composer, TRUE);
+ e_msg_composer_set_enable_autosave (send->composer, TRUE);
gtk_widget_show (GTK_WIDGET (send->composer));
gtk_object_unref (GTK_OBJECT (send->composer));
}
@@ -373,28 +444,53 @@ composer_get_message (EMsgComposer *composer)
const CamelInternetAddress *iaddr;
const MailConfigAccount *account;
CamelMimeMessage *message;
- EDestination **recipients;
const char *subject;
int num_addrs, i;
+ EDestination **recipients;
message = e_msg_composer_get_message (composer);
if (message == NULL)
return NULL;
- /* Add info about the sending account */
- account = e_msg_composer_get_preferred_account (composer);
+ recipients = e_msg_composer_get_recipients (composer);
- if (account) {
- camel_medium_set_header (CAMEL_MEDIUM (message), "X-Evolution-Account", account->name);
- camel_medium_set_header (CAMEL_MEDIUM (message), "X-Evolution-Transport", account->transport->url);
- camel_medium_set_header (CAMEL_MEDIUM (message), "X-Evolution-Fcc", account->sent_folder_uri);
- if (account->id->organization)
- camel_medium_set_header (CAMEL_MEDIUM (message), "Organization", account->id->organization);
+ /* Check for invalid recipients */
+ if (recipients) {
+ gboolean have_invalid = FALSE;
+ gchar *msg, *new_msg;
+ GtkWidget *message_box;
+
+ for (i = 0; recipients[i] && !have_invalid; ++i) {
+ if (!e_destination_is_valid (recipients[i]))
+ have_invalid = TRUE;
+ }
+
+ if (have_invalid) {
+ msg = g_strdup (_("This message contains invalid recipients:"));
+ for (i = 0; recipients[i]; ++i) {
+ if (!e_destination_is_valid (recipients[i])) {
+ new_msg = g_strdup_printf ("%s\n %s", msg,
+ e_destination_get_address (recipients[i]));
+ g_free (msg);
+ msg = new_msg;
+ }
+ }
+
+ new_msg = e_utf8_from_locale_string (msg);
+ g_free (msg);
+ msg = new_msg;
+
+ message_box = gnome_message_box_new (msg, GNOME_MESSAGE_BOX_WARNING, GNOME_STOCK_BUTTON_OK, NULL);
+ g_free (msg);
+
+ gnome_dialog_run_and_close (GNOME_DIALOG (message_box));
+
+ camel_object_unref (CAMEL_OBJECT (message));
+ message = NULL;
+ goto finished;
+ }
}
- /* get the message recipients */
- recipients = e_msg_composer_get_recipients (composer);
-
/* Check for recipients */
for (num_addrs = 0, i = 0; i < 3; i++) {
iaddr = camel_mime_message_get_recipients (message, recipient_type[i]);
@@ -428,7 +524,7 @@ composer_get_message (EMsgComposer *composer)
so that it can present the user with a dialog whose text has been
modified to reflect this situation. */
- const char *to_header = camel_medium_get_header (CAMEL_MEDIUM (message), CAMEL_RECIPIENT_TYPE_TO);
+ const gchar *to_header = camel_medium_get_header (CAMEL_MEDIUM (message), CAMEL_RECIPIENT_TYPE_TO);
gboolean hidden_list_case = FALSE;
if (to_header && !strcmp (to_header, "Undisclosed-Recipient:;"))
@@ -449,12 +545,12 @@ composer_get_message (EMsgComposer *composer)
&& mail_config_get_confirm_unwanted_html ()) {
gboolean html_problem = FALSE;
for (i = 0; recipients[i] != NULL && !html_problem; ++i) {
- if (!e_destination_get_html_mail_pref (recipients[i]))
+ if (! e_destination_get_html_mail_pref (recipients[i]))
html_problem = TRUE;
}
if (html_problem) {
- html_problem = !ask_confirm_for_unwanted_html_mail (composer, recipients);
+ html_problem = ! ask_confirm_for_unwanted_html_mail (composer, recipients);
if (html_problem) {
camel_object_unref (CAMEL_OBJECT (message));
message = NULL;
@@ -473,13 +569,20 @@ composer_get_message (EMsgComposer *composer)
}
}
+ /* Add info about the sending account */
+ account = e_msg_composer_get_preferred_account (composer);
+ if (account) {
+ camel_medium_set_header (CAMEL_MEDIUM (message), "X-Evolution-Account", account->name);
+ camel_medium_set_header (CAMEL_MEDIUM (message), "X-Evolution-Transport", account->transport->url);
+ camel_medium_set_header (CAMEL_MEDIUM (message), "X-Evolution-Fcc", account->sent_folder_uri);
+ }
+
/* Get the message recipients and 'touch' them, boosting their use scores */
+ recipients = e_msg_composer_get_recipients (composer);
e_destination_touchv (recipients);
finished:
-
e_destination_freev (recipients);
-
return message;
}
@@ -536,7 +639,6 @@ composer_postpone_cb (EMsgComposer *composer, gpointer data)
message = composer_get_message (composer);
if (message == NULL)
return;
-
info = camel_message_info_new ();
info->flags = CAMEL_MESSAGE_SEEN;
@@ -544,124 +646,27 @@ composer_postpone_cb (EMsgComposer *composer, gpointer data)
camel_object_unref (CAMEL_OBJECT (message));
if (psd)
- camel_folder_set_message_flags (psd->folder, psd->uid, psd->flags, psd->set);
+ camel_folder_set_message_flags (psd->folder, psd->uid, psd->flags, psd->flags);
gtk_widget_destroy (GTK_WIDGET (composer));
}
-struct _save_draft_info {
- EMsgComposer *composer;
- int quit;
-};
-
-static void
-save_draft_done (CamelFolder *folder, CamelMimeMessage *msg, CamelMessageInfo *info, int ok, void *data)
-{
- struct _save_draft_info *sdi = data;
-
- if (ok && sdi->quit)
- gtk_widget_destroy (GTK_WIDGET (sdi->composer));
- else
- gtk_object_unref (GTK_OBJECT (sdi->composer));
-
- g_free (info);
- g_free (sdi);
-}
-
-static void
-use_default_drafts_cb (int reply, gpointer data)
-{
- extern CamelFolder *drafts_folder;
- CamelFolder **folder = data;
-
- if (reply == 0) {
- *folder = drafts_folder;
- camel_object_ref (CAMEL_OBJECT (*folder));
- }
-}
-
-static void
-save_draft_folder (char *uri, CamelFolder *folder, gpointer data)
-{
- CamelFolder **save = data;
-
- if (folder) {
- *save = folder;
- camel_object_ref (CAMEL_OBJECT (folder));
- }
-}
-
-void
-composer_save_draft_cb (EMsgComposer *composer, int quit, gpointer data)
-{
- extern char *default_drafts_folder_uri;
- extern CamelFolder *drafts_folder;
- CamelMimeMessage *msg;
- CamelMessageInfo *info;
- 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 &&
- strcmp (account->drafts_folder_uri, default_drafts_folder_uri) != 0) {
- int id;
-
- id = mail_get_folder (account->drafts_folder_uri, 0, save_draft_folder, &folder, mail_thread_new);
- mail_msg_wait (id);
-
- if (!folder) {
- GtkWidget *dialog;
-
- 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 (CAMEL_OBJECT (folder));
- }
-
- msg = e_msg_composer_get_message_draft (composer);
-
- info = g_new0 (CamelMessageInfo, 1);
- info->flags = CAMEL_MESSAGE_DRAFT | CAMEL_MESSAGE_SEEN;
-
- sdi = g_malloc (sizeof (struct _save_draft_info));
- sdi->composer = composer;
- gtk_object_ref (GTK_OBJECT (composer));
- sdi->quit = quit;
-
- mail_append_mail (folder, msg, info, save_draft_done, sdi);
- camel_object_unref (CAMEL_OBJECT (folder));
- camel_object_unref (CAMEL_OBJECT (msg));
-}
-
static GtkWidget *
-create_msg_composer (const MailConfigAccount *account, const char *url)
+create_msg_composer (const char *url)
{
- EMsgComposer *composer;
+ const MailConfigAccount *account;
gboolean send_html;
+ EMsgComposer *composer;
- /* 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) {
- account = mail_config_get_default_account ();
- }
-
+ account = mail_config_get_default_account ();
send_html = mail_config_get_send_html ();
-
+
composer = url ? e_msg_composer_new_from_url (url) : e_msg_composer_new ();
if (composer) {
e_msg_composer_hdrs_set_from_account (E_MSG_COMPOSER_HDRS (composer->hdrs), account->name);
e_msg_composer_set_send_html (composer, send_html);
- e_msg_composer_unset_changed (composer);
- e_msg_composer_drop_editor_undo (composer);
+ e_msg_composer_show_sig_file (composer);
return GTK_WIDGET (composer);
} else
return NULL;
@@ -670,17 +675,13 @@ create_msg_composer (const MailConfigAccount *account, const char *url)
void
compose_msg (GtkWidget *widget, gpointer user_data)
{
- const MailConfigAccount *account;
FolderBrowser *fb = FOLDER_BROWSER (user_data);
GtkWidget *composer;
if (FOLDER_BROWSER_IS_DESTROYED (fb) || !check_send_configuration (fb))
return;
- /* Figure out which account we want to initially compose from */
- account = mail_config_get_account_by_source_url (fb->uri);
-
- composer = create_msg_composer (account, NULL);
+ composer = create_msg_composer (NULL);
if (!composer)
return;
@@ -688,8 +689,6 @@ compose_msg (GtkWidget *widget, gpointer user_data)
GTK_SIGNAL_FUNC (composer_send_cb), NULL);
gtk_signal_connect (GTK_OBJECT (composer), "postpone",
GTK_SIGNAL_FUNC (composer_postpone_cb), NULL);
- gtk_signal_connect (GTK_OBJECT (composer), "save-draft",
- GTK_SIGNAL_FUNC (composer_save_draft_cb), NULL);
gtk_widget_show (composer);
}
@@ -705,8 +704,7 @@ send_to_url (const char *url)
if (!check_send_configuration (NULL))
return;
- /* Tell create_msg_composer to use the default email profile */
- composer = create_msg_composer (NULL, url);
+ composer = create_msg_composer (url);
if (!composer)
return;
@@ -714,118 +712,102 @@ send_to_url (const char *url)
GTK_SIGNAL_FUNC (composer_send_cb), NULL);
gtk_signal_connect (GTK_OBJECT (composer), "postpone",
GTK_SIGNAL_FUNC (composer_postpone_cb), NULL);
- gtk_signal_connect (GTK_OBJECT (composer), "save-draft",
- GTK_SIGNAL_FUNC (composer_save_draft_cb), NULL);
-
+
gtk_widget_show (composer);
}
static GList *
list_add_addresses (GList *list, const CamelInternetAddress *cia, const GSList *accounts,
- GHashTable *rcpt_hash, const MailConfigAccount **me)
+ GHashTable *rcpt_hash, const MailConfigAccount **me,
+ const char *ignore_addr)
{
- const MailConfigAccount *account;
- GHashTable *account_hash;
const char *name, *addr;
const GSList *l;
+ gboolean notme;
int i;
- account_hash = g_hash_table_new (g_strcase_hash, g_strcase_equal);
- l = accounts;
- while (l) {
- account = l->data;
- g_hash_table_insert (account_hash, (char *) account->id->address, (void *) account);
- l = l->next;
- }
-
for (i = 0; camel_internet_address_get (cia, i, &name, &addr); i++) {
- /* Here I'll check to see if the cc:'d address is the address
- of the sender, and if so, don't add it to the cc: list; this
- is to fix Bugzilla bug #455. */
- account = g_hash_table_lookup (account_hash, addr);
- if (account && me && !*me)
- *me = account;
-
- if (!account && !g_hash_table_lookup (rcpt_hash, addr)) {
- EDestination *dest;
+ /* Make sure we don't want to ignore this address */
+ if (!ignore_addr || g_strcasecmp (ignore_addr, addr)) {
- dest = e_destination_new ();
- e_destination_set_name (dest, name);
- e_destination_set_email (dest, addr);
+ /* Here I'll check to see if the cc:'d address is the address
+ of the sender, and if so, don't add it to the cc: list; this
+ is to fix Bugzilla bug #455. */
+ notme = TRUE;
+ l = accounts;
+ while (l) {
+ const MailConfigAccount *acnt = l->data;
+
+ if (!g_strcasecmp (acnt->id->address, addr)) {
+ notme = FALSE;
+ if (me && !*me)
+ *me = acnt;
+ break;
+ }
+
+ l = l->next;
+ }
- list = g_list_append (list, dest);
- g_hash_table_insert (rcpt_hash, (char *) addr, GINT_TO_POINTER (1));
- }
+ if (notme && !g_hash_table_lookup (rcpt_hash, addr)) {
+ EDestination *dest;
+
+ dest = e_destination_new ();
+ e_destination_set_name (dest, name);
+ e_destination_set_email (dest, addr);
+
+ list = g_list_append (list, dest);
+ g_hash_table_insert (rcpt_hash, (char *) addr, GINT_TO_POINTER (1));
+ }
+ }
}
- g_hash_table_destroy (account_hash);
-
return list;
}
static const MailConfigAccount *
guess_me (const CamelInternetAddress *to, const CamelInternetAddress *cc, const GSList *accounts)
{
- const MailConfigAccount *account;
- GHashTable *account_hash;
- const char *addr;
+ const char *name, *addr;
const GSList *l;
+ gboolean notme;
+ char *full;
int i;
- /* "optimization" */
- if (!to && !cc)
- return NULL;
-
- account_hash = g_hash_table_new (g_strcase_hash, g_strcase_equal);
- l = accounts;
- while (l) {
- account = l->data;
- g_hash_table_insert (account_hash, (char *) account->id->address, (void *) account);
- l = l->next;
- }
-
if (to) {
- for (i = 0; camel_internet_address_get (to, i, NULL, &addr); i++) {
- account = g_hash_table_lookup (account_hash, addr);
- if (account)
- goto found;
+ for (i = 0; camel_internet_address_get (to, i, &name, &addr); i++) {
+ full = camel_internet_address_format_address (name, addr);
+ l = accounts;
+ while (l) {
+ const MailConfigAccount *acnt = l->data;
+
+ if (!g_strcasecmp (acnt->id->address, addr)) {
+ notme = FALSE;
+ return acnt;
+ }
+
+ l = l->next;
+ }
}
}
if (cc) {
- for (i = 0; camel_internet_address_get (cc, i, NULL, &addr); i++) {
- account = g_hash_table_lookup (account_hash, addr);
- if (account)
- goto found;
+ for (i = 0; camel_internet_address_get (cc, i, &name, &addr); i++) {
+ full = camel_internet_address_format_address (name, addr);
+ l = accounts;
+ while (l) {
+ const MailConfigAccount *acnt = l->data;
+
+ if (!g_strcasecmp (acnt->id->address, addr)) {
+ notme = FALSE;
+ return acnt;
+ }
+
+ l = l->next;
+ }
}
}
- account = NULL;
-
- found:
-
- g_hash_table_destroy (account_hash);
-
- return account;
-}
-
-inline static void
-mail_ignore (EMsgComposer *composer, const gchar *name, const gchar *address)
-{
- e_msg_composer_ignore (composer, name && *name ? name : address);
-}
-
-static void
-mail_ignore_address (EMsgComposer *composer, const CamelInternetAddress *addr)
-{
- const gchar *name, *address;
- gint i, max;
-
- max = camel_address_length (CAMEL_ADDRESS (addr));
- for (i = 0; i < max; i++) {
- camel_internet_address_get (addr, i, &name, &address);
- mail_ignore (composer, name, address);
- }
+ return NULL;
}
static EMsgComposer *
@@ -834,7 +816,7 @@ 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, *reply_addr = NULL;
- char *text = NULL, *subject, date_str[100], *format;
+ char *text, *subject, date_str[100], *format;
const MailConfigAccount *me = NULL;
const GSList *accounts = NULL;
GList *to = NULL, *cc = NULL;
@@ -843,24 +825,37 @@ mail_generate_reply (CamelFolder *folder, CamelMimeMessage *message, const char
time_t date;
const int max_subject_length = 1024;
- composer = e_msg_composer_new ();
+ composer = e_msg_composer_new ();
+ e_msg_composer_add_message_attachments (composer, message, TRUE);
+
if (!composer)
return NULL;
- e_msg_composer_add_message_attachments (composer, message, TRUE);
+ sender = camel_mime_message_get_from (message);
+ if (sender != NULL && camel_address_length (CAMEL_ADDRESS (sender)) > 0) {
+ camel_internet_address_get (sender, 0, &name, &address);
+ } else {
+ name = _("an unknown sender");
+ }
+
+ date = camel_mime_message_get_date (message, NULL);
+
+ 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);
+ g_free (format);
+
+ if (text) {
+ e_msg_composer_set_body_text (composer, text);
+ g_free (text);
+ }
/* Set the recipients */
accounts = mail_config_get_accounts ();
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);
- mail_ignore_address (composer, cc_addrs);
-
- /* default 'me' to the source account... */
- source = camel_mime_message_get_source (message);
- if (source)
- me = mail_config_get_account_by_source_url (source);
if (mode == REPLY_LIST) {
CamelMessageInfo *info;
@@ -903,21 +898,18 @@ mail_generate_reply (CamelFolder *folder, CamelMimeMessage *message, const char
}
}
- if (!me)
- me = guess_me (to_addrs, cc_addrs, accounts);
+ me = guess_me (to_addrs, cc_addrs, accounts);
} else {
GHashTable *rcpt_hash;
- rcpt_hash = g_hash_table_new (g_strcase_hash, g_strcase_equal);
+ rcpt_hash = g_hash_table_new (g_str_hash, g_str_equal);
reply_to = camel_mime_message_get_reply_to (message);
if (!reply_to)
reply_to = camel_mime_message_get_from (message);
if (reply_to) {
- int i;
-
- for (i = 0; camel_internet_address_get (reply_to, i, &name, &reply_addr); i++) {
- /* Get the Reply-To address so we can ignore references to it in the Cc: list */
+ /* Get the Reply-To address so we can ignore references to it in the Cc: list */
+ if (camel_internet_address_get (reply_to, 0, &name, &reply_addr)) {
EDestination *dest;
dest = e_destination_new ();
@@ -925,41 +917,24 @@ mail_generate_reply (CamelFolder *folder, CamelMimeMessage *message, const char
e_destination_set_email (dest, reply_addr);
to = g_list_append (to, dest);
g_hash_table_insert (rcpt_hash, (char *) reply_addr, GINT_TO_POINTER (1));
- mail_ignore (composer, name, reply_addr);
}
}
if (mode == REPLY_ALL) {
- cc = list_add_addresses (cc, to_addrs, accounts, rcpt_hash, me ? NULL : &me);
- cc = list_add_addresses (cc, cc_addrs, accounts, rcpt_hash, me ? NULL : &me);
+ cc = list_add_addresses (cc, to_addrs, accounts, rcpt_hash, &me, NULL);
+ cc = list_add_addresses (cc, cc_addrs, accounts, rcpt_hash, me ? NULL : &me, reply_addr);
} else {
- if (!me)
- me = guess_me (to_addrs, cc_addrs, accounts);
+ me = guess_me (to_addrs, cc_addrs, accounts);
}
g_hash_table_destroy (rcpt_hash);
}
- /* set body text here as we want all ignored words to take effect */
- if ((mode & REPLY_NO_QUOTE) == 0) {
- sender = camel_mime_message_get_from (message);
- if (sender != NULL && camel_address_length (CAMEL_ADDRESS (sender)) > 0) {
- camel_internet_address_get (sender, 0, &name, &address);
- } else {
- name = _("an unknown sender");
- }
-
- date = camel_mime_message_get_date (message, NULL);
- 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);
- }
+ if (me == NULL) {
+ /* as a last resort, set the replying account (aka me)
+ to the account this was fetched from */
+ source = camel_mime_message_get_source (message);
+ me = mail_config_get_account_by_source_url (source);
}
/* Set the subject of the new message. */
@@ -1019,8 +994,6 @@ mail_generate_reply (CamelFolder *folder, CamelMimeMessage *message, const char
e_msg_composer_add_header (composer, "References", references);
}
- e_msg_composer_drop_editor_undo (composer);
-
return composer;
}
@@ -1052,7 +1025,6 @@ mail_reply (CamelFolder *folder, CamelMimeMessage *msg, const char *uid, int mod
camel_object_ref (CAMEL_OBJECT (psd->folder));
psd->uid = g_strdup (uid);
psd->flags = CAMEL_MESSAGE_ANSWERED;
- psd->set = CAMEL_MESSAGE_ANSWERED;
composer = mail_generate_reply (folder, msg, uid, mode);
if (!composer)
@@ -1062,8 +1034,6 @@ mail_reply (CamelFolder *folder, CamelMimeMessage *msg, const char *uid, int mod
GTK_SIGNAL_FUNC (composer_send_cb), psd);
gtk_signal_connect (GTK_OBJECT (composer), "postpone",
GTK_SIGNAL_FUNC (composer_postpone_cb), psd);
- gtk_signal_connect (GTK_OBJECT (composer), "save-draft",
- GTK_SIGNAL_FUNC (composer_save_draft_cb), NULL);
gtk_signal_connect (GTK_OBJECT (composer), "destroy",
GTK_SIGNAL_FUNC (free_psd), psd);
@@ -1155,8 +1125,6 @@ forward_get_composer (CamelMimeMessage *message, const char *subject)
GTK_SIGNAL_FUNC (composer_send_cb), NULL);
gtk_signal_connect (GTK_OBJECT (composer), "postpone",
GTK_SIGNAL_FUNC (composer_postpone_cb), NULL);
- gtk_signal_connect (GTK_OBJECT (composer), "save-draft",
- GTK_SIGNAL_FUNC (composer_save_draft_cb), NULL);
e_msg_composer_set_headers (composer, account->name, NULL, NULL, NULL, subject);
} else {
g_warning ("Could not create composer");
@@ -1183,6 +1151,7 @@ do_forward_non_attached (CamelFolder *folder, char *uid, CamelMimeMessage *messa
CamelDataWrapper *wrapper;
e_msg_composer_set_body_text (composer, text);
+ e_msg_composer_show_sig_file (composer);
wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (message));
if (CAMEL_IS_MULTIPART (wrapper))
@@ -1190,7 +1159,6 @@ do_forward_non_attached (CamelFolder *folder, char *uid, CamelMimeMessage *messa
gtk_widget_show (GTK_WIDGET (composer));
e_msg_composer_unset_changed (composer);
- e_msg_composer_drop_editor_undo (composer);
}
g_free (text);
}
@@ -1201,27 +1169,21 @@ do_forward_non_attached (CamelFolder *folder, char *uid, CamelMimeMessage *messa
static void
forward_message (FolderBrowser *fb, MailConfigForwardStyle style)
{
- GPtrArray *uids;
- int i;
-
if (FOLDER_BROWSER_IS_DESTROYED (fb))
return;
if (!check_send_configuration (fb))
return;
- uids = g_ptr_array_new ();
- message_list_foreach (fb->message_list, enumerate_msg, uids);
-
- for (i = 0; i < uids->len; i++) {
- mail_get_message (fb->folder, uids->pdata[i],
- do_forward_non_attached,
- GINT_TO_POINTER (style),
+ if (fb->mail_display && fb->mail_display->current_message) {
+ do_forward_non_attached (fb->folder, NULL,
+ fb->mail_display->current_message,
+ GINT_TO_POINTER (style));
+ } else {
+ mail_get_message (fb->folder, fb->message_list->cursor_uid,
+ do_forward_non_attached, GINT_TO_POINTER (style),
mail_thread_new);
- g_free (uids->pdata[i]);
}
-
- g_ptr_array_free (uids, TRUE);
}
void
@@ -1247,7 +1209,6 @@ do_forward_attach (CamelFolder *folder, GPtrArray *messages, CamelMimePart *part
e_msg_composer_attach (composer, part);
gtk_widget_show (GTK_WIDGET (composer));
e_msg_composer_unset_changed (composer);
- e_msg_composer_drop_editor_undo (composer);
}
}
}
@@ -1278,90 +1239,6 @@ forward (GtkWidget *widget, gpointer user_data)
forward_message (user_data, style);
}
-static EMsgComposer *
-redirect_get_composer (CamelMimeMessage *message)
-{
- const MailConfigAccount *account = NULL;
- const CamelInternetAddress *to_addrs, *cc_addrs;
- const GSList *accounts = NULL;
- EMsgComposer *composer;
-
- g_return_val_if_fail (message != NULL, NULL);
-
- accounts = mail_config_get_accounts ();
- to_addrs = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_TO);
- cc_addrs = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_CC);
-
- account = guess_me (to_addrs, cc_addrs, accounts);
-
- if (!account) {
- const char *source;
-
- source = camel_mime_message_get_source (message);
- account = mail_config_get_account_by_source_url (source);
- }
-
- if (!account)
- account = mail_config_get_default_account ();
-
- composer = e_msg_composer_new_redirect (message, account->name);
- if (composer) {
- gtk_signal_connect (GTK_OBJECT (composer), "send",
- GTK_SIGNAL_FUNC (composer_send_cb), NULL);
- gtk_signal_connect (GTK_OBJECT (composer), "postpone",
- GTK_SIGNAL_FUNC (composer_postpone_cb), NULL);
- gtk_signal_connect (GTK_OBJECT (composer), "save-draft",
- GTK_SIGNAL_FUNC (composer_save_draft_cb), NULL);
- } else {
- g_warning ("Could not create composer");
- }
-
- return composer;
-}
-
-static void
-do_redirect (CamelFolder *folder, char *uid, CamelMimeMessage *message, void *data)
-{
- EMsgComposer *composer;
-
- if (!message)
- return;
-
- composer = redirect_get_composer (message);
- if (composer) {
- CamelDataWrapper *wrapper;
-
- wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (message));
- if (CAMEL_IS_MULTIPART (wrapper))
- e_msg_composer_add_message_attachments (composer, message, FALSE);
-
- gtk_widget_show (GTK_WIDGET (composer));
- e_msg_composer_unset_changed (composer);
- e_msg_composer_drop_editor_undo (composer);
- }
-}
-
-void
-redirect (GtkWidget *widget, gpointer user_data)
-{
- FolderBrowser *fb = (FolderBrowser *) user_data;
-
- if (FOLDER_BROWSER_IS_DESTROYED (fb))
- return;
-
- if (!check_send_configuration (fb))
- return;
-
- if (fb->mail_display && fb->mail_display->current_message) {
- do_redirect (fb->folder, NULL,
- fb->mail_display->current_message,
- NULL);
- } else {
- mail_get_message (fb->folder, fb->message_list->cursor_uid,
- do_redirect, NULL, mail_thread_new);
- }
-}
-
static void
transfer_msg_done (gboolean ok, void *data)
{
@@ -1376,10 +1253,10 @@ transfer_msg_done (gboolean ok, void *data)
are hidden, select the previous */
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,
+ message_list_select (fb->message_list, row, MESSAGE_LIST_SELECT_PREVIOUS,
0, CAMEL_MESSAGE_DELETED, FALSE);
else
- message_list_select (fb->message_list, MESSAGE_LIST_SELECT_NEXT,
+ message_list_select (fb->message_list, row, MESSAGE_LIST_SELECT_NEXT,
0, 0, FALSE);
}
@@ -1576,13 +1453,9 @@ select_all (BonoboUIComponent *uih, void *user_data, const char *path)
if (FOLDER_BROWSER_IS_DESTROYED (fb))
return;
- if (GTK_WIDGET_HAS_FOCUS (fb->mail_display->html)) {
- gtk_html_select_all (fb->mail_display->html);
- } else {
- etsm = e_tree_get_selection_model (fb->message_list->tree);
-
- e_selection_model_select_all (etsm);
- }
+ etsm = e_tree_get_selection_model (fb->message_list->tree);
+
+ e_selection_model_select_all (etsm);
}
/* Thread selection */
@@ -1607,7 +1480,7 @@ thread_select_foreach (ETreePath path, gpointer user_data)
thread_select_info_t *tsi = (thread_select_info_t *) user_data;
ETreeModel *tm = tsi->ml->model;
ETreePath node;
-
+
/* @path part of the initial selection. If it has children,
* we select them as well. If it doesn't, we select its siblings and
* their children (ie, the current node must be inside the thread
@@ -1666,11 +1539,9 @@ invert_selection (BonoboUIComponent *uih, void *user_data, const char *path)
if (FOLDER_BROWSER_IS_DESTROYED (fb))
return;
- if (GTK_WIDGET_HAS_FOCUS (fb->message_list)) {
- etsm = e_tree_get_selection_model (fb->message_list->tree);
-
- e_selection_model_invert_selection (etsm);
- }
+ etsm = e_tree_get_selection_model (fb->message_list->tree);
+
+ e_selection_model_invert_selection (etsm);
}
/* flag all selected messages. Return number flagged */
@@ -1793,170 +1664,6 @@ toggle_as_important (BonoboUIComponent *uih, void *user_data, const char *path)
toggle_flags (FOLDER_BROWSER (user_data), CAMEL_MESSAGE_FLAGGED);
}
-
-struct _tag_editor_data {
- MessageTagEditor *editor;
- FolderBrowser *fb;
- GPtrArray *uids;
-};
-
-static void
-tag_editor_ok (GtkWidget *button, gpointer user_data)
-{
- struct _tag_editor_data *data = user_data;
- const char *name, *value;
- int i;
-
- if (FOLDER_BROWSER_IS_DESTROYED (data->fb))
- goto done;
-
- name = message_tag_editor_get_name (data->editor);
- if (!name)
- goto done;
-
- value = message_tag_editor_get_value (data->editor);
-
- camel_folder_freeze (data->fb->folder);
- for (i = 0; i < data->uids->len; i++) {
- camel_folder_set_message_user_tag (data->fb->folder, data->uids->pdata[i], name, value);
- }
- camel_folder_thaw (data->fb->folder);
-
- done:
- gtk_widget_destroy (GTK_WIDGET (data->editor));
-}
-
-static void
-tag_editor_cancel (GtkWidget *button, gpointer user_data)
-{
- struct _tag_editor_data *data = user_data;
-
- gtk_widget_destroy (GTK_WIDGET (data->editor));
-}
-
-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);
-}
-
-void
-flag_for_followup (BonoboUIComponent *uih, void *user_data, const char *path)
-{
- FolderBrowser *fb = FOLDER_BROWSER (user_data);
- struct _tag_editor_data *data;
- GtkWidget *editor;
- 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);
-
- editor = (GtkWidget *) message_tag_followup_new ();
-
- data = g_new (struct _tag_editor_data, 1);
- data->editor = MESSAGE_TAG_EDITOR (editor);
- gtk_widget_ref (GTK_WIDGET (fb));
- data->fb = fb;
- data->uids = uids;
-
- for (i = 0; i < uids->len; i++) {
- CamelMessageInfo *info;
-
- info = camel_folder_get_message_info (fb->folder, uids->pdata[i]);
- message_tag_followup_append_message (MESSAGE_TAG_FOLLOWUP (editor),
- camel_message_info_from (info),
- camel_message_info_subject (info));
- }
-
- 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) {
- const char *tag_value;
-
- tag_value = camel_folder_get_message_user_tag (fb->folder, uids->pdata[0], "follow-up");
- if (tag_value)
- message_tag_editor_set_value (MESSAGE_TAG_EDITOR (editor), tag_value);
- }
-
- gtk_signal_connect (GTK_OBJECT (editor), "destroy",
- tag_editor_destroy, data);
-
- gtk_widget_show (editor);
-}
-
-void
-flag_followup_completed (BonoboUIComponent *uih, void *user_data, const char *path)
-{
- FolderBrowser *fb = FOLDER_BROWSER (user_data);
- GPtrArray *uids;
- time_t now;
- int i;
-
- if (FOLDER_BROWSER_IS_DESTROYED (fb))
- return;
-
- uids = g_ptr_array_new ();
- message_list_foreach (fb->message_list, enumerate_msg, uids);
-
- now = time (NULL);
-
- camel_folder_freeze (fb->folder);
- for (i = 0; i < uids->len; i++) {
- struct _FollowUpTag *tag;
- const char *tag_value;
- char *value;
-
- tag_value = camel_folder_get_message_user_tag (fb->folder, uids->pdata[i], "follow-up");
- if (!tag_value)
- continue;
-
- tag = message_tag_followup_decode (tag_value);
- tag->completed = now;
-
- value = message_tag_followup_encode (tag);
- g_free (tag);
-
- camel_folder_set_message_user_tag (fb->folder, uids->pdata[i], "follow-up", value);
- g_free (value);
- }
- camel_folder_thaw (fb->folder);
-
- g_ptr_array_free (uids, TRUE);
-}
-
-void
-flag_followup_clear (BonoboUIComponent *uih, void *user_data, const char *path)
-{
- FolderBrowser *fb = FOLDER_BROWSER (user_data);
- 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);
-
- camel_folder_freeze (fb->folder);
- for (i = 0; i < uids->len; i++) {
- camel_folder_set_message_user_tag (fb->folder, uids->pdata[i], "follow-up", NULL);
- }
- camel_folder_thaw (fb->folder);
-
- g_ptr_array_free (uids, TRUE);
-}
-
void
zoom_in (BonoboUIComponent *uih, void *user_data, const char *path)
{
@@ -2001,7 +1708,10 @@ do_edit_messages (CamelFolder *folder, GPtrArray *uids, GPtrArray *messages, voi
for (i = 0; i < messages->len; i++) {
EMsgComposer *composer;
+ XEvolution *hdrs;
+ hdrs = mail_tool_remove_xevolution_headers (messages->pdata[i]);
+ mail_tool_destroy_xevolution (hdrs);
camel_medium_remove_header (CAMEL_MEDIUM (messages->pdata[i]), "X-Mailer");
composer = e_msg_composer_new_with_message (messages->pdata[i]);
@@ -2012,11 +1722,6 @@ do_edit_messages (CamelFolder *folder, GPtrArray *uids, GPtrArray *messages, voi
gtk_signal_connect (GTK_OBJECT (composer), "postpone",
composer_postpone_cb, NULL);
- /* FIXME: we want to pass data to this callback so
- we can remove the old draft when they save again */
- gtk_signal_connect (GTK_OBJECT (composer), "save-draft",
- composer_save_draft_cb, NULL);
-
gtk_widget_show (GTK_WIDGET (composer));
}
}
@@ -2275,12 +1980,6 @@ save_msg (GtkWidget *widget, gpointer user_data)
}
void
-colour_msg (GtkWidget *widget, gpointer user_data)
-{
- /* FIXME: implement me? */
-}
-
-void
delete_msg (GtkWidget *button, gpointer user_data)
{
FolderBrowser *fb = FOLDER_BROWSER (user_data);
@@ -2301,10 +2000,10 @@ delete_msg (GtkWidget *button, gpointer user_data)
are hidden, select the previous */
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,
+ message_list_select (fb->message_list, row, MESSAGE_LIST_SELECT_PREVIOUS,
0, CAMEL_MESSAGE_DELETED, FALSE);
else
- message_list_select (fb->message_list, MESSAGE_LIST_SELECT_NEXT,
+ message_list_select (fb->message_list, row, MESSAGE_LIST_SELECT_NEXT,
0, 0, FALSE);
}
}
@@ -2315,208 +2014,58 @@ undelete_msg (GtkWidget *button, gpointer user_data)
flag_messages (FOLDER_BROWSER (user_data), CAMEL_MESSAGE_DELETED, 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);
-}
-
void
next_msg (GtkWidget *button, gpointer user_data)
{
FolderBrowser *fb = FOLDER_BROWSER (user_data);
+ int row;
if (FOLDER_BROWSER_IS_DESTROYED (fb))
return;
- message_list_select (fb->message_list, MESSAGE_LIST_SELECT_NEXT, 0, 0, FALSE);
+ row = e_tree_row_of_node (fb->message_list->tree, e_tree_get_cursor (fb->message_list->tree));
+ message_list_select (fb->message_list, row, MESSAGE_LIST_SELECT_NEXT, 0, 0, FALSE);
}
void
next_unread_msg (GtkWidget *button, gpointer user_data)
{
FolderBrowser *fb = FOLDER_BROWSER (user_data);
+ int row;
if (FOLDER_BROWSER_IS_DESTROYED (fb))
return;
- if (!message_list_select (fb->message_list, MESSAGE_LIST_SELECT_NEXT, 0, CAMEL_MESSAGE_SEEN, TRUE)) {
- if (confirm_goto_next_folder (fb))
- do_evil_kludgy_goto_next_folder_hack (fb);
- }
+ row = e_tree_row_of_node (fb->message_list->tree, e_tree_get_cursor (fb->message_list->tree));
+ message_list_select (fb->message_list, row, MESSAGE_LIST_SELECT_NEXT,
+ 0, CAMEL_MESSAGE_SEEN, TRUE);
}
void
next_flagged_msg (GtkWidget *button, gpointer user_data)
{
FolderBrowser *fb = FOLDER_BROWSER (user_data);
+ int row;
if (FOLDER_BROWSER_IS_DESTROYED (fb))
return;
- message_list_select (fb->message_list, MESSAGE_LIST_SELECT_NEXT,
+ row = e_tree_row_of_node (fb->message_list->tree, e_tree_get_cursor (fb->message_list->tree));
+ message_list_select (fb->message_list, row, MESSAGE_LIST_SELECT_NEXT,
CAMEL_MESSAGE_FLAGGED, CAMEL_MESSAGE_FLAGGED, FALSE);
}
void
-next_thread (GtkWidget *button, gpointer user_data)
-{
- FolderBrowser *fb = FOLDER_BROWSER (user_data);
-
- if (FOLDER_BROWSER_IS_DESTROYED (fb))
- return;
-
- message_list_select_next_thread (fb->message_list);
-}
-
-void
previous_msg (GtkWidget *button, gpointer user_data)
{
FolderBrowser *fb = FOLDER_BROWSER (user_data);
+ int row;
if (FOLDER_BROWSER_IS_DESTROYED (fb))
return;
- message_list_select (fb->message_list, MESSAGE_LIST_SELECT_PREVIOUS,
+ row = e_tree_row_of_node (fb->message_list->tree, e_tree_get_cursor (fb->message_list->tree));
+ message_list_select (fb->message_list, row, MESSAGE_LIST_SELECT_PREVIOUS,
0, 0, FALSE);
}
@@ -2524,11 +2073,13 @@ void
previous_unread_msg (GtkWidget *button, gpointer user_data)
{
FolderBrowser *fb = FOLDER_BROWSER (user_data);
+ int row;
if (FOLDER_BROWSER_IS_DESTROYED (fb))
return;
- message_list_select (fb->message_list, MESSAGE_LIST_SELECT_PREVIOUS,
+ row = e_tree_row_of_node (fb->message_list->tree, e_tree_get_cursor (fb->message_list->tree));
+ message_list_select (fb->message_list, row, MESSAGE_LIST_SELECT_PREVIOUS,
0, CAMEL_MESSAGE_SEEN, TRUE);
}
@@ -2536,24 +2087,34 @@ void
previous_flagged_msg (GtkWidget *button, gpointer user_data)
{
FolderBrowser *fb = FOLDER_BROWSER (user_data);
+ int row;
if (FOLDER_BROWSER_IS_DESTROYED (fb))
return;
- message_list_select (fb->message_list, MESSAGE_LIST_SELECT_PREVIOUS,
+ row = e_tree_row_of_node (fb->message_list->tree, e_tree_get_cursor (fb->message_list->tree));
+ message_list_select (fb->message_list, row, MESSAGE_LIST_SELECT_PREVIOUS,
CAMEL_MESSAGE_FLAGGED, CAMEL_MESSAGE_FLAGGED, TRUE);
}
+struct _expunged_folder_data {
+ FolderBrowser *fb;
+ gboolean hidedeleted;
+};
+
static void
expunged_folder (CamelFolder *f, void *data)
{
- FolderBrowser *fb = data;
+ FolderBrowser *fb = ((struct _expunged_folder_data *) data)->fb;
+ gboolean hidedeleted = ((struct _expunged_folder_data *) data)->hidedeleted;
if (FOLDER_BROWSER_IS_DESTROYED (fb))
return;
fb->expunging = NULL;
- gtk_widget_set_sensitive (GTK_WIDGET (fb->message_list), TRUE);
+ message_list_set_hidedeleted (fb->message_list, hidedeleted);
+
+ g_free (data);
}
static gboolean
@@ -2606,10 +2167,15 @@ expunge_folder (BonoboUIComponent *uih, void *user_data, const char *path)
return;
if (fb->folder && (fb->expunging == NULL || fb->folder != fb->expunging) && confirm_expunge (fb)) {
+ struct _expunged_folder_data *data;
CamelMessageInfo *info;
+ data = g_malloc (sizeof (*data));
+ data->fb = fb;
+ data->hidedeleted = fb->message_list->hidedeleted;
+
/* hide the deleted messages so user can't click on them while we expunge */
- gtk_widget_set_sensitive (GTK_WIDGET (fb->message_list), FALSE);
+ message_list_set_hidedeleted (fb->message_list, TRUE);
/* Only blank the mail display if the message being
viewed is one of those to be expunged */
@@ -2621,7 +2187,7 @@ expunge_folder (BonoboUIComponent *uih, void *user_data, const char *path)
}
fb->expunging = fb->folder;
- mail_expunge_folder (fb->folder, expunged_folder, fb);
+ mail_expunge_folder (fb->folder, expunged_folder, data);
}
}
@@ -2741,83 +2307,21 @@ providers_config (BonoboUIComponent *uih, void *user_data, const char *path)
}
}
-/* static void
-header_print_cb (GtkHTML *html, GnomePrintContext *print_context,
- double x, double y, double width, double height, gpointer user_data)
-{
- printf ("header_print_cb %f,%f x %f,%f\n", x, y, width, height);
-
- gnome_print_newpath (print_context);
- gnome_print_setlinewidth (print_context, 12.0);
- gnome_print_setrgbcolor (print_context, 1.0, 0.0, 0.0);
- gnome_print_moveto (print_context, x, y);
- gnome_print_lineto (print_context, x+width, y-height);
- gnome_print_strokepath (print_context);
-} */
-
-struct footer_info {
- GnomeFont *local_font;
- gint page_num, pages;
-};
-
-static void
-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) {
- 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_newpath (print_context);
- gnome_print_setrgbcolor (print_context, .0, .0, .0);
- gnome_print_moveto (print_context, x + width - tw, y - gnome_font_get_ascender (info->local_font));
- gnome_print_setfont (print_context, info->local_font);
- gnome_print_show (print_context, text);
-
- g_free (text);
- info->page_num++;
- }
-}
-
-static void
-footer_info_free (struct footer_info *info)
-{
- if (info->local_font)
- gnome_font_unref (info->local_font);
- g_free (info);
-}
-
-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_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;
-}
-
+/*
+ * FIXME: This routine could be made generic, by having a closure
+ * function plus data, and having the whole process be taken care
+ * of for you
+ */
static void
do_mail_print (FolderBrowser *fb, gboolean preview)
{
- GtkHTML *html;
GnomePrintContext *print_context;
GnomePrintMaster *print_master;
GnomePrintDialog *dialog;
GnomePrinter *printer = NULL;
- gdouble line = 0.0;
int copies = 1;
int collate = FALSE;
- struct footer_info *info;
-
+
if (!preview) {
dialog = GNOME_PRINT_DIALOG (gnome_print_dialog_new (_("Print Message"),
GNOME_PRINT_DIALOG_COPIES));
@@ -2849,24 +2353,8 @@ do_mail_print (FolderBrowser *fb, gboolean preview)
gnome_print_master_set_paper (print_master, gnome_paper_with_name (_("US-Letter")));
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);
-
- /* Set our 'printing' flag to true and render. This causes us
- to ignoring any adjustments we made to accomodate the
- user's theme. */
- fb->mail_display->printing = TRUE;
-
- mail_display_render (fb->mail_display, html, TRUE);
- gtk_html_print_set_master (html, print_master);
-
- info = footer_info_new (html, print_context, &line);
- gtk_html_print_with_header_footer (html, print_context, 0.0, line, NULL, footer_print_cb, info);
- footer_info_free (info);
-
- fb->mail_display->printing = FALSE;
-
+ gtk_html_print_set_master (fb->mail_display->html, print_master);
+ gtk_html_print (fb->mail_display->html, print_context);
gnome_print_master_close (print_master);
if (preview){
@@ -2884,73 +2372,9 @@ do_mail_print (FolderBrowser *fb, gboolean preview)
_("Printing of message failed"));
}
}
-
- /* FIXME: We are leaking the GtkHTML object */
-}
-
-/* This is pretty evil. FolderBrowser's API should be extended to allow these sorts of
- things to be done in a more natural way. */
-
-/* <evil_code> */
-
-struct blarg_this_sucks {
- FolderBrowser *fb;
- gboolean preview;
-};
-
-static void
-done_message_selected (CamelFolder *folder, char *uid, CamelMimeMessage *msg, void *data)
-{
- struct blarg_this_sucks *blarg = data;
- FolderBrowser *fb = blarg->fb;
- gboolean preview = blarg->preview;
-
- g_free (blarg);
-
- mail_display_set_message (fb->mail_display, (CamelMedium *)msg);
-
- g_free (fb->loaded_uid);
- fb->loaded_uid = fb->loading_uid;
- fb->loading_uid = NULL;
-
- do_mail_print (fb, preview);
+ gtk_object_unref (GTK_OBJECT (print_master));
}
-/* Ack! Most of this is copied from folder-browser.c */
-static void
-do_mail_fetch_and_print (FolderBrowser *fb, gboolean preview)
-{
- if (! fb->preview_shown) {
- /* If the preview pane is closed, we have to do some
- extra magic to load the message. */
- struct blarg_this_sucks *blarg = g_new (struct blarg_this_sucks, 1);
-
- blarg->fb = fb;
- blarg->preview = preview;
-
- fb->loading_id = 0;
-
- /* if we are loading, then set a pending, but leave the loading, coudl cancel here (?) */
- if (fb->loading_uid) {
- g_free (fb->pending_uid);
- fb->pending_uid = g_strdup (fb->new_uid);
- } else {
- if (fb->new_uid) {
- fb->loading_uid = g_strdup (fb->new_uid);
- mail_get_message (fb->folder, fb->loading_uid, done_message_selected, blarg, mail_thread_new);
- } else {
- mail_display_set_message (fb->mail_display, NULL);
- g_free (blarg);
- }
- }
-
- } else {
- do_mail_print (fb, preview);
- }
-}
-
-/* </evil_code> */
-
void
print_msg (GtkWidget *button, gpointer user_data)
{
@@ -2959,7 +2383,7 @@ print_msg (GtkWidget *button, gpointer user_data)
if (FOLDER_BROWSER_IS_DESTROYED (fb))
return;
- do_mail_fetch_and_print (fb, FALSE);
+ do_mail_print (fb, FALSE);
}
void
@@ -2970,7 +2394,7 @@ print_preview_msg (GtkWidget *button, gpointer user_data)
if (FOLDER_BROWSER_IS_DESTROYED (fb))
return;
- do_mail_fetch_and_print (fb, TRUE);
+ do_mail_print (fb, TRUE);
}
/******************** Begin Subscription Dialog ***************************/
@@ -3018,63 +2442,6 @@ configure_folder (BonoboUIComponent *uih, void *user_data, const char *path)
}
static void
-do_view_digest (CamelFolder *folder, char *uid, CamelMimeMessage *message, void *data)
-{
- FolderBrowser *folder_browser = FOLDER_BROWSER (data);
-
- if (FOLDER_BROWSER_IS_DESTROYED (folder_browser))
- return;
-
- if (message) {
- CamelFolder *digest;
- CamelStore *store;
- FolderBrowser *fb;
- GtkWidget *window;
-
- store = camel_digest_store_new ("digest:/");
-
- digest = camel_digest_folder_new (store, message);
- camel_object_unref (CAMEL_OBJECT (store));
- if (!digest)
- return;
-
- camel_folder_set_message_flags (folder, uid, CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN);
-
- fb = (FolderBrowser *) folder_browser_new (folder_browser->shell, NULL);
- folder_browser_set_message_preview (fb, TRUE);
- folder_browser_set_folder (fb, digest, "digest:/");
- camel_object_unref (CAMEL_OBJECT (digest));
- gtk_widget_show (GTK_WIDGET (fb));
-
- window = folder_browser_window_new (fb);
- gtk_widget_show (window);
- }
-}
-
-void
-view_digest (GtkWidget *widget, gpointer user_data)
-{
- FolderBrowser *fb = FOLDER_BROWSER (user_data);
- 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);
-
- if (uids->len > 10 && !are_you_sure (_("Are you sure you want to open all %d messages in separate windows?"), uids, fb))
- return;
-
- for (i = 0; i < uids->len; i++) {
- mail_get_message (fb->folder, uids->pdata [i], do_view_digest, fb, mail_thread_queued);
- g_free (uids->pdata [i]);
- }
- g_ptr_array_free (uids, TRUE);
-}
-
-static void
do_view_message (CamelFolder *folder, char *uid, CamelMimeMessage *message, void *data)
{
FolderBrowser *fb = FOLDER_BROWSER (data);
@@ -3106,7 +2473,7 @@ view_msg (GtkWidget *widget, gpointer user_data)
if (uids->len > 10 && !are_you_sure (_("Are you sure you want to open all %d messages in separate windows?"), uids, fb))
return;
-
+
for (i = 0; i < uids->len; i++) {
mail_get_message (fb->folder, uids->pdata [i], do_view_message, fb, mail_thread_queued);
g_free (uids->pdata [i]);