* modest-header-view-*
[modest] / src / widgets / modest-header-view-render.c
1 /* Copyright (c) 2006, 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
31 #include <modest-header-view.h>
32 #include <modest-header-view-priv.h>
33 #include <modest-icon-names.h>
34 #include <modest-icon-factory.h>
35 #include <modest-text-utils.h>
36 #include <glib/gi18n.h>
37
38
39 void
40 _modest_header_view_msgtype_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
41                    GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data)
42 {
43         TnyHeaderFlags flags;
44         GdkPixbuf *pixbuf = NULL;
45         
46         gtk_tree_model_get (tree_model, iter, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN,
47                             &flags, -1);
48
49         if (flags & TNY_HEADER_FLAG_DELETED)
50                 pixbuf = modest_icon_factory_get_icon (MODEST_HEADER_ICON_DELETED);
51         else if (flags & TNY_HEADER_FLAG_SEEN)
52                 pixbuf = modest_icon_factory_get_icon (MODEST_HEADER_ICON_READ);
53         else
54                 pixbuf = modest_icon_factory_get_icon (MODEST_HEADER_ICON_UNREAD);
55                 
56         g_object_set (G_OBJECT (renderer), "pixbuf", pixbuf, NULL);
57 }
58
59 void
60 _modest_header_view_attach_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
61                                       GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data)
62 {
63         TnyHeaderFlags flags;
64         GdkPixbuf *pixbuf = NULL;
65
66         gtk_tree_model_get (tree_model, iter, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN,
67                             &flags, -1);
68
69         if (flags & TNY_HEADER_FLAG_ATTACHMENTS)
70                 pixbuf = modest_icon_factory_get_small_icon (MODEST_HEADER_ICON_ATTACH);
71
72         g_object_set (G_OBJECT (renderer), "pixbuf", pixbuf, NULL);
73 }
74
75
76 void
77 _modest_header_view_header_cell_data  (GtkTreeViewColumn *column,  GtkCellRenderer *renderer,
78                   GtkTreeModel *tree_model,  GtkTreeIter *iter,  gpointer user_data)
79 {
80         TnyHeaderFlags flags;
81         
82         gtk_tree_model_get (tree_model, iter, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN,
83                             &flags, -1);
84
85         g_object_set (G_OBJECT(renderer),
86                       "weight", (flags & TNY_HEADER_FLAG_SEEN) ? 400: 800,
87                       "strikethrough",  (flags & TNY_HEADER_FLAG_DELETED) ?  TRUE:FALSE,
88                       NULL);    
89 }
90
91
92 void
93 _modest_header_view_date_cell_data  (GtkTreeViewColumn *column,  GtkCellRenderer *renderer,
94                                      GtkTreeModel *tree_model,  GtkTreeIter *iter,
95                                      gpointer user_data)
96 {
97         TnyHeaderFlags flags;
98         guint date, date_col;
99         const gchar *date_str;
100         gboolean received = GPOINTER_TO_INT(user_data);
101
102         if (received)
103                 date_col = TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_COLUMN;
104         else
105                 date_col = TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_COLUMN;
106         
107         gtk_tree_model_get (tree_model, iter,
108                             TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags,
109                             date_col, &date,
110                             -1);
111         
112         date_str = modest_text_utils_get_display_date (date);
113         
114         g_object_set (G_OBJECT(renderer),
115                       "weight", (flags & TNY_HEADER_FLAG_SEEN) ? 400: 800,
116                       "style",  (flags & TNY_HEADER_FLAG_DELETED) ?
117                                  PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL,
118                       "text",    date_str,       
119                       NULL);
120 }
121
122
123 void
124 _modest_header_view_sender_receiver_cell_data  (GtkTreeViewColumn *column,  GtkCellRenderer *renderer,
125                             GtkTreeModel *tree_model,  GtkTreeIter *iter,  gboolean is_sender)
126 {
127         TnyHeaderFlags flags;
128         gchar *address;
129         gint sender_receiver_col;
130
131         if (is_sender)
132                 sender_receiver_col = TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN;
133         else
134                 sender_receiver_col = TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN;
135                 
136         gtk_tree_model_get (tree_model, iter,
137                             sender_receiver_col,  &address,
138                             TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags,
139                             -1);
140         
141         g_object_set (G_OBJECT(renderer),
142                       "text",
143                       modest_text_utils_get_display_address (address),
144                       "weight",
145                       (flags & TNY_HEADER_FLAG_SEEN) ? 400 : 800,
146                       "style",
147                       (flags & TNY_HEADER_FLAG_DELETED)?PANGO_STYLE_ITALIC:PANGO_STYLE_NORMAL,
148                       NULL);
149
150         g_free (address);       
151 }
152 /*
153  * this for both incoming and outgoing mail, depending on the the user_data
154  * parameter. in the incoming case, show 'From' and 'Received date', in the
155  * outgoing case, show 'To' and 'Sent date'
156  */
157 void
158 _modest_header_view_compact_header_cell_data  (GtkTreeViewColumn *column,  GtkCellRenderer *renderer,
159                                                GtkTreeModel *tree_model,  GtkTreeIter *iter,  gpointer user_data)
160 {
161         GObject *rendobj;
162         TnyHeaderFlags flags;
163         gchar *address, *subject, *header;
164         const gchar *date_str;
165         time_t date;
166         gboolean is_incoming;
167
168         is_incoming = GPOINTER_TO_INT(user_data); /* GPOINTER_TO_BOOLEAN is not available
169                                                    * in older versions of glib...*/
170
171         if (is_incoming)
172                 gtk_tree_model_get (tree_model, iter,
173                                     TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags,
174                                     TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN,  &address,
175                                     TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, &subject,
176                                     TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN, &date,   
177                                     -1);
178         else
179                 gtk_tree_model_get (tree_model, iter,
180                                     TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags,
181                                     TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN,  &address,
182                                     TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, &subject,
183                                     TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &date,   
184                                     -1);
185         
186         rendobj = G_OBJECT(renderer);           
187
188         date_str = modest_text_utils_get_display_date (date);
189         header = g_strdup_printf ("%s %s\n%s",
190                                   modest_text_utils_get_display_address (address),
191                                   date_str,
192                                   subject);
193         g_free (address);
194         g_free (subject);
195         
196         g_object_set (G_OBJECT(renderer),
197                       "text",  header,
198                       "weight", (flags & TNY_HEADER_FLAG_SEEN) ? 400: 800,
199                       "style",  (flags & TNY_HEADER_FLAG_DELETED) ?
200                                  PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL,
201                       NULL);    
202         g_free (header);
203 }
204
205
206 void
207 _modest_header_view_size_cell_data  (GtkTreeViewColumn *column,  GtkCellRenderer *renderer,
208                                      GtkTreeModel *tree_model,  GtkTreeIter *iter,
209                                      gpointer user_data)
210 {
211         TnyHeaderFlags flags;
212        guint size;
213        gchar *size_str;
214        const gchar* unit;
215
216        gtk_tree_model_get (tree_model, iter,
217                            TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags,
218                            TNY_GTK_HEADER_LIST_MODEL_MESSAGE_SIZE_COLUMN, &size,
219                            -1);
220        
221        if (size < 1024*1024) {
222                unit = _("Kb");
223                size /= 1024;
224        } else if (size < 1024*1024*1024) {
225                unit = _("Mb");
226                size /= (1024*1024);
227        } else {
228                unit = _("Gb");
229                size /= (1024*1024*1024);
230        }
231
232        size_str = g_strdup_printf ("%d %s", size, unit);
233
234        g_object_set (G_OBJECT(renderer),
235                      "weight", (flags & TNY_HEADER_FLAG_SEEN) ? 400: 800,
236                      "style",  (flags & TNY_HEADER_FLAG_DELETED) ?
237                      PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL,
238                      "text",    size_str,       
239                       NULL);
240        g_free (size_str);
241
242  }