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