1 /* connection-specific-smtp-window.c */
3 #include "modest-msg-view-details-dialog.h"
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>
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>
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);
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));
25 #define MODEST_MSG_VIEW_DETAILS_DIALOG_GET_PRIVATE(o) \
26 (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEST_TYPE_MSG_VIEW_DETAILS_DIALOG, ModestMsgViewDetailsDialogPrivate))
29 typedef struct _ModestMsgViewDetailsDialogPrivate ModestMsgViewDetailsDialogPrivate;
31 struct _ModestMsgViewDetailsDialogPrivate
34 GtkWidget *props_table;
38 modest_msg_view_details_dialog_get_property (GObject *object, guint property_id,
39 GValue *value, GParamSpec *pspec)
41 switch (property_id) {
43 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
48 modest_msg_view_details_dialog_set_property (GObject *object, guint property_id,
49 const GValue *value, GParamSpec *pspec)
51 switch (property_id) {
53 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
58 modest_msg_view_details_dialog_dispose (GObject *object)
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);
65 modest_msg_view_details_dialog_finalize (GObject *object)
67 ModestMsgViewDetailsDialogPrivate *priv = MODEST_MSG_VIEW_DETAILS_DIALOG_GET_PRIVATE (object);
70 g_object_unref (priv->header);
73 G_OBJECT_CLASS (modest_msg_view_details_dialog_parent_class)->finalize (object);
77 modest_msg_view_details_dialog_class_init (ModestMsgViewDetailsDialogClass *klass)
79 GObjectClass *object_class = G_OBJECT_CLASS (klass);
81 g_type_class_add_private (klass, sizeof (ModestMsgViewDetailsDialogPrivate));
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;
90 modest_msg_view_details_dialog_init (ModestMsgViewDetailsDialog *self)
92 ModestMsgViewDetailsDialogPrivate *priv = MODEST_MSG_VIEW_DETAILS_DIALOG_GET_PRIVATE (self);
96 scrollbar = gtk_scrolled_window_new (NULL, NULL);
98 gtk_window_set_default_size (GTK_WINDOW (self), 400, 220);
99 gtk_window_set_title (GTK_WINDOW (self), _("mcen_ti_message_properties"));
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);
108 gtk_dialog_set_has_separator (GTK_DIALOG (self), FALSE);
109 gtk_dialog_add_button (GTK_DIALOG (self), _("mcen_bd_close"), GTK_RESPONSE_CLOSE);
113 modest_msg_view_details_dialog_tny_header_view_init (gpointer g_iface, gpointer iface_data)
115 TnyHeaderViewIface *iface = (TnyHeaderViewIface *) g_iface;
117 iface->set_header_func = modest_msg_view_details_dialog_set_header;
118 iface->clear_func = modest_msg_view_details_dialog_clear;
122 modest_msg_view_details_dialog_new (GtkWindow *parent, TnyHeader *header)
125 dialog = GTK_WIDGET (g_object_new (MODEST_TYPE_MSG_VIEW_DETAILS_DIALOG, "transient-for", parent, NULL));
128 modest_msg_view_details_dialog_set_header (TNY_HEADER_VIEW (dialog), header);
134 modest_msg_view_details_dialog_add_row (ModestMsgViewDetailsDialog *self,
138 ModestMsgViewDetailsDialogPrivate *priv;
140 GtkWidget *label_w, *value_w;
142 priv = MODEST_MSG_VIEW_DETAILS_DIALOG_GET_PRIVATE (self);
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);
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);
159 modest_msg_view_details_dialog_get_folder_type (ModestMsgViewDetailsDialog *window)
161 ModestMsgViewDetailsDialogPrivate *priv;
162 TnyFolderType folder_type;
164 priv = MODEST_MSG_VIEW_DETAILS_DIALOG_GET_PRIVATE (window);
166 folder_type = TNY_FOLDER_TYPE_UNKNOWN;
171 folder = tny_header_get_folder (priv->header);
174 folder_type = tny_folder_get_folder_type (folder);
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);
181 g_object_unref (folder);
190 modest_msg_view_details_dialog_set_header (TnyHeaderView *self,
193 ModestMsgViewDetailsDialogPrivate *priv;
194 gchar *from, *subject, *to, *cc;
195 time_t received, sent;
199 g_return_if_fail (MODEST_IS_MSG_VIEW_DETAILS_DIALOG (self));
200 priv = MODEST_MSG_VIEW_DETAILS_DIALOG_GET_PRIVATE (self);
202 modest_msg_view_details_dialog_clear (self);
204 priv->header = header;
206 if (header != NULL) {
207 TnyFolderType folder_type;
208 g_object_ref (header);
210 folder_type = modest_msg_view_details_dialog_get_folder_type (MODEST_MSG_VIEW_DETAILS_DIALOG (self));
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);
221 from = g_strdup ("");
225 subject = g_strdup ("");
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)) {
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);
243 if ((folder_type != TNY_FOLDER_TYPE_DRAFTS)&&
244 (folder_type != TNY_FOLDER_TYPE_OUTBOX)) {
247 sent_s = modest_text_utils_get_display_date (sent);
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);
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);
258 size_s = g_strdup (_("mcen_va_message_properties_size_noinfo"));
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);
273 modest_msg_view_details_dialog_clear (TnyHeaderView *self)
275 ModestMsgViewDetailsDialogPrivate *priv;
276 GList *children, *node;
278 g_return_if_fail (MODEST_IS_MSG_VIEW_DETAILS_DIALOG (self));
279 priv = MODEST_MSG_VIEW_DETAILS_DIALOG_GET_PRIVATE (self);
281 if (priv->header != NULL) {
282 g_object_unref (priv->header);
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));