evolution r35282 - in branches/mbarnes-composer: composer mail



Author: mbarnes
Date: Sat Mar 29 05:22:40 2008
New Revision: 35282
URL: http://svn.gnome.org/viewvc/evolution?rev=35282&view=rev

Log:
More bugfixing and code cleanup.
Trim fat off the EMsgComposer API.


Removed:
   branches/mbarnes-composer/composer/e-msg-composer-select-file.c
   branches/mbarnes-composer/composer/e-msg-composer-select-file.h
Modified:
   branches/mbarnes-composer/composer/Makefile.am
   branches/mbarnes-composer/composer/e-composer-actions.c
   branches/mbarnes-composer/composer/e-composer-autosave.c
   branches/mbarnes-composer/composer/e-composer-private.h
   branches/mbarnes-composer/composer/e-msg-composer.c
   branches/mbarnes-composer/composer/e-msg-composer.h
   branches/mbarnes-composer/mail/em-composer-prefs.c
   branches/mbarnes-composer/mail/em-composer-utils.c

Modified: branches/mbarnes-composer/composer/Makefile.am
==============================================================================
--- branches/mbarnes-composer/composer/Makefile.am	(original)
+++ branches/mbarnes-composer/composer/Makefile.am	Sat Mar 29 05:22:40 2008
@@ -46,8 +46,6 @@
 	e-composer-private.h			\
 	e-composer-text-header.c		\
 	e-composer-text-header.h		\
-	e-msg-composer-select-file.c		\
-	e-msg-composer-select-file.h		\
 	e-msg-composer.c			\
 	e-msg-composer.h			\
 	gconf-bridge.c				\

Modified: branches/mbarnes-composer/composer/e-composer-actions.c
==============================================================================
--- branches/mbarnes-composer/composer/e-composer-actions.c	(original)
+++ branches/mbarnes-composer/composer/e-composer-actions.c	Sat Mar 29 05:22:40 2008
@@ -69,8 +69,6 @@
 		camel_url_free (url);
 	}
 
-	e_msg_composer_show_attachments_ui (composer);
-
 	g_slist_foreach (uris, (GFunc) g_free, NULL);
 	g_slist_free (uris);
 
