[evolution/kill-bonobo] Mail changes required for Anjal.



commit c3205a427adcc910f0614cb83249622816440c56
Author: Srinivasa Ragavan <sragavan novell com>
Date:   Fri May 22 17:30:14 2009 +0530

    Mail changes required for Anjal.
---
 composer/e-msg-composer.c   |   27 ++++++
 composer/e-msg-composer.h   |    3 +
 mail/Makefile.am            |   12 ++--
 mail/e-mail-shell-backend.c |    3 +
 mail/em-account-editor.c    |  200 ++++++++++++++++++++++++++++++++++++++-----
 mail/em-account-editor.h    |    8 ++-
 mail/em-composer-utils.c    |   74 ++++++++++++++--
 mail/em-composer-utils.h    |   10 ++-
 mail/em-folder-tree.c       |   10 ++
 mail/em-folder-tree.h       |    1 +
 mail/mail-ops.c             |   13 ++-
 mail/mail-ops.h             |    2 +-
 12 files changed, 319 insertions(+), 44 deletions(-)

diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c
index 93bd6fd..80ee19d 100644
--- a/composer/e-msg-composer.c
+++ b/composer/e-msg-composer.c
@@ -100,6 +100,8 @@ enum {
 	LAST_SIGNAL
 };
 
+gboolean composer_lite = FALSE;
+
 static gpointer parent_class;
 static guint signals[LAST_SIGNAL];
 
@@ -2209,6 +2211,31 @@ e_msg_composer_new (void)
 	return g_object_new (E_TYPE_MSG_COMPOSER, NULL);
 }
 
+void
+e_msg_composer_set_lite (void)
+{
+	composer_lite = TRUE;
+}
+
+gboolean
+e_msg_composer_get_lite (void)
+{
+	return composer_lite;
+}
+
+EMsgComposer *
+e_msg_composer_lite_new (void)
+{
+	EMsgComposer *composer;
+
+	/* Init lite-composer for ever for the session */
+	composer_lite = TRUE;
+
+	composer = e_msg_composer_new ();
+
+	return composer;
+}
+
 static void
 e_msg_composer_set_pending_body (EMsgComposer *composer,
                                  gchar *text,
diff --git a/composer/e-msg-composer.h b/composer/e-msg-composer.h
index c32342c..334a7cf 100644
--- a/composer/e-msg-composer.h
+++ b/composer/e-msg-composer.h
@@ -69,6 +69,9 @@ struct _EMsgComposerClass {
 
 GType		e_msg_composer_get_type		(void);
 EMsgComposer *	e_msg_composer_new		(void);
+void		e_msg_composer_set_lite		(void);
+gboolean	e_msg_composer_get_lite		(void);
+EMsgComposer *	e_msg_composer_lite_new		(void);
 EMsgComposer *	e_msg_composer_new_with_message	(CamelMimeMessage *msg);
 EMsgComposer *	e_msg_composer_new_from_url	(const gchar *url);
 EMsgComposer *	e_msg_composer_new_redirect	(CamelMimeMessage *message,
diff --git a/mail/Makefile.am b/mail/Makefile.am
index 56a9464..3df6164 100644
--- a/mail/Makefile.am
+++ b/mail/Makefile.am
@@ -181,6 +181,12 @@ libevolution_module_mail_la_SOURCES =			\
 	importers/pine-importer.c			\
 	importers/evolution-mbox-importer.c
 
+if ENABLE_SMIME
+SMIME_LIBS =						\
+	$(top_builddir)/smime/lib/libessmime.la		\
+	$(top_builddir)/smime/gui/libevolution-smime.la
+endif
+
 libevolution_module_mail_la_LIBADD =			\
 	$(top_builddir)/e-util/libeutil.la		\
 	$(top_builddir)/shell/libeshell.la		\
@@ -192,12 +198,6 @@ libevolution_module_mail_la_LIBADD =			\
 	$(top_builddir)/addressbook/gui/contact-list-editor/libecontactlisteditor.la \
 	$(SMIME_LIBS)
 
-if ENABLE_SMIME
-SMIME_LIBS = 				\
-	$(top_builddir)/smime/lib/libessmime.la		\
-	$(top_builddir)/smime/gui/libevolution-smime.la
-endif
-
 #libevolution_mail_la_LIBADD =					\
 #	$(top_builddir)/widgets/misc/libefilterbar.la		\
 #	$(top_builddir)/filter/libfilter.la			\
diff --git a/mail/e-mail-shell-backend.c b/mail/e-mail-shell-backend.c
index 15d9e0d..3fa066a 100644
--- a/mail/e-mail-shell-backend.c
+++ b/mail/e-mail-shell-backend.c
@@ -105,6 +105,9 @@ struct _EMailShellBackendPrivate {
 	guint mail_sync_timeout_source_id;
 };
 
+/* XXX Make this a preprocessor definition. */
+const gchar *x_mailer = "Evolution " VERSION SUB_VERSION " " VERSION_COMMENT;
+
 static gpointer parent_class;
 static GType mail_shell_backend_type;
 
diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c
index 72e8881..a9ba161 100644
--- a/mail/em-account-editor.c
+++ b/mail/em-account-editor.c
@@ -278,6 +278,26 @@ EMAccountEditor *em_account_editor_new(EAccount *account, em_account_editor_t ty
 	return emae;
 }
 
+/**
+ * em_account_editor_new_for_pages:
+ * @account:
+ * @type:
+ *
+ * Create a new account editor.  If @account is NULL then this is to
+ * create a new account, else @account is copied to a working
+ * structure and is for editing an existing account.
+ *
+ * Return value:
+ **/
+EMAccountEditor *em_account_editor_new_for_pages(EAccount *account, em_account_editor_t type, char *id, GtkWidget **pages)
+{
+	EMAccountEditor *emae = g_object_new(em_account_editor_get_type(), NULL);
+	emae->pages = pages;
+	em_account_editor_construct(emae, account, type, id);
+
+	return emae;
+}
+
 /* ********************************************************************** */
 
 static struct {
@@ -403,7 +423,7 @@ emae_display_license(EMAccountEditor *emae, CamelProvider *prov)
 		gtk_text_view_set_editable((GtkTextView *)w, FALSE);
 		response = gtk_dialog_run((GtkDialog *)dialog);
 	} else {
-		e_error_run((GtkWindow *)gtk_widget_get_toplevel(emae->editor),
+		e_error_run(emae->editor ? (GtkWindow *)gtk_widget_get_toplevel(emae->editor) : NULL,
 			    "mail:no-load-license", prov->license_file, NULL);
 	}
 
@@ -1038,7 +1058,8 @@ emae_url_set_hostport(CamelURL *url, const char *txt)
 	}
 
 	g_strstrip(host);
-	camel_url_set_host(url, host);
+	if (txt && *txt)
+		camel_url_set_host(url, host);
 
 	g_free(host);
 }
@@ -1401,7 +1422,8 @@ emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service)
 	int active = 0, i;
 	struct _service_info *info = &emae_service_info[service->type];
 	const char *uri = e_account_get_string(account, info->account_uri_key);
-	char *current = NULL;
+	char *current = NULL, *tmp;
+	CamelURL *url;
 
 	dropdown = service->providers;
 	gtk_widget_show((GtkWidget *)dropdown);
@@ -1416,8 +1438,10 @@ emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service)
 			memcpy(current, uri, len);
 			current[len] = 0;
 		}
