* src/modest-text-utils.[ch]:
[modest] / src / widgets / modest-attachments-view.c
index aec2c18..557fc88 100644 (file)
@@ -29,8 +29,6 @@
 
 #include <config.h>
 
-//#include <glib/gi18n-lib.h>
-
 #include <string.h>
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
@@ -41,6 +39,7 @@
 #include <modest-runtime.h>
 #include <modest-attachment-view.h>
 #include <modest-attachments-view.h>
+#include <modest-tny-mime-part.h>
 
 static GObjectClass *parent_class = NULL;
 
@@ -107,6 +106,7 @@ modest_attachments_view_set_message (ModestAttachmentsView *attachments_view, Tn
        ModestAttachmentsViewPrivate *priv = MODEST_ATTACHMENTS_VIEW_GET_PRIVATE (attachments_view);
        TnyList *parts;
        TnyIterator *iter;
+       const gchar *msg_content_type = NULL;
        
        if (msg == priv->msg) return;
 
@@ -126,6 +126,14 @@ modest_attachments_view_set_message (ModestAttachmentsView *attachments_view, Tn
                return;
        }
 
+       /* If the top mime part is a multipart/related, we don't show the attachments, as they're
+        * embedded images in body */
+       msg_content_type = tny_mime_part_get_content_type (TNY_MIME_PART (priv->msg));
+       if ((msg_content_type != NULL) && !strcasecmp (msg_content_type, "multipart/related")) {
+               gtk_widget_queue_draw (GTK_WIDGET (attachments_view));
+               return;
+       }
+
        parts = TNY_LIST (tny_simple_list_new ());
        tny_mime_part_get_parts (TNY_MIME_PART (priv->msg), parts);
        iter = tny_list_create_iterator (parts);
@@ -134,22 +142,26 @@ modest_attachments_view_set_message (ModestAttachmentsView *attachments_view, Tn
                TnyMimePart *part;
 
                part = TNY_MIME_PART (tny_iterator_get_current (iter));
-               if (part && (tny_mime_part_is_attachment (part) || TNY_IS_MSG (part))) {
-                       modest_attachments_view_add_attachment (attachments_view, part);
-               }
+
+               if (part && (modest_tny_mime_part_is_attachment_for_modest (part))) 
+                       modest_attachments_view_add_attachment (attachments_view, part, TRUE, 0);
 
                if (part)
                        g_object_unref (part);
 
                tny_iterator_next (iter);
        }
+       g_object_unref (iter);
+       g_object_unref (parts);
+       
 
        gtk_widget_queue_draw (GTK_WIDGET (attachments_view));
 
 }
 
 void
-modest_attachments_view_add_attachment (ModestAttachmentsView *attachments_view, TnyMimePart *part)
+modest_attachments_view_add_attachment (ModestAttachmentsView *attachments_view, TnyMimePart *part,
+                                       gboolean detect_size, guint64 size)
 {
        GtkWidget *att_view = NULL;
        ModestAttachmentsViewPrivate *priv = NULL;
@@ -159,7 +171,9 @@ modest_attachments_view_add_attachment (ModestAttachmentsView *attachments_view,
 
        priv = MODEST_ATTACHMENTS_VIEW_GET_PRIVATE (attachments_view);
 
-       att_view = modest_attachment_view_new (part);
+       att_view = modest_attachment_view_new (part, detect_size);
+       if (!detect_size)
+               modest_attachment_view_set_size (MODEST_ATTACHMENT_VIEW (att_view), size);
        gtk_box_pack_end (GTK_BOX (priv->box), att_view, FALSE, FALSE, 0);
        gtk_widget_show_all (att_view);
 }
@@ -587,12 +601,19 @@ static void
 set_selected (ModestAttachmentsView *atts_view, ModestAttachmentView *att_view)
 {
        ModestAttachmentsViewPrivate *priv = MODEST_ATTACHMENTS_VIEW_GET_PRIVATE (atts_view);
+       TnyMimePart *part;
 
        unselect_all (atts_view);
-       gtk_widget_set_state (GTK_WIDGET (att_view), GTK_STATE_SELECTED);
+       part = tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (att_view));
+       
        g_list_free (priv->selected);
        priv->selected = NULL;
-       priv->selected = g_list_append (priv->selected, att_view);
+       if (TNY_IS_MIME_PART (part) && !tny_mime_part_is_purged (part)) {
+               gtk_widget_set_state (GTK_WIDGET (att_view), GTK_STATE_SELECTED);
+               priv->selected = g_list_append (priv->selected, att_view);
+       }
+       if (part)
+               g_object_unref (part);
        
        own_clipboard (atts_view);
 }
