#include <tny-simple-list.h>
#include <tny-list.h>
#include <tny-iterator.h>
-#include <tny-maemo-conic-device.h>
#include <tny-error.h>
#include "modest-hildon-includes.h"
#include "modest-defs.h"
#include "modest-tny-msg.h"
#include "modest-mail-operation.h"
#include "modest-icon-names.h"
-#include "modest-progress-bar-widget.h"
+#include "modest-progress-bar.h"
#include "modest-text-utils.h"
#include "modest-ui-dimming-manager.h"
#include "maemo/modest-osso-state-saving.h"
#include "modest-text-utils.h"
#include "modest-signal-mgr.h"
+#ifdef MODEST_USE_LIBTIME
+#include <clockd/libtime.h>
+#endif
#define MODEST_MAIN_WINDOW_ACTION_GROUP_ADDITIONS "ModestMainWindowActionAdditions"
static gboolean restore_paned_timeout_handler (gpointer *data);
+static gboolean show_opening_banner (gpointer user_data);
+
+static void on_window_destroy (GtkObject *widget,
+ gpointer userdata);
+
+static void on_window_hide (GObject *gobject,
+ GParamSpec *arg1,
+ gpointer user_data);
+
typedef struct _ModestMainWindowPrivate ModestMainWindowPrivate;
struct _ModestMainWindowPrivate {
GtkWidget *msg_paned;
ModestMainWindowStyle style;
ModestMainWindowContentsStyle contents_style;
+ gboolean wait_for_settings;
guint progress_bar_timeout;
guint restore_paned_timeout;
GtkWidget *updating_banner;
guint updating_banner_timeout;
+ /* "Opening" banner for header view */
+ GtkWidget *opening_banner;
+ guint opening_banner_timeout;
+
/* Display state */
osso_display_state_t display_state;
};
{ "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_help) },
+ { "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 [] = {
priv->progress_bar = NULL;
priv->current_toolbar_mode = TOOLBAR_MODE_NORMAL;
priv->style = MODEST_MAIN_WINDOW_STYLE_SPLIT;
+ priv->wait_for_settings = TRUE;
priv->contents_style = -1; /* invalid contents style. We need this to select it for the first time */
priv->merge_ids = NULL;
priv->optimized_view = FALSE;
priv->sighandlers = NULL;
priv->updating_banner = NULL;
priv->updating_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(),
call this function before */
modest_main_window_disconnect_signals (MODEST_WINDOW (obj));
modest_main_window_cleanup_queue_error_signals ((ModestMainWindow *) obj);
+
+ if (priv->empty_view) {
+ g_object_unref (priv->empty_view);
+ priv->empty_view = NULL;
+ }
+
+ if (priv->header_view) {
+ g_object_unref (priv->header_view);
+ priv->header_view = NULL;
+ }
g_slist_free (priv->progress_widgets);
priv->updating_banner = NULL;
}
+ if (priv->opening_banner_timeout > 0) {
+ g_source_remove (priv->opening_banner_timeout);
+ priv->opening_banner_timeout = 0;
+ }
+
+ if (priv->opening_banner) {
+ gtk_widget_destroy (priv->opening_banner);
+ priv->opening_banner = NULL;
+ }
+
if (priv->restore_paned_timeout > 0) {
g_source_remove (priv->restore_paned_timeout);
priv->restore_paned_timeout = 0;
return NULL;
}
- return widget ? GTK_WIDGET(widget) : NULL;
+ /* Note that the window could have been destroyed, and so
+ their children, but still have some references */
+ return (widget && GTK_IS_WIDGET(widget)) ? GTK_WIDGET(widget) : NULL;
}
static gboolean
modest_widget_memory_restore (conf, G_OBJECT(priv->folder_view),
MODEST_CONF_FOLDER_VIEW_KEY);
- modest_widget_memory_restore (conf, G_OBJECT(priv->main_paned),
- MODEST_CONF_MAIN_PANED_KEY);
+/* modest_widget_memory_restore (conf, G_OBJECT(priv->main_paned), */
+/* MODEST_CONF_MAIN_PANED_KEY); */
- g_timeout_add (500, (GSourceFunc) restore_paned_timeout_handler, self);
+ g_timeout_add (250, (GSourceFunc) restore_paned_timeout_handler, self);
/* We need to force a redraw here in order to get the right
position of the horizontal paned separator */
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->header_view),
- // MODEST_CONF_HEADER_VIEW_KEY);
+ /* Only save main paned position if we're in split mode */
+ if (priv->style == MODEST_MAIN_WINDOW_STYLE_SPLIT)
+ 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);
}
compare_display_names (ModestAccountSettings *a,
ModestAccountSettings *b)
{
- return strcmp (modest_account_settings_get_display_name (a),
- modest_account_settings_get_display_name (b));
+ return g_utf8_collate (modest_account_settings_get_display_name (a),
+ modest_account_settings_get_display_name (b));
+
+}
+
+/* We use this function to prevent the send&receive CSM to be shown
+ when there are less than two account */
+static gboolean
+tap_and_hold_query_cb (GtkWidget *widget, GdkEvent *event)
+{
+ return TRUE;
}
static void
display_name = g_strdup_printf (_("mcen_me_toolbar_sendreceive_mailbox_n"),
modest_account_settings_get_display_name (settings));
}
+
+
/* Create action and add it to the action group. The
action name must be the account name, this way we
gchar* item_name, *refresh_action_name;
guint8 merge_id = 0;
GtkAction *view_account_action, *refresh_account_action;
+ gchar *escaped_display_name;
+
+ escaped_display_name = modest_text_utils_escape_mnemonics (display_name);
view_account_action = GTK_ACTION (gtk_radio_action_new (account_name,
- display_name, NULL, NULL, 0));
+ escaped_display_name, NULL, NULL, 0));
+ g_free (escaped_display_name);
gtk_action_group_add_action (priv->view_additions_group, view_account_action);
gtk_radio_action_set_group (GTK_RADIO_ACTION (view_account_action), radio_group);
radio_group = gtk_radio_action_get_group (GTK_RADIO_ACTION (view_account_action));
/* Add ui from account data. We allow 2^9-1 account
changes in a single execution because we're
downcasting the guint to a guint8 in order to use a
- GByteArray. It should be enough. */
+ GByteArray. It should be enough :-) */
item_name = g_strconcat (account_name, "Menu", NULL);
merge_id = (guint8) gtk_ui_manager_new_merge_id (parent_priv->ui_manager);
priv->merge_ids = g_byte_array_append (priv->merge_ids, &merge_id, 1);
/* Create item and add it to the send&receive
CSM. If there is only one account then
it'll be no menu */
- if (priv->accounts_popup) {
+ if (num_accounts > 1) {
GtkWidget *label = gtk_label_new(NULL);
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
- if (default_account && (strcmp(account_name, default_account) == 0))
- {
+ if (default_account && (strcmp(account_name, default_account) == 0)) {
gchar *escaped = g_markup_printf_escaped ("<b>%s</b>", display_name);
gtk_label_set_markup (GTK_LABEL (label), escaped);
g_free (escaped);
- }
- else
- {
+ } else {
gtk_label_set_text (GTK_LABEL (label), display_name);
}
item = gtk_menu_item_new ();
gtk_container_add (GTK_CONTAINER (item), label);
- gtk_menu_shell_prepend (GTK_MENU_SHELL (priv->accounts_popup), GTK_WIDGET (item));
+ gtk_menu_shell_prepend (GTK_MENU_SHELL (priv->accounts_popup),
+ GTK_WIDGET (item));
g_signal_connect_data (G_OBJECT (item),
"activate",
G_CALLBACK (on_send_receive_csm_activated),
* group being inserted. This makes the default account appear in bold.
* I agree it is a rather ugly way, but I don't see another possibility. armin. */
for (i = 0; i < num_accounts; i++) {
- ModestAccountSettings *settings = (ModestAccountSettings *) g_slist_nth_data (accounts, i);
+ gchar *item_name, *path;
+ GtkWidget *item;
+ ModestAccountSettings *settings;
const gchar *account_name;
+ gboolean is_default;
+ settings = (ModestAccountSettings *) g_slist_nth_data (accounts, i);
account_name = modest_account_settings_get_account_name (settings);
+ is_default = (account_name && default_account && !strcmp (account_name, default_account));
- if(account_name && default_account &&
- strcmp (account_name, default_account) == 0) {
- gchar *item_name = g_strconcat (account_name, "Menu", NULL);
-
- gchar *path = g_strconcat ("/MenuBar/ViewMenu/ViewMenuAdditions/", item_name, NULL);
- GtkWidget *item = gtk_ui_manager_get_widget (parent_priv->ui_manager, path);
- g_free(path);
-
- if (item) {
- GtkWidget *child = gtk_bin_get_child (GTK_BIN (item));
- if (GTK_IS_LABEL (child)) {
- const gchar *cur_name = gtk_label_get_text (GTK_LABEL (child));
+ /* Get the item of the view menu */
+ item_name = g_strconcat (account_name, "Menu", NULL);
+ path = g_strconcat ("/MenuBar/ViewMenu/ViewMenuAdditions/", item_name, NULL);
+ item = gtk_ui_manager_get_widget (parent_priv->ui_manager, path);
+ g_free(path);
+
+ if (item) {
+ GtkWidget *child = gtk_bin_get_child (GTK_BIN (item));
+ if (GTK_IS_LABEL (child)) {
+ const gchar *cur_name = gtk_label_get_text (GTK_LABEL (child));
+ if (is_default) {
gchar *bold_name = g_markup_printf_escaped("<b>%s</b>", cur_name);
gtk_label_set_markup (GTK_LABEL (child), bold_name);
g_free (bold_name);
}
+ gtk_label_set_ellipsize (GTK_LABEL (child), PANGO_ELLIPSIZE_END);
}
+ }
- path = g_strconcat("/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsMenuAdditions/", item_name, NULL);
- item = gtk_ui_manager_get_widget (parent_priv->ui_manager, path);
- g_free (path);
-
- if (item) {
- GtkWidget *child = gtk_bin_get_child (GTK_BIN (item));
- if (GTK_IS_LABEL (child)) {
- const gchar *cur_name = gtk_label_get_text (GTK_LABEL (child));
+ /* Get the item of the tools menu */
+ path = g_strconcat("/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsMenuAdditions/", item_name, NULL);
+ item = gtk_ui_manager_get_widget (parent_priv->ui_manager, path);
+ g_free (path);
+
+ if (item) {
+ GtkWidget *child = gtk_bin_get_child (GTK_BIN (item));
+ if (GTK_IS_LABEL (child)) {
+ const gchar *cur_name = gtk_label_get_text (GTK_LABEL (child));
+ if (is_default) {
gchar *bold_name = g_markup_printf_escaped("<b>%s</b>", cur_name);
gtk_label_set_markup (GTK_LABEL (child), bold_name);
g_free (bold_name);
}
+ gtk_label_set_ellipsize (GTK_LABEL (child), PANGO_ELLIPSIZE_END);
}
-
- g_free(item_name);
}
+ g_free(item_name);
g_object_unref (settings);
}
- if (priv->accounts_popup) {
+ if (num_accounts > 1) {
+ /* Disconnect the tap-and-hold-query if it's connected */
+ if (modest_signal_mgr_is_connected (priv->sighandlers,
+ G_OBJECT (send_receive_button),
+ "tap-and-hold-query"))
+ priv->sighandlers = modest_signal_mgr_disconnect (priv->sighandlers,
+ G_OBJECT (send_receive_button),
+ "tap-and-hold-query");
+
/* Mandatory in order to view the menu contents */
gtk_widget_show_all (priv->accounts_popup);
/* Setup tap_and_hold just if was not done before*/
if (!gtk_menu_get_attach_widget (GTK_MENU (priv->accounts_popup)))
gtk_widget_tap_and_hold_setup (send_receive_button, priv->accounts_popup, NULL, 0);
+ } else {
+ /* Connect the tap-and-hold-query in order not to show the CSM */
+ if (!modest_signal_mgr_is_connected (priv->sighandlers,
+ G_OBJECT (send_receive_button),
+ "tap-and-hold-query"))
+ priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,
+ G_OBJECT (send_receive_button),
+ "tap-and-hold-query",
+ G_CALLBACK (tap_and_hold_query_cb),
+ NULL);
}
/* Frees */
static void
+_folder_view_csm_menu_activated (GtkWidget *widget, gpointer user_data)
+{
+ g_return_if_fail (MODEST_IS_MAIN_WINDOW (user_data));
+
+ /* Update dimmed */
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW(user_data));
+}
+
+static void
+_header_view_csm_menu_activated (GtkWidget *widget, gpointer user_data)
+{
+ g_return_if_fail (MODEST_IS_MAIN_WINDOW (user_data));
+
+ /* Update visibility */
+
+ /* Update dimmed */
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW(user_data));
+}
+
+static void
modest_main_window_disconnect_signals (ModestWindow *self)
{
ModestMainWindowPrivate *priv;
/* Folder view CSM */
menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/FolderViewCSM");
gtk_widget_tap_and_hold_setup (GTK_WIDGET (priv->folder_view), menu, NULL, 0);
+ priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, G_OBJECT(priv->folder_view), "tap-and-hold",
+ G_CALLBACK(_folder_view_csm_menu_activated),
+ self);
/* header view */
priv->sighandlers =
modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->header_view), "header_selected",
/* Header view CSM */
menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/HeaderViewCSM");
gtk_widget_tap_and_hold_setup (GTK_WIDGET (priv->header_view), menu, NULL, 0);
+ priv->sighandlers =
+ modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->header_view), "tap-and-hold",
+ G_CALLBACK(_header_view_csm_menu_activated),
+ self);
/* window */
priv->sighandlers =
modest_signal_mgr_connect (priv->sighandlers,G_OBJECT (self), "window-state-event",
G_CALLBACK (modest_main_window_window_state_event),
NULL);
+ /* we don't register this in sighandlers, as it should be run after disconnecting all signals,
+ * in destroy stage */
+ g_signal_connect (G_OBJECT (self), "destroy", G_CALLBACK (on_window_destroy), NULL);
+
+ g_signal_connect (G_OBJECT (self), "notify::visible", G_CALLBACK (on_window_hide), NULL);
/* Mail Operation Queue */
priv->sighandlers =
"account_changed",
G_CALLBACK (on_account_changed),
self);
-
- priv->sighandlers =
- modest_signal_mgr_connect (priv->sighandlers,
- G_OBJECT (modest_runtime_get_account_store()),
- "password_requested",
- G_CALLBACK (modest_ui_actions_on_password_requested),
- self);
}
static void
}
}
+typedef struct
+{
+ GtkWidget *folder_win;
+ gulong handler_id;
+} ShowHelper;
+
static void
modest_main_window_on_show (GtkWidget *self, gpointer user_data)
{
- GtkWidget *folder_win = (GtkWidget *) 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));
modest_osso_load_state ();
/* Restore window & widget settings */
+ priv->wait_for_settings = TRUE;
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
+ there are operations ongoing) and free the helper */
+ g_signal_handler_disconnect (self, helper->handler_id);
+ g_slice_free (ShowHelper, helper);
}
static void
ModestMainWindowPrivate *priv = NULL;
ModestWindowPrivate *parent_priv = NULL;
GtkWidget *folder_win = NULL;
- ModestDimmingRulesGroup *window_rules_group = NULL;
+ ModestDimmingRulesGroup *menu_rules_group = NULL;
+ ModestDimmingRulesGroup *toolbar_rules_group = NULL;
GtkActionGroup *action_group = NULL;
GError *error = NULL;
HildonProgram *app;
ModestConf *conf = NULL;
GtkAction *action = NULL;
GdkPixbuf *window_icon;
+ ShowHelper *helper;
self = MODEST_MAIN_WINDOW(g_object_new(MODEST_TYPE_MAIN_WINDOW, NULL));
priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
action_group = gtk_action_group_new ("ModestMainWindowActions");
gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE);
- window_rules_group = modest_dimming_rules_group_new ("ModestWindowDimmingRules", TRUE);
+ 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,
}
/* Add common dimming rules */
- modest_dimming_rules_group_add_rules (window_rules_group,
- modest_main_window_toolbar_dimming_entries,
- G_N_ELEMENTS (modest_main_window_toolbar_dimming_entries),
- MODEST_WINDOW (self));
- modest_dimming_rules_group_add_rules (window_rules_group,
+ 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, window_rules_group);
- g_object_unref (window_rules_group);
+ 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 (self),
/* header view */
priv->header_view =
MODEST_HEADER_VIEW (modest_header_view_new (NULL, MODEST_HEADER_VIEW_STYLE_DETAILS));
+ g_object_ref (priv->header_view);
if (!priv->header_view)
g_printerr ("modest: cannot instantiate header view\n");
modest_header_view_set_style (priv->header_view, MODEST_HEADER_VIEW_STYLE_TWOLINES);
/* Empty view */
priv->empty_view = create_empty_view ();
gtk_widget_show (priv->empty_view);
+ g_object_ref (priv->empty_view);
/* Create scrolled windows */
folder_win = gtk_scrolled_window_new (NULL, NULL);
g_signal_connect (G_OBJECT(app), "notify::is-topmost",
G_CALLBACK (on_hildon_program_is_topmost_notify), self);
- g_signal_connect (G_OBJECT(self), "show",
- G_CALLBACK (modest_main_window_on_show), folder_win);
-
+ /* Connect to "show" action. We delay the creation of some
+ elements until that moment */
+ helper = g_slice_new0 (ShowHelper);
+ helper->folder_win = folder_win;
+ helper->handler_id = g_signal_connect (G_OBJECT(self), "show",
+ G_CALLBACK (modest_main_window_on_show),
+ helper);
+
/* Set window icon */
window_icon = modest_platform_get_icon (MODEST_APP_ICON, MODEST_ICON_SIZE_BIG);
if (window_icon) {
ModestWindowPrivate *parent_priv;
GtkAction *action;
gboolean active;
-
+ GtkTreeSelection *sel;
+ GList *rows, *list;
+
g_return_if_fail (MODEST_IS_MAIN_WINDOW (self));
priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
g_signal_handlers_unblock_by_func (action, modest_ui_actions_toggle_folders_view, self);
}
+ /* We need to store the selection because it's lost when the
+ widget is reparented */
+ sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->header_view));
+ rows = gtk_tree_selection_get_selected_rows (sel, NULL);
+
priv->style = style;
switch (style) {
case MODEST_MAIN_WINDOW_STYLE_SIMPLE:
+
+ if (!priv->wait_for_settings)
+ modest_widget_memory_save (modest_runtime_get_conf (), G_OBJECT (priv->main_paned),
+ MODEST_CONF_MAIN_PANED_KEY);
/* Remove main paned */
g_object_ref (priv->main_paned);
gtk_container_remove (GTK_CONTAINER (priv->main_vbox), priv->main_paned);
gtk_paned_add2 (GTK_PANED (priv->main_paned), priv->contents_widget);
gtk_container_add (GTK_CONTAINER (priv->main_vbox), priv->main_paned);
+ g_timeout_add (500, (GSourceFunc) restore_paned_timeout_handler, self);
+
break;
default:
+ g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL);
+ g_list_free (rows);
g_return_if_reached ();
}
+ /* Reselect the previously selected folders. We disable the
+ dimming rules execution during that time because there is
+ no need to work out it again and it could take a lot of
+ time if all the headers are selected */
+ list = rows;
+ modest_window_disable_dimming (MODEST_WINDOW (self));
+ while (list) {
+ gtk_tree_selection_select_path (sel, (GtkTreePath *) list->data);
+ list = g_list_next (list);
+ }
+ modest_window_enable_dimming (MODEST_WINDOW (self));
+
+ /* Free */
+ g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL);
+ g_list_free (rows);
+
/* Let header view grab the focus if it's being shown */
- if (priv->contents_style == MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS)
+ 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));
+ } else {
+ if (priv->style == MODEST_MAIN_WINDOW_STYLE_SPLIT)
+ gtk_widget_grab_focus (GTK_WIDGET (priv->folder_view));
+ else
+ gtk_widget_grab_focus (GTK_WIDGET (priv->contents_widget));
+ }
+
+ /* Check dimming rules */
+ modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (self));
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (self));
/* Show changes */
gtk_widget_show_all (GTK_WIDGET (priv->main_vbox));
toolbar_resize (MODEST_MAIN_WINDOW (self));
/* Add ProgressBar (Transfer toolbar) */
- priv->progress_bar = modest_progress_bar_widget_new ();
+ priv->progress_bar = modest_progress_bar_new ();
gtk_widget_set_no_show_all (priv->progress_bar, TRUE);
placeholder = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ProgressBarView");
insert_index = gtk_toolbar_get_item_index(GTK_TOOLBAR (parent_priv->toolbar), GTK_TOOL_ITEM(placeholder));
TnyAccount *account,
gpointer user_data)
{
- update_menus (MODEST_MAIN_WINDOW (user_data));
+ /* Transport accounts and local ones (MMC and the Local
+ folders account do now cause menu changes */
+ if (TNY_IS_STORE_ACCOUNT (account) &&
+ modest_tny_folder_store_is_remote (TNY_FOLDER_STORE (account))) {
+ /* Update menus */
+ update_menus (MODEST_MAIN_WINDOW (user_data));
+ }
}
static void
TnyAccount *account,
gpointer user_data)
{
- update_menus (MODEST_MAIN_WINDOW (user_data));
+ /* Transport accounts and local ones (MMC and the Local
+ folders account do now cause menu changes */
+ if (TNY_IS_STORE_ACCOUNT (account) &&
+ modest_tny_folder_store_is_remote (TNY_FOLDER_STORE (account)))
+ update_menus (MODEST_MAIN_WINDOW (user_data));
}
static void
gpointer user_data)
{
ModestMainWindow *win = MODEST_MAIN_WINDOW (user_data);
-
- /* We need to refresh the details widget because it could have changed */
- if (modest_main_window_get_contents_style(win) == MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS) {
- modest_main_window_set_contents_style (win, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
- }
- /* Update the menus as well, the account name could be changed */
- update_menus (MODEST_MAIN_WINDOW (user_data));
+ /* Transport accounts and local ones (MMC and the Local
+ folders account do now cause menu changes */
+ if (TNY_IS_STORE_ACCOUNT (account)) {
+ /* We need to refresh the details widget because it could have changed */
+ if (modest_main_window_get_contents_style(win) == MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS)
+ modest_main_window_set_contents_style (win, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
+
+ /* Update the menus as well, name could change */
+ if (modest_tny_folder_store_is_remote (TNY_FOLDER_STORE (account)))
+ update_menus (MODEST_MAIN_WINDOW (user_data));
+ }
}
/*
{
ModestMainWindowPrivate *priv;
+ if (event->type == GDK_KEY_RELEASE)
+ return FALSE;
+
priv = MODEST_MAIN_WINDOW_GET_PRIVATE (user_data);
/* Do nothing if we're in SIMPLE style */
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));
if (selected_headers > 1) {
hildon_banner_show_information (NULL, NULL, _("mcen_ib_select_one_message"));
return TRUE;
+ } else {
+ GtkTreePath * cursor_path;
+ gtk_tree_view_get_cursor (GTK_TREE_VIEW (widget), &cursor_path, NULL);
+ if (cursor_path == NULL) {
+ GtkTreeSelection *selection;
+ GList *list;
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
+ list = gtk_tree_selection_get_selected_rows (selection, NULL);
+
+ if (list != NULL)
+ gtk_tree_view_set_cursor (GTK_TREE_VIEW (widget), (GtkTreePath *) list->data, NULL, FALSE);
+ g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL);
+ g_list_free (list);
+ }
+ }
+ }
+ } 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;
+ GtkTreePath *end_path = NULL;
+ GList *selected;
+ GtkTreeSelection *selection;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->header_view));
+ selected = gtk_tree_selection_get_selected_rows (selection, NULL);
+ if (selected != NULL) {
+ selected_path = (GtkTreePath *) selected->data;
+ if (gtk_tree_view_get_visible_range (GTK_TREE_VIEW (priv->header_view),
+ &start_path,
+ &end_path)) {
+
+ if ((gtk_tree_path_compare (start_path, selected_path) != -1) ||
+ (gtk_tree_path_compare (end_path, selected_path) != 1)) {
+
+ /* Scroll to first path */
+ gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (priv->header_view),
+ selected_path,
+ NULL,
+ TRUE,
+ 0.5,
+ 0.0);
+ }
}
+ if (start_path)
+ gtk_tree_path_free (start_path);
+ if (end_path)
+ gtk_tree_path_free (end_path);
+ g_list_foreach (selected, (GFunc) gtk_tree_path_free, NULL);
+ g_list_free (selected);
}
- } else if (MODEST_IS_FOLDER_VIEW (widget) && event->keyval == GDK_Right)
+#endif /* GTK_CHECK_VERSION */
+ /* fix scroll */
gtk_widget_grab_focus (GTK_WIDGET (priv->header_view));
+ }
return FALSE;
}
return label;
}
+typedef struct
+{
+ GtkWidget *count_label;
+ GtkWidget *msg_count_label;
+ GtkWidget *size_label;
+ gchar *color_markup;
+} DetailsWidgets;
+
+static gchar *
+create_uint_label (const gchar *markup,
+ const gchar *name,
+ guint count)
+{
+ return g_markup_printf_escaped ("<span color='%s'>%s:</span> %d", markup, name, count);
+}
+
+static gchar *
+create_gchar_label (const gchar *markup,
+ const gchar *name,
+ gchar *count)
+{
+ return g_markup_printf_escaped ("<span color='%s'>%s:</span> %s", markup, name, count);
+}
+
+static void
+update_folder_stats_status_cb (ModestFolderStats stats,
+ gpointer user_data)
+{
+ DetailsWidgets *widgets = (DetailsWidgets *) user_data;
+ gchar *label, *tmp;
+
+ label = create_uint_label (widgets->color_markup, _("mcen_fi_rootfolder_folders"), stats.folders);
+ gtk_label_set_markup (GTK_LABEL (widgets->count_label), label);
+ g_free (label);
+
+ label = create_uint_label (widgets->color_markup, _("mcen_fi_rootfolder_messages"), stats.msg_count);
+ gtk_label_set_markup (GTK_LABEL (widgets->msg_count_label), label);
+ g_free (label);
+
+ if (widgets->size_label) {
+ tmp = modest_text_utils_get_display_size (stats.local_size);
+ label = create_gchar_label (widgets->color_markup, _("mcen_fi_rootfolder_size"), tmp);
+ gtk_label_set_markup (GTK_LABEL (widgets->size_label), label);
+ g_free (label);
+ g_free (tmp);
+ }
+}
+
+static void
+update_folder_stats_cb (ModestFolderStats stats,
+ gpointer user_data)
+{
+ DetailsWidgets *widgets = (DetailsWidgets *) user_data;
+
+ /* refresh data */
+ update_folder_stats_status_cb (stats, user_data);
+
+ /* frees. Note that the widgets could have been destroyed but
+ we still keep a reference */
+ g_free (widgets->color_markup);
+ if (widgets->count_label)
+ g_object_unref (widgets->count_label);
+ if (widgets->msg_count_label)
+ g_object_unref (widgets->msg_count_label);
+ if (widgets->size_label)
+ g_object_unref (widgets->size_label);
+ g_slice_free (DetailsWidgets, widgets);
+}
+
static GtkWidget *
create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
{
GtkWidget *label_w;
gchar *label;
gchar *gray_color_markup;
+ DetailsWidgets *widgets;
vbox = gtk_vbox_new (FALSE, 0);
+ widgets = g_slice_new0 (DetailsWidgets);
gray_color_markup = get_gray_color_markup (styled_widget);
+ widgets->color_markup = g_strdup (gray_color_markup);
/* Account description: */
if (modest_tny_account_is_virtual_local_folders (account)
/* Message count */
TnyFolderStore *folder_store = TNY_FOLDER_STORE (account);
- label = g_markup_printf_escaped ("<span color='%s'>%s:</span> %d",
- gray_color_markup, _("mcen_fi_rootfolder_messages"),
- modest_tny_folder_store_get_message_count (folder_store));
+ label = create_uint_label (gray_color_markup, _("mcen_fi_rootfolder_messages"), 0);
label_w = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label_w), label);
gtk_label_set_ellipsize (GTK_LABEL (label_w), PANGO_ELLIPSIZE_END);
gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
g_free (label);
+ widgets->msg_count_label = g_object_ref (label_w);
+
/* Folder count */
- label = g_markup_printf_escaped ("<span color='%s'>%s</span>: %d",
- gray_color_markup,
- _("mcen_fi_rootfolder_folders"),
- modest_tny_folder_store_get_folder_count (folder_store));
+ label = create_uint_label (gray_color_markup, _("mcen_fi_rootfolder_folders"), 0);
label_w = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label_w), label);
gtk_label_set_ellipsize (GTK_LABEL (label_w), PANGO_ELLIPSIZE_END);
gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
g_free (label);
+ widgets->count_label = g_object_ref (label_w);
+
/* Size / Date */
if (modest_tny_account_is_virtual_local_folders (account)
|| modest_tny_account_is_memory_card_account (account)) {
- gchar *size = modest_text_utils_get_display_size (
- modest_tny_folder_store_get_local_size (folder_store));
-
- label = g_markup_printf_escaped ("<span color='%s'>%s:</span> %s",
- gray_color_markup, _("mcen_fi_rootfolder_size"),
- size);
- g_free (size);
+ label = create_gchar_label (gray_color_markup, _("mcen_fi_rootfolder_size"), "0");
label_w = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label_w), label);
gtk_label_set_ellipsize (GTK_LABEL (label_w), PANGO_ELLIPSIZE_END);
gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
g_free (label);
+
+ widgets->size_label = g_object_ref (label_w);
+
} else if (TNY_IS_ACCOUNT(folder_store)) {
TnyAccount *account = TNY_ACCOUNT(folder_store);
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
g_free (gray_color_markup);
+ /* Refresh folder stats asynchronously */
+ modest_tny_folder_store_get_folder_stats (TNY_FOLDER_STORE (account),
+ update_folder_stats_cb,
+ update_folder_stats_status_cb,
+ widgets);
+
/* Set alignment */
gtk_container_foreach (GTK_CONTAINER (vbox), (GtkCallback) set_alignment, NULL);
TnyFolderChange *change,
ModestMainWindow *main_window)
{
+ gboolean refilter = FALSE;
gboolean folder_empty = FALSE;
gboolean all_marked_as_deleted = FALSE;
ModestMainWindowPrivate *priv;
-
+
g_return_if_fail (MODEST_IS_MAIN_WINDOW (main_window));
g_return_if_fail (TNY_IS_FOLDER(folder));
priv = MODEST_MAIN_WINDOW_GET_PRIVATE (main_window);
changed = tny_folder_change_get_changed (change);
/* If something changes */
if ((changed) & TNY_FOLDER_CHANGE_CHANGED_ALL_COUNT)
- folder_empty = (tny_folder_change_get_new_all_count (change) == 0);
+ folder_empty = (((guint) tny_folder_change_get_new_all_count (change)) == 0);
else
- folder_empty = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0);
-
+ folder_empty = (((guint) tny_folder_get_all_count (TNY_FOLDER (folder))) == 0);
+
/* Play a sound (if configured) and make the LED blink */
if (changed & TNY_FOLDER_CHANGE_CHANGED_ADDED_HEADERS) {
- modest_platform_on_new_headers_received (NULL, FALSE);
- }
-
- /* Checks header removed (hide marked as DELETED headers) */
- if (changed & TNY_FOLDER_CHANGE_CHANGED_EXPUNGED_HEADERS) {
- modest_header_view_refilter (MODEST_HEADER_VIEW(priv->header_view));
+ modest_platform_push_email_notification ();
}
+
+ if ((changed) & TNY_FOLDER_CHANGE_CHANGED_EXPUNGED_HEADERS)
+ refilter = TRUE;
+ } else {
+ folder_empty = (((guint) tny_folder_get_all_count (TNY_FOLDER (folder))) == 0);
}
/* Check if all messages are marked to be deleted */
all_marked_as_deleted = modest_header_view_is_empty (header_view);
- folder_empty = folder_empty || all_marked_as_deleted ;
-
+ folder_empty = folder_empty || all_marked_as_deleted;
+
/* Set contents style of headers view */
if (folder_empty) {
modest_main_window_set_contents_style (main_window,
modest_main_window_set_contents_style (main_window,
MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
}
+
+ if (refilter)
+ modest_header_view_refilter (header_view);
}
details widget */
GtkWidget *content = gtk_bin_get_child (GTK_BIN (priv->contents_widget));
if (content) {
- if (priv->contents_style == MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS)
- g_object_ref (content);
- else if (priv->contents_style == MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY) {
- g_object_ref (priv->empty_view);
+ if (priv->contents_style == MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY) {
gtk_container_remove (GTK_CONTAINER (content), priv->empty_view);
}
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:
{
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 ();
/* 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
priv->current_toolbar_mode = mode;
/* Checks the dimming rules */
- modest_ui_actions_check_window_dimming_rules (MODEST_WINDOW (self));
+ modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (self));
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (self));
/* Show and hide toolbar items */
switch (mode) {
/* Get toolbar mode from operation id*/
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;
ModestToolBarModes mode;
GSList *tmp;
gboolean mode_changed = FALSE;
- TnyAccount *account;
+ TnyAccount *account = NULL;
self = MODEST_MAIN_WINDOW (user_data);
priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self);
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) ||
modest_tny_account_is_memory_card_account (account));
- g_object_unref (account);
- if (!is_remote)
+ if (!is_remote) {
+ g_object_unref (account);
return;
+ }
+
+ /* Show information banner. Remove old timeout */
+ if (priv->opening_banner_timeout > 0) {
+ g_source_remove (priv->opening_banner_timeout);
+ priv->opening_banner_timeout = 0;
+ }
+ /* Create a new timeout */
+ priv->opening_banner_timeout =
+ g_timeout_add (2000, show_opening_banner, self);
}
+
+ /* Not every mail operation has account, noop does not */
+ if (account)
+ g_object_unref (account);
/* Get toolbar mode from operation id*/
mode = get_toolbar_mode_from_mail_operation (self, mail_op, &mode_changed);
tmp = g_slist_next (tmp);
}
}
+
+ /* Update the main menu as well, we need to explicitely do
+ this in order to enable/disable accelerators */
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (self));
}
static void
GSList *tmp = NULL;
ModestMainWindow *self;
gboolean mode_changed;
- TnyAccount *account;
+ TnyAccount *account = NULL;
ModestMainWindowPrivate *priv;
self = MODEST_MAIN_WINDOW (user_data);
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) ||
modest_tny_account_is_memory_card_account (account));
- g_object_unref (account);
- if (!is_remote)
+ if (!is_remote) {
+ g_object_unref (account);
return;
+ }
+
+ /* Remove old timeout */
+ 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->opening_banner) {
+ gtk_widget_destroy (priv->opening_banner);
+ priv->opening_banner = NULL;
+ }
}
+ /* Not every mail operation has account, noop does not */
+ if (account)
+ g_object_unref (account);
+
/* Get toolbar mode from operation id*/
mode = get_toolbar_mode_from_mail_operation (self, mail_op, &mode_changed);
modest_folder_view_set_account_id_of_visible_server_account
(priv->folder_view,
modest_server_account_settings_get_account_name (store_settings));
+ modest_folder_view_select_first_inbox_or_local (priv->folder_view);
modest_window_set_active_account (MODEST_WINDOW (self), account_name);
+
action = gtk_action_group_get_action (priv->view_additions_group, account_name);
if (action != NULL) {
if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
}
}
- modest_folder_view_select_first_inbox_or_local (priv->folder_view);
-
-
/* Free */
if (settings) {
g_object_unref (store_settings);
/* If account_name == NULL, we must update all (option All) */
if (!account_name)
- modest_ui_actions_do_send_receive_all (win);
+ modest_ui_actions_do_send_receive_all (win, TRUE, TRUE, TRUE);
else
- modest_ui_actions_do_send_receive (account_name, win);
+ modest_ui_actions_do_send_receive (account_name, TRUE, TRUE, TRUE, win);
}
{
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;
}
g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (userdata), FALSE);
main_window = MODEST_MAIN_WINDOW (userdata);
- /* Update window dimming state */
- modest_ui_actions_check_window_dimming_rules (MODEST_WINDOW (main_window));
+ /* Update toolbar dimming state */
+ modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (main_window));
return FALSE;
}
main_window = MODEST_MAIN_WINDOW (userdata);
- /* Update window dimming state */
- modest_ui_actions_check_window_dimming_rules (MODEST_WINDOW (main_window));
+ /* Update toolbar dimming state */
+ modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (main_window));
return FALSE;
}
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)
{
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 ();
}
{
ModestMainWindowPrivate *priv = NULL;
+ g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(self), FALSE);
+
priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self);
return (priv->display_state == OSSO_DISPLAY_ON) ? TRUE : FALSE;
}
+
+static void
+remove_banners (ModestMainWindow *window)
+{
+ ModestMainWindowPrivate *priv;
+
+ priv = MODEST_MAIN_WINDOW_GET_PRIVATE (window);
+
+ if (priv->opening_banner_timeout > 0) {
+ g_source_remove (priv->opening_banner_timeout);
+ priv->opening_banner_timeout = 0;
+ }
+
+ if (priv->opening_banner != NULL) {
+ gtk_widget_destroy (priv->opening_banner);
+ priv->opening_banner = NULL;
+ }
+
+ if (priv->updating_banner_timeout > 0) {
+ g_source_remove (priv->updating_banner_timeout);
+ priv->updating_banner_timeout = 0;
+ }
+
+ if (priv->updating_banner != NULL) {
+ gtk_widget_destroy (priv->updating_banner);
+ priv->updating_banner = NULL;
+ }
+}
+
+
+static void
+on_window_hide (GObject *gobject,
+ GParamSpec *arg1,
+ gpointer user_data)
+{
+ g_return_if_fail (MODEST_IS_MAIN_WINDOW (gobject));
+
+ if (!GTK_WIDGET_VISIBLE (gobject)) {
+ TnyFolderStore *folder_store;
+ ModestMainWindowPrivate *priv;
+
+ /* Remove the currently shown banners */
+ remove_banners (MODEST_MAIN_WINDOW (gobject));
+
+ /* Force the folder view to sync the currently selected folder
+ to save the read/unread status and to expunge messages */
+ priv = MODEST_MAIN_WINDOW_GET_PRIVATE (gobject);
+ folder_store = modest_folder_view_get_selected (priv->folder_view);
+ if (TNY_IS_FOLDER (folder_store)) {
+ ModestMailOperation *mail_op;
+
+ mail_op = modest_mail_operation_new (NULL);
+ modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
+ mail_op);
+ modest_mail_operation_sync_folder (mail_op, TNY_FOLDER (folder_store), FALSE);
+ g_object_unref (mail_op);
+ g_object_unref (folder_store);
+ }
+ }
+}
+
+static void
+on_window_destroy (GtkObject *widget,
+ gpointer user_data)
+{
+ g_return_if_fail (MODEST_IS_MAIN_WINDOW (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_opening_banner (gpointer user_data)
+{
+ ModestMainWindowPrivate *priv = NULL;
+
+ priv = MODEST_MAIN_WINDOW_GET_PRIVATE (user_data);
+
+ if (priv->opening_banner == NULL) {
+
+ /* We're outside the main lock */
+ gdk_threads_enter ();
+ priv->opening_banner =
+ modest_platform_animation_banner (GTK_WIDGET (user_data), NULL,
+ _("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->opening_banner_timeout = 0;
+ return FALSE;
+}