evolution r34962 - in branches/mbarnes-composer: . composer



Author: mbarnes
Date: Wed Feb  6 00:09:08 2008
New Revision: 34962
URL: http://svn.gnome.org/viewvc/evolution?rev=34962&view=rev

Log:
Just saving progress... disregard the mess.


Added:
   branches/mbarnes-composer/composer/e-composer-actions.c
   branches/mbarnes-composer/composer/e-composer-actions.h
   branches/mbarnes-composer/composer/e-composer-private.h
   branches/mbarnes-composer/composer/evolution-composer.ui
Modified:
   branches/mbarnes-composer/composer/Makefile.am
   branches/mbarnes-composer/composer/e-msg-composer.c
   branches/mbarnes-composer/composer/e-msg-composer.h
   branches/mbarnes-composer/configure.in

Modified: branches/mbarnes-composer/composer/Makefile.am
==============================================================================
--- branches/mbarnes-composer/composer/Makefile.am	(original)
+++ branches/mbarnes-composer/composer/Makefile.am	Wed Feb  6 00:09:08 2008
@@ -58,6 +58,8 @@
 libcomposer_la_SOURCES = 			\
 	$(IDL_GENERATED)			\
 	$(HTML_EDITOR_GENERATED)		\
+	e-composer-actions.c			\
+	e-composer-actions.h			\
 	e-composer-autosave.c			\
 	e-composer-autosave.h			\
 	e-composer-common.h			\
@@ -71,6 +73,7 @@
 	e-composer-name-header.h		\
 	e-composer-post-header.c		\
 	e-composer-post-header.h		\
+	e-composer-private.h			\
 	e-composer-text-header.c		\
 	e-composer-text-header.h		\
 	e-msg-composer-select-file.c		\

Added: branches/mbarnes-composer/composer/e-composer-actions.c
==============================================================================
--- (empty file)
+++ branches/mbarnes-composer/composer/e-composer-actions.c	Wed Feb  6 00:09:08 2008
@@ -0,0 +1,185 @@
+#include "e-composer-actions.h"
+#include "e-composer-private.h"
+
+#include <e-util/e-error.h>
+
+static void
+action_attach_cb (GtkAction *action,
+                  EMsgComposer *composer)
+{
+}
+
+static void
+action_close_cb (GtkAction *action,
+                 EMsgComposer *composer)
+{
+	EComposerHeaderTable *table;
+	const gchar *subject;
+	gint response;
+
+	if (!e_msg_composer_is_dirty (composer) &&
+		!e_msg_composer_is_autosaved (composer)) {
+
+		gtk_widget_destroy (GTK_WIDGET (composer));
+		return;
+	}
+
+	gdk_window_raise (GTK_WIDGET (composer)->window);
+
+	table = e_msg_composer_get_header_table (composer);
+	subject = e_composer_header_table_get_subject (table);
+
+	if (subject == NULL || *subject == '\0')
+		subject = _("Untitled Message");
+
+	response = e_error_run (
+		GTK_WINDOW (composer),
+		"mail-composer:exit-unsaved",
+		subject, NULL);
+
+	switch (response) {
+		case GTK_RESPONSE_YES:
+			gtk_action_activate (ACTION (SAVE_DRAFT));
+			/* fall through */
+
+		case GTK_RESPONSE_NO:
+			gtk_widget_destroy (GTK_WIDGET (composer));
+			break;
+
+		case GTK_RESPONSE_CANCEL:
+			break;
+	}
+}
+
+static void
+action_print_cb (GtkAction *action,
+                 EMsgComposer *composer)
+{
+}
+
+static void
+action_print_preview_cb (GtkAction *action,
+                         EMsgComposer *composer)
+{
+}
+
+static void
+action_save_cb (GtkAction *action,
+                EMsgComposer *composer)
+{
+	GtkhtmlEditor *editor = GTKHTML_EDITOR (composer);
+	const gchar *filename;
+
+	filename = gtkhtml_editor_get_current_filename (editor);
+	if (filename == NULL) {
+		gtk_action_activate (ACTION (SAVE_AS));
+		return;
+	}
+}
+
+static void
+action_save_as_cb (GtkAction *action,
+                   EMsgComposer *composer)
+{
+}
+
+static void
+action_save_draft_cb (GtkAction *action,
+                      EMsgComposer *composer)
+{
+	g_signal_emit_by_name (composer, "save-draft", FALSE);
+	e_msg_composer_unset_changed (composer);
+	e_msg_composer_unset_autosaved (composer);
+}
+
+static void
+action_send_cb (GtkAction *action,
+                EMsgComposer *composer)
+{
+	g_signal_emit_by_name (composer, "send");
+}
+
+static GtkActionEntry entries[] = {
+
+	{ "attach",
+          "mail-attachment",
+	  N_("_Attachment..."),
+	  "<Control>m",
+	  NULL,
+	  G_CALLBACK (action_attach_cb) },
+
+	{ "close",
+	  GTK_STOCK_CLOSE,
+	  N_("_Close"),
+	  "<Control>w",
+	  NULL,
+	  G_CALLBACK (action_close_cb) },
+
+	{ "print",
+	  GTK_STOCK_PRINT,
+	  N_("_Print..."),
+	  "<Control>p",
+	  NULL,
+	  G_CALLBACK (action_print_cb) },
+
+	{ "print-preview",
+	  GTK_STOCK_PRINT_PREVIEW,
+	  N_("Print Pre_view"),
+	  "<Shift><Control>p",
+	  NULL,
+	  G_CALLBACK (action_print_preview_cb) },
+
+	{ "save",
+	  GTK_STOCK_SAVE,
+	  N_("_Save"),
+	  "<Control>s",
+	  NULL,
+	  G_CALLBACK (action_save_cb) },
+
+	{ "save-as",
+	  GTK_STOCK_SAVE_AS,
+	  N_("Save _As..."),
+	  NULL,
+	  NULL,
+	  G_CALLBACK (action_save_as_cb) },
+
+	{ "save-draft",
+	  NULL,
+	  N_("Save _Draft"),
+	  "<Shift><Control>s",
+	  NULL,
+	  G_CALLBACK (action_save_draft_cb) },
+
+	{ "send",
+	  "mail-send",
+	  N_("S_end"),
+	  "<Control><Return>",
+	  NULL,
+	  G_CALLBACK (action_send_cb) }
+};
+
+void
+e_msg_composer_actions_init (EMsgComposer *composer)
+{
+	GtkActionGroup *action_group;
+	GtkUIManager *manager;
+
+	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
+
+	manager = gtkhtml_editor_get_ui_manager (GTKHTML_EDITOR (composer));
+
+	/* Composer Actions */
+	action_group = composer->priv->action_group;
+	gtk_action_group_set_translation_domain (
+		action_group, GETTEXT_PACKAGE);
+	gtk_action_group_add_actions (
+		action_group, entries,
+		G_N_ELEMENTS (entries), composer);
+	gtk_ui_manager_insert_action_group (manager, action_group, 0);
+
+	/* Fine Tuning */
+
+	g_object_set (
+		G_OBJECT (ACTION (ATTACH)),
+		"short-label", _("Attach"), NULL);
+}

Added: branches/mbarnes-composer/composer/e-composer-actions.h
==============================================================================
--- (empty file)
+++ branches/mbarnes-composer/composer/e-composer-actions.h	Wed Feb  6 00:09:08 2008
@@ -0,0 +1,24 @@
+#ifndef E_COMPOSER_ACTIONS_H
+#define E_COMPOSER_ACTIONS_H
+
+#define E_COMPOSER_ACTION(composer, name) \
+	(gtkhtml_editor_get_action (GTKHTML_EDITOR (composer), (name)))
+
+#define E_COMPOSER_ACTION_ATTACH(composer) \
+	E_COMPOSER_ACTION ((composer), "attach")
+#define E_COMPOSER_ACTION_CLOSE(composer) \
+	E_COMPOSER_ACTION ((composer), "close")
+#define E_COMPOSER_ACTION_PRINT(composer) \
+	E_COMPOSER_ACTION ((composer), "print")
+#define E_COMPOSER_ACTION_PRINT_PREVIEW(composer) \
+	E_COMPOSER_ACTION ((composer), "print-preview")
+#define E_COMPOSER_ACTION_SAVE(composer) \
+	E_COMPOSER_ACTION ((composer), "save")
+#define E_COMPOSER_ACTION_SAVE_AS(composer) \
+	E_COMPOSER_ACTION ((composer), "save-as")
+#define E_COMPOSER_ACTION_SAVE_DRAFT(composer) \
+	E_COMPOSER_ACTION ((composer), "save-draft")
+#define E_COMPOSER_ACTION_SEND(composer) \
+	E_COMPOSER_ACTION ((composer), "send")
+
+#endif /* E_COMPOSER_ACTIONS_H */

Added: branches/mbarnes-composer/composer/e-composer-private.h
==============================================================================
--- (empty file)
+++ branches/mbarnes-composer/composer/e-composer-private.h	Wed Feb  6 00:09:08 2008
@@ -0,0 +1,86 @@
+#ifndef E_COMPOSER_PRIVATE_H
+#define E_COMPOSER_PRIVATE_H
+
+#include "e-composer-common.h"
+
+#include <glib/gi18n.h>
+
+#include "e-msg-composer.h"
+#include "e-composer-actions.h"
+#include "e-composer-autosave.h"
+#include "e-composer-header-table.h"
+
+#define E_MSG_COMPOSER_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), E_TYPE_MSG_COMPOSER, EMsgComposerPrivate))
+
+/* Shorthand, requires a variable named "composer". */
+#define ACTION(name)	(E_COMPOSER_ACTION_##name (composer))
+
+G_BEGIN_DECLS
+
+struct _EMsgComposerPrivate {
+
+	/*** UI Management ***/
+
+	GtkWidget *html_editor;
+	GtkWidget *header_table;
+	GtkActionGroup *action_group;
+
+	gint visible_mask;
+	GPtrArray *extra_hdr_names, *extra_hdr_values;
+
+	GtkWidget *focused_entry;
+
+	GtkWidget *attachment_bar;
+	GtkWidget *attachment_scrolled_window;
+	GtkWidget *attachment_expander;
+	GtkWidget *attachment_expander_label;
+	GtkWidget *attachment_expander_icon;
+	GtkWidget *attachment_expander_num;
+
+	GtkWidget *address_dialog;
+
+	GHashTable *inline_images;
+	GHashTable *inline_images_by_url;
+	GList *current_images;
+
+	gchar *mime_type, *mime_body, *charset;
+
+	guint32 attachment_bar_visible : 1;
+	guint32 send_html              : 1;
+	guint32 is_alternative         : 1;
+	guint32 pgp_sign               : 1;
+	guint32 pgp_encrypt            : 1;
+	guint32 smime_sign             : 1;
+	guint32 smime_encrypt          : 1;
+	guint32 view_from              : 1;
+	guint32 view_replyto           : 1;
+	guint32 view_to                : 1;
+	guint32 view_postto            : 1;
+	guint32 view_bcc               : 1;
+	guint32 view_cc                : 1;
+	guint32 view_subject           : 1;
+	guint32 request_receipt        : 1;
+	guint32 set_priority	       : 1;
+	guint32 has_changed            : 1;
+	guint32 autosaved              : 1;
+
+	guint32 mode_post              : 1;
+
+	guint32 in_signature_insert    : 1;
+
+	CamelMimeMessage *redirect;
+
+	guint notify_id;
+
+	gboolean send_invoked;
+
+	GtkWidget *saveas;	/* saveas async file requester */
+	GtkWidget *load;	/* same for load - not used */
+
+};
+
+G_END_DECLS
+
+#endif /* E_COMPOSER_PRIVATE_H */

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	Wed Feb  6 00:09:08 2008
@@ -68,12 +68,6 @@
 #include <libgnomeui/gnome-uidefs.h>
 #include <libgnomeui/gnome-window-icon.h>
 
-#include <bonobo/bonobo-exception.h>
-#include <bonobo/bonobo-moniker-util.h>
-#include <bonobo/bonobo-stream-memory.h>
-#include <bonobo/bonobo-ui-util.h>
-#include <bonobo/bonobo-widget.h>
-
 #include <libgnomevfs/gnome-vfs.h>
 
 #include <glade/glade.h>
@@ -119,6 +113,7 @@
 #include "e-attachment.h"
 #include "e-attachment-bar.h"
 #include "e-composer-autosave.h"
