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