This is a manual merge of branch drop split view intro trunk.
[modest] / src / widgets / modest-expander-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-expander-mail-header-view.h>
37 #include <modest-tny-folder.h>
38 #include <modest-recpt-view.h>
39 #include <modest-icon-names.h>
40 #include <modest-datetime-formatter.h>
41
42 static GObjectClass *parent_class = NULL;
43
44 typedef struct _ModestExpanderMailHeaderViewPriv ModestExpanderMailHeaderViewPriv;
45
46 struct _ModestExpanderMailHeaderViewPriv
47 {
48         GtkWidget    *fromto_label;
49         GtkWidget    *fromto_contents;
50         GtkWidget    *main_vbox;
51         GtkWidget    *expander;
52         GtkWidget    *headers_vbox;
53         GtkWidget    *subject_box;
54         GtkWidget    *priority_icon;
55         GtkSizeGroup *labels_size_group;
56         gboolean     is_outgoing;
57         gboolean     is_draft;
58         TnyHeader    *header;
59         TnyHeaderFlags priority_flags;
60         ModestDatetimeFormatter *datetime_formatter;
61 };
62
63 #define MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE(o) \
64         (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEST_TYPE_EXPANDER_MAIL_HEADER_VIEW, ModestExpanderMailHeaderViewPriv))
65
66 /* GObject */
67 static void modest_expander_mail_header_view_instance_init (GTypeInstance *instance, gpointer g_class);
68 static void modest_expander_mail_header_view_class_init (ModestExpanderMailHeaderViewClass *klass);
69 static void modest_expander_mail_header_view_finalize (GObject *object);
70
71 /* TnyHeaderView interface */
72 static void tny_header_view_init (gpointer g, gpointer iface_data);
73 static void modest_expander_mail_header_view_set_header (TnyHeaderView *self, TnyHeader *header);
74 static void modest_expander_mail_header_view_update_is_outgoing (TnyHeaderView *self);
75 static void modest_expander_mail_header_view_set_header_default (TnyHeaderView *self, TnyHeader *header);
76 static void modest_expander_mail_header_view_clear (TnyHeaderView *self);
77 static void modest_expander_mail_header_view_clear_default (TnyHeaderView *self);
78
79 /* ModestMailHeaderView interface */
80 static void modest_mail_header_view_init (gpointer g, gpointer iface_data);
81 static TnyHeaderFlags modest_expander_mail_header_view_get_priority (ModestMailHeaderView *self);
82 static TnyHeaderFlags modest_expander_mail_header_view_get_priority_default (ModestMailHeaderView *headers_view);
83 static void modest_expander_mail_header_view_set_priority (ModestMailHeaderView *self, TnyHeaderFlags flags);
84 static void modest_expander_mail_header_view_set_priority_default (ModestMailHeaderView *headers_view,
85                                                                    TnyHeaderFlags flags);
86 static const GtkWidget *modest_expander_mail_header_view_add_custom_header (ModestMailHeaderView *self,
87                                                                             const gchar *label,
88                                                                             GtkWidget *custom_widget,
89                                                                             gboolean with_expander,
90                                                                             gboolean start);
91 static const GtkWidget *modest_expander_mail_header_view_add_custom_header_default (ModestMailHeaderView *self,
92                                                                                     const gchar *label,
93                                                                                     GtkWidget *custom_widget,
94                                                                                     gboolean with_expander,
95                                                                                     gboolean start);
96
97 /* internal */
98 static void add_date_time_header (ModestExpanderMailHeaderView *mail_header, const gchar *name, time_t date);
99 static void activate_recpt (GtkWidget *recpt_view, const gchar *address, gpointer user_data);
100 static void add_recpt_header (ModestExpanderMailHeaderView *widget, const gchar *field, const gchar *value);
101 static void clean_headers (GtkWidget *vbox);
102 static void expander_activate (GtkWidget *expander, ModestExpanderMailHeaderView *header_view);
103
104
105
106 static void
107 add_date_time_header (ModestExpanderMailHeaderView *mail_header, const gchar *name, time_t date)
108 {
109         const gchar *date_buf;
110         const gchar *time_buf;
111
112         ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (mail_header);
113         GtkWidget *hbox, *date_hbox, *time_hbox;
114         GtkWidget *label;
115
116         date_buf = modest_datetime_formatter_format_date (priv->datetime_formatter, date);
117         time_buf = modest_datetime_formatter_format_time (priv->datetime_formatter, date);
118
119
120         hbox = gtk_hbox_new (FALSE, 48);
121         date_hbox = gtk_hbox_new (FALSE, 12);
122         time_hbox = gtk_hbox_new (FALSE, 12);
123
124         label = gtk_label_new (NULL);
125         gtk_label_set_markup (GTK_LABEL (label), name);
126         gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.0);
127         gtk_box_pack_start (GTK_BOX (date_hbox), label, FALSE, FALSE, 0);
128         gtk_size_group_add_widget (priv->labels_size_group, label);
129
130         label = gtk_label_new(date_buf);
131         gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
132         gtk_box_pack_start (GTK_BOX (date_hbox), label, TRUE, TRUE, 0);
133
134         gtk_box_pack_start (GTK_BOX (hbox), date_hbox, FALSE, FALSE, 0);
135
136         label = gtk_label_new(NULL);
137         gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
138         gtk_label_set_markup (GTK_LABEL (label), _("mail_va_time"));
139         gtk_box_pack_start (GTK_BOX (time_hbox), label, FALSE, FALSE, 0);
140
141         label = gtk_label_new(time_buf);
142         gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
143         gtk_box_pack_start (GTK_BOX (time_hbox), label, TRUE, TRUE, 0);
144
145         gtk_box_pack_start (GTK_BOX (hbox), time_hbox, TRUE, TRUE, 0);
146
147         gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
148         gtk_widget_show (hbox);
149 }
150
151 static void
152 activate_recpt (GtkWidget *recpt_view, const gchar *address, gpointer user_data)
153 {
154         ModestExpanderMailHeaderView * view = MODEST_EXPANDER_MAIL_HEADER_VIEW (user_data);
155
156         g_signal_emit_by_name (G_OBJECT (view), "recpt-activated", address);
157 }
158
159
160 static void
161 add_recpt_header (ModestExpanderMailHeaderView *widget, const gchar *field, const gchar *value)
162 {
163         ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (widget);
164         GtkWidget *hbox;
165         GtkWidget *label_field, *label_value;
166
167         hbox = gtk_hbox_new (FALSE, 12);
168         label_field = gtk_label_new (NULL);
169         gtk_label_set_markup (GTK_LABEL (label_field), field);
170         gtk_misc_set_alignment (GTK_MISC (label_field), 1.0, 0.0);
171         label_value = modest_recpt_view_new ();
172         modest_recpt_view_set_recipients (MODEST_RECPT_VIEW(label_value), value);
173         g_signal_connect (G_OBJECT (label_value), "activate", G_CALLBACK (activate_recpt), widget);
174
175         gtk_box_pack_start (GTK_BOX (hbox), label_field, FALSE, FALSE, 0);
176         gtk_box_pack_start (GTK_BOX (hbox), label_value, TRUE, TRUE, 0);
177         gtk_size_group_add_widget (priv->labels_size_group, label_field);
178         
179         gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
180
181         gtk_widget_show (hbox);
182 }
183
184 static void
185 clean_headers (GtkWidget *vbox)
186 {
187         GList *headers_list, *node;
188
189         headers_list = gtk_container_get_children (GTK_CONTAINER (vbox));
190
191         for (node = headers_list; node != NULL; node = g_list_next (node)) {
192                 gtk_widget_destroy (GTK_WIDGET (node->data));
193         }
194         g_list_free (headers_list);
195 }
196
197 static void 
198 modest_expander_mail_header_view_set_header (TnyHeaderView *self, TnyHeader *header)
199 {
200         MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_CLASS (self)->set_header_func (self, header);
201         return;
202 }
203
204 static void
205 modest_expander_mail_header_view_update_is_outgoing (TnyHeaderView *self)
206 {
207         ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
208         TnyFolder *folder = NULL;
209      
210         priv->is_outgoing = FALSE;
211
212         if (priv->header == NULL)
213                 return;
214         
215         folder = tny_header_get_folder (priv->header);
216
217         if (folder) {
218                 TnyFolderType folder_type = tny_folder_get_folder_type (folder);
219
220                 switch (folder_type) {
221                 case TNY_FOLDER_TYPE_DRAFTS:
222                 case TNY_FOLDER_TYPE_OUTBOX:
223                 case TNY_FOLDER_TYPE_SENT:
224                         priv->is_outgoing = TRUE;
225                         break;
226                 default:
227                         priv->is_outgoing = FALSE;
228                 }
229                 priv->is_draft = (folder_type == TNY_FOLDER_TYPE_DRAFTS);
230
231                 g_object_unref (folder);
232         }
233 }
234
235 static void 
236 modest_expander_mail_header_view_set_header_default (TnyHeaderView *self, TnyHeader *header)
237 {
238         ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
239
240         if (header)
241                 g_assert (TNY_IS_HEADER (header));
242
243         if (G_LIKELY (priv->header))
244                 g_object_unref (G_OBJECT (priv->header));
245         priv->header = NULL;
246
247         clean_headers (priv->headers_vbox);
248
249         if (header && G_IS_OBJECT (header))
250         {
251                 gchar *to, *from, *subject, *bcc, *cc;
252                 GtkWidget *subject_label;
253
254                 g_object_ref (G_OBJECT (header)); 
255                 priv->header = header;
256
257                 modest_expander_mail_header_view_update_is_outgoing (self);
258
259
260                 to = tny_header_dup_to (header);
261                 from = tny_header_dup_from (header);
262                 subject = tny_header_dup_subject (header);
263                 cc = tny_header_dup_cc (header);
264                 bcc = tny_header_dup_bcc (header);
265
266                 priv->subject_box = gtk_hbox_new (FALSE, 0);
267                 subject_label = gtk_label_new (NULL);
268                 if (subject && (subject[0] != '\0'))
269                         gtk_label_set_text (GTK_LABEL (subject_label), subject);
270                 else
271                         gtk_label_set_text (GTK_LABEL (subject_label), _("mail_va_no_subject"));
272                 gtk_label_set_single_line_mode (GTK_LABEL (subject_label), TRUE);
273                 gtk_label_set_ellipsize (GTK_LABEL (subject_label), PANGO_ELLIPSIZE_END);
274                 gtk_label_set_selectable (GTK_LABEL (subject_label), TRUE);
275                 gtk_misc_set_alignment (GTK_MISC (subject_label), 0.0, 0.0);
276
277                 priv->priority_icon = NULL;
278                 gtk_box_pack_end (GTK_BOX (priv->subject_box), subject_label, TRUE, TRUE, 0);
279                 if (priv->is_outgoing) {
280                         gtk_label_set_markup (GTK_LABEL (priv->fromto_label), _("mail_va_to"));
281                         if (to)
282                                 modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), to);
283                         if (cc)
284                                 add_recpt_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_cc"), cc);
285                         if (bcc)
286                                 add_recpt_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_hotfix1"), bcc);
287                         if (priv->is_draft&& from)
288                                 add_recpt_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_from"), from);
289                         modest_mail_header_view_add_custom_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_subject"),
290                                                                    priv->subject_box, TRUE, TRUE);
291                         if (priv->is_draft)
292                                 add_date_time_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mcen_fi_message_properties_created"),
293                                                       tny_header_get_date_sent (header));
294                         else
295                                 add_date_time_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mcen_fi_message_properties_sent"),
296                                                       tny_header_get_date_sent (header));
297                 } else {
298                         gtk_label_set_markup (GTK_LABEL (priv->fromto_label), _("mail_va_from"));
299                         if (from)
300                                 modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), from);
301                         if (to)
302                                 add_recpt_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_to"), to);
303                         if (cc)
304                                 add_recpt_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_cc"), cc);
305                         if (bcc)
306                                 add_recpt_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_hotfix1"), bcc);
307                         modest_mail_header_view_add_custom_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_subject"),
308                                                                    priv->subject_box, TRUE, TRUE);
309                         add_date_time_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_date"),
310                                               tny_header_get_date_received (header));
311                 }
312                 g_free (subject);
313                 g_free (to);
314                 g_free (from);
315                 g_free (cc);
316                 g_free (bcc);
317         }
318
319         gtk_widget_show_all (GTK_WIDGET (self));
320
321         return;
322 }
323
324 static void 
325 modest_expander_mail_header_view_clear (TnyHeaderView *self)
326 {
327         MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_CLASS (self)->clear_func (self);
328         return;
329 }
330
331 static void 
332 modest_expander_mail_header_view_clear_default (TnyHeaderView *self)
333 {
334         ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
335
336         if (G_LIKELY (priv->header))
337                 g_object_unref (G_OBJECT (priv->header));
338         priv->header = NULL;
339
340         clean_headers (priv->headers_vbox);
341
342         gtk_label_set_text (GTK_LABEL (priv->fromto_label), "");
343         modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), "");
344
345         gtk_widget_hide (GTK_WIDGET(self));
346
347         return;
348 }
349
350 static void
351 expander_activate (GtkWidget *expander, ModestExpanderMailHeaderView *header_view)
352 {
353         ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (header_view);
354
355         gtk_widget_queue_resize (GTK_WIDGET (header_view));
356         gtk_widget_queue_draw (GTK_WIDGET (header_view));
357
358         if (gtk_expander_get_expanded (GTK_EXPANDER (expander))) {
359                 if (gtk_widget_get_parent (priv->headers_vbox) == NULL) {
360                         gtk_box_pack_start (GTK_BOX(priv->main_vbox), priv->headers_vbox, TRUE, TRUE, 0);
361                         gtk_widget_show_all (GTK_WIDGET (priv->headers_vbox));
362                 }
363         } else {
364                 if (gtk_widget_get_parent (priv->headers_vbox) != NULL) {
365                         gtk_container_remove (GTK_CONTAINER (priv->main_vbox), priv->headers_vbox);
366                 }
367         }
368         gtk_widget_queue_resize (GTK_WIDGET (priv->expander));
369         gtk_widget_queue_draw (GTK_WIDGET (priv->expander));
370 }
371
372 static const GtkWidget *
373 modest_expander_mail_header_view_add_custom_header (ModestMailHeaderView *self,
374                                                     const gchar *label,
375                                                     GtkWidget *custom_widget,
376                                                     gboolean with_expander,
377                                                     gboolean start)
378 {
379         return MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_CLASS (self)->add_custom_header_func (self, label,
380                                                                                           custom_widget, with_expander,
381                                                                                           start);
382 }
383
384 static const GtkWidget *
385 modest_expander_mail_header_view_add_custom_header_default (ModestMailHeaderView *self,
386                                                             const gchar *label,
387                                                             GtkWidget *custom_widget,
388                                                             gboolean with_expander,
389                                                             gboolean start)
390 {
391         ModestExpanderMailHeaderViewPriv *priv;
392         g_return_val_if_fail (MODEST_IS_EXPANDER_MAIL_HEADER_VIEW (self), NULL);
393         GtkWidget *hbox;
394         GtkWidget *label_field;
395
396         priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
397         hbox = gtk_hbox_new (FALSE, 12);
398         label_field = gtk_label_new (NULL);
399         gtk_label_set_markup (GTK_LABEL (label_field), label);
400         gtk_misc_set_alignment (GTK_MISC (label_field), 1.0, 0.0);
401         gtk_box_pack_start (GTK_BOX (hbox), label_field, FALSE, FALSE, 0);
402         gtk_box_pack_start (GTK_BOX (hbox), custom_widget, TRUE, TRUE, 0);
403         gtk_size_group_add_widget (priv->labels_size_group, label_field);
404
405         if (with_expander) {
406                 if (start)
407                         gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
408                 else
409                         gtk_box_pack_end (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
410         } else {
411                 if (start)
412                         gtk_box_pack_start (GTK_BOX (priv->main_vbox), hbox, FALSE, FALSE, 0);
413                 else
414                         gtk_box_pack_end (GTK_BOX (priv->main_vbox), hbox, FALSE, FALSE, 0);
415         }
416
417         return hbox;
418 }
419
420 /**
421  * modest_expander_mail_header_view_new:
422  *
423  * Return value: a new #ModestHeaderView instance implemented for Gtk+
424  **/
425 TnyHeaderView*
426 modest_expander_mail_header_view_new (gboolean expanded)
427 {
428         ModestExpanderMailHeaderViewPriv *priv;
429         ModestExpanderMailHeaderView *self = g_object_new (MODEST_TYPE_EXPANDER_MAIL_HEADER_VIEW, NULL);
430
431         priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
432         gtk_expander_set_expanded (GTK_EXPANDER (priv->expander), expanded);
433         expander_activate (priv->expander, self);
434
435         return TNY_HEADER_VIEW (self);
436 }
437
438 static void
439 modest_expander_mail_header_view_instance_init (GTypeInstance *instance, gpointer g_class)
440 {
441         ModestExpanderMailHeaderView *self = (ModestExpanderMailHeaderView *)instance;
442         ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
443         GtkWidget *fromto_hbox = NULL;
444         GtkSizeGroup *expander_group = NULL;
445
446         priv->header = NULL;
447
448         priv->datetime_formatter = modest_datetime_formatter_new ();
449
450         priv->expander = gtk_expander_new (NULL);
451         priv->main_vbox = gtk_vbox_new (FALSE, 1);
452         gtk_box_pack_start (GTK_BOX (instance), priv->expander, FALSE, FALSE, 0);
453         gtk_box_pack_start (GTK_BOX (instance), priv->main_vbox, TRUE, TRUE, 0);
454         g_signal_connect_after (G_OBJECT (priv->expander), "activate", G_CALLBACK (expander_activate), instance);
455
456         fromto_hbox = gtk_hbox_new (FALSE, 12);
457         priv->fromto_label = gtk_label_new (NULL);
458         gtk_misc_set_alignment (GTK_MISC (priv->fromto_label), 1.0, 0.0);
459         priv->fromto_contents = modest_recpt_view_new ();
460         g_signal_connect (G_OBJECT (priv->fromto_contents), "activate", G_CALLBACK (activate_recpt), instance);
461
462         gtk_box_pack_start (GTK_BOX (fromto_hbox), priv->fromto_label, FALSE, FALSE, 0);
463         gtk_box_pack_start (GTK_BOX (fromto_hbox), priv->fromto_contents, TRUE, TRUE, 0);
464         gtk_box_pack_start (GTK_BOX (priv->main_vbox), fromto_hbox, FALSE, FALSE, 0);
465
466         priv->labels_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
467         gtk_size_group_add_widget (priv->labels_size_group, priv->fromto_label);
468         
469         priv->headers_vbox = gtk_vbox_new (FALSE, 0);
470         gtk_container_set_focus_chain (GTK_CONTAINER (priv->headers_vbox), NULL);
471         g_object_ref (priv->headers_vbox);
472
473         expander_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
474         gtk_size_group_add_widget (expander_group, priv->headers_vbox);
475         gtk_size_group_add_widget (expander_group, fromto_hbox);
476         g_object_unref (expander_group);
477
478         gtk_container_set_reallocate_redraws (GTK_CONTAINER (instance), TRUE);
479
480         priv->is_outgoing = FALSE;
481         priv->is_draft = FALSE;
482
483         return;
484 }
485
486 static void
487 modest_expander_mail_header_view_finalize (GObject *object)
488 {
489         ModestExpanderMailHeaderView *self = (ModestExpanderMailHeaderView *)object;    
490         ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
491
492         if (priv->datetime_formatter) {
493                 g_object_unref (priv->datetime_formatter);
494                 priv->datetime_formatter = NULL;
495         }
496
497         if (G_LIKELY (priv->header))
498                 g_object_unref (G_OBJECT (priv->header));
499         priv->header = NULL;
500
501         if (G_LIKELY (priv->headers_vbox))
502                 g_object_unref (G_OBJECT (priv->headers_vbox));
503
504         priv->headers_vbox = NULL;
505
506         g_object_unref (priv->labels_size_group);
507
508         (*parent_class->finalize) (object);
509
510         return;
511 }
512
513 static void
514 tny_header_view_init (gpointer g, gpointer iface_data)
515 {
516         TnyHeaderViewIface *klass = (TnyHeaderViewIface *)g;
517
518         klass->set_header = modest_expander_mail_header_view_set_header;
519         klass->clear = modest_expander_mail_header_view_clear;
520
521         return;
522 }
523
524 static void
525 modest_mail_header_view_init (gpointer g, gpointer iface_data)
526 {
527         ModestMailHeaderViewIface *klass = (ModestMailHeaderViewIface *)g;
528
529         klass->get_priority = modest_expander_mail_header_view_get_priority;
530         klass->set_priority = modest_expander_mail_header_view_set_priority;
531         klass->add_custom_header = modest_expander_mail_header_view_add_custom_header;
532
533         return;
534 }
535
536 static void 
537 modest_expander_mail_header_view_class_init (ModestExpanderMailHeaderViewClass *klass)
538 {
539         GObjectClass *object_class;
540
541         parent_class = g_type_class_peek_parent (klass);
542         object_class = (GObjectClass*) klass;
543
544         klass->set_header_func = modest_expander_mail_header_view_set_header_default;
545         klass->clear_func = modest_expander_mail_header_view_clear_default;
546         klass->set_priority_func = modest_expander_mail_header_view_set_priority_default;
547         klass->get_priority_func = modest_expander_mail_header_view_get_priority_default;
548         klass->add_custom_header_func = modest_expander_mail_header_view_add_custom_header_default;
549
550         object_class->finalize = modest_expander_mail_header_view_finalize;
551
552         g_type_class_add_private (object_class, sizeof (ModestExpanderMailHeaderViewPriv));
553
554         return;
555 }
556
557 GType 
558 modest_expander_mail_header_view_get_type (void)
559 {
560         static GType type = 0;
561
562         if (G_UNLIKELY(type == 0))
563         {
564                 static const GTypeInfo info = 
565                 {
566                   sizeof (ModestExpanderMailHeaderViewClass),
567                   NULL,   /* base_init */
568                   NULL,   /* base_finalize */
569                   (GClassInitFunc) modest_expander_mail_header_view_class_init,   /* class_init */
570                   NULL,   /* class_finalize */
571                   NULL,   /* class_data */
572                   sizeof (ModestExpanderMailHeaderView),
573                   0,      /* n_preallocs */
574                   modest_expander_mail_header_view_instance_init    /* instance_init */
575                 };
576
577                 static const GInterfaceInfo tny_header_view_info = 
578                 {
579                   (GInterfaceInitFunc) tny_header_view_init, /* interface_init */
580                   NULL,         /* interface_finalize */
581                   NULL          /* interface_data */
582                 };
583
584                 static const GInterfaceInfo modest_mail_header_view_info = 
585                 {
586                   (GInterfaceInitFunc) modest_mail_header_view_init, /* interface_init */
587                   NULL,         /* interface_finalize */
588                   NULL          /* interface_data */
589                 };
590
591                 type = g_type_register_static (GTK_TYPE_HBOX,
592                         "ModestExpanderMailHeaderView",
593                         &info, 0);
594
595                 g_type_add_interface_static (type, TNY_TYPE_HEADER_VIEW, 
596                         &tny_header_view_info);
597
598                 g_type_add_interface_static (type, MODEST_TYPE_MAIL_HEADER_VIEW, 
599                         &modest_mail_header_view_info);
600
601         }
602
603         return type;
604 }
605
606 static TnyHeaderFlags
607 modest_expander_mail_header_view_get_priority (ModestMailHeaderView *self)
608 {
609         return MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_CLASS (self)->get_priority_func (self);
610 }
611
612 static TnyHeaderFlags
613 modest_expander_mail_header_view_get_priority_default (ModestMailHeaderView *headers_view)
614 {
615         ModestExpanderMailHeaderViewPriv *priv;
616
617         g_return_val_if_fail (MODEST_IS_EXPANDER_MAIL_HEADER_VIEW (headers_view), 0);
618         priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (headers_view);
619
620         return priv->priority_flags;
621 }
622
623 static void 
624 modest_expander_mail_header_view_set_priority (ModestMailHeaderView *self, TnyHeaderFlags flags)
625 {
626         MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_CLASS (self)->set_priority_func (self, flags);
627         return;
628 }
629
630 static void
631 modest_expander_mail_header_view_set_priority_default (ModestMailHeaderView *headers_view,
632                                                        TnyHeaderFlags flags)
633 {
634         ModestExpanderMailHeaderViewPriv *priv;
635
636         g_return_if_fail (MODEST_IS_EXPANDER_MAIL_HEADER_VIEW (headers_view));
637         priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (headers_view);
638
639         priv->priority_flags = flags & TNY_HEADER_FLAG_PRIORITY_MASK ;
640
641         if (priv->priority_flags == TNY_HEADER_FLAG_NORMAL_PRIORITY) {
642                 if (priv->priority_icon != NULL) {
643                         gtk_widget_destroy (priv->priority_icon);
644                         priv->priority_icon = NULL;
645                 }
646         } else if (priv->priority_flags == TNY_HEADER_FLAG_HIGH_PRIORITY) {
647                 priv->priority_icon = gtk_image_new_from_icon_name (MODEST_HEADER_ICON_HIGH, GTK_ICON_SIZE_MENU);
648                 gtk_box_pack_start (GTK_BOX (priv->subject_box), priv->priority_icon, FALSE, FALSE, 0);
649                 gtk_widget_show (priv->priority_icon);
650         } else if (priv->priority_flags == TNY_HEADER_FLAG_LOW_PRIORITY) {
651                 priv->priority_icon = gtk_image_new_from_icon_name (MODEST_HEADER_ICON_LOW, GTK_ICON_SIZE_MENU);
652                 gtk_box_pack_start (GTK_BOX (priv->subject_box), priv->priority_icon, FALSE, FALSE, 0);
653                 gtk_widget_show (priv->priority_icon);
654         }
655 }