+#include "e-composer-private.h"
 #include "e-composer-header-table.h"
 #include "e-msg-composer-select-file.h"
 
@@ -173,75 +168,6 @@
 	E_MSG_COMPOSER_VISIBLE_SUBJECT    = (1 << 7)
 } EMsgComposerHeaderVisibleFlags;
 
-struct _EMsgComposerPrivate {
-
-/* Main UIComponent */
-	BonoboUIComponent *uic;
-
-	/* UIComponent for the non-control GtkEntries */
-	BonoboUIComponent *entry_uic;
-
-	gint visible_mask;
-	GtkWidget *header_table;
-	GPtrArray *extra_hdr_names, *extra_hdr_values;
-
-	GtkWidget *focused_entry;
-
-	GtkWidget *eeditor;
-
-	GtkWidget *attachment_bar;
-	GtkWidget *attachment_scrolled_window;
-	GtkWidget *attachment_expander;
-	GtkWidget *attachment_expander_label;
-	GtkWidget *attachment_expander_icon;
-	GtkWidget *attachment_expander_num;
-
-	GtkWidget *address_dialog;
-
-	Bonobo_PersistFile       persist_file_interface;
-	Bonobo_PersistStream     persist_stream_interface;
-	GNOME_GtkHTML_Editor_Engine  eeditor_engine;
-	BonoboObject            *eeditor_listener;
-	GHashTable              *inline_images, *inline_images_by_url;
-	GList                   *current_images;
-
-	gchar *mime_type, *mime_body, *charset;
-
-	guint32 attachment_bar_visible : 1;
-	guint32 send_html              : 1;
-	guint32 is_alternative         : 1;
-	guint32 pgp_sign               : 1;
-	guint32 pgp_encrypt            : 1;
-	guint32 smime_sign             : 1;
-	guint32 smime_encrypt          : 1;
-	guint32 view_from              : 1;
-	guint32 view_replyto           : 1;
-	guint32 view_to                : 1;
-	guint32 view_postto            : 1;
-	guint32 view_bcc               : 1;
-	guint32 view_cc                : 1;
-	guint32 view_subject           : 1;
-	guint32 request_receipt        : 1;
-	guint32 set_priority	       : 1;
-	guint32 has_changed            : 1;
-	guint32 autosaved              : 1;
-
-	guint32 mode_post              : 1;
-
-	guint32 in_signature_insert    : 1;
-
-	CamelMimeMessage *redirect;
-
-	guint notify_id;
-
-	gboolean send_invoked;
-	EMMenu *menu;
-
-	GtkWidget *saveas;	/* saveas async file requester */
-	GtkWidget *load;	/* same for load - not used */
-
-};
-
 enum {
 	SEND,
 	SAVE_DRAFT,
@@ -307,6 +233,7 @@
 static void handle_multipart_signed (EMsgComposer *composer, CamelMultipart *multipart, gint depth);
 
 static void set_editor_signature (EMsgComposer *composer);
+static void do_exit (EMsgComposer *composer);
 
 /* used by e_msg_composer for showing the help menu item */
 static void e_msg_composer_show_help (EMsgComposer *composer);
@@ -341,35 +268,6 @@
 	return destination_list_to_vector_sized (list, -1);
 }
 
-static GByteArray *
-get_text (Bonobo_PersistStream persist, gchar *format)
-{
-	BonoboStream *stream;
-	BonoboStreamMem *stream_mem;
-	CORBA_Environment ev;
-	GByteArray *text;
-
-	CORBA_exception_init (&ev);
-
-	stream = bonobo_stream_mem_create (NULL, 0, FALSE, TRUE);
-	Bonobo_PersistStream_save (persist, (Bonobo_Stream)bonobo_object_corba_objref (BONOBO_OBJECT (stream)),
-				   format, &ev);
-	if (ev._major != CORBA_NO_EXCEPTION) {
-		g_warning ("Exception getting mail '%s'",
-			   bonobo_exception_get_text (&ev));
-		return NULL;
-	}
-
-	CORBA_exception_free (&ev);
-
-	stream_mem = BONOBO_STREAM_MEM (stream);
-	text = g_byte_array_new ();
-	g_byte_array_append (text, (const guint8 *)stream_mem->buffer, stream_mem->pos);
-	bonobo_object_unref (BONOBO_OBJECT (stream));
-
-	return text;
-}
-
 #define LINE_LEN 72
 
 static CamelTransferEncoding
@@ -682,6 +580,7 @@
 static CamelMimeMessage *
 build_message (EMsgComposer *composer, gboolean save_html_object_data)
 {
+	GtkhtmlEditor *editor;
 	EMsgComposerPrivate *p = composer->priv;
 
 	EAttachmentBar *attachment_bar =
@@ -702,12 +601,12 @@
 	gchar *charset;
 	gint i;
 
+	g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL);
+
+	editor = GTKHTML_EDITOR (composer);
 	table = e_msg_composer_get_header_table (composer);
 	account = e_composer_header_table_get_account (table);
 
-	if (p->persist_stream_interface == CORBA_OBJECT_NIL)
-		return NULL;
-
 	/* evil kludgy hack for Redirect */
 	if (p->redirect) {
 		build_message_headers (composer, p->redirect, TRUE);
@@ -748,12 +647,13 @@
 		g_byte_array_append (data, (const guint8 *)p->mime_body, strlen (p->mime_body));
 		type = camel_content_type_decode (p->mime_type);
 	} else {
-		data = get_text (p->persist_stream_interface, "text/plain");
-		if (!data) {
-			/* The component has probably died */
-			camel_object_unref (CAMEL_OBJECT (new));
-			return NULL;
-		}
+		gchar *text;
+		gsize length;
+
+		data = g_byte_array_new ();
+		text = gtkhtml_editor_get_text_plain (editor, &length);
+		g_byte_array_append (data, (guint8 *) text, (guint) length);
+		g_free (text);
 
 		/* FIXME: we may want to do better than this... */
 
@@ -790,25 +690,21 @@
 	camel_content_type_unref (type);
 
 	if (p->send_html) {
-		CORBA_Environment ev;
+		gchar *text;
+		gsize length;
+
 		clear_current_images (composer);
 
-		if (save_html_object_data) {
-			CORBA_exception_init (&ev);
-			GNOME_GtkHTML_Editor_Engine_runCommand (p->eeditor_engine, "save-data-on", &ev);
-		}
-		data = get_text (p->persist_stream_interface, "text/html");
-		if (save_html_object_data) {
-			GNOME_GtkHTML_Editor_Engine_runCommand (p->eeditor_engine, "save-data-off", &ev);
-			CORBA_exception_free (&ev);
-		}
+		if (save_html_object_data)
+			gtkhtml_editor_run_command (editor, "save-data-on");
 
-		if (!data) {
-			/* The component has probably died */
-			camel_object_unref (new);
-			camel_object_unref (plain);
-			return NULL;
-		}
+		data = g_byte_array_new ();
+		text = gtkhtml_editor_get_text_html (editor, &length);
+		g_byte_array_append (data, (guint8 *) text, (guint) length);
+		g_free (text);
+
+		if (save_html_object_data)
+			gtkhtml_editor_run_command (editor, "save-data-off");
 
 		html = camel_data_wrapper_new ();
 
@@ -1000,14 +896,14 @@
 		if (p->smime_sign
 		    && (account == NULL || account->smime_sign_key == NULL || account->smime_sign_key[0] == 0)) {
 			camel_exception_set (&ex, CAMEL_EXCEPTION_SYSTEM,
-					     _ ("Cannot sign outgoing message: No signing certificate set for this account"));
+					     _("Cannot sign outgoing message: No signing certificate set for this account"));
 			goto exception;
 		}
 
 		if (p->smime_encrypt
 		    && (account == NULL || account->smime_sign_key == NULL || account->smime_sign_key[0] == 0)) {
 			camel_exception_set (&ex, CAMEL_EXCEPTION_SYSTEM,
-					     _ ("Cannot encrypt outgoing message: No encryption certificate set for this account"));
+					     _("Cannot encrypt outgoing message: No encryption certificate set for this account"));
 			goto exception;
 		}
 
@@ -1209,58 +1105,22 @@
 static void
 prepare_engine (EMsgComposer *composer)
 {
-	CORBA_Environment ev;
-	EMsgComposerPrivate *p = composer->priv;
-
-	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
+	GConfClient *client;
+	gchar *path;
 
-	/* printf ("prepare_engine\n"); */
+	/* FIXME Move this to msg_composer_init () */
 
-	CORBA_exception_init (&ev);
-	p->eeditor_engine = (GNOME_GtkHTML_Editor_Engine) Bonobo_Unknown_queryInterface
-		(bonobo_widget_get_objref (BONOBO_WIDGET (p->eeditor)), "IDL:GNOME/GtkHTML/Editor/Engine:1.0", &ev);
-	if ((p->eeditor_engine != CORBA_OBJECT_NIL) && (ev._major == CORBA_NO_EXCEPTION)) {
-
-		/* printf ("trying set listener\n"); */
-		p->eeditor_listener = BONOBO_OBJECT (listener_new (composer));
-		if (p->eeditor_listener != NULL)
-			GNOME_GtkHTML_Editor_Engine__set_listener (p->eeditor_engine,
-								   (GNOME_GtkHTML_Editor_Listener)
-								   bonobo_object_dup_ref
-								   (bonobo_object_corba_objref (p->eeditor_listener),
-								    &ev),
-								   &ev);
-
-		if ((ev._major != CORBA_NO_EXCEPTION) || (p->eeditor_listener == NULL)) {
-			CORBA_Environment err_ev;
-
-			CORBA_exception_init (&err_ev);
-
-			Bonobo_Unknown_unref (p->eeditor_engine, &err_ev);
-			CORBA_Object_release (p->eeditor_engine, &err_ev);
-
-			CORBA_exception_free (&err_ev);
-
-			p->eeditor_engine = CORBA_OBJECT_NIL;
-			g_warning ("Can't establish Editor Listener\n");
-		} else {
-			gchar *path;
-			GConfClient *gconf = gconf_client_get_default ();
-
-			path = gconf_client_get_string (gconf, COMPOSER_CURRENT_FOLDER_KEY, NULL);
-			g_object_unref (gconf);
-
-			/* change it only if we have set path before */
-			if (path && *path)
-				e_msg_composer_set_attach_path (composer, path);
-			g_free (path);
-		}
-	} else {
-		p->eeditor_engine = CORBA_OBJECT_NIL;
-		g_warning ("Can't get Editor Engine\n");
-	}
+	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
 
-	CORBA_exception_free (&ev);
+	client = gconf_client_get_default ();
+	path = gconf_client_get_string (
+		client, COMPOSER_CURRENT_FOLDER_KEY, NULL);
+	g_object_unref (client);
+
+	/* change it only if we have set path before */
+	if (path && *path)
+		e_msg_composer_set_attach_path (composer, path);
+	g_free (path);
 }
 
 /**
@@ -1279,6 +1139,9 @@
 	g_return_if_fail (composer != NULL);
 	g_return_if_fail (path != NULL);
 
+	/* FIXME Listen for property change notifications.
+	 *       (Remind me again why we can't use GConfBridge?) */
+
 	gconf = gconf_client_get_default ();
 	gconf_client_set_string (gconf, COMPOSER_CURRENT_FOLDER_KEY, path, &error);
 	g_object_unref (gconf);
@@ -1288,18 +1151,7 @@
 		g_error_free (error);
 	}
 
