1 /* Copyright (c) 2006, Nokia Corporation
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
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.
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.
30 #include <glib/gi18n.h>
31 #include <gtk/gtktreeviewcolumn.h>
33 #include "modest-main-window.h"
34 #include "modest-widget-factory.h"
35 #include "modest-widget-memory.h"
36 #include "modest-icon-factory.h"
37 #include "modest-ui.h"
38 #include "modest-main-window-ui.h"
39 #include "modest-account-view-window.h"
40 #include "modest-account-mgr.h"
41 #include "modest-conf.h"
42 #include "modest-edit-msg-window.h"
43 #include "modest-tny-platform-factory.h"
44 #include "modest-tny-msg-actions.h"
45 #include "modest-mail-operation.h"
46 #include "modest-icon-names.h"
48 /* 'private'/'protected' functions */
49 static void modest_main_window_class_init (ModestMainWindowClass *klass);
50 static void modest_main_window_init (ModestMainWindow *obj);
51 static void modest_main_window_finalize (GObject *obj);
53 static void restore_sizes (ModestMainWindow *self);
54 static void save_sizes (ModestMainWindow *self);
63 typedef struct _ModestMainWindowPrivate ModestMainWindowPrivate;
64 struct _ModestMainWindowPrivate {
66 GtkUIManager *ui_manager;
67 ModestWidgetFactory *widget_factory;
68 TnyPlatformFactory *factory;
69 ModestTnyAccountStore *account_store;
74 GtkWidget *folder_paned;
76 GtkWidget *main_paned;
78 ModestHeaderView *header_view;
79 ModestFolderView *folder_view;
80 ModestMsgView *msg_preview;
84 #define MODEST_MAIN_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
85 MODEST_TYPE_MAIN_WINDOW, \
86 ModestMainWindowPrivate))
88 typedef struct _GetMsgAsyncHelper {
89 ModestMainWindowPrivate *main_window_private;
91 ModestMailOperationReplyType reply_type;
92 ModestMailOperationForwardType forward_type;
98 static GtkWindowClass *parent_class = NULL;
100 /* uncomment the following if you have defined any signals */
101 /* static guint signals[LAST_SIGNAL] = {0}; */
104 modest_main_window_get_type (void)
106 static GType my_type = 0;
108 static const GTypeInfo my_info = {
109 sizeof(ModestMainWindowClass),
110 NULL, /* base init */
111 NULL, /* base finalize */
112 (GClassInitFunc) modest_main_window_class_init,
113 NULL, /* class finalize */
114 NULL, /* class data */
115 sizeof(ModestMainWindow),
117 (GInstanceInitFunc) modest_main_window_init,
120 my_type = g_type_register_static (GTK_TYPE_WINDOW,
128 modest_main_window_class_init (ModestMainWindowClass *klass)
130 GObjectClass *gobject_class;
131 gobject_class = (GObjectClass*) klass;
133 parent_class = g_type_class_peek_parent (klass);
134 gobject_class->finalize = modest_main_window_finalize;
136 g_type_class_add_private (gobject_class, sizeof(ModestMainWindowPrivate));
138 /* signal definitions go here, e.g.: */
139 /* signals[MY_SIGNAL_1] = */
140 /* g_signal_new ("my_signal_1",....); */
141 /* signals[MY_SIGNAL_2] = */
142 /* g_signal_new ("my_signal_2",....); */
147 modest_main_window_init (ModestMainWindow *obj)
149 ModestMainWindowPrivate *priv;
151 priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj);
153 priv->factory = modest_tny_platform_factory_get_instance ();
154 priv->widget_factory = NULL;
155 priv->ui_manager = NULL;
156 priv->account_store = NULL;
160 modest_main_window_finalize (GObject *obj)
162 ModestMainWindowPrivate *priv;
163 priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj);
164 if (priv->widget_factory) {
165 g_object_unref (G_OBJECT(priv->widget_factory));
166 priv->widget_factory = NULL;
168 if (priv->ui_manager) {
169 g_object_unref (G_OBJECT(priv->ui_manager));
170 priv->ui_manager = NULL;
172 if (priv->account_store) {
173 g_object_unref (G_OBJECT(priv->account_store));
174 priv->account_store = NULL;
177 G_OBJECT_CLASS(parent_class)->finalize (obj);
181 static ModestHeaderView*
182 header_view_new (ModestMainWindow *self)
185 GList *columns = NULL;
186 ModestHeaderView *header_view;
187 ModestMainWindowPrivate *priv;
188 ModestHeaderViewColumn cols[] = {
189 MODEST_HEADER_VIEW_COLUMN_MSGTYPE,
190 MODEST_HEADER_VIEW_COLUMN_ATTACH,
191 MODEST_HEADER_VIEW_COLUMN_FROM,
192 MODEST_HEADER_VIEW_COLUMN_SUBJECT,
193 MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE
195 priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
197 for (i = 0 ; i != sizeof(cols) / sizeof(ModestHeaderViewColumn); ++i)
198 columns = g_list_append (columns, GINT_TO_POINTER(cols[i]));
200 header_view = modest_widget_factory_get_header_view (priv->widget_factory);
201 modest_header_view_set_columns (header_view, columns);
202 modest_header_view_set_style (header_view,
203 MODEST_HEADER_VIEW_STYLE_SHOW_HEADERS);
204 g_list_free (columns);
210 restore_sizes (ModestMainWindow *self)
213 ModestMainWindowPrivate *priv;
215 priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
216 conf = modest_tny_platform_factory_get_conf_instance
217 (MODEST_TNY_PLATFORM_FACTORY(priv->factory));
219 modest_widget_memory_restore (conf, G_OBJECT(priv->folder_paned),
220 "modest-folder-paned");
221 modest_widget_memory_restore (conf, G_OBJECT(priv->msg_paned),
223 modest_widget_memory_restore (conf, G_OBJECT(priv->main_paned),
224 "modest-main-paned");
225 modest_widget_memory_restore (conf, G_OBJECT(priv->header_view),
227 modest_widget_memory_restore (conf,G_OBJECT(self),
228 "modest-main-window");
233 save_sizes (ModestMainWindow *self)
235 ModestMainWindowPrivate *priv;
238 priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
239 conf = modest_tny_platform_factory_get_conf_instance
240 (MODEST_TNY_PLATFORM_FACTORY(priv->factory));
242 modest_widget_memory_save (conf,G_OBJECT(self), "modest-main-window");
243 modest_widget_memory_save (conf, G_OBJECT(priv->folder_paned),
244 "modest-folder-paned");
245 modest_widget_memory_save (conf, G_OBJECT(priv->msg_paned),
247 modest_widget_memory_save (conf, G_OBJECT(priv->main_paned),
248 "modest-main-paned");
249 modest_widget_memory_save (conf, G_OBJECT(priv->header_view), "header-view");
253 wrapped_in_scrolled_window (GtkWidget *widget, gboolean needs_viewport)
257 win = gtk_scrolled_window_new (NULL, NULL);
258 gtk_scrolled_window_set_policy
259 (GTK_SCROLLED_WINDOW (win),GTK_POLICY_NEVER,
260 GTK_POLICY_AUTOMATIC);
263 gtk_scrolled_window_add_with_viewport
264 (GTK_SCROLLED_WINDOW(win), widget);
266 gtk_container_add (GTK_CONTAINER(win),
274 on_delete_event (GtkWidget *widget, GdkEvent *event, ModestMainWindow *self)
282 modest_main_window_new (ModestWidgetFactory *widget_factory,
283 TnyAccountStore *account_store)
286 ModestMainWindowPrivate *priv;
287 GtkWidget *main_vbox;
288 GtkWidget *status_hbox;
289 GtkWidget *header_win, *folder_win;
290 GtkActionGroup *action_group;
291 GError *error = NULL;
293 g_return_val_if_fail (widget_factory, NULL);
295 obj = g_object_new(MODEST_TYPE_MAIN_WINDOW, NULL);
296 priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj);
298 priv->widget_factory = g_object_ref (widget_factory);
299 priv->account_store = g_object_ref (account_store);
301 /* ***************** */
302 priv->ui_manager = gtk_ui_manager_new();
303 action_group = gtk_action_group_new ("ModestMainWindowActions");
305 /* Add common actions */
306 gtk_action_group_add_actions (action_group,
307 modest_action_entries,
308 G_N_ELEMENTS (modest_action_entries),
311 gtk_ui_manager_insert_action_group (priv->ui_manager, action_group, 0);
312 g_object_unref (action_group);
314 /* Load the UI definition */
315 gtk_ui_manager_add_ui_from_file (priv->ui_manager, MODEST_UIDIR "modest-ui.xml", &error);
317 g_warning ("Could not merge modest-ui.xml: %s", error->message);
318 g_error_free (error);
321 /* *************** */
322 /* priv->ui_manager = g_object_ref (ui_manager); */
324 /* Add accelerators */
325 gtk_window_add_accel_group (GTK_WINDOW (obj),
326 gtk_ui_manager_get_accel_group (priv->ui_manager));
329 /* Toolbar / Menubar */
330 priv->toolbar = gtk_ui_manager_get_widget (priv->ui_manager, "/ToolBar");
331 priv->menubar = gtk_ui_manager_get_widget (priv->ui_manager, "/MenuBar");
333 gtk_toolbar_set_tooltips (GTK_TOOLBAR (priv->toolbar), TRUE);
335 /* widgets from factory */
336 priv->folder_view = modest_widget_factory_get_folder_view (widget_factory);
337 priv->header_view = header_view_new (MODEST_MAIN_WINDOW(obj));
338 priv->msg_preview = modest_widget_factory_get_msg_preview (widget_factory);
340 folder_win = wrapped_in_scrolled_window (GTK_WIDGET(priv->folder_view),
342 header_win = wrapped_in_scrolled_window (GTK_WIDGET(priv->header_view),
346 priv->folder_paned = gtk_vpaned_new ();
347 priv->msg_paned = gtk_vpaned_new ();
348 priv->main_paned = gtk_hpaned_new ();
349 gtk_paned_add1 (GTK_PANED(priv->main_paned), folder_win);
350 gtk_paned_add2 (GTK_PANED(priv->main_paned), priv->msg_paned);
351 gtk_paned_add1 (GTK_PANED(priv->msg_paned), header_win);
352 gtk_paned_add2 (GTK_PANED(priv->msg_paned), GTK_WIDGET(priv->msg_preview));
354 gtk_widget_show (GTK_WIDGET(priv->header_view));
356 /* status bar / progress */
357 status_hbox = gtk_hbox_new (FALSE, 0);
358 gtk_box_pack_start (GTK_BOX(status_hbox),
359 modest_widget_factory_get_folder_info_label (widget_factory),
361 gtk_box_pack_start (GTK_BOX(status_hbox),
362 modest_widget_factory_get_status_bar(widget_factory),
364 gtk_box_pack_start (GTK_BOX(status_hbox),
365 modest_widget_factory_get_progress_bar(widget_factory),
367 gtk_box_pack_start (GTK_BOX(status_hbox),
368 modest_widget_factory_get_online_toggle(widget_factory),
371 /* putting it all together... */
372 main_vbox = gtk_vbox_new (FALSE, 6);
373 gtk_box_pack_start (GTK_BOX(main_vbox), priv->menubar, FALSE, FALSE, 0);
374 gtk_box_pack_start (GTK_BOX(main_vbox), priv->toolbar, FALSE, FALSE, 0);
375 gtk_box_pack_start (GTK_BOX(main_vbox), priv->main_paned, TRUE, TRUE,0);
376 gtk_box_pack_start (GTK_BOX(main_vbox), status_hbox, FALSE, FALSE, 0);
378 gtk_container_add (GTK_CONTAINER(obj), main_vbox);
379 restore_sizes (MODEST_MAIN_WINDOW(obj));
381 gtk_window_set_title (GTK_WINDOW(obj), _("Modest"));
382 gtk_window_set_icon (GTK_WINDOW(obj),
383 modest_icon_factory_get_icon (MODEST_APP_ICON));
384 gtk_widget_show_all (main_vbox);
386 g_signal_connect (G_OBJECT(obj), "delete-event",
387 G_CALLBACK(on_delete_event), obj);
389 return (ModestWindow *) obj;
392 ModestWidgetFactory *
393 modest_main_window_get_widget_factory (ModestMainWindow *main_window)
395 ModestMainWindowPrivate *priv;
397 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (main_window), NULL);
399 priv = MODEST_MAIN_WINDOW_GET_PRIVATE (main_window);
401 return g_object_ref (priv->widget_factory);
405 modest_main_window_get_account_store (ModestMainWindow *main_window)
407 ModestMainWindowPrivate *priv;
409 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (main_window), NULL);
411 priv = MODEST_MAIN_WINDOW_GET_PRIVATE (main_window);
413 return g_object_ref (priv->account_store);