Index: mail/ChangeLog
===================================================================
--- mail/ChangeLog	(revision 35556)
+++ mail/ChangeLog	(working copy)
@@ -1,3 +1,18 @@
+2008-05-29  Milan Crha  <mcrha@redhat.com>
+
+	** Fix for bug #534312
+
+	* em-composer-utils.c: (create_new_composer),
+	(em_utils_compose_new_message), (struct forward_attached_data),
+	(real_update_forwarded_flag), (update_forwarded_flags_cb),
+	(composer_destroy_fad_cb), (setup_forward_attached_callbacks),
+	(forward_attached), (forward_attached_cb), (em_utils_forward_attached),
+	(forward_non_attached), (forward_quoted), (em_utils_forward_message):
+	Set new CAMEL_MESSAGE_FORWARDED flag on forwarded messages.
+	* message-list.c: (ml_value_to_string), (message_list_create_extras),
+	(ml_tree_value_at), (create_composite_cell), (struct states_pixmaps):
+	Draw mail-forward icon on forwarded messages.
+
 2008-05-26  Milan Crha  <mcrha@redhat.com>
 
 	** Fix for bug #317755
Index: mail/em-composer-utils.c
===================================================================
--- mail/em-composer-utils.c	(revision 35556)
+++ mail/em-composer-utils.c	(working copy)
@@ -631,7 +631,7 @@ em_composer_utils_setup_callbacks (EMsgC
 /* Composing messages... */
 
 static EMsgComposer *
-create_new_composer (const char *subject, const char *fromuri)
+create_new_composer (const char *subject, const char *fromuri, gboolean use_default_callbacks)
 {
 	EMsgComposer *composer;
 	EComposerHeaderTable *table;
@@ -648,7 +648,8 @@ create_new_composer (const char *subject
 	e_composer_header_table_set_account (table, account);
 	e_composer_header_table_set_subject (table, subject);
 
-	em_composer_utils_setup_default_callbacks (composer);
+	if (use_default_callbacks)
+		em_composer_utils_setup_default_callbacks (composer);
 
 	return composer;
 }
@@ -665,7 +666,7 @@ em_utils_compose_new_message (const char
 	GtkWidget *composer;
 	GtkhtmlEditor *editor;
 
-	composer = (GtkWidget *) create_new_composer ("", fromuri);
+	composer = (GtkWidget *) create_new_composer ("", fromuri, TRUE);
 	if (composer == NULL)
 		return;
 
@@ -864,18 +865,77 @@ em_utils_edit_messages (CamelFolder *fol
 }
 
 /* Forwarding messages... */
+struct forward_attached_data
+{
+	CamelFolder *folder;
+	GPtrArray *uids;
+	char *fromuri;
+};
+
+static void
+real_update_forwarded_flag (gpointer uid, gpointer folder)
+{
+	if (uid && folder)
+		camel_folder_set_message_flags (folder, uid, CAMEL_MESSAGE_FORWARDED, CAMEL_MESSAGE_FORWARDED);
+}
+
+static void
+update_forwarded_flags_cb (EMsgComposer *composer, gpointer user_data)
+{
+	struct forward_attached_data *fad = (struct forward_attached_data *) user_data;
+
+	if (fad && fad->uids && fad->folder)
+		g_ptr_array_foreach (fad->uids, real_update_forwarded_flag, fad->folder);
+}
+
+static void
+composer_destroy_fad_cb (gpointer user_data, GObject *deadbeef)
+{
+	struct forward_attached_data *fad = (struct forward_attached_data*) user_data;
+
+	if (fad) {
+		camel_object_unref (fad->folder);
+		em_utils_uids_free (fad->uids);
+		g_free (fad);
+	}
+}
+
+static void
+setup_forward_attached_callbacks (EMsgComposer *composer, CamelFolder *folder, GPtrArray *uids)
+{
+	struct forward_attached_data *fad;
+
+	if (!composer || !folder || !uids || !uids->len)
+		return;
+
+	camel_object_ref (folder);
+
+	fad = g_new0 (struct forward_attached_data, 1);
+	fad->folder = folder;
+	fad->uids = em_utils_uids_copy (uids);
+
+	g_signal_connect (composer, "send", G_CALLBACK (update_forwarded_flags_cb), fad);
+	g_signal_connect (composer, "save-draft", G_CALLBACK (update_forwarded_flags_cb), fad);
+
+	g_object_weak_ref ((GObject *) composer, (GWeakNotify) composer_destroy_fad_cb, fad);
+}
+
 static void
-forward_attached (CamelFolder *folder, GPtrArray *messages, CamelMimePart *part, char *subject, const char *fromuri)
+forward_attached (CamelFolder *folder, GPtrArray *uids, GPtrArray *messages, CamelMimePart *part, char *subject, const char *fromuri)
 {
 	EMsgComposer *composer;
 	GtkhtmlEditor *editor;
 
-	composer = create_new_composer (subject, fromuri);
+	composer = create_new_composer (subject, fromuri, TRUE);
 	if (composer == NULL)
 		return;
 
 	e_msg_composer_attach (composer, part);
 
+
+	if (uids)
+		setup_forward_attached_callbacks (composer, folder, uids);
+
 	editor = GTKHTML_EDITOR (composer);
 	gtkhtml_editor_set_changed (editor, FALSE);
 	gtkhtml_editor_drop_undo (editor);
@@ -886,9 +946,13 @@ forward_attached (CamelFolder *folder, G
 static void
 forward_attached_cb (CamelFolder *folder, GPtrArray *messages, CamelMimePart *part, char *subject, void *user_data)
 {
+	struct forward_attached_data *fad = (struct forward_attached_data *) user_data;
+
 	if (part)
-		forward_attached(folder, messages, part, subject, (char *)user_data);
-	g_free(user_data);
+		forward_attached (folder, fad->uids, messages, part, subject, fad->fromuri);
+	
+	g_free (fad->fromuri);
+	g_free (fad);
 }
 
 /**
@@ -906,14 +970,20 @@ forward_attached_cb (CamelFolder *folder
 void
 em_utils_forward_attached (CamelFolder *folder, GPtrArray *uids, const char *fromuri)
 {
+	struct forward_attached_data *fad;
+
 	g_return_if_fail (CAMEL_IS_FOLDER (folder));
 	g_return_if_fail (uids != NULL);
 
-	mail_build_attachment (folder, uids, forward_attached_cb, g_strdup(fromuri));
+	fad = g_new0 (struct forward_attached_data, 1);
+	fad->uids = uids;
+	fad->fromuri = g_strdup (fromuri);
+
+	mail_build_attachment (folder, uids, forward_attached_cb, fad);
 }
 
 static void
-forward_non_attached (GPtrArray *messages, int style, const char *fromuri)
+forward_non_attached (CamelFolder *folder, GPtrArray *uids, GPtrArray *messages, int style, const char *fromuri)
 {
 	CamelMimeMessage *message;
 	EMsgComposer *composer;
@@ -938,7 +1008,7 @@ forward_non_attached (GPtrArray *message
 		text = em_utils_message_to_html (message, _("-------- Forwarded Message --------"), flags, &len, NULL);
 
 		if (text) {
-			composer = create_new_composer (subject, fromuri);
+			composer = create_new_composer (subject, fromuri, !uids || !uids->pdata [i]);
 
 			if (composer) {
 				if (CAMEL_IS_MULTIPART(camel_medium_get_content_object((CamelMedium *)message)))
@@ -946,6 +1016,9 @@ forward_non_attached (GPtrArray *message
 
 				e_msg_composer_set_body_text (composer, text, len);
 
+				if (uids && uids->pdata[i])
+					em_composer_utils_setup_callbacks (composer, folder, uids->pdata[i], CAMEL_MESSAGE_FORWARDED, CAMEL_MESSAGE_FORWARDED, NULL, NULL);
+
 				editor = GTKHTML_EDITOR (composer);
 				gtkhtml_editor_set_changed (editor, FALSE);
 				gtkhtml_editor_drop_undo (editor);
@@ -962,7 +1035,7 @@ forward_non_attached (GPtrArray *message
 static void
 forward_inline (CamelFolder *folder, GPtrArray *uids, GPtrArray *messages, void *user_data)
 {
-	forward_non_attached (messages, MAIL_CONFIG_FORWARD_INLINE, (char *)user_data);
+	forward_non_attached (folder, uids, messages, MAIL_CONFIG_FORWARD_INLINE, (char *)user_data);
 	g_free(user_data);
 }
 
@@ -986,7 +1059,7 @@ em_utils_forward_inline (CamelFolder *fo
 static void
 forward_quoted (CamelFolder *folder, GPtrArray *uids, GPtrArray *messages, void *user_data)
 {
-	forward_non_attached (messages, MAIL_CONFIG_FORWARD_QUOTED, (char *)user_data);
+	forward_non_attached (folder, uids, messages, MAIL_CONFIG_FORWARD_QUOTED, (char *)user_data);
 	g_free(user_data);
 }
 
@@ -1038,15 +1111,15 @@ em_utils_forward_message (CamelMimeMessa
 
 		subject = mail_tool_generate_forward_subject (message);
 
-		forward_attached (NULL, messages, part, subject, fromuri);
+		forward_attached (NULL, NULL, messages, part, subject, fromuri);
 		camel_object_unref (part);
 		g_free (subject);
 		break;
 	case MAIL_CONFIG_FORWARD_INLINE:
-		forward_non_attached (messages, MAIL_CONFIG_FORWARD_INLINE, fromuri);
+		forward_non_attached (NULL, NULL, messages, MAIL_CONFIG_FORWARD_INLINE, fromuri);
 		break;
 	case MAIL_CONFIG_FORWARD_QUOTED:
-		forward_non_attached (messages, MAIL_CONFIG_FORWARD_QUOTED, fromuri);
+		forward_non_attached (NULL, NULL, messages, MAIL_CONFIG_FORWARD_QUOTED, fromuri);
 		break;
 	}
 
Index: mail/message-list.c
===================================================================
--- mail/message-list.c	(revision 35556)
+++ mail/message-list.c	(working copy)
@@ -223,6 +223,7 @@ static struct {
 	{ "mail-unread",                       NULL },
 	{ "mail-read",                         NULL },
 	{ "mail-replied",                      NULL },
+	{ "mail-forward",                      NULL },
 	{ "stock_mail-unread-multiple",        NULL },
 	{ "stock_mail-open-multiple",          NULL },
 	{ NULL,                                NULL },
@@ -1053,6 +1054,7 @@ static const char *status_map[] = {
 	N_("Unseen"),
 	N_("Seen"),
 	N_("Answered"),
+	N_("Forwarded"),
 	N_("Multiple Unseen Messages"),
 	N_("Multiple Messages"),
 };
@@ -1076,7 +1078,7 @@ ml_value_to_string (ETreeModel *etm, int
 	switch (col){
 	case COL_MESSAGE_STATUS:
 		i = GPOINTER_TO_UINT(value);
-		if (i > 4)
+		if (i > 5)
 			return g_strdup ("");
 		return g_strdup (_(status_map[i]));
 
@@ -1292,6 +1294,8 @@ ml_tree_value_at (ETreeModel *etm, ETree
 		flags = camel_message_info_flags(msg_info);
 		if (flags & CAMEL_MESSAGE_ANSWERED)
 			return GINT_TO_POINTER (2);
+		else if (flags & CAMEL_MESSAGE_FORWARDED)
+			return GINT_TO_POINTER (3);
 		else if (flags & CAMEL_MESSAGE_SEEN)
 			return GINT_TO_POINTER (1);
 		else
@@ -1665,7 +1669,7 @@ static ECell * create_composite_cell (in
 	cell_hbox = e_cell_hbox_new ();
 
 	for (i = 0; i < 2; i++)
-		images [i] = states_pixmaps [i + 5].pixbuf;
+		images [i] = states_pixmaps [i + 6].pixbuf;
 	cell_attach = e_cell_toggle_new (0, 2, images);
 
 	cell_date = e_cell_date_new(NULL, GTK_JUSTIFY_RIGHT);
@@ -1719,32 +1723,32 @@ message_list_create_extras (void)
 
 	extras = e_table_extras_new ();
 	e_table_extras_add_pixbuf (extras, "status", states_pixmaps [0].pixbuf);
-	e_table_extras_add_pixbuf (extras, "score", states_pixmaps [13].pixbuf);
-	e_table_extras_add_pixbuf (extras, "attachment", states_pixmaps [6].pixbuf);
-	e_table_extras_add_pixbuf (extras, "flagged", states_pixmaps [7].pixbuf);
-	e_table_extras_add_pixbuf (extras, "followup", states_pixmaps [15].pixbuf);
+	e_table_extras_add_pixbuf (extras, "score", states_pixmaps [14].pixbuf);
+	e_table_extras_add_pixbuf (extras, "attachment", states_pixmaps [7].pixbuf);
+	e_table_extras_add_pixbuf (extras, "flagged", states_pixmaps [8].pixbuf);
+	e_table_extras_add_pixbuf (extras, "followup", states_pixmaps [16].pixbuf);
 
 	e_table_extras_add_compare (extras, "address_compare", address_compare);
 
-	for (i = 0; i < 5; i++)
+	for (i = 0; i < 6; i++)
 		images [i] = states_pixmaps [i].pixbuf;
 
-	e_table_extras_add_cell (extras, "render_message_status", e_cell_toggle_new (0, 5, images));
+	e_table_extras_add_cell (extras, "render_message_status", e_cell_toggle_new (0, 6, images));
 
 	for (i = 0; i < 2; i++)
-		images [i] = states_pixmaps [i + 5].pixbuf;
+		images [i] = states_pixmaps [i + 6].pixbuf;
 
 	e_table_extras_add_cell (extras, "render_attachment", e_cell_toggle_new (0, 2, images));
 
-	images [1] = states_pixmaps [7].pixbuf;
+	images [1] = states_pixmaps [8].pixbuf;
 	e_table_extras_add_cell (extras, "render_flagged", e_cell_toggle_new (0, 2, images));
 
-	images[1] = states_pixmaps [15].pixbuf;
-	images[2] = states_pixmaps [16].pixbuf;
+	images[1] = states_pixmaps [16].pixbuf;
+	images[2] = states_pixmaps [17].pixbuf;
 	e_table_extras_add_cell (extras, "render_flag_status", e_cell_toggle_new (0, 3, images));
 
 	for (i = 0; i < 7; i++)
-		images[i] = states_pixmaps [i + 7].pixbuf;
+		images[i] = states_pixmaps [i + 8].pixbuf;
 
 	e_table_extras_add_cell (extras, "render_score", e_cell_toggle_new (0, 7, images));
 
