X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-attachment-view.c;h=bd53bf6963647eb908fd5071543ef44eeed17ff6;hp=a94f1a01131d78a78c7a8ccc9d12a7704476baf1;hb=HEAD;hpb=94dd9606eadbd7df971e7abc458bbbd903cdc772 diff --git a/src/widgets/modest-attachment-view.c b/src/widgets/modest-attachment-view.c index a94f1a0..bd53bf6 100644 --- a/src/widgets/modest-attachment-view.c +++ b/src/widgets/modest-attachment-view.c @@ -37,12 +37,13 @@ #include #include #include +#include #include -#include #include #include #include #include +#include #define GET_SIZE_BUFFER_SIZE 128 @@ -67,7 +68,11 @@ struct _ModestAttachmentViewPrivate }; +#ifdef MODEST_TOOLKIT_HILDON2 +#define UNKNOWN_FILE_ICON "filemanager_unknown_file" +#else #define UNKNOWN_FILE_ICON "qgn_list_gene_unknown_file" +#endif #define MODEST_ATTACHMENT_VIEW_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEST_TYPE_ATTACHMENT_VIEW, ModestAttachmentViewPrivate)) @@ -89,10 +94,43 @@ static void modest_attachment_view_finalize (GObject *object); static void modest_attachment_view_class_init (ModestAttachmentViewClass *klass); static void tny_mime_part_view_init (gpointer g, gpointer iface_data); +static void on_notify_style (GObject *obj, GParamSpec *spec, gpointer userdata); +static void update_style (ModestAttachmentView *self); static void update_filename_request (ModestAttachmentView *self); +static void +on_notify_style (GObject *obj, GParamSpec *spec, gpointer userdata) +{ + if (strcmp ("style", spec->name) == 0) { + update_style (MODEST_ATTACHMENT_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 (ModestAttachmentView *self) +{ +#ifdef MODEST_COMPACT_HEADER_BG + GdkColor bg_color; + GtkStyle *style; + GdkColor *current_bg; + + g_return_if_fail (MODEST_IS_ATTACHMENT_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 +} + + + static void update_size_label (ModestAttachmentView *self) { ModestAttachmentViewPrivate *priv = MODEST_ATTACHMENT_VIEW_GET_PRIVATE (self); @@ -128,17 +166,15 @@ get_mime_part_size_thread (gpointer thr_user_data) { ModestAttachmentView *view = (ModestAttachmentView *) thr_user_data; ModestAttachmentViewPrivate *priv = MODEST_ATTACHMENT_VIEW_GET_PRIVATE (view); - TnyStream *stream; gsize total = 0; gssize result = 0; - stream = modest_count_stream_new(); - result = tny_mime_part_decode_to_stream (priv->mime_part, stream, NULL); - total = modest_count_stream_get_count(MODEST_COUNT_STREAM (stream)); + result = tny_mime_part_decode_to_stream (priv->mime_part, priv->get_size_stream, NULL); + total = modest_count_stream_get_count(MODEST_COUNT_STREAM (priv->get_size_stream)); if (total == 0) { - modest_count_stream_reset_count(MODEST_COUNT_STREAM (stream)); - result = tny_mime_part_write_to_stream (priv->mime_part, stream, NULL); - total = modest_count_stream_get_count(MODEST_COUNT_STREAM (stream)); + modest_count_stream_reset_count(MODEST_COUNT_STREAM (priv->get_size_stream)); + result = tny_mime_part_write_to_stream (priv->mime_part, priv->get_size_stream, NULL); + total = modest_count_stream_get_count(MODEST_COUNT_STREAM (priv->get_size_stream)); } /* if there was an error, don't set the size (this is pretty uncommon) */ @@ -148,8 +184,6 @@ get_mime_part_size_thread (gpointer thr_user_data) priv->size = (guint64)total; g_idle_add (idle_get_mime_part_size_cb, g_object_ref (view)); } - - g_object_unref (stream); g_object_unref (view); return NULL; @@ -252,25 +286,63 @@ modest_attachment_view_set_part_default (TnyMimePartView *self, TnyMimePart *mim if (TNY_IS_MSG (mime_part)) { TnyHeader *header = tny_msg_get_header (TNY_MSG (mime_part)); if (TNY_IS_HEADER (header)) { - filename = g_strdup (tny_header_get_subject (header)); - if (filename == NULL || filename[0] == '\0') + filename = g_strdup (tny_mime_part_get_filename (mime_part)); + if (!filename) + filename = tny_header_dup_subject (header); + if (filename == NULL || filename[0] == '\0') { + if (filename) + g_free (filename); filename = g_strdup (_("mail_va_no_subject")); - if (priv->is_purged) + } + if (priv->is_purged) { file_icon_name = modest_platform_get_file_icon_name (NULL, NULL, NULL); - else - file_icon_name = - modest_platform_get_file_icon_name ( - NULL, tny_mime_part_get_content_type (mime_part), NULL); + } else { + gchar *header_content_type; + header_content_type = modest_tny_mime_part_get_content_type (mime_part); + if ((g_str_has_prefix (header_content_type, "message/rfc822") || + g_str_has_prefix (header_content_type, "multipart/"))) { + file_icon_name = + modest_platform_get_file_icon_name ( + NULL, "message/rfc822", NULL); + } else if (g_str_has_prefix (header_content_type, "text/")) { + file_icon_name = + modest_platform_get_file_icon_name ( + NULL, tny_mime_part_get_content_type (mime_part), NULL); + } else { + file_icon_name = + modest_platform_get_file_icon_name ( + NULL, header_content_type, NULL); + } + g_free (header_content_type); + } g_object_unref (header); } } else { + gboolean is_other_body = FALSE; filename = g_strdup (tny_mime_part_get_filename (mime_part)); + if (filename == NULL) { + gchar *description; + description = modest_tny_mime_part_get_header_value (mime_part, "Content-Description"); + if (description) { + g_strstrip (description); + filename = description; + } + if (!filename || filename[0] == '\0') { + g_free (filename); + filename = g_strdup (_("mail_va_no_subject")); + } + is_other_body = TRUE; + } if (priv->is_purged) { file_icon_name = modest_platform_get_file_icon_name (NULL, NULL, NULL); } else { - file_icon_name = modest_platform_get_file_icon_name ( - filename, tny_mime_part_get_content_type (mime_part), NULL); - show_size = TRUE; + if (is_other_body) { + file_icon_name = modest_platform_get_file_icon_name (NULL, "message/rfc822", NULL); + } else { + file_icon_name = modest_platform_get_file_icon_name ( + filename, modest_tny_mime_part_get_content_type (mime_part), NULL); + show_size = TRUE; + } } } @@ -296,8 +368,40 @@ modest_attachment_view_set_part_default (TnyMimePartView *self, TnyMimePart *mim gtk_label_set_text (GTK_LABEL (priv->size_view), ""); if (show_size && priv->detect_size) { - tny_camel_mem_stream_get_type (); + gchar *disposition; + + disposition = modest_tny_mime_part_get_header_value (mime_part, "Content-Disposition"); + if (disposition) { + const gchar *size_tmp; + size_tmp = strstr (disposition, "size="); + if (size_tmp) size_tmp += strlen("size="); + if (size_tmp) { + gchar *disposition_value; + const gchar *size_end; + size_end = strstr (size_tmp, ";"); + if (size_end == NULL) { + disposition_value = g_strdup (size_tmp); + } else { + disposition_value = g_strndup (size_tmp, size_end - size_tmp); + } + if (disposition_value && disposition_value[0] != '\0') { + priv->size = atoll (disposition_value); + if (priv->size != 0) { + show_size = FALSE; + update_size_label (MODEST_ATTACHMENT_VIEW (self)); + } + } + g_free (disposition_value); + } + + g_free (disposition); + } + } + + if (show_size && priv->detect_size) { g_object_ref (self); + if (!priv->get_size_stream) + priv->get_size_stream = modest_count_stream_new (); g_thread_create (get_mime_part_size_thread, self, FALSE, NULL); } @@ -321,10 +425,8 @@ modest_attachment_view_clear_default (TnyMimePartView *self) priv->mime_part = NULL; } - if (priv->get_size_stream != NULL) { - g_object_unref (priv->get_size_stream); - priv->get_size_stream = NULL; - } + if (priv->get_size_stream) + modest_count_stream_reset_count(MODEST_COUNT_STREAM (priv->get_size_stream)); priv->size = 0; @@ -366,8 +468,17 @@ modest_attachment_view_instance_init (GTypeInstance *instance, gpointer g_class) ModestAttachmentViewPrivate *priv = MODEST_ATTACHMENT_VIEW_GET_PRIVATE (instance); PangoContext *context; GtkWidget *box = NULL; + GtkWidget *icon_alignment = NULL; + +#ifdef MODEST_TOOLKIT_HILDON2 + PangoAttrList *attr_list; + attr_list = pango_attr_list_new (); + pango_attr_list_insert (attr_list, pango_attr_underline_new (PANGO_UNDERLINE_SINGLE)); +#endif priv->mime_part = NULL; + icon_alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0); + gtk_alignment_set_padding (GTK_ALIGNMENT (icon_alignment), 0, 0, 0, MODEST_MARGIN_DEFAULT); priv->icon = gtk_image_new (); priv->filename_view = gtk_label_new (""); gtk_label_set_line_wrap (GTK_LABEL (priv->filename_view), FALSE); @@ -380,12 +491,18 @@ modest_attachment_view_instance_init (GTypeInstance *instance, gpointer g_class) gtk_misc_set_alignment (GTK_MISC (priv->size_view), 0.0, 0.5); gtk_misc_set_alignment (GTK_MISC (priv->filename_view), 0.0, 0.5); +#ifdef MODEST_TOOLKIT_HILDON2 + gtk_label_set_attributes (GTK_LABEL (priv->filename_view), attr_list); + gtk_label_set_attributes (GTK_LABEL (priv->size_view), attr_list); +#endif + priv->get_size_stream = NULL; priv->size = 0; priv->detect_size = TRUE; box = gtk_hbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (box), priv->icon, FALSE, FALSE, 0); + gtk_container_add (GTK_CONTAINER (icon_alignment), priv->icon); + gtk_box_pack_start (GTK_BOX (box), icon_alignment, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (box), priv->filename_view, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (box), priv->size_view, FALSE, FALSE, 0); gtk_container_add (GTK_CONTAINER (instance), box); @@ -402,8 +519,17 @@ modest_attachment_view_instance_init (GTypeInstance *instance, gpointer g_class) gtk_event_box_set_visible_window (GTK_EVENT_BOX (instance), TRUE); gtk_widget_set_events (GTK_WIDGET (instance), 0); +#ifdef MODEST_TOOLKIT_HILDON2 + pango_attr_list_unref (attr_list); +#endif + GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (instance), GTK_CAN_FOCUS); + g_signal_connect (G_OBJECT (instance), "notify::style", G_CALLBACK (on_notify_style), (gpointer) instance); + + update_style (MODEST_ATTACHMENT_VIEW (instance)); + + return; }