sync with 0.7.6cvs14
[claws.git] / src / textview.c
index f30c0d46eceda0e4453b514fa376637a2dbb0aa9..531e39609eaf0b3ac99f00301828992ce555e093 100644 (file)
@@ -115,6 +115,9 @@ static void textview_show_ertf              (TextView       *textview,
 static void textview_add_part          (TextView       *textview,
                                         MimeInfo       *mimeinfo,
                                         FILE           *fp);
+static void textview_add_parts         (TextView       *textview,
+                                        MimeInfo       *mimeinfo,
+                                        FILE           *fp);
 static void textview_write_body                (TextView       *textview,
                                         MimeInfo       *mimeinfo,
                                         FILE           *fp,
@@ -294,7 +297,7 @@ void textview_update_message_colors(void)
 void textview_show_message(TextView *textview, MimeInfo *mimeinfo,
                           const gchar *file)
 {
-       GtkSText *text = GTK_STEXT(textview->text);
+       GtkSText *text;
        FILE *fp;
        const gchar *charset = NULL;
        GPtrArray *headers = NULL;
@@ -310,8 +313,8 @@ void textview_show_message(TextView *textview, MimeInfo *mimeinfo,
                charset = mimeinfo->charset;
        textview_set_font(textview, charset);
        textview_clear(textview);
-       textview->body_pos = 0;
-       textview->cur_pos  = 0;
+
+       text = GTK_STEXT(textview->text);
 
        gtk_stext_freeze(text);
 
@@ -323,15 +326,7 @@ void textview_show_message(TextView *textview, MimeInfo *mimeinfo,
                textview->body_pos = gtk_stext_get_length(text);
        }
 
-       while (mimeinfo != NULL) {
-               textview_add_part(textview, mimeinfo, fp);
-               if (mimeinfo->parent && mimeinfo->parent->content_type &&
-                   !strcasecmp(mimeinfo->parent->content_type,
-                               "multipart/alternative"))
-                       mimeinfo = mimeinfo->parent->next;
-               else
-                       mimeinfo = procmime_mimeinfo_next(mimeinfo);
-       }
+       textview_add_parts(textview, mimeinfo, fp);
 
        gtk_stext_thaw(text);
 
@@ -340,17 +335,22 @@ void textview_show_message(TextView *textview, MimeInfo *mimeinfo,
 
 void textview_show_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp)
 {
-       GtkSText *text = GTK_STEXT(textview->text);
+       GtkSText *text;
        gchar buf[BUFFSIZE];
        const gchar *boundary = NULL;
        gint boundary_len = 0;
        const gchar *charset = NULL;
        GPtrArray *headers = NULL;
+       gboolean is_rfc822_part = FALSE;
 
        g_return_if_fail(mimeinfo != NULL);
        g_return_if_fail(fp != NULL);
 
-       if (mimeinfo->mime_type == MIME_MULTIPART) return;
+       if (mimeinfo->mime_type == MIME_MULTIPART) {
+               textview_clear(textview);
+               textview_add_parts(textview, mimeinfo, fp);
+               return;
+       }
 
        if (mimeinfo->parent && mimeinfo->parent->boundary) {
                boundary = mimeinfo->parent->boundary;
@@ -393,17 +393,15 @@ void textview_show_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp)
        }
 
        /* display attached RFC822 single text message */
-       if (mimeinfo->parent && mimeinfo->mime_type == MIME_MESSAGE_RFC822) {
-               if (headers) procheader_header_array_destroy(headers);
-               if (!mimeinfo->sub || mimeinfo->sub->children) return;
-               headers = textview_scan_header(textview, fp);
-               mimeinfo = mimeinfo->sub;
-       } else if (!mimeinfo->parent &&
-                  mimeinfo->mime_type == MIME_MESSAGE_RFC822) {
+       if (mimeinfo->mime_type == MIME_MESSAGE_RFC822) {
                if (headers) procheader_header_array_destroy(headers);
-               if (!mimeinfo->sub) return;
+               if (!mimeinfo->sub) {
+                       textview_clear(textview);
+                       return;
+               }
                headers = textview_scan_header(textview, fp);
                mimeinfo = mimeinfo->sub;
+               is_rfc822_part = TRUE;
        }
 
        if (prefs_common.force_charset)
@@ -412,20 +410,23 @@ void textview_show_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp)
                charset = mimeinfo->charset;
        textview_set_font(textview, charset);
 
-       textview_clear(textview);
-       gtk_stext_freeze(text);
+       text = GTK_STEXT(textview->text);
 
-       textview->body_pos = 0;
-       textview->cur_pos  = 0;
+       gtk_stext_freeze(text);
+       textview_clear(textview);
 
        if (headers) {
                textview_show_header(textview, headers);
-               gtk_stext_insert(text, NULL, NULL, NULL, "\n", 1);
                procheader_header_array_destroy(headers);
                textview->body_pos = gtk_stext_get_length(text);
+               if (!mimeinfo->main)
+                       gtk_stext_insert(text, NULL, NULL, NULL, "\n", 1);
        }
 
-       textview_write_body(textview, mimeinfo, fp, charset);
+       if (mimeinfo->mime_type == MIME_MULTIPART || is_rfc822_part)
+               textview_add_parts(textview, mimeinfo, fp);
+       else
+               textview_write_body(textview, mimeinfo, fp, charset);
 
        gtk_stext_thaw(text);
 }
@@ -466,9 +467,11 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp)
        if (mimeinfo->mime_type == MIME_MESSAGE_RFC822) {
                headers = textview_scan_header(textview, fp);
                if (headers) {
+                       gtk_stext_freeze(text);
                        gtk_stext_insert(text, NULL, NULL, NULL, "\n", 1);
                        textview_show_header(textview, headers);
                        procheader_header_array_destroy(headers);
+                       gtk_stext_thaw(text);
                }
                return;
        }
@@ -505,6 +508,28 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp)
        gtk_stext_thaw(text);
 }
 