@@ -82,11 +80,14 @@
 action_close_cb (GtkAction *action,
                  EMsgComposer *composer)
 {
+	GtkhtmlEditor *editor;
 	EComposerHeaderTable *table;
 	const gchar *subject;
 	gint response;
 
-	if (!e_msg_composer_is_dirty (composer) &&
+	editor = GTKHTML_EDITOR (composer);
+
+	if (!gtkhtml_editor_get_changed (editor) &&
 		!e_composer_autosave_get_saved (composer)) {
 
 		gtk_widget_destroy (GTK_WIDGET (composer));
@@ -124,14 +125,20 @@
 action_pgp_encrypt_cb (GtkToggleAction *action,
                        EMsgComposer *composer)
 {
-	e_msg_composer_set_changed (composer);
+	GtkhtmlEditor *editor;
+
+	editor = GTKHTML_EDITOR (composer);
+	gtkhtml_editor_set_changed (editor, TRUE);
 }
 
 static void
 action_pgp_sign_cb (GtkToggleAction *action,
                     EMsgComposer *composer)
 {
-	e_msg_composer_set_changed (composer);
+	GtkhtmlEditor *editor;
+
+	editor = GTKHTML_EDITOR (composer);
+	gtkhtml_editor_set_changed (editor, TRUE);
 }
 
 static void
@@ -173,6 +180,7 @@
 	GtkhtmlEditor *editor = GTKHTML_EDITOR (composer);
 	const gchar *filename;
 	gint fd;
+	GError *error = NULL;
 
 	filename = gtkhtml_editor_get_filename (editor);
 	if (filename == NULL) {
@@ -204,6 +212,15 @@
 	} else
 		close (fd);
 
+	if (!gtkhtml_editor_save (editor, filename, TRUE, &error)) {
+		e_error_run (
+			GTK_WINDOW (composer),
+			E_ERROR_NO_SAVE_FILE,
+			filename, error->message);
+		g_error_free (error);
+		return;
+	}
+
 	gtkhtml_editor_run_command (GTKHTML_EDITOR (composer), "saved");
 	e_composer_autosave_set_saved (composer, FALSE);
 }
@@ -213,6 +230,7 @@
                    EMsgComposer *composer)
 {
 	GtkWidget *dialog;
+	gchar *filename;
 	gint response;
 
 	dialog = gtk_file_chooser_dialog_new (
@@ -232,9 +250,16 @@
 	response = gtkhtml_editor_file_chooser_dialog_run (
 		GTKHTML_EDITOR (composer), dialog);
 
-	if (response == GTK_RESPONSE_OK)
-		gtk_action_activate (ACTION (SAVE));
+	if (response != GTK_RESPONSE_OK)
+		goto exit;
+
+	filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+	gtkhtml_editor_set_filename (GTKHTML_EDITOR (composer), filename);
+	g_free (filename);
+
+	gtk_action_activate (ACTION (SAVE));
 
+exit:
 	gtk_widget_destroy (dialog);
 }
 
@@ -278,14 +303,20 @@
 action_smime_encrypt_cb (GtkToggleAction *action,
                          EMsgComposer *composer)
 {
-	e_msg_composer_set_changed (composer);
+	GtkhtmlEditor *editor;
+
+	editor = GTKHTML_EDITOR (composer);
+	gtkhtml_editor_set_changed (editor, TRUE);
 }
 
 static void
 action_smime_sign_cb (GtkToggleAction *action,
                       EMsgComposer *composer)
 {
-	e_msg_composer_set_changed (composer);
+	GtkhtmlEditor *editor;
+
+	editor = GTKHTML_EDITOR (composer);
+	gtkhtml_editor_set_changed (editor, TRUE);
 }
 
 static void

Modified: branches/mbarnes-composer/composer/e-composer-autosave.c
==============================================================================
--- branches/mbarnes-composer/composer/e-composer-autosave.c	(original)
+++ branches/mbarnes-composer/composer/e-composer-autosave.c	Sat Mar 29 05:22:40 2008
@@ -233,6 +233,7 @@
 gboolean
 e_composer_autosave_snapshot (EMsgComposer *composer)
 {
+	GtkhtmlEditor *editor;
 	CamelMimeMessage *message;
 	AutosaveState *state;
 	CamelStream *stream;
@@ -241,8 +242,10 @@
 
 	g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
 
+	editor = GTKHTML_EDITOR (composer);
+
 	/* If the contents are unchanged, exit early. */
-	if (!e_msg_composer_is_dirty (composer))
+	if (!gtkhtml_editor_get_changed (editor))
 		return TRUE;
 
 	state = g_object_get_data (G_OBJECT (composer), "autosave");
@@ -302,8 +305,7 @@
 	}
 
 	/* Snapshot was successful; set various flags. */
-	e_msg_composer_set_saved (composer);
-	e_msg_composer_unset_changed (composer);
+	gtkhtml_editor_set_changed (editor, FALSE);
 	e_composer_autosave_set_saved (composer, TRUE);
 
 	camel_object_unref (message);

Modified: branches/mbarnes-composer/composer/e-composer-private.h
==============================================================================
--- branches/mbarnes-composer/composer/e-composer-private.h	(original)
+++ branches/mbarnes-composer/composer/e-composer-private.h	Sat Mar 29 05:22:40 2008
@@ -35,7 +35,6 @@
 	GtkWidget *header_table;
 	GtkActionGroup *action_group;
 
-	gint visible_mask;
 	GPtrArray *extra_hdr_names, *extra_hdr_values;
 	GArray *gconf_bridge_binding_ids;
 
@@ -57,9 +56,7 @@
 	gchar *mime_type, *mime_body, *charset;
 
 	guint32 attachment_bar_visible : 1;
-	guint32 send_html              : 1;
 	guint32 is_alternative         : 1;
-	guint32 has_changed            : 1;
 	guint32 autosaved              : 1;
 
 	guint32 mode_post              : 1;

Modified: branches/mbarnes-composer/composer/e-msg-composer.c
==============================================================================
--- branches/mbarnes-composer/composer/e-msg-composer.c	(original)
+++ branches/mbarnes-composer/composer/e-msg-composer.c	Sat Mar 29 05:22:40 2008
@@ -109,7 +109,6 @@
 #include "e-composer-autosave.h"
 #include "e-composer-private.h"
 #include "e-composer-header-table.h"
-#include "e-msg-composer-select-file.h"
 
 #include "evolution-shell-component-utils.h"
 #include <e-util/e-icon-factory.h>
@@ -232,8 +231,6 @@
 	{ "text/calendar",  NULL, GDK_ACTION_COPY }
 };
 
-static const gchar *emc_draft_format_names[] = { "pgp-sign", "pgp-encrypt", "smime-sign", "smime-encrypt" };
-
 static gpointer parent_class;
 static guint signals[LAST_SIGNAL];
 
@@ -256,8 +253,6 @@
 static void handle_multipart_encrypted (EMsgComposer *composer, CamelMimePart *multipart, gint depth);
 static void handle_multipart_signed (EMsgComposer *composer, CamelMultipart *multipart, gint depth);
 
-static void set_editor_signature (EMsgComposer *composer);
-
 static EDestination**
 destination_list_to_vector_sized (GList *list, gint n)
 {
@@ -604,7 +599,9 @@
 }
 
 static CamelMimeMessage *
-build_message (EMsgComposer *composer, gboolean save_html_object_data)
+build_message (EMsgComposer *composer,
+               gboolean html_content,
+               gboolean save_html_object_data)
 {
 	GtkhtmlEditor *editor;
 	EMsgComposerPrivate *p = composer->priv;
@@ -725,7 +722,7 @@
 	camel_data_wrapper_set_mime_type_field (plain, type);
 	camel_content_type_unref (type);
 
-	if (p->send_html) {
+	if (html_content) {
 		gchar *text;
 		gsize length;
 
@@ -1029,8 +1026,9 @@
 	}
 
 	/* Attach whether this message was written in HTML */
-	camel_medium_set_header (CAMEL_MEDIUM (new), "X-Evolution-Format",
-				 p->send_html ? "text/html" : "text/plain");
+	camel_medium_set_header (
+		CAMEL_MEDIUM (new), "X-Evolution-Format",
+		html_content ? "text/html" : "text/plain");
 
 	return new;
 
@@ -1057,7 +1055,6 @@
 	return NULL;
 }
 
-
 static gchar *
 get_file_content (EMsgComposer *composer,
                   const gchar *filename,
@@ -1392,21 +1389,6 @@
 
 /* Commands.  */
 
-static void
-show_attachments (EMsgComposer *composer,
-		  gboolean show)
-{
-	EMsgComposerPrivate *p = composer->priv;
-
-	gtk_expander_set_expanded (GTK_EXPANDER (p->attachment_expander), show);
-	if (show)
-		gtk_label_set_text_with_mnemonic (GTK_LABEL (composer->priv->attachment_expander_label),
-		_("Hide _Attachment Bar"));
-	else
-		gtk_label_set_text_with_mnemonic (GTK_LABEL (composer->priv->attachment_expander_label),
-		_("Show _Attachment Bar"));
-}
-
 static EMsgComposer *
 autosave_load_draft (const gchar *filename)
 {
@@ -1492,53 +1474,65 @@
 
 static void
 attachment_bar_changed_cb (EAttachmentBar *bar,
-			   gpointer data)
+                           EMsgComposer *composer)
 {
-	EMsgComposer *composer = E_MSG_COMPOSER (data);
-	EMsgComposerPrivate *p = composer->priv;
+	GtkhtmlEditor *editor;
+	GtkWidget *widget;
+	guint attachment_num;
+
+	editor = GTKHTML_EDITOR (composer);
+	attachment_num = e_attachment_bar_get_num_attachments (bar);
+
+	if (attachment_num > 0) {
+		gchar *markup;
 
-	guint attachment_num = e_attachment_bar_get_num_attachments (
-		E_ATTACHMENT_BAR (p->attachment_bar));
-	if (attachment_num) {
-		gchar *num_text = g_strdup_printf (
-			ngettext ("<b>%d</b> Attachment", "<b>%d</b> Attachments", attachment_num),
-			attachment_num);
-		gtk_label_set_markup (GTK_LABEL (p->attachment_expander_num),
-				      num_text);
-		g_free (num_text);
+		markup = g_strdup_printf (
+			"<b>%d</b> %s", attachment_num, ngettext (
+			"Attachment", "Attachments", attachment_num));
+		widget = composer->priv->attachment_expander_num;
+		gtk_label_set_markup (GTK_LABEL (widget), markup);
+		g_free (markup);
 
-		gtk_widget_show (p->attachment_expander_icon);
-		show_attachments (composer, TRUE);
+		gtk_widget_show (composer->priv->attachment_expander_icon);
+
+		widget = composer->priv->attachment_expander;
+		gtk_expander_set_expanded (GTK_EXPANDER (widget), TRUE);
 	} else {
-		gtk_label_set_text (GTK_LABEL (p->attachment_expander_num), "");
-		gtk_widget_hide (p->attachment_expander_icon);
-		show_attachments (composer, FALSE);
-	}
+		widget = composer->priv->attachment_expander_num;
+		gtk_label_set_text (GTK_LABEL (widget), "");
 
+		gtk_widget_hide (composer->priv->attachment_expander_icon);
+
+		widget = composer->priv->attachment_expander;
+		gtk_expander_set_expanded (GTK_EXPANDER (widget), FALSE);
+	}
 
-	/* Mark the composer as changed so it prompts about unsaved
-	   changes on close */
-	e_msg_composer_set_changed (composer);
+	/* Mark the editor as changed so it prompts about unsaved
+	   changes on close. */
+	gtkhtml_editor_set_changed (editor, TRUE);
 }
 
 static void
-attachment_expander_activate_cb (GtkExpander *expander,
-				 void      *data)
+attachment_expander_notify_cb (GtkExpander *expander,
+                               GParamSpec *pspec,
+                               EMsgComposer *composer)
 {
-	EMsgComposer *composer = E_MSG_COMPOSER (data);
-	gboolean show = gtk_expander_get_expanded (expander);
+	GtkLabel *label;
+	const gchar *text;
+
+	label = GTK_LABEL (composer->priv->attachment_expander_label);
 
 	/* Update the expander label */
-	if (show)
-		gtk_label_set_text_with_mnemonic (GTK_LABEL (composer->priv->attachment_expander_label),
-		_("Hide _Attachment Bar"));
+	if (gtk_expander_get_expanded (expander))
+		text = _("Hide _Attachment Bar");
 	else
-		gtk_label_set_text_with_mnemonic (GTK_LABEL (composer->priv->attachment_expander_label),
-		_("Show _Attachment Bar"));
+		text = _("Show _Attachment Bar");
+
+	gtk_label_set_text_with_mnemonic (label, text);
 }
 
 static void
-subject_changed_cb (EMsgComposer *composer)
+msg_composer_subject_changed_cb (EMsgComposer *composer)
 {
 	EComposerHeaderTable *table;
 	const gchar *subject;
@@ -1558,14 +1552,15 @@
 };
 
 static void
-update_auto_recipients (EComposerHeaderTable *table, int mode, const char *auto_addrs)
+update_auto_recipients (EComposerHeaderTable *table,
+                        gint mode,
+                        const gchar *auto_addrs)
 {
 	EDestination *dest, **destv = NULL;
 	CamelInternetAddress *iaddr;
-	GList *list, *tail, *node;
-	gint i, n = 0;
-
-	tail = list = NULL;
+	GList *list = NULL;
+	guint length;
+	gint i;
 
 	if (auto_addrs) {
 		iaddr = camel_internet_address_new ();
@@ -1585,20 +1580,7 @@
 				if (addr)
 					e_destination_set_email (dest, addr);
 
-				node = g_list_alloc ();
-				node->data = dest;
-				node->next = NULL;
-
-				if (tail) {
-					node->prev = tail;
-					tail->next = node;
-				} else {
-					node->prev = NULL;
-					list = node;
-				}
-
-				tail = node;
-				n++;
+				list = g_list_prepend (list, dest);
 			}
 		}
 
@@ -1619,27 +1601,19 @@
 	if (destv) {
 		for (i = 0; destv[i]; i++) {
 			if (!e_destination_is_auto_recipient (destv[i])) {
-				node = g_list_alloc ();
-				node->data = e_destination_copy (destv[i]);
-				node->next = NULL;
-
-				if (tail) {
-					node->prev = tail;
-					tail->next = node;
-				} else {
-					node->prev = NULL;
-					list = node;
-				}
-
-				tail = node;
-				n++;
+				dest = e_destination_copy (destv[i]);
+				list = g_list_prepend (list, dest);
 			}
 		}
 
 		e_destination_freev (destv);
 	}
 
-	destv = destination_list_to_vector_sized (list, n);
+	list = g_list_reverse (list);
+
+	length = g_list_length (list);
+	destv = destination_list_to_vector_sized (list, length);
+
 	g_list_free (list);
 
 	switch (mode) {
@@ -1657,64 +1631,80 @@
 }
 
 static void
-account_changed_cb (EMsgComposer *composer)
+msg_composer_account_changed_cb (EMsgComposer *composer)
 {
 	EMsgComposerPrivate *p = composer->priv;
 	EComposerHeaderTable *table;
 	GtkToggleAction *action;
+	ESignature *signature;
 	EAccount *account;
 	gboolean active;
+	const gchar *cc_addrs = NULL;
+	const gchar *bcc_addrs = NULL;
+	const gchar *uid;
 
 	table = e_msg_composer_get_header_table (composer);
 	account = e_composer_header_table_get_account (table);
 
-	if (account) {
-		action = GTK_TOGGLE_ACTION (ACTION (PGP_SIGN));
-		active = account->pgp_always_sign &&
-			(!account->pgp_no_imip_sign || !p->mime_type ||
-			g_ascii_strncasecmp (p->mime_type, "text/calendar", 13) != 0);
-		gtk_toggle_action_set_active (action, active);
-
-		action = GTK_TOGGLE_ACTION (ACTION (SMIME_SIGN));
-		active = account->smime_sign_default;
-		gtk_toggle_action_set_active (action, active);
-
-		action = GTK_TOGGLE_ACTION (ACTION (SMIME_ENCRYPT));
-		active = account->smime_encrypt_default;
-		gtk_toggle_action_set_active (action, active);
+	if (account == NULL)
+		goto exit;
 
-		update_auto_recipients (table, UPDATE_AUTO_CC, account->always_cc ? account->cc_addrs : NULL);
-		update_auto_recipients (table, UPDATE_AUTO_BCC, account->always_bcc ? account->bcc_addrs : NULL);
-	} else {
-		update_auto_recipients (table, UPDATE_AUTO_CC, NULL);
-		update_auto_recipients (table, UPDATE_AUTO_BCC, NULL);
-	}
+	action = GTK_TOGGLE_ACTION (ACTION (PGP_SIGN));
+	active = account->pgp_always_sign &&
+		(!account->pgp_no_imip_sign || p->mime_type == NULL ||
+		g_ascii_strncasecmp (p->mime_type, "text/calendar", 13) != 0);
+	gtk_toggle_action_set_active (action, active);
+
+	action = GTK_TOGGLE_ACTION (ACTION (SMIME_SIGN));
+	active = account->smime_sign_default;
+	gtk_toggle_action_set_active (action, active);
+
+	action = GTK_TOGGLE_ACTION (ACTION (SMIME_ENCRYPT));
+	active = account->smime_encrypt_default;
+	gtk_toggle_action_set_active (action, active);
+
+	if (account->always_cc)
+		cc_addrs = account->cc_addrs;
+	if (account->always_bcc)
+		bcc_addrs = account->bcc_addrs;
+
+	uid = account->id->sig_uid;
+	signature = uid ? mail_config_get_signature_by_uid (uid) : NULL;
+	e_composer_header_table_set_signature (table, signature);
+
+exit:
+	update_auto_recipients (table, UPDATE_AUTO_CC, cc_addrs);
+	update_auto_recipients (table, UPDATE_AUTO_BCC, bcc_addrs);
 
-	set_editor_signature (composer);
 	e_msg_composer_show_sig_file (composer);
 }
 
 static void
-attach_message (EMsgComposer *composer, CamelMimeMessage *msg)
+msg_composer_attach_message (EMsgComposer *composer,
+                             CamelMimeMessage *msg)
 {
 	CamelMimePart *mime_part;
-	const char *subject;
+	GString *description;
+	const gchar *subject;
 	EMsgComposerPrivate *p = composer->priv;
 
 	mime_part = camel_mime_part_new ();
 	camel_mime_part_set_disposition (mime_part, "inline");
 	subject = camel_mime_message_get_subject (msg);
-	if (subject) {
-		char *desc = g_strdup_printf (_("Attached message - %s"), subject);
 
-		camel_mime_part_set_description (mime_part, desc);
-		g_free (desc);
-	} else
-		camel_mime_part_set_description (mime_part, _("Attached message"));
+	description = g_string_new (_("Attached message"));
+	if (subject != NULL)
+		g_string_append_printf (description, " - %s", subject);
+	camel_mime_part_set_description (mime_part, description->str);
+	g_string_free (description, TRUE);
 
-	camel_medium_set_content_object ((CamelMedium *)mime_part, (CamelDataWrapper *)msg);
+	camel_medium_set_content_object (
+		(CamelMedium *) mime_part, (CamelDataWrapper *) msg);
 	camel_mime_part_set_content_type (mime_part, "message/rfc822");
-	e_attachment_bar_attach_mime_part (E_ATTACHMENT_BAR(p->attachment_bar), mime_part);
+
+	e_attachment_bar_attach_mime_part (
+		E_ATTACHMENT_BAR (p->attachment_bar), mime_part);
+
 	camel_object_unref (mime_part);
 }
 
@@ -1737,33 +1727,22 @@
 int
 e_msg_composer_get_remote_download_count (EMsgComposer *composer)
 {
-	EMsgComposerPrivate *p = composer->priv;
-	return e_attachment_bar_get_download_count
-				(E_ATTACHMENT_BAR (p->attachment_bar));
-}
-
-static gchar *
-attachment_guess_mime_type (const char *filename)
-{
-	GnomeVFSFileInfo *info;
-	GnomeVFSResult result;
-	gchar *type = NULL;
+	EAttachmentBar *attachment_bar;
 
-	info = gnome_vfs_file_info_new ();
-	result = gnome_vfs_get_file_info (filename, info,
-					  GNOME_VFS_FILE_INFO_GET_MIME_TYPE |
-					  GNOME_VFS_FILE_INFO_FORCE_SLOW_MIME_TYPE |
-					  GNOME_VFS_FILE_INFO_FOLLOW_LINKS);
-	if (result == GNOME_VFS_OK)
-		type = g_strdup (gnome_vfs_file_info_get_mime_type (info));
+	g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), 0);
 
-	gnome_vfs_file_info_unref (info);
-
-	return type;
+	attachment_bar = E_ATTACHMENT_BAR (composer->priv->attachment_bar);
+	return e_attachment_bar_get_download_count (attachment_bar);
 }
 
 static void
-drop_action (EMsgComposer *composer, GdkDragContext *context, guint32 action, GtkSelectionData *selection, guint info, guint time, gboolean html_dnd)
+drop_action (EMsgComposer *composer,
+             GdkDragContext *context,
+             guint32 action,
+             GtkSelectionData *selection,
+             guint info,
+             guint time,
+             gboolean html_dnd)
 {
 	char *tmp, *str, **urls;
 	CamelMimePart *mime_part;
@@ -1783,7 +1762,7 @@
 
 		msg = camel_mime_message_new ();
 		if (camel_data_wrapper_construct_from_stream ((CamelDataWrapper *)msg, stream) != -1) {
-			attach_message (composer, msg);
+			msg_composer_attach_message (composer, msg);
 			success = TRUE;
 			delete = action == GDK_ACTION_MOVE;
 		}
@@ -1867,7 +1846,7 @@
 					msg = camel_folder_get_message (folder, uids->pdata[0], &ex);
 					if (msg == NULL)
 						goto fail;
-					attach_message (composer, msg);
+					msg_composer_attach_message (composer, msg);
 				} else {
 					CamelMultipart *mp = camel_multipart_new ();
 					char *desc;
@@ -1927,9 +1906,6 @@
 		break;
 	}
 
-	if (e_attachment_bar_get_num_attachments (E_ATTACHMENT_BAR(p->attachment_bar)))
-		show_attachments (composer, TRUE);
-
 	gtk_drag_finish (context, success, delete, time);
 }
 
