851377c0932ad009286e780ba2c7969c4b8d1ef6
[modest] / src / widgets / modest-compact-mail-header-view.c
1 /* Copyright (c) 2008, 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-defs.h>
36 #include <modest-text-utils.h>
37 #include <modest-compact-mail-header-view.h>
38 #include <modest-tny-folder.h>
39 #include <modest-ui-constants.h>
40 #include <modest-icon-names.h>
41 #include <modest-datetime-formatter.h>
42 #ifdef MODEST_TOOLKIT_HILDON2
43 #include <hildon/hildon-gtk.h>
44 #endif
45
46 static GObjectClass *parent_class = NULL;
47
48 typedef struct _ModestCompactMailHeaderViewPriv ModestCompactMailHeaderViewPriv;
49
50 struct _ModestCompactMailHeaderViewPriv
51 {
52         GtkWidget    *headers_vbox;
53         GtkWidget    *subject_box;
54
55         GtkWidget    *fromto_label;
56         GtkWidget    *fromto_contents;
57         GtkWidget    *priority_icon;
58         GtkWidget    *details_label;
59         GtkWidget    *date_label;
60         GtkWidget    *subject_label;
61
62         GSList       *custom_labels;
63
64         gboolean     is_outgoing;
65         gboolean     is_draft;
66         
67         TnyHeader    *header;
68         TnyHeaderFlags priority_flags;
69
70         time_t       date_to_show;
71         ModestDatetimeFormatter *datetime_formatter;
72 };
73
74 #define MODEST_COMPACT_MAIL_HEADER_VIEW_GET_PRIVATE(o)  \
75         (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEST_TYPE_COMPACT_MAIL_HEADER_VIEW, ModestCompactMailHeaderViewPriv))
76
77 /* GObject */
78 static void modest_compact_mail_header_view_class_init (ModestCompactMailHeaderViewClass *klass);
79 static void modest_compact_mail_header_view_instance_init (GTypeInstance *instance, gpointer g_class);
80 static void modest_compact_mail_header_view_finalize (GObject *object);
81
82 /* TnyHeaderView interface */
83 static void tny_header_view_init (gpointer g, gpointer iface_data);
84 static void modest_compact_mail_header_view_set_header (TnyHeaderView *self, TnyHeader *header);
85 static void modest_compact_mail_header_view_update_is_outgoing (TnyHeaderView *self);
86 static void modest_compact_mail_header_view_set_header_default (TnyHeaderView *self, TnyHeader *header);
87 static void modest_compact_mail_header_view_clear (TnyHeaderView *self);
88 static void modest_compact_mail_header_view_clear_default (TnyHeaderView *self);
89
90 /* ModestMailHeaderView interface */
91 static void modest_mail_header_view_init (gpointer g, gpointer iface_data);
92 static TnyHeaderFlags modest_compact_mail_header_view_get_priority (ModestMailHeaderView *self);
93 static TnyHeaderFlags modest_compact_mail_header_view_get_priority_default (ModestMailHeaderView *headers_view);
94 static void modest_compact_mail_header_view_set_priority (ModestMailHeaderView *self, TnyHeaderFlags flags);
95 static void modest_compact_mail_header_view_set_priority_default (ModestMailHeaderView *headers_view,
96                                                                    TnyHeaderFlags flags);
97 static const GtkWidget *modest_compact_mail_header_view_add_custom_header (ModestMailHeaderView *self,
98                                                                             const gchar *label,
99                                                                             GtkWidget *custom_widget,
100                                                                             gboolean with_expander,
101                                                                             gboolean start);
102 static const GtkWidget *modest_compact_mail_header_view_add_custom_header_default (ModestMailHeaderView *self,
103                                                                                     const gchar *label,
104                                                                                     GtkWidget *custom_widget,
105                                                                                     gboolean with_expander,
106                                                                                     gboolean start);
107
108 /* internal */
109 static void on_notify_style (GObject *obj, GParamSpec *spec, gpointer userdata);
110 static void on_details_button_clicked  (GtkButton *button, gpointer userdata);
111 static void update_style (ModestCompactMailHeaderView *self);
112 static void set_date_time (ModestCompactMailHeaderView *compact_mail_header);
113 static void fill_address (ModestCompactMailHeaderView *self);
114
115 static void
116 set_date_time (ModestCompactMailHeaderView *compact_mail_header)
117 {
118         const guint BUF_SIZE = 64; 
119         const gchar *date_str;
120         gchar date_buf[BUF_SIZE];
121         GString *buffer = g_string_new ("");
122
123         ModestCompactMailHeaderViewPriv *priv = MODEST_COMPACT_MAIL_HEADER_VIEW_GET_PRIVATE (compact_mail_header);
124
125         modest_text_utils_strftime (date_buf, BUF_SIZE, _HL("wdgt_va_week"), priv->date_to_show);
126         buffer = g_string_append (buffer, date_buf);
127         buffer = g_string_append_c (buffer, ' ');
128         buffer = g_string_append_unichar (buffer, 0x2015);
129         buffer = g_string_append_c (buffer, ' ');
130         date_str = modest_datetime_formatter_format_time (priv->datetime_formatter, priv->date_to_show);
131         buffer = g_string_append (buffer, date_str);
132         buffer = g_string_append (buffer, "\n");
133         modest_text_utils_strftime (date_buf, BUF_SIZE, _HL("wdgt_va_date_long"), priv->date_to_show);
134         buffer = g_string_append (buffer, date_buf);
135
136         gtk_label_set_text (GTK_LABEL (priv->date_label), buffer->str);
137         g_string_free (buffer, TRUE);
138
139 }
140
141 /* static void */
142 /* activate_recpt (GtkWidget *recpt_view, const gchar *address, gpointer user_data) */
143 /* { */
144 /*      ModestCompactMailHeaderView * view = MODEST_COMPACT_MAIL_HEADER_VIEW (user_data); */
145
146 /*      g_signal_emit (G_OBJECT (view), signals[RECPT_ACTIVATED_SIGNAL], 0, address); */
147 /* } */
148
149
150 static void 
151 modest_compact_mail_header_view_set_header (TnyHeaderView *self, TnyHeader *header)
152 {
153         MODEST_COMPACT_MAIL_HEADER_VIEW_GET_CLASS (self)->set_header_func (self, header);
154         return;
155 }
156
157 static void
158 modest_compact_mail_header_view_update_is_outgoing (TnyHeaderView *self)
159 {
160         ModestCompactMailHeaderViewPriv *priv = MODEST_COMPACT_MAIL_HEADER_VIEW_GET_PRIVATE (self);
161         TnyFolder *folder = NULL;
162      
163         priv->is_outgoing = FALSE;
164
165         if (priv->header == NULL)
166                 return;
167         
168         folder = tny_header_get_folder (priv->header);
169
170         if (folder) {
171                 TnyFolderType folder_type = tny_folder_get_folder_type (folder);
172
173                 switch (folder_type) {
174                 case TNY_FOLDER_TYPE_DRAFTS:
175                 case TNY_FOLDER_TYPE_OUTBOX:
176                 case TNY_FOLDER_TYPE_SENT:
177                         priv->is_outgoing = TRUE;
178                         break;
179                 default:
180                         priv->is_outgoing = FALSE;
181                 }
182                 priv->is_draft = (folder_type == TNY_FOLDER_TYPE_DRAFTS);
183
184                 g_object_unref (folder);
185         }
186 }
187
188 static void 
189 modest_compact_mail_header_view_set_header_default (TnyHeaderView *self, TnyHeader *header)
190 {
191         ModestCompactMailHeaderViewPriv *priv = MODEST_COMPACT_MAIL_HEADER_VIEW_GET_PRIVATE (self);
192
193         if (header)
194                 g_assert (TNY_IS_HEADER (header));
195
196         if (G_LIKELY (priv->header))
197                 g_object_unref (G_OBJECT (priv->header));
198         priv->header = NULL;
199
200         if (header && G_IS_OBJECT (header))
201         {
202                 gchar *subject;
203
204                 g_object_ref (G_OBJECT (header)); 
205                 priv->header = header;
206
207                 modest_compact_mail_header_view_update_is_outgoing (self);
208
209                 subject = tny_header_dup_subject (header);
210
211                 if (subject && (subject[0] != '\0'))
212                         gtk_label_set_text (GTK_LABEL (priv->subject_label), subject);
213                 else
214                         gtk_label_set_text (GTK_LABEL (priv->subject_label), _("mail_va_no_subject"));
215
216                 if (priv->is_outgoing && priv->is_draft) {
217                         priv->date_to_show = tny_header_get_date_sent (header);
218                 } else {
219                         priv->date_to_show = tny_header_get_date_received (header);
220                 }
221                 set_date_time (MODEST_COMPACT_MAIL_HEADER_VIEW (self));
222
223                 fill_address (MODEST_COMPACT_MAIL_HEADER_VIEW (self));
224
225                 g_free (subject);
226         }
227
228         modest_mail_header_view_set_priority (MODEST_MAIL_HEADER_VIEW (self), 0);
229         update_style (MODEST_COMPACT_MAIL_HEADER_VIEW (self));
230         gtk_widget_show_all (GTK_WIDGET (self));
231
232         return;
233 }
234
235 static void 
236 modest_compact_mail_header_view_clear (TnyHeaderView *self)
237 {
238         MODEST_COMPACT_MAIL_HEADER_VIEW_GET_CLASS (self)->clear_func (self);
239         return;
240 }
241
242 static void 
243 modest_compact_mail_header_view_clear_default (TnyHeaderView *self)
244 {
245         ModestCompactMailHeaderViewPriv *priv = MODEST_COMPACT_MAIL_HEADER_VIEW_GET_PRIVATE (self);
246
247         if (G_LIKELY (priv->header))
248                 g_object_unref (G_OBJECT (priv->header));
249         priv->header = NULL;
250
251         gtk_label_set_text (GTK_LABEL (priv->fromto_label), "");
252         gtk_label_set_text (GTK_LABEL (priv->fromto_contents), "");
253
254         gtk_widget_hide (GTK_WIDGET(self));
255
256         return;
257 }
258
259 static const GtkWidget *
260 modest_compact_mail_header_view_add_custom_header (ModestMailHeaderView *self,
261                                                     const gchar *label,
262                                                     GtkWidget *custom_widget,
263                                                     gboolean with_expander,
264                                                     gboolean start)
265 {
266         return MODEST_COMPACT_MAIL_HEADER_VIEW_GET_CLASS (self)->add_custom_header_func (self, label,
267                                                                                          custom_widget, with_expander,
268                                                                                          start);
269 }
270
271 static const GtkWidget *
272 modest_compact_mail_header_view_add_custom_header_default (ModestMailHeaderView *header_view,
273                                                            const gchar *label,
274                                                            GtkWidget *custom_widget,
275                                                            gboolean with_expander,
276                                                            gboolean start)
277 {
278         ModestCompactMailHeaderViewPriv *priv;
279         g_return_val_if_fail (MODEST_IS_COMPACT_MAIL_HEADER_VIEW (header_view), NULL);
280         GtkWidget *hbox;
281         GtkWidget *label_field;
282
283         priv = MODEST_COMPACT_MAIL_HEADER_VIEW_GET_PRIVATE (header_view);
284         hbox = gtk_hbox_new (FALSE, 12);
285         label_field = gtk_label_new (NULL);
286         gtk_label_set_text (GTK_LABEL (label_field), label);
287         priv->custom_labels = g_slist_prepend (priv->custom_labels, (gpointer) label_field);
288         gtk_misc_set_alignment (GTK_MISC (label_field), 1.0, 0.0);
289         gtk_box_pack_start (GTK_BOX (hbox), label_field, FALSE, FALSE, 0);
290         gtk_box_pack_start (GTK_BOX (hbox), custom_widget, TRUE, TRUE, 0);
291
292         if (start)
293                 gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
294         else
295                 gtk_box_pack_end (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
296
297         update_style (MODEST_COMPACT_MAIL_HEADER_VIEW (header_view));
298         return hbox;
299 }
300
301 /**
302  * modest_compact_mail_header_view_new:
303  *
304  * Return value: a new #ModestHeaderView instance implemented for Gtk+
305  **/
306 TnyHeaderView*
307 modest_compact_mail_header_view_new ()
308 {
309         ModestCompactMailHeaderViewPriv *priv;
310         ModestCompactMailHeaderView *self = g_object_new (MODEST_TYPE_COMPACT_MAIL_HEADER_VIEW, NULL);
311
312         priv = MODEST_COMPACT_MAIL_HEADER_VIEW_GET_PRIVATE (self);
313         return TNY_HEADER_VIEW (self);
314 }
315
316 static void
317 datetime_format_changed (ModestDatetimeFormatter *formatter,
318                          ModestCompactMailHeaderView *self)
319 {
320         set_date_time (self);
321 }
322
323 static void
324 modest_compact_mail_header_view_instance_init (GTypeInstance *instance, gpointer g_class)
325 {
326         ModestCompactMailHeaderView *self = (ModestCompactMailHeaderView *)instance;
327         ModestCompactMailHeaderViewPriv *priv = MODEST_COMPACT_MAIL_HEADER_VIEW_GET_PRIVATE (self);
328         GtkWidget *first_hbox, *second_hbox, *vbox, *main_vbox;
329         GtkWidget *details_button;
330         PangoAttrList *attr_list;
331         GtkWidget *main_align;
332
333         priv->header = NULL;
334         priv->custom_labels = NULL;
335
336         main_vbox = gtk_vbox_new (FALSE, 0);
337         vbox = gtk_vbox_new (FALSE, 0);
338         first_hbox = gtk_hbox_new (FALSE, MODEST_MARGIN_HALF);
339
340         priv->subject_box = gtk_hbox_new (FALSE, MODEST_MARGIN_HALF);
341
342         /* We set here the style for widgets using standard text color. For
343          * widgets with secondary text color, we set them in update_style,
344          * as we want to track the style changes and update the color properly */
345
346         priv->subject_label = gtk_label_new (NULL);
347         gtk_misc_set_alignment (GTK_MISC (priv->subject_label), 0.0, 1.0);
348         gtk_label_set_ellipsize (GTK_LABEL (priv->subject_label), PANGO_ELLIPSIZE_END);
349         attr_list = pango_attr_list_new ();
350         pango_attr_list_insert (attr_list, pango_attr_scale_new (PANGO_SCALE_LARGE));
351         gtk_label_set_attributes (GTK_LABEL (priv->subject_label), attr_list);
352         pango_attr_list_unref (attr_list);
353
354         details_button = gtk_button_new ();
355         priv->details_label = gtk_label_new (_("mcen_ti_message_properties"));
356         gtk_misc_set_alignment (GTK_MISC (priv->details_label), 1.0, 0.5);
357         gtk_container_add (GTK_CONTAINER (details_button), priv->details_label);
358         gtk_button_set_relief (GTK_BUTTON (details_button), GTK_RELIEF_NONE);
359
360         gtk_box_pack_end (GTK_BOX (priv->subject_box), priv->subject_label, TRUE, TRUE, 0);
361         gtk_box_pack_start (GTK_BOX (first_hbox), priv->subject_box, TRUE, TRUE, 0);
362         gtk_box_pack_start (GTK_BOX (first_hbox), details_button, FALSE, FALSE, 0);
363
364         second_hbox = gtk_hbox_new (FALSE, MODEST_MARGIN_DOUBLE);
365
366         priv->fromto_label = gtk_label_new (NULL);
367         gtk_misc_set_alignment (GTK_MISC (priv->fromto_label), 0.0, 1.0);
368
369         priv->fromto_contents = gtk_label_new (NULL);
370         gtk_misc_set_alignment (GTK_MISC (priv->fromto_contents), 0.0, 1.0);
371         gtk_label_set_ellipsize (GTK_LABEL (priv->fromto_contents), PANGO_ELLIPSIZE_END);
372
373         priv->date_label = gtk_label_new (NULL);
374         gtk_label_set_justify (GTK_LABEL (priv->date_label), GTK_JUSTIFY_RIGHT);
375         gtk_misc_set_alignment (GTK_MISC (priv->date_label), 1.0, 1.0);
376         gtk_misc_set_padding (GTK_MISC (priv->date_label), MODEST_MARGIN_DOUBLE, 0);
377
378         gtk_box_pack_start (GTK_BOX (second_hbox), priv->fromto_label, FALSE, FALSE, 0);
379         gtk_box_pack_start (GTK_BOX (second_hbox), priv->fromto_contents, TRUE, TRUE, 0);
380         gtk_box_pack_start (GTK_BOX (second_hbox), priv->date_label, FALSE, FALSE, 0);
381
382         gtk_box_pack_start (GTK_BOX (vbox), first_hbox, FALSE, FALSE, 0);
383         gtk_box_pack_start (GTK_BOX (vbox), second_hbox, FALSE, FALSE, 0);
384
385         update_style (self);
386
387         g_signal_connect (G_OBJECT (self), "notify::style", G_CALLBACK (on_notify_style), (gpointer) self);
388
389         g_signal_connect (G_OBJECT (details_button), "clicked", G_CALLBACK (on_details_button_clicked), instance);
390
391         priv->datetime_formatter = modest_datetime_formatter_new ();
392         g_signal_connect (G_OBJECT (priv->datetime_formatter), "format-changed", 
393                           G_CALLBACK (datetime_format_changed), (gpointer) self);
394
395         priv->headers_vbox = gtk_vbox_new (FALSE, 0);
396         gtk_container_set_focus_chain (GTK_CONTAINER (priv->headers_vbox), NULL);
397         g_object_ref (priv->headers_vbox);
398
399         gtk_box_pack_start (GTK_BOX (main_vbox), vbox, FALSE, FALSE, 0);
400         gtk_box_pack_start (GTK_BOX (main_vbox), priv->headers_vbox, FALSE, FALSE, 0);
401
402         main_align = gtk_alignment_new (0.0, 0.0, 1.0, 1.0);
403         gtk_alignment_set_padding (GTK_ALIGNMENT (main_align), 0, 0, MODEST_MARGIN_DOUBLE, 0);
404         gtk_container_add (GTK_CONTAINER (main_align), main_vbox);
405         gtk_box_pack_start (GTK_BOX (self), main_align, TRUE, TRUE, 0);
406
407         gtk_widget_show_all (main_align);
408
409         priv->is_outgoing = FALSE;
410         priv->is_draft = FALSE;
411
412         return;
413 }
414
415 static void
416 modest_compact_mail_header_view_finalize (GObject *object)
417 {
418         ModestCompactMailHeaderView *self = (ModestCompactMailHeaderView *)object;      
419         ModestCompactMailHeaderViewPriv *priv = MODEST_COMPACT_MAIL_HEADER_VIEW_GET_PRIVATE (self);
420
421         if (priv->datetime_formatter) {
422                 g_object_unref (priv->datetime_formatter);
423                 priv->datetime_formatter = NULL;
424         }
425
426         if (priv->custom_labels) {
427                 g_slist_free (priv->custom_labels);
428                 priv->custom_labels = NULL;
429         }
430
431         if (G_LIKELY (priv->header))
432                 g_object_unref (G_OBJECT (priv->header));
433         priv->header = NULL;
434
435         if (G_LIKELY (priv->headers_vbox))
436                 g_object_unref (G_OBJECT (priv->headers_vbox));
437
438         priv->headers_vbox = NULL;
439
440         (*parent_class->finalize) (object);
441
442         return;
443 }
444
445 static void
446 tny_header_view_init (gpointer g, gpointer iface_data)
447 {
448         TnyHeaderViewIface *klass = (TnyHeaderViewIface *)g;
449
450         klass->set_header = modest_compact_mail_header_view_set_header;
451         klass->clear = modest_compact_mail_header_view_clear;
452
453         return;
454 }
455
456 static void
457 modest_mail_header_view_init (gpointer g, gpointer iface_data)
458 {
459         ModestMailHeaderViewIface *klass = (ModestMailHeaderViewIface *)g;
460
461         klass->get_priority = modest_compact_mail_header_view_get_priority;
462         klass->set_priority = modest_compact_mail_header_view_set_priority;
463         klass->add_custom_header = modest_compact_mail_header_view_add_custom_header;
464
465         return;
466 }
467
468 static void 
469 modest_compact_mail_header_view_class_init (ModestCompactMailHeaderViewClass *klass)
470 {
471         GObjectClass *object_class;
472
473         parent_class = g_type_class_peek_parent (klass);
474         object_class = (GObjectClass*) klass;
475
476         klass->set_header_func = modest_compact_mail_header_view_set_header_default;
477         klass->clear_func = modest_compact_mail_header_view_clear_default;
478         klass->set_priority_func = modest_compact_mail_header_view_set_priority_default;
479         klass->get_priority_func = modest_compact_mail_header_view_get_priority_default;
480         klass->add_custom_header_func = modest_compact_mail_header_view_add_custom_header_default;
481         object_class->finalize = modest_compact_mail_header_view_finalize;
482
483         g_type_class_add_private (object_class, sizeof (ModestCompactMailHeaderViewPriv));
484
485         return;
486 }
487
488 GType 
489 modest_compact_mail_header_view_get_type (void)
490 {
491         static GType type = 0;
492
493         if (G_UNLIKELY(type == 0))
494         {
495                 static const GTypeInfo info = 
496                 {
497                   sizeof (ModestCompactMailHeaderViewClass),
498                   NULL,   /* base_init */
499                   NULL,   /* base_finalize */
500                   (GClassInitFunc) modest_compact_mail_header_view_class_init,   /* class_init */
501                   NULL,   /* class_finalize */
502                   NULL,   /* class_data */
503                   sizeof (ModestCompactMailHeaderView),
504                   0,      /* n_preallocs */
505                   modest_compact_mail_header_view_instance_init    /* instance_init */
506                 };
507
508                 static const GInterfaceInfo tny_header_view_info = 
509                 {
510                   (GInterfaceInitFunc) tny_header_view_init, /* interface_init */
511                   NULL,         /* interface_finalize */
512                   NULL          /* interface_data */
513                 };
514
515                 static const GInterfaceInfo modest_mail_header_view_info = 
516                 {
517                   (GInterfaceInitFunc) modest_mail_header_view_init, /* interface_init */
518                   NULL,         /* interface_finalize */
519                   NULL          /* interface_data */
520                 };
521
522                 type = g_type_register_static (GTK_TYPE_HBOX,
523                         "ModestCompactMailHeaderView",
524                         &info, 0);
525
526                 g_type_add_interface_static (type, TNY_TYPE_HEADER_VIEW, 
527                         &tny_header_view_info);
528                 g_type_add_interface_static (type, MODEST_TYPE_MAIL_HEADER_VIEW, 
529                         &modest_mail_header_view_info);
530
531         }
532
533         return type;
534 }
535
536 static TnyHeaderFlags
537 modest_compact_mail_header_view_get_priority (ModestMailHeaderView *self)
538 {
539         return MODEST_COMPACT_MAIL_HEADER_VIEW_GET_CLASS (self)->get_priority_func (self);
540 }
541
542 static TnyHeaderFlags
543 modest_compact_mail_header_view_get_priority_default (ModestMailHeaderView *headers_view)
544 {
545         ModestCompactMailHeaderViewPriv *priv;
546
547         g_return_val_if_fail (MODEST_IS_COMPACT_MAIL_HEADER_VIEW (headers_view), 0);
548         priv = MODEST_COMPACT_MAIL_HEADER_VIEW_GET_PRIVATE (headers_view);
549
550         return priv->priority_flags;
551 }
552
553 static void 
554 modest_compact_mail_header_view_set_priority (ModestMailHeaderView *self, TnyHeaderFlags flags)
555 {
556         MODEST_COMPACT_MAIL_HEADER_VIEW_GET_CLASS (self)->set_priority_func (self, flags);
557         return;
558 }
559
560 static void
561 modest_compact_mail_header_view_set_priority_default (ModestMailHeaderView *headers_view,
562                                                       TnyHeaderFlags flags)
563 {
564         ModestCompactMailHeaderViewPriv *priv;
565
566         g_return_if_fail (MODEST_IS_COMPACT_MAIL_HEADER_VIEW (headers_view));
567         priv = MODEST_COMPACT_MAIL_HEADER_VIEW_GET_PRIVATE (headers_view);
568
569         priv->priority_flags = flags & TNY_HEADER_FLAG_PRIORITY_MASK ;
570
571         if (priv->priority_flags == TNY_HEADER_FLAG_NORMAL_PRIORITY) {
572                 if (priv->priority_icon != NULL) {
573                         gtk_widget_destroy (priv->priority_icon);
574                         priv->priority_icon = NULL;
575                 }
576         } else if (priv->priority_flags == TNY_HEADER_FLAG_HIGH_PRIORITY) {
577                 priv->priority_icon = gtk_image_new_from_icon_name (MODEST_HEADER_ICON_HIGH, GTK_ICON_SIZE_MENU);
578                 gtk_box_pack_start (GTK_BOX (priv->subject_box), priv->priority_icon, FALSE, FALSE, 0);
579                 gtk_widget_show (priv->priority_icon);
580         } else if (priv->priority_flags == TNY_HEADER_FLAG_LOW_PRIORITY) {
581                 priv->priority_icon = gtk_image_new_from_icon_name (MODEST_HEADER_ICON_LOW, GTK_ICON_SIZE_MENU);
582                 gtk_box_pack_start (GTK_BOX (priv->subject_box), priv->priority_icon, FALSE, FALSE, 0);
583                 gtk_widget_show (priv->priority_icon);
584         }
585 }
586
587 static void 
588 on_notify_style (GObject *obj, GParamSpec *spec, gpointer userdata)
589 {
590         if (strcmp ("style", spec->name) == 0) {
591                 update_style (MODEST_COMPACT_MAIL_HEADER_VIEW (obj));
592                 gtk_widget_queue_draw (GTK_WIDGET (obj));
593         } 
594 }
595
596 /* This method updates the color (and other style settings) of widgets using secondary text color,
597  * tracking the gtk style */
598 static void
599 update_style (ModestCompactMailHeaderView *self)
600 {
601         ModestCompactMailHeaderViewPriv *priv;
602         GdkColor style_color;
603         PangoColor color;
604         PangoAttrList *attr_list;
605         GSList *node;
606
607         g_return_if_fail (MODEST_IS_COMPACT_MAIL_HEADER_VIEW (self));
608         priv = MODEST_COMPACT_MAIL_HEADER_VIEW_GET_PRIVATE (self);
609
610         if (gtk_style_lookup_color (GTK_WIDGET (self)->style, "SecondaryTextColor", &style_color)) {
611                 color.red = style_color.red;
612                 color.green = style_color.green;
613                 color.blue = style_color.blue;
614         } else {
615                 pango_color_parse (&color, "grey");
616         }
617
618         /* style of from:/to: label */
619         attr_list = pango_attr_list_new ();
620         pango_attr_list_insert (attr_list, pango_attr_foreground_new (color.red, color.green, color.blue));
621         gtk_label_set_attributes (GTK_LABEL (priv->fromto_label), attr_list);
622         pango_attr_list_unref (attr_list);
623
624         /* style of details label in details button */
625         attr_list = pango_attr_list_new ();
626         pango_attr_list_insert (attr_list, pango_attr_foreground_new (color.red, color.green, color.blue));
627         pango_attr_list_insert (attr_list, pango_attr_scale_new (PANGO_SCALE_SMALL));
628         pango_attr_list_insert (attr_list, pango_attr_underline_new (PANGO_UNDERLINE_SINGLE));
629         gtk_label_set_attributes (GTK_LABEL (priv->details_label), attr_list);
630         pango_attr_list_unref (attr_list);
631
632         /* style of date time label */
633         attr_list = pango_attr_list_new ();
634         pango_attr_list_insert (attr_list, pango_attr_foreground_new (color.red, color.green, color.blue));
635         pango_attr_list_insert (attr_list, pango_attr_scale_new (PANGO_SCALE_SMALL));
636         gtk_label_set_attributes (GTK_LABEL (priv->date_label), attr_list);
637         pango_attr_list_unref (attr_list);
638
639         /* set style of custom headers */
640         attr_list = pango_attr_list_new ();
641         pango_attr_list_insert (attr_list, pango_attr_foreground_new (color.red, color.green, color.blue));
642         for (node = priv->custom_labels; node != NULL; node = g_slist_next (node)) {
643                 gtk_label_set_attributes (GTK_LABEL (node->data), attr_list);
644         }
645         pango_attr_list_unref (attr_list);
646
647 }
648
649 static void
650 fill_address (ModestCompactMailHeaderView *self)
651 {
652         ModestCompactMailHeaderViewPriv *priv;
653         gchar *recipients;
654         const gchar *label;
655         GSList *recipient_list;
656         gchar *first_address;
657         
658         g_return_if_fail (MODEST_IS_COMPACT_MAIL_HEADER_VIEW (self));
659         priv = MODEST_COMPACT_MAIL_HEADER_VIEW_GET_PRIVATE (self);
660
661         if (priv->is_outgoing) {
662                 label = _("mail_va_to");
663                 recipients = tny_header_dup_to (TNY_HEADER (priv->header));
664         } else {
665                 label = _("mail_va_from");
666                 recipients = tny_header_dup_from (TNY_HEADER (priv->header));
667         }
668
669         recipient_list = modest_text_utils_split_addresses_list (recipients);
670         if (recipient_list == NULL) {
671                 first_address = NULL;
672         } else {
673                 gchar *first_recipient;
674
675                 first_recipient = (gchar *) recipient_list->data;
676                 first_address = first_recipient?g_strdup (first_recipient):NULL;
677         }
678         g_slist_foreach (recipient_list, (GFunc) g_free, NULL);
679         g_slist_free (recipient_list);
680
681         gtk_label_set_text (GTK_LABEL (priv->fromto_label), label);
682         if (recipients) {
683                 modest_text_utils_get_display_address (first_address);
684                 gtk_label_set_text (GTK_LABEL (priv->fromto_contents), first_address);
685                 g_free (recipients);
686                 g_free (first_address);
687         }
688
689 }
690
691 static void 
692 on_details_button_clicked (GtkButton *button,
693                            gpointer userdata)
694 {
695         ModestCompactMailHeaderView *self = (ModestCompactMailHeaderView *) userdata;
696
697         g_return_if_fail (MODEST_IS_COMPACT_MAIL_HEADER_VIEW (self));
698
699         g_signal_emit_by_name (G_OBJECT (self), "show-details");
700 }