+	} else {
+		current = g_strdup("imap");
 	}
-
+	
 	store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER);
 
 	i = 0;
@@ -1443,7 +1467,7 @@ emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service)
 
 		gtk_list_store_append(store, &iter);
 		gtk_list_store_set(store, &iter, 0, provider->name, 1, provider, -1);
-
+		
 		/* find the displayed and set default */
 		if (i == 0 || (current && strcmp(provider->protocol, current) == 0)) {
 			service->provider = provider;
@@ -1461,13 +1485,30 @@ emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service)
 		i++;
 	}
 
+
+	gtk_cell_layout_clear((GtkCellLayout *)dropdown);
 	gtk_combo_box_set_model(dropdown, (GtkTreeModel *)store);
 	gtk_cell_layout_pack_start((GtkCellLayout *)dropdown, cell, TRUE);
 	gtk_cell_layout_set_attributes((GtkCellLayout *)dropdown, cell, "text", 0, NULL);
 
+	g_signal_handlers_disconnect_by_func(dropdown, emae_provider_changed, service);
 	gtk_combo_box_set_active(dropdown, -1);	/* needed for gtkcombo bug(?) */
 	gtk_combo_box_set_active(dropdown, active);
 	g_signal_connect(dropdown, "changed", G_CALLBACK(emae_provider_changed), service);
+
+	if (!uri  || (url = camel_url_new(uri, NULL)) == NULL) {
+		return;
+	}
+	
+	tmp = (char *)camel_url_get_param(url, "use_ssl");
+	if (tmp == NULL)
+		tmp = "never";	
+	for (i=0;i<num_ssl_options;i++) {
+		if (!strcmp(ssl_options[i].value, tmp)) {
+			gtk_combo_box_set_active(service->use_ssl, i);
+			break;
+		}
+	}
 }
 
 static void