@@ -1976,73 +1952,6 @@
 }
 
 static void
-drag_data_received (GtkWidget *w, GdkDragContext *context,
-		    int x, int y, GtkSelectionData *selection,
-		    guint info, guint time,
-		    EMsgComposer *composer)
-{
-	if (selection->data == NULL || selection->length == -1)
-		return;
-
-	if (context->action == GDK_ACTION_ASK) {
-		EMPopup *emp;
-		GSList *menus = NULL;
-		GtkMenu *menu;
-		int i;
-		struct _drop_data *m;
-
-		m = g_malloc0(sizeof (*m));
-		m->context = context;
-		g_object_ref (context);
-		m->composer = composer;
-		g_object_ref (composer);
-		m->action = context->action;
-		m->info = info;
-		m->time = time;
-		m->selection = g_malloc0(sizeof (*m->selection));
-		m->selection->data = g_malloc (selection->length);
-		memcpy (m->selection->data, selection->data, selection->length);
-		m->selection->length = selection->length;
-
-		emp = em_popup_new ("org.gnome.evolution.mail.composer.popup.drop");
-		for (i=0;i<sizeof (drop_popup_menu)/sizeof (drop_popup_menu[0]);i++)
-			menus = g_slist_append (menus, &drop_popup_menu[i]);
-
-		e_popup_add_items ((EPopup *)emp, menus, NULL, drop_popup_free, m);
-		menu = e_popup_create_menu_once ((EPopup *)emp, NULL, 0);
-		gtk_menu_popup (menu, NULL, NULL, NULL, NULL, 0, time);
-	} else {
-		drop_action (composer, context, context->action, selection, info, time, w != GTK_WIDGET (composer));
-	}
-}
-
-
-static gboolean
-drag_motion (GObject *o, GdkDragContext *context, gint x, gint y, guint time, EMsgComposer *composer)
-{
-	GList *targets;
-	GdkDragAction action, actions = 0;
-
-	for (targets = context->targets; targets; targets = targets->next) {
-		int i;
-
-		for (i=0;i<sizeof (drag_info)/sizeof (drag_info[0]);i++)
-			if (targets->data == (gpointer)drag_info[i].atom)
-				actions |= drag_info[i].actions;
-	}
-
-	actions &= context->actions;
-	action = context->suggested_action;
-	/* we default to copy */
-	if (action == GDK_ACTION_ASK && (actions & (GDK_ACTION_MOVE|GDK_ACTION_COPY)) != (GDK_ACTION_MOVE|GDK_ACTION_COPY))
-		action = GDK_ACTION_COPY;
-
-	gdk_drag_status (context, action, time);
-
-	return action != 0;
-}
-
-static void
 msg_composer_dispose (GObject *object)
 {
 	EMsgComposer *composer = E_MSG_COMPOSER (object);
@@ -2068,39 +1977,77 @@
 static void
 msg_composer_destroy (GtkObject *object)
 {
-	EMsgComposer *composer = (EMsgComposer *)object;
-	EMsgComposerPrivate *p = composer->priv;
+	EMsgComposer *composer = E_MSG_COMPOSER (object);
+
+	all_composers = g_slist_remove (all_composers, object);
 
 #if 0 /* GTKHTML-EDITOR */
-	if (p->menu) {
-		e_menu_update_target ((EMenu *)p->menu, NULL);
-		g_object_unref (p->menu);
-		p->menu = NULL;
+	if (composer->priv->menu) {
+		e_menu_update_target ((EMenu *)composer->priv->menu, NULL);
+		g_object_unref (composer->priv->menu);
+		composer->priv->menu = NULL;
 	}
 #endif
 
-	/* FIXME?  I assume the Bonobo widget will get destroyed
-	   normally?  */
-	if (p->address_dialog != NULL) {
-		gtk_widget_destroy (p->address_dialog);
-		p->address_dialog = NULL;
+	if (composer->priv->address_dialog != NULL) {
+		gtk_widget_destroy (composer->priv->address_dialog);
+		composer->priv->address_dialog = NULL;
 	}
 
-	if (p->notify_id) {
-		GConfClient *gconf = gconf_client_get_default ();
-		gconf_client_notify_remove (gconf, p->notify_id);
-		p->notify_id = 0;
-		g_object_unref (gconf);
+	if (composer->priv->notify_id) {
+		GConfClient *client;
+
+		client = gconf_client_get_default ();
+		gconf_client_notify_remove (client, composer->priv->notify_id);
+		composer->priv->notify_id = 0;
+		g_object_unref (client);
 	}
 
 	/* Chain up to parent's destroy() method. */
 	GTK_OBJECT_CLASS (parent_class)->destroy (object);
 }
 
+static void
+msg_composer_map (GtkWidget *widget)
+{
+	EComposerHeaderTable *table;
+	GtkWidget *input_widget;
+	const gchar *text;
+
+	/* Chain up to parent's map() method. */
+	GTK_WIDGET_CLASS (parent_class)->map (widget);
+
+	table = e_msg_composer_get_header_table (E_MSG_COMPOSER (widget));
+
+	/* If the 'To' field is empty, focus it. */
+	input_widget =
+		e_composer_header_table_get_header (
+		table, E_COMPOSER_HEADER_TO)->input_widget;
+	text = gtk_entry_get_text (GTK_ENTRY (input_widget));
+	if (text == NULL || *text == '\0') {
+		gtk_widget_grab_focus (input_widget);
+		return;
+	}
+
+	/* If not, check the 'Subject' field. */
+	input_widget =
+		e_composer_header_table_get_header (
+		table, E_COMPOSER_HEADER_SUBJECT)->input_widget;
+	text = gtk_entry_get_text (GTK_ENTRY (input_widget));
+	if (text == NULL || *text == '\0') {
+		gtk_widget_grab_focus (input_widget);
+		return;
+	}
+
+	/* Jump to the editor as a last resort. */
+	gtkhtml_editor_run_command (GTKHTML_EDITOR (widget), "grab-focus");
+}
+
 static gint
 msg_composer_delete_event (GtkWidget *widget,
 	                   GdkEventAny *event)
 {
+	/* This is needed for the ACTION macro. */
 	EMsgComposer *composer = E_MSG_COMPOSER (widget);
 
 	gtk_action_activate (ACTION (CLOSE));
@@ -2108,6 +2055,128 @@
 	return TRUE;
 }
 
+static gboolean
+msg_composer_key_press_event (GtkWidget *widget,
+                              GdkEventKey *event)
+{
+	EMsgComposer *composer = E_MSG_COMPOSER (widget);
+	GtkWidget *input_widget;
+
+	input_widget =
+		e_composer_header_table_get_header (
+		e_msg_composer_get_header_table (composer),
+		E_COMPOSER_HEADER_SUBJECT)->input_widget;
+
+#ifdef HAVE_XFREE
+	if (event->keyval == XF86XK_Send) {
+		g_signal_emit (G_OBJECT (composer), signals[SEND], 0);
+		return TRUE;
+	}
+#endif /* HAVE_XFREE */
+
+	if (event->keyval == GDK_Escape) {
+		gtk_action_activate (ACTION (CLOSE));
+		return TRUE;
+	}
+
+	if (event->keyval == GDK_Tab && gtk_widget_is_focus (input_widget)) {
+		gtkhtml_editor_run_command (
+			GTKHTML_EDITOR (composer), "grab-focus");
+		return TRUE;
+	}
+
+	/* Chain up to parent's key_press_event() method. */
+	return GTK_WIDGET_CLASS (parent_class)->key_press_event (widget, event);
+}
+
+static gboolean
+msg_composer_drag_motion (GtkWidget *widget,
+                          GdkDragContext *context,
+                          gint x,
+                          gint y,
+                          guint time)
+{
+	GList *targets;
+	GdkDragAction actions = 0;
+	GdkDragAction chosen_action;
+
+	targets = context->targets;
+	while (targets != NULL) {
+		gint ii;
+
+		for (ii = 0; ii < G_N_ELEMENTS (drag_info); ii++)
+			if (targets->data == (gpointer) drag_info[ii].atom)
+				actions |= drag_info[ii].actions;
+
+		targets = g_list_next (targets);
+	}
+
+	actions &= context->actions;
+	chosen_action = context->suggested_action;
+
+	/* we default to copy */
+	if (chosen_action == GDK_ACTION_ASK &&
+		(actions & (GDK_ACTION_MOVE|GDK_ACTION_COPY)) !=
+		(GDK_ACTION_MOVE|GDK_ACTION_COPY))
+		chosen_action = GDK_ACTION_COPY;
+
+	gdk_drag_status (context, chosen_action, time);
+
+	return (chosen_action != 0);
+}
+
+static void
+msg_composer_drag_data_received (GtkWidget *widget,
+                                 GdkDragContext *context,
+                                 gint x,
+                                 gint y,
+                                 GtkSelectionData *selection,
+                                 guint info,
+                                 guint time)
+{
+	EMsgComposer *composer;
+
+	/* Widget may be EMsgComposer or GtkHTML. */
+	composer = E_MSG_COMPOSER (gtk_widget_get_toplevel (widget));
+
+	if (selection->data == NULL)
+		return;
+
+	if (selection->length == -1)
+		return;
+
+	if (context->action == GDK_ACTION_ASK) {
+		EMPopup *emp;
+		GSList *menus = NULL;
+		GtkMenu *menu;
+		gint ii;
+		struct _drop_data *m;
+
+		m = g_malloc0(sizeof (*m));
+		m->context = g_object_ref (context);
+		m->composer = g_object_ref (composer);
+		m->action = context->action;
+		m->info = info;
+		m->time = time;
+		m->selection = g_malloc0(sizeof (*m->selection));
+		m->selection->data = g_malloc (selection->length);
+		memcpy (m->selection->data, selection->data, selection->length);
+		m->selection->length = selection->length;
+
+		emp = em_popup_new ("org.gnome.evolution.mail.composer.popup.drop");
+		for (ii = 0; ii < G_N_ELEMENTS (drop_popup_menu); ii++)
+			menus = g_slist_append (menus, &drop_popup_menu[ii]);
+
+		e_popup_add_items ((EPopup *)emp, menus, NULL, drop_popup_free, m);
+		menu = e_popup_create_menu_once ((EPopup *)emp, NULL, 0);
+		gtk_menu_popup (menu, NULL, NULL, NULL, NULL, 0, time);
+	} else {
+		drop_action (
+			composer, context, context->action, selection,
+			info, time, !GTK_WIDGET_TOPLEVEL (widget));
+	}
+}
+
 static void
 msg_composer_cut_clipboard (GtkhtmlEditor *editor)
 {
@@ -2211,7 +2280,11 @@
 	gtk_object_class->destroy = msg_composer_destroy;
 
 	widget_class = GTK_WIDGET_CLASS (class);
+	widget_class->map = msg_composer_map;
 	widget_class->delete_event = msg_composer_delete_event;
+	widget_class->key_press_event = msg_composer_key_press_event;
+	widget_class->drag_motion = msg_composer_drag_motion;
+	widget_class->drag_data_received = msg_composer_drag_data_received;
 
 	editor_class = GTKHTML_EDITOR_CLASS (class);
 	editor_class->cut_clipboard = msg_composer_cut_clipboard;
@@ -2335,119 +2408,6 @@
 }
 
 static void
-e_msg_composer_load_config (EMsgComposer *composer, int visible_mask)
-{
-	/* Override header visibility based on our visible mask.
-	 * XXX Move this into msg_composer_init(). */
-
-	GtkToggleAction *action;
-	gboolean active;
-
-	/* if we're mailing, you cannot disable to so it should appear checked */
-	action = GTK_TOGGLE_ACTION (ACTION (VIEW_TO));
-	active = visible_mask & E_MSG_COMPOSER_VISIBLE_TO;
-	gtk_toggle_action_set_active (action, active);
-
-	/* ditto for post-to */
-	action = GTK_TOGGLE_ACTION (ACTION (VIEW_POST_TO));
-	active = visible_mask & E_MSG_COMPOSER_VISIBLE_POSTTO;
-	gtk_toggle_action_set_active (action, active);
-
-	/* we set these to false initially if we're posting */
-	if (!(visible_mask & E_MSG_COMPOSER_VISIBLE_CC)) {
-		action = GTK_TOGGLE_ACTION (ACTION (VIEW_CC));
-		gtk_toggle_action_set_active (action, FALSE);
-	}
-
-	if (!(visible_mask & E_MSG_COMPOSER_VISIBLE_BCC)) {
-		action = GTK_TOGGLE_ACTION (ACTION (VIEW_BCC));
-		gtk_toggle_action_set_active (action, FALSE);
-	}
-
-	action = GTK_TOGGLE_ACTION (ACTION (VIEW_SUBJECT));
-	gtk_toggle_action_set_active (action, TRUE);
-}
-
-static void
-map_default_cb (EMsgComposer *composer, gpointer user_data)
-{
-	EComposerHeaderTable *table;
-	GtkWidget *widget;
-	const gchar *text;
-
-	table = e_msg_composer_get_header_table (composer);
-
-	/* If the 'To:' field is empty, focus it */
-
-	widget = e_composer_header_table_get_header (
-		table, E_COMPOSER_HEADER_TO)->input_widget;
-	text = gtk_entry_get_text (GTK_ENTRY (widget));
-
-	if (!text || text[0] == '\0') {
-		gtk_widget_grab_focus (widget);
-
-		return;
-	}
-
-	/* If not, check the subject field */
-
-	widget = e_composer_header_table_get_header (
-		table, E_COMPOSER_HEADER_SUBJECT)->input_widget;
-	text = gtk_entry_get_text (GTK_ENTRY (widget));
-
-	if (!text || text[0] == '\0') {
-		gtk_widget_grab_focus (widget);
-		return;
-	}
-
-	/* Jump to the editor as a last resort. */
-	gtkhtml_editor_run_command (GTKHTML_EDITOR (composer), "grab-focus");
-}
-
-static void
-msg_composer_destroy_notify (gpointer data)
-{
-	EMsgComposer *composer = E_MSG_COMPOSER (data);
-
-	all_composers = g_slist_remove (all_composers, composer);
-}
-
-static int
-composer_key_pressed (EMsgComposer *composer,
-                      GdkEventKey *event)
-{
-	GtkWidget *widget;
-	EComposerHeaderTable *table;
-
-	table = e_msg_composer_get_header_table (composer);
-	widget = e_composer_header_table_get_header (
-		table, E_COMPOSER_HEADER_SUBJECT)->input_widget;
-
-#ifdef HAVE_XFREE
-	if (event->keyval == XF86XK_Send) {
-		g_signal_emit (G_OBJECT (composer), signals[SEND], 0);
-		g_signal_stop_emission_by_name (composer, "key-press-event");
-		return TRUE;
-	}
-#endif /* HAVE_XFREE */
-
-	if (event->keyval == GDK_Escape) {
-		gtk_action_activate (ACTION (CLOSE));
-		g_signal_stop_emission_by_name (composer, "key-press-event");
-		return TRUE;
-	}
-
-	if (event->keyval == GDK_Tab && gtk_widget_is_focus (widget)) {
-		gtkhtml_editor_run_command (
-			GTKHTML_EDITOR (composer), "grab-focus");
-		g_signal_stop_emission_by_name (composer, "key-press-event");
-		return TRUE;
-	}
-
-	return FALSE;
-}
-
-static void
 msg_composer_update_preferences (GConfClient *client,
                                  guint cnxn_id,
                                  GConfEntry *entry,
@@ -2594,7 +2554,6 @@
 	return TRUE;
 }
 
-
 static int
 button_press_event (GtkWidget *widget, GdkEventButton *event)
 {
@@ -2629,8 +2588,17 @@
 	return FALSE;
 }
 
+static void
+msg_composer_notify_header_cb (EMsgComposer *composer)
+{
+	GtkhtmlEditor *editor;
+
+	editor = GTKHTML_EDITOR (composer);
+	gtkhtml_editor_set_changed (editor, TRUE);
+}
+
 static EMsgComposer *
-create_composer (int visible_mask)
+create_composer (gint visible_mask)
 {
 	EMsgComposer *composer;
 	EComposerHeaderTable *table;
@@ -2642,25 +2610,18 @@
 	composer = g_object_new (E_TYPE_MSG_COMPOSER, NULL);
 	p = composer->priv;
 
-	g_signal_connect (composer, "key-press-event",
-			  G_CALLBACK (composer_key_pressed),
-			  NULL);
-
-	g_signal_connect (composer, "destroy",
-			  G_CALLBACK (msg_composer_destroy_notify),
-			  NULL);
+	client = gconf_client_get_default ();
 
 	/* DND support */
-	gtk_drag_dest_set (GTK_WIDGET (composer), GTK_DEST_DEFAULT_ALL,  drop_types, G_N_ELEMENTS (drop_types), GDK_ACTION_COPY|GDK_ACTION_ASK|GDK_ACTION_MOVE);
-	g_signal_connect (composer, "drag_data_received", G_CALLBACK (drag_data_received), composer);
-	g_signal_connect (composer, "drag-motion", G_CALLBACK (drag_motion), composer);
-	e_msg_composer_load_config (composer, visible_mask);
+	gtk_drag_dest_set (
+		GTK_WIDGET (composer), GTK_DEST_DEFAULT_ALL,
+		drop_types, G_N_ELEMENTS (drop_types),
+		GDK_ACTION_COPY | GDK_ACTION_ASK | GDK_ACTION_MOVE);
 
 	setup_ui (composer);
 
-	/* Headers */
+	/* Configure Headers */
 
-	p->visible_mask = visible_mask;
 	table = E_COMPOSER_HEADER_TABLE (p->header_table);
 
 	e_composer_header_table_set_account_list (
@@ -2668,107 +2629,111 @@
 	e_composer_header_table_set_signature_list (
 		table, mail_config_get_signatures ());
 
-	/* Configure header visibility / sensitivity */
+	/* If we're mailing, you cannot disable "To". */
+	action = GTK_TOGGLE_ACTION (ACTION (VIEW_TO));
+	active = visible_mask & E_MSG_COMPOSER_VISIBLE_TO;
+	gtk_action_set_sensitive (ACTION (VIEW_TO), active);
+	gtk_toggle_action_set_active (action, active);
+
+	/* Ditto for "Post-To". */
+	action = GTK_TOGGLE_ACTION (ACTION (VIEW_POST_TO));
+	active = visible_mask & E_MSG_COMPOSER_VISIBLE_POSTTO;
+	gtk_action_set_sensitive (ACTION (VIEW_POST_TO), active);
+	gtk_toggle_action_set_active (action, active);
+
+	/* Disable "Cc" if we're posting. */
+	if (!(visible_mask & E_MSG_COMPOSER_VISIBLE_CC)) {
+		action = GTK_TOGGLE_ACTION (ACTION (VIEW_CC));
+		gtk_toggle_action_set_active (action, FALSE);
+	}
+
+	/* Disable "Bcc" if we're posting. */
+	if (!(visible_mask & E_MSG_COMPOSER_VISIBLE_BCC)) {
+		action = GTK_TOGGLE_ACTION (ACTION (VIEW_BCC));
+		gtk_toggle_action_set_active (action, FALSE);
+	}
 
-	gtk_action_set_sensitive (
-		ACTION (VIEW_TO),
-		visible_mask & E_MSG_COMPOSER_VISIBLE_TO);
-	gtk_action_set_sensitive (
-		ACTION (VIEW_POST_TO),
-		visible_mask & E_MSG_COMPOSER_VISIBLE_POSTTO);
+	action = GTK_TOGGLE_ACTION (ACTION (VIEW_SUBJECT));
+	gtk_toggle_action_set_active (action, TRUE);
 
 	g_signal_connect_swapped (
 		table, "notify::account",
-		G_CALLBACK (account_changed_cb), composer);
+		G_CALLBACK (msg_composer_account_changed_cb), composer);
 	g_signal_connect_swapped (
 		table, "notify::destinations-bcc",
-		G_CALLBACK (e_msg_composer_set_changed), composer);
+		G_CALLBACK (msg_composer_notify_header_cb), composer);
 	g_signal_connect_swapped (
 		table, "notify::destinations-cc",
-		G_CALLBACK (e_msg_composer_set_changed), composer);
+		G_CALLBACK (msg_composer_notify_header_cb), composer);
 	g_signal_connect_swapped (
 		table, "notify::destinations-to",
-		G_CALLBACK (e_msg_composer_set_changed), composer);
+		G_CALLBACK (msg_composer_notify_header_cb), composer);
 	g_signal_connect_swapped (
 		table, "notify::reply-to",
-		G_CALLBACK (e_msg_composer_set_changed), composer);
+		G_CALLBACK (msg_composer_notify_header_cb), composer);
 	g_signal_connect_swapped (
 		table, "notify::signature",
 		G_CALLBACK (e_msg_composer_show_sig_file), composer);
 	g_signal_connect_swapped (
 		table, "notify::subject",
-		G_CALLBACK (subject_changed_cb), composer);
+		G_CALLBACK (msg_composer_subject_changed_cb), composer);
 	g_signal_connect_swapped (
 		table, "notify::subject",
-		G_CALLBACK (e_msg_composer_set_changed), composer);
+		G_CALLBACK (msg_composer_notify_header_cb), composer);
 
