X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fgtk%2Fmodest-main-window.c;h=2932d2fb10a1763d6de37d87fdccb283eb5a09a4;hb=fc9e22262b3ec375140b1cdf954b4660f03b9e36;hp=a6268a9a1c5ee1624387de7e188d91116e2dbeb3;hpb=8304c31c7a90f377d5d86f94eecfb484391a8407;p=modest diff --git a/src/gtk/modest-main-window.c b/src/gtk/modest-main-window.c index a6268a9..2932d2f 100644 --- a/src/gtk/modest-main-window.c +++ b/src/gtk/modest-main-window.c @@ -29,19 +29,20 @@ #include #include +#include -#include "modest-main-window.h" -#include "modest-widget-factory.h" +#include +#include +#include +#include + +#include #include "modest-widget-memory.h" -#include "modest-icon-factory.h" -#include "modest-ui.h" +#include "modest-ui-actions.h" #include "modest-main-window-ui.h" -#include "modest-account-view-window.h" #include "modest-account-mgr.h" #include "modest-conf.h" -#include "modest-edit-msg-window.h" -#include "modest-tny-platform-factory.h" -#include "modest-tny-msg-actions.h" +#include #include "modest-mail-operation.h" #include "modest-icon-names.h" @@ -53,6 +54,22 @@ static void modest_main_window_finalize (GObject *obj); static void restore_sizes (ModestMainWindow *self); static void save_sizes (ModestMainWindow *self); +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); + +static void connect_signals (ModestMainWindow *self); + + /* list my signals */ enum { /* MY_SIGNAL_1, */ @@ -63,21 +80,20 @@ enum { typedef struct _ModestMainWindowPrivate ModestMainWindowPrivate; struct _ModestMainWindowPrivate { - GtkUIManager *ui_manager; - ModestWidgetFactory *widget_factory; - TnyPlatformFactory *factory; - ModestTnyAccountStore *account_store; - - GtkWidget *toolbar; - GtkWidget *menubar; - GtkWidget *folder_paned; GtkWidget *msg_paned; GtkWidget *main_paned; + GtkWidget *online_toggle; + GtkWidget *folder_info_label; + ModestHeaderView *header_view; ModestFolderView *folder_view; ModestMsgView *msg_preview; + + GtkWidget *status_bar; + GtkWidget *progress_bar; + }; @@ -117,7 +133,7 @@ modest_main_window_get_type (void) (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); } @@ -134,62 +150,107 @@ 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 void modest_main_window_init (ModestMainWindow *obj) { + TnyAccountStore *account_store; ModestMainWindowPrivate *priv; - + TnyFolderStoreQuery *query; + GtkWidget *icon; + gboolean online; + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj); - priv->factory = modest_tny_platform_factory_get_instance (); - priv->widget_factory = NULL; - priv->ui_manager = NULL; - priv->account_store = NULL; + priv->folder_paned = NULL; + priv->msg_paned = NULL; + priv->main_paned = NULL; + + account_store = TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()); + + /* online/offline combo */ + priv->online_toggle = gtk_toggle_button_new (); + online = tny_device_is_online (modest_runtime_get_device()); + icon = gtk_image_new_from_icon_name (online ? GTK_STOCK_CONNECT : GTK_STOCK_DISCONNECT, + GTK_ICON_SIZE_BUTTON); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(priv->online_toggle), online); + gtk_button_set_image (GTK_BUTTON(priv->online_toggle),icon); + + /* label with number of items, unread items for + the current folder */ + priv->folder_info_label = gtk_label_new (NULL); + + /* status bar */ + priv->status_bar = gtk_statusbar_new (); + gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR(priv->status_bar), + FALSE); + + /* progress bar */ + priv->progress_bar = gtk_progress_bar_new (); + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(priv->progress_bar), 1.0); + gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR(priv->progress_bar), + PANGO_ELLIPSIZE_END); + + /* msg preview */ + priv->msg_preview = MODEST_MSG_VIEW(modest_msg_view_new (NULL)); + if (!priv->msg_preview) + g_printerr ("modest: cannot instantiate msgpreiew\n"); + + /* header view */ + priv->header_view = + MODEST_HEADER_VIEW(modest_header_view_new (NULL, MODEST_HEADER_VIEW_STYLE_DETAILS)); + if (!priv->header_view) + g_printerr ("modest: cannot instantiate header view\n"); + + /* folder view */ + query = tny_folder_store_query_new (); + tny_folder_store_query_add_item (query, NULL, + TNY_FOLDER_STORE_QUERY_OPTION_SUBSCRIBED); + + priv->folder_view = MODEST_FOLDER_VIEW (modest_folder_view_new (query)); + if (!priv->folder_view) + g_printerr ("modest: cannot instantiate folder view\n"); + g_object_unref (G_OBJECT (query)); } static void 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; - } - if (priv->ui_manager) { - g_object_unref (G_OBJECT(priv->ui_manager)); - priv->ui_manager = NULL; - } - if (priv->account_store) { - g_object_unref (G_OBJECT(priv->account_store)); - priv->account_store = NULL; - } - G_OBJECT_CLASS(parent_class)->finalize (obj); } -static ModestHeaderView* -header_view_new (ModestMainWindow *self) +GtkWidget* +modest_main_window_get_child_widget (ModestMainWindow *self, + ModestWidgetType widget_type) { - int i; - ModestHeaderView *header_view; ModestMainWindowPrivate *priv; - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + GtkWidget *widget; - header_view = modest_widget_factory_get_header_view (priv->widget_factory); - modest_header_view_set_style (header_view, - MODEST_HEADER_VIEW_STYLE_SHOW_HEADERS); - return header_view; + g_return_val_if_fail (self, NULL); + g_return_val_if_fail (widget_type >= 0 && widget_type < MODEST_WIDGET_TYPE_NUM, + NULL); + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + + switch (widget_type) { + case MODEST_WIDGET_TYPE_HEADER_VIEW: + widget = (GtkWidget*)priv->header_view; break; + case MODEST_WIDGET_TYPE_FOLDER_VIEW: + widget = (GtkWidget*)priv->folder_view; break; + case MODEST_WIDGET_TYPE_MSG_PREVIEW: + widget = (GtkWidget*)priv->msg_preview; break; + case MODEST_WIDGET_TYPE_STATUS_BAR: + widget = (GtkWidget*)priv->status_bar; break; + case MODEST_WIDGET_TYPE_PROGRESS_BAR: + widget = (GtkWidget*)priv->progress_bar; break; + default: + g_return_val_if_reached (NULL); + return NULL; + } + + return widget ? GTK_WIDGET(widget) : NULL; } @@ -198,33 +259,35 @@ restore_sizes (ModestMainWindow *self) { ModestConf *conf; ModestMainWindowPrivate *priv; + ModestWindowPrivate *parent_priv; priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - conf = modest_tny_platform_factory_get_conf_instance - (MODEST_TNY_PLATFORM_FACTORY(priv->factory)); + parent_priv = MODEST_WINDOW_GET_PRIVATE(self); + 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(priv->header_view), - "header-view"); - modest_widget_memory_restore (conf,G_OBJECT(self), - "modest-main-window"); + modest_widget_memory_restore (conf, G_OBJECT(priv->header_view),"header-view"); + modest_widget_memory_restore (conf,G_OBJECT(self), "modest-main-window"); } static void save_sizes (ModestMainWindow *self) { + ModestWindowPrivate *parent_priv; ModestMainWindowPrivate *priv; ModestConf *conf; priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - conf = modest_tny_platform_factory_get_conf_instance - (MODEST_TNY_PLATFORM_FACTORY(priv->factory)); + parent_priv = MODEST_WINDOW_GET_PRIVATE(self); + + conf = modest_runtime_get_conf (); modest_widget_memory_save (conf,G_OBJECT(self), "modest-main-window"); modest_widget_memory_save (conf, G_OBJECT(priv->folder_paned), @@ -236,6 +299,134 @@ save_sizes (ModestMainWindow *self) modest_widget_memory_save (conf, G_OBJECT(priv->header_view), "header-view"); } + +static void +on_connection_changed (TnyDevice *device, gboolean online, ModestMainWindow *self) +{ + GtkWidget *icon; + const gchar *icon_name; + ModestMainWindowPrivate *priv; + + g_return_if_fail (device); + g_return_if_fail (self); + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + + icon_name = online ? GTK_STOCK_CONNECT : GTK_STOCK_DISCONNECT; + icon = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_BUTTON); + + /* 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")); + + /* 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 */ + +/* if (online) { */ +/* GtkTreeSelection *selected; */ + +/* selected = gtk_tree_view_get_selection (GTK_TREE_VIEW (header_view)); */ +/* _modest_header_view_change_selection (selected, header_view); */ +/* } */ +} + +void +on_online_toggle_toggled (GtkToggleButton *toggle, ModestMainWindow *self) +{ + gboolean online; + TnyDevice *device; + ModestMainWindowPrivate *priv; + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + + device = modest_runtime_get_device (); + online = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->online_toggle)); + + if (online) + tny_device_force_online (device); + else + tny_device_force_offline (device); +} + +static gboolean +on_delete_event (GtkWidget *widget, GdkEvent *event, ModestMainWindow *self) +{ + save_sizes (self); + return FALSE; +} + +static void +on_destroy (GtkWidget *widget, GdkEvent *event, ModestMainWindow *self) +{ + gtk_main_quit(); +} + + + +static void +connect_signals (ModestMainWindow *self) +{ + ModestWindowPrivate *parent_priv; + ModestMainWindowPrivate *priv; + ModestTnyAccountStore *account_store; + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + parent_priv = MODEST_WINDOW_GET_PRIVATE(self); + + account_store = modest_runtime_get_account_store (); + + /* folder view */ + g_signal_connect (G_OBJECT(priv->folder_view), "folder_selection_changed", + G_CALLBACK(modest_ui_actions_on_folder_selection_changed), self); + g_signal_connect (G_OBJECT(priv->folder_view), "button-press-event", + G_CALLBACK (on_folder_view_button_press_event),self); + g_signal_connect (priv->folder_view,"popup-menu", + G_CALLBACK (on_folder_view_button_press_event),self); + + /* header view */ + g_signal_connect (G_OBJECT(priv->header_view), "status_update", + G_CALLBACK(modest_ui_actions_on_header_status_update), self); + g_signal_connect (G_OBJECT(priv->header_view), "header_selected", + G_CALLBACK(modest_ui_actions_on_header_selected), self); + g_signal_connect (G_OBJECT(priv->header_view), "header_activated", + G_CALLBACK(modest_ui_actions_on_header_activated), self); + g_signal_connect (G_OBJECT(priv->header_view), "item_not_found", + G_CALLBACK(modest_ui_actions_on_item_not_found), self); + g_signal_connect (G_OBJECT(priv->header_view), "button-press-event", + G_CALLBACK (on_header_view_button_press_event), self); + g_signal_connect (G_OBJECT(priv->header_view),"popup-menu", + G_CALLBACK (on_header_view_button_press_event), self); + + /* msg preview */ + g_signal_connect (G_OBJECT(priv->msg_preview), "link_clicked", + G_CALLBACK(modest_ui_actions_on_msg_link_clicked), self); + g_signal_connect (G_OBJECT(priv->msg_preview), "link_hover", + G_CALLBACK(modest_ui_actions_on_msg_link_hover), self); + g_signal_connect (G_OBJECT(priv->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()), "password_requested", + G_CALLBACK (modest_ui_actions_on_password_requested), self); + + /* Device */ + g_signal_connect (G_OBJECT(modest_runtime_get_device()), "connection_changed", + G_CALLBACK(on_connection_changed), self); + g_signal_connect (G_OBJECT(priv->online_toggle), "toggled", + G_CALLBACK(on_online_toggle_toggled), self); + + /* 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* wrapped_in_scrolled_window (GtkWidget *widget, gboolean needs_viewport) { @@ -257,77 +448,61 @@ wrapped_in_scrolled_window (GtkWidget *widget, gboolean needs_viewport) } -static gboolean -on_delete_event (GtkWidget *widget, GdkEvent *event, ModestMainWindow *self) -{ - save_sizes (self); - return FALSE; -} ModestWindow * -modest_main_window_new (ModestWidgetFactory *widget_factory, - TnyAccountStore *account_store) +modest_main_window_new (void) { 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; - - g_return_val_if_fail (widget_factory, NULL); - + obj = g_object_new(MODEST_TYPE_MAIN_WINDOW, NULL); - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj); - - priv->widget_factory = g_object_ref (widget_factory); - priv->account_store = g_object_ref (account_store); - + self = MODEST_MAIN_WINDOW(obj); + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + parent_priv = MODEST_WINDOW_GET_PRIVATE(self); + /* ***************** */ - priv->ui_manager = gtk_ui_manager_new(); + 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 (priv->ui_manager, action_group, 0); + 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 (priv->ui_manager, MODEST_UIDIR "modest-ui.xml", &error); + gtk_ui_manager_add_ui_from_file (parent_priv->ui_manager, + MODEST_UIDIR "modest-main-window-ui.xml", &error); if (error != NULL) { - g_warning ("Could not merge modest-ui.xml: %s", error->message); + g_printerr ("modest: could not merge modest-main-window-ui.xml: %s", error->message); g_error_free (error); error = NULL; } /* *************** */ -/* priv->ui_manager = g_object_ref (ui_manager); */ /* Add accelerators */ gtk_window_add_accel_group (GTK_WINDOW (obj), - gtk_ui_manager_get_accel_group (priv->ui_manager)); - + gtk_ui_manager_get_accel_group (parent_priv->ui_manager)); /* Toolbar / Menubar */ - priv->toolbar = gtk_ui_manager_get_widget (priv->ui_manager, "/ToolBar"); - priv->menubar = gtk_ui_manager_get_widget (priv->ui_manager, "/MenuBar"); - - gtk_toolbar_set_tooltips (GTK_TOOLBAR (priv->toolbar), TRUE); + 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"); - /* 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); + gtk_toolbar_set_tooltips (GTK_TOOLBAR (parent_priv->toolbar), TRUE); + folder_win = wrapped_in_scrolled_window (GTK_WIDGET(priv->folder_view), FALSE); + header_win = wrapped_in_scrolled_window (GTK_WIDGET(priv->header_view), FALSE); /* paned */ priv->folder_paned = gtk_vpaned_new (); @@ -338,27 +513,17 @@ modest_main_window_new (ModestWidgetFactory *widget_factory, 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)); - /* 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); + gtk_box_pack_start (GTK_BOX(status_hbox), priv->folder_info_label, FALSE,FALSE, 6); + gtk_box_pack_start (GTK_BOX(status_hbox), priv->status_bar, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX(status_hbox), priv->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), 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), 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); @@ -366,36 +531,95 @@ modest_main_window_new (ModestWidgetFactory *widget_factory, restore_sizes (MODEST_MAIN_WINDOW(obj)); gtk_window_set_title (GTK_WINDOW(obj), _("Modest")); - gtk_window_set_icon (GTK_WINDOW(obj), - modest_icon_factory_get_icon (MODEST_APP_ICON)); + gtk_window_set_icon_from_file (GTK_WINDOW(obj), MODEST_APP_ICON, NULL); gtk_widget_show_all (main_vbox); - g_signal_connect (G_OBJECT(obj), "delete-event", - G_CALLBACK(on_delete_event), obj); - + /* Connect signals */ + connect_signals (MODEST_MAIN_WINDOW(obj)); + + /* Set account store */ + tny_account_store_view_set_account_store (TNY_ACCOUNT_STORE_VIEW (priv->folder_view), + TNY_ACCOUNT_STORE (modest_runtime_get_account_store ())); + return (ModestWindow *) obj; } -ModestWidgetFactory * -modest_main_window_get_widget_factory (ModestMainWindow *main_window) +static gboolean +on_header_view_button_press_event (ModestHeaderView *header_view, + GdkEventButton *event, + ModestMainWindow *self) { - ModestMainWindowPrivate *priv; + if (event->type == GDK_BUTTON_PRESS && event->button == 3) { + GtkWidget *menu; + ModestWindowPrivate *parent_priv; - g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (main_window), NULL); + parent_priv = MODEST_WINDOW_GET_PRIVATE (self); + menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/HeaderViewContextMenu"); - priv = MODEST_MAIN_WINDOW_GET_PRIVATE (main_window); + return show_context_popup_menu (self, + GTK_TREE_VIEW (header_view), + event, + menu); + } - return g_object_ref (priv->widget_factory); + return FALSE; } -TnyAccountStore * -modest_main_window_get_account_store (ModestMainWindow *main_window) +static gboolean +on_folder_view_button_press_event (ModestFolderView *folder_view, + GdkEventButton *event, + ModestMainWindow *self) { - ModestMainWindowPrivate *priv; + if (event->type == GDK_BUTTON_PRESS && event->button == 3) { + GtkWidget *menu; + ModestWindowPrivate *parent_priv; - g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (main_window), NULL); + parent_priv = MODEST_WINDOW_GET_PRIVATE (self); + menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/FolderViewContextMenu"); - priv = MODEST_MAIN_WINDOW_GET_PRIVATE (main_window); + return show_context_popup_menu (self, + GTK_TREE_VIEW (folder_view), + event, + menu); + } - return g_object_ref (priv->account_store); + return FALSE; +} + +static gboolean +show_context_popup_menu (ModestMainWindow *window, + GtkTreeView *tree_view, + GdkEventButton *event, + GtkWidget *menu) +{ + g_return_val_if_fail (menu, FALSE); + + if (event != NULL) { + /* Ensure that the header is selected */ + GtkTreeSelection *selection; + + 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; }