@@ -1623,11 +1664,12 @@ static void emae_check_authtype(GtkWidget *w, EMAccountEditorService *service)
 	uri = e_account_get_string(emae->account, emae_service_info[service->type].account_uri_key);
 	g_object_ref(emae);
 
-	service->check_dialog = e_error_new((GtkWindow *)gtk_widget_get_toplevel(emae->editor),
+	service->check_dialog = e_error_new(emae->editor ? (GtkWindow *)gtk_widget_get_toplevel(emae->editor) : NULL,
 					    "mail:checking-service", NULL);
 	g_signal_connect(service->check_dialog, "response", G_CALLBACK(emae_check_authtype_response), service);
 	gtk_widget_show(service->check_dialog);
-	gtk_widget_set_sensitive(emae->editor, FALSE);
+	if (emae->editor)
+		gtk_widget_set_sensitive(emae->editor, FALSE);
 	service->check_id = mail_check_service(uri, service->type, emae_check_authtype_done, service);
 }
 
@@ -1641,7 +1683,6 @@ emae_setup_service(EMAccountEditor *emae, EMAccountEditorService *service, Glade
 	int i;
 
 	service->provider = uri?camel_provider_get(uri, NULL):NULL;
-
 	service->frame = glade_xml_get_widget(xml, info->frame);
 	service->container = glade_xml_get_widget(xml, info->container);
 	service->description = GTK_LABEL (glade_xml_get_widget (xml, info->description));
@@ -1670,8 +1711,9 @@ emae_setup_service(EMAccountEditor *emae, EMAccountEditorService *service, Glade
 		} else
 			gtk_entry_set_text(service->hostname, url->host);
 	}
-	if (url->user)
+	if (url->user && *url->user) {
 		gtk_entry_set_text(service->username, url->user);
+	}
 	if (service->pathentry) {
 		GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER;
 
@@ -1809,7 +1851,9 @@ emae_identity_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, st
 	}
 
 	w = glade_xml_get_widget(xml, item->label);
-	if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) {
+	if (emae->type == EMAE_PAGES) {
+		gtk_box_pack_start ((GtkBox *)emae->pages[0], w, TRUE, TRUE, 0);
+	} else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) {
 		GladeXML *druidxml;
 		GtkWidget *page;
 
@@ -1858,7 +1902,9 @@ emae_receive_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, str
 	emae_setup_service(emae, &gui->source, xml);
 
 	w = glade_xml_get_widget(xml, item->label);
-	if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) {
+	if (emae->type == EMAE_PAGES) {
+		gtk_box_pack_start ((GtkBox *)emae->pages[1], w, TRUE, TRUE, 0);
+	} else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) {
 		GladeXML *druidxml;
 		GtkWidget *page;
 
@@ -2326,7 +2372,9 @@ emae_send_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct
 	emae_setup_service(emae, &gui->transport, xml);
 
 	w = glade_xml_get_widget(xml, item->label);
-	if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) {
+	if (emae->type == EMAE_PAGES) {
+		gtk_box_pack_start ((GtkBox *)emae->pages[2], w, TRUE, TRUE, 0);
+	} else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) {
 		GladeXML *druidxml;
 		GtkWidget *page;
 
@@ -2341,7 +2389,7 @@ emae_send_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct
 		gtk_box_pack_start((GtkBox*)((GnomeDruidPageStandard *)page)->vbox, w, TRUE, TRUE, 0);
 		w = page;
 		g_object_unref(druidxml);
-		gnome_druid_append_page((GnomeDruid *)parent, (GnomeDruidPage *)page);
+		gnome_druid_append_page((GnomeDruid *)parent, (GnomeDruidPage *)page);	
 	} else {
 		gtk_notebook_append_page((GtkNotebook *)parent, w, gtk_label_new(_("Sending Email")));
 	}
