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