-	account_changed_cb (composer);
+	msg_composer_account_changed_cb (composer);
 
-	gtkhtml_editor_set_html_mode (GTKHTML_EDITOR (composer), p->send_html);
+	/* Honor User Preferences */
+
+	active = gconf_client_get_bool (
+		client, COMPOSER_GCONF_SEND_HTML_KEY, NULL);
+	gtkhtml_editor_set_html_mode (GTKHTML_EDITOR (composer), active);
 
-	/* Listen for user preference updates. */
-	client = gconf_client_get_default ();
-	msg_composer_update_preferences (client, 0, NULL, composer);
 	action = GTK_TOGGLE_ACTION (ACTION (REQUEST_READ_RECEIPT));
 	active = gconf_client_get_bool (
 		client, COMPOSER_GCONF_REQUEST_RECEIPT_KEY, NULL);
 	gtk_toggle_action_set_active (action, active);
+
+	/* Listen for user preference updates. */
 	gconf_client_add_dir (
 		client, COMPOSER_GCONF_PREFIX,
 		GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
 	p->notify_id = gconf_client_notify_add (
 		client, COMPOSER_GCONF_PREFIX, (GConfClientNotifyFunc)
 		msg_composer_update_preferences, composer, NULL, NULL);
-	g_object_unref (client);
-
-	g_signal_connect (p->attachment_bar, "button_press_event", G_CALLBACK (button_press_event), NULL);
-	g_signal_connect (p->attachment_bar, "key_press_event", G_CALLBACK (key_press_event), NULL);
-	g_signal_connect (p->attachment_bar, "popup-menu", G_CALLBACK (popup_menu_event), NULL);
-
-	g_signal_connect (p->attachment_bar, "changed",
-			  G_CALLBACK (attachment_bar_changed_cb), composer);
-
-	g_signal_connect_after (p->attachment_expander, "activate",
-				G_CALLBACK (attachment_expander_activate_cb), composer);
-
-#if 0 /* GTKHTML-EDITOR */
-	/* The engine would have the GtkHTML widget stored in "html-widget"
-	 * We'll use that to listen for DnD signals
-	 */
-
-	servant = ORBit_small_get_servant (p->eeditor_engine);
-    	if (servant && (impl = bonobo_object (servant)))
-		html_widget = g_object_get_data (G_OBJECT (impl), "html-widget");
+	msg_composer_update_preferences (client, 0, NULL, composer);
 
-	if (html_widget) {
-		g_signal_connect (html_widget, "drag_data_received", G_CALLBACK (drag_data_received), composer);
-	}
-#endif /* GTKHTML-EDITOR */
+	/* Attachment Bar */
 
-	g_signal_connect (composer, "map", (GCallback) map_default_cb, NULL);
+	g_signal_connect (
+		p->attachment_bar, "button_press_event",
+		G_CALLBACK (button_press_event), NULL);
+	g_signal_connect (
+		p->attachment_bar, "key_press_event",
+		G_CALLBACK (key_press_event), NULL);
+	g_signal_connect (
+		p->attachment_bar, "popup-menu",
+		G_CALLBACK (popup_menu_event), NULL);
+	g_signal_connect (
+		p->attachment_bar, "changed",
+		G_CALLBACK (attachment_bar_changed_cb), composer);
+	g_signal_connect_after (
+		p->attachment_expander, "notify::expanded",
+		G_CALLBACK (attachment_expander_notify_cb), composer);
+
+	g_signal_connect (
+		gtkhtml_editor_get_html (GTKHTML_EDITOR (composer)),
+		"drag_data_received",
+		G_CALLBACK (msg_composer_drag_data_received), NULL);
 
 	e_composer_autosave_register (composer);
 
-	p->has_changed = FALSE;
-
-	return composer;
-}
-
-static void
-set_editor_signature (EMsgComposer *composer)
-{
-	EComposerHeaderTable *table;
-	ESignature *signature;
-	EAccount *account;
-	const gchar *uid;
+	/* Initialization may have tripped the "changed" state. */
+	gtkhtml_editor_set_changed (GTKHTML_EDITOR (composer), FALSE);
 
-	table = e_msg_composer_get_header_table (composer);
-	account = e_composer_header_table_get_account (table);
-	g_return_if_fail (account != NULL);
+	g_object_unref (client);
 
-	uid = account->id->sig_uid;
-	signature = uid ? mail_config_get_signature_by_uid (uid) : NULL;
-	e_composer_header_table_set_signature (table, signature);
+	return composer;
 }
 
 /**
@@ -2777,27 +2742,34 @@
  * Create a new message composer widget. The type can be
  * E_MSG_COMPOSER_MAIL, E_MSG_COMPOSER_POST or E_MSG_COMPOSER_MAIL_POST.
  *
- * Return value: A pointer to the newly created widget
+ * Returns: A pointer to the newly created widget
  **/
 
 EMsgComposer *
 e_msg_composer_new_with_type (int type)
 {
 	EMsgComposer *new;
+	gint visible_mask;
 
 	switch (type) {
-	case E_MSG_COMPOSER_MAIL:
-		new = create_composer (E_MSG_COMPOSER_VISIBLE_MASK_MAIL);
-		break;
-	case E_MSG_COMPOSER_POST:
-		new = create_composer (E_MSG_COMPOSER_VISIBLE_MASK_POST);
-		break;
-	default:
-		new = create_composer (E_MSG_COMPOSER_VISIBLE_MASK_MAIL | E_MSG_COMPOSER_VISIBLE_MASK_POST);
+		case E_MSG_COMPOSER_MAIL:
+			visible_mask = E_MSG_COMPOSER_VISIBLE_MASK_MAIL;
+			break;
+
+		case E_MSG_COMPOSER_POST:
+			visible_mask = E_MSG_COMPOSER_VISIBLE_MASK_POST;
+			break;
+
+		default:
+			visible_mask =
+				E_MSG_COMPOSER_VISIBLE_MASK_MAIL |
+				E_MSG_COMPOSER_VISIBLE_MASK_POST;
+			break;
 	}
 
+	new = create_composer (visible_mask);
+
 	if (new) {
-		set_editor_signature (new);
 		set_editor_text (new, "", TRUE);
 	}
 
@@ -2809,7 +2781,7 @@
  *
  * Create a new message composer widget.
  *
- * Return value: A pointer to the newly created widget
+ * Returns: A pointer to the newly created widget
  **/
 EMsgComposer *
 e_msg_composer_new (void)
@@ -2836,36 +2808,42 @@
 }
 
 static void