@@ -604,6 +625,7 @@ select_range (ModestAttachmentsView *atts_view, ModestAttachmentView *att1, Mode
        GList *children = NULL;
        GList *node = NULL;
        gboolean selecting = FALSE;
+       TnyMimePart *part;
 
        unselect_all (atts_view);
 
@@ -619,12 +641,20 @@ select_range (ModestAttachmentsView *atts_view, ModestAttachmentView *att1, Mode
 
        for (node = children; node != NULL; node = g_list_next (node)) {
                if ((node->data == att1) || (node->data == att2)) {
-                       gtk_widget_set_state (GTK_WIDGET (node->data), GTK_STATE_SELECTED);
-                       priv->selected = g_list_append (priv->selected, node->data);
+                       part = tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (node->data));
+                       if (!tny_mime_part_is_purged (part)) {
+                               gtk_widget_set_state (GTK_WIDGET (node->data), GTK_STATE_SELECTED);
+                               priv->selected = g_list_append (priv->selected, node->data);
+                       }
+                       g_object_unref (part);
                        selecting = !selecting;
                } else if (selecting) {
-                       gtk_widget_set_state (GTK_WIDGET (node->data), GTK_STATE_SELECTED);
-                       priv->selected = g_list_append (priv->selected, node->data);
+                       part = tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (node->data));
+                       if (!tny_mime_part_is_purged (part)) {
+                               gtk_widget_set_state (GTK_WIDGET (node->data), GTK_STATE_SELECTED);
+                               priv->selected = g_list_append (priv->selected, node->data);
+                       }
+                       g_object_unref (part);
                }
                        
        }