-	if (composer->priv->eeditor_engine) {
-		CORBA_Environment ev;
-
-		CORBA_exception_init (&ev);
-	
-		GNOME_GtkHTML_Editor_Engine_setFilePath (composer->priv->eeditor_engine, path, &ev);
-
-		CORBA_exception_free (&ev);
-	}
-
-	/* do this as last thing here, so we can do e_msg_composer_set_attach_path (composer, e_msg_composer_get_attach_path (composer)) */
-	g_object_set_data_full ((GObject *) composer, "attach_path", g_strdup (path), g_free);
+	gtkhtml_editor_set_current_folder (GTKHTML_EDITOR (composer), path);
 }
 
 /**
@@ -1311,24 +1163,9 @@
 const gchar *
 e_msg_composer_get_attach_path (EMsgComposer *composer)
 {
-	g_return_val_if_fail (composer != NULL, g_object_get_data ((GObject *) composer, "attach_path"));
-
-	if (composer->priv->eeditor_engine) {
-		gchar *str;
-		CORBA_Environment ev;
-
-		CORBA_exception_init (&ev);
-
-		str = GNOME_GtkHTML_Editor_Engine_getFilePath (composer->priv->eeditor_engine, &ev);
-		if (ev._major == CORBA_NO_EXCEPTION && str)
-			e_msg_composer_set_attach_path (composer, str);
-		if (str)
-			CORBA_free (str);
-
-		CORBA_exception_free (&ev);
-	}
+	g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL);
 
-	return g_object_get_data ((GObject *) composer, "attach_path");
+	return gtkhtml_editor_get_current_folder (GTKHTML_EDITOR (composer));
 }
 
 static gchar *
@@ -1504,22 +1341,16 @@
 }
 
 static void
-set_editor_text (EMsgComposer *composer, const gchar *text, ssize_t len, gint set_signature, gint pad_signature)
+set_editor_text (EMsgComposer *composer,
+                 const gchar *text,
+                 gboolean set_signature)
 {
-	EMsgComposerPrivate *p = composer->priv;
-	Bonobo_PersistStream persist;
-	BonoboStream *stream;
-	CORBA_Environment ev;
-	Bonobo_Unknown object;
 	gboolean reply_signature_on_top;
 	gchar *body = NULL, *html = NULL;
 	GConfClient *gconf;
 
-	g_return_if_fail (p->persist_stream_interface != CORBA_OBJECT_NIL);
-
-	persist = p->persist_stream_interface;
-
-	CORBA_exception_init (&ev);
+	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
+	g_return_if_fail (text != NULL);
 
 	gconf = gconf_client_get_default ();
 
@@ -1566,23 +1397,7 @@
 		body = g_strdup (text);
 	}
 
-	if (body) {
-		len = strlen (body);
-	}
-
-	stream = bonobo_stream_mem_create (body, len, TRUE, FALSE);
-	object = bonobo_object_corba_objref (BONOBO_OBJECT (stream));
-	Bonobo_PersistStream_load (persist, (Bonobo_Stream) object, "text/html", &ev);
-	if (ev._major != CORBA_NO_EXCEPTION) {
-		/* FIXME. Some error message. */
-		bonobo_object_unref (BONOBO_OBJECT (stream));
-		CORBA_exception_free (&ev);
-		return;
-	}
-
-	CORBA_exception_free (&ev);
-
-	bonobo_object_unref (BONOBO_OBJECT (stream));
+	gtkhtml_editor_set_text_html (GTKHTML_EDITOR (composer), body, -1);
 
 	if (set_signature && !reply_signature_on_top)
 		e_msg_composer_show_sig_file (composer);
@@ -1599,17 +1414,16 @@
 	e_expander_set_expanded (E_EXPANDER (p->attachment_expander), show);
 	if (show)
 		gtk_label_set_text_with_mnemonic (GTK_LABEL (composer->priv->attachment_expander_label),
-		_ ("Hide _Attachment Bar"));
+		_("Hide _Attachment Bar"));
 	else
 		gtk_label_set_text_with_mnemonic (GTK_LABEL (composer->priv->attachment_expander_label),
-		_ ("Show _Attachment Bar"));
+		_("Show _Attachment Bar"));
 }
 
 static void
 save (EMsgComposer *composer, const gchar *filename)
 {
-	EMsgComposerPrivate *p = composer->priv;
-	CORBA_Environment ev;
+#if 0  /* GTKHTML-EDITOR */
 	gint fd;
 
 	/* check to see if we already have the file and that we can create it */
@@ -1628,18 +1442,9 @@
 	} else
 		close (fd);
 
-	CORBA_exception_init (&ev);
-
-	Bonobo_PersistFile_save (p->persist_file_interface, filename, &ev);
-
-	if (ev._major != CORBA_NO_EXCEPTION) {
-		e_error_run ((GtkWindow *)composer, E_ERROR_NO_SAVE_FILE,
-			    filename, _ ("Unknown reason"));
-	} else {
-		GNOME_GtkHTML_Editor_Engine_runCommand (p->eeditor_engine, "saved", &ev);
-		e_msg_composer_unset_autosaved (composer);
-	}
-	CORBA_exception_free (&ev);
+	gtkhtml_editor_run_command (GTKHTML_EDITOR (composer), "saved");
+	e_composer_autosave_set_saved (composer, FALSE);
+#endif /* GTKHTML-EDITOR */
 }
 
 static void
@@ -1653,24 +1458,25 @@
 {
 	EMsgComposerPrivate *p = composer->priv;
 
-	e_msg_composer_select_file (composer, &p->saveas, saveas_response, _ ("Save as..."), TRUE);
+	e_msg_composer_select_file (composer, &p->saveas, saveas_response, _("Save as..."), TRUE);
 }
 
 static void
-load (EMsgComposer *composer, const gchar *file_name)
+load (EMsgComposer *composer, const gchar *filename)
 {
-	EMsgComposerPrivate *p = composer->priv;
-	CORBA_Environment ev;
-
-	CORBA_exception_init (&ev);
-
-	Bonobo_PersistFile_load (p->persist_file_interface, file_name, &ev);
-
-	if (ev._major != CORBA_NO_EXCEPTION)
-		e_error_run ((GtkWindow *)composer, E_ERROR_NO_LOAD_FILE,
-			    file_name, _ ("Unknown reason"), NULL);
+	GtkhtmlEditor *editor = GTKHTML_EDITOR (composer);
+	gchar *contents;
+	gsize length;
+	GError *error = NULL;
 
-	CORBA_exception_free (&ev);
+	if (g_file_get_contents (filename, &contents, &length, &error))
+		gtkhtml_editor_set_text_html (editor, contents, length);
+	else {
+		e_error_run (
+			GTK_WINDOW (editor), E_ERROR_NO_LOAD_FILE,
+			filename, error->message, NULL);
+		g_error_free (error);
+	}
 }
 
 static EMsgComposer *
@@ -1739,70 +1545,13 @@
 	e_msg_composer_unset_autosaved (E_MSG_COMPOSER (data));
 }
 
-/* Exit dialog.  (Displays a "Save composition to 'Drafts' before exiting?" warning before actually exiting.)  */
-
-static void
-do_exit (EMsgComposer *composer)
-{
-	EComposerHeaderTable *table;
-	const gchar *subject;
-	gint button;
-
-	if (!e_msg_composer_is_dirty (composer) && !e_msg_composer_is_autosaved (composer)) {
-		gtk_widget_destroy (GTK_WIDGET (composer));
-		return;
-	}
-
-	gdk_window_raise (GTK_WIDGET (composer)->window);
-
-	table = e_msg_composer_get_header_table (composer);
-	subject = e_composer_header_table_get_subject (table);
-
-	button = e_error_run ((GtkWindow *)composer, "mail-composer:exit-unsaved",
-			     subject && subject[0] ? subject : _ ("Untitled Message"), NULL);
-
-	switch (button) {
-	case GTK_RESPONSE_YES:
-		/* Save */
-		g_signal_emit (GTK_OBJECT (composer), signals[SAVE_DRAFT], 0, TRUE);
-		e_msg_composer_unset_changed (composer);
-		e_msg_composer_unset_autosaved (composer);
-		gtk_widget_destroy (GTK_WIDGET (composer));
-		break;
-	case GTK_RESPONSE_NO:
-		/* Don't save */
-		gtk_widget_destroy (GTK_WIDGET (composer));
-		break;
-	case GTK_RESPONSE_CANCEL:
-		break;
-	}
-}
-
 /* Menu callbacks.  */
 static void
-file_open_response (EMsgComposer *composer, const gchar *name)
-{
-	load (composer, name);
-}
-
-static void
-menu_file_open_cb (BonoboUIComponent *uic,
-		   gpointer data,
-		   const gchar *path)
-{
-	EMsgComposer *composer = E_MSG_COMPOSER (data);
-	EMsgComposerPrivate *p = composer->priv;
-
-	/* NB: This function is never used anymore */
-
-	e_msg_composer_select_file (composer, &p->load, file_open_response, _ ("Open File"), FALSE);
-}
-
-static void
 menu_file_save_cb (BonoboUIComponent *uic,
 		   gpointer data,
-		   const gchar *path)
+		   const char *path)
 {
+#if 0  /* GTKHTML-EDITOR */
 	EMsgComposer *composer = E_MSG_COMPOSER (data);
 	EMsgComposerPrivate *p = composer->priv;
 	CORBA_char *file_name;
@@ -1819,20 +1568,21 @@
 		CORBA_free (file_name);
 	}
       	CORBA_exception_free (&ev);
+#endif /* GTKHTML-EDITOR */
 }
 
 static void
 menu_file_save_as_cb (BonoboUIComponent *uic,
 		      gpointer data,
-		      const gchar *path)
+		      const char *path)
 {
-	saveas (E_MSG_COMPOSER (data));
+	saveas (E_MSG_COMPOSER(data));
 }
 
 static void
 menu_file_send_cb (BonoboUIComponent *uic,
 		   gpointer data,
-		   const gchar *path)
+		   const char *path)
 {
 	g_signal_emit (GTK_OBJECT (data), signals[SEND], 0);
 }
