From: Andrej Kacian Date: Mon, 3 Aug 2015 21:25:18 +0000 (+0200) Subject: Improve how message body is quoted for reply/forward/etc. X-Git-Tag: 3.13.0~74 X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=commitdiff_plain;h=31806c2352c74a2df322b3483b58123d9320e852 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. --- diff --git a/src/messageview.c b/src/messageview.c index e6fc2ad7b..4886f08c8 100644 --- 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 index d7420b56b..0a39b7a9d 100644 --- 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);