* src/maemo/modest-msg-edit-window.c:
[modest] / src / widgets / modest-msg-view-details-dialog.c
1 /* connection-specific-smtp-window.c */
2
3 #include "modest-msg-view-details-dialog.h"
4
5 #include <glib/gi18n.h>
6 #include <gtk/gtkscrolledwindow.h>
7 #include <gtk/gtktable.h>
8 #include <gtk/gtkstock.h>
9 #include <gtk/gtklabel.h>
10 #include <tny-msg.h>
11 #include <tny-header.h>
12 #include <tny-header-view.h>
13 #include <tny-folder.h>
14 #include <modest-tny-folder.h>
15 #include <modest-text-utils.h>
16
17 static void modest_msg_view_details_dialog_add_row (ModestMsgViewDetailsDialog *self, const gchar *label, const gchar *value);
18 static void modest_msg_view_details_dialog_set_header (TnyHeaderView *self, TnyHeader *header);
19 static void modest_msg_view_details_dialog_clear (TnyHeaderView *self);
20 static void modest_msg_view_details_dialog_tny_header_view_init (gpointer g_iface, gpointer iface_data);
21 static TnyFolderType modest_msg_view_details_dialog_get_folder_type (ModestMsgViewDetailsDialog *window);
22
23 G_DEFINE_TYPE_WITH_CODE (ModestMsgViewDetailsDialog, modest_msg_view_details_dialog, GTK_TYPE_DIALOG, G_IMPLEMENT_INTERFACE ( TNY_TYPE_HEADER_VIEW, modest_msg_view_details_dialog_tny_header_view_init));
24
25 #define MODEST_MSG_VIEW_DETAILS_DIALOG_GET_PRIVATE(o) \
26         (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEST_TYPE_MSG_VIEW_DETAILS_DIALOG, ModestMsgViewDetailsDialogPrivate))
27
28
29 typedef struct _ModestMsgViewDetailsDialogPrivate ModestMsgViewDetailsDialogPrivate;
30
31 struct _ModestMsgViewDetailsDialogPrivate
32 {
33         TnyHeader *header;
34         GtkWidget *props_table;
35 };
36
37 static void
38 modest_msg_view_details_dialog_get_property (GObject *object, guint property_id,
39                                              GValue *value, GParamSpec *pspec)
40 {
41         switch (property_id) {
42         default:
43                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
44         }
45 }
46
47 static void
48 modest_msg_view_details_dialog_set_property (GObject *object, guint property_id,
49                                              const GValue *value, GParamSpec *pspec)
50 {
51         switch (property_id) {
52         default:
53                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
54         }
55 }
56
57 static void
58 modest_msg_view_details_dialog_dispose (GObject *object)
59 {
60         if (G_OBJECT_CLASS (modest_msg_view_details_dialog_parent_class)->dispose)
61                 G_OBJECT_CLASS (modest_msg_view_details_dialog_parent_class)->dispose (object);
62 }
63
64 static void
65 modest_msg_view_details_dialog_finalize (GObject *object)
66 {
67         ModestMsgViewDetailsDialogPrivate *priv = MODEST_MSG_VIEW_DETAILS_DIALOG_GET_PRIVATE (object);
68
69         if (priv->header) {
70                 g_object_unref (priv->header);
71                 priv->header = NULL;
72         }
73         G_OBJECT_CLASS (modest_msg_view_details_dialog_parent_class)->finalize (object);
74 }
75
76 static void
77 modest_msg_view_details_dialog_class_init (ModestMsgViewDetailsDialogClass *klass)
78 {
79         GObjectClass *object_class = G_OBJECT_CLASS (klass);
80
81         g_type_class_add_private (klass, sizeof (ModestMsgViewDetailsDialogPrivate));
82
83         object_class->get_property = modest_msg_view_details_dialog_get_property;
84         object_class->set_property = modest_msg_view_details_dialog_set_property;
85         object_class->dispose = modest_msg_view_details_dialog_dispose;
86         object_class->finalize = modest_msg_view_details_dialog_finalize;
87 }
88
89 static void
90 modest_msg_view_details_dialog_init (ModestMsgViewDetailsDialog *self)
91 {
92         ModestMsgViewDetailsDialogPrivate *priv = MODEST_MSG_VIEW_DETAILS_DIALOG_GET_PRIVATE (self);
93         GtkWidget *scrollbar;
94
95         priv->header = NULL;
96         scrollbar = gtk_scrolled_window_new (NULL, NULL);
97
98         gtk_window_set_default_size (GTK_WINDOW (self), 400, 220);
99         gtk_window_set_title (GTK_WINDOW (self), _("mcen_ti_message_properties"));
100
101         priv->props_table = gtk_table_new (0, 2, FALSE);
102         gtk_table_set_col_spacings (GTK_TABLE (priv->props_table), 12);
103         gtk_table_set_row_spacings (GTK_TABLE (priv->props_table), 1);
104         gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrollbar), priv->props_table);
105         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollbar), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
106         gtk_container_add (GTK_CONTAINER (GTK_DIALOG (self)->vbox), scrollbar);
107
108         gtk_dialog_set_has_separator (GTK_DIALOG (self), FALSE);
109         gtk_dialog_add_button (GTK_DIALOG (self), _("mcen_bd_close"), GTK_RESPONSE_CLOSE);
110 }
111
112 static void
113 modest_msg_view_details_dialog_tny_header_view_init (gpointer g_iface, gpointer iface_data)
114 {
115         TnyHeaderViewIface *iface = (TnyHeaderViewIface *) g_iface;
116
117         iface->set_header_func = modest_msg_view_details_dialog_set_header;
118         iface->clear_func = modest_msg_view_details_dialog_clear;
119 }
120
121 GtkWidget*
122 modest_msg_view_details_dialog_new (GtkWindow *parent, TnyHeader *header)
123 {
124         GtkWidget *dialog;
125         dialog = GTK_WIDGET (g_object_new (MODEST_TYPE_MSG_VIEW_DETAILS_DIALOG, "transient-for", parent, NULL));
126
127         if (header != NULL)
128                 modest_msg_view_details_dialog_set_header (TNY_HEADER_VIEW (dialog), header);
129
130         return dialog;
131 }
132
133 static void
134 modest_msg_view_details_dialog_add_row (ModestMsgViewDetailsDialog *self,
135                                         const gchar *label,
136                                         const gchar *value)
137 {
138         ModestMsgViewDetailsDialogPrivate *priv;
139         guint n_rows = 0;
140         GtkWidget *label_w, *value_w;
141
142         priv = MODEST_MSG_VIEW_DETAILS_DIALOG_GET_PRIVATE (self);
143
144         g_object_get (G_OBJECT (priv->props_table), "n-rows", &n_rows,NULL);
145         label_w = gtk_label_new (label);
146         gtk_misc_set_alignment (GTK_MISC (label_w), 1.0, 0.0);
147         gtk_label_set_justify (GTK_LABEL (label_w), GTK_JUSTIFY_RIGHT);
148         value_w = gtk_label_new (value);
149         gtk_label_set_line_wrap (GTK_LABEL (value_w), TRUE);
150         gtk_misc_set_alignment (GTK_MISC (value_w), 0.0, 0.0);
151         gtk_label_set_justify (GTK_LABEL (value_w), GTK_JUSTIFY_LEFT);
152
153         gtk_table_attach (GTK_TABLE (priv->props_table), label_w, 0, 1, n_rows, n_rows + 1, GTK_SHRINK|GTK_FILL, GTK_SHRINK|GTK_FILL, 0, 0);
154         gtk_table_attach (GTK_TABLE (priv->props_table), value_w, 1, 2, n_rows, n_rows + 1, GTK_EXPAND|GTK_FILL, GTK_SHRINK|GTK_FILL, 0, 0);
155
156 }
157
158 static TnyFolderType
159 modest_msg_view_details_dialog_get_folder_type (ModestMsgViewDetailsDialog *window)
160 {
161         ModestMsgViewDetailsDialogPrivate *priv;
162         TnyFolderType folder_type;
163
164         priv = MODEST_MSG_VIEW_DETAILS_DIALOG_GET_PRIVATE (window);
165
166         folder_type = TNY_FOLDER_TYPE_UNKNOWN;
167
168         if (priv->header) {
169                 TnyFolder *folder;
170
171                 folder = tny_header_get_folder (priv->header);
172                 
173                 if (folder) {
174                         folder_type = tny_folder_get_folder_type (folder);
175                         
176                         if (folder_type == TNY_FOLDER_TYPE_NORMAL || folder_type == TNY_FOLDER_TYPE_UNKNOWN) {
177                                 const gchar *fname = tny_folder_get_name (folder);
178                                 folder_type = modest_tny_folder_guess_folder_type_from_name (fname);
179                         }
180
181                         g_object_unref (folder);
182                 }
183         }
184
185         return folder_type;
186 }
187
188
189 static void
190 modest_msg_view_details_dialog_set_header (TnyHeaderView *self, 
191                                            TnyHeader *header)
192 {
193         ModestMsgViewDetailsDialogPrivate *priv;
194         gchar *from, *subject, *to, *cc;
195         time_t received, sent;
196         guint size;
197         gchar *size_s;
198
199         g_return_if_fail (MODEST_IS_MSG_VIEW_DETAILS_DIALOG (self));
200         priv = MODEST_MSG_VIEW_DETAILS_DIALOG_GET_PRIVATE (self);
201
202         modest_msg_view_details_dialog_clear (self);
203
204         priv->header = header;
205
206         if (header != NULL) {
207                 TnyFolderType folder_type;
208                 g_object_ref (header);
209
210                 folder_type = modest_msg_view_details_dialog_get_folder_type (MODEST_MSG_VIEW_DETAILS_DIALOG (self));
211
212                 from = g_strdup (tny_header_get_from (header));
213                 to = g_strdup (tny_header_get_to (header));
214                 subject = g_strdup (tny_header_get_subject (header));
215                 cc = g_strdup (tny_header_get_cc (header));
216                 received = tny_header_get_date_received (header);
217                 sent = tny_header_get_date_sent (header);
218                 size = tny_header_get_message_size (header);
219
220                 if (from == NULL)
221                         from = g_strdup ("");
222                 if (to == NULL)
223                         to = g_strdup ("");
224                 if (subject == NULL)
225                         subject = g_strdup ("");
226                 if (cc == NULL)
227                         cc = g_strdup ("");
228
229                 modest_msg_view_details_dialog_add_row (MODEST_MSG_VIEW_DETAILS_DIALOG (self), _("mcen_fi_message_properties_from"), from);
230                 modest_msg_view_details_dialog_add_row (MODEST_MSG_VIEW_DETAILS_DIALOG (self), _("mcen_fi_message_properties_subject"), subject);
231                 if ((folder_type != TNY_FOLDER_TYPE_SENT)&&
232                     (folder_type != TNY_FOLDER_TYPE_DRAFTS)&&
233                     (folder_type != TNY_FOLDER_TYPE_OUTBOX)) {
234                         gchar *received_s;
235
236                         received_s = modest_text_utils_get_display_date (received);
237                         if (received_s == NULL)
238                                 received_s = g_strdup (received_s);
239                         modest_msg_view_details_dialog_add_row (MODEST_MSG_VIEW_DETAILS_DIALOG (self), _("mcen_fi_message_properties_received"), received_s);
240                         g_free (received_s);
241                 } 
242
243                 if ((folder_type != TNY_FOLDER_TYPE_DRAFTS)&&
244                     (folder_type != TNY_FOLDER_TYPE_OUTBOX)) {
245                         gchar *sent_s;
246
247                         sent_s = modest_text_utils_get_display_date (sent);
248                         if (sent_s == NULL)
249                                 sent_s = g_strdup (sent_s);
250                         modest_msg_view_details_dialog_add_row (MODEST_MSG_VIEW_DETAILS_DIALOG (self), _("mcen_fi_message_properties_sent"), sent_s);
251                         g_free (sent_s);
252                 } 
253
254                 modest_msg_view_details_dialog_add_row (MODEST_MSG_VIEW_DETAILS_DIALOG (self), _("mcen_fi_message_properties_to"), to);
255                 modest_msg_view_details_dialog_add_row (MODEST_MSG_VIEW_DETAILS_DIALOG (self), _("mcen_fi_message_properties_cc"), cc);
256
257                 if (size <= 0)
258                         size_s = g_strdup (_("mcen_va_message_properties_size_noinfo"));
259                 else
260                         size_s = modest_text_utils_get_display_size (size);
261                 modest_msg_view_details_dialog_add_row (MODEST_MSG_VIEW_DETAILS_DIALOG (self), _("mcen_fi_message_properties_size"), size_s);
262                 g_free (size_s);
263
264                 g_free (to);
265                 g_free (from);
266                 g_free (subject);
267                 g_free (cc);
268         }
269
270 }
271
272 static void
273 modest_msg_view_details_dialog_clear (TnyHeaderView *self)
274 {
275         ModestMsgViewDetailsDialogPrivate *priv;
276         GList *children, *node;
277
278         g_return_if_fail (MODEST_IS_MSG_VIEW_DETAILS_DIALOG (self));
279         priv = MODEST_MSG_VIEW_DETAILS_DIALOG_GET_PRIVATE (self);
280
281         if (priv->header != NULL) {
282                 g_object_unref (priv->header);
283                 priv->header = NULL;
284         }
285
286         children = gtk_container_get_children (GTK_CONTAINER (priv->props_table));
287         for (node = children; node != NULL; node = g_list_next (node))
288                 gtk_widget_destroy (GTK_WIDGET (node->data));
289         
290 }