@@ -1840,7 +1590,7 @@
 static void
 menu_file_close_cb (BonoboUIComponent *uic,
 		    gpointer data,
-		    const gchar *path)
+		    const char *path)
 {
 	EMsgComposer *composer;
 
@@ -1852,7 +1602,7 @@
 static void
 menu_help_cb (BonoboUIComponent *uic,
 	      gpointer data,
-	      const gchar *path)
+	      const char *path)
 {
 	EMsgComposer *composer = (EMsgComposer *) data;
 
@@ -1861,7 +1611,7 @@
 
 
 static void
-add_to_bar (EMsgComposer *composer, GSList *names, gint is_inline)
+add_to_bar (EMsgComposer *composer, GSList *names, int is_inline)
 {
 	EMsgComposerPrivate *p = composer->priv;
 
@@ -1885,18 +1635,18 @@
 static void
 menu_file_add_attachment_cb (BonoboUIComponent *uic,
 			     gpointer data,
-			     const gchar *path)
+			     const char *path)
 {
 	EMsgComposer *composer = E_MSG_COMPOSER (data);
 	EMsgComposerPrivate *p = composer->priv;
 	EMsgComposer *toplevel = E_MSG_COMPOSER (gtk_widget_get_toplevel (GTK_WIDGET (p->attachment_bar)));
-	GtkWidget **attachment_selector = e_attachment_bar_get_selector (E_ATTACHMENT_BAR (p->attachment_bar));
+	GtkWidget **attachment_selector = e_attachment_bar_get_selector (E_ATTACHMENT_BAR(p->attachment_bar));
 
 	e_msg_composer_select_file_attachments (toplevel, attachment_selector, add_to_bar);
 }
 
 static void
-menu_edit_cut_cb (BonoboUIComponent *uic, gpointer data, const gchar *path)
+menu_edit_cut_cb (BonoboUIComponent *uic, gpointer data, const char *path)
 {
 	EMsgComposer *composer = data;
 	EMsgComposerPrivate *p = composer->priv;
@@ -1912,7 +1662,7 @@
 }
 
 static void
-menu_edit_copy_cb (BonoboUIComponent *uic, gpointer data, const gchar *path)
+menu_edit_copy_cb (BonoboUIComponent *uic, gpointer data, const char *path)
 {
 	EMsgComposer *composer = data;
 	EMsgComposerPrivate *p = composer->priv;
@@ -1928,7 +1678,7 @@
 }
 
 static void
-menu_edit_paste_cb (BonoboUIComponent *uic, gpointer data, const gchar *path)
+menu_edit_paste_cb (BonoboUIComponent *uic, gpointer data, const char *path)
 {
 	EMsgComposer *composer = data;
 	EMsgComposerPrivate *p = composer->priv;
@@ -1944,7 +1694,7 @@
 }
 
 static void
-menu_send_options_cb (BonoboUIComponent *component, gpointer data, const gchar *path)
+menu_send_options_cb (BonoboUIComponent *component, gpointer data, const char *path)
 {
 	EMEvent *e = em_event_peek ();
 	EMEventTargetComposer  *target;
@@ -1959,7 +1709,7 @@
 }
 
 static void
-menu_edit_select_all_cb (BonoboUIComponent *uic, gpointer data, const gchar *path)
+menu_edit_select_all_cb (BonoboUIComponent *uic, gpointer data, const char *path)
 {
 	EMsgComposer *composer = data;
 	EMsgComposerPrivate *p = composer->priv;
@@ -1976,8 +1726,9 @@
 }
 
 static void
-menu_edit_delete_all_cb (BonoboUIComponent *uic, gpointer data, const gchar *path)
+menu_edit_delete_all_cb (BonoboUIComponent *uic, gpointer data, const char *path)
 {
+#if 0  /* GTKHTML-EDITOR */
 	EMsgComposer *composer = E_MSG_COMPOSER (data);
 	EMsgComposerPrivate *p = composer->priv;
 	CORBA_Environment ev;
@@ -2003,13 +1754,14 @@
 
 	CORBA_exception_free (&ev);
 	/* printf ("delete all\n"); */
+#endif /* GTKHTML-EDITOR */
 }
 
 static void
 menu_format_html_cb (BonoboUIComponent           *component,
-		     const gchar                  *path,
+		     const char                  *path,
 		     Bonobo_UIComponent_EventType type,
-		     const gchar                  *state,
+		     const char                  *state,
 		     gpointer                     user_data)
 
 {
@@ -2021,9 +1773,9 @@
 
 static void
 menu_security_pgp_sign_cb (BonoboUIComponent           *component,
-			   const gchar                  *path,
+			   const char                  *path,
 			   Bonobo_UIComponent_EventType type,
-			   const gchar                  *state,
+			   const char                  *state,
 			   gpointer                     composer)
 
 {
@@ -2035,9 +1787,9 @@
 
 static void
 menu_security_pgp_encrypt_cb (BonoboUIComponent           *component,
-			      const gchar                  *path,
+			      const char                  *path,
 			      Bonobo_UIComponent_EventType type,
-			      const gchar                  *state,
+			      const char                  *state,
 			      gpointer                     composer)
 
 {
@@ -2049,9 +1801,9 @@
 
 static void
 menu_security_smime_sign_cb (BonoboUIComponent           *component,
-			     const gchar                  *path,
+			     const char                  *path,
 			     Bonobo_UIComponent_EventType type,
-			     const gchar                  *state,
+			     const char                  *state,
 			     gpointer                     composer)
 
 {
@@ -2063,9 +1815,9 @@
 
 static void
 menu_security_smime_encrypt_cb (BonoboUIComponent           *component,
-				const gchar                  *path,
+				const char                  *path,
 				Bonobo_UIComponent_EventType type,
-				const gchar                  *state,
+				const char                  *state,
 				gpointer                     composer)
 
 {
@@ -2078,9 +1830,9 @@
 
 static void
 menu_view_from_cb (BonoboUIComponent           *component,
-		   const gchar                  *path,
+		   const char                  *path,
 		   Bonobo_UIComponent_EventType type,
-		   const gchar                  *state,
+		   const char                  *state,
 		   gpointer                     user_data)
 {
 	if (type != Bonobo_UIComponent_STATE_CHANGED)
@@ -2091,9 +1843,9 @@
 
 static void
 menu_view_replyto_cb (BonoboUIComponent           *component,
-		      const gchar                  *path,
+		      const char                  *path,
 		      Bonobo_UIComponent_EventType type,
-		      const gchar                  *state,
+		      const char                  *state,
 		      gpointer                     user_data)
 {
 	if (type != Bonobo_UIComponent_STATE_CHANGED)
@@ -2104,9 +1856,9 @@
 
 static void
 menu_view_to_cb (BonoboUIComponent           *component,
-		      const gchar                  *path,
+		      const char                  *path,
 		      Bonobo_UIComponent_EventType type,
-		      const gchar                  *state,
+		      const char                  *state,
 		      gpointer                     user_data)
 {
 	if (type != Bonobo_UIComponent_STATE_CHANGED)
@@ -2117,9 +1869,9 @@
 
 static void
 menu_view_postto_cb (BonoboUIComponent           *component,
-		      const gchar                  *path,
+		      const char                  *path,
 		      Bonobo_UIComponent_EventType type,
-		      const gchar                  *state,
+		      const char                  *state,
 		      gpointer                     user_data)
 {
 	if (type != Bonobo_UIComponent_STATE_CHANGED)
@@ -2130,9 +1882,9 @@
 
 static void
 menu_view_cc_cb (BonoboUIComponent           *component,
-		 const gchar                  *path,
+		 const char                  *path,
 		 Bonobo_UIComponent_EventType type,
-		 const gchar                  *state,
+		 const char                  *state,
 		 gpointer                     user_data)
 {
 	if (type != Bonobo_UIComponent_STATE_CHANGED)
@@ -2143,9 +1895,9 @@
 
 static void
 menu_view_bcc_cb (BonoboUIComponent           *component,
-		  const gchar                  *path,
+		  const char                  *path,
 		  Bonobo_UIComponent_EventType type,
-		  const gchar                  *state,
+		  const char                  *state,
 		  gpointer                     user_data)
 {
 	if (type != Bonobo_UIComponent_STATE_CHANGED)
@@ -2156,9 +1908,9 @@
 
 static void
 menu_insert_receipt_cb (BonoboUIComponent           *component,
-			const gchar                  *path,
+			const char                  *path,
 			Bonobo_UIComponent_EventType type,
-			const gchar                  *state,
+			const char                  *state,
 			gpointer                     user_data)
 {
 	if (type != Bonobo_UIComponent_STATE_CHANGED)
@@ -2169,9 +1921,9 @@
 
 static void
 menu_insert_priority_cb (BonoboUIComponent           *component,
-			const gchar                  *path,
+			const char                  *path,
 			Bonobo_UIComponent_EventType type,
-			const gchar                  *state,
+			const char                  *state,
 			gpointer                     user_data)
 {
 	if (type != Bonobo_UIComponent_STATE_CHANGED)
@@ -2182,9 +1934,9 @@
 
 static void
 menu_changed_charset_cb (BonoboUIComponent           *component,
-			 const gchar                  *path,
+			 const char                  *path,
 			 Bonobo_UIComponent_EventType type,
-			 const gchar                  *state,
+			 const char                  *state,
 			 gpointer                     user_data)
 {
 	if (type != Bonobo_UIComponent_STATE_CHANGED)
@@ -2202,7 +1954,6 @@
 
 static BonoboUIVerb verbs [] = {
 
-	BONOBO_UI_VERB ("FileOpen", menu_file_open_cb),
 	BONOBO_UI_VERB ("FileSave", menu_file_save_cb),
 	BONOBO_UI_VERB ("FileSaveAs", menu_file_save_as_cb),
 	BONOBO_UI_VERB ("FileSaveDraft", menu_file_save_draft_cb),
@@ -2234,15 +1985,17 @@
 	E_PIXMAP_END
 };
 
+
 static void
 setup_ui (EMsgComposer *composer)
 {
+#if 0 /* GTKHTML-EDITOR */
 	EMMenuTargetWidget *target;
 	EMsgComposerPrivate *p = composer->priv;
 	BonoboUIContainer *container;
 	gboolean hide_smime;
-	gchar *charset;
-	gchar *xmlfile;
+	char *charset;
+	char *xmlfile;
 
 	container = bonobo_window_get_ui_container (BONOBO_WINDOW (composer));
 
@@ -2409,6 +2162,7 @@
 	target = em_menu_target_new_widget (p->menu, (GtkWidget *)composer);
 	e_menu_update_target ((EMenu *)p->menu, target);
 	e_menu_activate ((EMenu *)p->menu, p->uic, TRUE);
+#endif /* GTKHTML-EDITOR */
 }
 
 
@@ -2444,6 +2198,7 @@
 	   changes on close */
 	e_msg_composer_set_changed (composer);
 }
+
 static void
 attachment_expander_activate_cb (EExpander *expander,
 				void      *data)
@@ -2454,11 +2209,12 @@
 	/* Update the expander label */
 	if (show)
 		gtk_label_set_text_with_mnemonic (GTK_LABEL (composer->priv->attachment_expander_label),
-		_ ("Hide _Attachment Bar"));
+		_("Hide _Attachment Bar"));
 	else
 		gtk_label_set_text_with_mnemonic (GTK_LABEL (composer->priv->attachment_expander_label),
-		_ ("Show _Attachment Bar"));
- }
+		_("Show _Attachment Bar"));
+}
+
 static void
 subject_changed_cb (EMsgComposer *composer)
 {
@@ -2469,7 +2225,7 @@
 	subject = e_composer_header_table_get_subject (table);
 
 	if (subject == NULL || *subject == '\0')
-		subject = _ ("Compose Message");
+		subject = _("Compose Message");
 
 	gtk_window_set_title (GTK_WINDOW (composer), subject);
 }
@@ -2480,7 +2236,7 @@
 };
 
 static void
-update_auto_recipients (EComposerHeaderTable *table, gint mode, const gchar *auto_addrs)
+update_auto_recipients (EComposerHeaderTable *table, int mode, const char *auto_addrs)
 {
 	EDestination *dest, **destv = NULL;
 	CamelInternetAddress *iaddr;
@@ -2663,11 +2419,13 @@
 
 	CORBA_exception_init (&ev);
 
+#if 0 /* GTKHTML-EDITOR */
 	if (p->menu) {
 		e_menu_update_target ((EMenu *)p->menu, NULL);
 		g_object_unref (p->menu);
 		p->menu = NULL;
 	}
+#endif
 
 	if (p->load) {
 		gtk_widget_destroy (p->load);
@@ -2679,6 +2437,7 @@
 		p->saveas = NULL;
 	}
 
+#if 0 /* GTKHTML-EDITOR */
 	if (p->uic) {
 		bonobo_object_unref (BONOBO_OBJECT (p->uic));
 		p->uic = NULL;
@@ -2688,6 +2447,7 @@
 		bonobo_object_unref (BONOBO_OBJECT (p->entry_uic));
 		p->entry_uic = NULL;
 	}
+#endif
 
 	/* FIXME?  I assume the Bonobo widget will get destroyed
 	   normally?  */
@@ -2708,6 +2468,7 @@
 		g_object_unref (gconf);
 	}
 
+#if 0 /* GTKHTML-EDITOR */
 	if (p->persist_stream_interface != CORBA_OBJECT_NIL) {
 		Bonobo_Unknown_unref (p->persist_stream_interface, &ev);
 		CORBA_Object_release (p->persist_stream_interface, &ev);
@@ -2732,6 +2493,7 @@
 		bonobo_object_unref (p->eeditor_listener);
 		p->eeditor_listener = NULL;
 	}
+#endif
 
 	/* Chain up to parent's destroy () method. */
 	GTK_OBJECT_CLASS (parent_class)->destroy (object);
@@ -2755,9 +2517,9 @@
 
 /* GtkWidget methods.  */
 
-static gint
+static int
 msg_composer_delete_event (GtkWidget *widget,
-                           GdkEventAny *event)
+	                   GdkEventAny *event)
 {
 	do_exit (E_MSG_COMPOSER (widget));
 
@@ -2768,23 +2530,23 @@
 attach_message (EMsgComposer *composer, CamelMimeMessage *msg)
 {
 	CamelMimePart *mime_part;
-	const gchar *subject;
+	const char *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) {
-		gchar *desc = g_strdup_printf (_ ("Attached message - %s"), 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"));
+		camel_mime_part_set_description (mime_part, _("Attached message"));
 
 	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);
 }
 
@@ -2799,12 +2561,12 @@
 	guint info;
 	guint time;
 
-	guint move:1;
-	guint moved:1;
-	guint aborted:1;
+	unsigned int move:1;
+	unsigned int moved:1;
+	unsigned int aborted:1;
 };
 
-gint
+int
 e_msg_composer_get_remote_download_count (EMsgComposer *composer)
 {
 	EMsgComposerPrivate *p = composer->priv;
@@ -2813,7 +2575,7 @@
 }
 
 static gchar *
-attachment_guess_mime_type (const gchar *file_name)
+attachment_guess_mime_type (const char *file_name)
 {
 	GnomeVFSFileInfo *info;
 	GnomeVFSResult result;
@@ -2835,12 +2597,12 @@
 static void
 drop_action (EMsgComposer *composer, GdkDragContext *context, guint32 action, GtkSelectionData *selection, guint info, guint time, gboolean html_dnd)
 {
-	gchar *tmp, *str, **urls;
+	char *tmp, *str, **urls;
 	CamelMimePart *mime_part;
 	CamelStream *stream;
 	CamelMimeMessage *msg;
-	gchar *content_type;
-	gint i, success = FALSE, delete = FALSE;
+	char *content_type;
+	int i, success = FALSE, delete = FALSE;
 	EMsgComposerPrivate *p = composer->priv;
 
 	switch (info) {
@@ -2911,7 +2673,7 @@
 		break;
 	case DND_TYPE_X_UID_LIST: {
 		GPtrArray *uids;
-		gchar *inptr, *inend;
+		char *inptr, *inend;
 		CamelFolder *folder;
 		CamelException ex = CAMEL_EXCEPTION_INITIALISER;
 
@@ -2922,7 +2684,7 @@
 		inptr = (char*)selection->data;
 		inend = (char*)(selection->data + selection->length);
 		while (inptr < inend) {
-			gchar *start = inptr;
+			char *start = inptr;
 
 			while (inptr < inend && *inptr)
 				inptr++;
@@ -2943,7 +2705,7 @@
 					attach_message (composer, msg);
 				} else {
 					CamelMultipart *mp = camel_multipart_new ();
-					gchar *desc;
+					char *desc;
 
 					camel_data_wrapper_set_mime_type ((CamelDataWrapper *)mp, "multipart/digest");
 					camel_multipart_set_boundary (mp, NULL);
@@ -2968,7 +2730,7 @@
 					desc = g_strdup_printf (ngettext ("Attached message", "%d attached messages", uids->len), uids->len);
 					camel_mime_part_set_description (mime_part, desc);
 					g_free (desc);
-					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);
 					camel_object_unref (mp);
 				}
@@ -2976,7 +2738,7 @@
 				delete = action == GDK_ACTION_MOVE;
 			fail:
 				if (camel_exception_is_set (&ex)) {
-					gchar *name;
+					char *name;
 
 					camel_object_get (folder, NULL, CAMEL_FOLDER_NAME, &name, NULL);
 					e_error_run ((GtkWindow *)composer, "mail-composer:attach-nomessages",
@@ -3000,7 +2762,7 @@
 		break;
 	}
 
-	if (e_attachment_bar_get_num_attachments (E_ATTACHMENT_BAR (p->attachment_bar)))
+	if (e_attachment_bar_get_num_attachments (E_ATTACHMENT_BAR(p->attachment_bar)))
 		show_attachments (composer, TRUE);
 
 	gtk_drag_finish (context, success, delete, time);
@@ -3028,10 +2790,10 @@
 }
 
 static EPopupItem drop_popup_menu[] = {
-	{ E_POPUP_ITEM, "00.emc.02", N_ ("_Copy"), drop_popup_copy, NULL, "mail-copy", 0 },
-	{ E_POPUP_ITEM, "00.emc.03", N_ ("_Move"), drop_popup_move, NULL, "mail-move", 0 },
+	{ E_POPUP_ITEM, "00.emc.02", N_("_Copy"), drop_popup_copy, NULL, "mail-copy", 0 },
+	{ E_POPUP_ITEM, "00.emc.03", N_("_Move"), drop_popup_move, NULL, "mail-move", 0 },
 	{ E_POPUP_BAR, "10.emc" },
-	{ E_POPUP_ITEM, "99.emc.00", N_ ("Cancel _Drag"), drop_popup_cancel, NULL, NULL, 0 },
+	{ E_POPUP_ITEM, "99.emc.00", N_("Cancel _Drag"), drop_popup_cancel, NULL, NULL, 0 },
 };
 
 static void
@@ -3050,7 +2812,7 @@
 
 static void
 drag_data_received (GtkWidget *w, GdkDragContext *context,
-		    gint x, gint y, GtkSelectionData *selection,
+		    int x, int y, GtkSelectionData *selection,
 		    guint info, guint time,
 		    EMsgComposer *composer)
 {
@@ -3061,10 +2823,10 @@
 		EMPopup *emp;
 		GSList *menus = NULL;
 		GtkMenu *menu;
-		gint i;
+		int i;
 		struct _drop_data *m;
 
-		m = g_malloc0 (sizeof (*m));
+		m = g_malloc0(sizeof (*m));
 		m->context = context;
 		g_object_ref (context);
 		m->composer = composer;
@@ -3072,13 +2834,13 @@
 		m->action = context->action;
 		m->info = info;
 		m->time = time;
-		m->selection = g_malloc0 (sizeof (*m->selection));
+		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 < G_N_ELEMENTS (drop_popup_menu); i++)
+		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);
@@ -3097,11 +2859,11 @@
 	GdkDragAction action, actions = 0;
 
 	for (targets = context->targets; targets; targets = targets->next) {
-		gint ii;
+		int i;
 
-		for (ii = 0; ii < G_N_ELEMENTS (drag_info); ii++)
-			if (targets->data == (gpointer) drag_info[ii].atom)
-				actions |= drag_info[ii].actions;
+		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;
@@ -3181,13 +2943,10 @@
 	composer->priv->extra_hdr_names = g_ptr_array_new ();
 	composer->priv->extra_hdr_values = g_ptr_array_new ();
 
-	composer->priv->persist_file_interface = CORBA_OBJECT_NIL;
-	composer->priv->persist_stream_interface = CORBA_OBJECT_NIL;
-
-	composer->priv->eeditor_engine = CORBA_OBJECT_NIL;
 	composer->priv->inline_images = inline_images;
 	composer->priv->inline_images_by_url = inline_images_by_url;
 
+#if 0 /* GTKHTML-EDITOR */
 	/** @HookPoint-EMMenu: Main Mail Menu
 	 * @Id: org.gnome.evolution.mail.composer
 	 * @Class: org.gnome.evolution.mail.bonobomenu:1.0
@@ -3196,8 +2955,8 @@
 	 * The main menu of the composer window.  The widget of the
 	 * target will point to the EMsgComposer object.
 	 */
-	composer->priv->menu =
-		em_menu_new ("org.gnome.evolution.mail.composer");
+	composer->priv->menu = em_menu_new ("org.gnome.evolution.mail.composer");
+#endif
 }
 
 GType
@@ -3220,14 +2979,14 @@
 		};
 
 		type = g_type_register_static (
-			BONOBO_TYPE_WINDOW, "EMsgComposer", &type_info, 0);
+			GTKHTML_TYPE_EDITOR, "EMsgComposer", &type_info, 0);
 	}
 
 	return type;
 }
 
 static void
-e_msg_composer_load_config (EMsgComposer *composer, gint visible_mask)
+e_msg_composer_load_config (EMsgComposer *composer, int visible_mask)
 {
 	GConfClient *gconf;
 	EMsgComposerPrivate *p = composer->priv;
@@ -3271,14 +3030,44 @@
 	g_object_unref (gconf);
 }
 
+static int
+e_msg_composer_get_visible_flags (EMsgComposer *composer)
+{
+	int flags = 0;
+	EMsgComposerPrivate *p = composer->priv;
+
+	if (p->view_from)
+		flags |= E_MSG_COMPOSER_VISIBLE_FROM;
+	if (p->view_replyto)
+		flags |= E_MSG_COMPOSER_VISIBLE_REPLYTO;
+	if (p->view_to)
+		flags |= E_MSG_COMPOSER_VISIBLE_TO;
+	if (p->view_postto)
+		flags |= E_MSG_COMPOSER_VISIBLE_POSTTO;
+	if (p->view_cc)
+		flags |= E_MSG_COMPOSER_VISIBLE_CC;
+	if (p->view_bcc)
+		flags |= E_MSG_COMPOSER_VISIBLE_BCC;
+	if (p->view_subject)
+		flags |= E_MSG_COMPOSER_VISIBLE_SUBJECT;
+
+	/*
+	 * Until we have a GUI way, lets make sure that
+	 * even if the user screws up, we will do the right
+	 * thing (screws up == edit the config file manually
+	 * and screw up).
+	 */
+	flags |= E_MSG_COMPOSER_VISIBLE_SUBJECT;
+	return flags;
+}
+
+
 static void
 map_default_cb (EMsgComposer *composer, gpointer user_data)
 {
 	EComposerHeaderTable *table;
 	GtkWidget *widget;
-	CORBA_Environment ev;
 	const gchar *text;
-	EMsgComposerPrivate *p = composer->priv;
 
 	table = e_msg_composer_get_header_table (composer);
 
@@ -3290,6 +3079,7 @@
 
 	if (!text || text[0] == '\0') {
 		gtk_widget_grab_focus (widget);
+
 		return;
 	}
 
@@ -3305,10 +3095,7 @@
 	}
 
 	/* Jump to the editor as a last resort. */
-
-	CORBA_exception_init (&ev);
-	GNOME_GtkHTML_Editor_Engine_runCommand (p->eeditor_engine, "grab-focus", &ev);
-	CORBA_exception_free (&ev);
+	gtkhtml_editor_run_command (GTKHTML_EDITOR (composer), "grab-focus");
 }
 
 static void
@@ -3319,12 +3106,11 @@
 	all_composers = g_slist_remove (all_composers, composer);
 }
 
-static gint
+static int
 composer_key_pressed (EMsgComposer *composer, GdkEventKey *event, gpointer user_data)
 {
 	GtkWidget *widget;
 	EComposerHeaderTable *table;
-	EMsgComposerPrivate *p = composer->priv;
 
 	table = e_msg_composer_get_header_table (composer);
 	widget = e_composer_header_table_get_header (
@@ -3343,10 +3129,7 @@
 		g_signal_stop_emission_by_name (composer, "key-press-event");
 		return TRUE;
 	} else if ((event->keyval == GDK_Tab) && (gtk_widget_is_focus (widget))) {
-		CORBA_Environment ev;
-		CORBA_exception_init (&ev);
-		GNOME_GtkHTML_Editor_Engine_runCommand (p->eeditor_engine, "grab-focus", &ev);
-		CORBA_exception_free (&ev);
+		gtkhtml_editor_run_command (GTKHTML_EDITOR (composer), "grab-focus");
 		g_signal_stop_emission_by_name (composer, "key-press-event");
 		return TRUE;
 	}
@@ -3367,10 +3150,11 @@
 static gboolean
 composer_entry_focus_in_event_cb (GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
 {
+#if 0 /* GTKHTML-EDITOR */
 	EMsgComposer *composer = user_data;
 	EMsgComposerPrivate *p = composer->priv;
 	BonoboUIContainer *container;
-	gchar *xmlfile;
+	char *xmlfile;
 
 	p->focused_entry = widget;
 
@@ -3388,6 +3172,7 @@
 	g_free (xmlfile);
 
 	bonobo_ui_component_thaw (p->entry_uic, NULL);
+#endif /* GTKHTML-EDITOR */
 
 	return FALSE;
 }
@@ -3395,6 +3180,7 @@
 static gboolean
 composer_entry_focus_out_event_cb (GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
 {
+#if 0 /* GTKHTML-EDITOR */
 	EMsgComposer *composer = user_data;
 	EMsgComposerPrivate *p = composer->priv;
 
@@ -3402,6 +3188,7 @@
 	p->focused_entry = NULL;
 
 	bonobo_ui_component_unset_container (p->entry_uic, NULL);
+#endif /* GTKHTML-EDITOR */
 
 	return FALSE;
 }
@@ -3418,37 +3205,31 @@
 
 	entry = e_composer_header_table_get_header (
 		table, E_COMPOSER_HEADER_SUBJECT)->input_widget;
-
 	g_signal_connect (entry, "focus_in_event", G_CALLBACK (composer_entry_focus_in_event_cb), composer);
 	g_signal_connect (entry, "focus_out_event", G_CALLBACK (composer_entry_focus_out_event_cb), composer);
 
 	entry = e_composer_header_table_get_header (
 		table, E_COMPOSER_HEADER_REPLY_TO)->input_widget;
-
 	g_signal_connect (entry, "focus_in_event", G_CALLBACK (composer_entry_focus_in_event_cb), composer);
 	g_signal_connect (entry, "focus_out_event", G_CALLBACK (composer_entry_focus_out_event_cb), composer);
 
 	entry = e_composer_header_table_get_header (
 		table, E_COMPOSER_HEADER_TO)->input_widget;
-
 	g_signal_connect (entry, "focus_in_event", G_CALLBACK (composer_entry_focus_in_event_cb), composer);
 	g_signal_connect (entry, "focus_out_event", G_CALLBACK (composer_entry_focus_out_event_cb), composer);
 
 	entry = e_composer_header_table_get_header (
 		table, E_COMPOSER_HEADER_CC)->input_widget;
-
 	g_signal_connect (entry, "focus_in_event", G_CALLBACK (composer_entry_focus_in_event_cb), composer);
 	g_signal_connect (entry, "focus_out_event", G_CALLBACK (composer_entry_focus_out_event_cb), composer);
 
 	entry = e_composer_header_table_get_header (
 		table, E_COMPOSER_HEADER_BCC)->input_widget;
-
 	g_signal_connect (entry, "focus_in_event", G_CALLBACK (composer_entry_focus_in_event_cb), composer);
 	g_signal_connect (entry, "focus_out_event", G_CALLBACK (composer_entry_focus_out_event_cb), composer);
 
 	entry = e_composer_header_table_get_header (
 		table, E_COMPOSER_HEADER_POST_TO)->input_widget;
-
 	g_signal_connect (entry, "focus_in_event", G_CALLBACK (composer_entry_focus_in_event_cb), composer);
 	g_signal_connect (entry, "focus_out_event", G_CALLBACK (composer_entry_focus_out_event_cb), composer);
 }
@@ -3456,6 +3237,7 @@
 static void
 composer_settings_update (GConfClient *gconf, guint cnxn_id, GConfEntry *entry, gpointer data)
 {
+#if 0 /* GTKHTML-EDITOR */
 	gboolean bool;
 	EMsgComposer *composer = data;
 	EMsgComposerPrivate *p = composer->priv;
@@ -3474,6 +3256,7 @@
 	bonobo_widget_set_property (BONOBO_WIDGET (p->eeditor),
 				   "InlineSpelling", TC_CORBA_boolean, bool,
 				   NULL);
+#endif /* GTKHTML-EDITOR */
 }
 
 static void
@@ -3481,7 +3264,7 @@
 {
 	EMsgComposer *composer = E_MSG_COMPOSER (widget);
 	GConfClient *gconf;
-	gint width, height;
+	int width, height;
 
 	gtk_window_get_size (GTK_WINDOW (composer), &width, &height);
 
@@ -3498,7 +3281,7 @@
 {
 	EAttachmentBar *bar = data;
 	EMsgComposer *toplevel = E_MSG_COMPOSER (gtk_widget_get_toplevel (GTK_WIDGET (bar)));
-	GtkWidget **attachment_selector = e_attachment_bar_get_selector (E_ATTACHMENT_BAR (bar));
+	GtkWidget **attachment_selector = e_attachment_bar_get_selector (E_ATTACHMENT_BAR(bar));
 
 	e_msg_composer_select_file_attachments (toplevel, attachment_selector, add_to_bar);
 }
@@ -3521,14 +3304,14 @@
 
 /* Popup menu handling.  */
 static EPopupItem emcab_popups[] = {
-	{ E_POPUP_ITEM, "10.attach", N_ ("_Remove"), emcab_remove, NULL, GTK_STOCK_REMOVE, EM_POPUP_ATTACHMENTS_MANY },
-	{ E_POPUP_ITEM, "20.attach", N_ ("_Properties"), emcab_properties, NULL, GTK_STOCK_PROPERTIES, EM_POPUP_ATTACHMENTS_ONE },
+	{ E_POPUP_ITEM, "10.attach", N_("_Remove"), emcab_remove, NULL, GTK_STOCK_REMOVE, EM_POPUP_ATTACHMENTS_MANY },
+	{ E_POPUP_ITEM, "20.attach", N_("_Properties"), emcab_properties, NULL, GTK_STOCK_PROPERTIES, EM_POPUP_ATTACHMENTS_ONE },
 	{ E_POPUP_BAR, "30.attach.00", NULL, NULL, NULL, NULL, EM_POPUP_ATTACHMENTS_MANY|EM_POPUP_ATTACHMENTS_ONE },
-	{ E_POPUP_ITEM, "30.attach.01", N_ ("_Add attachment..."), emcab_add, NULL, GTK_STOCK_ADD, 0 },
+	{ E_POPUP_ITEM, "30.attach.01", N_("_Add attachment..."), emcab_add, NULL, GTK_STOCK_ADD, 0 },
 };
 
 static void
-emcab_popup_position (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data)
+emcab_popup_position (GtkMenu *menu, int *x, int *y, gboolean *push_in, gpointer user_data)
 {
 	EAttachmentBar *bar = user_data;
 	GnomeIconList *icon_list = user_data;
@@ -3541,7 +3324,7 @@
 	if (selection == NULL)
 		return;
 
-	image = gnome_icon_list_get_icon_pixbuf_item (icon_list, GPOINTER_TO_INT (selection->data));
+	image = gnome_icon_list_get_icon_pixbuf_item (icon_list, GPOINTER_TO_INT(selection->data));
 	if (image == NULL)
 		return;
 
@@ -3559,17 +3342,17 @@
 /* if id != -1, then use it as an index for target of the popup */
 
 static void
-emcab_popup (EAttachmentBar *bar, GdkEventButton *event, gint id)
+emcab_popup (EAttachmentBar *bar, GdkEventButton *event, int id)
 {
 	GSList *attachments = NULL, *menus = NULL;
-	gint i;
+	int i;
 	EMPopup *emp;
 	EMPopupTargetAttachments *t;
 	GtkMenu *menu;
 
 	attachments = e_attachment_bar_get_attachment (bar, id);
 
-	for (i = 0; i < G_N_ELEMENTS (emcab_popups); i++)
+	for (i=0;i<sizeof (emcab_popups)/sizeof (emcab_popups[0]);i++)
 		menus = g_slist_prepend (menus, &emcab_popups[i]);
 
 	/** @HookPoint-EMPopup: Composer Attachment Bar Context Menu
@@ -3599,12 +3382,12 @@
 }
 
 
-static gint
+static int
 button_press_event (GtkWidget *widget, GdkEventButton *event)
 {
 	EAttachmentBar *bar = (EAttachmentBar *)widget;
-	GnomeIconList *icon_list = GNOME_ICON_LIST (widget);
-	gint icon_number;
+	GnomeIconList *icon_list = GNOME_ICON_LIST(widget);
+	int icon_number;
 
 	if (event->button != 3)
 		return FALSE;
@@ -3623,7 +3406,7 @@
 static gint
 key_press_event (GtkWidget *widget, GdkEventKey *event)
 {
-	EAttachmentBar *bar = E_ATTACHMENT_BAR (widget);
+	EAttachmentBar *bar = E_ATTACHMENT_BAR(widget);
 
 	if (event->keyval == GDK_Delete) {
 		e_attachment_bar_remove_selected (bar);
@@ -3633,38 +3416,31 @@
 	return FALSE;
 }
 
+/* Exit dialog.  (Displays a "Save composition to 'Drafts' before exiting?" warning before actually exiting.)  */
+
 static void
-update_header_visibility (EMsgComposer *composer)
+do_exit (EMsgComposer *composer)
 {
 	EComposerHeaderTable *table;
-	gboolean visible[E_COMPOSER_NUM_HEADERS];
-	gint visible_mask, ii;
+	const gchar *subject;
+	gint button;
 
-	table = e_msg_composer_get_header_table (composer);
-	visible_mask = composer->priv->visible_mask;
+	if (!e_msg_composer_is_dirty (composer) && !e_msg_composer_is_autosaved (composer)) {
+		gtk_widget_destroy (GTK_WIDGET (composer));
+		return;
+	}
 
-	visible[E_COMPOSER_HEADER_FROM]     = composer->priv->view_from;
-	visible[E_COMPOSER_HEADER_REPLY_TO] = composer->priv->view_replyto;
-	visible[E_COMPOSER_HEADER_TO]       = composer->priv->view_to;
-	visible[E_COMPOSER_HEADER_CC]       = composer->priv->view_cc;
-	visible[E_COMPOSER_HEADER_BCC]      = composer->priv->view_bcc;
-	visible[E_COMPOSER_HEADER_POST_TO]  = composer->priv->view_postto;
-	visible[E_COMPOSER_HEADER_SUBJECT]  = composer->priv->view_subject;
-
-	/* Overrides */
-	visible[E_COMPOSER_HEADER_SUBJECT] = TRUE;
-
-	/* "To" is always visible if we're not doing "Post-To" */
-	if (!(visible_mask & E_MSG_COMPOSER_VISIBLE_POSTTO))
-		visible[E_COMPOSER_HEADER_TO] = TRUE;
-	else
-		visible[E_COMPOSER_HEADER_POST_TO] = TRUE;
+	gdk_window_raise (GTK_WIDGET (composer)->window);
 
-	for (ii = 0; ii < G_N_ELEMENTS (visible); ii++)
-		e_composer_header_table_set_header_visible (
-			table, ii, visible[ii]);
+	table = e_msg_composer_get_header_table (composer);
+	subject = e_composer_header_table_get_subject (table);
+
+	button = e_error_run ((GtkWindow *)composer, "mail-composer:exit-unsaved",
+			     subject && subject[0] ? subject : _ ("Untitled Message"), NULL);
+	e_composer_autosave_register (composer);
+	e_msg_composer_check_autosave (GTK_WINDOW (composer));
 
-	gtk_widget_queue_resize (GTK_WIDGET (table));
+	composer->priv->has_changed = FALSE;
 }
 
 static EMsgComposer *
@@ -3673,20 +3449,14 @@
 	EMsgComposer *composer;
 	EComposerHeaderTable *table;
 	GtkWidget *vbox, *expander_hbox;
-	Bonobo_Unknown editor_server;
-	CORBA_Environment ev;
 	GConfClient *gconf;
 	GList *icon_list;
-	BonoboControlFrame *control_frame;
-	GtkWidget *html_widget = NULL;
-	gpointer servant;
-	BonoboObject *impl;
 	EMsgComposerPrivate *p;
 
-	composer = g_object_new (E_TYPE_MSG_COMPOSER, "win_name", _ ("Compose Message"), NULL);
+	composer = g_object_new (E_TYPE_MSG_COMPOSER, "win_name", _("Compose Message"), NULL);
 	p = composer->priv;
 
-	gtk_window_set_title ((GtkWindow *) composer, _ ("Compose Message"));
+	gtk_window_set_title ((GtkWindow *) composer, _("Compose Message"));
 
 	all_composers = g_slist_prepend (all_composers, composer);
 
@@ -3728,6 +3498,7 @@
 
 	/* Configure header visibility / sensitivity */
 
+#if 0 /* GTKHTML-EDITOR */
 	bonobo_ui_component_set_prop (
 		p->uic, "/commands/ViewTo", "sensitive",
 		visible_mask & E_MSG_COMPOSER_VISIBLE_TO ? "0" : "1", NULL);
@@ -3735,6 +3506,7 @@
 		p->uic, "/commands/ViewPostTo", "sensitive",
 		visible_mask & E_MSG_COMPOSER_VISIBLE_POSTTO ? "0" : "1", NULL);
 	update_header_visibility (composer);
+#endif /* GTKHTML-EDITOR */
 
 	gtk_box_set_spacing (GTK_BOX (vbox), 6);
 	gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (table), FALSE, FALSE, 0);
@@ -3763,29 +3535,13 @@
 		table, "notify::subject",
 		G_CALLBACK (e_msg_composer_set_changed), composer);
 	g_signal_connect_swapped (
-                table, "notify::signature",
-                G_CALLBACK (e_msg_composer_show_sig_file), composer);
+		table, "notify::signature",
+		G_CALLBACK (e_msg_composer_show_sig_file), composer);
 	gtk_widget_show (GTK_WIDGET (table));
 
 	account_changed_cb (composer);
 
-	/* Editor component.  */
-	p->eeditor = bonobo_widget_new_control (
-		GNOME_GTKHTML_EDITOR_CONTROL_ID,
-		bonobo_ui_component_get_container (p->uic));
-	if (!p->eeditor) {
-		e_error_run (GTK_WINDOW (composer), "mail-composer:no-editor-control", NULL);
-		gtk_object_destroy (GTK_OBJECT (composer));
-		return NULL;
-	}
-
-	control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (p->eeditor));
-	bonobo_control_frame_set_autoactivate (control_frame, TRUE);
-
-	/* let the editor know which mode we are in */
-	bonobo_widget_set_property (BONOBO_WIDGET (p->eeditor),
-				    "FormatHTML", TC_CORBA_boolean, p->send_html,
-				    NULL);
+	gtkhtml_editor_set_html_mode (GTKHTML_EDITOR (composer), p->send_html);
 
 	gconf = gconf_client_get_default ();
 	composer_settings_update (gconf, 0, NULL, composer);
@@ -3799,19 +3555,7 @@
 	g_signal_connect (composer, "unrealize", G_CALLBACK (e_msg_composer_unrealize), NULL);
 	g_object_unref (gconf);
 
-	editor_server = bonobo_widget_get_objref (BONOBO_WIDGET (p->eeditor));
-
-	/* FIXME: handle exceptions */
-	CORBA_exception_init (&ev);
-	p->persist_file_interface
-		= Bonobo_Unknown_queryInterface (editor_server, "IDL:Bonobo/PersistFile:1.0", &ev);
-	p->persist_stream_interface
-		= Bonobo_Unknown_queryInterface (editor_server, "IDL:Bonobo/PersistStream:1.0", &ev);
-	CORBA_exception_free (&ev);
-
-	gtk_box_pack_start (GTK_BOX (vbox), p->eeditor, TRUE, TRUE, 0);
-
-	/* Attachment editor, wrapped ginto an EScrollFrame.  It's
+	/* Attachment editor, wrapped into an EScrollFrame.  It's
 	   hidden in an EExpander. */
 
 	p->attachment_scrolled_window = gtk_scrolled_window_new (NULL, NULL);
@@ -3834,7 +3578,7 @@
 			  G_CALLBACK (attachment_bar_changed_cb), composer);
 
 	p->attachment_expander_label =
-		gtk_label_new_with_mnemonic (_ ("Show _Attachment Bar"));
+		gtk_label_new_with_mnemonic (_("Show _Attachment Bar"));
 	p->attachment_expander_num = gtk_label_new ("");
 	gtk_label_set_use_markup (GTK_LABEL (p->attachment_expander_num), TRUE);
 	gtk_misc_set_alignment (GTK_MISC (p->attachment_expander_label), 0.0, 0.5);
@@ -3864,21 +3608,14 @@
 	g_signal_connect_after (p->attachment_expander, "activate",
 				G_CALLBACK (attachment_expander_activate_cb), composer);
 
+#if 0 /* GTKHTML-EDITOR */
 	bonobo_window_set_contents (BONOBO_WINDOW (composer), vbox);
+#endif /* GTKHTML-EDITOR */
 	gtk_widget_show (vbox);
 
-	/* If we show this widget earlier, we lose network transparency. i.e. the
-	   component appears on the machine evo is running on, ignoring any DISPLAY
-	   variable. */
-	gtk_widget_show (p->eeditor);
-
 	prepare_engine (composer);
-	if (p->eeditor_engine == CORBA_OBJECT_NIL) {
-		e_error_run (GTK_WINDOW (composer), "mail-composer:no-editor-control", NULL);
-		gtk_object_destroy (GTK_OBJECT (composer));
-		return NULL;
-	}
 
+#if 0 /* GTKHTML-EDITOR */
 	/* The engine would have the GtkHTML widget stored in "html-widget"
 	 * We'll use that to listen for DnD signals
 	 */
@@ -3890,19 +3627,18 @@
 	if (html_widget) {
 		g_signal_connect (html_widget, "drag_data_received", G_CALLBACK (drag_data_received), composer);
 	}
+#endif /* GTKHTML-EDITOR */
 
 	setup_cut_copy_paste (composer);
 
 	g_signal_connect (composer, "map", (GCallback) map_default_cb, NULL);
 
 	e_composer_autosave_register (composer);
-	e_msg_composer_check_autosave (GTK_WINDOW (composer));
 
 	p->has_changed = FALSE;
 
 	return composer;
 }
-
 static void
 set_editor_signature (EMsgComposer *composer)
 {
@@ -3954,7 +3690,7 @@
 	if (new) {
 		e_msg_composer_set_send_html (new, send_html);
 		set_editor_signature (new);
-		set_editor_text (new, "", 0, TRUE, TRUE);
+		set_editor_text (new, "", TRUE);
 	}
 
 	return new;
@@ -4012,7 +3748,7 @@
 	len = GPOINTER_TO_SIZE (g_object_get_data ((GObject *) composer, "body:len"));
 	if (body) {
 		if (apply)
-			set_editor_text (composer, body, len, FALSE, FALSE);
+			set_editor_text (composer, body, FALSE);
 
 		g_object_set_data ((GObject *) composer, "body:text", NULL);
 		g_free (body);
@@ -4334,6 +4070,7 @@
 static void
 set_signature_gui (EMsgComposer *composer)
 {
+#if 0 /* GTKHTML-EDITOR */
 	CORBA_Environment ev;
 	EComposerHeaderTable *table;
 	EMsgComposerPrivate *p = composer->priv;
@@ -4362,6 +4099,7 @@
 		e_composer_header_table_set_signature (table, signature);
 	}
 	CORBA_exception_free (&ev);
+#endif /* GTKHTML-EDITOR */
 }
 
 
@@ -4652,6 +4390,7 @@
 static void
 disable_editor (EMsgComposer *composer)
 {
+#if 0 /* GTKHTML-EDITOR */
 	CORBA_Environment ev;
 	EMsgComposerPrivate *p = composer->priv;
 
@@ -4664,6 +4403,7 @@
 	bonobo_ui_component_set_prop (p->uic, "/menu/Edit", "sensitive", "0", NULL);
 	bonobo_ui_component_set_prop (p->uic, "/menu/Format", "sensitive", "0", NULL);
 	bonobo_ui_component_set_prop (p->uic, "/menu/Insert", "sensitive", "0", NULL);
+#endif /* GTKHTML-EDITOR */
 }
 
 /**
@@ -4864,7 +4604,7 @@
 		gchar *htmlbody;
 
 		htmlbody = camel_text_to_html (body, CAMEL_MIME_FILTER_TOHTML_PRE, 0);
-		set_editor_text (composer, htmlbody, -1, FALSE, FALSE);
+		set_editor_text (composer, htmlbody, FALSE);
 		g_free (htmlbody);
 	}
 }
@@ -4937,7 +4677,7 @@
 	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
 	g_return_if_fail (text != NULL);
 
-	set_editor_text (composer, text, len, TRUE, *text == '\0');
+	set_editor_text (composer, text, TRUE);
 }
 
 /**
@@ -4960,7 +4700,7 @@
 
 	table = e_msg_composer_get_header_table (composer);
 
-	set_editor_text (composer, _ ("<b>(The composer contains a non-text message body, which cannot be edited.)</b>"), -1, FALSE, FALSE);
+	set_editor_text (composer, _("<b>(The composer contains a non-text message body, which cannot be edited.)</b>"), FALSE);
 	e_msg_composer_set_send_html (composer, FALSE);
 	disable_editor (composer);
 
@@ -5309,6 +5049,7 @@
 static void
 delete_old_signature (EMsgComposer *composer)
 {
+#if 0 /* GTKHTML-EDITOR */
 	CORBA_Environment ev;
 	EMsgComposerPrivate *p = composer->priv;
 
@@ -5328,6 +5069,7 @@
 	}
 	GNOME_GtkHTML_Editor_Engine_runCommand (p->eeditor_engine, "unblock-selection", &ev);
 	CORBA_exception_free (&ev);
+#endif /* GTKHTML-EDITOR */
 }
 
 
@@ -5340,6 +5082,7 @@
 void
 e_msg_composer_show_sig_file (EMsgComposer *composer)
 {
+#if 0 /* GTKHTML-EDITOR */
 	CORBA_Environment ev;
 	gchar *html;
 	EMsgComposerPrivate *p = composer->priv;
@@ -5377,6 +5120,7 @@
 		p->in_signature_insert = FALSE;
 	}
 	/* printf ("e_msg_composer_show_sig_file end\n"); */
+#endif /* GTKHTML-EDITOR */
 }
 
 
