X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fgnome%2Fmodest-main-window.c;h=3255109a168dce772518c24b6bfb4a83813edeac;hb=74e08db4fa22d92bdd87f31bde34b076248ece1e;hp=346de744f867c85f4cd8a03d318c510246d19293;hpb=3e7a3b4e5759d63285d8795435b2ceedaf63b216;p=modest diff --git a/src/gnome/modest-main-window.c b/src/gnome/modest-main-window.c index 346de74..3255109 100644 --- a/src/gnome/modest-main-window.c +++ b/src/gnome/modest-main-window.c @@ -30,16 +30,20 @@ #include #include #include +#include +#include #include #include #include #include +#include "widgets/modest-progress-bar.h" #include #include "modest-widget-memory.h" #include "modest-ui-actions.h" #include "modest-main-window-ui.h" +#include "modest-main-window-ui-dimming.h" #include "modest-account-mgr.h" #include "modest-conf.h" #include @@ -51,8 +55,7 @@ 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); +static void restore_settings (ModestMainWindow *self); static gboolean on_header_view_button_press_event (ModestHeaderView *header_view, GdkEventButton *event, @@ -68,7 +71,18 @@ static gboolean show_context_popup_menu (ModestMainWindow *windo GtkWidget *menu); static void connect_signals (ModestMainWindow *self); +static void setup_toolbar (ModestMainWindow *window); +static void on_queue_changed (ModestMailOperationQueue *queue, + ModestMailOperation *mail_op, + ModestMailOperationQueueNotification type, + ModestMainWindow *self); + +static void on_header_selected (ModestHeaderView *header_view, + TnyHeader *header, + ModestMainWindow *main_window); + +static void save_state (ModestWindow *window); /* list my signals */ enum { @@ -80,20 +94,26 @@ enum { typedef struct _ModestMainWindowPrivate ModestMainWindowPrivate; struct _ModestMainWindowPrivate { - GtkWidget *folder_paned; - GtkWidget *msg_paned; - GtkWidget *main_paned; + GtkWidget *folder_paned; + GtkWidget *msg_paned; + GtkWidget *main_paned; + GtkWidget *main_vbox; + GtkWidget *header_win; - GtkWidget *online_toggle; - GtkWidget *folder_info_label; + GtkWidget *online_toggle; + GtkWidget *folder_info_label; ModestHeaderView *header_view; ModestFolderView *folder_view; ModestMsgView *msg_preview; + ModestMainWindowStyle style; + GtkWidget *status_bar; GtkWidget *progress_bar; + GSList *progress_widgets; + GtkWidget *main_bar; }; @@ -101,18 +121,40 @@ struct _ModestMainWindowPrivate { 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 GtkWindowClass *parent_class = NULL; +static const GtkActionEntry modest_folder_view_action_entries [] = { + + /* Folder View CSM actions */ + { "FolderViewCSMNewFolder", NULL, N_("mcen_ti_new_folder"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_new_folder) }, + { "FolderViewCSMRenameFolder", NULL, N_("mcen_me_user_renamefolder"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_rename_folder) }, + { "FolderViewCSMPasteMsgs", NULL, N_("mcen_me_inbox_paste"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_paste)}, + { "FolderViewCSMDeleteFolder", NULL, N_("mcen_me_inbox_delete"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_delete_folder) }, + { "FolderViewCSMSearchMessages", NULL, N_("mcen_me_inbox_search"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_search_messages) }, + { "FolderViewCSMHelp", NULL, N_("mcen_me_inbox_help"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_csm_help) }, +}; + +static const GtkActionEntry modest_header_view_action_entries [] = { + + /* Header View CSM actions */ + { "HeaderViewCSMOpen", NULL, N_("mcen_me_inbox_open"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_open) }, + { "HeaderViewCSMReply", NULL, N_("mcen_me_inbox_reply"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_reply) }, + { "HeaderViewCSMReplyAll", NULL, N_("mcen_me_inbox_replytoall"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_reply_all) }, + { "HeaderViewCSMForward", NULL, N_("mcen_me_inbox_forward"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_forward) }, + { "HeaderViewCSMCut", NULL, N_("mcen_me_inbox_cut"), "X", NULL, G_CALLBACK (modest_ui_actions_on_cut) }, + { "HeaderViewCSMCopy", NULL, N_("mcen_me_inbox_copy"), "C", NULL, G_CALLBACK (modest_ui_actions_on_copy) }, + { "HeaderViewCSMPaste", NULL, N_("mcen_me_inbox_paste"), "V", NULL, G_CALLBACK (modest_ui_actions_on_paste) }, + { "HeaderViewCSMDelete", NULL, N_("mcen_me_inbox_delete"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_delete_message) }, + { "HeaderViewCSMCancelSending", NULL, N_("mcen_me_outbox_cancelsend"), NULL, NULL, G_CALLBACK (modest_ui_actions_cancel_send) }, + { "HeaderViewCSMHelp", NULL, N_("mcen_me_inbox_help"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_help) }, +}; + +static const GtkToggleActionEntry modest_main_window_toggle_action_entries [] = { + { "ToggleFolders", MODEST_STOCK_SPLIT_VIEW, N_("mcen_me_inbox_hidefolders"), "t", NULL, G_CALLBACK (modest_ui_actions_toggle_folders_view), TRUE }, +}; + + /* uncomment the following if you have defined any signals */ /* static guint signals[LAST_SIGNAL] = {0}; */ @@ -149,9 +191,29 @@ modest_main_window_class_init (ModestMainWindowClass *klass) parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = modest_main_window_finalize; + ((ModestWindowClass *)(klass))->save_state_func = save_state; + g_type_class_add_private (gobject_class, sizeof(ModestMainWindowPrivate)); } +static GtkWidget * +create_main_bar (GtkWidget *progress_bar) +{ + GtkWidget *status_bar, *main_bar; + + main_bar = gtk_hbox_new (FALSE, 6); + + /* Status bar */ + status_bar = gtk_statusbar_new (); + gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (status_bar), FALSE); + + /* Pack */ + gtk_box_pack_start (GTK_BOX (main_bar), status_bar, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (main_bar), progress_bar, FALSE, FALSE, 0); + + return main_bar; +} + static void modest_main_window_init (ModestMainWindow *obj) { @@ -160,16 +222,18 @@ modest_main_window_init (ModestMainWindow *obj) TnyFolderStoreQuery *query; GtkWidget *icon; gboolean online; + GtkWidget *progress_bar; priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj); priv->folder_paned = NULL; priv->msg_paned = NULL; priv->main_paned = NULL; + priv->progress_widgets = NULL; account_store = TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()); - /* online/offline combo */ + /* online/offline toggle */ 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, @@ -177,29 +241,29 @@ modest_main_window_init (ModestMainWindow *obj) 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); + priv->style = MODEST_MAIN_WINDOW_STYLE_SPLIT; - /* status bar */ - priv->status_bar = gtk_statusbar_new (); - gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR(priv->status_bar), - FALSE); + /* Paned */ + priv->folder_paned = gtk_vpaned_new (); + priv->main_paned = gtk_hpaned_new (); + priv->msg_paned = gtk_vpaned_new (); - /* 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); + /* Main bar */ + priv->folder_info_label = gtk_label_new (NULL); + progress_bar = modest_progress_bar_new (); + priv->main_bar = create_main_bar (progress_bar); + priv->progress_widgets = g_slist_prepend (priv->progress_widgets, + progress_bar); /* msg preview */ - priv->msg_preview = MODEST_MSG_VIEW(modest_msg_view_new (NULL)); + priv->msg_preview = MODEST_MSG_VIEW(tny_platform_factory_new_msg_view + (modest_tny_platform_factory_get_instance ())); 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)); + MODEST_HEADER_VIEW(modest_header_view_new (NULL, MODEST_HEADER_VIEW_STYLE_TWOLINES)); if (!priv->header_view) g_printerr ("modest: cannot instantiate header view\n"); @@ -209,6 +273,7 @@ modest_main_window_init (ModestMainWindow *obj) TNY_FOLDER_STORE_QUERY_OPTION_SUBSCRIBED); priv->folder_view = MODEST_FOLDER_VIEW (modest_folder_view_new (query)); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (priv->folder_view), FALSE); if (!priv->folder_view) g_printerr ("modest: cannot instantiate folder view\n"); g_object_unref (G_OBJECT (query)); @@ -223,28 +288,24 @@ modest_main_window_finalize (GObject *obj) GtkWidget* modest_main_window_get_child_widget (ModestMainWindow *self, - ModestWidgetType widget_type) + ModestMainWindowWidgetType widget_type) { ModestMainWindowPrivate *priv; GtkWidget *widget; g_return_val_if_fail (self, NULL); - g_return_val_if_fail (widget_type >= 0 && widget_type < MODEST_WIDGET_TYPE_NUM, + g_return_val_if_fail (widget_type >= 0 && widget_type < MODEST_MAIN_WINDOW_WIDGET_TYPE_NUM, NULL); priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); switch (widget_type) { - case MODEST_WIDGET_TYPE_HEADER_VIEW: + case MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW: widget = (GtkWidget*)priv->header_view; break; - case MODEST_WIDGET_TYPE_FOLDER_VIEW: + case MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW: widget = (GtkWidget*)priv->folder_view; break; - case MODEST_WIDGET_TYPE_MSG_PREVIEW: + case MODEST_MAIN_WINDOW_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; @@ -255,7 +316,7 @@ modest_main_window_get_child_widget (ModestMainWindow *self, static void -restore_sizes (ModestMainWindow *self) +restore_settings (ModestMainWindow *self) { ModestConf *conf; ModestMainWindowPrivate *priv; @@ -267,73 +328,15 @@ restore_sizes (ModestMainWindow *self) conf = modest_runtime_get_conf (); modest_widget_memory_restore (conf, G_OBJECT(priv->folder_paned), - "modest-folder-paned"); + MODEST_CONF_FOLDER_PANED_KEY); modest_widget_memory_restore (conf, G_OBJECT(priv->msg_paned), - "modest-msg-paned"); + MODEST_CONF_MSG_PANED_KEY); 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"); -} - - -static void -save_sizes (ModestMainWindow *self) -{ - ModestWindowPrivate *parent_priv; - ModestMainWindowPrivate *priv; - ModestConf *conf; - - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - 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), - "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(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); */ -/* } */ + MODEST_CONF_MAIN_PANED_KEY); + modest_widget_memory_restore (conf, G_OBJECT(priv->header_view), + MODEST_CONF_HEADER_VIEW_KEY); + modest_widget_memory_restore (conf, G_OBJECT(self), + MODEST_CONF_MAIN_WINDOW_KEY); } void @@ -348,26 +351,25 @@ on_online_toggle_toggled (GtkToggleButton *toggle, ModestMainWindow *self) device = modest_runtime_get_device (); online = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->online_toggle)); - if (online) + if (online) { + /* TODO: Just attempt to go online, instead of forcing the online status: */ 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) +modest_main_window_on_show (GtkWidget *widget, gpointer user_data) { - gtk_main_quit(); -} + ModestMainWindow *self = MODEST_MAIN_WINDOW (widget); + /* Connect signals */ + connect_signals (self); + /* Restore window & widget settings */ + restore_settings (self); +} static void connect_signals (ModestMainWindow *self) @@ -382,18 +384,18 @@ connect_signals (ModestMainWindow *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); */ + 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), "folder-display-name-changed", + G_CALLBACK(modest_ui_actions_on_folder_display_name_changed), 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_selected", + G_CALLBACK(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", @@ -414,18 +416,20 @@ connect_signals (ModestMainWindow *self) G_CALLBACK(modest_ui_actions_on_msg_recpt_activated), self); /* Account store */ + /* Emmitted by our TnyAccountStore::get_password_func() implementation, + * This is not a normal part of tinymail: */ 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); + + /* Mail Operation Queue */ + g_signal_connect (G_OBJECT (modest_runtime_get_mail_operation_queue ()), + "queue-changed", + G_CALLBACK (on_queue_changed), + self); } @@ -451,7 +455,24 @@ wrapped_in_scrolled_window (GtkWidget *widget, gboolean needs_viewport) return win; } +static void +setup_toolbar (ModestMainWindow *self) +{ + ModestMainWindowPrivate *priv; + ModestWindowPrivate *parent_priv; + GtkWidget *item; + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + parent_priv = MODEST_WINDOW_GET_PRIVATE(self); + + item = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNew"); + gtk_tool_item_set_is_important (GTK_TOOL_ITEM (item), TRUE); + item = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply"); + gtk_tool_item_set_is_important (GTK_TOOL_ITEM (item), TRUE); + item = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarSendReceive"); + gtk_tool_item_set_is_important (GTK_TOOL_ITEM (item), TRUE); + +} ModestWindow * @@ -461,21 +482,28 @@ modest_main_window_new (void) ModestMainWindow *self; ModestMainWindowPrivate *priv; ModestWindowPrivate *parent_priv; - GtkWidget *main_vbox; GtkWidget *status_hbox; - GtkWidget *header_win, *folder_win; + GtkWidget *folder_win; + GtkWidget *preview_scroll; GtkActionGroup *action_group; GError *error = NULL; + ModestDimmingRulesGroup *menu_rules_group = NULL; + ModestDimmingRulesGroup *toolbar_rules_group = 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(); + parent_priv->ui_dimming_manager = modest_ui_dimming_manager_new (); action_group = gtk_action_group_new ("ModestMainWindowActions"); + gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); + + menu_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_MENU, FALSE); + toolbar_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_TOOLBAR, TRUE); /* Add common actions */ gtk_action_group_add_actions (action_group, @@ -483,6 +511,25 @@ modest_main_window_new (void) G_N_ELEMENTS (modest_action_entries), obj); + gtk_action_group_add_actions (action_group, + modest_header_view_action_entries, + G_N_ELEMENTS (modest_header_view_action_entries), + self); + + gtk_action_group_add_actions (action_group, + modest_folder_view_action_entries, + G_N_ELEMENTS (modest_folder_view_action_entries), + self); + + gtk_action_group_add_toggle_actions (action_group, + modest_toggle_action_entries, + G_N_ELEMENTS (modest_toggle_action_entries), + self); + gtk_action_group_add_toggle_actions (action_group, + modest_main_window_toggle_action_entries, + G_N_ELEMENTS (modest_toggle_action_entries), + self); + gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0); g_object_unref (action_group); @@ -494,8 +541,23 @@ modest_main_window_new (void) g_error_free (error); error = NULL; } - /* *************** */ + /* Add common dimming rules */ + modest_dimming_rules_group_add_rules (menu_rules_group, + modest_main_window_menu_dimming_entries, + G_N_ELEMENTS (modest_main_window_menu_dimming_entries), + MODEST_WINDOW (self)); + modest_dimming_rules_group_add_rules (toolbar_rules_group, + modest_main_window_toolbar_dimming_entries, + G_N_ELEMENTS (modest_main_window_toolbar_dimming_entries), + MODEST_WINDOW (self)); + + /* Insert dimming rules group for this window */ + modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, menu_rules_group); + modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, toolbar_rules_group); + g_object_unref (menu_rules_group); + g_object_unref (toolbar_rules_group); + /* Add accelerators */ gtk_window_add_accel_group (GTK_WINDOW (obj), gtk_ui_manager_get_accel_group (parent_priv->ui_manager)); @@ -504,47 +566,49 @@ modest_main_window_new (void) 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); + setup_toolbar (MODEST_MAIN_WINDOW (obj)); + 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); + priv->header_win = wrapped_in_scrolled_window (GTK_WIDGET(priv->header_view), FALSE); - /* paned */ - priv->folder_paned = gtk_vpaned_new (); - priv->msg_paned = gtk_vpaned_new (); - priv->main_paned = gtk_hpaned_new (); + /* Paned */ + preview_scroll = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (preview_scroll), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); 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_paned_add1 (GTK_PANED(priv->msg_paned), priv->header_win); + gtk_container_add (GTK_CONTAINER (preview_scroll), + GTK_WIDGET(priv->msg_preview)); + gtk_paned_add2 (GTK_PANED(priv->msg_paned), preview_scroll); - /* status bar / progress */ + /* Main Bar */ 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), 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->main_bar, TRUE, TRUE, 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, 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); - - gtk_container_add (GTK_CONTAINER(obj), main_vbox); - restore_sizes (MODEST_MAIN_WINDOW(obj)); + priv->main_vbox = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX(priv->main_vbox), parent_priv->menubar, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(priv->main_vbox), parent_priv->toolbar, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(priv->main_vbox), priv->main_paned, TRUE, TRUE,0); + gtk_box_pack_start (GTK_BOX(priv->main_vbox), status_hbox, FALSE, FALSE, 0); + gtk_container_add (GTK_CONTAINER(obj), priv->main_vbox); 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); + gtk_widget_show_all (priv->main_vbox); - /* Connect signals */ - connect_signals (MODEST_MAIN_WINDOW(obj)); + /* Do some tasks on show */ + g_signal_connect (G_OBJECT(self), "show", G_CALLBACK (modest_main_window_on_show), NULL); /* 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 ())); + gtk_window_set_default_size (GTK_WINDOW (obj), 800, 600); + return (ModestWindow *) obj; } @@ -558,7 +622,7 @@ on_header_view_button_press_event (ModestHeaderView *header_view, ModestWindowPrivate *parent_priv; parent_priv = MODEST_WINDOW_GET_PRIVATE (self); - menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/HeaderViewContextMenu"); + menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/HeaderViewCSM"); return show_context_popup_menu (self, GTK_TREE_VIEW (header_view), @@ -579,7 +643,7 @@ on_folder_view_button_press_event (ModestFolderView *folder_view, ModestWindowPrivate *parent_priv; parent_priv = MODEST_WINDOW_GET_PRIVATE (self); - menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/FolderViewContextMenu"); + menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/FolderViewCSM"); return show_context_popup_menu (self, GTK_TREE_VIEW (folder_view), @@ -627,3 +691,217 @@ show_context_popup_menu (ModestMainWindow *window, } return TRUE; } + +static void +on_queue_changed (ModestMailOperationQueue *queue, + ModestMailOperation *mail_op, + ModestMailOperationQueueNotification type, + ModestMainWindow *self) +{ + GSList *tmp; + ModestMainWindowPrivate *priv; + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + + tmp = priv->progress_widgets; + + switch (type) { + case MODEST_MAIL_OPERATION_QUEUE_OPERATION_ADDED: + while (tmp) { + modest_progress_object_add_operation (MODEST_PROGRESS_OBJECT (tmp->data), + mail_op); + tmp = g_slist_next (tmp); + } + break; + case MODEST_MAIL_OPERATION_QUEUE_OPERATION_REMOVED: + while (tmp) { + modest_progress_object_remove_operation (MODEST_PROGRESS_OBJECT (tmp->data), + mail_op); + tmp = g_slist_next (tmp); + } + break; + } +} + +void +modest_main_window_set_style (ModestMainWindow *self, + ModestMainWindowStyle style) +{ + ModestMainWindowPrivate *priv; + ModestWindowPrivate *parent_priv; + GtkAction *action; + gboolean active; + + g_return_if_fail (MODEST_IS_MAIN_WINDOW (self)); + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + parent_priv = MODEST_WINDOW_GET_PRIVATE(self); + + /* no change -> nothing to do */ + if (priv->style == style) + return; + + /* Get toggle button and update the state if needed. This will + happen only when the set_style is not invoked from the UI, + for example when it's called from widget memory */ + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToggleFolders"); + active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); + if ((active && style == MODEST_MAIN_WINDOW_STYLE_SIMPLE) || + (!active && style == MODEST_MAIN_WINDOW_STYLE_SPLIT)) { + g_signal_handlers_block_by_func (action, modest_ui_actions_toggle_folders_view, self); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), !active); + g_signal_handlers_unblock_by_func (action, modest_ui_actions_toggle_folders_view, self); + } + + priv->style = style; + switch (style) { + case MODEST_MAIN_WINDOW_STYLE_SIMPLE: + /* Remove main paned */ + g_object_ref (priv->main_paned); + gtk_container_remove (GTK_CONTAINER (priv->main_vbox), priv->main_paned); + + /* Reparent the contents widget to the main vbox */ + gtk_widget_reparent (priv->header_win, priv->main_vbox); + + break; + case MODEST_MAIN_WINDOW_STYLE_SPLIT: + /* Remove header view */ + g_object_ref (priv->header_win); + gtk_container_remove (GTK_CONTAINER (priv->main_vbox), priv->header_win); + + /* Reparent the main paned */ + gtk_paned_add2 (GTK_PANED (priv->main_paned), priv->header_win); + gtk_container_add (GTK_CONTAINER (priv->main_vbox), priv->main_paned); + + break; + default: + g_return_if_reached (); + } + +/* /\* Let header view grab the focus if it's being shown *\/ */ +/* if (priv->contents_style == MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS) */ +/* gtk_widget_grab_focus (GTK_WIDGET (priv->header_view)); */ +/* else */ +/* gtk_widget_grab_focus (GTK_WIDGET (priv->contents_widget)); */ + + /* Show changes */ + gtk_widget_show_all (GTK_WIDGET (priv->main_vbox)); +} + + +ModestMainWindowStyle +modest_main_window_get_style (ModestMainWindow *self) +{ + /* TODO */ + return MODEST_MAIN_WINDOW_STYLE_SPLIT; +} + +void +modest_main_window_set_contents_style (ModestMainWindow *self, + ModestMainWindowContentsStyle style) +{ + /* TODO */ +} + +ModestMainWindowContentsStyle +modest_main_window_get_contents_style (ModestMainWindow *self) +{ + /* TODO */ + return MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS; +} + + +static void +get_msg_callback (TnyFolder *folder, + gboolean cancelled, + TnyMsg *msg, + GError **err, + gpointer user_data) +{ + if (!err ||!(*err)) { + ModestMsgView *msg_preview; + + msg_preview = MODEST_MSG_VIEW (user_data); + tny_msg_view_set_msg (TNY_MSG_VIEW (msg_preview), msg); + } + + /* Frees */ + g_object_unref (folder); +} + +static void +on_header_selected (ModestHeaderView *header_view, + TnyHeader *header, + ModestMainWindow *main_window) +{ + TnyFolder *folder; + ModestMainWindowPrivate *priv; + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE (main_window); + + if (!header) + return; + + folder = tny_header_get_folder (header); + + /* FIXME: do not use this directly. Use a mail operation + instead in order to get progress info */ + tny_folder_get_msg_async (folder, + header, + (TnyGetMsgCallback) get_msg_callback, + NULL, + priv->msg_preview); +} + +void +modest_main_window_notify_send_receive_initied (ModestMainWindow *self) +{ + g_message("NOT IMPLEMENTED %s", __FUNCTION__); +} +void +modest_main_window_notify_send_receive_completed (ModestMainWindow *self) +{ + g_message("NOT IMPLEMENTED %s", __FUNCTION__); +} + +gboolean +modest_main_window_transfer_mode_enabled (ModestMainWindow *self) +{ + g_message("NOT IMPLEMENTED %s", __FUNCTION__); + return FALSE; +} + +gboolean +modest_main_window_on_msg_view_window_msg_changed (ModestMsgViewWindow *view_window, + GtkTreeModel *model, + GtkTreeRowReference *row_reference, + ModestMainWindow *self) +{ + g_message("NOT IMPLEMENTED %s", __FUNCTION__); + return FALSE; +} + +gboolean +modest_main_window_screen_is_on (ModestMainWindow *self) +{ + g_message("NOT IMPLEMENTED %s", __FUNCTION__); + return TRUE; +} + +static void +save_state (ModestWindow *window) +{ + ModestConf *conf; + ModestMainWindow* self = MODEST_MAIN_WINDOW(window); + ModestMainWindowPrivate *priv; + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + conf = modest_runtime_get_conf (); + + modest_widget_memory_save (conf, G_OBJECT(self), + MODEST_CONF_MAIN_WINDOW_KEY); + modest_widget_memory_save (conf, G_OBJECT(priv->main_paned), + MODEST_CONF_MAIN_PANED_KEY); + modest_widget_memory_save (conf, G_OBJECT(priv->folder_view), + MODEST_CONF_FOLDER_VIEW_KEY); +}