X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-attachments-view.c;h=51a0408ae3cc0c14047308f45cf562aaabe2afeb;hb=16d0237f55b1891f9a14a6cd7bdac7080bacd4c3;hp=0a3550d4f5aaf0c961677dc19ea20f1f9f41ce20;hpb=4e501493efaac0d9331e924a2ea569497abff1bf;p=modest diff --git a/src/widgets/modest-attachments-view.c b/src/widgets/modest-attachments-view.c index 0a3550d..51a0408 100644 --- a/src/widgets/modest-attachments-view.c +++ b/src/widgets/modest-attachments-view.c @@ -46,6 +46,7 @@ static GObjectClass *parent_class = NULL; /* signals */ enum { ACTIVATE_SIGNAL, + DELETE_SIGNAL, LAST_SIGNAL }; @@ -135,13 +136,16 @@ modest_attachments_view_set_message (ModestAttachmentsView *attachments_view, Tn gboolean application_multipart = FALSE; header_content_type = modest_tny_mime_part_get_header_value (TNY_MIME_PART (priv->msg), "Content-Type"); header_content_type = g_strstrip (header_content_type); - header_content_type_lower = header_content_type?g_ascii_strdown (header_content_type, -1):NULL; + header_content_type_lower = (header_content_type ) ? + g_ascii_strdown (header_content_type, -1) : NULL; - if (!strstr (header_content_type_lower, "application/")) + if ((header_content_type_lower != NULL) && + !strstr (header_content_type_lower, "application/")) { application_multipart = TRUE; - + g_free (header_content_type_lower); + } g_free (header_content_type); - g_free (header_content_type_lower); + if (application_multipart) { gtk_widget_queue_draw (GTK_WIDGET (attachments_view)); return; @@ -352,6 +356,15 @@ modest_attachments_view_class_init (ModestAttachmentsViewClass *klass) g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); + signals[DELETE_SIGNAL] = + g_signal_new ("delete", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET(ModestAttachmentsViewClass, delete), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + return; } @@ -408,9 +421,15 @@ button_press_event (GtkWidget *widget, g_object_unref (mime_part); } } else { - set_selected (MODEST_ATTACHMENTS_VIEW (widget), MODEST_ATTACHMENT_VIEW (att_view)); - priv->rubber_start = att_view; - gtk_grab_add (widget); + TnyMimePart *mime_part = tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (att_view)); + + /* Do not select purged attachments */ + if (TNY_IS_MIME_PART (mime_part) && !tny_mime_part_is_purged (mime_part)) { + set_selected (MODEST_ATTACHMENTS_VIEW (widget), MODEST_ATTACHMENT_VIEW (att_view)); + priv->rubber_start = att_view; + gtk_grab_add (widget); + } + g_object_unref (mime_part); } } } @@ -464,6 +483,46 @@ motion_notify_event (GtkWidget *widget, return TRUE; } +static GList* +find_prev_or_next_not_purged (GList *list, gboolean prev, gboolean include_this) +{ + GList *tmp = NULL; + gboolean is_valid; + + if (!include_this) { + if (prev) { + tmp = g_list_previous (list); + } else { + tmp = g_list_next (list); + } + } else { + tmp = list; + } + + if (!tmp) + return NULL; + + do { + ModestAttachmentView *att_view = (ModestAttachmentView *) tmp->data; + TnyMimePart *mime_part = tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (att_view)); + + /* Do not select purged attachments */ + if (TNY_IS_MIME_PART (mime_part) && !tny_mime_part_is_purged (mime_part)) { + is_valid = TRUE; + } else { + if (prev) + tmp = g_list_previous (tmp); + else + tmp = g_list_next (tmp); + is_valid = FALSE; + } + g_object_unref (mime_part); + } while (!is_valid && tmp); + + return tmp; +} + + static gboolean key_press_event (GtkWidget *widget, GdkEventKey *event, @@ -486,15 +545,23 @@ key_press_event (GtkWidget *widget, if (event->keyval == GDK_Up) { ModestAttachmentView *current_sel = NULL; gboolean move_out = FALSE; - GList * box_children, *new_sel; + GList * box_children, *new_sel, *first_child; box_children = gtk_container_get_children (GTK_CONTAINER (priv->box)); - if (box_children == NULL) - move_out = TRUE; - else if ((priv->selected != NULL)&&(priv->selected->data != box_children->data)) - current_sel = (ModestAttachmentView *) priv->selected->data; - else + if (box_children == NULL) { move_out = TRUE; + } else { + first_child = box_children; + first_child = find_prev_or_next_not_purged (box_children, FALSE, TRUE); + if (priv->selected != NULL && first_child != NULL) { + if (priv->selected->data != first_child->data) + current_sel = (ModestAttachmentView *) priv->selected->data; + else + move_out = TRUE; + } else { + move_out = TRUE; + } + } if (move_out) { GtkWidget *toplevel = NULL; @@ -505,7 +572,10 @@ key_press_event (GtkWidget *widget, unselect_all (atts_view); } else { new_sel = g_list_find (box_children, (gpointer) current_sel); - new_sel = g_list_previous (new_sel); + new_sel = find_prev_or_next_not_purged (new_sel, TRUE, FALSE); + /* We assume that we detected properly that + there is a not purge attachment so we don't + need to check NULL */ set_selected (MODEST_ATTACHMENTS_VIEW (atts_view), MODEST_ATTACHMENT_VIEW (new_sel->data)); } g_list_free (box_children); @@ -523,7 +593,8 @@ key_press_event (GtkWidget *widget, move_out = TRUE; } else { last_child = g_list_last (box_children); - if (priv->selected != NULL) { + last_child = find_prev_or_next_not_purged (last_child, TRUE, TRUE); + if (priv->selected != NULL && last_child != NULL) { GList *last_selected = g_list_last (priv->selected); if (last_selected->data != last_child->data) current_sel = (ModestAttachmentView *) last_selected->data; @@ -543,13 +614,18 @@ key_press_event (GtkWidget *widget, unselect_all (atts_view); } else { new_sel = g_list_find (box_children, (gpointer) current_sel); - new_sel = g_list_next (new_sel); + new_sel = find_prev_or_next_not_purged (new_sel, FALSE, FALSE); set_selected (MODEST_ATTACHMENTS_VIEW (atts_view), MODEST_ATTACHMENT_VIEW (new_sel->data)); } g_list_free (box_children); return TRUE; } + if (event->keyval == GDK_BackSpace) { + g_signal_emit (G_OBJECT (widget), signals[DELETE_SIGNAL], 0); + return TRUE; + } + /* Activates selected item */ if (g_list_length (priv->selected) == 1) { ModestAttachmentView *att_view = (ModestAttachmentView *) priv->selected->data; @@ -779,10 +855,16 @@ modest_attachments_view_select_all (ModestAttachmentsView *atts_view) g_list_free (priv->selected); priv->selected = NULL; - for (node = children; node != NULL; node = g_list_next (node)) { - gtk_widget_set_state (GTK_WIDGET (node->data), GTK_STATE_SELECTED); - priv->selected = g_list_append (priv->selected, node->data); + ModestAttachmentView *att_view = (ModestAttachmentView *) node->data; + TnyMimePart *mime_part = tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (att_view)); + + /* Do not select purged attachments */ + if (TNY_IS_MIME_PART (mime_part) && !tny_mime_part_is_purged (mime_part)) { + gtk_widget_set_state (GTK_WIDGET (node->data), GTK_STATE_SELECTED); + priv->selected = g_list_append (priv->selected, node->data); + } + g_object_unref (mime_part); } g_list_free (children);