talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 31806c2352c74a2df322b3483b58123d9320e852
parent bf373b8226f1b3b335619a75de80041ee5ad9761
Author: Andrej Kacian <ticho@claws-mail.org>
Date:   Mon,  3 Aug 2015 23:25:18 +0200

Improve how message body is quoted for reply/forward/etc.

Insert body_start and body_end text marks around quotable
message body, and quote that if user has not selected any text
to quote for their reply.
Closes bug #3483.

Diffstat:
Msrc/messageview.c | 38++++++++++++++++++++++++++++++--------
Msrc/textview.c | 15+++++++++++++++
2 files changed, 45 insertions(+), 8 deletions(-)

diff --git a/src/messageview.c b/src/messageview.c @@ -2119,6 +2119,8 @@ gchar *messageview_get_selection(MessageView *msgview) GtkTextView *edit = NULL; GtkTextBuffer *textbuf; gint body_pos = 0; + GtkTextIter start_iter, end_iter; + GtkTextMark *body_start, *body_end; cm_return_val_if_fail(msgview != NULL, NULL); @@ -2140,15 +2142,35 @@ gchar *messageview_get_selection(MessageView *msgview) textbuf = gtk_text_view_get_buffer(edit); - if (gtk_text_buffer_get_selection_bounds(textbuf, NULL, NULL)) + if (gtk_text_buffer_get_selection_bounds(textbuf, NULL, NULL)) { return gtkut_text_view_get_selection(edit); - else if (msgview->filtered) { - GtkTextIter start_iter, end_iter; - gtk_text_buffer_get_iter_at_offset(textbuf, &start_iter, body_pos); - gtk_text_buffer_get_end_iter(textbuf, &end_iter); - gtk_text_buffer_get_text(textbuf, &start_iter, &end_iter, FALSE); - } else - text = NULL; + } else { + if (msgview->filtered) { + gtk_text_buffer_get_iter_at_offset(textbuf, &start_iter, body_pos); + gtk_text_buffer_get_end_iter(textbuf, &end_iter); + } else { + body_start = gtk_text_buffer_get_mark(textbuf, "body_start"); + + /* If there is no body_start mark, an attachment is likely + * selected, and we're looking at instructions on what to do + * with it. No point in quoting that, so we'll just return NULL, + * so that original message body is quoted instead down the line. + */ + if (body_start == NULL) { + return NULL; + } + + gtk_text_buffer_get_iter_at_mark(textbuf, &start_iter, body_start); + + body_end = gtk_text_buffer_get_mark(textbuf, "body_end"); + if (body_end != NULL) /* Just in case */ + gtk_text_buffer_get_iter_at_mark(textbuf, &end_iter, body_end); + else + gtk_text_buffer_get_end_iter(textbuf, &end_iter); + } + + return gtk_text_buffer_get_text(textbuf, &start_iter, &end_iter, FALSE); + } return text; } diff --git a/src/textview.c b/src/textview.c @@ -663,6 +663,7 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo) const gchar *name; gchar *content_type; gint charcount; + START_TIMING(""); cm_return_if_fail(mimeinfo != NULL); @@ -813,7 +814,17 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo) if (prefs_common.display_header && (charcount > 0)) gtk_text_buffer_insert(buffer, &iter, "\n", 1); + if (!gtk_text_buffer_get_mark(buffer, "body_start")) { + gtk_text_buffer_get_end_iter(buffer, &iter); + gtk_text_buffer_create_mark(buffer, "body_start", &iter, TRUE); + } + textview_write_body(textview, mimeinfo); + + if (!gtk_text_buffer_get_mark(buffer, "body_end")) { + gtk_text_buffer_get_end_iter(buffer, &iter); + gtk_text_buffer_create_mark(buffer, "body_end", &iter, TRUE); + } } END_TIMING(); } @@ -1747,6 +1758,10 @@ void textview_clear(TextView *textview) buffer = gtk_text_view_get_buffer(text); gtk_text_buffer_set_text(buffer, "", -1); + if (gtk_text_buffer_get_mark(buffer, "body_start")) + gtk_text_buffer_delete_mark_by_name(buffer, "body_start"); + if (gtk_text_buffer_get_mark(buffer, "body_end")) + gtk_text_buffer_delete_mark_by_name(buffer, "body_end"); TEXTVIEW_STATUSBAR_POP(textview); textview_uri_list_remove_all(textview->uri_list);