** Show the "X new messages" string vertically centered
[modest] / src / widgets / modest-attachments-view.c
index a6e55a4..a4476b9 100644 (file)
@@ -60,6 +60,7 @@ struct _ModestAttachmentsViewPrivate
        GList *selected;
        GtkWidget *rubber_start;
        GtkWidget *press_att_view;
+       GtkWidget *previous_selection;
        ModestAttachmentsViewStyle style;
 };
 
@@ -103,6 +104,27 @@ modest_attachments_view_new (TnyMsg *msg)
        return GTK_WIDGET (self);
 }
 
+static void
+add_digest_attachments (ModestAttachmentsView *attachments_view, TnyMimePart *part)
+{
+       TnyList *parts;
+       TnyIterator *iter;
+
+       parts = TNY_LIST (tny_simple_list_new());
+       tny_mime_part_get_parts (TNY_MIME_PART (part), parts);
+
+       for (iter  = tny_list_create_iterator(parts); 
+            !tny_iterator_is_done (iter);
+            tny_iterator_next (iter)) {
+               TnyMimePart *cur_part = TNY_MIME_PART (tny_iterator_get_current (iter));
+               modest_attachments_view_add_attachment (attachments_view, cur_part, TRUE, 0);
+               g_object_unref (cur_part);
+       }
+       g_object_unref (iter);
+       g_object_unref (parts);
+
+}
+
 
 void
 modest_attachments_view_set_message (ModestAttachmentsView *attachments_view, TnyMsg *msg)
@@ -112,6 +134,8 @@ modest_attachments_view_set_message (ModestAttachmentsView *attachments_view, Tn
        TnyIterator *iter;
        gchar *msg_content_type = NULL;
        TnyMimePart *part_to_check;
+       gboolean body_found;
+       gboolean is_alternate;
        
        if (msg == priv->msg) return;
 
@@ -134,6 +158,7 @@ modest_attachments_view_set_message (ModestAttachmentsView *attachments_view, Tn
        part_to_check = modest_tny_msg_get_attachments_parent (TNY_MSG (msg));
 
        msg_content_type = modest_tny_mime_part_get_content_type (TNY_MIME_PART (part_to_check));
+       is_alternate = !strcasecmp (msg_content_type, "multipart/alternative");
 
        /* If the top mime part is a multipart/related, we don't show the attachments, as they're
         * embedded images in body */
@@ -177,14 +202,31 @@ modest_attachments_view_set_message (ModestAttachmentsView *attachments_view, Tn
        tny_mime_part_get_parts (TNY_MIME_PART (part_to_check), parts);
        iter = tny_list_create_iterator (parts);
 
+       body_found = FALSE;
        while (!tny_iterator_is_done (iter)) {
                TnyMimePart *part;
+               gchar *content_type;
 
                part = TNY_MIME_PART (tny_iterator_get_current (iter));
 
-               if (part && (modest_tny_mime_part_is_attachment_for_modest (part))) 
+               if (part && (modest_tny_mime_part_is_attachment_for_modest (part))) {
                        modest_attachments_view_add_attachment (attachments_view, part, TRUE, 0);
 
+               } else if (part && !is_alternate) {
+                       content_type = g_ascii_strdown (tny_mime_part_get_content_type (part), -1);
+                       g_strstrip (content_type);
+
+                       if (g_str_has_prefix (content_type, "multipart/digest")) {
+                               add_digest_attachments (attachments_view, part);
+                       } else if (body_found && g_str_has_prefix (content_type, "text/")) {
+                                  modest_attachments_view_add_attachment (attachments_view, part, TRUE, 0);
+                       } else if (g_str_has_prefix (content_type, "multipart/") || 
+                                  g_str_has_prefix (content_type, "text/")) {
+                               body_found = TRUE;
+                       }
+               }
+
+
                if (part)
                        g_object_unref (part);
 
@@ -431,12 +473,16 @@ button_press_event (GtkWidget *widget,
                if (att_view != NULL) {
                        if (priv->style == MODEST_ATTACHMENTS_VIEW_STYLE_NO_FOCUS) {
                                unselect_all (MODEST_ATTACHMENTS_VIEW (widget));
-                       } else if ((priv->style == MODEST_ATTACHMENTS_VIEW_STYLE_LINKS) ||
-                           (GTK_WIDGET_STATE (att_view) == GTK_STATE_SELECTED && (g_list_length (priv->selected) < 2))) {
+                       } else if (priv->style == MODEST_ATTACHMENTS_VIEW_STYLE_LINKS) {
                                priv->press_att_view = att_view;
                                set_selected (MODEST_ATTACHMENTS_VIEW (widget), MODEST_ATTACHMENT_VIEW (att_view));
                                gtk_grab_add (widget);
                        } else {
+                               if (g_list_length (priv->selected) == 1) {
+                                       priv->previous_selection = GTK_WIDGET (priv->selected->data);
+                               } else {
+                                       priv->previous_selection = NULL;
+                               }
                                TnyMimePart *mime_part = tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (att_view));
 
                                /* Do not select purged attachments */
@@ -476,7 +522,14 @@ button_release_event (GtkWidget *widget,
                        priv->press_att_view = NULL;
                } else {
 
-                       if (att_view != NULL) {
+                       if (priv->style != MODEST_ATTACHMENTS_VIEW_STYLE_NO_FOCUS &&
+                           priv->rubber_start == att_view  && 
+                           priv->previous_selection == att_view) {
+                               TnyMimePart *mime_part;
+                               mime_part = tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (att_view));
+                               g_signal_emit (G_OBJECT (widget), signals[ACTIVATE_SIGNAL], 0, mime_part);
+                               g_object_unref (mime_part);
+                       } else if (att_view != NULL) {
                                unselect_all (MODEST_ATTACHMENTS_VIEW (widget));
                                select_range (MODEST_ATTACHMENTS_VIEW (widget), 
                                              MODEST_ATTACHMENT_VIEW (priv->rubber_start),