@@ -5391,6 +5135,7 @@
 e_msg_composer_set_send_html (EMsgComposer *composer,
 			      gboolean send_html)
 {
+#if 0 /* GTKHTML-EDITOR */
 	CORBA_Environment ev;
 	EMsgComposerPrivate *p = composer->priv;
 
@@ -5420,6 +5165,7 @@
 	CORBA_exception_init (&ev);
 	GNOME_GtkHTML_Editor_Engine_runCommand (p->eeditor_engine, "unblock-redraw", &ev);
 	CORBA_exception_free (&ev);
+#endif /* GTKHTML-EDITOR */
 }
 
 
@@ -5452,6 +5198,7 @@
 void
 e_msg_composer_set_pgp_sign (EMsgComposer *composer, gboolean pgp_sign)
 {
+#if 0 /* GTKHTML-EDITOR */
 	EMsgComposerPrivate *p = composer->priv;
 	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
 
@@ -5465,6 +5212,7 @@
 
 	bonobo_ui_component_set_prop (p->uic, "/commands/SecurityPGPSign",
 				      "state", p->pgp_sign ? "1" : "0", NULL);
+#endif /* GTKHTML-EDITOR */
 }
 
 
@@ -5496,6 +5244,7 @@
 void
 e_msg_composer_set_pgp_encrypt (EMsgComposer *composer, gboolean pgp_encrypt)
 {
+#if 0 /* GTKHTML-EDITOR */
 	EMsgComposerPrivate *p = composer->priv;
 	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
 
@@ -5509,6 +5258,7 @@
 
 	bonobo_ui_component_set_prop (p->uic, "/commands/SecurityPGPEncrypt",
 				      "state", p->pgp_encrypt ? "1" : "0", NULL);
+#endif /* GTKHTML-EDITOR */
 }
 
 