@@ -2562,6 +2610,10 @@ emae_widget_druid_glade(EConfig *ec, EConfigItem *item, struct _GtkWidget *paren
 	GladeXML *druidxml;
 	GtkWidget *w;
 	char *gladefile;
+	EMAccountEditor *emae = (EMAccountEditor *)data;
+
+	if (emae->type == EMAE_PAGES)
+		return NULL;
 
 	gladefile = g_build_filename (EVOLUTION_GLADEDIR,
 				      "mail-config.glade",
@@ -2651,10 +2703,12 @@ emae_service_complete(EMAccountEditor *emae, EMAccountEditorService *service)
 	if (uri == NULL || (url = camel_url_new(uri, NULL)) == NULL)
 		return FALSE;
 
-	if (CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_HOST)
-	    && (url->host == NULL || url->host[0] == 0))
-		ok = FALSE;
-
+	if (CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_HOST)) {
+		if (url->host == NULL || url->host[0] == 0)
+			ok = FALSE;
+		else 
+			gtk_entry_set_text(service->hostname, url->host);
+	}
 	/* We only need the user if the service needs auth as well, i think */
 	if (ok
 	    && (service->needs_auth == NULL
@@ -2674,6 +2728,37 @@ emae_service_complete(EMAccountEditor *emae, EMAccountEditorService *service)
 	return ok;
 }
 
+enum {
+	GMAIL = 0,
+	YAHOO,
+	AOL
+};
+struct _server_prefill {
+	char *key;
+	char *recv;
+	char *send;
+	char *proto;
+	char *ssl;
+} mail_servers [] = {
+	{"gmail", "imap.gmail.com", "smtp.gmail.com", "imap", "always"},
+	{"yahoo", "pop3.yahoo.com", "smtp.yahoo.com", "pop", "never"},
+	{"aol", "imap.aol.com", "smtp.aol.com", "pop", "never"},
+	{"msn", "pop3.email.msn.com", "smtp.email.msn.com", "pop", "never"}
+};
+
+static int
+check_servers (char *server)
+{
+	int len = G_N_ELEMENTS(mail_servers), i;
+
+	for (i=0; i<len; i++) {
+		if (strstr(server, mail_servers[i].key) != NULL)
+			return i;
+	}
+
+	return -1;
+}
+
 static gboolean
 emae_check_complete(EConfig *ec, const char *pageid, void *data)
 {
@@ -2681,6 +2766,7 @@ emae_check_complete(EConfig *ec, const char *pageid, void *data)
 	int ok = TRUE;
 	const char *tmp;
 	EAccount *ea;
+	gboolean refresh = FALSE;
 
 	/* We use the page-check of various pages to 'prepare' or
 	   pre-load their values, only in the druid */
@@ -2704,16 +2790,68 @@ emae_check_complete(EConfig *ec, const char *pageid, void *data)
 		} else if (!strcmp(pageid, "10.receive")) {
 			if (!emae->priv->receive_set) {
 				char *user, *at;
+				int index;
+				char *uri = (char *)e_account_get_string(emae->account, E_ACCOUNT_SOURCE_URL);
+				CamelURL *url;
 
 				emae->priv->receive_set = 1;
-				tmp = e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS);
+				tmp = (char *)e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS);
 				at = strchr(tmp, '@');
 				user = g_alloca(at-tmp+1);
 				memcpy(user, tmp, at-tmp);
 				user[at-tmp] = 0;
+				at++;
+
+				index = check_servers(at);
 				gtk_entry_set_text(emae->priv->source.username, user);
 				gtk_entry_set_text(emae->priv->transport.username, user);
+				if (uri && (url = camel_url_new(uri, NULL)) != NULL) {
+					refresh = TRUE;
+					camel_url_set_protocol(url, mail_servers[index].proto);
+					camel_url_set_param(url, "use_ssl", mail_servers[index].ssl);
+					camel_url_set_host (url, mail_servers[index].recv);
+					camel_url_set_user (url, user);
+					gtk_entry_set_text(emae->priv->source.hostname, mail_servers[index].recv);
+					gtk_entry_set_text(emae->priv->transport.hostname, mail_servers[index].send);
+					uri = camel_url_to_string(url, 0);
+					e_account_set_string(emae->account, E_ACCOUNT_SOURCE_URL, uri);
+
+					g_free(uri);
+					camel_url_free(url);
+				} else {
+					g_warning("buz1\n");
+				}
+				
 			}