-e_msg_composer_set_pending_body (EMsgComposer *composer, gchar *text, gssize len)
+e_msg_composer_set_pending_body (EMsgComposer *composer,
+                                 gchar *text,
+                                 gssize length)
 {
-	gchar *old;
+	g_object_set_data_full (
+		G_OBJECT (composer), "body:text",
+		text, (GDestroyNotify) g_free);
 
-	old = g_object_get_data ((GObject *) composer, "body:text");
-	g_free (old);
-	g_object_set_data ((GObject *) composer, "body:text", text);
-	g_object_set_data ((GObject *) composer, "body:len", GSIZE_TO_POINTER (len));
+	g_object_set_data (
+		G_OBJECT (composer), "body:length",
+		GSIZE_TO_POINTER (length));
 }
 
 static void
-e_msg_composer_flush_pending_body (EMsgComposer *composer, gboolean apply)
+e_msg_composer_flush_pending_body (EMsgComposer *composer)
 {
-	gchar *body;
-	gssize len;
+	const gchar *body;
+	gpointer data;
+	gssize length;
 
-	body = g_object_get_data ((GObject *) composer, "body:text");
-	len = GPOINTER_TO_SIZE (g_object_get_data ((GObject *) composer, "body:len"));
-	if (body) {
-		if (apply)
-			set_editor_text (composer, body, FALSE);
+	body = g_object_get_data (G_OBJECT (composer), "body:text");
+	data = g_object_get_data (G_OBJECT (composer), "body:length");
+	length = GPOINTER_TO_SIZE (data);
 
-		g_object_set_data ((GObject *) composer, "body:text", NULL);
-		g_free (body);
-	}
+	if (body != NULL)
+		set_editor_text (composer, body, FALSE);
+
+	g_object_set_data (G_OBJECT (composer), "body:text", NULL);
 }
 
 static void
-add_attachments_handle_mime_part (EMsgComposer *composer, CamelMimePart *mime_part,
-				  gboolean just_inlines, gboolean related, gint depth)
+add_attachments_handle_mime_part (EMsgComposer *composer,
+                                  CamelMimePart *mime_part,
+				  gboolean just_inlines,
+                                  gboolean related,
+                                  gint depth)
 {
 	CamelContentType *content_type;
 	CamelDataWrapper *wrapper;
@@ -2878,51 +2856,59 @@
 
 	if (CAMEL_IS_MULTIPART (wrapper)) {
 		/* another layer of multipartness... */
-		add_attachments_from_multipart (composer, (CamelMultipart *) wrapper, just_inlines, depth + 1);
+		add_attachments_from_multipart (
+			composer, (CamelMultipart *) wrapper,
+			just_inlines, depth + 1);
 	} else if (just_inlines) {
 		if (camel_mime_part_get_content_id (mime_part) ||
 		    camel_mime_part_get_content_location (mime_part))
-			e_msg_composer_add_inline_image_from_mime_part (composer, mime_part);
+			e_msg_composer_add_inline_image_from_mime_part (
+				composer, mime_part);
 	} else if (CAMEL_IS_MIME_MESSAGE (wrapper)) {
 		/* do nothing */
 	} else if (related && camel_content_type_is (content_type, "image", "*")) {
 		e_msg_composer_add_inline_image_from_mime_part (composer, mime_part);
+	} else if (camel_content_type_is (content_type, "text", "*")) {
+		/* do nothing */
 	} else {
-		if (camel_content_type_is (content_type, "text", "*")) {
-			/* do nothing */
-		} else {
-			e_msg_composer_attach (composer, mime_part);
-		}
+		e_msg_composer_attach (composer, mime_part);
 	}
 }
 
 static void
-add_attachments_from_multipart (EMsgComposer *composer, CamelMultipart *multipart,
-				gboolean just_inlines, gint depth)
+add_attachments_from_multipart (EMsgComposer *composer,
+                                CamelMultipart *multipart,
+				gboolean just_inlines,
+                                gint depth)
 {
 	/* find appropriate message attachments to add to the composer */
 	CamelMimePart *mime_part;
 	gboolean related;
 	gint i, nparts;
 
-	related = camel_content_type_is (CAMEL_DATA_WRAPPER (multipart)->mime_type, "multipart", "related");
+	related = camel_content_type_is (
+		CAMEL_DATA_WRAPPER (multipart)->mime_type,
+		"multipart", "related");
 
 	if (CAMEL_IS_MULTIPART_SIGNED (multipart)) {
-		mime_part = camel_multipart_get_part (multipart, CAMEL_MULTIPART_SIGNED_CONTENT);
-		add_attachments_handle_mime_part (composer, mime_part, just_inlines, related, depth);
+		mime_part = camel_multipart_get_part (
+			multipart, CAMEL_MULTIPART_SIGNED_CONTENT);
+		add_attachments_handle_mime_part (
+			composer, mime_part, just_inlines, related, depth);
 	} else if (CAMEL_IS_MULTIPART_ENCRYPTED (multipart)) {
-		/* what should we do in this case? */
+		/* XXX What should we do in this case? */
 	} else {
 		nparts = camel_multipart_get_number (multipart);
 
 		for (i = 0; i < nparts; i++) {
 			mime_part = camel_multipart_get_part (multipart, i);
-			add_attachments_handle_mime_part (composer, mime_part, just_inlines, related, depth);
+			add_attachments_handle_mime_part (
+				composer, mime_part, just_inlines,
+				related, depth);
 		}
 	}
 }
 
-
 /**
  * e_msg_composer_add_message_attachments:
  * @composer: the composer to add the attachments to.
@@ -2934,7 +2920,8 @@
  * specified in @composer.
  */
 void
-e_msg_composer_add_message_attachments (EMsgComposer *composer, CamelMimeMessage *message,
+e_msg_composer_add_message_attachments (EMsgComposer *composer,
+                                        CamelMimeMessage *message,
 					gboolean just_inlines)
 {
 	CamelDataWrapper *wrapper;
@@ -2943,13 +2930,14 @@
 	if (!CAMEL_IS_MULTIPART (wrapper))
 		return;
 
-	/* there must be attachments... */
-	add_attachments_from_multipart (composer, (CamelMultipart *) wrapper, just_inlines, 0);
+	add_attachments_from_multipart (
+		composer, (CamelMultipart *) wrapper, just_inlines, 0);
 }
 
-
 static void
-handle_multipart_signed (EMsgComposer *composer, CamelMultipart *multipart, gint depth)
+handle_multipart_signed (EMsgComposer *composer,
+                         CamelMultipart *multipart,
+                         gint depth)
 {
 	CamelContentType *content_type;
 	CamelDataWrapper *content;
@@ -2960,9 +2948,10 @@
 	action = GTK_TOGGLE_ACTION (ACTION (PGP_SIGN));
 	gtk_toggle_action_set_active (action, TRUE);
 
-	mime_part = camel_multipart_get_part (multipart, CAMEL_MULTIPART_SIGNED_CONTENT);
+	mime_part = camel_multipart_get_part (
+		multipart, CAMEL_MULTIPART_SIGNED_CONTENT);
 
-	if (!mime_part)
+	if (mime_part != NULL)
 		return;
 
 	content_type = camel_mime_part_get_content_type (mime_part);
@@ -2991,18 +2980,20 @@
 			handle_multipart (composer, multipart, depth);
 		}
 	} else if (camel_content_type_is (content_type, "text", "*")) {
-		gssize len;
 		gchar *html;
+		gssize length;
 
-		html = em_utils_part_to_html (mime_part, &len, NULL);
-		e_msg_composer_set_pending_body (composer, html, len);
+		html = em_utils_part_to_html (mime_part, &length, NULL);
+		e_msg_composer_set_pending_body (composer, html, length);
 	} else {
 		e_msg_composer_attach (composer, mime_part);
 	}
 }
 
 static void