@@ -5540,6 +5290,7 @@
 void
 e_msg_composer_set_smime_sign (EMsgComposer *composer, gboolean smime_sign)
 {
+#if 0 /* GTKHTML-EDITOR */
 	EMsgComposerPrivate *p = composer->priv;
 	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
 
@@ -5553,6 +5304,7 @@
 
 	bonobo_ui_component_set_prop (p->uic, "/commands/SecuritySMimeSign",
 				      "state", p->smime_sign ? "1" : "0", NULL);
+#endif /* GTKHTML-EDITOR */
 }
 
 
@@ -5584,6 +5336,7 @@
 void
 e_msg_composer_set_smime_encrypt (EMsgComposer *composer, gboolean smime_encrypt)
 {
+#if 0 /* GTKHTML-EDITOR */
 	EMsgComposerPrivate *p = composer->priv;
 	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
 
@@ -5597,6 +5350,7 @@
 
 	bonobo_ui_component_set_prop (p->uic, "/commands/SecuritySMimeEncrypt",
 				      "state", p->smime_encrypt ? "1" : "0", NULL);
+#endif /* GTKHTML-EDITOR */
 }
 
 
@@ -5646,6 +5400,7 @@
 void
 e_msg_composer_set_view_from (EMsgComposer *composer, gboolean view_from)
 {
+#if 0 /* GTKHTML-EDITOR */
 	EMsgComposerPrivate *p = composer->priv;
 	GConfClient *gconf;
 
@@ -5664,6 +5419,7 @@
 	g_object_unref (gconf);
 
 	update_header_visibility (composer);
+#endif /* GTKHTML-EDITOR */
 }
 
 
