4a50fbb15a1561836c1a5fefcbe271cb9202d810
[modest] / src / gtk / modest-ui-message-viewer.c
1 #include <gtk/gtk.h>
2 #include <glade/glade.h>
3 #include <glib/gi18n.h>
4 #include <string.h>
5
6 #ifdef HAVE_CONFIG_H
7 #include <config.h>
8 #endif /*HAVE_CONFIG_H*/
9
10 /* TODO: put in auto* */
11 #include <tny-text-buffer-stream.h>
12 #include <tny-msg-folder.h>
13
14 #include "../modest-ui.h"
15 #include "../modest-window-mgr.h"
16 #include "../modest-account-mgr.h"
17 #include "../modest-account-mgr.h"
18 #include "../modest-identity-mgr.h"
19
20 #include "../modest-tny-account-store.h"
21 #include "../modest-tny-folder-tree-view.h"
22 #include "../modest-tny-header-tree-view.h"
23 #include "../modest-tny-msg-view.h"
24 #include "../modest-tny-transport-actions.h"
25 #include "../modest-tny-store-actions.h"
26
27 #include "../modest-text-utils.h"
28 #include "../modest-tny-msg-actions.h"
29
30 #include "../modest-viewer-window.h"
31
32 #include "modest-ui-glade.h"
33 #include "modest-ui-message-viewer.h"
34
35
36
37 typedef struct {
38         ModestUI *modest_ui;
39         ModestViewerWindow *viewer_win;
40         GladeXML *glade_xml;
41 } ViewerWinData;
42
43
44 GtkContainer
45 *modest_ui_new_viewer_window (ModestUI *modest_ui, GtkWidget *msg_view, TnyMsgIface *msg, gpointer *user_data)
46 {
47         GtkWidget       *top_container;
48         GladeXML        *glade_xml;
49         ViewerWinData   *win_data;
50         GtkWidget       *paned;
51
52         glade_xml = glade_xml_new(MODEST_GLADE, "viewer_top_container", NULL);
53         if (!glade_xml)
54                 return NULL;
55
56         win_data = g_malloc(sizeof(ViewerWinData));
57         win_data->modest_ui = modest_ui;
58         win_data->glade_xml = glade_xml;
59
60         *user_data = win_data;
61
62         top_container = glade_xml_get_widget(glade_xml, "viewer_top_container");
63         if (!top_container) {
64                 g_object_unref(G_OBJECT(glade_xml));
65                 return NULL;
66         }
67
68         if (!GTK_IS_WIDGET(msg_view))
69                 return NULL;
70         paned = glade_xml_get_widget(glade_xml, "vpaned3");
71         gtk_paned_add2(GTK_PANED(paned), msg_view);
72         gtk_widget_show_all(msg_view);
73
74         return GTK_CONTAINER(top_container);
75 }
76
77
78 static void
79 close_viewer_window(GtkWidget *win, GdkEvent *event, gpointer data)
80 {
81         ModestViewerWindow *viewer_win;
82         ModestUIPrivate *priv;
83         ViewerWinData *win_data;
84
85         viewer_win = (ModestViewerWindow *)data;
86         win_data = modest_viewer_window_get_data(viewer_win);
87         priv = MODEST_UI_GET_PRIVATE(win_data->modest_ui);
88
89         modest_window_mgr_unregister(priv->modest_window_mgr, G_OBJECT(viewer_win));
90         gtk_widget_hide (GTK_WIDGET(viewer_win));
91         gtk_widget_destroy(GTK_WIDGET(viewer_win));
92 }
93
94
95 static void
96 open_message_viewer_window(ModestUI *modest_ui)
97 {
98         GtkWidget *viewer_win;
99         ModestUIPrivate *priv;
100         gint width, height;
101         ViewerWinData *windata;
102         GtkWidget *paned;
103         GtkTreeSelection *sel;
104         GtkTreeModel *model;
105         GtkTreeIter iter;
106         GtkScrolledWindow *scroll;
107         ModestTnyHeaderTreeView *header_view;
108         TnyMsgHeaderIface *header;
109         const TnyMsgFolderIface *folder;
110         TnyMsgIface *msg;
111         const gchar *subject, *to, *from;
112         time_t sent_date;
113         gchar date_str[101];
114         GtkWidget *w;
115
116         priv = MODEST_UI_GET_PRIVATE(modest_ui);
117         /* FIXME: maybe use seperate viewer defaults? */
118         height = modest_conf_get_int (priv->modest_conf, MODEST_CONF_EDIT_WINDOW_HEIGHT, NULL);
119         width  = modest_conf_get_int (priv->modest_conf, MODEST_CONF_EDIT_WINDOW_WIDTH, NULL);
120
121         paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
122         g_return_if_fail (paned);
123
124         scroll = GTK_SCROLLED_WINDOW(gtk_paned_get_child1 (GTK_PANED(paned)));
125         g_return_if_fail (scroll);
126
127         header_view = MODEST_TNY_HEADER_TREE_VIEW(gtk_bin_get_child (GTK_BIN(scroll)));
128         g_return_if_fail (header_view);
129
130         sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
131         g_return_if_fail (sel);
132
133         if (!gtk_tree_selection_get_selected (sel, &model, &iter)) {
134                 g_warning("nothing to display");
135                 return;
136         }
137
138         gtk_tree_model_get (model, &iter,
139                 TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, -1);
140
141         if (!header) {
142                 g_warning("no header");
143                 return;
144         }
145
146         folder = tny_msg_header_iface_get_folder (TNY_MSG_HEADER_IFACE(header));
147         if (!folder) {
148                 g_warning ("cannot find folder");
149                 return;
150         }
151
152         msg = (TnyMsgIface *) tny_msg_folder_iface_get_message (TNY_MSG_FOLDER_IFACE(folder), header);
153         if (!msg) {
154                 g_warning ("cannot find msg");
155                 return;
156         }
157
158         viewer_win = modest_viewer_window_new(modest_ui, msg);
159         windata = (ViewerWinData *)modest_viewer_window_get_data(MODEST_VIEWER_WINDOW(viewer_win));
160         g_return_if_fail(windata);
161
162         subject = tny_msg_header_iface_get_subject(header);
163         from = tny_msg_header_iface_get_from(header);
164         to = tny_msg_header_iface_get_to(header);
165         sent_date = tny_msg_header_iface_get_date_sent(header);
166         strftime (date_str, 100, "%c", localtime (&sent_date));
167
168         w = glade_xml_get_widget (windata->glade_xml, "from");
169         gtk_label_set_text(GTK_LABEL(w), from);
170         w = glade_xml_get_widget (windata->glade_xml, "to");
171         gtk_label_set_text(GTK_LABEL(w), to);
172         w = glade_xml_get_widget (windata->glade_xml, "subject");
173         gtk_label_set_text(GTK_LABEL(w), subject);
174         w = glade_xml_get_widget (windata->glade_xml, "date");
175         gtk_label_set_text(GTK_LABEL(w), date_str);
176
177         // g_message("new viewer win@%dx%d", width, height);
178         gtk_widget_set_usize (GTK_WIDGET(viewer_win), width, height);
179         gtk_widget_show(viewer_win);
180         modest_window_mgr_register(priv->modest_window_mgr, G_OBJECT(viewer_win), MODEST_VIEW_WINDOW, 0);
181         g_signal_connect (viewer_win, "destroy-event", G_CALLBACK(close_viewer_window), viewer_win);
182         g_signal_connect (viewer_win, "delete-event", G_CALLBACK(close_viewer_window), viewer_win);
183 }
184
185
186 void
187 on_open_message_clicked (GtkWidget *widget, gpointer user_data)
188 {
189         ModestUI *modest_ui = (ModestUI *)user_data;
190
191         open_message_viewer_window(modest_ui);
192 }
193
194 void
195 on_message_activated (GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
196 {
197         ModestUI *modest_ui = (ModestUI *)user_data;
198
199         open_message_viewer_window(modest_ui);
200 }