* remove, does not compile anymore after tinymail changes
[modest] / src / hildon / modest-ui-message-viewer.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
31 #include <gtk/gtk.h>
32 #include <glade/glade.h>
33 #include <glib/gi18n.h>
34 #include <string.h>
35
36 #ifdef HAVE_CONFIG_H
37 #include <config.h>
38 #endif /*HAVE_CONFIG_H*/
39
40 /* TODO: put in auto* */
41 #include <tny-text-buffer-stream.h>
42 #include <tny-msg-folder.h>
43
44 #include "../modest-ui.h"
45 #include "../modest-window-mgr.h"
46 #include "../modest-account-mgr.h"
47 #include "../modest-account-mgr.h"
48 #include "../modest-identity-mgr.h"
49
50 #include "../modest-tny-account-store.h"
51 #include "../widgets/modest-folder-view.h"
52 #include "../widgets/modest-header-view.h"
53 #include "../widgets/modest-msg-view.h"
54 #include "../modest-tny-transport-actions.h"
55 #include "../modest-tny-store-actions.h"
56
57 #include "../modest-text-utils.h"
58 #include "../modest-tny-msg-actions.h"
59
60 #include "../modest-viewer-window.h"
61
62 #include "modest-ui-glade.h"
63 #include "modest-ui-message-viewer.h"
64
65
66
67 typedef struct {
68         ModestUI *modest_ui;
69         ModestViewerWindow *viewer_win;
70         GladeXML *glade_xml;
71 } ViewerWinData;
72
73
74 GtkContainer
75 *modest_ui_new_viewer_window (ModestUI *modest_ui, GtkWidget *msg_view, TnyMsgIface *msg, gpointer *user_data)
76 {
77         GtkWidget       *top_container;
78         GladeXML        *glade_xml;
79         ViewerWinData   *win_data;
80         GtkWidget       *paned;
81
82         glade_xml = glade_xml_new(MODEST_GLADE, "viewer_top_container", NULL);
83         if (!glade_xml)
84                 return NULL;
85
86         win_data = g_malloc(sizeof(ViewerWinData));
87         win_data->modest_ui = modest_ui;
88         win_data->glade_xml = glade_xml;
89
90         *user_data = win_data;
91
92         top_container = glade_xml_get_widget(glade_xml, "viewer_top_container");
93         if (!top_container) {
94                 g_object_unref(G_OBJECT(glade_xml));
95                 return NULL;
96         }
97
98         if (!GTK_IS_WIDGET(msg_view))
99                 return NULL;
100         paned = glade_xml_get_widget(glade_xml, "vpaned3");
101         gtk_paned_add2(GTK_PANED(paned), msg_view);
102         gtk_widget_show_all(msg_view);
103
104         return GTK_CONTAINER(top_container);
105 }
106
107
108 static void
109 close_viewer_window(GtkWidget *win, GdkEvent *event, gpointer data)
110 {
111         ModestViewerWindow *viewer_win;
112         ModestUIPrivate *priv;
113         ViewerWinData *win_data;
114
115         viewer_win = (ModestViewerWindow *)data;
116         win_data = modest_viewer_window_get_data(viewer_win);
117         priv = MODEST_UI_GET_PRIVATE(win_data->modest_ui);
118
119         modest_window_mgr_unregister(priv->modest_window_mgr, G_OBJECT(viewer_win));
120         gtk_widget_hide (GTK_WIDGET(viewer_win));
121         gtk_widget_destroy(GTK_WIDGET(viewer_win));
122 }
123
124 /* just to prevent warnings:
125  * warning: `%x' yields only last 2 digits of year in some locales
126  */
127 static size_t
128 my_strftime(char *s, size_t max, const char  *fmt,  const
129             struct tm *tm) {
130         return strftime(s, max, fmt, tm);
131 }
132
133
134 static void
135 open_message_viewer_window(ModestUI *modest_ui)
136 {
137         GtkWidget *viewer_win;
138         ModestUIPrivate *priv;
139         gint width, height;
140         ViewerWinData *windata;
141         GtkWidget *paned;
142         GtkTreeSelection *sel;
143         GtkTreeModel *model;
144         GtkTreeIter iter;
145         GtkScrolledWindow *scroll;
146         ModestHeaderView *header_view;
147         TnyMsgHeaderIface *header;
148         const TnyMsgFolderIface *folder;
149         TnyMsgIface *msg;
150         const gchar *subject, *to, *from;
151         time_t sent_date;
152         gchar date_str[101];
153         GtkWidget *w;
154
155         priv = MODEST_UI_GET_PRIVATE(modest_ui);
156         /* FIXME: maybe use seperate viewer defaults? */
157         height = modest_conf_get_int (priv->modest_conf, MODEST_EDIT_WINDOW_HEIGHT, NULL);
158         width  = modest_conf_get_int (priv->modest_conf, MODEST_EDIT_WINDOW_WIDTH, NULL);
159
160         paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
161         g_return_if_fail (paned);
162
163         scroll = GTK_SCROLLED_WINDOW(gtk_paned_get_child1 (GTK_PANED(paned)));
164         g_return_if_fail (scroll);
165
166         header_view = MODEST_HEADER_VIEW(gtk_bin_get_child (GTK_BIN(scroll)));
167         g_return_if_fail (header_view);
168
169         sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
170         g_return_if_fail (sel);
171
172         if (!gtk_tree_selection_get_selected (sel, &model, &iter)) {
173                 g_warning("nothing to display");
174                 return;
175         }
176
177         gtk_tree_model_get (model, &iter,
178                 TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, -1);
179
180         if (!header) {
181                 g_warning("no header");
182                 return;
183         }
184
185         folder = tny_msg_header_iface_get_folder (TNY_MSG_HEADER_IFACE(header));
186         if (!folder) {
187                 g_warning ("cannot find folder");
188                 return;
189         }
190
191         msg = (TnyMsgIface *) tny_msg_folder_iface_get_message (TNY_MSG_FOLDER_IFACE(folder), header);
192         if (!msg) {
193                 g_warning ("cannot find msg");
194                 return;
195         }
196
197         viewer_win = modest_viewer_window_new(modest_ui, msg);
198         windata = (ViewerWinData *)modest_viewer_window_get_data(MODEST_VIEWER_WINDOW(viewer_win));
199         g_return_if_fail(windata);
200
201         subject = tny_msg_header_iface_get_subject(header);
202         from = tny_msg_header_iface_get_from(header);
203         to = tny_msg_header_iface_get_to(header);
204         sent_date = tny_msg_header_iface_get_date_sent(header);
205         my_strftime (date_str, 100, "%c", localtime (&sent_date));
206         
207         w = glade_xml_get_widget (windata->glade_xml, "from");
208         gtk_label_set_text(GTK_LABEL(w), from);
209         w = glade_xml_get_widget (windata->glade_xml, "to");
210         gtk_label_set_text(GTK_LABEL(w), to);
211         w = glade_xml_get_widget (windata->glade_xml, "subject");
212         gtk_label_set_text(GTK_LABEL(w), subject);
213         w = glade_xml_get_widget (windata->glade_xml, "date");
214         gtk_label_set_text(GTK_LABEL(w), date_str);
215
216         // g_message("new viewer win@%dx%d", width, height);
217         gtk_widget_set_usize (GTK_WIDGET(viewer_win), width, height);
218         gtk_widget_show(viewer_win);
219         modest_window_mgr_register(priv->modest_window_mgr, G_OBJECT(viewer_win), MODEST_VIEW_WINDOW, 0);
220         g_signal_connect (viewer_win, "destroy-event", G_CALLBACK(close_viewer_window), viewer_win);
221         g_signal_connect (viewer_win, "delete-event", G_CALLBACK(close_viewer_window), viewer_win);
222 }
223
224
225 void
226 on_open_message_clicked (GtkWidget *widget, gpointer user_data)
227 {
228         ModestUI *modest_ui = (ModestUI *)user_data;
229
230         open_message_viewer_window(modest_ui);
231 }
232
233 void
234 on_message_activated (GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
235 {
236         ModestUI *modest_ui = (ModestUI *)user_data;
237
238         open_message_viewer_window(modest_ui);
239 }