+		} else if (!strcmp(pageid, "30.send")) {
+				CamelURL *url;
+				char *at, *user;
+				int index;
+				char *uri = (char *)e_account_get_string(emae->account, E_ACCOUNT_TRANSPORT_URL);
+				
+				tmp = e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS);
+				at = strchr(tmp, '@');
+				user = g_alloca(at-tmp+1);
+				memcpy(user, tmp, at-tmp);
+				user[at-tmp] = 0;
+				at++;
+
+				index = check_servers(at);
+				if (uri  && (url = camel_url_new(uri, NULL)) != NULL) {
+					refresh = TRUE;
+					camel_url_set_protocol (url, "smtp");
+					camel_url_set_param(url, "use_ssl", mail_servers[index].ssl);
+					camel_url_set_host (url, mail_servers[index].send);
+					camel_url_set_user (url, user);
+					uri = camel_url_to_string(url, 0);
+					e_account_set_string(emae->account, E_ACCOUNT_TRANSPORT_URL, uri);
+					g_free(uri);
+					camel_url_free(url);
+				} else {
+					g_warning("buz2\n");
+				}
+				
+		
 		} else if (!strcmp(pageid, "20.receive_options")) {
 			if (emae->priv->source.provider
 			    && emae->priv->extra_provider != emae->priv->source.provider) {
@@ -2760,12 +2898,18 @@ emae_check_complete(EConfig *ec, const char *pageid, void *data)
 	}
 
 	if (ok && (pageid == NULL || !strcmp(pageid, "10.receive"))) {
+		if (emae->type == EMAE_PAGES && refresh) {
+			emae_refresh_providers(emae, &emae->priv->source);
+		}
 		ok = emae_service_complete(emae, &emae->priv->source);
 		if (!ok)
 			d(printf("receive page incomplete\n"));
 	}
 
 	if (ok && (pageid == NULL || !strcmp(pageid, "30.send"))) {
+		if (emae->type == EMAE_PAGES && refresh) {
+			emae_refresh_providers(emae, &emae->priv->transport);
+		}
 		ok = emae_service_complete(emae, &emae->priv->transport);
 		if (!ok)
 			d(printf("send page incomplete\n"));
@@ -2783,6 +2927,12 @@ emae_check_complete(EConfig *ec, const char *pageid, void *data)
 	return ok;
 }
 
+void
+em_account_editor_check (EMAccountEditor *emae, const char *page)
+{
+	emae_check_complete((EConfig *)emae->config, page, emae);
+}
+
 /* HACK: FIXME: the component should listen to the account object directly */
 static void
 add_new_store (char *uri, CamelStore *store, void *user_data)
@@ -2831,6 +2981,12 @@ emae_commit(EConfig *ec, GSList *items, void *data)
 	e_account_list_save(accounts);
 }
 
