409a73b303f24ee8ceb333d71bc357eb2b26dc31
[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_SCROLLED_WINDOW,
50                                                   "ModestTnyMsgView",
51                                                   &my_info, 0);
52         }
53         return my_type;
54 }
55
56 static void
57 modest_tny_msg_view_class_init (ModestTnyMsgViewClass *klass)
58 {
59         GObjectClass *gobject_class;
60         gobject_class = (GObjectClass*) klass;
61
62         parent_class            = g_type_class_peek_parent (klass);
63         gobject_class->finalize = modest_tny_msg_view_finalize;
64
65         g_type_class_add_private (gobject_class, sizeof(ModestTnyMsgViewPrivate));
66
67         /* signal definitions go here, e.g.: */
68 /*      signals[MY_SIGNAL_1] = */
69 /*              g_signal_new ("my_signal_1",....); */
70 /*      signals[MY_SIGNAL_2] = */
71 /*              g_signal_new ("my_signal_2",....); */
72 /*      etc. */
73 }
74
75 static void
76 modest_tny_msg_view_init (ModestTnyMsgView *obj)
77 {
78         ModestTnyMsgViewPrivate *priv;
79
80         priv = MODEST_TNY_MSG_VIEW_GET_PRIVATE(obj);
81
82         priv->text_view = NULL;
83 }
84
85 static void
86 modest_tny_msg_view_finalize (GObject *obj)
87 {
88         /* no need to unref the text_view */    
89 }
90
91 GtkWidget*
92 modest_tny_msg_view_new (TnyMsgIface *msg)
93 {
94         GObject *obj;
95         ModestTnyMsgView* self;
96         ModestTnyMsgViewPrivate *priv;
97
98         obj  = G_OBJECT(g_object_new(MODEST_TYPE_TNY_MSG_VIEW, NULL));
99         self = MODEST_TNY_MSG_VIEW(obj);
100         priv = MODEST_TNY_MSG_VIEW_GET_PRIVATE(self);
101
102         gtk_scrolled_window_set_policy(self, GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
103         
104         priv->text_view = gtk_text_view_new ();
105         gtk_text_view_set_editable       (GTK_TEXT_VIEW(priv->text_view), FALSE);
106         gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW(priv->text_view), FALSE);
107
108         gtk_container_add (GTK_CONTAINER(self), priv->text_view);
109         
110         if (msg)
111                 modest_tny_msg_view_set_message (self, msg);
112
113         return GTK_WIDGET(self);
114 }
115
116
117
118 void
119 modest_tny_msg_view_set_message (ModestTnyMsgView *self, TnyMsgIface *msg)
120 {
121         ModestTnyMsgViewPrivate *priv;
122         GtkTextBuffer *buf;
123         GList *parts;
124         TnyStreamIface *stream;
125         
126         g_return_if_fail (self);
127
128         priv = MODEST_TNY_MSG_VIEW_GET_PRIVATE(self);
129         buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW(priv->text_view));
130
131         /* clear the message view */
132         gtk_text_buffer_set_text (buf, "", 0);
133
134         /* if msg is NULL, do nothing else */
135         if (!msg) {
136                 return;
137         }
138         
139         /* otherwise... find the body part */
140         stream = TNY_STREAM_IFACE(tny_text_buffer_stream_new(buf));
141         parts  = (GList*) tny_msg_iface_get_parts (msg);
142         while (parts) {
143                 TnyMsgMimePartIface *part =
144                         TNY_MSG_MIME_PART_IFACE(parts->data);
145                 
146                 if (tny_msg_mime_part_iface_content_type_is (part, "text/plain")) {
147                         tny_stream_iface_reset (stream);
148                         tny_msg_mime_part_iface_write_to_stream (part, stream);
149                         tny_stream_iface_reset (stream);
150                         break;
151                 }
152
153                 parts = parts->next;
154         }
155 }