root/trunk/libtinymailui-gtk/tny-gtk-msg-window.c

Revision 3666 (checked in by jdapena, 7 months ago)

* Use GOnce registering all types in tinymail to make

registering thread-safe.

Line 
1 /* libtinymailui-gtk - The Tiny Mail UI library for Gtk+
2  * Copyright (C) 2006-2007 Philip Van Hoof <pvanhoof@gnome.org>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with self library; if not, write to the
16  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20
21 /**
22  * TnyGtkMsgWindow:
23  *
24  * A #TnyMsgView that is a #GtkWindow too.
25  *
26  * All implementations are rather simple, they all simply forward the instruction
27  * to a priv->msg_view instance which is a #TnyMsgView or the decorated one.
28  *
29  * Next to forwarding the instructions, this implementation also makes sure that
30  * priv->msg_view is embedded in a #GtkWindow and that for example the window's
31  * title is set correctly (and things like that).
32  *
33  * You can inherit this type in case you want to have a more decorated windowed
34  * message viewer. You can also again decorate it (I would recommend decorating
35  * #TnyGtkMsgView in stead, in that case).
36  *
37  * free-function: g_object_unref
38  **/
39
40 #include <config.h>
41
42 #include <tny-gtk-msg-window.h>
43 #include <tny-msg-view.h>
44
45 static GObjectClass *parent_class = NULL;
46
47 typedef struct _TnyGtkMsgWindowPriv TnyGtkMsgWindowPriv;
48
49 struct _TnyGtkMsgWindowPriv
50 {
51         TnyMsgView *msg_view;
52         GtkScrolledWindow *widget;
53 };
54
55 #define TNY_GTK_MSG_WINDOW_GET_PRIVATE(o) \
56         (G_TYPE_INSTANCE_GET_PRIVATE ((o), TNY_TYPE_GTK_MSG_WINDOW, TnyGtkMsgWindowPriv))
57
58
59 static void
60 tny_gtk_msg_window_set_unavailable (TnyMsgView *self)
61 {
62         TNY_GTK_MSG_WINDOW_GET_CLASS (self)->set_unavailable(self);
63         return;
64 }
65
66 static void
67 tny_gtk_msg_window_set_unavailable_default (TnyMsgView *self)
68 {
69         TnyGtkMsgWindowPriv *priv = TNY_GTK_MSG_WINDOW_GET_PRIVATE (self);
70         tny_msg_view_set_unavailable (priv->msg_view);
71         return;
72 }
73
74 static TnyMsg*
75 tny_gtk_msg_window_get_msg (TnyMsgView *self)
76 {
77         return TNY_GTK_MSG_WINDOW_GET_CLASS (self)->get_msg(self);
78 }
79
80 static TnyMsg*
81 tny_gtk_msg_window_get_msg_default (TnyMsgView *self)
82 {
83         TnyGtkMsgWindowPriv *priv = TNY_GTK_MSG_WINDOW_GET_PRIVATE (self);
84         return tny_msg_view_get_msg (priv->msg_view);
85 }
86
87 static void
88 tny_gtk_msg_window_set_msg (TnyMsgView *self, TnyMsg *msg)
89 {
90         TNY_GTK_MSG_WINDOW_GET_CLASS (self)->set_msg(self, msg);
91         return;
92 }
93
94 static void
95 tny_gtk_msg_window_set_msg_default (TnyMsgView *self, TnyMsg *msg)
96 {
97         TnyGtkMsgWindowPriv *priv = TNY_GTK_MSG_WINDOW_GET_PRIVATE (self);
98         TnyHeader *header;
99
100         if (msg)
101         {
102                 gchar *subject;
103
104                 g_assert (TNY_IS_MSG (msg));
105
106                 header = TNY_HEADER (tny_msg_get_header (msg));
107                 subject = tny_header_dup_subject (header);
108                 if (subject)
109                         gtk_window_set_title (GTK_WINDOW (self), subject);
110                 g_free (subject);
111                 g_object_unref (G_OBJECT (header));
112         }
113         tny_msg_view_set_msg (priv->msg_view, msg);
114
115         return;
116 }
117
118
119
120
121 static void
122 tny_gtk_msg_window_clear (TnyMsgView *self)
123 {
124         TNY_GTK_MSG_WINDOW_GET_CLASS (self)->clear(self);
125         return;
126 }
127
128 static void
129 tny_gtk_msg_window_clear_default (TnyMsgView *self)
130 {
131         TnyGtkMsgWindowPriv *priv = TNY_GTK_MSG_WINDOW_GET_PRIVATE (self);
132
133         tny_msg_view_clear (priv->msg_view);
134
135         return;
136 }
137
138 static TnyMsgView*
139 tny_gtk_msg_window_create_new_inline_viewer (TnyMsgView *self)
140 {
141         return TNY_GTK_MSG_WINDOW_GET_CLASS (self)->create_new_inline_viewer(self);
142 }
143
144 static TnyMsgView*
145 tny_gtk_msg_window_create_new_inline_viewer_default (TnyMsgView *self)
146 {
147         TnyGtkMsgWindowPriv *priv = TNY_GTK_MSG_WINDOW_GET_PRIVATE (self);
148
149         /* This should not be a window, but the decorated one, as it has to be
150            embeddable within a window. So we even decorate this one as usual. */
151
152         return tny_msg_view_create_new_inline_viewer (priv->msg_view);
153 }
154
155 static TnyMimePartView*
156 tny_gtk_msg_window_create_mime_part_view_for (TnyMsgView *self, TnyMimePart *part)
157 {
158         return TNY_GTK_MSG_WINDOW_GET_CLASS (self)->create_mime_part_view_for(self, part);
159 }
160
161 static TnyMimePartView*
162 tny_gtk_msg_window_create_mime_part_view_for_default (TnyMsgView *self, TnyMimePart *part)
163 {
164         TnyGtkMsgWindowPriv *priv = TNY_GTK_MSG_WINDOW_GET_PRIVATE (self);
165
166         return tny_msg_view_create_mime_part_view_for (priv->msg_view, part);
167 }
168
169
170
171 static void
172 tny_gtk_msg_window_mp_clear (TnyMimePartView *self)
173 {
174         tny_msg_view_clear (TNY_MSG_VIEW (self));
175
176         return;
177 }
178
179
180 static void
181 tny_gtk_msg_window_mp_set_part (TnyMimePartView *self, TnyMimePart *part)
182 {
183         TNY_GTK_MSG_WINDOW_GET_CLASS (self)->set_part(self, part);
184         return;
185 }
186
187
188 static void
189 tny_gtk_msg_window_mp_set_part_default (TnyMimePartView *self, TnyMimePart *part)
190 {
191         TnyGtkMsgWindowPriv *priv = TNY_GTK_MSG_WINDOW_GET_PRIVATE (self);
192
193         tny_mime_part_view_set_part (TNY_MIME_PART_VIEW (priv->msg_view), part);
194
195         return;
196 }
197
198
199 static TnyMimePart*
200 tny_gtk_msg_window_mp_get_part (TnyMimePartView *self)
201 {
202         return TNY_GTK_MSG_WINDOW_GET_CLASS (self)->get_part(self);
203 }
204
205
206 static TnyMimePart*
207 tny_gtk_msg_window_mp_get_part_default (TnyMimePartView *self)
208 {
209         TnyGtkMsgWindowPriv *priv = TNY_GTK_MSG_WINDOW_GET_PRIVATE (self);
210
211         return tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (priv->msg_view));
212 }
213
214 /**
215  * tny_gtk_msg_window_set_view:
216  * @self: a #TnyGtkMsgView
217  * @view: a #TnyMsgView to decorate
218  *
219  * Set @view to become decorated or windowed by @self. The @view must inherit
220  * #GtkWidget.
221  *
222  * since: 1.0
223  * audience: application-developer
224  **/
225 void 
226 tny_gtk_msg_window_set_view (TnyGtkMsgWindow *self, TnyMsgView *view)
227 {
228         TnyGtkMsgWindowPriv *priv = TNY_GTK_MSG_WINDOW_GET_PRIVATE (self);
229
230         if (priv->msg_view)
231                 gtk_container_remove (GTK_CONTAINER (self), GTK_WIDGET (priv->msg_view));
232
233         priv->msg_view = view;
234
235         /* This adds a reference to msgview (it's a gtkwidget) */
236         gtk_scrolled_window_add_with_viewport (priv->widget,
237                         GTK_WIDGET (view));
238
239         gtk_widget_show (GTK_WIDGET (priv->msg_view));
240
241         return;
242 }
243
244
245 /**
246  * tny_gtk_msg_window_new:
247  * @msgview: a #TnyMsgView to decorate or wrap with a #GtkWindow
248  *
249  * Create a #GtkWindow that implements #TnyMsgView by decorating @msgview. The
250  * @view instance must inherit the #GtkWidget type. The returned value will
251  * inherit #GtkWindow
252  *
253  * returns: (caller-owns): a new #TnyMsgWindow
254  * since: 1.0
255  * audience: application-developer
256  **/
257 TnyMsgWindow*
258 tny_gtk_msg_window_new (TnyMsgView *msgview)
259 {
260         TnyGtkMsgWindow *self = g_object_new (TNY_TYPE_GTK_MSG_WINDOW, NULL);
261
262         tny_gtk_msg_window_set_view (self, msgview);
263
264         return TNY_MSG_WINDOW (self);
265 }
266
267
268 static void
269 tny_gtk_msg_window_instance_init (GTypeInstance *instance, gpointer g_class)
270 {
271         TnyGtkMsgWindow *self = (TnyGtkMsgWindow *)instance;
272         TnyGtkMsgWindowPriv *priv = TNY_GTK_MSG_WINDOW_GET_PRIVATE (self);
273         GtkWidget *widget = gtk_scrolled_window_new (NULL, NULL);
274
275         gtk_window_set_default_size (GTK_WINDOW (self), 640, 480);
276
277         gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (widget),
278                                 GTK_SHADOW_NONE);
279         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (widget),
280                         GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
281
282         gtk_widget_show (widget);
283         priv->widget = GTK_SCROLLED_WINDOW (widget);
284
285         gtk_container_add (GTK_CONTAINER (self), widget);
286
287         return;
288 }
289
290 static void
291 tny_gtk_msg_window_finalize (GObject *object)
292 {
293         (*parent_class->finalize) (object);
294
295         return;
296 }
297
298 static void
299 tny_msg_window_init (gpointer g, gpointer iface_data)
300 {
301         return;
302 }
303
304
305 static void
306 tny_msg_view_init (gpointer g, gpointer iface_data)
307 {
308         TnyMsgViewIface *klass = (TnyMsgViewIface *)g;
309
310         klass->get_msg= tny_gtk_msg_window_get_msg;
311         klass->set_msg= tny_gtk_msg_window_set_msg;
312         klass->set_unavailable= tny_gtk_msg_window_set_unavailable;
313         klass->clear= tny_gtk_msg_window_clear;
314         klass->create_mime_part_view_for= tny_gtk_msg_window_create_mime_part_view_for;
315         klass->create_new_inline_viewer= tny_gtk_msg_window_create_new_inline_viewer;
316
317         return;
318 }
319
320 static void
321 tny_mime_part_view_init (gpointer g, gpointer iface_data)
322 {
323         TnyMimePartViewIface *klass = (TnyMimePartViewIface *)g;
324
325         klass->get_part= tny_gtk_msg_window_mp_get_part;
326         klass->set_part= tny_gtk_msg_window_mp_set_part;
327         klass->clear= tny_gtk_msg_window_mp_clear;
328
329         return;
330 }
331
332 static void
333 tny_gtk_msg_window_class_init (TnyGtkMsgWindowClass *class)
334 {
335         GObjectClass *object_class;
336
337         parent_class = g_type_class_peek_parent (class);
338         object_class = (GObjectClass*) class;
339
340         class->get_msg= tny_gtk_msg_window_get_msg_default;
341         class->set_msg= tny_gtk_msg_window_set_msg_default;
342         class->set_unavailable= tny_gtk_msg_window_set_unavailable_default;
343         class->clear= tny_gtk_msg_window_clear_default;
344         class->create_new_inline_viewer= tny_gtk_msg_window_create_new_inline_viewer_default;
345         class->create_mime_part_view_for= tny_gtk_msg_window_create_mime_part_view_for_default;
346         class->get_part= tny_gtk_msg_window_mp_get_part_default;
347         class->set_part= tny_gtk_msg_window_mp_set_part_default;
348
349         object_class->finalize = tny_gtk_msg_window_finalize;
350
351         g_type_class_add_private (object_class, sizeof (TnyGtkMsgWindowPriv));
352
353         return;
354 }
355
356 static gpointer
357 tny_gtk_msg_window_register_type (gpointer notused)
358 {
359         GType type = 0;
360
361         static const GTypeInfo info =
362                 {
363                   sizeof (TnyGtkMsgWindowClass),
364                   NULL,   /* base_init */
365                   NULL,   /* base_finalize */
366                   (GClassInitFunc) tny_gtk_msg_window_class_init,   /* class_init */
367                   NULL,   /* class_finalize */
368                   NULL,   /* class_data */
369                   sizeof (TnyGtkMsgWindow),
370                   0,      /* n_preallocs */
371                   tny_gtk_msg_window_instance_init,    /* instance_init */
372                   NULL
373                 };
374
375         static const GInterfaceInfo tny_msg_window_info =
376                 {
377                   (GInterfaceInitFunc) tny_msg_window_init, /* interface_init */
378                   NULL,         /* interface_finalize */
379                   NULL          /* interface_data */
380                 };
381
382         static const GInterfaceInfo tny_msg_view_info =
383                 {
384                   (GInterfaceInitFunc) tny_msg_view_init, /* interface_init */
385                   NULL,         /* interface_finalize */
386                   NULL          /* interface_data */
387                 };
388
389         static const GInterfaceInfo tny_mime_part_view_info =
390                 {
391                   (GInterfaceInitFunc) tny_mime_part_view_init, /* interface_init */
392                   NULL,         /* interface_finalize */
393                   NULL          /* interface_data */
394                 };
395
396         type = g_type_register_static (GTK_TYPE_WINDOW,
397                                        "TnyGtkMsgWindow",
398                                        &info, 0);
399
400         g_type_add_interface_static (type, TNY_TYPE_MIME_PART_VIEW,
401                                      &tny_mime_part_view_info);
402
403         g_type_add_interface_static (type, TNY_TYPE_MSG_VIEW,
404                                      &tny_msg_view_info);
405
406         g_type_add_interface_static (type, TNY_TYPE_MSG_WINDOW,
407                                      &tny_msg_window_info);
408
409         return GUINT_TO_POINTER (type);
410 }
411
412 GType
413 tny_gtk_msg_window_get_type (void)
414 {
415         static GOnce once = G_ONCE_INIT;
416         g_once (&once, tny_gtk_msg_window_register_type, NULL);
417         return GPOINTER_TO_UINT (once.retval);
418 }
Note: See TracBrowser for help on using the browser.