@@ -640,22 +670,7 @@ static void clipboard_get (GtkClipboard *clipboard, GtkSelectionData *selection_
        ModestAttachmentsViewPrivate *priv = MODEST_ATTACHMENTS_VIEW_GET_PRIVATE (atts_view);
 
        if ((priv->selected != NULL)&&(priv->selected->next == NULL)) {
-               TnyMimePart *mime_part = tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (priv->selected->data));
-               if (info != MODEST_ATTACHMENTS_VIEW_CLIPBOARD_TYPE_INDEX) {
-                       if (TNY_IS_MSG (mime_part)) {
-                               TnyHeader *header = tny_msg_get_header (TNY_MSG (mime_part));
-                               if (TNY_IS_HEADER (header)) {
-                                       const gchar *subject = NULL;
-                                       subject = tny_header_get_subject (header);
-                                       if ((subject == NULL) || (subject[0] == '\0'))
-                                               subject = _("mail_va_no_subject");
-                                       gtk_selection_data_set_text (selection_data, subject, -1);
-                                       g_object_unref (header);
-                               }
-                       } else {
-                               gtk_selection_data_set_text (selection_data, tny_mime_part_get_filename (mime_part), -1);
-                       }
-               } else {
+               if (info == MODEST_ATTACHMENTS_VIEW_CLIPBOARD_TYPE_INDEX) {
                        /* MODEST_ATTACHMENT requested. As the content id is not filled in all the case, we'll
                         * use an internal index. This index is simply the index of the attachment in the vbox */
                        GList *box_children = NULL;
@@ -678,42 +693,47 @@ static void clipboard_clear (GtkClipboard *clipboard, gpointer userdata)
        unselect_all (atts_view);
 }
 
-GList *
+TnyList *
 modest_attachments_view_get_selection (ModestAttachmentsView *atts_view)
 {
        ModestAttachmentsViewPrivate *priv;
-       GList *selection, *node;
+       TnyList *selection;
+       GList *node;
 
        g_return_val_if_fail (MODEST_IS_ATTACHMENTS_VIEW (atts_view), NULL);
        priv = MODEST_ATTACHMENTS_VIEW_GET_PRIVATE (atts_view);
 
-       selection = NULL;
+       selection = tny_simple_list_new ();
        for (node = priv->selected; node != NULL; node = g_list_next (node)) {
                ModestAttachmentView *att_view = (ModestAttachmentView *) node->data;
                TnyMimePart *part = tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (att_view));
-               selection = g_list_append (selection, part);
+               tny_list_append (selection, (GObject *) part);
+               g_object_unref (part);
        }
        
        return selection;
 }
 
-GList *
+TnyList *
 modest_attachments_view_get_attachments (ModestAttachmentsView *atts_view)
 {
        ModestAttachmentsViewPrivate *priv;
-       GList *children, *node, *att_list = NULL;
+       TnyList *att_list;
+       GList *children, *node= NULL;
 
        g_return_val_if_fail (MODEST_IS_ATTACHMENTS_VIEW (atts_view), NULL);
        priv = MODEST_ATTACHMENTS_VIEW_GET_PRIVATE (atts_view);
 
+       att_list = TNY_LIST (tny_simple_list_new ());
+
        children = gtk_container_get_children (GTK_CONTAINER (priv->box));
        for (node = children; node != NULL; node = g_list_next (node)) {
                GtkWidget *att_view = GTK_WIDGET (node->data);
                TnyMimePart *mime_part = tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (att_view));
-               att_list = g_list_prepend (att_list, mime_part);
+               tny_list_append (att_list, (GObject *) mime_part);
+               g_object_unref (mime_part);
        }
        g_list_free (children);
-       att_list = g_list_reverse (att_list);
        return att_list;
 
 }
@@ -758,14 +778,47 @@ modest_attachments_view_has_attachments (ModestAttachmentsView *atts_view)
        return result;
 }
 
+void
+modest_attachments_view_get_sizes (ModestAttachmentsView *attachments_view,
+                                  gint *attachments_count,
+                                  guint64 *attachments_size)
+{
+       ModestAttachmentsViewPrivate *priv;
+       GList *children, *node;
+
+       g_return_if_fail (MODEST_IS_ATTACHMENTS_VIEW (attachments_view));
+       g_return_if_fail (attachments_count != NULL && attachments_size != NULL);
+
+       *attachments_count = 0;
+       *attachments_size = 0;
+
+       priv = MODEST_ATTACHMENTS_VIEW_GET_PRIVATE (attachments_view);
+
+       children = gtk_container_get_children (GTK_CONTAINER (priv->box));
+       for (node = children; node != NULL; node = g_list_next (node)) {
+               GtkWidget *att_view = (GtkWidget *) node->data;
+               TnyMimePart *part = tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (att_view));
+
+               if (!tny_mime_part_is_purged (part)) {
+                       guint64 size;
+                       *attachments_count ++;
+                       size = modest_attachment_view_get_size (MODEST_ATTACHMENT_VIEW (att_view));
+                       if (size == 0) {
+                               /* we do a random estimation of the size of an attachment */
+                               size = 32768;
+                       }
+                       *attachments_size += size;
+                       
+               }
+               g_object_unref (part);
+       }
+       g_list_free (children);
+}
+
 static void
 own_clipboard (ModestAttachmentsView *atts_view)
 {
        GtkTargetEntry targets[] = {
-               {"TEXT", 0, 0},
-               {"UTF8_STRING", 0, 1},
-               {"COMPOUND_TEXT", 0, 2},
-               {"STRING", 0, 3},
                {MODEST_ATTACHMENTS_VIEW_CLIPBOARD_TYPE, 0, MODEST_ATTACHMENTS_VIEW_CLIPBOARD_TYPE_INDEX},
        };