aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog15
-rw-r--r--mail/em-composer-utils.c103
-rw-r--r--mail/message-list.c30
3 files changed, 120 insertions, 28 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index 29a8ab27c4..8bf754f62d 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,18 @@
+2008-06-02 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-30 Lucian Langa <lucilanga@gnome.org>
** Fix for bug #535670
diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c
index f5a3a2ced0..6934e3f33d 100644
--- a/mail/em-composer-utils.c
+++ b/mail/em-composer-utils.c
@@ -631,7 +631,7 @@ em_composer_utils_setup_callbacks (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 use_default_callbacks)
{
EMsgComposer *composer;
EComposerHeaderTable *table;
@@ -648,7 +648,8 @@ create_new_composer (const char *subject, const char *fromuri)
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 *fromuri)
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 *folder, GPtrArray *uids, gboolean replace)
}
/* Forwarding messages... */
+struct forward_attached_data
+{
+ CamelFolder *folder;
+ GPtrArray *uids;
+ char *fromuri;
+};
+
static void
-forward_attached (CamelFolder *folder, GPtrArray *messages, CamelMimePart *part, char *subject, const char *fromuri)
+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 *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, GPtrArray *messages, CamelMimePart *part,
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, GPtrArray *messages, CamelMimePart *pa
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 *messages, int style, const char *fromuri)
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 *messages, int style, const char *fromuri)
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 *messages, int style, const char *fromuri)
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 *folder, GPtrArray *uids, const char *fromu
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 (CamelMimeMessage *message, const char *fromuri)
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;
}
diff --git a/mail/message-list.c b/mail/message-list.c
index b23cc1c160..d2cb8000b2 100644
--- a/mail/message-list.c
+++ b/mail/message-list.c
@@ -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 col, const void *value, void *data)
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, ETreePath path, int col, void *model_data)
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 (int col)
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));