X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-main-window.c;h=ce89897b2369163fd10120b26081a4faa2b4dce6;hb=8f4797391e5962158a0a085646f1d24da887ee3d;hp=6fa1f686d612a4671b37884f602b565f1120bf47;hpb=4ed609c67210b021da2ac6584a75671c4012815d;p=modest diff --git a/src/maemo/modest-main-window.c b/src/maemo/modest-main-window.c index 6fa1f68..ce89897 100644 --- a/src/maemo/modest-main-window.c +++ b/src/maemo/modest-main-window.c @@ -33,7 +33,6 @@ #include #include #include -#include #include #include "modest-hildon-includes.h" #include "modest-defs.h" @@ -65,6 +64,9 @@ #include "maemo/modest-osso-state-saving.h" #include "modest-text-utils.h" #include "modest-signal-mgr.h" +#ifdef MODEST_USE_LIBTIME +#include +#endif #define MODEST_MAIN_WINDOW_ACTION_GROUP_ADDITIONS "ModestMainWindowActionAdditions" @@ -176,7 +178,7 @@ static void on_updating_msg_list (ModestHeaderView *header_view, static gboolean restore_paned_timeout_handler (gpointer *data); -static gboolean show_retrieving_banner (gpointer user_data); +static gboolean show_opening_banner (gpointer user_data); static void on_window_destroy (GtkObject *widget, gpointer userdata); @@ -236,9 +238,9 @@ struct _ModestMainWindowPrivate { GtkWidget *updating_banner; guint updating_banner_timeout; - /* "Retrieving" banner for header view */ - GtkWidget *retrieving_banner; - guint retrieving_banner_timeout; + /* "Opening" banner for header view */ + GtkWidget *opening_banner; + guint opening_banner_timeout; /* Display state */ osso_display_state_t display_state; @@ -369,8 +371,8 @@ modest_main_window_init (ModestMainWindow *obj) priv->sighandlers = NULL; priv->updating_banner = NULL; priv->updating_banner_timeout = 0; - priv->retrieving_banner = NULL; - priv->retrieving_banner_timeout = 0; + priv->opening_banner = NULL; + priv->opening_banner_timeout = 0; priv->display_state = OSSO_DISPLAY_ON; modest_window_mgr_register_help_id (modest_runtime_get_window_mgr(), @@ -419,14 +421,14 @@ modest_main_window_finalize (GObject *obj) priv->updating_banner = NULL; } - if (priv->retrieving_banner_timeout > 0) { - g_source_remove (priv->retrieving_banner_timeout); - priv->retrieving_banner_timeout = 0; + if (priv->opening_banner_timeout > 0) { + g_source_remove (priv->opening_banner_timeout); + priv->opening_banner_timeout = 0; } - if (priv->retrieving_banner) { - gtk_widget_destroy (priv->retrieving_banner); - priv->retrieving_banner = NULL; + if (priv->opening_banner) { + gtk_widget_destroy (priv->opening_banner); + priv->opening_banner = NULL; } if (priv->restore_paned_timeout > 0) { @@ -1115,7 +1117,8 @@ modest_main_window_on_show (GtkWidget *self, gpointer user_data) ShowHelper *helper = (ShowHelper *) user_data; GtkWidget *folder_win = helper->folder_win; ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - + ModestAccountMgr *mgr; + priv->folder_view = MODEST_FOLDER_VIEW (modest_platform_create_folder_view (NULL)); wrap_in_scrolled_window (folder_win, GTK_WIDGET(priv->folder_view)); @@ -1137,26 +1140,10 @@ modest_main_window_on_show (GtkWidget *self, gpointer user_data) restore_settings (MODEST_MAIN_WINDOW(self), TRUE); priv->wait_for_settings = FALSE; - /* Check if accounts exist and show the account wizard if not */ - gboolean accounts_exist = - modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE); - - if (!accounts_exist) { - /* This is necessary to have the main window shown behind the dialog - It's an ugly hack... jschmid */ - gtk_widget_show_all(GTK_WIDGET(self)); - modest_ui_actions_on_accounts (NULL, MODEST_WINDOW(self)); - } else { - GSList *accounts; - GtkAction *send_receive_all; - ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (self); - accounts = modest_account_mgr_account_names (modest_runtime_get_account_mgr (), TRUE); - send_receive_all = gtk_ui_manager_get_action (parent_priv->ui_manager, - "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveAllMenu"); - gtk_action_set_visible (send_receive_all, g_slist_length (accounts) > 0); - modest_account_mgr_free_account_names (accounts); + /* Update the menus if there are accounts */ + mgr = modest_runtime_get_account_mgr(); + if (modest_account_mgr_has_accounts(mgr, TRUE)) update_menus (MODEST_MAIN_WINDOW (self)); - } /* Never call this function again (NOTE that it could happen as we hide the main window instead of closing it while @@ -1730,7 +1717,7 @@ on_inner_widgets_key_pressed (GtkWidget *widget, return FALSE; if (MODEST_IS_HEADER_VIEW (widget)) { - if (event->keyval == GDK_Left) + if (event->keyval == GDK_Left || event->keyval == GDK_KP_Left) gtk_widget_grab_focus (GTK_WIDGET (priv->folder_view)); else if ((event->keyval == GDK_Return)||(event->keyval == GDK_KP_Enter)) { guint selected_headers = modest_header_view_count_selected_headers (MODEST_HEADER_VIEW (widget)); @@ -1753,7 +1740,8 @@ on_inner_widgets_key_pressed (GtkWidget *widget, } } } - } else if (MODEST_IS_FOLDER_VIEW (widget) && (event->keyval == GDK_Right || event->keyval == GDK_Left)) { + } else if (MODEST_IS_FOLDER_VIEW (widget) && + (event->keyval == GDK_Right || event->keyval == GDK_KP_Right || event->keyval == GDK_Left || event->keyval == GDK_KP_Left)) { #if GTK_CHECK_VERSION(2, 8, 0) /* TODO: gtk_tree_view_get_visible_range() is only available in GTK+ 2.8 */ GtkTreePath *selected_path = NULL; GtkTreePath *start_path = NULL; @@ -2043,6 +2031,16 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account) last_updated = modest_account_mgr_get_last_updated (modest_runtime_get_account_mgr (), tny_account_get_id (account)); +#ifdef MODEST_USE_LIBTIME + /* If we use libtime, we are storing the time in UTC so we have to convert to currently + * selected time */ + time_t now; + struct tm *localtime_tm; + time (&now); + localtime_tm = localtime (&now); + last_updated -= time_get_utc_offset (localtime_tm->tm_zone); +#endif + if (last_updated > 0) last_updated_string = modest_text_utils_get_display_date(last_updated); else @@ -2214,6 +2212,8 @@ modest_main_window_set_contents_style (ModestMainWindow *self, wrap_in_scrolled_window (priv->contents_widget, GTK_WIDGET (priv->header_view)); modest_maemo_set_thumbable_scrollbar (GTK_SCROLLED_WINDOW(priv->contents_widget), TRUE); + if (priv->style == MODEST_MAIN_WINDOW_STYLE_SIMPLE) + gtk_widget_grab_focus (GTK_WIDGET (priv->header_view)); break; case MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS: { @@ -2229,16 +2229,21 @@ modest_main_window_set_contents_style (ModestMainWindow *self, wrap_in_scrolled_window (priv->contents_widget, priv->details_widget); } - g_object_unref (selected_folderstore); + if (selected_folderstore) + g_object_unref (selected_folderstore); modest_maemo_set_thumbable_scrollbar (GTK_SCROLLED_WINDOW(priv->contents_widget), FALSE); } + if (priv->style == MODEST_MAIN_WINDOW_STYLE_SIMPLE) + gtk_widget_grab_focus (GTK_WIDGET (priv->details_widget)); break; } case MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY: wrap_in_scrolled_window (priv->contents_widget, GTK_WIDGET (priv->empty_view)); modest_maemo_set_thumbable_scrollbar (GTK_SCROLLED_WINDOW(priv->contents_widget), FALSE); + if (priv->style == MODEST_MAIN_WINDOW_STYLE_SIMPLE) + gtk_widget_grab_focus (GTK_WIDGET (priv->empty_view)); break; default: g_return_if_reached (); @@ -2246,6 +2251,10 @@ modest_main_window_set_contents_style (ModestMainWindow *self, /* Show */ gtk_widget_show_all (priv->contents_widget); + + /* Recompute dimming rules */ + modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (self)); + modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (self)); } ModestMainWindowContentsStyle @@ -2469,7 +2478,6 @@ get_toolbar_mode_from_mail_operation (ModestMainWindow *self, switch (modest_mail_operation_get_type_operation (mail_op)) { case MODEST_MAIL_OPERATION_TYPE_SEND_AND_RECEIVE: case MODEST_MAIL_OPERATION_TYPE_RECEIVE: - case MODEST_MAIL_OPERATION_TYPE_OPEN: mode = TOOLBAR_MODE_TRANSFER; if (priv->current_toolbar_mode == TOOLBAR_MODE_NORMAL) *mode_changed = TRUE; @@ -2499,7 +2507,7 @@ on_mail_operation_started (ModestMailOperation *mail_op, account is the local account or the MMC one */ op_type = modest_mail_operation_get_type_operation (mail_op); account = modest_mail_operation_get_account (mail_op); - if (account && op_type == MODEST_MAIL_OPERATION_TYPE_RECEIVE) { + if (account && op_type == MODEST_MAIL_OPERATION_TYPE_OPEN) { gboolean is_remote; is_remote = !(modest_tny_account_is_virtual_local_folders (account) || @@ -2510,13 +2518,13 @@ on_mail_operation_started (ModestMailOperation *mail_op, } /* Show information banner. Remove old timeout */ - if (priv->retrieving_banner_timeout > 0) { - g_source_remove (priv->retrieving_banner_timeout); - priv->retrieving_banner_timeout = 0; + if (priv->opening_banner_timeout > 0) { + g_source_remove (priv->opening_banner_timeout); + priv->opening_banner_timeout = 0; } /* Create a new timeout */ - priv->retrieving_banner_timeout = - g_timeout_add (2000, show_retrieving_banner, self); + priv->opening_banner_timeout = + g_timeout_add (2000, show_opening_banner, self); } /* Not every mail operation has account, noop does not */ @@ -2568,7 +2576,7 @@ on_mail_operation_finished (ModestMailOperation *mail_op, the account was the local account or the MMC one */ op_type = modest_mail_operation_get_type_operation (mail_op); account = modest_mail_operation_get_account (mail_op); - if (account && op_type == MODEST_MAIL_OPERATION_TYPE_RECEIVE) { + if (account && op_type == MODEST_MAIL_OPERATION_TYPE_OPEN) { gboolean is_remote; is_remote = !(modest_tny_account_is_virtual_local_folders (account) || @@ -2579,15 +2587,15 @@ on_mail_operation_finished (ModestMailOperation *mail_op, } /* Remove old timeout */ - if (priv->retrieving_banner_timeout > 0) { - g_source_remove (priv->retrieving_banner_timeout); - priv->retrieving_banner_timeout = 0; + if (priv->opening_banner_timeout > 0) { + g_source_remove (priv->opening_banner_timeout); + priv->opening_banner_timeout = 0; } /* Remove the banner if exists */ - if (priv->retrieving_banner) { - gtk_widget_destroy (priv->retrieving_banner); - priv->retrieving_banner = NULL; + if (priv->opening_banner) { + gtk_widget_destroy (priv->opening_banner); + priv->opening_banner = NULL; } } @@ -2770,7 +2778,8 @@ on_zoom_minus_plus_not_implemented (ModestWindow *window) { g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (window), FALSE); - hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_cannot_zoom_here")); + hildon_banner_show_information (NULL, NULL, + _CS("ckct_ib_cannot_zoom_here")); return FALSE; } @@ -2902,6 +2911,17 @@ modest_main_window_on_msg_view_window_msg_changed (ModestMsgViewWindow *view_win return TRUE; } +static void +updating_banner_destroyed (gpointer data, + GObject *where_the_object_was) +{ + ModestMainWindowPrivate *priv = NULL; + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE (data); + + priv->updating_banner = NULL; +} + static gboolean show_updating_banner (gpointer user_data) { @@ -2916,6 +2936,13 @@ show_updating_banner (gpointer user_data) priv->updating_banner = modest_platform_animation_banner (GTK_WIDGET (user_data), NULL, _CS ("ckdg_pb_updating")); + + /* We need this because banners in Maemo could be + destroyed by dialogs so we need to properly update + our reference to it */ + g_object_weak_ref (G_OBJECT (priv->updating_banner), + updating_banner_destroyed, + user_data); gdk_threads_leave (); } @@ -2979,14 +3006,14 @@ remove_banners (ModestMainWindow *window) priv = MODEST_MAIN_WINDOW_GET_PRIVATE (window); - if (priv->retrieving_banner_timeout > 0) { - g_source_remove (priv->retrieving_banner_timeout); - priv->retrieving_banner_timeout = 0; + if (priv->opening_banner_timeout > 0) { + g_source_remove (priv->opening_banner_timeout); + priv->opening_banner_timeout = 0; } - if (priv->retrieving_banner != NULL) { - gtk_widget_destroy (priv->retrieving_banner); - priv->retrieving_banner = NULL; + if (priv->opening_banner != NULL) { + gtk_widget_destroy (priv->opening_banner); + priv->opening_banner = NULL; } if (priv->updating_banner_timeout > 0) { @@ -3041,24 +3068,49 @@ on_window_destroy (GtkObject *widget, remove_banners (MODEST_MAIN_WINDOW (widget)); } +static void +opening_banner_destroyed (gpointer data, + GObject *where_the_object_was) +{ + ModestMainWindowPrivate *priv = NULL; + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE (data); + + priv->opening_banner = NULL; +} + static gboolean -show_retrieving_banner (gpointer user_data) +show_opening_banner (gpointer user_data) { ModestMainWindowPrivate *priv = NULL; priv = MODEST_MAIN_WINDOW_GET_PRIVATE (user_data); - if (priv->retrieving_banner == NULL) { + if (priv->opening_banner == NULL) { /* We're outside the main lock */ gdk_threads_enter (); - priv->retrieving_banner = + priv->opening_banner = modest_platform_animation_banner (GTK_WIDGET (user_data), NULL, - _("mcen_ib_getting_items")); + _("mail_me_opening")); + + /* We need this because banners in Maemo could be + destroyed by dialogs so we need to properly update + our reference to it */ + g_object_weak_ref (G_OBJECT (priv->opening_banner), + opening_banner_destroyed, + user_data); + + /* We need this because banners in Maemo could be + destroyed by dialogs so we need to properly update + our reference to it */ + g_object_weak_ref (G_OBJECT (priv->updating_banner), + updating_banner_destroyed, + user_data); gdk_threads_leave (); } /* Remove timeout */ - priv->retrieving_banner_timeout = 0; + priv->opening_banner_timeout = 0; return FALSE; }