root/trunk/libtinymailui-gtk/tny-gtk-header-view.c

Revision 3742 (checked in by pvanhoof, 3 months ago)

2008-08-22 Philip Van Hoof <pvanhoof@gnome.org>

Patch by agx@sigxcpu.org

Line 
1 /* libtinymailui-gtk - The Tiny Mail UI library for Gtk+
2  * Copyright (C) 2006-2007 Philip Van Hoof <pvanhoof@gnome.org>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with self library; if not, write to the
16  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 /**
21  * TnyGtkHeaderView:
22  *
23  * A simple view for a #TnyHeader
24  *
25  * free-function: g_object_unref
26  **/
27
28 #include <config.h>
29
30 #include <glib/gi18n-lib.h>
31
32 #include <string.h>
33 #include <gtk/gtk.h>
34 #include <tny-gtk-header-view.h>
35
36 static GObjectClass *parent_class = NULL;
37
38 typedef struct _TnyGtkHeaderViewPriv TnyGtkHeaderViewPriv;
39
40 struct _TnyGtkHeaderViewPriv
41 {
42         TnyHeader *header;
43         GtkWidget *from_label;
44         GtkWidget *to_label;
45         GtkWidget *subject_label;
46         GtkWidget *date_label;
47 };
48
49 #define TNY_GTK_HEADER_VIEW_GET_PRIVATE(o)      \
50         (G_TYPE_INSTANCE_GET_PRIVATE ((o), TNY_TYPE_GTK_HEADER_VIEW, TnyGtkHeaderViewPriv))
51
52
53 static gchar *
54 _get_readable_date (time_t file_time_raw)
55 {
56         struct tm file_time;
57         gchar readable_date[64];
58         gsize readable_date_size;
59
60         gmtime_r (&file_time_raw, &file_time);
61
62         readable_date_size = strftime (readable_date, 63, _("%Y-%m-%d, %-I:%M %p"), &file_time);
63        
64         return g_strdup (readable_date);
65 }
66
67 static void
68 tny_gtk_header_view_set_header (TnyHeaderView *self, TnyHeader *header)
69 {
70         TNY_GTK_HEADER_VIEW_GET_CLASS (self)->set_header(self, header);
71         return;
72 }
73
74 static void
75 tny_gtk_header_view_set_header_default (TnyHeaderView *self, TnyHeader *header)
76 {
77         TnyGtkHeaderViewPriv *priv = TNY_GTK_HEADER_VIEW_GET_PRIVATE (self);
78
79         if (header)
80                 g_assert (TNY_IS_HEADER (header));
81
82         if (G_LIKELY (priv->header))
83                 g_object_unref (G_OBJECT (priv->header));
84         priv->header = NULL;
85
86         if (header && G_IS_OBJECT (header))
87         {
88                 gchar *str;
89                 gchar *to, *from, *subject;
90                 g_object_ref (G_OBJECT (header));
91                 priv->header = header;
92
93                 to = tny_header_dup_to (header);
94                 from = tny_header_dup_from (header);
95                 subject = tny_header_dup_subject (header);
96
97                 if (to) {
98                         gtk_label_set_text (GTK_LABEL (priv->to_label), to);
99                         g_free (to);
100                 } else {
101                         gtk_label_set_text (GTK_LABEL (priv->to_label), "");
102                 }
103
104                 if (from) {
105                         gtk_label_set_text (GTK_LABEL (priv->from_label), from);
106                         g_free (from);
107                 } else {
108                         gtk_label_set_text (GTK_LABEL (priv->from_label), "");
109                 }
110
111                 if (subject) {
112                         gtk_label_set_text (GTK_LABEL (priv->subject_label), subject);
113                         g_free (subject);
114                 } else {
115                         gtk_label_set_text (GTK_LABEL (priv->subject_label), "");
116                 }
117
118                 str = _get_readable_date (tny_header_get_date_sent (header));
119                 gtk_label_set_text (GTK_LABEL (priv->date_label), (const gchar*)str);
120                 g_free (str);
121         }
122
123         return;
124 }
125
126 static void
127 tny_gtk_header_view_clear (TnyHeaderView *self)
128 {
129         TNY_GTK_HEADER_VIEW_GET_CLASS (self)->clear(self);
130         return;
131 }
132
133 static void
134 tny_gtk_header_view_clear_default (TnyHeaderView *self)
135 {
136         TnyGtkHeaderViewPriv *priv = TNY_GTK_HEADER_VIEW_GET_PRIVATE (self);
137
138         if (G_LIKELY (priv->header))
139                 g_object_unref (G_OBJECT (priv->header));
140         priv->header = NULL;
141
142         gtk_label_set_text (GTK_LABEL (priv->to_label), "");
143         gtk_label_set_text (GTK_LABEL (priv->from_label), "");
144         gtk_label_set_text (GTK_LABEL (priv->subject_label), "");
145         gtk_label_set_text (GTK_LABEL (priv->date_label), "");
146
147         return;
148 }
149
150
151
152 /**
153  * tny_gtk_header_view_new:
154  *
155  * Create a new #TnyHeaderView
156  *
157  * returns: (caller-owns): a new #TnyHeaderView
158  * since: 1.0
159  * audience: application-developer
160  **/
161 TnyHeaderView*
162 tny_gtk_header_view_new (void)
163 {
164         TnyGtkHeaderView *self = g_object_new (TNY_TYPE_GTK_HEADER_VIEW, NULL);
165
166         return TNY_HEADER_VIEW (self);
167 }
168
169 static void
170 tny_gtk_header_view_instance_init (GTypeInstance *instance, gpointer g_class)
171 {
172         TnyGtkHeaderView *self = (TnyGtkHeaderView *)instance;
173         TnyGtkHeaderViewPriv *priv = TNY_GTK_HEADER_VIEW_GET_PRIVATE (self);
174         GtkWidget *label2, *label3, *label4, *label1;
175
176         priv->header = NULL;
177
178         gtk_table_set_homogeneous (GTK_TABLE (self), FALSE);
179         gtk_table_resize (GTK_TABLE (self), 4, 2);
180
181         gtk_table_set_col_spacings (GTK_TABLE (self), 4);
182
183         label2 = gtk_label_new (_("<b>To:</b>"));
184         gtk_widget_show (label2);
185         gtk_table_attach (GTK_TABLE (self), label2, 0, 1, 1, 2,
186                           (GtkAttachOptions) (GTK_FILL),
187                           (GtkAttachOptions) (0), 0, 0);
188         gtk_label_set_use_markup (GTK_LABEL (label2), TRUE);
189         gtk_misc_set_alignment (GTK_MISC (label2), 0, 0.5);
190
191         label3 = gtk_label_new (_("<b>Subject:</b>"));
192         gtk_widget_show (label3);
193         gtk_table_attach (GTK_TABLE (self), label3, 0, 1, 2, 3,
194                           (GtkAttachOptions) (GTK_FILL),
195                           (GtkAttachOptions) (0), 0, 0);
196         gtk_label_set_use_markup (GTK_LABEL (label3), TRUE);
197         gtk_misc_set_alignment (GTK_MISC (label3), 0, 0.5);
198
199         label4 = gtk_label_new (_("<b>Date:</b>"));
200         gtk_widget_show (label4);
201         gtk_table_attach (GTK_TABLE (self), label4, 0, 1, 3, 4,
202                           (GtkAttachOptions) (GTK_FILL),
203                           (GtkAttachOptions) (0), 0, 0);
204         gtk_label_set_use_markup (GTK_LABEL (label4), TRUE);
205         gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5);
206
207         priv->from_label = gtk_label_new ("");
208         gtk_widget_show (priv->from_label);
209         gtk_table_attach (GTK_TABLE (self), priv->from_label, 1, 2, 0, 1,
210                           (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
211                           (GtkAttachOptions) (0), 0, 0);
212         gtk_misc_set_alignment (GTK_MISC (priv->from_label), 0, 0.5);
213
214         priv->to_label = gtk_label_new ("");
215         gtk_widget_show (priv->to_label);
216         gtk_table_attach (GTK_TABLE (self), priv->to_label, 1, 2, 1, 2,
217                           (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
218                           (GtkAttachOptions) (0), 0, 0);
219         gtk_misc_set_alignment (GTK_MISC (priv->to_label), 0, 0.5);
220
221         priv->subject_label = gtk_label_new ("");
222         gtk_widget_show (priv->subject_label);
223         gtk_table_attach (GTK_TABLE (self), priv->subject_label, 1, 2, 2, 3,
224                           (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
225                           (GtkAttachOptions) (0), 0, 0);
226         gtk_misc_set_alignment (GTK_MISC (priv->subject_label), 0, 0.5);
227
228         priv->date_label = gtk_label_new ("");
229         gtk_widget_show (priv->date_label);
230         gtk_table_attach (GTK_TABLE (self), priv->date_label, 1, 2, 3, 4,
231                           (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
232                           (GtkAttachOptions) (0), 0, 0);
233         gtk_misc_set_alignment (GTK_MISC (priv->date_label), 0, 0.5);
234
235         label1 = gtk_label_new (_("<b>From:</b>"));
236         gtk_widget_show (label1);
237         gtk_table_attach (GTK_TABLE (self), label1, 0, 1, 0, 1,
238                           (GtkAttachOptions) (GTK_FILL),
239                           (GtkAttachOptions) (0), 0, 0);
240         gtk_label_set_use_markup (GTK_LABEL (label1), TRUE);
241         gtk_misc_set_alignment (GTK_MISC (label1), 0, 0.5);
242
243         return;
244 }
245
246 static void
247 tny_gtk_header_view_finalize (GObject *object)
248 {
249         TnyGtkHeaderView *self = (TnyGtkHeaderView *)object;   
250         TnyGtkHeaderViewPriv *priv = TNY_GTK_HEADER_VIEW_GET_PRIVATE (self);
251
252         if (G_LIKELY (priv->header))
253                 g_object_unref (G_OBJECT (priv->header));
254         priv->header = NULL;
255
256         (*parent_class->finalize) (object);
257
258         return;
259 }
260
261 static void
262 tny_header_view_init (gpointer g, gpointer iface_data)
263 {
264         TnyHeaderViewIface *klass = (TnyHeaderViewIface *)g;
265
266         klass->set_header= tny_gtk_header_view_set_header;
267         klass->clear= tny_gtk_header_view_clear;
268
269         return;
270 }
271
272 static void
273 tny_gtk_header_view_class_init (TnyGtkHeaderViewClass *class)
274 {
275         GObjectClass *object_class;
276
277         parent_class = g_type_class_peek_parent (class);
278         object_class = (GObjectClass*) class;
279
280         class->set_header= tny_gtk_header_view_set_header_default;
281         class->clear= tny_gtk_header_view_clear_default;
282
283         object_class->finalize = tny_gtk_header_view_finalize;
284
285         g_type_class_add_private (object_class, sizeof (TnyGtkHeaderViewPriv));
286
287         return;
288 }
289
290 static gpointer
291 tny_gtk_header_view_register_type (gpointer notused)
292 {
293         GType type = 0;
294
295         static const GTypeInfo info =
296                 {
297                   sizeof (TnyGtkHeaderViewClass),
298                   NULL,   /* base_init */
299                   NULL,   /* base_finalize */
300                   (GClassInitFunc) tny_gtk_header_view_class_init,   /* class_init */
301                   NULL,   /* class_finalize */
302                   NULL,   /* class_data */
303                   sizeof (TnyGtkHeaderView),
304                   0,      /* n_preallocs */
305                   tny_gtk_header_view_instance_init    /* instance_init */
306                 };
307
308         static const GInterfaceInfo tny_header_view_info =
309                 {
310                   (GInterfaceInitFunc) tny_header_view_init, /* interface_init */
311                   NULL,         /* interface_finalize */
312                   NULL          /* interface_data */
313                 };
314
315         type = g_type_register_static (GTK_TYPE_TABLE,
316                                        "TnyGtkHeaderView",
317                                        &info, 0);
318
319         g_type_add_interface_static (type, TNY_TYPE_HEADER_VIEW,
320                                      &tny_header_view_info);
321
322         return GUINT_TO_POINTER (type);
323 }
324
325 /**
326  * tny_gtk_header_view_get_type:
327  *
328  * GType system helper function
329  *
330  * returns: a #GType
331  **/
332 GType
333 tny_gtk_header_view_get_type (void)
334 {
335         static GOnce once = G_ONCE_INIT;
336         g_once (&once, tny_gtk_header_view_register_type, NULL);
337         return GPOINTER_TO_UINT (once.retval);
338 }
Note: See TracBrowser for help on using the browser.