* changed the parent class of ModestTnyMsgView from GtkFrame to GtkTextView to get...
[modest] / src / modest-tny-msg-view.c
1 /* modest-tny-msg-view.c */
2
3 /* insert (c)/licensing information) */
4
5 #include "modest-tny-msg-view.h"
6 /* include other impl specific header files */
7
8 /* 'private'/'protected' functions */
9 static void                     modest_tny_msg_view_class_init   (ModestTnyMsgViewClass *klass);
10 static void                     modest_tny_msg_view_init         (ModestTnyMsgView *obj);
11 static void                     modest_tny_msg_view_finalize     (GObject *obj);
12
13 /* list my signals */
14 enum {
15         /* MY_SIGNAL_1, */
16         /* MY_SIGNAL_2, */
17         LAST_SIGNAL
18 };
19
20 typedef struct _ModestTnyMsgViewPrivate ModestTnyMsgViewPrivate;
21 struct _ModestTnyMsgViewPrivate {
22         GtkWidget *text_view;
23 };
24 #define MODEST_TNY_MSG_VIEW_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
25                                                  MODEST_TYPE_TNY_MSG_VIEW, \
26                                                  ModestTnyMsgViewPrivate))
27 /* globals */
28 static GtkContainerClass *parent_class = NULL;
29
30 /* uncomment the following if you have defined any signals */
31 /* static guint signals[LAST_SIGNAL] = {0}; */
32
33 GType
34 modest_tny_msg_view_get_type (void)
35 {
36         static GType my_type = 0;
37         if (!my_type) {
38                 static const GTypeInfo my_info = {
39                         sizeof(ModestTnyMsgViewClass),
40                         NULL,           /* base init */
41                         NULL,           /* base finalize */
42                         (GClassInitFunc) modest_tny_msg_view_class_init,
43                         NULL,           /* class finalize */
44                         NULL,           /* class data */
45                         sizeof(ModestTnyMsgView),
46                         1,              /* n_preallocs */
47                         (GInstanceInitFunc) modest_tny_msg_view_init,
48                 };
49                 //my_type = g_type_register_static (GTK_TYPE_FRAME,
50                 my_type = g_type_register_static (GTK_TYPE_TEXT_VIEW,
51                                                   "ModestTnyMsgView",
52                                                   &my_info, 0);
53         }
54         return my_type;
55 }
56
57 static void
58 modest_tny_msg_view_class_init (ModestTnyMsgViewClass *klass)
59 {
60         GObjectClass *gobject_class;
61         gobject_class = (GObjectClass*) klass;
62
63         parent_class            = g_type_class_peek_parent (klass);
64         gobject_class->finalize = modest_tny_msg_view_finalize;
65
66         g_type_class_add_private (gobject_class, sizeof(ModestTnyMsgViewPrivate));
67
68         /* signal definitions go here, e.g.: */
69 /*      signals[MY_SIGNAL_1] = */
70 /*              g_signal_new ("my_signal_1",....); */
71 /*      signals[MY_SIGNAL_2] = */
72 /*              g_signal_new ("my_signal_2",....); */
73 /*      etc. */
74 }
75
76 static void
77 modest_tny_msg_view_init (ModestTnyMsgView *obj)
78 {
79         ModestTnyMsgViewPrivate *priv;
80
81         priv = MODEST_TNY_MSG_VIEW_GET_PRIVATE(obj);
82
83         priv->text_view = NULL;
84 }
85
86 static void
87 modest_tny_msg_view_finalize (GObject *obj)
88 {
89         /* no need to unref the text_view */    
90 }
91
92 GtkWidget*
93 modest_tny_msg_view_new (TnyMsgIface *msg)
94 {
95         GObject *obj;
96         ModestTnyMsgView* self;
97         ModestTnyMsgViewPrivate *priv;
98
99         obj  = G_OBJECT(g_object_new(MODEST_TYPE_TNY_MSG_VIEW, NULL));
100         self = MODEST_TNY_MSG_VIEW(obj);
101         priv = MODEST_TNY_MSG_VIEW_GET_PRIVATE(self);
102         
103         priv->text_view = gtk_text_view_new ();
104         gtk_text_view_set_editable       (GTK_TEXT_VIEW(priv->text_view), FALSE);
105         gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW(priv->text_view), FALSE);
106
107         gtk_container_add (GTK_CONTAINER(self), priv->text_view);
108         
109         if (msg)
110                 modest_tny_msg_view_set_message (self, msg);
111
112         return GTK_WIDGET(self);
113 }
114
115
116
117 void
118 modest_tny_msg_view_set_message (ModestTnyMsgView *self, TnyMsgIface *msg)
119 {
120         ModestTnyMsgViewPrivate *priv;
121         GtkTextBuffer *buf;
122         GList *parts;
123         TnyStreamIface *stream;
124         
125         g_return_if_fail (self);
126
127         priv = MODEST_TNY_MSG_VIEW_GET_PRIVATE(self);
128         buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW(priv->text_view));
129
130         /* clear the message view */
131         gtk_text_buffer_set_text (buf, "", 0);
132
133         /* if msg is NULL, do nothing else */
134         if (!msg) {
135                 return;
136         }
137         
138         /* otherwise... find the body part */
139         stream = TNY_STREAM_IFACE(tny_text_buffer_stream_new(buf));
140         parts  = (GList*) tny_msg_iface_get_parts (msg);
141         while (parts) {
142                 TnyMsgMimePartIface *part =
143                         TNY_MSG_MIME_PART_IFACE(parts->data);
144                 
145                 if (tny_msg_mime_part_iface_content_type_is (part, "text/plain")) {
146                         tny_stream_iface_reset (stream);
147                         tny_msg_mime_part_iface_write_to_stream (part, stream);
148                         tny_stream_iface_reset (stream);
149                         break;
150                 }
151
152                 parts = parts->next;
153         }
154 }