X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fgtk%2Fmodest-main-window.c;h=4f7aea3e8ed5ec43c248d6a8dfbeca9c9e71ef0d;hp=1719341bfb575ed88f1d2b4b7b41b2d260f599fc;hb=cf600fb8c82e4f29a64a11b53361aa1f98a40f8c;hpb=a68987f6b14adab7424dcd824dcacd4382687c73 diff --git a/src/gtk/modest-main-window.c b/src/gtk/modest-main-window.c index 1719341..4f7aea3 100644 --- a/src/gtk/modest-main-window.c +++ b/src/gtk/modest-main-window.c @@ -1,60 +1,73 @@ -/* modest-main-window.c */ +/* 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. + */ -/* insert (c)/licensing information) */ -#include -#include +#include +#include +#include +#include +#include +#include +#include "modest-account-view-window.h" -#ifdef HAVE_CONFIG_H -#include -#endif /*HAVE_CONFIG_H*/ -#include -#include "modest-main-window.h" +#include "modest-widget-memory.h" +#include "modest-ui-actions.h" +#include "modest-main-window-ui.h" +#include "modest-account-mgr.h" +#include "modest-conf.h" +#include +#include "modest-mail-operation.h" +#include "modest-icon-names.h" +/* 'private'/'protected' functions */ +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); -#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" +static gboolean on_header_view_button_press_event (ModestHeaderView *header_view, + GdkEventButton *event, + ModestMainWindow *self); +static gboolean on_folder_view_button_press_event (ModestFolderView *folder_view, + GdkEventButton *event, + ModestMainWindow *self); +static gboolean show_context_popup_menu (ModestMainWindow *window, + GtkTreeView *tree_view, + GdkEventButton *event, + GtkWidget *menu); -/* '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 connect_signals (ModestMainWindow *self); /* list my signals */ @@ -67,18 +80,30 @@ enum { typedef struct _ModestMainWindowPrivate ModestMainWindowPrivate; struct _ModestMainWindowPrivate { - ModestConf *modest_conf; - ModestAccountMgr *modest_acc_mgr; - - ModestTnyFolderTreeView *folder_view; - ModestTnyHeaderTreeView *header_view; - ModestTnyMsgView *message_view; + GtkWidget *folder_paned; + GtkWidget *msg_paned; + GtkWidget *main_paned; + + GtkWidget *online_toggle; + GtkWidget *folder_info_label; }; + + #define MODEST_MAIN_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_MAIN_WINDOW, \ ModestMainWindowPrivate)) + +typedef struct _GetMsgAsyncHelper { + ModestMainWindowPrivate *main_window_private; + guint action; + ModestMailOperationReplyType reply_type; + ModestMailOperationForwardType forward_type; + gchar *from; + TnyIterator *iter; +} GetMsgAsyncHelper; + /* 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,8 +123,9 @@ 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, + my_type = g_type_register_static (MODEST_TYPE_WINDOW, "ModestMainWindow", &my_info, 0); } @@ -116,400 +142,442 @@ modest_main_window_class_init (ModestMainWindowClass *klass) gobject_class->finalize = modest_main_window_finalize; g_type_class_add_private (gobject_class, sizeof(ModestMainWindowPrivate)); - - /* signal definitions go here, e.g.: */ -/* signals[MY_SIGNAL_1] = */ -/* g_signal_new ("my_signal_1",....); */ -/* signals[MY_SIGNAL_2] = */ -/* g_signal_new ("my_signal_2",....); */ -/* 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; + TnyFolderStoreQuery *query; + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj); + priv->folder_paned = NULL; + priv->msg_paned = NULL; + priv->main_paned = NULL; + + /* folder view */ + query = tny_folder_store_query_new (); + tny_folder_store_query_add_item (query, NULL, + TNY_FOLDER_STORE_QUERY_OPTION_SUBSCRIBED); + + obj->folder_view = + MODEST_FOLDER_VIEW(modest_folder_view_new (modest_runtime_get_account_store(), + query)); + if (!obj->folder_view) + g_printerr ("modest: cannot instantiate folder view\n"); + g_object_unref (G_OBJECT (query)); + + /* header view */ + obj->header_view = + MODEST_HEADER_VIEW(modest_header_view_new (NULL, MODEST_HEADER_VIEW_STYLE_DETAILS)); + if (!obj->header_view) + g_printerr ("modest: cannot instantiate header view\n"); + + /* msg preview */ + obj->msg_preview = MODEST_MSG_VIEW(modest_msg_view_new (NULL)); + if (!obj->msg_preview) + g_printerr ("modest: cannot instantiate msgpreiew\n"); + + /* online/offline combo */ + priv->online_toggle = gtk_toggle_button_new (); + + /* label with number of items, unread items for + the current folder */ + priv->folder_info_label = gtk_label_new (NULL); + + /* status bar */ + obj->status_bar = gtk_statusbar_new (); + gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR(obj->status_bar), + FALSE); + + /* progress bar */ + obj->progress_bar = gtk_progress_bar_new (); + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(obj->progress_bar), 1.0); + gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR(obj->progress_bar), + PANGO_ELLIPSIZE_END); +} static void -modest_main_window_init (ModestMainWindow *obj, ModestConf *modest_conf, - ModestAccountMgr *modest_acc_mgr) +modest_main_window_finalize (GObject *obj) { + G_OBJECT_CLASS(parent_class)->finalize (obj); } - - - static void -modest_main_window_finalize (GObject *obj) +restore_sizes (ModestMainWindow *self) { - ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE (obj); + ModestConf *conf; + ModestMainWindowPrivate *priv; + ModestWindowPrivate *parent_priv; + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + parent_priv = MODEST_WINDOW_GET_PRIVATE(self); - priv->modest_conf = NULL; - priv->modest_acc_mgr = NULL; + conf = modest_runtime_get_conf (); + + modest_widget_memory_restore (conf, G_OBJECT(priv->folder_paned), + "modest-folder-paned"); + modest_widget_memory_restore (conf, G_OBJECT(priv->msg_paned), + "modest-msg-paned"); + modest_widget_memory_restore (conf, G_OBJECT(priv->main_paned), + "modest-main-paned"); + modest_widget_memory_restore (conf, G_OBJECT(self->header_view),"header-view"); + modest_widget_memory_restore (conf,G_OBJECT(self), "modest-main-window"); } - -GtkWidget* -modest_main_window_new (ModestConf *modest_conf, ModestAccountMgr *modest_acc_mgr) +static void +save_sizes (ModestMainWindow *self) { + ModestWindowPrivate *parent_priv; + ModestMainWindowPrivate *priv; + ModestConf *conf; - 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); + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + parent_priv = MODEST_WINDOW_GET_PRIVATE(self); - priv->message_view = MODEST_TNY_MSG_VIEW (modest_main_window_message_preview()); + conf = modest_runtime_get_conf (); - ui = modest_main_window_get_ui(priv->folder_view, - priv->header_view, - priv->message_view); - gtk_container_add (GTK_CONTAINER(self), ui); - - return GTK_WIDGET(self); + modest_widget_memory_save (conf,G_OBJECT(self), "modest-main-window"); + modest_widget_memory_save (conf, G_OBJECT(priv->folder_paned), + "modest-folder-paned"); + modest_widget_memory_save (conf, G_OBJECT(priv->msg_paned), + "modest-msg-paned"); + modest_widget_memory_save (conf, G_OBJECT(priv->main_paned), + "modest-main-paned"); + modest_widget_memory_save (conf, G_OBJECT(self->header_view), "header-view"); } - - -static GtkWidget * -modest_main_window_get_ui (ModestTnyFolderTreeView *folder_view, - ModestTnyHeaderTreeView *header_view, - ModestTnyMsgView *message_view) - +static void +on_connection_changed (TnyDevice *device, gboolean online, ModestMainWindow *self) { - 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 *icon; + const gchar *icon_name; + ModestMainWindowPrivate *priv; - toolbar = modest_main_window_toolbar (); - fav_folder_list = modest_main_window_favorite_folder_list (); - vbox = gtk_vbox_new (FALSE,2); + g_return_if_fail (device); + g_return_if_fail (self); - folder_vbox = gtk_vbox_new (FALSE,2); - message_vbox = gtk_vbox_new (FALSE,2); + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - msg_vpaned = gtk_vpaned_new (); - folder_vpaned = gtk_vpaned_new (); - folder_msg_hpaned = gtk_hpaned_new (); - - 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); + icon_name = online ? GTK_STOCK_CONNECT : GTK_STOCK_DISCONNECT; + icon = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_BUTTON); - 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); + /* Block handlers in order to avoid unnecessary calls */ + //g_signal_handler_block (G_OBJECT (priv->online_toggle), priv->toggle_button_signal); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(priv->online_toggle), online); + //g_signal_handler_unblock (G_OBJECT (online_toggle), priv->toggle_button_signal); + gtk_button_set_image (GTK_BUTTON(priv->online_toggle), icon); + //statusbar_push (widget_factory, 0, online ? _("Modest went online") : _("Modest went offline")); - gtk_paned_add1 (GTK_PANED(folder_msg_hpaned), folder_vbox); - gtk_paned_add2 (GTK_PANED(folder_msg_hpaned), message_vbox); + /* If Modest has became online and the header view has a + header selected then show it */ + /* FIXME: there is a race condition if some account needs to + ask the user for a password */ - gtk_box_pack_start (GTK_BOX(vbox), toolbar, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX(vbox), folder_msg_hpaned, TRUE, TRUE, 0); +/* if (online) { */ +/* GtkTreeSelection *selected; */ - status_bar = gtk_statusbar_new (); - gtk_box_pack_start (GTK_BOX(vbox), status_bar, FALSE, FALSE, 0); - - gtk_widget_show_all (GTK_WIDGET(vbox)); - return vbox; +/* selected = gtk_tree_view_get_selection (GTK_TREE_VIEW (header_view)); */ +/* _modest_header_view_change_selection (selected, header_view); */ +/* } */ } - - -static GtkWidget* -modest_main_window_header_tree (TnyMsgFolderIface *folder) +void +on_online_toggle_toggled (GtkToggleButton *toggle, ModestMainWindow *self) { - GtkWidget *header_tree; - - header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder)); - if (!header_tree) { - g_warning ("could not create header tree"); - return NULL; - } + gboolean online; + TnyDevice *device; + ModestMainWindowPrivate *priv; - return GTK_WIDGET(header_tree); -} - - - -static GtkWidget* -modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr) -{ - 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; - } - - folder_tree = modest_tny_folder_tree_view_new (account_store_iface); - if (!folder_tree) { - g_warning ("could not create folder list"); - return NULL; - } + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - 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); + device = tny_account_store_get_device + (TNY_ACCOUNT_STORE(modest_runtime_get_account_store())); - 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); + online = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(priv->online_toggle)); - - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(folder_tree), TRUE); - gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(folder_tree), TRUE); + if (online) + tny_device_force_online (device); + else + tny_device_force_offline (device); - return folder_tree; + g_object_unref (G_OBJECT (device)); } - -static GtkWidget* -modest_main_window_favorite_folder_list (void) +static gboolean +on_delete_event (GtkWidget *widget, GdkEvent *event, ModestMainWindow *self) { - GtkWidget *folder_list; - GtkListStore *folder_store; - GtkTreeIter iter; - GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); - - folder_store = gtk_list_store_new (1, G_TYPE_STRING); - folder_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL(folder_store)); - - 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; + save_sizes (self); + return FALSE; } - -static GtkWidget* -modest_main_window_toolbar (void) +static void +on_destroy (GtkWidget *widget, GdkEvent *event, ModestMainWindow *self) { - GtkWidget *toolbar; - GtkToolItem *newmail, *refresh, *reply, *forward, - *cut, *copy, *paste, *delmail, *quit; - - gpointer modest_ui = NULL; /* FIXME */ - - toolbar = gtk_toolbar_new (); + gtk_main_quit(); +} - newmail = gtk_tool_button_new_from_stock (GTK_STOCK_NEW); - delmail = gtk_tool_button_new_from_stock (GTK_STOCK_DELETE); - 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); +static void +connect_signals (ModestMainWindow *self) +{ + ModestWindowPrivate *parent_priv; + ModestMainWindowPrivate *priv; + TnyDevice *device; + ModestTnyAccountStore *account_store; - 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); + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + parent_priv = MODEST_WINDOW_GET_PRIVATE(self); + + account_store = modest_runtime_get_account_store (); + device = tny_account_store_get_device(TNY_ACCOUNT_STORE(account_store)); - 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); + /* folder view */ + g_signal_connect (G_OBJECT(self->folder_view), "folder_selection_changed", + G_CALLBACK(modest_ui_actions_on_folder_selection_changed), self); + g_signal_connect (G_OBJECT(self->folder_view), "folder_moved", + G_CALLBACK(modest_ui_actions_on_folder_moved), NULL); + g_signal_connect (G_OBJECT(self->folder_view), "button-press-event", + G_CALLBACK (on_folder_view_button_press_event),self); + g_signal_connect (self->folder_view,"popup-menu", + G_CALLBACK (on_folder_view_button_press_event),self); + + /* header view */ + g_signal_connect (G_OBJECT(self->header_view), "status_update", + G_CALLBACK(modest_ui_actions_on_header_status_update), self); + g_signal_connect (G_OBJECT(self->header_view), "header_selected", + G_CALLBACK(modest_ui_actions_on_header_selected), self); + g_signal_connect (G_OBJECT(self->header_view), "header_activated", + G_CALLBACK(modest_ui_actions_on_header_activated), self); + g_signal_connect (G_OBJECT(self->header_view), "item_not_found", + G_CALLBACK(modest_ui_actions_on_item_not_found), self); + g_signal_connect (G_OBJECT(self->header_view), "button-press-event", + G_CALLBACK (on_header_view_button_press_event), self); + g_signal_connect (G_OBJECT(self->header_view),"popup-menu", + G_CALLBACK (on_header_view_button_press_event), self); + + /* msg preview */ + g_signal_connect (G_OBJECT(self->msg_preview), "link_clicked", + G_CALLBACK(modest_ui_actions_on_msg_link_clicked), self); + g_signal_connect (G_OBJECT(self->msg_preview), "link_hover", + G_CALLBACK(modest_ui_actions_on_msg_link_hover), self); + g_signal_connect (G_OBJECT(self->msg_preview), "attachment_clicked", + G_CALLBACK(modest_ui_actions_on_msg_attachment_clicked), self); + + /* Account store */ + g_signal_connect (G_OBJECT (modest_runtime_get_account_store()), "accounts_reloaded", + G_CALLBACK (modest_ui_actions_on_accounts_reloaded), 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(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); + /* Device */ + g_signal_connect (G_OBJECT(device), "connection_changed", + G_CALLBACK(on_connection_changed), self); + g_signal_connect (G_OBJECT(priv->online_toggle), "toggled", + G_CALLBACK(on_online_toggle_toggled), NULL); - 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; + /* window */ + g_signal_connect (G_OBJECT(self), "destroy", G_CALLBACK(on_destroy), NULL); + g_signal_connect (G_OBJECT(self), "delete-event", G_CALLBACK(on_delete_event), self); } static GtkWidget* -modest_main_window_message_preview () +wrapped_in_scrolled_window (GtkWidget *widget, gboolean needs_viewport) { - ModestTnyMsgView *msg_view; + GtkWidget *win; - msg_view = MODEST_TNY_MSG_VIEW(modest_tny_msg_view_new (NULL)); + win = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy + (GTK_SCROLLED_WINDOW (win),GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); - return GTK_WIDGET(msg_view); + 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_newmail_clicked (GtkToolButton *button, gpointer data) -{ - g_warning (__FUNCTION__); -} -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) +ModestWindow * +modest_main_window_new (void) { - g_warning (__FUNCTION__); + GObject *obj; + ModestMainWindow *self; + ModestMainWindowPrivate *priv; + ModestWindowPrivate *parent_priv; + GtkWidget *main_vbox; + GtkWidget *status_hbox; + GtkWidget *header_win, *folder_win; + GtkActionGroup *action_group; + GError *error = NULL; + + obj = g_object_new(MODEST_TYPE_MAIN_WINDOW, NULL); + self = MODEST_MAIN_WINDOW(obj); + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + parent_priv = MODEST_WINDOW_GET_PRIVATE(self); + + /* ***************** */ + parent_priv->ui_manager = gtk_ui_manager_new(); + action_group = gtk_action_group_new ("ModestMainWindowActions"); + + /* Add common actions */ + gtk_action_group_add_actions (action_group, + modest_action_entries, + G_N_ELEMENTS (modest_action_entries), + obj); + + gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0); + g_object_unref (action_group); + + /* Load the UI definition */ + gtk_ui_manager_add_ui_from_file (parent_priv->ui_manager, + MODEST_UIDIR "modest-main-window-ui.xml", &error); + if (error != NULL) { + g_printerr ("modest: could not merge modest-main-window-ui.xml: %s", error->message); + g_error_free (error); + error = NULL; + } + /* *************** */ + + /* Add accelerators */ + gtk_window_add_accel_group (GTK_WINDOW (obj), + gtk_ui_manager_get_accel_group (parent_priv->ui_manager)); + + /* Toolbar / Menubar */ + parent_priv->toolbar = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar"); + parent_priv->menubar = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar"); + + gtk_toolbar_set_tooltips (GTK_TOOLBAR (parent_priv->toolbar), TRUE); + folder_win = wrapped_in_scrolled_window (GTK_WIDGET(self->folder_view), FALSE); + header_win = wrapped_in_scrolled_window (GTK_WIDGET(self->header_view), FALSE); + + /* 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(self->msg_preview)); + + gtk_widget_show (GTK_WIDGET(self->header_view)); + + /* status bar / progress */ + status_hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX(status_hbox), priv->folder_info_label, FALSE,FALSE, 6); + gtk_box_pack_start (GTK_BOX(status_hbox), self->status_bar, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX(status_hbox), self->progress_bar,FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(status_hbox), priv->online_toggle,FALSE, FALSE, 0); + + /* putting it all together... */ + main_vbox = gtk_vbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX(main_vbox), parent_priv->menubar, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(main_vbox), parent_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)); -} -static void -on_copy_clicked (GtkToolButton *button, gpointer data) -{ - g_warning (__FUNCTION__); + gtk_window_set_title (GTK_WINDOW(obj), _("Modest")); + gtk_window_set_icon_from_file (GTK_WINDOW(obj), MODEST_APP_ICON, NULL); + gtk_widget_show_all (main_vbox); + + /* Init toggle in correct state */ + //modest_ui_actions_on_connection_changed (device, tny_device_is_online (device), self); -} -static void -on_paste_clicked (GtkToolButton *button, gpointer data) -{ - g_warning (__FUNCTION__); + connect_signals (MODEST_MAIN_WINDOW(obj)); + return (ModestWindow *) obj; } - -static void -on_quit_clicked (GtkToolButton *button, gpointer data) +static gboolean +on_header_view_button_press_event (ModestHeaderView *header_view, + GdkEventButton *event, + ModestMainWindow *self) { - g_warning (__FUNCTION__); -} + if (event->type == GDK_BUTTON_PRESS && event->button == 3) { + GtkWidget *menu; + ModestWindowPrivate *parent_priv; + + parent_priv = MODEST_WINDOW_GET_PRIVATE (self); + menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/HeaderViewContextMenu"); + return show_context_popup_menu (self, + GTK_TREE_VIEW (header_view), + event, + menu); + } + return FALSE; +} -static void on_folder_clicked (ModestTnyFolderTreeView *folder_tree, - TnyMsgFolderIface *folder, - gpointer data) +static gboolean +on_folder_view_button_press_event (ModestFolderView *folder_view, + GdkEventButton *event, + ModestMainWindow *self) { - ModestMainWindow *self; - ModestMainWindowPrivate *priv; - - g_return_if_fail (folder); - g_return_if_fail (data); + if (event->type == GDK_BUTTON_PRESS && event->button == 3) { + GtkWidget *menu; + ModestWindowPrivate *parent_priv; - self = MODEST_MAIN_WINDOW(data); - priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self); - - modest_tny_header_tree_view_set_folder (priv->header_view, - folder); -} + parent_priv = MODEST_WINDOW_GET_PRIVATE (self); + menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/FolderViewContextMenu"); + return show_context_popup_menu (self, + GTK_TREE_VIEW (folder_view), + event, + menu); + } + return FALSE; +} -static void on_message_clicked (ModestTnyFolderTreeView *folder_tree, - TnyMsgIface *message, - gpointer data) +static gboolean +show_context_popup_menu (ModestMainWindow *window, + GtkTreeView *tree_view, + GdkEventButton *event, + GtkWidget *menu) { - ModestMainWindow *self; - ModestMainWindowPrivate *priv; + g_return_val_if_fail (menu, FALSE); - g_return_if_fail (message); - g_return_if_fail (data); + if (event != NULL) { + /* Ensure that the header is selected */ + GtkTreeSelection *selection; - self = MODEST_MAIN_WINDOW(data); - priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self); - - modest_tny_msg_view_set_message (priv->message_view, - message); + selection = gtk_tree_view_get_selection (tree_view); + + if (gtk_tree_selection_count_selected_rows (selection) <= 1) { + GtkTreePath *path; + + /* Get tree path for row that was clicked */ + if (gtk_tree_view_get_path_at_pos (tree_view, + (gint) event->x, + (gint) event->y, + &path, + NULL, NULL, NULL)) { + gtk_tree_selection_unselect_all (selection); + gtk_tree_selection_select_path (selection, path); + gtk_tree_path_free (path); + } + } + + /* Show popup */ + if (gtk_tree_selection_count_selected_rows(selection) == 1) + gtk_menu_popup (GTK_MENU (menu), NULL, NULL, + NULL, NULL, + event->button, event->time); + } + return TRUE; }