Better attachments detection for text/calendar
[modest] / src / widgets / modest-attachments-view.c
index cb26f1e..a83f7d8 100644 (file)
@@ -41,6 +41,7 @@
 #include <modest-attachments-view.h>
 #include <modest-tny-mime-part.h>
 #include <modest-tny-msg.h>
+#include <modest-ui-constants.h>
 
 static GObjectClass *parent_class = NULL;
 
@@ -60,6 +61,7 @@ struct _ModestAttachmentsViewPrivate
        GList *selected;
        GtkWidget *rubber_start;
        GtkWidget *press_att_view;
+       GtkWidget *previous_selection;
        ModestAttachmentsViewStyle style;
 };
 
@@ -80,6 +82,8 @@ static void select_range (ModestAttachmentsView *atts_view, ModestAttachmentView
 static void clipboard_get (GtkClipboard *clipboard, GtkSelectionData *selection_data,
                           guint info, gpointer userdata);
 static void own_clipboard (ModestAttachmentsView *atts_view);
+static void on_notify_style (GObject *obj, GParamSpec *spec, gpointer userdata);
+static void update_style (ModestAttachmentsView *self);
 
 static guint signals[LAST_SIGNAL] = {0};
 
@@ -149,15 +153,13 @@ modest_attachments_view_set_message (ModestAttachmentsView *attachments_view, Tn
        priv->selected = NULL;
 
        gtk_container_foreach (GTK_CONTAINER (priv->box), (GtkCallback) gtk_widget_destroy, NULL);
-       
-       if (priv->msg == NULL) {
+
+       if (priv->msg == NULL)
                return;
-       }
 
        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");
+       is_alternate = (msg_content_type != NULL) && !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 */
@@ -168,7 +170,7 @@ modest_attachments_view_set_message (ModestAttachmentsView *attachments_view, Tn
                g_free (msg_content_type);
 
                header_content_type = modest_tny_mime_part_get_headers_content_type (TNY_MIME_PART (part_to_check));
-               
+
                if ((header_content_type != NULL) && 
                    !strstr (header_content_type, "application/")) {
                        application_multipart = TRUE;
@@ -185,7 +187,8 @@ modest_attachments_view_set_message (ModestAttachmentsView *attachments_view, Tn
 
                direct_attach = (!g_str_has_prefix (msg_content_type, "message/rfc822") && 
                                 !g_str_has_prefix (msg_content_type, "multipart") && 
-                                !g_str_has_prefix (msg_content_type, "text/"));
+                                !g_str_has_prefix (msg_content_type, "text/plain") &&
+                                !g_str_has_prefix (msg_content_type, "text/html"));
 
                g_free (msg_content_type);
 
@@ -217,10 +220,13 @@ modest_attachments_view_set_message (ModestAttachmentsView *attachments_view, Tn
 
                        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/")) {
+                       } else if (body_found && 
+                                  (g_str_has_prefix (content_type, "text/plain") ||
+                                   g_str_has_prefix (content_type, "text/html"))) {
                                   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/")) {
+                                  g_str_has_prefix (content_type, "text/plain") ||
+                                  g_str_has_prefix (content_type, "text/html")) {
                                body_found = TRUE;
                        }
                }
@@ -234,7 +240,6 @@ modest_attachments_view_set_message (ModestAttachmentsView *attachments_view, Tn
        g_object_unref (iter);
        g_object_unref (parts);
        g_object_unref (part_to_check);
-       
 
        gtk_widget_queue_draw (GTK_WIDGET (attachments_view));
 
@@ -368,6 +373,10 @@ modest_attachments_view_instance_init (GTypeInstance *instance, gpointer g_class
 
        GTK_WIDGET_SET_FLAGS (instance, GTK_CAN_FOCUS);
 
+       g_signal_connect (G_OBJECT (instance), "notify::style", G_CALLBACK (on_notify_style), (gpointer) instance);
+
+       update_style (MODEST_ATTACHMENTS_VIEW (instance));
+
        return;
 }
 
@@ -472,12 +481,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 */
@@ -517,7 +530,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), 
@@ -745,10 +765,15 @@ get_att_view_at_coords (ModestAttachmentsView *atts_view,
                gint pos_x, pos_y, w, h, int_x, int_y;
                gint widget_x, widget_y;
 
+#if GTK_CHECK_VERSION (2,14,0)
+               gdk_window_get_origin (gtk_widget_get_window (att_view), &widget_x, &widget_y);
+#else
                gdk_window_get_origin (att_view->window, &widget_x, &widget_y);
+#endif
 
                pos_x = widget_x;
                pos_y = widget_y;
+
                w = att_view->allocation.width;
                h = att_view->allocation.height;
 
@@ -1093,3 +1118,33 @@ modest_attachments_view_get_num_attachments (ModestAttachmentsView *atts_view)
 
        return result;
 }
+
+static void 
+on_notify_style (GObject *obj, GParamSpec *spec, gpointer userdata)
+{
+       if (strcmp ("style", spec->name) == 0) {
+               update_style (MODEST_ATTACHMENTS_VIEW (obj));
+               gtk_widget_queue_draw (GTK_WIDGET (obj));
+       } 
+}
+
+/* This method updates the color (and other style settings) of widgets using secondary text color,
+ * tracking the gtk style */
+static void
+update_style (ModestAttachmentsView *self)
+{
+#ifdef MODEST_COMPACT_HEADER_BG
+       GdkColor bg_color;
+       GtkStyle *style;
+       GdkColor *current_bg;
+
+       g_return_if_fail (MODEST_IS_ATTACHMENTS_VIEW (self));
+
+       gdk_color_parse (MODEST_COMPACT_HEADER_BG, &bg_color);
+       style = gtk_widget_get_style (GTK_WIDGET (self));
+       current_bg = &(style->bg[GTK_STATE_NORMAL]);
+       if (current_bg->red != bg_color.red || current_bg->blue != bg_color.blue || current_bg->green != bg_color.green)
+               gtk_widget_modify_bg (GTK_WIDGET (self), GTK_STATE_NORMAL, &bg_color);
+#endif
+}
+