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