-handle_multipart_encrypted (EMsgComposer *composer, CamelMimePart *multipart, gint depth)
+handle_multipart_encrypted (EMsgComposer *composer,
+                            CamelMimePart *multipart,
+                            gint depth)
 {
 	CamelContentType *content_type;
 	CamelCipherContext *cipher;
@@ -3052,11 +3043,11 @@
 			handle_multipart (composer, content_multipart, depth);
 		}
 	} else if (camel_content_type_is (content_type, "text", "*")) {
-		gssize len;
 		gchar *html;
+		gssize length;
 
-		html = em_utils_part_to_html (mime_part, &len, NULL);
-		e_msg_composer_set_pending_body (composer, html, len);
+		html = em_utils_part_to_html (mime_part, &length, NULL);
+		e_msg_composer_set_pending_body (composer, html, length);
 	} else {
 		e_msg_composer_attach (composer, mime_part);
 	}
@@ -3065,7 +3056,9 @@
 }
 
 static void
-handle_multipart_alternative (EMsgComposer *composer, CamelMultipart *multipart, gint depth)
+handle_multipart_alternative (EMsgComposer *composer,
+                              CamelMultipart *multipart,
+                              gint depth)
 {
 	/* Find the text/html part and set the composer body to it's contents */
 	CamelMimePart *text_part = NULL;
@@ -3116,16 +3109,18 @@
 	}
 
 	if (text_part) {
-		gssize len;
 		gchar *html;
+		gssize length;
 
-		html = em_utils_part_to_html (text_part, &len, NULL);
-		e_msg_composer_set_pending_body (composer, html, len);
+		html = em_utils_part_to_html (text_part, &length, NULL);
+		e_msg_composer_set_pending_body (composer, html, length);
 	}
 }
 
 static void
-handle_multipart (EMsgComposer *composer, CamelMultipart *multipart, gint depth)
+handle_multipart (EMsgComposer *composer,
+                  CamelMultipart *multipart,
+                  gint depth)
 {
 	gint i, nparts;
 
@@ -3162,12 +3157,13 @@
 				handle_multipart (composer, mp, depth + 1);
 			}
 		} else if (depth == 0 && i == 0) {
-			gssize len;
 			gchar *html;
+			gssize length;
 
-			/* Since the first part is not multipart/alternative, then this must be the body */
-			html = em_utils_part_to_html (mime_part, &len, NULL);
-			e_msg_composer_set_pending_body (composer, html, len);
+			/* Since the first part is not multipart/alternative,
+			 * this must be the body. */
+			html = em_utils_part_to_html (mime_part, &length, NULL);
+			e_msg_composer_set_pending_body (composer, html, length);
 		} else if (camel_mime_part_get_content_id (mime_part) ||
 			   camel_mime_part_get_content_location (mime_part)) {
 			/* special in-line attachment */
@@ -3216,7 +3212,7 @@
  *
  * Note: Designed to work only for messages constructed using Evolution.
  *
- * Return value: A pointer to the newly created widget
+ * Returns: A pointer to the newly created widget
  **/
 EMsgComposer *
 e_msg_composer_new_with_message (CamelMimeMessage *message)
@@ -3243,7 +3239,10 @@
 			postto = g_list_append (postto, g_strstrip (g_strdup (headers->value)));
 	}
 
-	composer = create_composer (postto ? E_MSG_COMPOSER_VISIBLE_MASK_POST : E_MSG_COMPOSER_VISIBLE_MASK_MAIL);
+	if (postto != NULL)
+		composer = create_composer (E_MSG_COMPOSER_VISIBLE_MASK_POST);
+	else
+		composer = create_composer (E_MSG_COMPOSER_VISIBLE_MASK_MAIL);
 	p = composer->priv;
 
 	if (!composer) {
@@ -3485,17 +3484,17 @@
 			handle_multipart (composer, multipart, 0);
 		}
 	} else {
-		gssize length;
 		gchar *html;
+		gssize length;
 
 		html = em_utils_part_to_html ((CamelMimePart *)message, &length, NULL);
 		e_msg_composer_set_pending_body (composer, html, length);
 	}
 
-	/* We wait until now to set the body text because we need to ensure that
-	 * the attachment bar has all the attachments, before we request them.
-	 */
-	e_msg_composer_flush_pending_body (composer, TRUE);
+	/* We wait until now to set the body text because we need to
+	 * ensure that the attachment bar has all the attachments before
+	 * we request them. */
+	e_msg_composer_flush_pending_body (composer);
 
 	set_signature_gui (composer);
 
@@ -3532,10 +3531,11 @@
  *
  * Create a new message composer widget.
  *
- * Return value: A pointer to the newly created widget
+ * Returns: A pointer to the newly created widget
  **/
 EMsgComposer *
-e_msg_composer_new_redirect (CamelMimeMessage *message, const gchar *resent_from)
+e_msg_composer_new_redirect (CamelMimeMessage *message,
+                             const gchar *resent_from)
 {
 	EMsgComposer *composer;
 	EComposerHeaderTable *table;
@@ -3582,12 +3582,16 @@
 void
 e_msg_composer_save_draft (EMsgComposer *composer)
 {
+	GtkhtmlEditor *editor;
+
 	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
 
+	editor = GTKHTML_EDITOR (composer);
+
 	g_signal_emit (composer, signals[SAVE_DRAFT], 0, FALSE);
 
 	/* XXX This should be elsewhere. */
-	e_msg_composer_unset_changed (composer);
+	gtkhtml_editor_set_changed (editor, FALSE);
 	e_composer_autosave_set_saved (composer, FALSE);
 }
 
@@ -3761,9 +3765,16 @@
 }
 
 static void
