* typo fix: rename recpt-activated into recpt_activated
[modest] / src / widgets / modest-mail-header-view.c
1 /* Copyright (c) 2007, Nokia Corporation
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  *   notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  *   notice, this list of conditions and the following disclaimer in the
12  *   documentation and/or other materials provided with the distribution.
13  * * Neither the name of the Nokia Corporation nor the names of its
14  *   contributors may be used to endorse or promote products derived from
15  *   this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #include <config.h>
31 //#include <glib/gi18n-lib.h>
32
33 #include <string.h>
34 #include <gtk/gtk.h>
35 #include <modest-text-utils.h>
36 #include <modest-mail-header-view.h>
37 #include <modest-tny-folder.h>
38
39 static GObjectClass *parent_class = NULL;
40
41 /* signals */
42 enum {
43         RECPT_ACTIVATED_SIGNAL,
44         LAST_SIGNAL
45 };
46
47 typedef struct _ModestMailHeaderViewPriv ModestMailHeaderViewPriv;
48
49 struct _ModestMailHeaderViewPriv
50 {
51         GtkWidget    *fromto_label;
52         GtkWidget    *fromto_contents;
53         GtkWidget    *main_vbox;
54         GtkWidget    *expander;
55         GtkWidget    *headers_vbox;
56         GtkSizeGroup *labels_size_group;
57         gboolean     is_outgoing;
58         gboolean     is_draft;
59         TnyHeader    *header;
60 };
61
62 #define MODEST_MAIL_HEADER_VIEW_GET_PRIVATE(o)  \
63         (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEST_TYPE_MAIL_HEADER_VIEW, ModestMailHeaderViewPriv))
64
65 static guint signals[LAST_SIGNAL] = {0};
66
67 static void
68 add_date_time_header (ModestMailHeaderView *mail_header, const gchar *name, time_t date)
69 {
70         const guint BUF_SIZE = 64; 
71         gchar date_buf [BUF_SIZE];
72         gchar time_buf [BUF_SIZE];
73
74         ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (mail_header);
75         GtkWidget *hbox, *date_hbox, *time_hbox;
76         GtkWidget *label;
77         gchar *bolded_field = NULL;
78
79         modest_text_utils_strftime (date_buf, BUF_SIZE, "%x", date);
80         modest_text_utils_strftime (time_buf, BUF_SIZE, "%X", date);
81
82         hbox = gtk_hbox_new (FALSE, 48);
83         date_hbox = gtk_hbox_new (FALSE, 12);
84         time_hbox = gtk_hbox_new (FALSE, 12);
85
86         label = gtk_label_new (NULL);
87         bolded_field = g_strconcat ("<b>", name, "</b>", NULL);
88         gtk_label_set_markup (GTK_LABEL (label), bolded_field);
89         g_free (bolded_field);
90         gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
91         gtk_box_pack_start (GTK_BOX (date_hbox), label, FALSE, FALSE, 0);
92         gtk_size_group_add_widget (priv->labels_size_group, label);
93
94         label = gtk_label_new(date_buf);
95         gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
96         gtk_box_pack_start (GTK_BOX (date_hbox), label, TRUE, TRUE, 0);
97
98         gtk_box_pack_start (GTK_BOX (hbox), date_hbox, FALSE, FALSE, 0);
99
100         label = gtk_label_new(NULL);
101         gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
102         bolded_field = g_strconcat ("<b>", _("mail_va_time"), "</b>", NULL);
103         gtk_label_set_markup (GTK_LABEL (label), bolded_field);
104         g_free (bolded_field);
105         gtk_box_pack_start (GTK_BOX (time_hbox), label, FALSE, FALSE, 0);
106
107         label = gtk_label_new(time_buf);
108         gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
109         gtk_box_pack_start (GTK_BOX (time_hbox), label, TRUE, TRUE, 0);
110
111         gtk_box_pack_start (GTK_BOX (hbox), time_hbox, TRUE, TRUE, 0);
112
113         gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
114         gtk_widget_show (hbox);
115 }
116
117 static void
118 activate_recpt (GtkWidget *recpt_view, const gchar *address, gpointer user_data)
119 {
120         ModestMailHeaderView * view = MODEST_MAIL_HEADER_VIEW (user_data);
121
122         g_signal_emit (G_OBJECT (view), signals[RECPT_ACTIVATED_SIGNAL], 0, address);
123 }
124
125 #if 0 /* This function is not used. murrayc. */
126 static void
127 add_header (ModestMailHeaderView *widget, const gchar *field, const gchar *value)
128 {
129         ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (widget);
130         GtkWidget *hbox;
131         GtkWidget *label_field, *label_value;
132         GtkWidget *scroll_text;
133         GtkTextBuffer *text_buffer;
134         gchar *bolded_field = NULL;
135
136         hbox = gtk_hbox_new (FALSE, 12);
137         label_field = gtk_label_new (NULL);
138         if (field)
139                 bolded_field = g_strconcat ("<b>", field, "</b>", NULL);
140         gtk_label_set_markup (GTK_LABEL (label_field), bolded_field);
141         g_free (bolded_field);
142         gtk_misc_set_alignment (GTK_MISC (label_field), 0.0, 0.0);
143         scroll_text = modest_scroll_text_new (NULL, 2);
144         label_value = (GtkWidget *) modest_scroll_text_get_text_view (MODEST_SCROLL_TEXT (scroll_text));
145         text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (label_value));
146         gtk_text_buffer_set_text (text_buffer, value, -1);
147
148         gtk_box_pack_start (GTK_BOX (hbox), label_field, FALSE, FALSE, 0);
149         gtk_box_pack_start (GTK_BOX (hbox), scroll_text, TRUE, TRUE, 0);
150         gtk_size_group_add_widget (priv->labels_size_group, label_field);
151         
152         gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
153         gtk_widget_show (hbox);
154         
155 }
156 #endif
157
158
159 static void
160 add_recpt_header (ModestMailHeaderView *widget, const gchar *field, const gchar *value)
161 {
162         ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (widget);
163         GtkWidget *hbox;
164         GtkWidget *label_field, *label_value;
165         gchar *bolded_field = NULL;
166
167         hbox = gtk_hbox_new (FALSE, 12);
168         label_field = gtk_label_new (NULL);
169         if (field != NULL)
170                 bolded_field = g_strconcat ("<b>", field, "</b>", NULL);
171         gtk_label_set_markup (GTK_LABEL (label_field), bolded_field);
172         g_free (bolded_field);
173         gtk_misc_set_alignment (GTK_MISC (label_field), 0.0, 0.0);
174         label_value = modest_recpt_view_new ();
175         modest_recpt_view_set_recipients (MODEST_RECPT_VIEW(label_value), value);
176         g_signal_connect (G_OBJECT (label_value), "activate", G_CALLBACK (activate_recpt), widget);
177
178         gtk_box_pack_start (GTK_BOX (hbox), label_field, FALSE, FALSE, 0);
179         gtk_box_pack_start (GTK_BOX (hbox), label_value, TRUE, TRUE, 0);
180         gtk_size_group_add_widget (priv->labels_size_group, label_field);
181         
182         gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
183         gtk_widget_show (hbox);
184 }
185
186 static void
187 clean_headers (GtkWidget *vbox)
188 {
189         GList *headers_list, *node;
190
191         headers_list = gtk_container_get_children (GTK_CONTAINER (vbox));
192
193         for (node = headers_list; node != NULL; node = g_list_next (node)) {
194                 gtk_widget_destroy (GTK_WIDGET (node->data));
195         }
196         g_list_free (headers_list);
197 }
198
199 static void 
200 modest_mail_header_view_set_header (TnyHeaderView *self, TnyHeader *header)
201 {
202         MODEST_MAIL_HEADER_VIEW_GET_CLASS (self)->set_header_func (self, header);
203         return;
204 }
205
206 static void
207 modest_mail_header_view_update_is_outgoing (TnyHeaderView *self)
208 {
209         ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (self);
210         TnyFolder *folder = NULL;
211      
212         priv->is_outgoing = FALSE;
213
214         if (priv->header == NULL)
215                 return;
216         
217         folder = tny_header_get_folder (priv->header);
218
219         if (folder) {
220                 TnyFolderType folder_type;
221                 folder_type = tny_folder_get_folder_type (folder);
222                 if (folder_type == TNY_FOLDER_TYPE_NORMAL || folder_type == TNY_FOLDER_TYPE_UNKNOWN) {
223                         const gchar *fname = tny_folder_get_name (folder);
224                         folder_type = modest_tny_folder_guess_folder_type_from_name (fname);
225                 }
226
227                 switch (folder_type) {
228                 case TNY_FOLDER_TYPE_DRAFTS:
229                 case TNY_FOLDER_TYPE_OUTBOX:
230                 case TNY_FOLDER_TYPE_SENT:
231                         priv->is_outgoing = TRUE;
232                         break;
233                 default:
234                         priv->is_outgoing = FALSE;
235                 }
236                 priv->is_draft = (folder_type == TNY_FOLDER_TYPE_DRAFTS);
237
238                 g_object_unref (folder);
239         }
240 }
241
242 static void 
243 modest_mail_header_view_set_header_default (TnyHeaderView *self, TnyHeader *header)
244 {
245         ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (self);
246
247         if (header)
248                 g_assert (TNY_IS_HEADER (header));
249
250         if (G_LIKELY (priv->header))
251                 g_object_unref (G_OBJECT (priv->header));
252         priv->header = NULL;
253
254         clean_headers (priv->headers_vbox);
255
256         if (header && G_IS_OBJECT (header))
257         {
258                 const gchar *to, *from, *subject, *bcc, *cc;
259                 GtkWidget *subject_box, *subject_label;
260
261                 g_object_ref (G_OBJECT (header)); 
262                 priv->header = header;
263
264                 modest_mail_header_view_update_is_outgoing (self);
265
266
267                 to = tny_header_get_to (header);
268                 from = tny_header_get_from (header);
269                 subject = tny_header_get_subject (header);
270                 cc = tny_header_get_cc (header);
271                 bcc = tny_header_get_bcc (header);
272
273                 subject_box = gtk_hbox_new (FALSE, 12);
274                 subject_label = gtk_label_new (NULL);
275                 if (subject)
276                         gtk_label_set_text (GTK_LABEL (subject_label), subject);
277                 else
278                         gtk_label_set_text (GTK_LABEL (subject_label), _("mail_va_no_subject"));
279                 gtk_label_set_single_line_mode (GTK_LABEL (subject_label), TRUE);
280                 gtk_label_set_ellipsize (GTK_LABEL (subject_label), PANGO_ELLIPSIZE_END);
281                 gtk_label_set_selectable (GTK_LABEL (subject_label), TRUE);
282                 gtk_misc_set_alignment (GTK_MISC (subject_label), 0.0, 0.0);
283
284                 /* TODO: code disabled until we can get real priority information from message */
285 /*              if (tny_header_get_flags (header) & TNY_HEADER_FLAG_PRIORITY) { */
286 /*                      GtkWidget *priority_icon = gtk_image_new_from_icon_name ("qgn_list_messaging_high", GTK_ICON_SIZE_MENU); */
287 /*                      gtk_box_pack_start (GTK_BOX (subject_box), priority_icon, FALSE, FALSE, 0); */
288 /*              } */
289                 gtk_box_pack_start (GTK_BOX (subject_box), subject_label, TRUE, TRUE, 0);
290                 if (priv->is_outgoing) {
291                         gchar *bolded_label = g_strconcat ("<b>", _("mail_va_to"), "</b>", NULL);
292                         gtk_label_set_markup (GTK_LABEL (priv->fromto_label), bolded_label);
293                         g_free (bolded_label);
294                         if (to)
295                                 modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), to);
296                         if (cc)
297                                 add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_cc"), cc);
298                         if (bcc)
299                                 add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_hotfix1"), bcc);
300                         if (priv->is_draft&& from)
301                                 add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_from"), from);
302                         modest_mail_header_view_add_custom_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_subject"), subject_box, TRUE, TRUE);
303                         if (priv->is_draft)
304                                 add_date_time_header (MODEST_MAIL_HEADER_VIEW (self), _("fixme_Last saved:"), tny_header_get_date_sent (header));
305                         else
306                                 add_date_time_header (MODEST_MAIL_HEADER_VIEW (self), _("fixme_Sent:"), tny_header_get_date_sent (header));
307                 } else {
308                         gchar *bolded_label = g_strconcat ("<b>", _("mail_va_from"), "</b>", NULL);
309                         gtk_label_set_markup (GTK_LABEL (priv->fromto_label), bolded_label);
310                         g_free (bolded_label);
311                         if (from)
312                                 modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), from);
313                         if (cc)
314                                 add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_cc"), cc);
315                         if (bcc)
316                                 add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_hotfix1"), bcc);
317                         if (to)
318                                 add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_to"), to);
319                         modest_mail_header_view_add_custom_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_subject"), subject_box, TRUE, TRUE);
320                         add_date_time_header (MODEST_MAIL_HEADER_VIEW (self), _("fixme_Received:"), tny_header_get_date_received (header));
321                 }
322         }
323
324         gtk_widget_show_all (GTK_WIDGET (self));
325
326         return;
327 }
328
329 static void 
330 modest_mail_header_view_clear (TnyHeaderView *self)
331 {
332         MODEST_MAIL_HEADER_VIEW_GET_CLASS (self)->clear_func (self);
333         return;
334 }
335
336 static void 
337 modest_mail_header_view_clear_default (TnyHeaderView *self)
338 {
339         ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (self);
340
341         if (G_LIKELY (priv->header))
342                 g_object_unref (G_OBJECT (priv->header));
343         priv->header = NULL;
344
345         clean_headers (priv->headers_vbox);
346
347         gtk_label_set_text (GTK_LABEL (priv->fromto_label), "");
348         modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), "");
349
350         gtk_widget_hide (GTK_WIDGET(self));
351
352         return;
353 }
354
355 static void
356 expander_activate (GtkWidget *expander, ModestMailHeaderView *header_view)
357 {
358         ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (header_view);
359
360         gtk_widget_queue_resize (GTK_WIDGET (header_view));
361         gtk_widget_queue_draw (GTK_WIDGET (header_view));
362
363         if (gtk_expander_get_expanded (GTK_EXPANDER (expander))) {
364                 if (gtk_widget_get_parent (priv->headers_vbox) == NULL) {
365                         gtk_box_pack_start (GTK_BOX(priv->main_vbox), priv->headers_vbox, TRUE, TRUE, 0);
366                         gtk_widget_show_all (GTK_WIDGET (priv->headers_vbox));
367                 }
368         } else {
369                 if (gtk_widget_get_parent (priv->headers_vbox) != NULL) {
370                         gtk_container_remove (GTK_CONTAINER (priv->main_vbox), priv->headers_vbox);
371                 }
372         }
373         gtk_widget_queue_resize (GTK_WIDGET (priv->expander));
374         gtk_widget_queue_draw (GTK_WIDGET (priv->expander));
375 }
376
377 const GtkWidget *
378 modest_mail_header_view_add_custom_header (ModestMailHeaderView *header_view,
379                                            const gchar *label,
380                                            GtkWidget *custom_widget,
381                                            gboolean with_expander,
382                                            gboolean start)
383 {
384         ModestMailHeaderViewPriv *priv;
385         g_return_val_if_fail (MODEST_IS_MAIL_HEADER_VIEW (header_view), NULL);
386         GtkWidget *hbox;
387         GtkWidget *label_field;
388         gchar *bolded_field = NULL;
389
390         priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (header_view);
391         hbox = gtk_hbox_new (FALSE, 12);
392         label_field = gtk_label_new (NULL);
393         if (label != NULL)
394                 bolded_field = g_strconcat ("<b>", label, "</b>", NULL);
395         gtk_label_set_markup (GTK_LABEL (label_field), bolded_field);
396         g_free (bolded_field);
397         gtk_misc_set_alignment (GTK_MISC (label_field), 0.0, 0.0);
398         gtk_box_pack_start (GTK_BOX (hbox), label_field, FALSE, FALSE, 0);
399         gtk_box_pack_start (GTK_BOX (hbox), custom_widget, TRUE, TRUE, 0);
400         gtk_size_group_add_widget (priv->labels_size_group, label_field);
401
402         if (with_expander) {
403                 if (start)
404                         gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
405                 else
406                         gtk_box_pack_end (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
407         } else {
408                 if (start)
409                         gtk_box_pack_start (GTK_BOX (priv->main_vbox), hbox, FALSE, FALSE, 0);
410                 else
411                         gtk_box_pack_end (GTK_BOX (priv->main_vbox), hbox, FALSE, FALSE, 0);
412         }
413
414         return hbox;
415 }
416
417 /**
418  * modest_mail_header_view_new:
419  *
420  * Return value: a new #ModestHeaderView instance implemented for Gtk+
421  **/
422 TnyHeaderView*
423 modest_mail_header_view_new (void)
424 {
425         ModestMailHeaderView *self = g_object_new (MODEST_TYPE_MAIL_HEADER_VIEW, NULL);
426
427         return TNY_HEADER_VIEW (self);
428 }
429
430 static void
431 modest_mail_header_view_instance_init (GTypeInstance *instance, gpointer g_class)
432 {
433         ModestMailHeaderView *self = (ModestMailHeaderView *)instance;
434         ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (self);
435         GtkWidget *fromto_hbox = NULL;
436         GtkSizeGroup *expander_group = NULL;
437
438         priv->header = NULL;
439
440         priv->expander = gtk_expander_new (NULL);
441         priv->main_vbox = gtk_vbox_new (FALSE, 1);
442         gtk_box_pack_start (GTK_BOX (instance), priv->expander, FALSE, FALSE, 0);
443         gtk_box_pack_start (GTK_BOX (instance), priv->main_vbox, TRUE, TRUE, 0);
444         g_signal_connect_after (G_OBJECT (priv->expander), "activate", G_CALLBACK (expander_activate), instance);
445
446         fromto_hbox = gtk_hbox_new (FALSE, 12);
447         priv->fromto_label = gtk_label_new (NULL);
448         gtk_misc_set_alignment (GTK_MISC (priv->fromto_label), 0.0, 0.0);
449         priv->fromto_contents = modest_recpt_view_new ();
450         g_signal_connect (G_OBJECT (priv->fromto_contents), "activate", G_CALLBACK (activate_recpt), instance);
451
452         gtk_box_pack_start (GTK_BOX (fromto_hbox), priv->fromto_label, FALSE, FALSE, 0);
453         gtk_box_pack_start (GTK_BOX (fromto_hbox), priv->fromto_contents, TRUE, TRUE, 0);
454         gtk_box_pack_start (GTK_BOX (priv->main_vbox), fromto_hbox, FALSE, FALSE, 0);
455
456         priv->labels_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
457         gtk_size_group_add_widget (priv->labels_size_group, priv->fromto_label);
458         
459         priv->headers_vbox = gtk_vbox_new (FALSE, 0);
460         g_object_ref (priv->headers_vbox);
461
462         expander_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
463         gtk_size_group_add_widget (expander_group, priv->headers_vbox);
464         gtk_size_group_add_widget (expander_group, fromto_hbox);
465         g_object_unref (expander_group);
466
467         gtk_container_set_reallocate_redraws (GTK_CONTAINER (instance), TRUE);
468
469         priv->is_outgoing = FALSE;
470         priv->is_draft = FALSE;
471
472         return;
473 }
474
475 static void
476 modest_mail_header_view_finalize (GObject *object)
477 {
478         ModestMailHeaderView *self = (ModestMailHeaderView *)object;    
479         ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (self);
480
481         if (G_LIKELY (priv->header))
482                 g_object_unref (G_OBJECT (priv->header));
483         priv->header = NULL;
484
485         if (G_LIKELY (priv->headers_vbox))
486                 g_object_unref (G_OBJECT (priv->headers_vbox));
487
488         priv->headers_vbox = NULL;
489
490         g_object_unref (priv->labels_size_group);
491
492         (*parent_class->finalize) (object);
493
494         return;
495 }
496
497 static void
498 tny_header_view_init (gpointer g, gpointer iface_data)
499 {
500         TnyHeaderViewIface *klass = (TnyHeaderViewIface *)g;
501
502         klass->set_header_func = modest_mail_header_view_set_header;
503         klass->clear_func = modest_mail_header_view_clear;
504
505         return;
506 }
507
508 static void 
509 modest_mail_header_view_class_init (ModestMailHeaderViewClass *klass)
510 {
511         GObjectClass *object_class;
512
513         parent_class = g_type_class_peek_parent (klass);
514         object_class = (GObjectClass*) klass;
515
516         klass->set_header_func = modest_mail_header_view_set_header_default;
517         klass->clear_func = modest_mail_header_view_clear_default;
518
519         object_class->finalize = modest_mail_header_view_finalize;
520
521         klass->recpt_activated = NULL;
522
523         g_type_class_add_private (object_class, sizeof (ModestMailHeaderViewPriv));
524
525         signals[RECPT_ACTIVATED_SIGNAL] =
526                 g_signal_new ("recpt_activated",
527                               G_TYPE_FROM_CLASS (object_class),
528                               G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
529                               G_STRUCT_OFFSET(ModestMailHeaderViewClass, recpt_activated),
530                               NULL, NULL,
531                               g_cclosure_marshal_VOID__STRING,
532                               G_TYPE_NONE, 1, 
533                               G_TYPE_STRING);
534
535
536         return;
537 }
538
539 GType 
540 modest_mail_header_view_get_type (void)
541 {
542         static GType type = 0;
543
544         if (G_UNLIKELY(type == 0))
545         {
546                 static const GTypeInfo info = 
547                 {
548                   sizeof (ModestMailHeaderViewClass),
549                   NULL,   /* base_init */
550                   NULL,   /* base_finalize */
551                   (GClassInitFunc) modest_mail_header_view_class_init,   /* class_init */
552                   NULL,   /* class_finalize */
553                   NULL,   /* class_data */
554                   sizeof (ModestMailHeaderView),
555                   0,      /* n_preallocs */
556                   modest_mail_header_view_instance_init    /* instance_init */
557                 };
558
559                 static const GInterfaceInfo tny_header_view_info = 
560                 {
561                   (GInterfaceInitFunc) tny_header_view_init, /* interface_init */
562                   NULL,         /* interface_finalize */
563                   NULL          /* interface_data */
564                 };
565
566                 type = g_type_register_static (GTK_TYPE_HBOX,
567                         "ModestMailHeaderView",
568                         &info, 0);
569
570                 g_type_add_interface_static (type, TNY_TYPE_HEADER_VIEW, 
571                         &tny_header_view_info);
572
573         }
574
575         return type;
576 }