aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog6
-rw-r--r--mail/mail-callbacks.c101
-rw-r--r--mail/mail-callbacks.h1
3 files changed, 107 insertions, 1 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index 46fc4f8027..f1b5cb329c 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,5 +1,11 @@
2001-12-14 Jeffrey Stedfast <fejj@ximian.com>
+ * mail-callbacks.c (compose_msg): Connect to the save-draft signal.
+ (send_to_url): Here too.
+ (mail_reply): And here...
+ (forward_get_composer): Same.
+ (do_edit_messages): And finally here.
+
* mail-format.c (try_inline_pgp):
(try_inline_pgp_sig): Start reiplementing The Right Way and not
danw's fucking half-assed kludge that doesn't work.
diff --git a/mail/mail-callbacks.c b/mail/mail-callbacks.c
index 637c01c17f..3f1baa452f 100644
--- a/mail/mail-callbacks.c
+++ b/mail/mail-callbacks.c
@@ -651,6 +651,92 @@ composer_postpone_cb (EMsgComposer *composer, gpointer data)
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;
+}
+
+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;
+
+ 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 (msg));
+}
+
static GtkWidget *
create_msg_composer (const char *url)
{
@@ -689,6 +775,8 @@ 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);
}
@@ -712,7 +800,9 @@ 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);
}
@@ -1035,6 +1125,8 @@ 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);
@@ -1126,6 +1218,8 @@ 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");
@@ -1741,6 +1835,11 @@ 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));
}
}
diff --git a/mail/mail-callbacks.h b/mail/mail-callbacks.h
index 5859411727..9a82884640 100644
--- a/mail/mail-callbacks.h
+++ b/mail/mail-callbacks.h
@@ -119,6 +119,7 @@ void mail_reply (CamelFolder *folder, CamelMimeMessage *msg, const ch
void composer_send_cb (EMsgComposer *composer, gpointer data);
void composer_postpone_cb (EMsgComposer *composer, gpointer data);
+void composer_save_draft_cb (EMsgComposer *composer, int quit, gpointer data);
void forward_messages (CamelFolder *folder, GPtrArray *uids, gboolean inline);