-handle_uri (EMsgComposer *composer, const gchar *uri, gboolean html_dnd)
+handle_uri (EMsgComposer *composer,
+            const gchar *uri,
+            gboolean html_dnd)
 {
 	EMsgComposerPrivate *p = composer->priv;
+	GtkhtmlEditor *editor;
+	gboolean html_content;
+
+	editor = GTKHTML_EDITOR (composer);
+	html_content = gtkhtml_editor_get_html_mode (editor);
 
 	if (!g_ascii_strncasecmp (uri, "mailto:";, 7)) {
 		handle_mailto (composer, uri);
@@ -3775,11 +3786,11 @@
 			return;
 
 		if (!g_ascii_strcasecmp (url->protocol, "file")) {
-			type = attachment_guess_mime_type (uri);
+			type = e_msg_composer_guess_mime_type (uri);
 			if (!type)
 				return;
 
-			if (strncmp (type, "image", 5) || !html_dnd || (!p->send_html && !strncmp (type, "image", 5))) {
+			if (strncmp (type, "image", 5) || !html_dnd || (!html_content && !strncmp (type, "image", 5))) {
 				e_attachment_bar_attach (E_ATTACHMENT_BAR (p->attachment_bar),
 						url->path, "attachment");
 			}
@@ -3843,7 +3854,8 @@
  * This function should only be used by the CORBA composer factory.
  **/
 void
-e_msg_composer_set_body (EMsgComposer *composer, const gchar *body,
+e_msg_composer_set_body (EMsgComposer *composer,
+                         const gchar *body,
 			 const gchar *mime_type)
 {
 	EMsgComposerPrivate *p = composer->priv;
@@ -3875,7 +3887,6 @@
 	}
 }
 
-
 /**
  * e_msg_composer_add_header:
  * @composer: a composer object
@@ -3887,7 +3898,8 @@
  * the message it outputs.
  **/
 void
-e_msg_composer_add_header (EMsgComposer *composer, const gchar *name,
+e_msg_composer_add_header (EMsgComposer *composer,
+                           const gchar *name,
 			   const gchar *value)
 {
 	EMsgComposerPrivate *p = composer->priv;
@@ -3899,6 +3911,7 @@
 	g_ptr_array_add (p->extra_hdr_names, g_strdup (name));
 	g_ptr_array_add (p->extra_hdr_values, g_strdup (value));
 }
+
 /**
  * e_msg_composer_modify_header :
  * @composer : a composer object
@@ -3911,7 +3924,8 @@
  * If not found then it creates a new header with @name and @change_value .
  **/
 void
-e_msg_composer_modify_header (EMsgComposer *composer, const gchar *name,
+e_msg_composer_modify_header (EMsgComposer *composer,
+                              const gchar *name,
 			      const gchar *change_value)
 {
 	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
@@ -3930,7 +3944,8 @@
  * Searches for the header and if found it removes it .
  **/
 void
-e_msg_composer_remove_header (EMsgComposer *composer, const gchar *name)
+e_msg_composer_remove_header (EMsgComposer *composer,
+                              const gchar *name)
 {
 	EMsgComposerPrivate *p;
 	gint i;
@@ -3942,12 +3957,12 @@
 
 	for (i = 0; i < p->extra_hdr_names->len; i++) {
 		if (strcmp (p->extra_hdr_names->pdata[i], name) == 0) {
-			g_print ("Hit : %s",name);
 			g_ptr_array_remove_index (p->extra_hdr_names, i);
 			g_ptr_array_remove_index (p->extra_hdr_values, i);
 		}
 	}
 }
+
 /**
  * e_msg_composer_attach:
  * @composer: a composer object
@@ -3966,11 +3981,8 @@
 
 	bar = E_ATTACHMENT_BAR (p->attachment_bar);
 	e_attachment_bar_attach_mime_part (bar, attachment);
-
-	show_attachments (composer, TRUE);
 }
 
-
 /**
  * e_msg_composer_add_inline_image_from_file:
  * @composer: a composer object
@@ -3979,7 +3991,7 @@
  * This reads in the image in @filename and adds it to @composer
  * as an inline image, to be wrapped in a multipart/related.
  *
- * Return value: the newly-created CamelMimePart (which must be reffed
+ * Returns: the newly-created CamelMimePart (which must be reffed
  * if the caller wants to keep its own reference), or %NULL on error.
  **/
 CamelMimePart *
@@ -3990,14 +4002,12 @@
 	CamelStream *stream;
 	CamelDataWrapper *wrapper;
 	CamelMimePart *part;
-	struct stat statbuf;
 	EMsgComposerPrivate *p = composer->priv;
 
 	dec_file_name = g_strdup (filename);
 	camel_url_decode (dec_file_name);
 
-	/* check for regular file */
-	if (g_stat (dec_file_name, &statbuf) < 0 || !S_ISREG (statbuf.st_mode))
+	if (!g_file_test (dec_file_name, G_FILE_TEST_IS_REGULAR))
 		return NULL;
 
 	stream = camel_stream_fs_new_with_name (dec_file_name, O_RDONLY, 0);
@@ -4009,7 +4019,9 @@
 	camel_object_unref (CAMEL_OBJECT (stream));
 
 	mime_type = e_msg_composer_guess_mime_type (dec_file_name);
-	camel_data_wrapper_set_mime_type (wrapper, mime_type ? mime_type : "application/octet-stream");
+	if (mime_type == NULL)
+		mime_type = g_strdup ("application/octet-stream");
+	camel_data_wrapper_set_mime_type (wrapper, mime_type);
 	g_free (mime_type);
 
 	part = camel_mime_part_new ();
@@ -4035,7 +4047,6 @@
 	return part;
 }
 
-
 /**
  * e_msg_composer_add_inline_image_from_mime_part:
  * @composer: a composer object
@@ -4063,13 +4074,12 @@
 	camel_object_ref (part);
 
 	location = camel_mime_part_get_content_location (part);
-	if (location) {
-		g_hash_table_insert (p->inline_images_by_url,
-				     g_strdup (location), part);
-	}
+	if (location != NULL)
+		g_hash_table_insert (
+			p->inline_images_by_url,
+			g_strdup (location), part);
 }
 
-
 /**
  * e_msg_composer_get_message:
  * @composer: A message composer widget
@@ -4078,34 +4088,43 @@
  * CamelMimeMessage object is created on the fly; subsequent calls to this
  * function will always create new objects from scratch.
  *
- * Return value: A pointer to the new CamelMimeMessage object
+ * Returns: A pointer to the new CamelMimeMessage object
  **/
 CamelMimeMessage *
-e_msg_composer_get_message (EMsgComposer *composer, gboolean save_html_object_data)
+e_msg_composer_get_message (EMsgComposer *composer,
+                            gboolean save_html_object_data)
 {
+	GtkhtmlEditor *editor;
+	gboolean html_content;
+
 	g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL);
-	if ( e_msg_composer_get_remote_download_count (composer) != 0) {
-		if (!em_utils_prompt_user ((GtkWindow *)composer, NULL, "mail-composer:ask-send-message-pending-download", NULL)) {
+
+	if (e_msg_composer_get_remote_download_count (composer) != 0) {
+		if (!em_utils_prompt_user (GTK_WINDOW (composer), NULL,
+			"mail-composer:ask-send-message-pending-download", NULL)) {
 			return NULL;
 		}
 	}
 
-	return build_message (composer, save_html_object_data);
+	editor = GTKHTML_EDITOR (composer);
+	html_content = gtkhtml_editor_get_html_mode (editor);
+
+	return build_message (composer, html_content, save_html_object_data);
 }
 
 static gchar *
-msg_composer_get_message_print_helper (EMsgComposer *composer)
+msg_composer_get_message_print_helper (EMsgComposer *composer,
+                                       gboolean html_content)
 {
 	GtkToggleAction *action;
 	GString *string;
 
 	string = g_string_sized_new (128);
 
-	if (composer->priv->send_html)
+	if (html_content)
 		g_string_append (string, "text/html");
 	else
 		g_string_append (string, "text/plain");
-	composer->priv->send_html = TRUE;
 
 	action = GTK_TOGGLE_ACTION (ACTION (PGP_SIGN));
 	if (gtk_toggle_action_get_active (action))
@@ -4131,13 +4150,19 @@
 }
 
 CamelMimeMessage *
-e_msg_composer_get_message_print (EMsgComposer *composer, gboolean save_html_object_data)
+e_msg_composer_get_message_print (EMsgComposer *composer,
+                                  gboolean save_html_object_data)
 {
+	GtkhtmlEditor *editor;
 	EMsgComposer *temp_composer;
 	CamelMimeMessage *msg;
+	gboolean html_content;
 	gchar *flags;
 
-	msg = build_message (composer, save_html_object_data);
+	editor = GTKHTML_EDITOR (composer);
+	html_content = gtkhtml_editor_get_html_mode (editor);
+
+	msg = build_message (composer, html_content, save_html_object_data);
 	if (msg == NULL)
 		return NULL;
 
@@ -4145,9 +4170,10 @@
 	camel_object_unref (msg);
 
 	/* Override composer flags. */
-	flags = msg_composer_get_message_print_helper (temp_composer);
+	flags = msg_composer_get_message_print_helper (
+		temp_composer, html_content);
 
-	msg = build_message (temp_composer, save_html_object_data);
+	msg = build_message (temp_composer, TRUE, save_html_object_data);
 	if (msg != NULL)
 		camel_medium_set_header (
 			CAMEL_MEDIUM (msg), "X-Evolution-Format", flags);
@@ -4161,55 +4187,53 @@
 CamelMimeMessage *
 e_msg_composer_get_message_draft (EMsgComposer *composer)
 {
+	GtkhtmlEditor *editor;
 	EComposerHeaderTable *table;
 	GtkToggleAction *action;
 	CamelMimeMessage *msg;
 	EAccount *account;
-	gboolean old_flags[4];
-	gboolean old_send_html;
+	gboolean html_content;
+	gboolean pgp_encrypt;
+	gboolean pgp_sign;
+	gboolean smime_encrypt;
+	gboolean smime_sign;
 	GString *flags;
-	gint i;
-	EMsgComposerPrivate *p = composer->priv;
 
+	editor = GTKHTML_EDITOR (composer);
 	table = e_msg_composer_get_header_table (composer);
-
-	/* always save drafts as HTML to preserve formatting */
-	old_send_html = p->send_html;
-	p->send_html = TRUE;
+	html_content = gtkhtml_editor_get_html_mode (editor);
 
 	action = GTK_TOGGLE_ACTION (ACTION (PGP_SIGN));
-	old_flags[0] = gtk_toggle_action_get_active (action);
+	pgp_sign = gtk_toggle_action_get_active (action);
 	gtk_toggle_action_set_active (action, FALSE);
 
 	action = GTK_TOGGLE_ACTION (ACTION (PGP_ENCRYPT));
-	old_flags[1] = gtk_toggle_action_get_active (action);
+	pgp_encrypt = gtk_toggle_action_get_active (action);
 	gtk_toggle_action_set_active (action, FALSE);
 
 	action = GTK_TOGGLE_ACTION (ACTION (SMIME_SIGN));
-	old_flags[2] = gtk_toggle_action_get_active (action);
+	smime_sign = gtk_toggle_action_get_active (action);
 	gtk_toggle_action_set_active (action, FALSE);
 
 	action = GTK_TOGGLE_ACTION (ACTION (SMIME_ENCRYPT));
-	old_flags[3] = gtk_toggle_action_get_active (action);
+	smime_encrypt = gtk_toggle_action_get_active (action);
 	gtk_toggle_action_set_active (action, FALSE);
 
-	msg = build_message (composer, TRUE);
+	msg = build_message (composer, TRUE, TRUE);
 	if (msg == NULL)
 		return NULL;
 
-	p->send_html = old_send_html;
-
 	action = GTK_TOGGLE_ACTION (ACTION (PGP_SIGN));
-	gtk_toggle_action_set_active (action, old_flags[0]);
+	gtk_toggle_action_set_active (action, pgp_sign);
 
 	action = GTK_TOGGLE_ACTION (ACTION (PGP_ENCRYPT));
-	gtk_toggle_action_set_active (action, old_flags[1]);
+	gtk_toggle_action_set_active (action, pgp_encrypt);
 
 	action = GTK_TOGGLE_ACTION (ACTION (SMIME_SIGN));
-	gtk_toggle_action_set_active (action, old_flags[2]);
+	gtk_toggle_action_set_active (action, smime_sign);
 
 	action = GTK_TOGGLE_ACTION (ACTION (SMIME_ENCRYPT));
-	gtk_toggle_action_set_active (action, old_flags[3]);
+	gtk_toggle_action_set_active (action, smime_encrypt);
 
 	if (msg == NULL)
 		return NULL;
@@ -4217,23 +4241,25 @@
 	/* Attach account info to the draft. */
 	account = e_composer_header_table_get_account (table);
 	if (account && account->name)
-		camel_medium_set_header (CAMEL_MEDIUM (msg), "X-Evolution-Account", account->uid);
+		camel_medium_set_header (
+			CAMEL_MEDIUM (msg),
+			"X-Evolution-Account", account->uid);
 
-	/* build_message () set this to text/html since we set p->send_html to
-	   TRUE before calling e_msg_composer_get_message () */
-	if (!p->send_html)
-		flags = g_string_new ("text/plain");
-	else
-		flags = g_string_new ("text/html");
+	flags = g_string_new (html_content ? "text/html" : "text/plain");
 
 	/* This should probably only save the setting if it is
 	 * different from the from-account default? */
-	for (i=0;i<4;i++) {
-		if (old_flags[i])
-			g_string_append_printf (flags, ", %s", emc_draft_format_names[i]);
-	}
+	if (pgp_sign)
+		g_string_append (flags, ", pgp-sign");
+	if (pgp_encrypt)
+		g_string_append (flags, ", pgp-encrypt");
+	if (smime_sign)
+		g_string_append (flags, ", smime-sign");
+	if (smime_encrypt)
+		g_string_append (flags, ", smime-encrypt");
 
-	camel_medium_set_header (CAMEL_MEDIUM (msg), "X-Evolution-Format", flags->str);
+	camel_medium_set_header (
+		CAMEL_MEDIUM (msg), "X-Evolution-Format", flags->str);
 	g_string_free (flags, TRUE);
 
 	return msg;
@@ -4357,11 +4383,14 @@
 	GnomeVFSResult result;
 	gchar *type = NULL;
 
+	g_return_val_if_fail (filename != NULL, NULL);
+
 	info = gnome_vfs_file_info_new ();
-	result = gnome_vfs_get_file_info (filename, info,
-					  GNOME_VFS_FILE_INFO_GET_MIME_TYPE |
-					  GNOME_VFS_FILE_INFO_FORCE_SLOW_MIME_TYPE |
-					  GNOME_VFS_FILE_INFO_FOLLOW_LINKS);
+	result = gnome_vfs_get_file_info (
+		filename, info,
+		GNOME_VFS_FILE_INFO_GET_MIME_TYPE |
+		GNOME_VFS_FILE_INFO_FORCE_SLOW_MIME_TYPE |
+		GNOME_VFS_FILE_INFO_FOLLOW_LINKS);
 	if (result == GNOME_VFS_OK)
 		type = g_strdup (gnome_vfs_file_info_get_mime_type (info));
 
@@ -4370,54 +4399,6 @@
 	return type;
 }
 
-
-/**
- * e_msg_composer_set_changed:
- * @composer: An EMsgComposer object.
- *
- * Mark the composer as changed, so before the composer gets destroyed
- * the user will be prompted about unsaved changes.
- **/
-void
-e_msg_composer_set_changed (EMsgComposer *composer)
-{
-	EMsgComposerPrivate *p = composer->priv;
-	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
-	p->has_changed = TRUE;
-}
-
-
-/**
- * e_msg_composer_unset_changed:
- * @composer: An EMsgComposer object.
- *
- * Mark the composer as unchanged, so no prompt about unsaved changes
- * will appear before destroying the composer.
- **/
-void
-e_msg_composer_unset_changed (EMsgComposer *composer)
-{
-	EMsgComposerPrivate *p = composer->priv;
-	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
-	p->has_changed = FALSE;
-}
-
-gboolean
-e_msg_composer_is_dirty (EMsgComposer *composer)
-{
-	GtkhtmlEditor *editor;
-
-	g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
-
-	editor = GTKHTML_EDITOR (composer);
-
-	return composer->priv->has_changed ||
-		(gtkhtml_editor_has_undo (editor) &&
-		!gtkhtml_editor_run_command (editor, "is-saved"));
-}
-
 /**
  * e_msg_composer_get_raw_message_text:
  *
@@ -4451,20 +4432,12 @@
 }
 
 void
-e_msg_composer_set_enable_autosave  (EMsgComposer *composer, gboolean enabled)
+e_msg_composer_set_enable_autosave (EMsgComposer *composer,
+                                    gboolean enabled)
 {
 	e_composer_autosave_set_enabled (composer, enabled);
 }
 
-void
-e_msg_composer_drop_editor_undo (EMsgComposer *composer)
-{
-	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
-	gtkhtml_editor_drop_undo (GTKHTML_EDITOR (composer));
-}
-
-
 gboolean
 e_msg_composer_request_close_all (void)
 {
@@ -4555,21 +4528,18 @@
 }
 
 void
-e_msg_composer_show_attachments_ui (EMsgComposer *composer)
+e_msg_composer_set_alternative (EMsgComposer *composer,
+                                gboolean alt)
 {
 	EMsgComposerPrivate *p = composer->priv;
+	GtkhtmlEditor *editor;
 
-	if (e_attachment_bar_get_num_attachments (E_ATTACHMENT_BAR (p->attachment_bar)))
-		show_attachments (composer, TRUE);
-}
+	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
 
-void
-e_msg_composer_set_alternative (EMsgComposer *composer, gboolean alt)
-{
-	EMsgComposerPrivate *p = composer->priv;
+	editor = GTKHTML_EDITOR (composer);
 
 	p->is_alternative = alt;
-	p->send_html = !alt;
+	gtkhtml_editor_set_html_mode (editor, !alt);
 }
 
 void
@@ -4775,17 +4745,6 @@
 }
 
 void
-e_msg_composer_set_saved (EMsgComposer *composer)
-{
-	GtkhtmlEditor *editor;
-
-	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
-	editor = GTKHTML_EDITOR (composer);
-	gtkhtml_editor_run_command (editor, "saved");
-}
-
-void
 e_msg_composer_set_send_options (EMsgComposer *composer,
                                  gboolean send_enable)
 {

Modified: branches/mbarnes-composer/composer/e-msg-composer.h
==============================================================================
--- branches/mbarnes-composer/composer/e-msg-composer.h	(original)
+++ branches/mbarnes-composer/composer/e-msg-composer.h	Sat Mar 29 05:22:40 2008
@@ -83,9 +83,6 @@
 void		e_msg_composer_send		(EMsgComposer *composer);
 void		e_msg_composer_save_draft	(EMsgComposer *composer);
 
-void		e_msg_composer_show_attachments_ui
-						(EMsgComposer *composer);
-
 void		e_msg_composer_set_alternative	(EMsgComposer *composer,
 						 gboolean alt);
 
@@ -129,9 +126,6 @@
 void		e_msg_composer_clear_inlined_table
 						(EMsgComposer *composer);
 gchar *		e_msg_composer_guess_mime_type	(const gchar *filename);
-void		e_msg_composer_set_changed	(EMsgComposer *composer);
-void		e_msg_composer_unset_changed	(EMsgComposer *composer);
-gboolean	e_msg_composer_is_dirty		(EMsgComposer *composer);
 void		e_msg_composer_set_enable_autosave
 						(EMsgComposer *composer,
 						 gboolean enabled);
@@ -143,7 +137,6 @@
 						(EMsgComposer *composer,
 						 CamelMimeMessage *message,
 						 gboolean just_inlines);
-void		e_msg_composer_drop_editor_undo	(EMsgComposer *composer);
 
 gboolean	e_msg_composer_request_close_all(void);
 EMsgComposer *	e_msg_composer_load_from_file	(const gchar *filename);
@@ -167,7 +160,6 @@
 
 EComposerHeaderTable *
 		e_msg_composer_get_header_table	(EMsgComposer *composer);
-void		e_msg_composer_set_saved	(EMsgComposer *composer);
 void		e_msg_composer_set_send_options	(EMsgComposer *composer,
 						 gboolean send_enable);
 GByteArray *	e_msg_composer_get_raw_message_text

Modified: branches/mbarnes-composer/mail/em-composer-prefs.c
==============================================================================
--- branches/mbarnes-composer/mail/em-composer-prefs.c	(original)
+++ branches/mbarnes-composer/mail/em-composer-prefs.c	Sat Mar 29 05:22:40 2008
@@ -307,7 +307,8 @@
 		}
 
 		editor = e_signature_editor_new ();
-		e_signature_editor_set_signature (editor, sig);
+		e_signature_editor_set_signature (
+			E_SIGNATURE_EDITOR (editor), sig);
 
 		parent = gtk_widget_get_toplevel ((GtkWidget *) prefs);
 		if (GTK_WIDGET_TOPLEVEL (parent))

Modified: branches/mbarnes-composer/mail/em-composer-utils.c
==============================================================================
--- branches/mbarnes-composer/mail/em-composer-utils.c	(original)
+++ branches/mbarnes-composer/mail/em-composer-utils.c	Sat Mar 29 05:22:40 2008
@@ -472,7 +472,7 @@
 	if (!ok)
 		goto done;
 
-	e_msg_composer_set_saved (sdi->composer);
+	gtkhtml_editor_set_changed (GTKHTML_EDITOR (sdi->composer), FALSE);
 
 	if ((emcs = sdi->emcs) == NULL) {
 		emcs = emcs_new ();
@@ -662,13 +662,15 @@
 em_utils_compose_new_message (const char *fromuri)
 {
 	GtkWidget *composer;
+	GtkhtmlEditor *editor;
 
 	composer = (GtkWidget *) create_new_composer ("", fromuri);
 	if (composer == NULL)
 		return;
 
-	e_msg_composer_unset_changed ((EMsgComposer *)composer);
-	e_msg_composer_drop_editor_undo ((EMsgComposer *)composer);
+	editor = GTKHTML_EDITOR (composer);
+	gtkhtml_editor_set_changed (editor, FALSE);
+	gtkhtml_editor_drop_undo (editor);
 
 	gtk_widget_show (composer);
 }
@@ -685,6 +687,7 @@
 em_utils_compose_new_message_with_mailto (const char *url, const char *fromuri)
 {
 	EMsgComposer *composer;
+	GtkhtmlEditor *editor;
 	EComposerHeaderTable *table;
 	EAccount *account = NULL;
 
@@ -700,8 +703,9 @@
 	    && (account = mail_config_get_account_by_source_url(fromuri)))
 		e_composer_header_table_set_account_name (table, account->name);
 
-	e_msg_composer_unset_changed (composer);
-	e_msg_composer_drop_editor_undo (composer);
+	editor = GTKHTML_EDITOR (composer);
+	gtkhtml_editor_set_changed (editor, FALSE);
+	gtkhtml_editor_drop_undo (editor);
 
 	gtk_widget_show ((GtkWidget *) composer);
 	gdk_window_raise (((GtkWidget *) composer)->window);
@@ -719,6 +723,7 @@
 em_utils_post_to_folder (CamelFolder *folder)
 {
 	EMsgComposer *composer;
+	GtkhtmlEditor *editor;
 	EComposerHeaderTable *table;
 	EAccount *account;
 
@@ -745,8 +750,9 @@
 
 	em_composer_utils_setup_default_callbacks (composer);
 
-	e_msg_composer_unset_changed (composer);
-	e_msg_composer_drop_editor_undo (composer);
+	editor = GTKHTML_EDITOR (composer);
+	gtkhtml_editor_set_changed (editor, FALSE);
+	gtkhtml_editor_drop_undo (editor);
 
 	gtk_widget_show ((GtkWidget *) composer);
 	gdk_window_raise (((GtkWidget *) composer)->window);
@@ -764,6 +770,7 @@
 em_utils_post_to_url (const char *url)
 {
 	EMsgComposer *composer;
+	GtkhtmlEditor *editor;
 	EComposerHeaderTable *table;
 
 	composer = e_msg_composer_new_with_type (E_MSG_COMPOSER_POST);
@@ -779,8 +786,9 @@
 
 	em_composer_utils_setup_default_callbacks (composer);
 
-	e_msg_composer_unset_changed (composer);
-	e_msg_composer_drop_editor_undo (composer);
+	editor = GTKHTML_EDITOR (composer);
+	gtkhtml_editor_set_changed (editor, FALSE);
+	gtkhtml_editor_drop_undo (editor);
 
 	gtk_widget_show ((GtkWidget *) composer);
 }
@@ -791,11 +799,14 @@
 edit_message (CamelMimeMessage *message, CamelFolder *drafts, const char *uid)
 {
 	EMsgComposer *composer;
+	GtkhtmlEditor *editor;
 
 	composer = e_msg_composer_new_with_message (message);
 	em_composer_utils_setup_callbacks (composer, NULL, NULL, 0, 0, drafts, uid);
-	e_msg_composer_unset_changed (composer);
-	e_msg_composer_drop_editor_undo (composer);
+
+	editor = GTKHTML_EDITOR (composer);
+	gtkhtml_editor_set_changed (editor, FALSE);
+	gtkhtml_editor_drop_undo (editor);
 
 	gtk_widget_show (GTK_WIDGET (composer));
 }
@@ -856,14 +867,17 @@
 forward_attached (CamelFolder *folder, GPtrArray *messages, CamelMimePart *part, char *subject, const char *fromuri)
 {
 	EMsgComposer *composer;
+	GtkhtmlEditor *editor;
 
 	composer = create_new_composer (subject, fromuri);
 	if (composer == NULL)
 		return;
 
 	e_msg_composer_attach (composer, part);
-	e_msg_composer_unset_changed (composer);
-	e_msg_composer_drop_editor_undo (composer);
+
+	editor = GTKHTML_EDITOR (editor);
+	gtkhtml_editor_set_changed (editor, FALSE);
+	gtkhtml_editor_drop_undo (editor);
 
 	gtk_widget_show (GTK_WIDGET (composer));
 }
@@ -902,6 +916,7 @@
 {
 	CamelMimeMessage *message;
 	EMsgComposer *composer;
+	GtkhtmlEditor *editor;
 	char *subject, *text;
 	int i;
 	guint32 flags;
@@ -929,8 +944,10 @@
 					e_msg_composer_add_message_attachments(composer, message, FALSE);
 
 				e_msg_composer_set_body_text (composer, text, len);
-				e_msg_composer_unset_changed (composer);
-				e_msg_composer_drop_editor_undo (composer);
+
+				editor = GTKHTML_EDITOR (composer);
+				gtkhtml_editor_set_changed (editor, FALSE);
+				gtkhtml_editor_drop_undo (editor);
 
 				gtk_widget_show (GTK_WIDGET (composer));
 			}
@@ -1100,14 +1117,17 @@
 em_utils_redirect_message (CamelMimeMessage *message)
 {
 	EMsgComposer *composer;
+	GtkhtmlEditor *editor;
 
 	g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message));
 
 	composer = redirect_get_composer (message);
 
 	gtk_widget_show (GTK_WIDGET (composer));
-	e_msg_composer_unset_changed (composer);
-	e_msg_composer_drop_editor_undo (composer);
+
+	editor = GTKHTML_EDITOR (composer);
+	gtkhtml_editor_set_changed (editor, FALSE);
+	gtkhtml_editor_drop_undo (editor);
 }
 
 static void
@@ -1501,7 +1521,7 @@
 		e_msg_composer_add_header (composer, "References", references);
 	}
 
-	e_msg_composer_drop_editor_undo (composer);
+	gtkhtml_editor_drop_undo (GTKHTML_EDITOR (composer));
 
 	return composer;
 }
@@ -1934,7 +1954,7 @@
 		break;
 	}
 
-	e_msg_composer_drop_editor_undo (composer);
+	gtkhtml_editor_drop_undo (GTKHTML_EDITOR (composer));
 }
 
 struct _reply_data {
@@ -2049,7 +2069,8 @@
 	em_composer_utils_setup_callbacks (composer, folder, uid, flags, flags, NULL, NULL);
 
 	gtk_widget_show (GTK_WIDGET (composer));
-	e_msg_composer_unset_changed (composer);
+
+	gtkhtml_editor_set_changed (GTKHTML_EDITOR (composer), FALSE);
 }
 
 /* Posting replies... */
@@ -2063,6 +2084,7 @@
 	EDestination **tov = NULL;
 	CamelFolder *real_folder;
 	EMsgComposer *composer;
+	GtkhtmlEditor *editor;
 	EComposerHeaderTable *table;
 	char *subject, *url;
 	EAccount *account;
@@ -2092,6 +2114,7 @@
 	get_reply_sender (message, to, NULL);
 
 	composer = e_msg_composer_new_with_type (E_MSG_COMPOSER_MAIL_POST);
+	editor = GTKHTML_EDITOR (composer);
 
 	/* construct the tov/ccv */
 	tov = em_utils_camel_address_to_destination (to);
@@ -2140,7 +2163,7 @@
 		e_msg_composer_add_header (composer, "References", references);
 	}
 
-	e_msg_composer_drop_editor_undo (composer);
+	gtkhtml_editor_drop_undo (editor);
 
 	e_msg_composer_add_message_attachments (composer, message, TRUE);
 
@@ -2149,7 +2172,8 @@
 	em_composer_utils_setup_callbacks (composer, real_folder, real_uid, flags, flags, NULL, NULL);
 
 	gtk_widget_show (GTK_WIDGET (composer));
-	e_msg_composer_unset_changed (composer);
+
+	gtkhtml_editor_set_changed (editor, FALSE);
 
 	camel_object_unref (real_folder);
 	camel_object_unref(to);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]