* initial code dump into SVN; needs some work
[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                                                   "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         priv->text_view = gtk_text_view_new ();
103         gtk_text_view_set_editable       (GTK_TEXT_VIEW(priv->text_view), FALSE);
104         gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW(priv->text_view), FALSE);
105
106         gtk_container_add (GTK_CONTAINER(self), priv->text_view);
107         
108         if (msg)
109                 modest_tny_msg_view_set_message (self, msg);
110
111         return GTK_WIDGET(self);
112 }
113
114
115
116 void
117 modest_tny_msg_view_set_message (ModestTnyMsgView *self, TnyMsgIface *msg)
118 {
119         ModestTnyMsgViewPrivate *priv;
120         GtkTextBuffer *buf;
121         GList *parts;
122         TnyStreamIface *stream;
123         
124         g_return_if_fail (self);
125
126         priv = MODEST_TNY_MSG_VIEW_GET_PRIVATE(self);
127         buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW(priv->text_view));
128
129         /* if msg is NULL, just delete the stuff */
130         if (!msg) {
131                 gtk_text_buffer_set_text (buf, NULL, 0);
132                 return;
133         }
134         
135         /* otherwise... find the body part */
136         stream = TNY_STREAM_IFACE(tny_text_buffer_stream_new(buf));
137         parts  = (GList*) tny_msg_iface_get_parts (msg);
138         while (parts) {
139                 TnyMsgMimePartIface *part =
140                         TNY_MSG_MIME_PART_IFACE(parts->data);
141                 
142                 if (tny_msg_mime_part_iface_content_type_is (part, "text/plain")) {
143                         tny_stream_iface_reset (stream);
144                         tny_msg_mime_part_iface_write_to_stream (part, stream);
145                         tny_stream_iface_reset (stream);
146                         break;
147                 }
148
149                 parts = parts->next;
150         }
151 }