Improve how message body is quoted for reply/forward/etc.
authorAndrej Kacian <ticho@claws-mail.org>
Mon, 3 Aug 2015 21:25:18 +0000 (23:25 +0200)
committerAndrej Kacian <ticho@claws-mail.org>
Thu, 13 Aug 2015 18:28:38 +0000 (20:28 +0200)
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.

src/messageview.c
src/textview.c

index e6fc2ad7b44228658b9154457e304205ea4bf3e0..4886f08c8e8ab7921d5ab8b5767a5a889588debf 100644 (file)
@@ -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;
 }
index d7420b56b6bbd6bcdc10a9137f176dde8782775e..0a39b7a9db1245c67289c7ba5b5419df73a23dac 100644 (file)
@@ -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);