X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fgtk%2Fmodest-main-window.c;h=00323a82a70b48f203c72b7cf983f9395b6c3133;hb=68aa241807636e914b400e4510c8f0fadef623cb;hp=1719341bfb575ed88f1d2b4b7b41b2d260f599fc;hpb=a68987f6b14adab7424dcd824dcacd4382687c73;p=modest diff --git a/src/gtk/modest-main-window.c b/src/gtk/modest-main-window.c index 1719341..00323a8 100644 --- a/src/gtk/modest-main-window.c +++ b/src/gtk/modest-main-window.c @@ -1,61 +1,58 @@ -/* modest-main-window.c */ - -/* insert (c)/licensing information) */ -#include -#include - - -#ifdef HAVE_CONFIG_H -#include -#endif /*HAVE_CONFIG_H*/ +/* Copyright (c) 2006, Nokia Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Nokia Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ #include -#include "modest-main-window.h" - +#include +#include +#include +#include -#include "../modest-tny-account-store.h" -#include "../modest-tny-folder-tree-view.h" -#include "../modest-tny-header-tree-view.h" -#include "../modest-tny-msg-view.h" - +#include +#include "modest-main-window.h" +#include "modest-account-view-window.h" +#include "modest-account-mgr.h" +#include "modest-conf.h" +#include "modest-edit-msg-window.h" +#include "modest-icon-names.h" +#include "modest-tny-platform-factory.h" +#include "modest-tny-msg-actions.h" +#include "modest-mail-operation.h" /* 'private'/'protected' functions */ -static void modest_main_window_class_init (ModestMainWindowClass *klass); -static void modest_main_window_init (ModestMainWindow *obj, - ModestConf *conf, - ModestAccountMgr *modest_acc_mgr); -static void modest_main_window_finalize (GObject *obj); - - -static GtkWidget* modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr); -static GtkWidget* modest_main_window_header_tree (TnyMsgFolderIface *folder); - -static GtkWidget* modest_main_window_toolbar (void); -static GtkWidget* modest_main_window_favorite_folder_list (void); -static GtkWidget* modest_main_window_message_preview (void); -static GtkWidget * modest_main_window_get_ui (ModestTnyFolderTreeView *folder_view, - ModestTnyHeaderTreeView *header_view, - ModestTnyMsgView *message_view); -static void on_newmail_clicked (GtkToolButton *button, gpointer data); -static void on_refresh_clicked (GtkToolButton *button, gpointer data); -static void on_reply_clicked (GtkToolButton *button, gpointer data); -static void on_forward_clicked (GtkToolButton *button, gpointer data); -static void on_delmail_clicked (GtkToolButton *button, gpointer data); -static void on_cut_clicked (GtkToolButton *button, gpointer data); -static void on_copy_clicked (GtkToolButton *button, gpointer data); -static void on_paste_clicked (GtkToolButton *button, gpointer data); -static void on_quit_clicked (GtkToolButton *button, gpointer data); - -static void on_folder_clicked (ModestTnyFolderTreeView *self, - TnyMsgFolderIface *folder, - gpointer data); -static void on_message_clicked (ModestTnyFolderTreeView *folder_tree, - TnyMsgIface *message, - gpointer data); - +static void modest_main_window_class_init (ModestMainWindowClass *klass); +static void modest_main_window_init (ModestMainWindow *obj); +static void modest_main_window_finalize (GObject *obj); +static void restore_sizes (ModestMainWindow *self); +static void save_sizes (ModestMainWindow *self); /* list my signals */ enum { @@ -67,18 +64,27 @@ enum { typedef struct _ModestMainWindowPrivate ModestMainWindowPrivate; struct _ModestMainWindowPrivate { - ModestConf *modest_conf; - ModestAccountMgr *modest_acc_mgr; + GtkWidget *toolbar; + GtkWidget *menubar; - ModestTnyFolderTreeView *folder_view; - ModestTnyHeaderTreeView *header_view; - ModestTnyMsgView *message_view; + GtkWidget *folder_paned; + GtkWidget *msg_paned; + GtkWidget *main_paned; + + ModestWidgetFactory *widget_factory; + TnyPlatformFactory *factory; + + ModestHeaderView *header_view; + ModestFolderView *folder_view; + ModestMsgView *msg_preview; }; + + #define MODEST_MAIN_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_MAIN_WINDOW, \ ModestMainWindowPrivate)) /* globals */ -static GtkWidgetClass *parent_class = NULL; +static GtkWindowClass *parent_class = NULL; /* uncomment the following if you have defined any signals */ /* static guint signals[LAST_SIGNAL] = {0}; */ @@ -98,6 +104,7 @@ modest_main_window_get_type (void) sizeof(ModestMainWindow), 1, /* n_preallocs */ (GInstanceInitFunc) modest_main_window_init, + NULL }; my_type = g_type_register_static (GTK_TYPE_WINDOW, "ModestMainWindow", @@ -125,391 +132,598 @@ modest_main_window_class_init (ModestMainWindowClass *klass) /* etc. */ } -static GtkWidget* -wrapped_in_scrolled_win (GtkWidget *child) +static void +modest_main_window_init (ModestMainWindow *obj) { - GtkWidget *scrolled_win; - - scrolled_win = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scrolled_win), - GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scrolled_win), - GTK_SHADOW_IN); - gtk_container_add (GTK_CONTAINER(scrolled_win), child); - return scrolled_win; -} + ModestMainWindowPrivate *priv; + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj); + priv->factory = modest_tny_platform_factory_get_instance (); +} static void -modest_main_window_init (ModestMainWindow *obj, ModestConf *modest_conf, - ModestAccountMgr *modest_acc_mgr) +modest_main_window_finalize (GObject *obj) { -} - - + ModestMainWindowPrivate *priv; + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj); + if (priv->widget_factory) { + g_object_unref (G_OBJECT(priv->widget_factory)); + priv->widget_factory = NULL; + } + G_OBJECT_CLASS(parent_class)->finalize (obj); +} static void -modest_main_window_finalize (GObject *obj) +on_menu_about (GtkWidget *widget, gpointer data) { - ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE (obj); - - priv->modest_conf = NULL; - priv->modest_acc_mgr = NULL; + GtkWidget *about; + const gchar *authors[] = { + "Dirk-Jan C. Binnema ", + NULL + }; + about = gtk_about_dialog_new (); + gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), PACKAGE_NAME); + gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about),PACKAGE_VERSION); + gtk_about_dialog_set_copyright ( + GTK_ABOUT_DIALOG(about), + _("Copyright (c) 2006, Nokia Corporation\n" + "All rights reserved.")); + gtk_about_dialog_set_comments ( GTK_ABOUT_DIALOG(about), + _("a modest e-mail client\n\n" + "design and implementation: Dirk-Jan C. Binnema\n" + "contributions from the fine people at KernelConcepts and Igalia\n" + "uses the tinymail email framework written by Philip van Hoof")); + gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors); + gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org"); + + gtk_dialog_run (GTK_DIALOG (about)); + gtk_widget_destroy(about); } - -GtkWidget* -modest_main_window_new (ModestConf *modest_conf, ModestAccountMgr *modest_acc_mgr) +static void +on_menu_accounts (ModestMainWindow *self, guint action, GtkWidget *widget) { - - GtkWidget *ui; - ModestMainWindow *self = - MODEST_MAIN_WINDOW(g_object_new(MODEST_TYPE_MAIN_WINDOW, NULL)); - ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self); - - priv->modest_conf = modest_conf; - priv->modest_acc_mgr = modest_acc_mgr; - - priv->header_view = MODEST_TNY_HEADER_TREE_VIEW(modest_main_window_header_tree (NULL)); - g_signal_connect (priv->header_view, "message_selected", - G_CALLBACK(on_message_clicked), - self); - - priv->folder_view = MODEST_TNY_FOLDER_TREE_VIEW(modest_main_window_folder_tree - (modest_acc_mgr)); - g_signal_connect (priv->folder_view, "folder_selected", - G_CALLBACK(on_folder_clicked), - self); + GtkWidget *account_win; + ModestMainWindowPrivate *priv; - priv->message_view = MODEST_TNY_MSG_VIEW (modest_main_window_message_preview()); + g_return_if_fail (widget); + g_return_if_fail (self); - ui = modest_main_window_get_ui(priv->folder_view, - priv->header_view, - priv->message_view); - gtk_container_add (GTK_CONTAINER(self), ui); + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + account_win = modest_account_view_window_new (priv->widget_factory); - return GTK_WIDGET(self); + gtk_window_set_transient_for (GTK_WINDOW(account_win), + GTK_WINDOW(self)); + + gtk_widget_show (account_win); } - +static void +on_menu_new_message (ModestMainWindow *self, guint action, GtkWidget *widget) +{ + GtkWidget *msg_win; + ModestMainWindowPrivate *priv; + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); -static GtkWidget * -modest_main_window_get_ui (ModestTnyFolderTreeView *folder_view, - ModestTnyHeaderTreeView *header_view, - ModestTnyMsgView *message_view) + msg_win = modest_edit_msg_window_new (priv->widget_factory, + MODEST_EDIT_TYPE_NEW, + NULL); + gtk_widget_show (msg_win); +} +static void +on_menu_reply_forward (ModestMainWindow *self, guint action, GtkWidget *widget) { - GtkWidget *vbox; - GtkWidget *msg_vpaned,*folder_vpaned, *folder_msg_hpaned; - GtkWidget *toolbar, *fav_folder_list; - GtkWidget *status_bar; - GtkWidget *swin_msg_list,*swin_folder_list, *swin_favfolder_list; - GtkWidget *folder_label, *message_label; - GtkWidget *folder_vbox, *message_vbox; + GtkWidget *msg_win; + ModestMainWindowPrivate *priv; + ModestHeaderView *header_view; + TnyList *header_list; + TnyIterator *iter; + gchar *reply_key, *forward_key; + ModestMailOperationReplyType reply_type; + ModestMailOperationForwardType forward_type; + ModestConf *conf; + GError *error; + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + conf = modest_tny_platform_factory_get_modest_conf_instance (priv->factory); + + header_view = modest_widget_factory_get_header_view (priv->widget_factory); + header_list = modest_header_view_get_selected_headers (header_view); + + /* Get reply and forward types */ + error = NULL; + reply_key = g_strdup_printf ("%s/%s", MODEST_CONF_NAMESPACE, MODEST_CONF_REPLY_TYPE); + reply_type = modest_conf_get_int (conf, reply_key, &error); + if (error || reply_type == 0) { + g_warning ("key %s not defined", reply_key); + reply_type = MODEST_MAIL_OPERATION_REPLY_TYPE_CITE; + if (error) { + g_error_free (error); + error = NULL; + } + } + g_free (reply_key); - toolbar = modest_main_window_toolbar (); - fav_folder_list = modest_main_window_favorite_folder_list (); - vbox = gtk_vbox_new (FALSE,2); - - folder_vbox = gtk_vbox_new (FALSE,2); - message_vbox = gtk_vbox_new (FALSE,2); - - msg_vpaned = gtk_vpaned_new (); - folder_vpaned = gtk_vpaned_new (); - folder_msg_hpaned = gtk_hpaned_new (); + forward_key = g_strdup_printf ("%s/%s", MODEST_CONF_NAMESPACE, MODEST_CONF_FORWARD_TYPE); + forward_type = modest_conf_get_int (conf, forward_key, &error); + if (error || forward_type == 0) { + g_warning ("key %s not defined", forward_key); + forward_type = MODEST_MAIL_OPERATION_FORWARD_TYPE_INLINE; + if (error) { + g_error_free (error); + error = NULL; + } + } + g_free (forward_key); - swin_msg_list = wrapped_in_scrolled_win (GTK_WIDGET(header_view)); - swin_folder_list = wrapped_in_scrolled_win (GTK_WIDGET(folder_view)); - swin_favfolder_list = wrapped_in_scrolled_win (fav_folder_list); + if (header_list) { + TnyHeader *header, *new_header; + TnyFolder *folder; + TnyMsg *msg, *new_msg; + ModestEditType edit_type; + gchar *from, *email_key; + const gchar *account_name; + + /* We assume that we can only select messages of the + same folder and that we reply all of them from the + same account. In fact the interface currently only + allows single selection */ + account_name = modest_folder_view_get_selected_account (priv->folder_view); + email_key = g_strdup_printf ("%s/%s/%s", MODEST_ACCOUNT_NAMESPACE, + account_name, MODEST_ACCOUNT_EMAIL); + from = modest_conf_get_string (conf, email_key, NULL); + g_free (email_key); + + iter = tny_list_create_iterator (header_list); + header = TNY_HEADER (tny_iterator_get_current (iter)); + folder = tny_header_get_folder (header); + + do { + /* Get msg from header */ + header = TNY_HEADER (tny_iterator_get_current (iter)); + msg = tny_folder_get_msg (folder, header, NULL); /* FIXME */ + + /* FIXME: select proper action */ + switch (action) { + case 1: + new_msg = + modest_mail_operation_create_reply_mail (msg, from, reply_type, + MODEST_MAIL_OPERATION_REPLY_MODE_SENDER); + edit_type = MODEST_EDIT_TYPE_REPLY; + break; + case 2: + new_msg = + modest_mail_operation_create_reply_mail (msg, from, reply_type, + MODEST_MAIL_OPERATION_REPLY_MODE_ALL); + edit_type = MODEST_EDIT_TYPE_REPLY; + break; + case 3: + new_msg = + modest_mail_operation_create_forward_mail (msg, from, forward_type); + edit_type = MODEST_EDIT_TYPE_FORWARD; + break; + default: + g_warning ("unexpected action type: %d", action); + } + + if (new_msg) { + /* Set from */ + new_header = tny_msg_get_header (new_msg); + tny_header_set_from (new_header, from); + + /* Show edit window */ + msg_win = modest_edit_msg_window_new (priv->widget_factory, + edit_type, + new_msg); + gtk_widget_show (msg_win); + + /* Clean and go on */ + g_object_unref (new_msg); + } + tny_iterator_next (iter); + + } while (!tny_iterator_is_done (iter)); + + /* Clean */ + g_free (from); + g_object_unref (G_OBJECT (iter)); + g_object_unref (G_OBJECT (folder)); + } +} - folder_label = gtk_label_new (_("Folders")); - gtk_label_set_justify (GTK_LABEL(folder_label), GTK_JUSTIFY_LEFT); - - gtk_paned_add1 (GTK_PANED(folder_vpaned), swin_favfolder_list); - gtk_paned_add2 (GTK_PANED(folder_vpaned), swin_folder_list); - gtk_box_pack_start (GTK_BOX(folder_vbox), folder_label, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX(folder_vbox), folder_vpaned, TRUE, TRUE, 0); - - message_label= gtk_label_new (_("Inbox")); - gtk_label_set_justify (GTK_LABEL(message_label), GTK_JUSTIFY_LEFT); - gtk_paned_add1 (GTK_PANED(msg_vpaned), swin_msg_list); - gtk_paned_add2 (GTK_PANED(msg_vpaned), GTK_WIDGET(message_view)); - gtk_box_pack_start (GTK_BOX(message_vbox), message_label, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX(message_vbox), msg_vpaned, TRUE, TRUE, 0); +static void +on_menu_quit (ModestMainWindow *self, guint action, GtkWidget *widget) +{ + save_sizes (self); + gtk_widget_destroy (GTK_WIDGET(self)); +} - - gtk_paned_add1 (GTK_PANED(folder_msg_hpaned), folder_vbox); - gtk_paned_add2 (GTK_PANED(folder_msg_hpaned), message_vbox); +static void +on_menu_delete (ModestMainWindow *self, guint action, GtkWidget *widget) +{ + ModestMainWindowPrivate *priv; + ModestHeaderView *header_view; + TnyList *header_list; + TnyIterator *iter; + GtkTreeModel *model; - gtk_box_pack_start (GTK_BOX(vbox), toolbar, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX(vbox), folder_msg_hpaned, TRUE, TRUE, 0); + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - status_bar = gtk_statusbar_new (); - gtk_box_pack_start (GTK_BOX(vbox), status_bar, FALSE, FALSE, 0); + header_view = modest_widget_factory_get_header_view (priv->widget_factory); + header_list = modest_header_view_get_selected_headers (header_view); - gtk_widget_show_all (GTK_WIDGET(vbox)); - return vbox; + if (header_list) { + iter = tny_list_create_iterator (header_list); + model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)); + if (GTK_IS_TREE_MODEL_SORT (model)) + model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (model)); + do { + TnyHeader *header; + ModestMailOperation *mail_op; + + header = TNY_HEADER (tny_iterator_get_current (iter)); + /* TODO: thick grain mail operation involving + a list of objects. Composite pattern ??? */ + mail_op = modest_mail_operation_new (); + + /* Move to trash */ + modest_mail_operation_remove_msg (mail_op, header, TRUE); + + /* Remove from tree model */ + tny_list_remove (TNY_LIST (model), G_OBJECT (header)); + + g_object_unref (G_OBJECT (mail_op)); + g_object_unref (header); + tny_iterator_next (iter); + + } while (!tny_iterator_is_done (iter)); + } } - -static GtkWidget* -modest_main_window_header_tree (TnyMsgFolderIface *folder) -{ - GtkWidget *header_tree; +/* Our menu, an array of GtkItemFactoryEntry structures that defines each menu item */ +static GtkItemFactoryEntry menu_items[] = { + { "/_File", NULL, NULL, 0, "", NULL }, + { "/File/_New", "N", NULL, 0, "", GTK_STOCK_NEW }, + { "/File/_Open", "O", NULL, 0, "", GTK_STOCK_OPEN }, + { "/File/_Save", "S", NULL, 0, "", GTK_STOCK_SAVE }, + { "/File/Save _As", NULL, NULL, 0, "", NULL }, + { "/File/sep1", NULL, NULL, 0, "", NULL }, + { "/File/_Quit", "Q", on_menu_quit, 0, "", GTK_STOCK_QUIT }, + + { "/_Edit", NULL, NULL, 0, "", NULL }, + { "/Edit/_Undo", "Z", NULL, 0, "", GTK_STOCK_UNDO }, + { "/Edit/_Redo", "Z", NULL, 0, "", GTK_STOCK_REDO }, + { "/File/sep1", NULL, NULL, 0, "", NULL }, + { "/Edit/Cut", "X", NULL, 0, "", GTK_STOCK_CUT }, + { "/Edit/Copy", "C", NULL, 0, "", GTK_STOCK_COPY }, + { "/Edit/Paste", NULL, NULL, 0, "", GTK_STOCK_PASTE}, + { "/Edit/sep1", NULL, NULL, 0, "", NULL }, + { "/Edit/Delete", "Q", NULL, 0, "" ,NULL}, + { "/Edit/Select all", "A", NULL, 0, "" ,NULL}, + { "/Edit/Deelect all", "A", NULL, 0, "" ,NULL}, + + { "/_Actions", NULL, NULL, 0, "" ,NULL}, + { "/Actions/_New Message", NULL, on_menu_new_message, 0, "",NULL }, + { "/Actions/_Reply", NULL, on_menu_reply_forward, 1, "" ,NULL}, + { "/Actions/_Forward", NULL, on_menu_reply_forward, 3, "" ,NULL}, + { "/Actions/_Bounce", NULL, NULL, 0, "",NULL }, - header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder)); - if (!header_tree) { - g_warning ("could not create header tree"); - return NULL; - } + { "/_Options", NULL, NULL, 0, "" ,NULL}, + { "/Options/_Accounts", NULL, on_menu_accounts,0, "" ,NULL}, + { "/Options/_Contacts", NULL, NULL, 0, "" ,NULL }, - return GTK_WIDGET(header_tree); -} + { "/_Help", NULL, NULL, 0, "" ,NULL}, + { "/_Help/About", NULL, on_menu_about, 0, "", GTK_STOCK_ABOUT}, +}; +static gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]); -static GtkWidget* -modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr) + +static GtkWidget * +menubar_new (ModestMainWindow *self) { - GtkTreeViewColumn *column; - GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); - GtkWidget *folder_tree; - TnyAccountStoreIface *account_store_iface = - TNY_ACCOUNT_STORE_IFACE(modest_tny_account_store_new (modest_acc_mgr)); - if (!account_store_iface) { - g_warning ("could not initialze ModestTnyAccountStore"); - return NULL; - } + GtkItemFactory *item_factory; + GtkAccelGroup *accel_group; - folder_tree = modest_tny_folder_tree_view_new (account_store_iface); - if (!folder_tree) { - g_warning ("could not create folder list"); - return NULL; - } + /* Make an accelerator group (shortcut keys) */ + accel_group = gtk_accel_group_new (); + + /* Make an ItemFactory (that makes a menubar) */ + item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "
", + accel_group); + + /* This function generates the menu items. Pass the item factory, + the number of items in the array, the array itself, and any + callback data for the the menu items. */ + gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, self); + + ///* Attach the new accelerator group to the window. */ + gtk_window_add_accel_group (GTK_WINDOW (self), accel_group); + + /* Finally, return the actual menu bar created by the item factory. */ + return gtk_item_factory_get_widget (item_factory, "
"); +} + - column = gtk_tree_view_column_new_with_attributes(_("All Mail Folders"), - renderer,"text", - TNY_ACCOUNT_TREE_MODEL_NAME_COLUMN, - NULL); - gtk_tree_view_column_set_resizable (column, TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW(folder_tree), column); - column = gtk_tree_view_column_new_with_attributes(_("Unread"), - renderer, "text", - TNY_ACCOUNT_TREE_MODEL_UNREAD_COLUMN, - NULL); - gtk_tree_view_column_set_resizable (column, TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW(folder_tree), column); +static ModestHeaderView* +header_view_new (ModestMainWindow *self) +{ + int i; + GList *columns = NULL; + ModestHeaderView *header_view; + ModestMainWindowPrivate *priv; + ModestHeaderViewColumn cols[] = { + MODEST_HEADER_VIEW_COLUMN_MSGTYPE, + MODEST_HEADER_VIEW_COLUMN_ATTACH, +/* MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER, */ + MODEST_HEADER_VIEW_COLUMN_FROM, + MODEST_HEADER_VIEW_COLUMN_SUBJECT, + MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE + }; + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(folder_tree), TRUE); - gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(folder_tree), TRUE); + for (i = 0 ; i != sizeof(cols) / sizeof(ModestHeaderViewColumn); ++i) + columns = g_list_append (columns, GINT_TO_POINTER(cols[i])); - return folder_tree; -} + header_view = modest_widget_factory_get_header_view (priv->widget_factory); + modest_header_view_set_columns (header_view, columns); + g_list_free (columns); + return header_view; +} -static GtkWidget* -modest_main_window_favorite_folder_list (void) +static void +on_toolbar_button_clicked (ModestToolbar *toolbar, ModestToolbarButton button_id, + ModestMainWindow *self) { - GtkWidget *folder_list; - GtkListStore *folder_store; + GtkTreeSelection *sel; GtkTreeIter iter; - GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); + GtkTreeModel *model; + ModestMainWindowPrivate *priv; - folder_store = gtk_list_store_new (1, G_TYPE_STRING); - folder_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL(folder_store)); + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - renderer = gtk_cell_renderer_text_new(); - - gtk_tree_view_insert_column (GTK_TREE_VIEW(folder_list), - gtk_tree_view_column_new_with_attributes(_("Favorite Folders"), - renderer, - "text", 0, - NULL), - 0); - gtk_list_store_insert_with_values (GTK_LIST_STORE(folder_store), - &iter, -1, 0, _("Stuff"), -1); - return folder_list; -} + switch (button_id) { + case MODEST_TOOLBAR_BUTTON_NEW_MAIL: + on_menu_new_message (self, 0, NULL); + break; + case MODEST_TOOLBAR_BUTTON_REPLY: + on_menu_reply_forward (self, 1, NULL); + break; + case MODEST_TOOLBAR_BUTTON_REPLY_ALL: + on_menu_reply_forward (self, 2, NULL); + break; + case MODEST_TOOLBAR_BUTTON_FORWARD: + on_menu_reply_forward (self, 3, NULL); + break; + case MODEST_TOOLBAR_BUTTON_SEND_RECEIVE: + + case MODEST_TOOLBAR_BUTTON_NEXT: + sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(priv->header_view)); + if (sel) { + gtk_tree_selection_get_selected (sel, &model, &iter); + gtk_tree_model_iter_next (model, &iter); + gtk_tree_selection_select_iter (sel, &iter); + } + + case MODEST_TOOLBAR_BUTTON_PREV: + /* if (sel) { */ +/* gtk_tree_selection_get_selected (sel, &model, &iter); */ +/* gtk_tree_model_iter_prev (model, &iter); */ +/* gtk_tree_selection_select_iter (sel, &iter); */ +/* } */ + + break; + case MODEST_TOOLBAR_BUTTON_DELETE: + on_menu_delete (self, 0, GTK_WIDGET (toolbar)); + break; + + default: + g_printerr ("modest: key %d pressed\n", button_id); + } +} -static GtkWidget* -modest_main_window_toolbar (void) +static ModestToolbar* +toolbar_new (ModestMainWindow *self) { - GtkWidget *toolbar; - GtkToolItem *newmail, *refresh, *reply, *forward, - *cut, *copy, *paste, *delmail, *quit; - - gpointer modest_ui = NULL; /* FIXME */ + int i; + ModestToolbar *toolbar; + GSList *buttons = NULL; + ModestMainWindowPrivate *priv; + + ModestToolbarButton button_ids[] = { + MODEST_TOOLBAR_BUTTON_NEW_MAIL, + MODEST_TOOLBAR_BUTTON_REPLY, + MODEST_TOOLBAR_BUTTON_REPLY_ALL, + MODEST_TOOLBAR_BUTTON_FORWARD, + MODEST_TOOLBAR_SEPARATOR, + MODEST_TOOLBAR_BUTTON_SEND_RECEIVE, + MODEST_TOOLBAR_SEPARATOR, + MODEST_TOOLBAR_BUTTON_PREV, + MODEST_TOOLBAR_BUTTON_NEXT, + MODEST_TOOLBAR_SEPARATOR, + MODEST_TOOLBAR_BUTTON_DELETE + }; - toolbar = gtk_toolbar_new (); - - newmail = gtk_tool_button_new_from_stock (GTK_STOCK_NEW); - delmail = gtk_tool_button_new_from_stock (GTK_STOCK_DELETE); + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - reply = gtk_tool_button_new_from_stock (GTK_STOCK_MEDIA_PLAY); - forward = gtk_tool_button_new_from_stock (GTK_STOCK_MEDIA_FORWARD); - - refresh = gtk_tool_button_new_from_stock (GTK_STOCK_REFRESH); - - cut = gtk_tool_button_new_from_stock (GTK_STOCK_CUT); - copy = gtk_tool_button_new_from_stock (GTK_STOCK_COPY); - paste = gtk_tool_button_new_from_stock (GTK_STOCK_PASTE); + for (i = 0 ; i != sizeof(button_ids) / sizeof(ModestToolbarButton); ++i) + buttons = g_slist_append (buttons, GINT_TO_POINTER(button_ids[i])); - quit = gtk_tool_button_new_from_stock (GTK_STOCK_QUIT); - - g_signal_connect (newmail, "clicked", G_CALLBACK(on_newmail_clicked), - modest_ui); - g_signal_connect (refresh, "clicked", G_CALLBACK(on_refresh_clicked), - modest_ui); - g_signal_connect (reply, "clicked", G_CALLBACK(on_reply_clicked), - modest_ui); - g_signal_connect (forward, "clicked", G_CALLBACK(on_forward_clicked), - modest_ui); - g_signal_connect (cut, "clicked", G_CALLBACK(on_cut_clicked), - modest_ui); - g_signal_connect (copy, "clicked", G_CALLBACK(on_copy_clicked), - modest_ui); - g_signal_connect (paste, "clicked", G_CALLBACK(on_paste_clicked), - modest_ui); - g_signal_connect (delmail, "clicked", G_CALLBACK(on_delmail_clicked), - modest_ui); - g_signal_connect (quit, "clicked", G_CALLBACK(on_quit_clicked), - modest_ui); - - gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(newmail), -1); - gtk_toolbar_insert (GTK_TOOLBAR(toolbar), - GTK_TOOL_ITEM(gtk_separator_tool_item_new()), - -1); - gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(refresh), -1); - gtk_toolbar_insert (GTK_TOOLBAR(toolbar), - GTK_TOOL_ITEM(gtk_separator_tool_item_new()), - -1); - gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(reply), -1); - gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(forward), -1); + toolbar = modest_widget_factory_get_main_toolbar (priv->widget_factory, buttons); + g_slist_free (buttons); - gtk_toolbar_insert (GTK_TOOLBAR(toolbar), - GTK_TOOL_ITEM(gtk_separator_tool_item_new()), - -1); - - gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(cut), -1); - gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(copy), -1); - gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(paste), -1); - gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(delmail), -1); + g_signal_connect (G_OBJECT(toolbar), "button_clicked", + G_CALLBACK(on_toolbar_button_clicked), self); - gtk_toolbar_insert (GTK_TOOLBAR(toolbar), - GTK_TOOL_ITEM(gtk_separator_tool_item_new()), - -1); - gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(quit), -1); - return toolbar; } -static GtkWidget* -modest_main_window_message_preview () -{ - ModestTnyMsgView *msg_view; - - msg_view = MODEST_TNY_MSG_VIEW(modest_tny_msg_view_new (NULL)); - - return GTK_WIDGET(msg_view); -} - static void -on_newmail_clicked (GtkToolButton *button, gpointer data) +restore_sizes (ModestMainWindow *self) { - g_warning (__FUNCTION__); -} + ModestConf *conf; + ModestMainWindowPrivate *priv; + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + conf = modest_tny_platform_factory_get_modest_conf_instance (priv->factory); + + modest_widget_memory_restore_settings (conf,GTK_WIDGET(self), + "modest-main-window"); + modest_widget_memory_restore_settings (conf, GTK_WIDGET(priv->folder_paned), + "modest-folder-paned"); + modest_widget_memory_restore_settings (conf, GTK_WIDGET(priv->msg_paned), + "modest-msg-paned"); + modest_widget_memory_restore_settings (conf, GTK_WIDGET(priv->main_paned), + "modest-main-paned"); + modest_widget_memory_restore_settings (conf, GTK_WIDGET(priv->header_view), + "modest-header-view"); -static void -on_refresh_clicked (GtkToolButton *button, gpointer data) -{ - g_warning (__FUNCTION__); -} -static void -on_reply_clicked (GtkToolButton *button, gpointer data) -{ - g_warning (__FUNCTION__); -} -static void -on_forward_clicked (GtkToolButton *button, gpointer data) -{ - g_warning (__FUNCTION__); -} -static void -on_delmail_clicked (GtkToolButton *button, gpointer data) -{ - g_warning (__FUNCTION__); } -static void -on_cut_clicked (GtkToolButton *button, gpointer data) -{ - g_warning (__FUNCTION__); -} static void -on_copy_clicked (GtkToolButton *button, gpointer data) +save_sizes (ModestMainWindow *self) { - g_warning (__FUNCTION__); - + ModestMainWindowPrivate *priv; + ModestConf *conf; + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + conf = modest_tny_platform_factory_get_modest_conf_instance (priv->factory); + + modest_widget_memory_save_settings (conf,GTK_WIDGET(self), + "modest-main-window"); + modest_widget_memory_save_settings (conf, GTK_WIDGET(priv->folder_paned), + "modest-folder-paned"); + modest_widget_memory_save_settings (conf, GTK_WIDGET(priv->msg_paned), + "modest-msg-paned"); + modest_widget_memory_save_settings (conf, GTK_WIDGET(priv->main_paned), + "modest-main-paned"); + modest_widget_memory_save_settings (conf, GTK_WIDGET(priv->header_view), + "modest-header-view"); } -static void -on_paste_clicked (GtkToolButton *button, gpointer data) + +static GtkWidget* +wrapped_in_scrolled_window (GtkWidget *widget, gboolean needs_viewport) { - g_warning (__FUNCTION__); + GtkWidget *win; + + win = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy + (GTK_SCROLLED_WINDOW (win),GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + + if (needs_viewport) + gtk_scrolled_window_add_with_viewport + (GTK_SCROLLED_WINDOW(win), widget); + else + gtk_container_add (GTK_CONTAINER(win), + widget); + + return win; } -static void -on_quit_clicked (GtkToolButton *button, gpointer data) +static gboolean +on_delete_event (GtkWidget *widget, GdkEvent *event, ModestMainWindow *self) { - g_warning (__FUNCTION__); + save_sizes (self); + return FALSE; } - -static void on_folder_clicked (ModestTnyFolderTreeView *folder_tree, - TnyMsgFolderIface *folder, - gpointer data) +GtkWidget* +modest_main_window_new (ModestWidgetFactory *widget_factory) { - ModestMainWindow *self; - ModestMainWindowPrivate *priv; - - g_return_if_fail (folder); - g_return_if_fail (data); + GObject *obj; + ModestMainWindowPrivate *priv; - self = MODEST_MAIN_WINDOW(data); - priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self); - - modest_tny_header_tree_view_set_folder (priv->header_view, - folder); -} + GtkWidget *main_vbox; + GtkWidget *status_hbox; + GtkWidget *header_win, *folder_win; + + g_return_val_if_fail (widget_factory, NULL); + obj = g_object_new(MODEST_TYPE_MAIN_WINDOW, NULL); + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj); + g_object_ref (widget_factory); + priv->widget_factory = widget_factory; -static void on_message_clicked (ModestTnyFolderTreeView *folder_tree, - TnyMsgIface *message, - gpointer data) -{ - ModestMainWindow *self; - ModestMainWindowPrivate *priv; + /* widgets from factory */ + priv->folder_view = modest_widget_factory_get_folder_view (widget_factory); + priv->header_view = header_view_new (MODEST_MAIN_WINDOW(obj)); + priv->msg_preview = modest_widget_factory_get_msg_preview (widget_factory); + + folder_win = wrapped_in_scrolled_window (GTK_WIDGET(priv->folder_view), + FALSE); + header_win = wrapped_in_scrolled_window (GTK_WIDGET(priv->header_view), + FALSE); + + /* tool/menubar */ + priv->menubar = menubar_new (MODEST_MAIN_WINDOW(obj)); + priv->toolbar = GTK_WIDGET(toolbar_new (MODEST_MAIN_WINDOW(obj))); + + /* paned */ + priv->folder_paned = gtk_vpaned_new (); + priv->msg_paned = gtk_vpaned_new (); + priv->main_paned = gtk_hpaned_new (); + gtk_paned_add1 (GTK_PANED(priv->main_paned), folder_win); + gtk_paned_add2 (GTK_PANED(priv->main_paned), priv->msg_paned); + gtk_paned_add1 (GTK_PANED(priv->msg_paned), header_win); + gtk_paned_add2 (GTK_PANED(priv->msg_paned), GTK_WIDGET(priv->msg_preview)); + + gtk_widget_show (GTK_WIDGET(priv->header_view)); + gtk_tree_view_columns_autosize (GTK_TREE_VIEW(priv->header_view)); + + + /* status bar / progress */ + status_hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX(status_hbox), + modest_widget_factory_get_folder_info_label (widget_factory), + FALSE,FALSE, 6); + gtk_box_pack_start (GTK_BOX(status_hbox), + modest_widget_factory_get_status_bar(widget_factory), + TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX(status_hbox), + modest_widget_factory_get_progress_bar(widget_factory), + FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(status_hbox), + modest_widget_factory_get_online_toggle(widget_factory), + FALSE, FALSE, 0); + + /* putting it all together... */ + main_vbox = gtk_vbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX(main_vbox), priv->menubar, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(main_vbox), priv->toolbar, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(main_vbox), priv->main_paned, TRUE, TRUE,0); + gtk_box_pack_start (GTK_BOX(main_vbox), status_hbox, FALSE, FALSE, 0); + + gtk_container_add (GTK_CONTAINER(obj), main_vbox); + restore_sizes (MODEST_MAIN_WINDOW(obj)); - g_return_if_fail (message); - g_return_if_fail (data); + gtk_window_set_title (GTK_WINDOW(obj), "Modest"); + gtk_window_set_icon (GTK_WINDOW(obj), + modest_icon_factory_get_icon (MODEST_APP_ICON)); + + gtk_widget_show_all (main_vbox); - self = MODEST_MAIN_WINDOW(data); - priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self); - - modest_tny_msg_view_set_message (priv->message_view, - message); + g_signal_connect (G_OBJECT(obj), "delete-event", + G_CALLBACK(on_delete_event), obj); + + return GTK_WIDGET(obj); }