+static void textview_add_parts(TextView *textview, MimeInfo *mimeinfo, FILE *fp)
+{
+       gint level;
+
+       g_return_if_fail(mimeinfo != NULL);
+       g_return_if_fail(fp != NULL);
+
+       level = mimeinfo->level;
+
+       for (;;) {
+               textview_add_part(textview, mimeinfo, fp);
+               if (mimeinfo->parent && mimeinfo->parent->content_type &&
+                   !strcasecmp(mimeinfo->parent->content_type,
+                               "multipart/alternative"))
+                       mimeinfo = mimeinfo->parent->next;
+               else
+                       mimeinfo = procmime_mimeinfo_next(mimeinfo);
+               if (!mimeinfo || mimeinfo->level <= level)
+                       break;
+       }
+}
+
 #define TEXT_INSERT(str) \
        gtk_stext_insert(text, textview->msgfont, NULL, NULL, str, -1)
 
@@ -978,6 +1003,12 @@ static void textview_write_link(TextView *textview, const gchar *url,
     }
 #endif
 
+    if (!conv || conv_convert(conv, buf, sizeof(buf), str) < 0)
+       strncpy2(buf, str, sizeof(buf));
+
+    strcrchomp(buf);
+    gtk_stext_insert(text, textview->msgfont, NULL, NULL, " ", 1);
     /* this part is based on the code in make_clickable_parts */
     if (prefs_common.enable_color) {
        link_color = &uri_color;
@@ -1063,6 +1094,9 @@ void textview_clear(TextView *textview)
 
        textview_uri_list_remove_all(textview->uri_list);
        textview->uri_list = NULL;
+
+       textview->body_pos = 0;
+       textview->cur_pos  = 0;
 }
 
 void textview_destroy(TextView *textview)