Track style changes in account view
[modest] / src / widgets / modest-gtkhtml-mime-part-view.c
index 22c60cd..5d6cb6f 100644 (file)
@@ -34,6 +34,7 @@
 #include <gtkhtml/gtkhtml-search.h>
 #include <tny-stream.h>
 #include <tny-mime-part-view.h>
+#include "modest-tny-mime-part.h"
 #include <modest-stream-text-to-html.h>
 #include <modest-text-utils.h>
 #include <modest-conf.h>
@@ -42,6 +43,7 @@
 #include <widgets/modest-zoomable.h>
 #include <widgets/modest-tny-stream-gtkhtml.h>
 #include <libgnomevfs/gnome-vfs.h>
+#include <gdk/gdkkeysyms.h>
 
 /* gobject structure methods */
 static void    modest_gtkhtml_mime_part_view_class_init (ModestGtkhtmlMimePartViewClass *klass);
@@ -51,6 +53,7 @@ static void    modest_zoomable_init                     (gpointer g, gpointer if
 static void    modest_isearch_view_init                 (gpointer g, gpointer iface_data);
 static void    modest_gtkhtml_mime_part_view_init       (ModestGtkhtmlMimePartView *self);
 static void    modest_gtkhtml_mime_part_view_finalize   (GObject *self);
+static void    modest_gtkhtml_mime_part_view_dispose    (GObject *self);
 
 /* GtkHTML signal handlers */
 static gboolean  on_link_clicked  (GtkWidget *widget, const gchar *uri, ModestGtkhtmlMimePartView *self);
@@ -201,9 +204,12 @@ static void
 modest_gtkhtml_mime_part_view_class_init (ModestGtkhtmlMimePartViewClass *klass)
 {
        GObjectClass *gobject_class;
+       GtkBindingSet *binding_set;
+
        gobject_class = (GObjectClass*) klass;
 
        parent_class            = g_type_class_peek_parent (klass);
+       gobject_class->dispose = modest_gtkhtml_mime_part_view_dispose;
        gobject_class->finalize = modest_gtkhtml_mime_part_view_finalize;
 
        klass->get_part_func = modest_gtkhtml_mime_part_view_get_part_default;
@@ -220,6 +226,20 @@ modest_gtkhtml_mime_part_view_class_init (ModestGtkhtmlMimePartViewClass *klass)
        klass->search_func = modest_gtkhtml_mime_part_view_search_default;
        klass->search_next_func = modest_gtkhtml_mime_part_view_search_next_default;
        klass->get_selection_area_func = modest_gtkhtml_mime_part_view_get_selection_area_default;
+
+       binding_set = gtk_binding_set_by_class (klass);
+       gtk_binding_entry_skip (binding_set, GDK_Down, 0);
+       gtk_binding_entry_skip (binding_set, GDK_Up, 0);
+       gtk_binding_entry_skip (binding_set, GDK_KP_Up, 0);
+       gtk_binding_entry_skip (binding_set, GDK_KP_Down, 0);
+       gtk_binding_entry_skip (binding_set, GDK_Page_Down, 0);
+       gtk_binding_entry_skip (binding_set, GDK_Page_Up, 0);
+       gtk_binding_entry_skip (binding_set, GDK_KP_Page_Up, 0);
+       gtk_binding_entry_skip (binding_set, GDK_KP_Page_Down, 0);
+       gtk_binding_entry_skip (binding_set, GDK_Home, 0);
+       gtk_binding_entry_skip (binding_set, GDK_End, 0);
+       gtk_binding_entry_skip (binding_set, GDK_KP_Home, 0);
+       gtk_binding_entry_skip (binding_set, GDK_KP_End, 0);
        
        g_type_class_add_private (gobject_class, sizeof(ModestGtkhtmlMimePartViewPrivate));
 
@@ -255,6 +275,19 @@ modest_gtkhtml_mime_part_view_finalize (GObject *obj)
        G_OBJECT_CLASS (parent_class)->finalize (obj);
 }
 
+static void
+modest_gtkhtml_mime_part_view_dispose (GObject *obj)
+{
+       ModestGtkhtmlMimePartViewPrivate *priv = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE (obj);
+
+       if (priv->part) {
+               g_object_unref (priv->part);
+               priv->part = NULL;
+       }
+
+       G_OBJECT_CLASS (parent_class)->dispose (obj);
+}
+
 /* GTKHTML SIGNALS HANDLERS */
 
 static gboolean
@@ -383,10 +416,30 @@ set_part (ModestGtkhtmlMimePartView *self, TnyMimePart *part)
                return;
        }
 
-       if (tny_mime_part_content_type_is (part, "text/html"))
+       if (tny_mime_part_content_type_is (part, "text/html")) {
                set_html_part (self, part);
-       else
-               set_text_part (self, part);
+       } else {
+               if (tny_mime_part_content_type_is (part, "message/rfc822")) {
+                       gchar *header_content_type, *header_content_type_lower;
+                       header_content_type = modest_tny_mime_part_get_header_value (part, "Content-Type");
+                       if (header_content_type) {
+                               header_content_type = g_strstrip (header_content_type);
+                               header_content_type_lower = g_ascii_strdown (header_content_type, -1);
+
+                               if (!g_ascii_strcasecmp (header_content_type_lower, "text/html"))
+                                       set_html_part (self, part);
+                               else 
+                                       set_text_part (self, part);
+
+                               g_free (header_content_type_lower);
+                               g_free (header_content_type);
+                       } else {
+                               set_text_part (self, part);
+                       }
+               } else {
+                       set_text_part (self, part);
+               }
+       }
 
 }