@@ -5695,6 +5451,7 @@
 void
 e_msg_composer_set_view_replyto (EMsgComposer *composer, gboolean view_replyto)
 {
+#if 0 /* GTKHTML-EDITOR */
 	EMsgComposerPrivate *p = composer->priv;
 	GConfClient *gconf;
 
@@ -5714,6 +5471,7 @@
 	g_object_unref (gconf);
 
 	update_header_visibility (composer);
+#endif /* GTKHTML-EDITOR */
 }
 
 
@@ -5745,6 +5503,7 @@
 void
 e_msg_composer_set_view_to (EMsgComposer *composer, gboolean view_to)
 {
+#if 0 /* GTKHTML-EDITOR */
 	EMsgComposerPrivate *p = composer->priv;
 	GConfClient *gconf;
 
@@ -5765,6 +5524,7 @@
 	}
 
 	update_header_visibility (composer);
+#endif /* GTKHTML-EDITOR */
 }
 
 
@@ -5797,6 +5557,7 @@
 void
 e_msg_composer_set_view_postto (EMsgComposer *composer, gboolean view_postto)
 {
+#if 0 /* GTKHTML-EDITOR */
 	GConfClient *gconf;
 	EMsgComposerPrivate *p = composer->priv;
 
@@ -5817,6 +5578,7 @@
 	}
 
 	update_header_visibility (composer);
