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/gtkaboutdialog.h>
32 #include <gtk/gtktreeviewcolumn.h>
34 #include <modest-widget-memory.h>
35 #include <modest-icon-factory.h>
37 #include <widgets/modest-toolbar.h>
39 #include "modest-main-window.h"
40 #include "modest-account-view-window.h"
41 #include "modest-account-mgr.h"
42 #include "modest-conf.h"
43 #include "modest-edit-msg-window.h"
44 #include "modest-icon-names.h"
45 #include "modest-tny-platform-factory.h"
46 #include "modest-tny-msg-actions.h"
47 #include "modest-mail-operation.h"
49 /* 'private'/'protected' functions */
50 static void modest_main_window_class_init (ModestMainWindowClass *klass);
51 static void modest_main_window_init (ModestMainWindow *obj);
52 static void modest_main_window_finalize (GObject *obj);
54 static void restore_sizes (ModestMainWindow *self);
55 static void save_sizes (ModestMainWindow *self);
64 typedef struct _ModestMainWindowPrivate ModestMainWindowPrivate;
65 struct _ModestMainWindowPrivate {
70 GtkWidget *folder_paned;
72 GtkWidget *main_paned;
74 ModestWidgetFactory *widget_factory;
75 TnyPlatformFactory *factory;
77 ModestHeaderView *header_view;
78 ModestFolderView *folder_view;
79 ModestMsgView *msg_preview;
83 #define MODEST_MAIN_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
84 MODEST_TYPE_MAIN_WINDOW, \
85 ModestMainWindowPrivate))
87 static GtkWindowClass *parent_class = NULL;
89 /* uncomment the following if you have defined any signals */
90 /* static guint signals[LAST_SIGNAL] = {0}; */
93 modest_main_window_get_type (void)
95 static GType my_type = 0;
97 static const GTypeInfo my_info = {
98 sizeof(ModestMainWindowClass),
100 NULL, /* base finalize */
101 (GClassInitFunc) modest_main_window_class_init,
102 NULL, /* class finalize */
103 NULL, /* class data */
104 sizeof(ModestMainWindow),
106 (GInstanceInitFunc) modest_main_window_init,
109 my_type = g_type_register_static (GTK_TYPE_WINDOW,
117 modest_main_window_class_init (ModestMainWindowClass *klass)
119 GObjectClass *gobject_class;
120 gobject_class = (GObjectClass*) klass;
122 parent_class = g_type_class_peek_parent (klass);
123 gobject_class->finalize = modest_main_window_finalize;
125 g_type_class_add_private (gobject_class, sizeof(ModestMainWindowPrivate));
127 /* signal definitions go here, e.g.: */
128 /* signals[MY_SIGNAL_1] = */
129 /* g_signal_new ("my_signal_1",....); */
130 /* signals[MY_SIGNAL_2] = */
131 /* g_signal_new ("my_signal_2",....); */
136 modest_main_window_init (ModestMainWindow *obj)
138 ModestMainWindowPrivate *priv;
140 priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj);
142 priv->factory = modest_tny_platform_factory_get_instance ();
146 modest_main_window_finalize (GObject *obj)
148 ModestMainWindowPrivate *priv;
149 priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj);
150 if (priv->widget_factory) {
151 g_object_unref (G_OBJECT(priv->widget_factory));
152 priv->widget_factory = NULL;
155 G_OBJECT_CLASS(parent_class)->finalize (obj);
160 on_menu_about (GtkWidget *widget, gpointer data)
163 const gchar *authors[] = {
164 "Dirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>",
167 about = gtk_about_dialog_new ();
168 gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), PACKAGE_NAME);
169 gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about),PACKAGE_VERSION);
170 gtk_about_dialog_set_copyright (
171 GTK_ABOUT_DIALOG(about),
172 _("Copyright (c) 2006, Nokia Corporation\n"
173 "All rights reserved."));
174 gtk_about_dialog_set_comments ( GTK_ABOUT_DIALOG(about),
175 _("a modest e-mail client\n\n"
176 "design and implementation: Dirk-Jan C. Binnema\n"
177 "contributions from the fine people at KernelConcepts\n\n"
178 "uses the tinymail email framework written by Philip van Hoof"));
179 gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors);
180 gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org");
182 gtk_dialog_run (GTK_DIALOG (about));
183 gtk_widget_destroy(about);
188 on_menu_accounts (ModestMainWindow *self, guint action, GtkWidget *widget)
190 GtkWidget *account_win;
191 ModestMainWindowPrivate *priv;
193 g_return_if_fail (widget);
194 g_return_if_fail (self);
196 priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
197 account_win = modest_account_view_window_new (priv->widget_factory);
199 gtk_window_set_transient_for (GTK_WINDOW(account_win),
202 gtk_widget_show (account_win);
207 on_menu_new_message (ModestMainWindow *self, guint action, GtkWidget *widget)
210 ModestMainWindowPrivate *priv;
212 priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
214 msg_win = modest_edit_msg_window_new (priv->widget_factory,
215 MODEST_EDIT_TYPE_NEW,
217 gtk_widget_show (msg_win);
221 on_menu_reply_forward (ModestMainWindow *self, guint action, GtkWidget *widget)
224 ModestMainWindowPrivate *priv;
225 ModestHeaderView *header_view;
226 TnyList *header_list;
228 gchar *reply_key, *forward_key;
229 ModestMailOperationReplyType reply_type;
230 ModestMailOperationForwardType forward_type;
234 priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
235 conf = modest_tny_platform_factory_get_modest_conf_instance (priv->factory);
237 header_view = modest_widget_factory_get_header_view (priv->widget_factory);
238 header_list = modest_header_view_get_selected_headers (header_view);
240 /* Get reply and forward types */
242 reply_key = g_strdup_printf ("%s/%s", MODEST_CONF_NAMESPACE, MODEST_CONF_REPLY_TYPE);
243 reply_type = modest_conf_get_int (conf, reply_key, &error);
244 if (error || reply_type == 0) {
245 g_warning ("key %s not defined", reply_key);
246 reply_type = MODEST_MAIL_OPERATION_REPLY_TYPE_CITE;
248 g_error_free (error);
254 forward_key = g_strdup_printf ("%s/%s", MODEST_CONF_NAMESPACE, MODEST_CONF_FORWARD_TYPE);
255 forward_type = modest_conf_get_int (conf, forward_key, &error);
256 if (error || forward_type == 0) {
257 g_warning ("key %s not defined", forward_key);
258 forward_type = MODEST_MAIL_OPERATION_FORWARD_TYPE_INLINE;
260 g_error_free (error);
264 g_free (forward_key);
267 TnyHeader *header, *new_header;
269 TnyMsg *msg, *new_msg;
270 ModestEditType edit_type;
271 gchar *from, *email_key;
272 const gchar *account_name;
274 /* We assume that we can only select messages of the
275 same folder and that we reply all of them from the
276 same account. In fact the interface currently only
277 allows single selection */
278 account_name = modest_folder_view_get_selected_account (priv->folder_view);
279 email_key = g_strdup_printf ("%s/%s/%s", MODEST_ACCOUNT_NAMESPACE,
280 account_name, MODEST_ACCOUNT_EMAIL);
281 from = modest_conf_get_string (conf, email_key, NULL);
284 iter = tny_list_create_iterator (header_list);
285 header = TNY_HEADER (tny_iterator_get_current (iter));
286 folder = tny_header_get_folder (header);
289 /* Get msg from header */
290 header = TNY_HEADER (tny_iterator_get_current (iter));
291 msg = tny_folder_get_msg (folder, header, NULL); /* FIXME */
293 /* FIXME: select proper action */
297 modest_mail_operation_create_reply_mail (msg, from, reply_type,
298 MODEST_MAIL_OPERATION_REPLY_MODE_SENDER);
299 edit_type = MODEST_EDIT_TYPE_REPLY;
303 modest_mail_operation_create_reply_mail (msg, from, reply_type,
304 MODEST_MAIL_OPERATION_REPLY_MODE_ALL);
305 edit_type = MODEST_EDIT_TYPE_REPLY;
309 modest_mail_operation_create_forward_mail (msg, from, forward_type);
310 edit_type = MODEST_EDIT_TYPE_FORWARD;
313 g_warning ("unexpected action type: %d", action);
318 new_header = tny_msg_get_header (new_msg);
319 tny_header_set_from (new_header, from);
321 /* Show edit window */
322 msg_win = modest_edit_msg_window_new (priv->widget_factory,
325 gtk_widget_show (msg_win);
327 /* Clean and go on */
328 g_object_unref (new_msg);
330 tny_iterator_next (iter);
332 } while (!tny_iterator_is_done (iter));
336 g_object_unref (G_OBJECT (iter));
337 g_object_unref (G_OBJECT (folder));
342 on_menu_quit (ModestMainWindow *self, guint action, GtkWidget *widget)
345 gtk_widget_destroy (GTK_WIDGET(self));
349 on_menu_delete (ModestMainWindow *self, guint action, GtkWidget *widget)
351 ModestMainWindowPrivate *priv;
352 ModestHeaderView *header_view;
353 TnyList *header_list;
357 priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
359 header_view = modest_widget_factory_get_header_view (priv->widget_factory);
360 header_list = modest_header_view_get_selected_headers (header_view);
363 iter = tny_list_create_iterator (header_list);
364 model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
365 if (GTK_IS_TREE_MODEL_SORT (model))
366 model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (model));
369 ModestMailOperation *mail_op;
371 header = TNY_HEADER (tny_iterator_get_current (iter));
372 /* TODO: thick grain mail operation involving
373 a list of objects. Composite pattern ??? */
374 mail_op = modest_mail_operation_new ();
377 modest_mail_operation_remove_msg (mail_op, header, TRUE);
379 /* Remove from tree model */
380 tny_list_remove (TNY_LIST (model), G_OBJECT (header));
382 g_object_unref (G_OBJECT (mail_op));
383 g_object_unref (header);
384 tny_iterator_next (iter);
386 } while (!tny_iterator_is_done (iter));
391 /* Our menu, an array of GtkItemFactoryEntry structures that defines each menu item */
392 static GtkItemFactoryEntry menu_items[] = {
393 { "/_File", NULL, NULL, 0, "<Branch>", NULL },
394 { "/File/_New", "<control>N", NULL, 0, "<StockItem>", GTK_STOCK_NEW },
395 { "/File/_Open", "<control>O", NULL, 0, "<StockItem>", GTK_STOCK_OPEN },
396 { "/File/_Save", "<control>S", NULL, 0, "<StockItem>", GTK_STOCK_SAVE },
397 { "/File/Save _As", NULL, NULL, 0, "<Item>", NULL },
398 { "/File/sep1", NULL, NULL, 0, "<Separator>", NULL },
399 { "/File/_Quit", "<CTRL>Q", on_menu_quit, 0, "<StockItem>", GTK_STOCK_QUIT },
401 { "/_Edit", NULL, NULL, 0, "<Branch>", NULL },
402 { "/Edit/_Undo", "<CTRL>Z", NULL, 0, "<StockItem>", GTK_STOCK_UNDO },
403 { "/Edit/_Redo", "<shift><CTRL>Z", NULL, 0, "<StockItem>", GTK_STOCK_REDO },
404 { "/File/sep1", NULL, NULL, 0, "<Separator>", NULL },
405 { "/Edit/Cut", "<control>X", NULL, 0, "<StockItem>", GTK_STOCK_CUT },
406 { "/Edit/Copy", "<CTRL>C", NULL, 0, "<StockItem>", GTK_STOCK_COPY },
407 { "/Edit/Paste", NULL, NULL, 0, "<StockItem>", GTK_STOCK_PASTE},
408 { "/Edit/sep1", NULL, NULL, 0, "<Separator>", NULL },
409 { "/Edit/Delete", "<CTRL>Q", NULL, 0, "<Item>" ,NULL},
410 { "/Edit/Select all", "<CTRL>A", NULL, 0, "<Item>" ,NULL},
411 { "/Edit/Deelect all", "<Shift><CTRL>A", NULL, 0, "<Item>" ,NULL},
413 { "/_Actions", NULL, NULL, 0, "<Branch>" ,NULL},
414 { "/Actions/_New Message", NULL, on_menu_new_message, 0, "<Item>",NULL },
415 { "/Actions/_Reply", NULL, on_menu_reply_forward, 1, "<Item>" ,NULL},
416 { "/Actions/_Forward", NULL, on_menu_reply_forward, 3, "<Item>" ,NULL},
417 { "/Actions/_Bounce", NULL, NULL, 0, "<Item>",NULL },
419 { "/_Options", NULL, NULL, 0, "<Branch>" ,NULL},
420 { "/Options/_Accounts", NULL, on_menu_accounts,0, "<Item>" ,NULL},
421 { "/Options/_Contacts", NULL, NULL, 0, "<Item>" ,NULL },
424 { "/_Help", NULL, NULL, 0, "<Branch>" ,NULL},
425 { "/_Help/About", NULL, on_menu_about, 0, "<StockItem>", GTK_STOCK_ABOUT},
428 static gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
432 menubar_new (ModestMainWindow *self)
434 GtkItemFactory *item_factory;
435 GtkAccelGroup *accel_group;
437 /* Make an accelerator group (shortcut keys) */
438 accel_group = gtk_accel_group_new ();
440 /* Make an ItemFactory (that makes a menubar) */
441 item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>",
444 /* This function generates the menu items. Pass the item factory,
445 the number of items in the array, the array itself, and any
446 callback data for the the menu items. */
447 gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, self);
449 ///* Attach the new accelerator group to the window. */
450 gtk_window_add_accel_group (GTK_WINDOW (self), accel_group);
452 /* Finally, return the actual menu bar created by the item factory. */
453 return gtk_item_factory_get_widget (item_factory, "<main>");
459 static ModestHeaderView*
460 header_view_new (ModestMainWindow *self)
463 GList *columns = NULL;
464 ModestHeaderView *header_view;
465 ModestMainWindowPrivate *priv;
466 ModestHeaderViewColumn cols[] = {
467 MODEST_HEADER_VIEW_COLUMN_MSGTYPE,
468 MODEST_HEADER_VIEW_COLUMN_ATTACH,
469 /* MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER, */
470 MODEST_HEADER_VIEW_COLUMN_FROM,
471 MODEST_HEADER_VIEW_COLUMN_SUBJECT,
472 MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE
474 priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
476 for (i = 0 ; i != sizeof(cols) / sizeof(ModestHeaderViewColumn); ++i)
477 columns = g_list_append (columns, GINT_TO_POINTER(cols[i]));
479 header_view = modest_widget_factory_get_header_view (priv->widget_factory);
480 modest_header_view_set_columns (header_view, columns);
481 g_list_free (columns);
487 on_toolbar_button_clicked (ModestToolbar *toolbar, ModestToolbarButton button_id,
488 ModestMainWindow *self)
490 GtkTreeSelection *sel;
493 ModestMainWindowPrivate *priv;
495 priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
498 case MODEST_TOOLBAR_BUTTON_NEW_MAIL:
499 on_menu_new_message (self, 0, NULL);
501 case MODEST_TOOLBAR_BUTTON_REPLY:
502 on_menu_reply_forward (self, 1, NULL);
504 case MODEST_TOOLBAR_BUTTON_REPLY_ALL:
505 on_menu_reply_forward (self, 2, NULL);
507 case MODEST_TOOLBAR_BUTTON_FORWARD:
508 on_menu_reply_forward (self, 3, NULL);
510 case MODEST_TOOLBAR_BUTTON_SEND_RECEIVE:
513 case MODEST_TOOLBAR_BUTTON_NEXT:
514 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(priv->header_view));
516 gtk_tree_selection_get_selected (sel, &model, &iter);
517 gtk_tree_model_iter_next (model, &iter);
518 gtk_tree_selection_select_iter (sel, &iter);
521 case MODEST_TOOLBAR_BUTTON_PREV:
523 /* gtk_tree_selection_get_selected (sel, &model, &iter); */
524 /* gtk_tree_model_iter_prev (model, &iter); */
525 /* gtk_tree_selection_select_iter (sel, &iter); */
529 case MODEST_TOOLBAR_BUTTON_DELETE:
530 on_menu_delete (self, 0, GTK_WIDGET (toolbar));
534 g_printerr ("modest: key %d pressed\n", button_id);
538 static ModestToolbar*
539 toolbar_new (ModestMainWindow *self)
542 ModestToolbar *toolbar;
543 GSList *buttons = NULL;
544 ModestMainWindowPrivate *priv;
546 ModestToolbarButton button_ids[] = {
547 MODEST_TOOLBAR_BUTTON_NEW_MAIL,
548 MODEST_TOOLBAR_BUTTON_REPLY,
549 MODEST_TOOLBAR_BUTTON_REPLY_ALL,
550 MODEST_TOOLBAR_BUTTON_FORWARD,
551 MODEST_TOOLBAR_SEPARATOR,
552 MODEST_TOOLBAR_BUTTON_SEND_RECEIVE,
553 MODEST_TOOLBAR_SEPARATOR,
554 MODEST_TOOLBAR_BUTTON_PREV,
555 MODEST_TOOLBAR_BUTTON_NEXT,
556 MODEST_TOOLBAR_SEPARATOR,
557 MODEST_TOOLBAR_BUTTON_DELETE
560 priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
562 for (i = 0 ; i != sizeof(button_ids) / sizeof(ModestToolbarButton); ++i)
563 buttons = g_slist_append (buttons, GINT_TO_POINTER(button_ids[i]));
565 toolbar = modest_widget_factory_get_main_toolbar (priv->widget_factory, buttons);
566 g_slist_free (buttons);
568 g_signal_connect (G_OBJECT(toolbar), "button_clicked",
569 G_CALLBACK(on_toolbar_button_clicked), self);
577 restore_sizes (ModestMainWindow *self)
580 ModestMainWindowPrivate *priv;
582 priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
583 conf = modest_tny_platform_factory_get_modest_conf_instance (priv->factory);
585 modest_widget_memory_restore_settings (conf,GTK_WIDGET(self),
586 "modest-main-window");
587 modest_widget_memory_restore_settings (conf, GTK_WIDGET(priv->folder_paned),
588 "modest-folder-paned");
589 modest_widget_memory_restore_settings (conf, GTK_WIDGET(priv->msg_paned),
591 modest_widget_memory_restore_settings (conf, GTK_WIDGET(priv->main_paned),
592 "modest-main-paned");
593 modest_widget_memory_restore_settings (conf, GTK_WIDGET(priv->header_view),
594 "modest-header-view");
600 save_sizes (ModestMainWindow *self)
602 ModestMainWindowPrivate *priv;
605 priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
606 conf = modest_tny_platform_factory_get_modest_conf_instance (priv->factory);
608 modest_widget_memory_save_settings (conf,GTK_WIDGET(self),
609 "modest-main-window");
610 modest_widget_memory_save_settings (conf, GTK_WIDGET(priv->folder_paned),
611 "modest-folder-paned");
612 modest_widget_memory_save_settings (conf, GTK_WIDGET(priv->msg_paned),
614 modest_widget_memory_save_settings (conf, GTK_WIDGET(priv->main_paned),
615 "modest-main-paned");
616 modest_widget_memory_save_settings (conf, GTK_WIDGET(priv->header_view),
617 "modest-header-view");
621 wrapped_in_scrolled_window (GtkWidget *widget, gboolean needs_viewport)
625 win = gtk_scrolled_window_new (NULL, NULL);
626 gtk_scrolled_window_set_policy
627 (GTK_SCROLLED_WINDOW (win),GTK_POLICY_NEVER,
628 GTK_POLICY_AUTOMATIC);
631 gtk_scrolled_window_add_with_viewport
632 (GTK_SCROLLED_WINDOW(win), widget);
634 gtk_container_add (GTK_CONTAINER(win),
642 on_delete_event (GtkWidget *widget, GdkEvent *event, ModestMainWindow *self)
651 GtkWidget *favorites;
653 GtkTreeViewColumn *col;
655 store = gtk_tree_store_new (1, G_TYPE_STRING);
656 favorites = gtk_tree_view_new_with_model (GTK_TREE_MODEL(store));
657 col = gtk_tree_view_column_new_with_attributes (_("Favorites"),
658 gtk_cell_renderer_text_new(),
661 gtk_tree_view_append_column (GTK_TREE_VIEW(favorites), col);
662 gtk_widget_show_all (favorites);
664 g_object_unref (G_OBJECT(store));
672 modest_main_window_new (ModestWidgetFactory *widget_factory)
675 ModestMainWindowPrivate *priv;
677 GtkWidget *main_vbox;
678 GtkWidget *status_hbox;
679 GtkWidget *header_win, *folder_win, *favorites_win;
681 g_return_val_if_fail (widget_factory, NULL);
683 obj = g_object_new(MODEST_TYPE_MAIN_WINDOW, NULL);
684 priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj);
686 g_object_ref (widget_factory);
687 priv->widget_factory = widget_factory;
689 /* widgets from factory */
690 priv->folder_view = modest_widget_factory_get_folder_view (widget_factory);
691 priv->header_view = header_view_new (MODEST_MAIN_WINDOW(obj));
692 priv->msg_preview = modest_widget_factory_get_msg_preview (widget_factory);
694 folder_win = wrapped_in_scrolled_window (GTK_WIDGET(priv->folder_view),
696 header_win = wrapped_in_scrolled_window (GTK_WIDGET(priv->header_view),
698 favorites_win = wrapped_in_scrolled_window (favorites_view(),FALSE);
701 priv->menubar = menubar_new (MODEST_MAIN_WINDOW(obj));
702 priv->toolbar = GTK_WIDGET(toolbar_new (MODEST_MAIN_WINDOW(obj)));
705 priv->folder_paned = gtk_vpaned_new ();
706 priv->msg_paned = gtk_vpaned_new ();
707 priv->main_paned = gtk_hpaned_new ();
708 gtk_paned_add1 (GTK_PANED(priv->main_paned), priv->folder_paned);
709 gtk_paned_add2 (GTK_PANED(priv->main_paned), priv->msg_paned);
710 gtk_paned_add1 (GTK_PANED(priv->folder_paned), favorites_win);
711 gtk_paned_add2 (GTK_PANED(priv->folder_paned), folder_win);
712 gtk_paned_add1 (GTK_PANED(priv->msg_paned), header_win);
713 gtk_paned_add2 (GTK_PANED(priv->msg_paned), GTK_WIDGET(priv->msg_preview));
715 gtk_widget_show (GTK_WIDGET(priv->header_view));
716 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(priv->header_view));
719 /* status bar / progress */
720 status_hbox = gtk_hbox_new (FALSE, 0);
721 gtk_box_pack_start (GTK_BOX(status_hbox),
722 modest_widget_factory_get_folder_info_label (widget_factory),
724 gtk_box_pack_start (GTK_BOX(status_hbox),
725 modest_widget_factory_get_status_bar(widget_factory),
727 gtk_box_pack_start (GTK_BOX(status_hbox),
728 modest_widget_factory_get_progress_bar(widget_factory),
730 gtk_box_pack_start (GTK_BOX(status_hbox),
731 modest_widget_factory_get_online_toggle(widget_factory),
734 /* putting it all together... */
735 main_vbox = gtk_vbox_new (FALSE, 6);
736 gtk_box_pack_start (GTK_BOX(main_vbox), priv->menubar, FALSE, FALSE, 0);
737 gtk_box_pack_start (GTK_BOX(main_vbox), priv->toolbar, FALSE, FALSE, 0);
738 gtk_box_pack_start (GTK_BOX(main_vbox), priv->main_paned, TRUE, TRUE,0);
739 gtk_box_pack_start (GTK_BOX(main_vbox), status_hbox, FALSE, FALSE, 0);
741 gtk_container_add (GTK_CONTAINER(obj), main_vbox);
742 restore_sizes (MODEST_MAIN_WINDOW(obj));
744 gtk_window_set_title (GTK_WINDOW(obj), "Modest");
745 gtk_window_set_icon (GTK_WINDOW(obj),
746 modest_icon_factory_get_icon (MODEST_APP_ICON));
748 gtk_widget_show_all (main_vbox);
750 g_signal_connect (G_OBJECT(obj), "delete-event",
751 G_CALLBACK(on_delete_event), obj);
753 return GTK_WIDGET(obj);