+void
+em_account_editor_commit (EMAccountEditor *emae)
+{
+	emae_commit ((EConfig *)emae->config, NULL, emae);
+}
+
 static void
 emae_editor_destroyed(GtkWidget *dialog, EMAccountEditor *emae)
 {
@@ -2958,7 +3114,11 @@ em_account_editor_construct(EMAccountEditor *emae, EAccount *account, em_account
 
 	target = em_config_target_new_account(ec, emae->account);
 	e_config_set_target((EConfig *)ec, (EConfigTarget *)target);
-	emae->editor = e_config_create_window((EConfig *)ec, NULL, type==EMAE_NOTEBOOK?_("Account Editor"):_("Evolution Account Assistant"));
 
-	g_signal_connect(emae->editor, "destroy", G_CALLBACK(emae_editor_destroyed), emae);
+	if (type != EMAE_PAGES) {
+		emae->editor = e_config_create_window((EConfig *)ec, NULL, type==EMAE_NOTEBOOK?_("Account Editor"):_("Evolution Account Assistant"));
+		g_signal_connect(emae->editor, "destroy", G_CALLBACK(emae_editor_destroyed), emae);
+	} else {
+		e_config_create_widget((EConfig *)ec);
+	} 
 }
diff --git a/mail/em-account-editor.h b/mail/em-account-editor.h
index 43e5c06..41da661 100644
--- a/mail/em-account-editor.h
+++ b/mail/em-account-editor.h
@@ -38,7 +38,8 @@ typedef struct _EMAccountEditorClass EMAccountEditorClass;
 
 typedef enum {
 	EMAE_NOTEBOOK,
-	EMAE_DRUID
+	EMAE_DRUID,
+	EMAE_PAGES
 } em_account_editor_t;
 
 struct _EMAccountEditor {
@@ -54,6 +55,8 @@ struct _EMAccountEditor {
 	struct _EAccount *account; /* working account, must instant apply to this */
 	struct _EAccount *original; /* original account, not changed unless commit is invoked */
 
+	GtkWidget **pages; /* Pages for Anjal's page type editor */
+
 	guint do_signature:1;	/* allow editing signature */
 };
 
@@ -64,6 +67,9 @@ struct _EMAccountEditorClass {
 GType em_account_editor_get_type(void);
 
 EMAccountEditor *em_account_editor_new(struct _EAccount *account, em_account_editor_t type, char *id);
+EMAccountEditor *em_account_editor_new_for_pages(struct _EAccount *account, em_account_editor_t type, char *id, struct _GtkWidget **pages);
+void em_account_editor_commit (EMAccountEditor *emae);
+void em_account_editor_check (EMAccountEditor *emae, const char *page);
 
 gboolean em_account_editor_save (EMAccountEditor *gui);
 void em_account_editor_destroy (EMAccountEditor *gui);
diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c
index 2019346..f6ea663 100644
--- a/mail/em-composer-utils.c
+++ b/mail/em-composer-utils.c
@@ -665,13 +665,16 @@ em_utils_composer_print_cb (EMsgComposer *composer,
 /* Composing messages... */
 
 static EMsgComposer *
-create_new_composer (const char *subject, const char *fromuri)
+create_new_composer (const char *subject, const char *fromuri, gboolean lite)
 {
 	EMsgComposer *composer;
 	EComposerHeaderTable *table;
 	EAccount *account = NULL;
 
-	composer = e_msg_composer_new ();
+ 	if (lite)
+ 		composer = e_msg_composer_lite_new ();
+ 	else
+ 		composer = e_msg_composer_new ();	
 	table = e_msg_composer_get_header_table (composer);
 
 	if (fromuri != NULL) {
@@ -701,7 +704,7 @@ em_utils_compose_new_message (const char *fromuri)
 {
 	GtkWidget *composer;
 
-	composer = (GtkWidget *) create_new_composer ("", fromuri);
+	composer = (GtkWidget *) create_new_composer ("", fromuri, FALSE);
 	if (composer == NULL)
 		return;
 
@@ -711,6 +714,26 @@ em_utils_compose_new_message (const char *fromuri)
 }
 
 /**
+ * em_utils_compose_lite_new_message:
+ *
+ * Opens a new composer window as a child window of @parent's toplevel
+ * window.
+ **/
+struct _EMsgComposer *
+em_utils_compose_lite_new_message (const char *fromuri)
+{
+	GtkWidget *composer;
+
+	composer = (GtkWidget *) create_new_composer ("", fromuri, TRUE);
+	if (composer == NULL)
+		return NULL;
+
+	composer_set_no_change (E_MSG_COMPOSER (composer), TRUE, TRUE);
+
+	return (struct _EMsgComposer *)composer;
+}
+
+/**
  * em_utils_compose_new_message_with_mailto:
  * @url: mailto url
  *
@@ -1012,7 +1035,7 @@ forward_attached (CamelFolder *folder, GPtrArray *uids, GPtrArray *messages, Cam
 {
 	EMsgComposer *composer;
 
-	composer = create_new_composer (subject, fromuri);
+	composer = create_new_composer (subject, fromuri, FALSE);
 	if (composer == NULL)
 		return;
 
@@ -1091,7 +1114,7 @@ forward_non_attached (CamelFolder *folder, GPtrArray *uids, GPtrArray *messages,
 		text = em_utils_message_to_html (message, _("-------- Forwarded Message --------"), flags, &len, NULL, NULL);
 
 		if (text) {
-			composer = create_new_composer (subject, fromuri);
+			composer = create_new_composer (subject, fromuri, FALSE);
 
 			if (composer) {
 				if (CAMEL_IS_MULTIPART(camel_medium_get_content_object((CamelMedium *)message)))
@@ -1656,7 +1679,7 @@ generate_account_hash (void)
 	return account_hash;
 }
 
-static EDestination **
+EDestination **
 em_utils_camel_address_to_destination (CamelInternetAddress *iaddr)
 {
 	EDestination *dest, **destv;
@@ -1860,6 +1883,12 @@ get_reply_sender (CamelMimeMessage *message, CamelInternetAddress *to, CamelNNTP
 	}
 }
 
+void
+em_utils_get_reply_sender (CamelMimeMessage *message, CamelInternetAddress *to, CamelNNTPAddress *postto)
+{
+	get_reply_sender (message, to, postto);
+}
+
 static gboolean
 get_reply_list (CamelMimeMessage *message, CamelInternetAddress *to)
 {
@@ -1973,6 +2002,13 @@ get_reply_all (CamelMimeMessage *message, CamelInternetAddress *to, CamelInterne
 	g_hash_table_destroy (rcpt_hash);
 }
 
+void
+em_utils_get_reply_all (CamelMimeMessage *message, CamelInternetAddress *to, CamelInternetAddress *cc, CamelNNTPAddress *postto)
+{
+	get_reply_all (message, to, cc, postto);
+}
+
+
 enum {
 	ATTRIB_UNKNOWN,
 	ATTRIB_CUSTOM,
@@ -2230,6 +2266,21 @@ struct _reply_data {
 	int mode;
 };
 
+char *
+em_utils_construct_composer_text (CamelMimeMessage *message, EMFormat *source)
+{
+	char *text, *credits;
+	ssize_t len = 0;
+	gboolean start_bottom = 0;
+	
+	credits = attribution_format (ATTRIBUTION, message);
+	text = em_utils_message_to_html (message, credits, EM_FORMAT_QUOTE_CITE, &len, source, start_bottom ? "<BR>" : NULL);
+
+	g_free (credits);
+	return text;
+}
+
+
 static void
 reply_to_message(CamelFolder *folder, const char *uid, CamelMimeMessage *message, void *user_data)
 {
@@ -2260,7 +2311,7 @@ reply_to_message(CamelFolder *folder, const char *uid, CamelMimeMessage *message
  * may be supplied in order to update the message flags once it has
  * been replied to.
  **/
-void
+struct _EMsgComposer *
 em_utils_reply_to_message(CamelFolder *folder, const char *uid, CamelMimeMessage *message, int mode, EMFormat *source)
 {
 	CamelInternetAddress *to, *cc;
@@ -2281,10 +2332,10 @@ em_utils_reply_to_message(CamelFolder *folder, const char *uid, CamelMimeMessage
 			g_object_ref(rd->source);
 		mail_get_message(folder, uid, reply_to_message, rd, mail_msg_unordered_push);
 
-		return;
+		return NULL;
 	}
 
-	g_return_if_fail(message != NULL);
+	g_return_val_if_fail(message != NULL, NULL);
 
 	/** @Event: message.replying
 	 * @Title: Message being replied to
@@ -2340,7 +2391,10 @@ em_utils_reply_to_message(CamelFolder *folder, const char *uid, CamelMimeMessage
 
 	composer_set_no_change (composer, TRUE, FALSE);
 
-	gtk_widget_show (GTK_WIDGET (composer));
+	if (!e_msg_composer_get_lite())
+		gtk_widget_show (GTK_WIDGET (composer));
+
+	return composer;
 }
 
 static void
diff --git a/mail/em-composer-utils.h b/mail/em-composer-utils.h
index 45df051..37fd185 100644
--- a/mail/em-composer-utils.h
+++ b/mail/em-composer-utils.h
@@ -34,11 +34,15 @@ extern "C" {
 struct _CamelFolder;
 struct _CamelMimeMessage;
 struct _CamelException;
+struct _CamelInternetAddress;
+struct _CamelNNTPAddress;
 struct _EMsgComposer;
 struct _EMFormat;
 struct _EAccount;
+struct _EDestination;
 
 void em_utils_compose_new_message (const char *fromuri);
+struct _EMsgComposer * em_utils_compose_lite_new_message (const char *fromuri); 
 
 /* FIXME: mailto?  url?  should make up its mind what its called.  imho use 'uri' */
 void em_utils_compose_new_message_with_mailto (const char *url, const char *fromuri);
@@ -67,7 +71,11 @@ enum {
 	REPLY_MODE_LIST
 };
 
-void em_utils_reply_to_message (struct _CamelFolder *, const char *uid, struct _CamelMimeMessage *message, int mode, struct _EMFormat *source);
+char *em_utils_construct_composer_text (struct _CamelMimeMessage *message, struct _EMFormat *source);
+void em_utils_get_reply_sender (struct _CamelMimeMessage *message, struct _CamelInternetAddress *to, struct _CamelNNTPAddress *postto);
+void em_utils_get_reply_all (struct _CamelMimeMessage *message, struct _CamelInternetAddress *to, struct _CamelInternetAddress *cc, struct _CamelNNTPAddress *postto);
+struct _EMsgComposer * em_utils_reply_to_message (struct _CamelFolder *, const char *uid, struct _CamelMimeMessage *message, int mode, struct _EMFormat *source);
+struct _EDestination ** em_utils_camel_address_to_destination (struct _CamelInternetAddress *iaddr);
 
 void em_configure_new_composer (struct _EMsgComposer *composer);
 
diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c
index 128e2fe..07aedc2 100644
--- a/mail/em-folder-tree.c
+++ b/mail/em-folder-tree.c
@@ -114,6 +114,7 @@ struct _EMFolderTreePrivate {
 	guint loaded_row_id;
 
 	GtkTreeRowReference *drag_row;
+	gboolean skip_double_click;
 };
 
 enum {
@@ -1991,6 +1992,9 @@ emft_tree_button_press (GtkTreeView *treeview, GdkEventButton *event, EMFolderTr
 	gtk_tree_view_set_cursor (treeview, tree_path, NULL, FALSE);
 
 	if (event->button == 1 && event->type == GDK_2BUTTON_PRESS) {
+		if (emft->priv->skip_double_click) {
+			return FALSE;
+		}
 		emft_tree_row_activated (treeview, tree_path, NULL, emft);
 		gtk_tree_path_free (tree_path);
 		return TRUE;
@@ -2361,3 +2365,9 @@ emft_queue_save_state (EMFolderTree *emft)
 
 	priv->save_state_id = g_timeout_add_seconds (1, (GSourceFunc) emft_save_state, emft);
 }
+
+void
+em_folder_tree_set_skip_double_click (EMFolderTree *emft, gboolean skip)
+{
+	emft->priv->skip_double_click = skip;
+}
diff --git a/mail/em-folder-tree.h b/mail/em-folder-tree.h
index d84b173..232a15e 100644
--- a/mail/em-folder-tree.h
+++ b/mail/em-folder-tree.h
@@ -109,6 +109,7 @@ EMFolderTreeModel *em_folder_tree_get_model (EMFolderTree *emft);
 EMFolderTreeModelStoreInfo *em_folder_tree_get_model_storeinfo (EMFolderTree *emft, CamelStore *store);
 
 gboolean em_folder_tree_create_folder (EMFolderTree *emft, const char *full_name, const char *uri);
+void em_folder_tree_set_skip_double_click (EMFolderTree *emft, gboolean skip);
 
 G_END_DECLS
 
diff --git a/mail/mail-ops.c b/mail/mail-ops.c
index aaef8b9..a762e75 100644
--- a/mail/mail-ops.c
+++ b/mail/mail-ops.c
@@ -74,6 +74,8 @@
 #define w(x)
 #define d(x)
 
+extern const char *x_mailer;
+
 /* used for both just filtering a folder + uid's, and for filtering a whole folder */
 /* used both for fetching mail, and for filtering mail */
 struct _filter_mail_msg {
@@ -468,7 +470,7 @@ mail_send_message(CamelFolder *queue, const char *uid, const char *destination,
 	if (!message)
 		return;
 
-	camel_medium_set_header (CAMEL_MEDIUM (message), "X-Mailer", "Evolution " VERSION SUB_VERSION " " VERSION_COMMENT);
+	camel_medium_set_header (CAMEL_MEDIUM (message), "X-Mailer", x_mailer);
 
 	err = g_string_new("");
 	xev = mail_tool_remove_xevolution_headers (message);
@@ -930,8 +932,7 @@ mail_append_mail (CamelFolder *folder, CamelMimeMessage *message, CamelMessageIn
 	g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message));
 
 	if (!camel_medium_get_header (CAMEL_MEDIUM (message), "X-Mailer"))
-		camel_medium_set_header (CAMEL_MEDIUM (message), "X-Mailer",
-					 "Evolution " VERSION SUB_VERSION " " VERSION_COMMENT);
+		camel_medium_set_header (CAMEL_MEDIUM (message), "X-Mailer", x_mailer);
 
 	m = mail_msg_new (&append_mail_info);
 	m->folder = folder;
@@ -1897,7 +1898,7 @@ typedef void (*get_done)(CamelFolder *folder, const char *uid, CamelMimeMessage
 static void
 get_messagex_done (struct _get_message_msg *m)
 {
-	if (m->done) {
+	if (m->done && !camel_operation_cancel_check (m->cancel)) {
 		get_done done = (get_done)m->done;
 		done(m->folder, m->uid, m->message, m->data, &m->base.ex);
 	}
@@ -1913,7 +1914,7 @@ static MailMsgInfo get_messagex_info = {
 
 /* This is temporary, to avoid having to rewrite everything that uses
    mail_get_message; it adds an exception argument to the callback */
-void
+CamelOperation *
 mail_get_messagex(CamelFolder *folder, const char *uid, void (*done) (CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data, CamelException *),
 		 void *data, MailMsgDispatchFunc dispatch)
 {
@@ -1928,6 +1929,8 @@ mail_get_messagex(CamelFolder *folder, const char *uid, void (*done) (CamelFolde
 	m->cancel = camel_operation_new(NULL, NULL);
 
 	dispatch (m);
+
+	return m->cancel;
 }
 
 /* ********************************************************************** */
diff --git a/mail/mail-ops.h b/mail/mail-ops.h
index 68ae903..327a351 100644
--- a/mail/mail-ops.h
+++ b/mail/mail-ops.h
@@ -57,7 +57,7 @@ void mail_get_message (CamelFolder *folder, const char *uid,
 		       void *data,
 		       MailMsgDispatchFunc dispatch);
 
-void
+CamelOperation *
 mail_get_messagex(CamelFolder *folder, const char *uid,
 		  void (*done) (CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data, CamelException *),
 		  void *data, MailMsgDispatchFunc dispatch);



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