+#endif /* GTKHTML-EDITOR */
 }
 
 
@@ -5849,6 +5611,7 @@
 void
 e_msg_composer_set_view_cc (EMsgComposer *composer, gboolean view_cc)
 {
+#if 0 /* GTKHTML-EDITOR */
 	GConfClient *gconf;
 	EMsgComposerPrivate *p = composer->priv;
 
@@ -5869,6 +5632,7 @@
 	}
 
 	update_header_visibility (composer);
+#endif /* GTKHTML-EDITOR */
 }
 
 
@@ -5902,6 +5666,7 @@
 void
 e_msg_composer_set_view_bcc (EMsgComposer *composer, gboolean view_bcc)
 {
+#if 0 /* GTKHTML-EDITOR */
 	GConfClient *gconf;
 	EMsgComposerPrivate *p = composer->priv;
 
@@ -5922,6 +5687,7 @@
 	}
 
 	update_header_visibility (composer);
+#endif /* GTKHTML-EDITOR */
 }
 
 
@@ -5954,6 +5720,7 @@
 void
 e_msg_composer_set_request_receipt (EMsgComposer *composer, gboolean request_receipt)
 {
+#if 0 /* GTKHTML-EDITOR */
 	EMsgComposerPrivate *p = composer->priv;
 	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
 
@@ -5964,6 +5731,7 @@
 	p->request_receipt = request_receipt;
 	bonobo_ui_component_set_prop (p->uic, "/commands/RequestReceipt",
 				      "state", p->request_receipt ? "1" : "0", NULL);
+#endif /* GTKHTML-EDITOR */
 }
 
 
@@ -5995,6 +5763,7 @@
 void
 e_msg_composer_set_priority (EMsgComposer *composer, gboolean set_priority)
 {
+#if 0 /* GTKHTML-EDITOR */
 	EMsgComposerPrivate *p = composer->priv;
 	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
 
@@ -6005,6 +5774,7 @@
 	p->set_priority= set_priority;
 	bonobo_ui_component_set_prop (p->uic, "/commands/SetPriority",
 				      "state", p->set_priority ? "1" : "0", NULL);
+#endif /* GTKHTML-EDITOR */
 }
 
 CamelInternetAddress *
@@ -6116,6 +5886,7 @@
 gboolean
 e_msg_composer_is_dirty (EMsgComposer *composer)
 {
+#if 0 /* GTKHTML-EDITOR */
 	EMsgComposerPrivate *p = composer->priv;
 	CORBA_Environment ev;
 	gboolean rv;
@@ -6127,6 +5898,9 @@
 	CORBA_exception_free (&ev);
 
 	return rv;
+#endif /* GTKHTML-EDITOR */
+
+	return TRUE;
 }
 
 /**
@@ -6139,10 +5913,7 @@
 void
 e_msg_composer_set_autosaved (EMsgComposer *composer)
 {
-	EMsgComposerPrivate *p = composer->priv;
-	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
-	p->autosaved = TRUE;
+	e_composer_autosave_set_saved (composer, TRUE);
 }
 
 
@@ -6156,10 +5927,7 @@
 void
 e_msg_composer_unset_autosaved (EMsgComposer *composer)
 {
-	EMsgComposerPrivate *p = composer->priv;
-	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
-	p->autosaved = FALSE;
+	e_composer_autosave_set_saved (composer, FALSE);
 }
 
 /**
@@ -6170,15 +5938,9 @@
 const gchar *
 e_msg_composer_get_raw_message_text (EMsgComposer *composer)
 {
-       GByteArray *data = NULL;
-       EMsgComposerPrivate *p = composer->priv;
-       g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL);
-
-       data = get_text (p->persist_stream_interface, "text/plain");
-       if (data)
-		return (const gchar *)data->data;
+	g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL);
 
-       return NULL;
+	return gtkhtml_editor_get_text_plain (GTKHTML_EDITOR (composer), NULL);
 }
 
 EAttachmentBar*
@@ -6192,10 +5954,7 @@
 gboolean
 e_msg_composer_is_autosaved (EMsgComposer *composer)
 {
-	EMsgComposerPrivate *p = composer->priv;
-	g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
-
-	return p->autosaved;
+	return e_composer_autosave_get_saved (composer);
 }
 
 void
@@ -6207,12 +5966,9 @@
 void
 e_msg_composer_drop_editor_undo (EMsgComposer *composer)
 {
-	EMsgComposerPrivate *p = composer->priv;
-	CORBA_Environment ev;
+	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
 
-	CORBA_exception_init (&ev);
-	GNOME_GtkHTML_Editor_Engine_dropUndo (p->eeditor_engine, &ev);
-	CORBA_exception_free (&ev);
+	gtkhtml_editor_drop_undo (GTKHTML_EDITOR (composer));
 }
 
 
@@ -6222,8 +5978,9 @@
 	GSList *p, *pnext;
 
 	for (p = all_composers; p != NULL; p = pnext) {
+		EMsgComposer *composer = p->data;
 		pnext = p->next;
-		do_exit (E_MSG_COMPOSER (p->data));
+		gtk_action_activate (ACTION (CLOSE));
 	}
 
 	if (all_composers == NULL)
@@ -6232,6 +5989,40 @@
 		return FALSE;
 }
 
+EMsgComposer *
+e_msg_composer_load_from_file (const gchar *filename)
+{
+	CamelStream *stream;
+	CamelMimeMessage *msg;
+	EMsgComposer *composer;
+
+	g_return_val_if_fail (filename != NULL, NULL);
+
+	stream = camel_stream_fs_new_with_name (filename, O_RDONLY, 0);
+	if (stream == NULL)
+		return NULL;
+
+	msg = camel_mime_message_new ();
+	camel_data_wrapper_construct_from_stream (
+		CAMEL_DATA_WRAPPER (msg), stream);
+	camel_object_unref (stream);
+
+	composer = e_msg_composer_new_with_message (msg);
+	if (composer != NULL) {
+		g_signal_connect (
+			G_OBJECT (composer), "send",
+			G_CALLBACK (em_utils_composer_send_cb), NULL);
+
+		g_signal_connect (
+			G_OBJECT (composer), "save-draft",
+			G_CALLBACK (em_utils_composer_save_draft_cb), NULL);
+
+		gtk_widget_show (GTK_WIDGET (composer));
+	}
+
+	return composer;
+}
+
 void
 e_msg_composer_check_autosave (GtkWindow *parent)
 {
@@ -6291,6 +6082,7 @@
 void
 e_msg_composer_reply_indent (EMsgComposer *composer)
 {
+#if 0 /* GTKHTML-EDITOR */
 	EMsgComposerPrivate *p = composer->priv;
 	CORBA_Environment ev;
 
@@ -6313,12 +6105,13 @@
 	GNOME_GtkHTML_Editor_Engine_runCommand (p->eeditor_engine, "italic-off", &ev);
 
 	CORBA_exception_free (&ev);
-
+#endif /* GTKHTML-EDITOR */
 }
 
 void
 e_msg_composer_insert_paragraph_before (EMsgComposer *composer)
 {
+#if 0 /* GTKHTML-EDITOR */
 	EMsgComposerPrivate *p = composer->priv;
 	CORBA_Environment ev;
 
@@ -6352,6 +6145,7 @@
 	}
 
 	CORBA_exception_free (&ev);
+#endif /* GTKHTML-EDITOR */
 }
 
 static void
@@ -6371,6 +6165,7 @@
 void
 e_msg_composer_insert_paragraph_after (EMsgComposer *composer)
 {
+#if 0 /* GTKHTML-EDITOR */
 	EMsgComposerPrivate *p = composer->priv;
 	CORBA_Environment ev;
 
@@ -6397,11 +6192,13 @@
 	}
 
 	CORBA_exception_free (&ev);
+#endif /* GTKHTML-EDITOR */
 }
 
 void
 e_msg_composer_delete (EMsgComposer *composer)
 {
+#if 0 /* GTKHTML-EDITOR */
 	EMsgComposerPrivate *p = composer->priv;
 	CORBA_Environment ev;
 
@@ -6433,6 +6230,7 @@
 		}
 	}
 	CORBA_exception_free (&ev);
+#endif /* GTKHTML-EDITOR */
 }
 
 
@@ -6508,12 +6306,12 @@
 void
 e_msg_composer_set_saved (EMsgComposer *composer)
 {
-	CORBA_Environment ev;
-	EMsgComposerPrivate *p = composer->priv;
+	GtkhtmlEditor *editor;
 
-	CORBA_exception_init (&ev);
-	GNOME_GtkHTML_Editor_Engine_runCommand (p->eeditor_engine, "saved", &ev);
-	CORBA_exception_free (&ev);
+	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
+
+	editor = GTKHTML_EDITOR (composer);
+	gtkhtml_editor_run_command (editor, "saved");
 }
 
 void

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	Wed Feb  6 00:09:08 2008
@@ -24,12 +24,11 @@
 #ifndef ___E_MSG_COMPOSER_H__
 #define ___E_MSG_COMPOSER_H__
 
-#include <bonobo/bonobo-window.h>
-#include <bonobo/bonobo-ui-component.h>
 #include <camel/camel-internet-address.h>
 #include <camel/camel-mime-message.h>
 #include <libedataserver/e-account.h>
 #include <libebook/e-destination.h>
+#include <gtkhtml-editor.h>
 
 #include "e-composer-header-table.h"
 #include "Editor.h"
@@ -60,12 +59,12 @@
 typedef struct _EMsgComposerPrivate EMsgComposerPrivate;
 
 struct _EMsgComposer {
-	BonoboWindow parent;
+	GtkhtmlEditor parent;
 	EMsgComposerPrivate *priv;
 };
 
 struct _EMsgComposerClass {
-	BonoboWindowClass parent_class;
+	GtkhtmlEditorClass parent_class;
 
 	void		(*send)			(EMsgComposer *composer);
 	void		(*save_draft)		(EMsgComposer *composer,

Added: branches/mbarnes-composer/composer/evolution-composer.ui
==============================================================================
--- (empty file)
+++ branches/mbarnes-composer/composer/evolution-composer.ui	Wed Feb  6 00:09:08 2008
@@ -0,0 +1,27 @@
+<ui>
+  <menubar name='main-menu'>
+    <placeholder name='pre-edit-menu'>
+      <menu action='file-menu'>
+        <menuitem action='send'/>
+        <separator/>
+        <menuitem action='save'/>
+        <menuitem action='save-as'/>
+        <menuitem action='save-draft'/>
+        <separator/>
+        <menuitem action='print-preview'/>
+        <menuitem action='print'/>
+        <separator/>
+        <menuitem action='close'/>
+      </menu>
+    </placeholder>
+  </menubar>
+  <toolbar name='main-toolbar'>
+    <placeholder name='pre-main-toolbar'>
+      <toolitem action='send'/>
+      <separator/>
+      <toolitem action='save-draft'/>
+      <toolitem action='attach'/>
+      <separator/>
+    </placeholder>
+  </toolbar>
+</ui>

Modified: branches/mbarnes-composer/configure.in
==============================================================================
--- branches/mbarnes-composer/configure.in	(original)
+++ branches/mbarnes-composer/configure.in	Wed Feb  6 00:09:08 2008
@@ -1537,7 +1537,7 @@
 
 dnl --- evolution-mail flags
 
-EVO_SET_COMPILE_FLAGS(EVOLUTION_MAIL, camel-provider-$EDS_PACKAGE libgnomeui-2.0 libbonoboui-2.0 libglade-2.0 gnome-vfs-module-2.0 libgtkhtml-$GTKHTML_PACKAGE bonobo-activation-2.0 $mozilla_nss libebook-$EDS_PACKAGE libedataserverui-$EDS_PACKAGE)
+EVO_SET_COMPILE_FLAGS(EVOLUTION_MAIL, camel-provider-$EDS_PACKAGE libgnomeui-2.0 libbonoboui-2.0 libglade-2.0 gnome-vfs-module-2.0 libgtkhtml-$GTKHTML_PACKAGE gtkhtml-editor bonobo-activation-2.0 $mozilla_nss libebook-$EDS_PACKAGE libedataserverui-$EDS_PACKAGE)
 AC_SUBST(EVOLUTION_MAIL_CFLAGS)
 AC_SUBST(EVOLUTION_MAIL_LIBS)
 



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