#include <tny-vfs-stream.h>
#include "modest-marshal.h"
#include "modest-platform.h"
+#include <modest-utils.h>
#include <modest-maemo-utils.h>
#include <modest-tny-msg.h>
#include <modest-msg-view-window.h>
#include <modest-mime-part-view.h>
#include <modest-isearch-view.h>
#include <math.h>
+#include <errno.h>
+#include <glib/gstdio.h>
#define DEFAULT_FOLDER "MyDocs/.documents"
static gdouble modest_msg_view_window_get_zoom (ModestWindow *window);
static gboolean modest_msg_view_window_zoom_minus (ModestWindow *window);
static gboolean modest_msg_view_window_zoom_plus (ModestWindow *window);
-static gboolean modest_msg_view_window_key_release_event (GtkWidget *window,
- GdkEventKey *event,
- gpointer userdata);
+static gboolean modest_msg_view_window_key_event (GtkWidget *window,
+ GdkEventKey *event,
+ gpointer userdata);
static gboolean modest_msg_view_window_window_state_event (GtkWidget *widget,
GdkEventWindowState *event,
gpointer userdata);
-static void modest_msg_view_window_scroll_up (ModestWindow *window);
-static void modest_msg_view_window_scroll_down (ModestWindow *window);
static void modest_msg_view_window_update_priority (ModestMsgViewWindow *window);
static void modest_msg_view_window_show_toolbar (ModestWindow *window,
TnyAccount *account,
gpointer user_data);
-static void on_move_focus (ModestMsgViewWindow *window,
+static void on_move_focus (GtkWidget *widget,
GtkDirectionType direction,
gpointer userdata);
static void update_window_title (ModestMsgViewWindow *window);
static gboolean set_toolbar_transfer_mode (ModestMsgViewWindow *self);
+static void init_window (ModestMsgViewWindow *obj);
+
+static gboolean msg_is_visible (TnyHeader *header, gboolean check_outbox);
/* list my signals */
/* Whether this was created via the *_new_for_search_result() function. */
gboolean is_search_result;
+
+ /* Whether the message is in outbox */
+ gboolean is_outbox;
/* A reference to the @model of the header view
* to allow selecting previous/next messages,
guint progress_bar_timeout;
gchar *msg_uid;
+
+ GSList *sighandlers;
};
#define MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
static void
restore_settings (ModestMsgViewWindow *self)
{
- modest_widget_memory_restore (modest_runtime_get_conf (),
+ ModestConf *conf;
+ ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (self);
+ GtkAction *action;
+
+ conf = modest_runtime_get_conf ();
+ action = gtk_ui_manager_get_action (parent_priv->ui_manager,
+ "/MenuBar/ViewMenu/ViewShowToolbarMenu/ViewShowToolbarNormalScreenMenu");
+ gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
+ modest_conf_get_bool (conf, MODEST_CONF_MSG_VIEW_WINDOW_SHOW_TOOLBAR, NULL));
+ action = gtk_ui_manager_get_action (parent_priv->ui_manager,
+ "/MenuBar/ViewMenu/ViewShowToolbarMenu/ViewShowToolbarFullScreenMenu");
+ gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
+ modest_conf_get_bool (conf, MODEST_CONF_MSG_VIEW_WINDOW_SHOW_TOOLBAR_FULLSCREEN, NULL));
+ modest_widget_memory_restore (conf,
G_OBJECT(self),
MODEST_CONF_MSG_VIEW_WINDOW_KEY);
}
modest_msg_view_window_init (ModestMsgViewWindow *obj)
{
ModestMsgViewWindowPrivate *priv;
+ ModestWindowPrivate *parent_priv = NULL;
+ GtkActionGroup *action_group = NULL;
+ GError *error = NULL;
+ GdkPixbuf *window_icon;
+
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj);
+ parent_priv = MODEST_WINDOW_GET_PRIVATE(obj);
+ parent_priv->ui_manager = gtk_ui_manager_new();
+
+ action_group = gtk_action_group_new ("ModestMsgViewWindowActions");
+ gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE);
+
+ /* Add common actions */
+ gtk_action_group_add_actions (action_group,
+ modest_action_entries,
+ G_N_ELEMENTS (modest_action_entries),
+ obj);
+ gtk_action_group_add_toggle_actions (action_group,
+ modest_toggle_action_entries,
+ G_N_ELEMENTS (modest_toggle_action_entries),
+ obj);
+ gtk_action_group_add_toggle_actions (action_group,
+ msg_view_toggle_action_entries,
+ G_N_ELEMENTS (msg_view_toggle_action_entries),
+ obj);
+ gtk_action_group_add_radio_actions (action_group,
+ msg_view_zoom_action_entries,
+ G_N_ELEMENTS (msg_view_zoom_action_entries),
+ 100,
+ G_CALLBACK (modest_ui_actions_on_change_zoom),
+ obj);
+ gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0);
+ g_object_unref (action_group);
+
+ /* Load the UI definition */
+ gtk_ui_manager_add_ui_from_file (parent_priv->ui_manager, MODEST_UIDIR "modest-msg-view-window-ui.xml",
+ &error);
+ if (error) {
+ g_printerr ("modest: could not merge modest-msg-view-window-ui.xml: %s\n", error->message);
+ g_error_free (error);
+ error = NULL;
+ }
+ /* ****** */
+
+ /* Add accelerators */
+ gtk_window_add_accel_group (GTK_WINDOW (obj),
+ gtk_ui_manager_get_accel_group (parent_priv->ui_manager));
+
priv->is_search_result = FALSE;
+ priv->is_outbox = FALSE;
priv->msg_view = NULL;
priv->header_model = NULL;
priv->remove_attachment_banner = NULL;
priv->msg_uid = NULL;
+ priv->sighandlers = NULL;
+
+ /* Init window */
+ init_window (MODEST_MSG_VIEW_WINDOW(obj));
+
+ /* Set window icon */
+ window_icon = modest_platform_get_icon (MODEST_APP_MSG_VIEW_ICON, MODEST_ICON_SIZE_BIG);
+ if (window_icon) {
+ gtk_window_set_icon (GTK_WINDOW (obj), window_icon);
+ g_object_unref (window_icon);
+ }
+
+ hildon_program_add_window (hildon_program_get_instance(),
+ HILDON_WINDOW(obj));
+
modest_window_mgr_register_help_id (modest_runtime_get_window_mgr(),
GTK_WINDOW(obj),"applications_email_viewer");
}
switch (mode) {
case TOOLBAR_MODE_NORMAL:
-/* widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply"); */
-/* gtk_action_set_sensitive (widget, TRUE); */
-/* widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarDeleteMessage"); */
-/* gtk_action_set_sensitive (widget, TRUE); */
-/* widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageMoveTo"); */
-/* gtk_action_set_sensitive (widget, TRUE); */
-/* widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage"); */
-/* gtk_action_set_sensitive (widget, TRUE); */
-
- if (priv->prev_toolitem)
- gtk_widget_show (priv->prev_toolitem);
-
- if (priv->next_toolitem)
- gtk_widget_show (priv->next_toolitem);
-
- if (priv->progress_toolitem)
+ if (priv->progress_toolitem) {
gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), FALSE);
+ gtk_widget_hide (priv->progress_toolitem);
+ }
+
if (priv->progress_bar)
gtk_widget_hide (priv->progress_bar);
if (priv->cancel_toolitem)
gtk_widget_hide (priv->cancel_toolitem);
+ if (priv->prev_toolitem)
+ gtk_widget_show (priv->prev_toolitem);
+
+ if (priv->next_toolitem)
+ gtk_widget_show (priv->next_toolitem);
+
/* Hide toolbar if optimized view is enabled */
if (priv->optimized_view) {
gtk_widget_set_no_show_all (parent_priv->toolbar, TRUE);
break;
case TOOLBAR_MODE_TRANSFER:
-/* widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply"); */
-/* gtk_action_set_sensitive (widget, FALSE); */
-/* widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarDeleteMessage"); */
-/* gtk_action_set_sensitive (widget, FALSE); */
-/* widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageMoveTo"); */
-/* gtk_action_set_sensitive (widget, FALSE); */
-/* widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage"); */
-/* gtk_action_set_sensitive (widget, FALSE); */
-
if (priv->prev_toolitem)
gtk_widget_hide (priv->prev_toolitem);
if (priv->next_toolitem)
gtk_widget_hide (priv->next_toolitem);
- if (priv->progress_toolitem)
- gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE);
if (priv->progress_bar)
gtk_widget_show (priv->progress_bar);
+
+ if (priv->progress_toolitem) {
+ gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE);
+ gtk_widget_show (priv->progress_toolitem);
+ }
if (priv->cancel_toolitem)
gtk_widget_show (priv->cancel_toolitem);
}
-static GtkWidget *
-menubar_to_menu (GtkUIManager *ui_manager)
-{
- GtkWidget *main_menu;
- GtkWidget *menubar;
- GList *iter, *children;
-
- /* Create new main menu */
- main_menu = gtk_menu_new();
-
- /* Get the menubar from the UI manager */
- menubar = gtk_ui_manager_get_widget (ui_manager, "/MenuBar");
-
- iter = children = gtk_container_get_children (GTK_CONTAINER (menubar));
- while (iter) {
- GtkWidget *menu;
-
- menu = GTK_WIDGET (iter->data);
- gtk_widget_reparent(menu, main_menu);
-
- iter = g_list_next (iter);
- }
- g_list_free (children);
-
- return main_menu;
-}
-
static void
init_window (ModestMsgViewWindow *obj)
{
GtkWidget *main_vbox;
ModestMsgViewWindowPrivate *priv;
ModestWindowPrivate *parent_priv;
- ModestConf *conf;
- GtkAction *action = NULL;
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj);
parent_priv = MODEST_WINDOW_GET_PRIVATE(obj);
modest_msg_view_set_shadow_type (MODEST_MSG_VIEW (priv->msg_view), GTK_SHADOW_NONE);
main_vbox = gtk_vbox_new (FALSE, 6);
- /* Menubar */
- parent_priv->menubar = menubar_to_menu (parent_priv->ui_manager);
- conf = modest_runtime_get_conf ();
- action = gtk_ui_manager_get_action (parent_priv->ui_manager,
- "/MenuBar/ViewMenu/ViewShowToolbarMenu/ViewShowToolbarNormalScreenMenu");
- gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
- modest_conf_get_bool (conf, MODEST_CONF_MSG_VIEW_WINDOW_SHOW_TOOLBAR, NULL));
- action = gtk_ui_manager_get_action (parent_priv->ui_manager,
- "/MenuBar/ViewMenu/ViewShowToolbarMenu/ViewShowToolbarFullScreenMenu");
- gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
- modest_conf_get_bool (conf, MODEST_CONF_MSG_VIEW_WINDOW_SHOW_TOOLBAR_FULLSCREEN, NULL));
- hildon_window_set_menu (HILDON_WINDOW(obj), GTK_MENU(parent_priv->menubar));
- gtk_widget_show (GTK_WIDGET(parent_priv->menubar));
-
#ifdef MODEST_USE_MOZEMBED
priv->main_scroll = priv->msg_view;
gtk_widget_set_size_request (priv->msg_view, -1, 1600);
priv->find_toolbar = hildon_find_toolbar_new (NULL);
hildon_window_add_toolbar (HILDON_WINDOW (obj), GTK_TOOLBAR (priv->find_toolbar));
gtk_widget_set_no_show_all (priv->find_toolbar, TRUE);
- g_signal_connect (G_OBJECT (priv->find_toolbar), "close", G_CALLBACK (modest_msg_view_window_find_toolbar_close), obj);
- g_signal_connect (G_OBJECT (priv->find_toolbar), "search", G_CALLBACK (modest_msg_view_window_find_toolbar_search), obj);
- priv->clipboard_change_handler = g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_PRIMARY)), "owner-change", G_CALLBACK (modest_msg_view_window_clipboard_owner_change), obj);
gtk_widget_show_all (GTK_WIDGET(main_vbox));
}
priv->rows_reordered_handler);
}
+ modest_signal_mgr_disconnect_all_and_destroy (priv->sighandlers);
+ priv->sighandlers = NULL;
+
main_window = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr(),
FALSE); /* don't create */
if (!main_window)
ModestDimmingRulesGroup *menu_rules_group = NULL;
ModestDimmingRulesGroup *toolbar_rules_group = NULL;
ModestDimmingRulesGroup *clipboard_rules_group = NULL;
- GtkActionGroup *action_group = NULL;
- GError *error = NULL;
- GdkPixbuf *window_icon;
obj = G_OBJECT (self);
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj);
priv->msg_uid = g_strdup (msg_uid);
- parent_priv->ui_manager = gtk_ui_manager_new();
+ /* Menubar */
+ parent_priv->menubar = modest_maemo_utils_get_manager_menubar_as_menu (parent_priv->ui_manager, "/MenuBar");
+ hildon_window_set_menu (HILDON_WINDOW(obj), GTK_MENU(parent_priv->menubar));
+ gtk_widget_show (parent_priv->menubar);
parent_priv->ui_dimming_manager = modest_ui_dimming_manager_new();
- action_group = gtk_action_group_new ("ModestMsgViewWindowActions");
- gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE);
-
menu_rules_group = modest_dimming_rules_group_new ("ModestMenuDimmingRules", FALSE);
toolbar_rules_group = modest_dimming_rules_group_new ("ModestToolbarDimmingRules", TRUE);
clipboard_rules_group = modest_dimming_rules_group_new ("ModestClipboardDimmingRules", FALSE);
- /* Add common actions */
- gtk_action_group_add_actions (action_group,
- modest_action_entries,
- G_N_ELEMENTS (modest_action_entries),
- obj);
- gtk_action_group_add_toggle_actions (action_group,
- modest_toggle_action_entries,
- G_N_ELEMENTS (modest_toggle_action_entries),
- obj);
- gtk_action_group_add_toggle_actions (action_group,
- msg_view_toggle_action_entries,
- G_N_ELEMENTS (msg_view_toggle_action_entries),
- obj);
- gtk_action_group_add_radio_actions (action_group,
- msg_view_zoom_action_entries,
- G_N_ELEMENTS (msg_view_zoom_action_entries),
- 100,
- G_CALLBACK (modest_ui_actions_on_change_zoom),
- obj);
-
- gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0);
- g_object_unref (action_group);
-
- /* Load the UI definition */
- gtk_ui_manager_add_ui_from_file (parent_priv->ui_manager, MODEST_UIDIR "modest-msg-view-window-ui.xml",
- &error);
- if (error) {
- g_printerr ("modest: could not merge modest-msg-view-window-ui.xml: %s\n", error->message);
- g_error_free (error);
- error = NULL;
- }
- /* ****** */
-
/* Add common dimming rules */
modest_dimming_rules_group_add_rules (menu_rules_group,
modest_msg_view_menu_dimming_entries,
g_object_unref (toolbar_rules_group);
g_object_unref (clipboard_rules_group);
- /* Add accelerators */
- gtk_window_add_accel_group (GTK_WINDOW (obj),
- gtk_ui_manager_get_accel_group (parent_priv->ui_manager));
-
- /* Init window */
- init_window (MODEST_MSG_VIEW_WINDOW(obj));
restore_settings (MODEST_MSG_VIEW_WINDOW(obj));
- /* Set window icon */
- window_icon = modest_platform_get_icon (MODEST_APP_MSG_VIEW_ICON);
- if (window_icon) {
- gtk_window_set_icon (GTK_WINDOW (obj), window_icon);
- g_object_unref (window_icon);
- }
-
/* g_signal_connect (G_OBJECT(obj), "delete-event", G_CALLBACK(on_delete_event), obj); */
+ priv->clipboard_change_handler = g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_PRIMARY)), "owner-change", G_CALLBACK (modest_msg_view_window_clipboard_owner_change), obj);
g_signal_connect (G_OBJECT(priv->msg_view), "activate_link",
G_CALLBACK (modest_ui_actions_on_msg_link_clicked), obj);
g_signal_connect (G_OBJECT(priv->msg_view), "link_hover",
G_CALLBACK (modest_ui_actions_on_msg_link_contextual), obj);
g_signal_connect (G_OBJECT (obj), "key-release-event",
- G_CALLBACK (modest_msg_view_window_key_release_event),
+ G_CALLBACK (modest_msg_view_window_key_event),
+ NULL);
+
+ g_signal_connect (G_OBJECT (obj), "key-press-event",
+ G_CALLBACK (modest_msg_view_window_key_event),
NULL);
g_signal_connect (G_OBJECT (obj), "window-state-event",
modest_window_set_active_account (MODEST_WINDOW(obj), modest_account_name);
+ g_signal_connect (G_OBJECT (priv->find_toolbar), "close", G_CALLBACK (modest_msg_view_window_find_toolbar_close), obj);
+ g_signal_connect (G_OBJECT (priv->find_toolbar), "search", G_CALLBACK (modest_msg_view_window_find_toolbar_search), obj);
priv->last_search = NULL;
/* Init the clipboard actions dim status */
TnyFolder *header_folder = NULL;
ModestHeaderView *header_view = NULL;
ModestWindow *main_window = NULL;
-
- window = g_object_new(MODEST_TYPE_MSG_VIEW_WINDOW, NULL);
+ ModestWindowMgr *mgr = NULL;
+
+ mgr = modest_runtime_get_window_mgr ();
+ window = MODEST_MSG_VIEW_WINDOW (modest_window_mgr_get_msg_view_window (mgr));
g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), NULL);
modest_msg_view_window_construct (window, modest_account_name, msg_uid);
/* Remember the message list's TreeModel so we can detect changes
* and change the list selection when necessary: */
- main_window = modest_window_mgr_get_main_window(
- modest_runtime_get_window_mgr(), FALSE); /* don't create */
- if (!main_window) {
- g_warning ("%s: BUG: no main window", __FUNCTION__);
- return NULL;
+ main_window = modest_window_mgr_get_main_window(mgr, FALSE); /* don't create */
+ if (main_window) {
+ header_view = MODEST_HEADER_VIEW(modest_main_window_get_child_widget(
+ MODEST_MAIN_WINDOW(main_window),
+ MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW));
}
- header_view = MODEST_HEADER_VIEW(modest_main_window_get_child_widget(
- MODEST_MAIN_WINDOW(main_window),
- MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW));
if (header_view != NULL){
header_folder = modest_header_view_get_folder(header_view);
+ priv->is_outbox = (modest_tny_folder_guess_folder_type (header_folder) == TNY_FOLDER_TYPE_OUTBOX);
g_assert(header_folder != NULL);
priv->header_folder_id = tny_folder_get_id(header_folder);
g_assert(priv->header_folder_id != NULL);
}
priv->header_model = g_object_ref(model);
- priv->row_reference = gtk_tree_row_reference_copy (row_reference);
- priv->next_row_reference = gtk_tree_row_reference_copy (row_reference);
- select_next_valid_row (model, &(priv->next_row_reference), TRUE);
+ if (row_reference) {
+ priv->row_reference = gtk_tree_row_reference_copy (row_reference);
+ priv->next_row_reference = gtk_tree_row_reference_copy (row_reference);
+ select_next_valid_row (model, &(priv->next_row_reference), TRUE);
+ } else {
+ priv->row_reference = NULL;
+ priv->next_row_reference = NULL;
+ }
priv->row_changed_handler = g_signal_connect(
GTK_TREE_MODEL(model), "row-changed",
MODEST_HEADER_VIEW_OBSERVER(window));
}
- gtk_widget_show_all (GTK_WIDGET (window));
-
tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
update_window_title (MODEST_MSG_VIEW_WINDOW (window));
+ gtk_widget_show_all (GTK_WIDGET (window));
modest_msg_view_window_update_priority (window);
{
ModestMsgViewWindow *window = NULL;
ModestMsgViewWindowPrivate *priv = NULL;
+ ModestWindowMgr *mgr = NULL;
- window = g_object_new(MODEST_TYPE_MSG_VIEW_WINDOW, NULL);
+ mgr = modest_runtime_get_window_mgr ();
+ window = MODEST_MSG_VIEW_WINDOW (modest_window_mgr_get_msg_view_window (mgr));
g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), NULL);
modest_msg_view_window_construct (window, modest_account_name, msg_uid);
priv->is_search_result = TRUE;
tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
+
+ update_window_title (window);
+ modest_msg_view_window_update_priority (window);
return MODEST_WINDOW(window);
}
const gchar *msg_uid)
{
GObject *obj = NULL;
- ModestMsgViewWindowPrivate *priv;
+ ModestMsgViewWindowPrivate *priv;
+ ModestWindowMgr *mgr = NULL;
+
g_return_val_if_fail (msg, NULL);
-
- obj = g_object_new(MODEST_TYPE_MSG_VIEW_WINDOW, NULL);
+ mgr = modest_runtime_get_window_mgr ();
+ obj = G_OBJECT (modest_window_mgr_get_msg_view_window (mgr));
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (obj);
modest_msg_view_window_construct (MODEST_MSG_VIEW_WINDOW (obj),
modest_account_name, msg_uid);
tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
+ update_window_title (MODEST_MSG_VIEW_WINDOW (obj));
return MODEST_WINDOW(obj);
}
* msg-view is in it, and thus we do not need any actions but
* to check the dimming rules.*/
if(priv->header_model != NULL){
- gtk_tree_row_reference_free(priv->next_row_reference);
- priv->next_row_reference = gtk_tree_row_reference_copy(
+ if (priv->row_reference) {
+ gtk_tree_row_reference_free(priv->next_row_reference);
+ priv->next_row_reference = gtk_tree_row_reference_copy(
priv->row_reference);
- select_next_valid_row (priv->header_model,
- &(priv->next_row_reference), FALSE);
+ select_next_valid_row (priv->header_model,
+ &(priv->next_row_reference), FALSE);
+ }
modest_ui_actions_check_toolbar_dimming_rules (
MODEST_WINDOW (window));
return;
uid = modest_tny_folder_get_header_unique_id(header);
if(!g_str_equal(priv->msg_uid, uid)){
g_free(uid);
+ g_object_unref(G_OBJECT(header));
+ header = NULL;
return;
}
+ if (!(tny_header_get_flags (header) & TNY_HEADER_FLAG_SEEN))
+ tny_header_set_flag (header, TNY_HEADER_FLAG_SEEN);
+ g_object_unref(G_OBJECT(header));
+ header = NULL;
g_free(uid);
/* Setup row_reference for the actual msg. */
priv->rows_reordered_handler = 0;
g_object_unref(priv->header_model);
priv->header_model = NULL;
- g_object_unref(priv->row_reference);
+ if (priv->row_reference)
+ g_object_unref(priv->row_reference);
priv->row_reference = NULL;
- g_object_unref(priv->next_row_reference);
+ if (priv->next_row_reference)
+ g_object_unref(priv->next_row_reference);
priv->next_row_reference = NULL;
modest_ui_actions_check_toolbar_dimming_rules(MODEST_WINDOW(window));
/* If the message was not obtained from a treemodel,
* for instance if it was opened directly by the search UI:
*/
- if (priv->header_model == NULL) {
+ if (priv->header_model == NULL || priv->row_reference == NULL) {
msg = modest_msg_view_window_get_message (self);
if (msg) {
header = tny_msg_get_header (msg);
/* update the toggle buttons status */
action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage");
- modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), is_active);
+ modest_utils_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), is_active);
action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ToolsMenu/ToolsFindInMessageMenu");
- modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), is_active);
+ modest_utils_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), is_active);
}
}
static gboolean
-modest_msg_view_window_key_release_event (GtkWidget *window,
- GdkEventKey *event,
- gpointer userdata)
+modest_msg_view_window_key_event (GtkWidget *window,
+ GdkEventKey *event,
+ gpointer userdata)
{
- if (event->type == GDK_KEY_RELEASE) {
- switch (event->keyval) {
- case GDK_Up:
- modest_msg_view_window_scroll_up (MODEST_WINDOW (window));
- return TRUE;
- break;
- case GDK_Down:
- modest_msg_view_window_scroll_down (MODEST_WINDOW (window));
+
+ if (event->keyval == GDK_Up || event->keyval == GDK_KP_Up ||
+ event->keyval == GDK_Down || event->keyval == GDK_KP_Down ||
+ event->keyval == GDK_Page_Up || event->keyval == GDK_KP_Page_Up ||
+ event->keyval == GDK_Page_Down || event->keyval == GDK_KP_Page_Down ||
+ event->keyval == GDK_Home || event->keyval == GDK_KP_Home ||
+ event->keyval == GDK_End || event->keyval == GDK_KP_End) {
+ ModestMsgViewWindowPrivate *priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+ gboolean return_value;
+
+ if (event->type == GDK_KEY_RELEASE) {
+ GtkScrollType scroll_type;
+
+ switch (event->keyval) {
+ case GDK_Up:
+ case GDK_KP_Up:
+ scroll_type = GTK_SCROLL_STEP_UP; break;
+ case GDK_Down:
+ case GDK_KP_Down:
+ scroll_type = GTK_SCROLL_STEP_DOWN; break;
+ case GDK_Page_Up:
+ case GDK_KP_Page_Up:
+ scroll_type = GTK_SCROLL_PAGE_UP; break;
+ case GDK_Page_Down:
+ case GDK_KP_Page_Down:
+ scroll_type = GTK_SCROLL_PAGE_DOWN; break;
+ case GDK_Home:
+ case GDK_KP_Home:
+ scroll_type = GTK_SCROLL_START; break;
+ case GDK_End:
+ case GDK_KP_End:
+ scroll_type = GTK_SCROLL_END; break;
+ default: scroll_type = GTK_SCROLL_NONE;
+ }
+
+ g_signal_emit_by_name (G_OBJECT (priv->main_scroll), "scroll-child",
+ scroll_type, FALSE, &return_value);
return TRUE;
- break;
- default:
+ } else {
return FALSE;
- break;
- };
+ }
} else {
return FALSE;
}
}
-static void
-modest_msg_view_window_scroll_up (ModestWindow *window)
-{
- ModestMsgViewWindowPrivate *priv;
- gboolean return_value;
-
- priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
- g_signal_emit_by_name (G_OBJECT (priv->main_scroll), "scroll-child", GTK_SCROLL_STEP_UP, FALSE, &return_value);
-}
-
-static void
-modest_msg_view_window_scroll_down (ModestWindow *window)
-{
- ModestMsgViewWindowPrivate *priv;
- gboolean return_value;
-
- priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
- g_signal_emit_by_name (G_OBJECT (priv->main_scroll), "scroll-child", GTK_SCROLL_STEP_DOWN, FALSE, &return_value);
-}
-
gboolean
modest_msg_view_window_last_message_selected (ModestMsgViewWindow *window)
{
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
/*if no model (so no rows at all), then virtually we are the last*/
- if (!priv->header_model)
+ if (!priv->header_model || !priv->row_reference)
return TRUE;
path = gtk_tree_row_reference_get_path (priv->row_reference);
gtk_tree_model_get (priv->header_model, &tmp_iter,
TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
&header, -1);
- if (!(tny_header_get_flags(header) & TNY_HEADER_FLAG_DELETED))
- is_last_selected = FALSE;
+ if (header) {
+ if (msg_is_visible (header, priv->is_outbox))
+ is_last_selected = FALSE;
+ g_object_unref(G_OBJECT(header));
+ }
}
gtk_tree_path_free (path);
return is_last_selected;
return priv->is_search_result;
}
+static gboolean
+msg_is_visible (TnyHeader *header, gboolean check_outbox)
+{
+ return (!(tny_header_get_flags(header) & TNY_HEADER_FLAG_DELETED)) &&
+ ( (!check_outbox) || (modest_tny_all_send_queues_get_msg_status (header) != MODEST_TNY_SEND_QUEUE_FAILED)) ;
+
+}
+
gboolean
modest_msg_view_window_first_message_selected (ModestMsgViewWindow *window)
{
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
/*if no model (so no rows at all), then virtually we are the first*/
- if (!priv->header_model)
+ if (!priv->header_model || !priv->row_reference)
return TRUE;
path = gtk_tree_row_reference_get_path (priv->row_reference);
gtk_tree_model_get (priv->header_model, &tmp_iter,
TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
&header, -1);
- if (!(tny_header_get_flags(header) & TNY_HEADER_FLAG_DELETED))
- is_first_selected = FALSE;
+ if (header) {
+ if (msg_is_visible (header, priv->is_outbox))
+ is_first_selected = FALSE;
+ g_object_unref(G_OBJECT(header));
+ }
}
gtk_tree_path_free (path);
return is_first_selected;
GtkTreeRowReference *row_reference)
{
ModestMailOperation *mail_op = NULL;
- ModestMailOperationTypeOperation op_type;
gboolean already_showing = FALSE;
ModestWindow *msg_window = NULL;
ModestWindowMgr *mgr;
}
/* Msg download completed */
- if (tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED) {
- op_type = MODEST_MAIL_OPERATION_TYPE_OPEN;
- } else {
- op_type = MODEST_MAIL_OPERATION_TYPE_RECEIVE;
-
+ if (!(tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED)) {
/* Ask the user if he wants to download the message if
we're not online */
if (!tny_device_is_online (modest_runtime_get_device())) {
g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), FALSE);
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+ if (!priv->row_reference)
+ return FALSE;
+
/* Update the next row reference if it's not valid. This could
happen if for example the header which it was pointing to,
was deleted. The best place to do it is in the row-deleted
TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
&header, -1);
g_return_val_if_fail (TNY_IS_HEADER (header), FALSE);
- if (tny_header_get_flags (header) & TNY_HEADER_FLAG_DELETED) {
+ if (!msg_is_visible (header, priv->is_outbox)) {
g_object_unref (header);
return modest_msg_view_window_select_next_message (self);
}
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
/* Return inmediatly if there is no header model */
- if (!priv->header_model)
+ if (!priv->header_model || !priv->row_reference)
return FALSE;
path = gtk_tree_row_reference_get_path (priv->row_reference);
&header, -1);
if (!header)
break;
- if (tny_header_get_flags (header) & TNY_HEADER_FLAG_DELETED) {
+ if (!msg_is_visible (header, priv->is_outbox)) {
g_object_unref (header);
continue;
}
ModestMsgViewWindowPrivate *priv = NULL;
GtkTreeRowReference *row_reference = NULL;
+ if (canceled) {
+ g_object_unref (self);
+ return;
+ }
+
/* If there was any error */
row_reference = (GtkTreeRowReference *) user_data;
if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg)) {
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
/* Update the row reference */
- gtk_tree_row_reference_free (priv->row_reference);
- priv->row_reference = gtk_tree_row_reference_copy (row_reference);
- priv->next_row_reference = gtk_tree_row_reference_copy (priv->row_reference);
- select_next_valid_row (priv->header_model, &(priv->next_row_reference), TRUE);
- gtk_tree_row_reference_free (row_reference);
+ if (priv->row_reference != NULL) {
+ gtk_tree_row_reference_free (priv->row_reference);
+ priv->row_reference = gtk_tree_row_reference_copy (row_reference);
+ priv->next_row_reference = gtk_tree_row_reference_copy (priv->row_reference);
+ select_next_valid_row (priv->header_model, &(priv->next_row_reference), TRUE);
+ gtk_tree_row_reference_free (row_reference);
+ }
/* Mark header as read */
if (!(tny_header_get_flags (header) & TNY_HEADER_FLAG_SEEN))
tny_header_set_flag (header, TNY_HEADER_FLAG_SEEN);
/* Set new message */
- tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
- modest_msg_view_window_update_priority (self);
- update_window_title (MODEST_MSG_VIEW_WINDOW (self));
- modest_msg_view_grab_focus (MODEST_MSG_VIEW (priv->msg_view));
+ if (priv->msg_view != NULL && TNY_IS_MSG_VIEW (priv->msg_view)) {
+ tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
+ modest_msg_view_window_update_priority (self);
+ update_window_title (MODEST_MSG_VIEW_WINDOW (self));
+ modest_msg_view_grab_focus (MODEST_MSG_VIEW (priv->msg_view));
+ }
/* Set the new message uid of the window */
if (priv->msg_uid) {
modest_msg_view_window_update_priority (ModestMsgViewWindow *window)
{
ModestMsgViewWindowPrivate *priv;
+ TnyHeader *header = NULL;
TnyHeaderFlags flags = 0;
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
- if (priv->header_model) {
- TnyHeader *header;
+ if (priv->header_model && priv->row_reference) {
GtkTreeIter iter;
GtkTreePath *path = NULL;
gtk_tree_model_get (priv->header_model, &iter, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
&header, -1);
- flags = tny_header_get_flags (header);
gtk_tree_path_free (path);
+ } else {
+ TnyMsg *msg;
+ msg = tny_msg_view_get_msg (TNY_MSG_VIEW (priv->msg_view));
+ if (msg) {
+ header = tny_msg_get_header (msg);
+ g_object_unref (msg);
+ }
+ }
+
+ if (header) {
+ flags = tny_header_get_flags (header);
+ g_object_unref(G_OBJECT(header));
}
modest_msg_view_set_priority (MODEST_MSG_VIEW(priv->msg_view), flags);
}
+static void
+toolbar_resize (ModestMsgViewWindow *self)
+{
+ ModestMsgViewWindowPrivate *priv = NULL;
+ ModestWindowPrivate *parent_priv = NULL;
+ GtkWidget *widget;
+ gint static_button_size;
+ ModestWindowMgr *mgr;
+
+ g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self));
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
+ parent_priv = MODEST_WINDOW_GET_PRIVATE(self);
+
+ mgr = modest_runtime_get_window_mgr ();
+ static_button_size = modest_window_mgr_get_fullscreen_mode (mgr)?118:108;
+
+ if (parent_priv->toolbar) {
+ /* left size buttons */
+ widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply");
+ gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), FALSE);
+ gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), FALSE);
+ gtk_widget_set_size_request (GTK_WIDGET (widget), static_button_size, -1);
+ widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageMoveTo");
+ gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), FALSE);
+ gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), FALSE);
+ gtk_widget_set_size_request (GTK_WIDGET (widget), static_button_size, -1);
+ widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarDeleteMessage");
+ gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), FALSE);
+ gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), FALSE);
+ gtk_widget_set_size_request (GTK_WIDGET (widget), static_button_size, -1);
+ widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/FindInMessage");
+ gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), FALSE);
+ gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), FALSE);
+ gtk_widget_set_size_request (GTK_WIDGET (widget), static_button_size, -1);
+
+ gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->progress_toolitem), FALSE);
+ gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE);
+ gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE);
+ gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE);
+ gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->next_toolitem), TRUE);
+ gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->next_toolitem), TRUE);
+ gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->prev_toolitem), TRUE);
+ gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->prev_toolitem), TRUE);
+ }
+
+}
+
static gboolean
modest_msg_view_window_window_state_event (GtkWidget *widget, GdkEventWindowState *event, gpointer userdata)
{
if (is_fullscreen != active) {
gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (fs_toggle_action), is_fullscreen);
}
+ toolbar_resize (MODEST_MSG_VIEW_WINDOW (widget));
}
return FALSE;
}
static void
-set_homogeneous (GtkWidget *widget,
- gpointer data)
-{
- if (GTK_IS_TOOL_ITEM (widget)) {
- gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), TRUE);
- gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), TRUE);
- }
-}
-
-static void
modest_msg_view_window_show_toolbar (ModestWindow *self,
gboolean show_toolbar)
{
"/ToolBar");
gtk_widget_set_no_show_all (parent_priv->toolbar, TRUE);
- /* Set homogeneous toolbar */
- gtk_container_foreach (GTK_CONTAINER (parent_priv->toolbar),
- set_homogeneous, NULL);
-
priv->progress_toolitem = GTK_WIDGET (gtk_tool_item_new ());
priv->cancel_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarCancel");
priv->next_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNext");
priv->prev_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageBack");
- gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE);
- gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE);
- gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE);
- gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE);
+ toolbar_resize (MODEST_MSG_VIEW_WINDOW (self));
/* Add ProgressBar (Transfer toolbar) */
priv->progress_bar = modest_progress_bar_widget_new ();
hildon_window_add_toolbar (HILDON_WINDOW (self),
GTK_TOOLBAR (parent_priv->toolbar));
-
/* Set reply button tap and hold menu */
reply_button = gtk_ui_manager_get_widget (parent_priv->ui_manager,
"/ToolBar/ToolbarMessageReply");
/* Quick hack: this prevents toolbar icons "dance" when progress bar show status is changed */
/* TODO: resize mode migth be GTK_RESIZE_QUEUE, in order to avoid unneccesary shows */
gtk_container_set_resize_mode (GTK_CONTAINER(parent_priv->toolbar), GTK_RESIZE_IMMEDIATE);
-
+
gtk_widget_show (GTK_WIDGET (parent_priv->toolbar));
- set_toolbar_mode (MODEST_MSG_VIEW_WINDOW(self), TOOLBAR_MODE_NORMAL);
-
+ if (modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (self)))
+ set_toolbar_mode (MODEST_MSG_VIEW_WINDOW (self), TOOLBAR_MODE_TRANSFER);
+ else
+ set_toolbar_mode (MODEST_MSG_VIEW_WINDOW (self), TOOLBAR_MODE_NORMAL);
+
} else {
gtk_widget_set_no_show_all (parent_priv->toolbar, TRUE);
gtk_widget_hide (GTK_WIDGET (parent_priv->toolbar));
action_name = "/MenuBar/ViewMenu/ViewShowToolbarMenu/ViewShowToolbarNormalScreenMenu";
action = gtk_ui_manager_get_action (parent_priv->ui_manager, action_name);
- modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action),
+ modest_utils_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action),
show_toolbar);
}
}
}
-static void
-on_queue_changed (ModestMailOperationQueue *queue,
- ModestMailOperation *mail_op,
- ModestMailOperationQueueNotification type,
- ModestMsgViewWindow *self)
+static void
+on_mail_operation_started (ModestMailOperation *mail_op,
+ gpointer user_data)
{
+ ModestMsgViewWindow *self;
+ ModestMailOperationTypeOperation op_type;
GSList *tmp;
ModestMsgViewWindowPrivate *priv;
- ModestMailOperationTypeOperation op_type;
- ModestToolBarModes mode;
-
- g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self));
- priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
-
- /* If this operations was created by another window, do nothing */
- if (!modest_mail_operation_is_mine (mail_op, G_OBJECT(self)))
- return;
- /* Get toolbar mode from operation id*/
+ self = MODEST_MSG_VIEW_WINDOW (user_data);
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
op_type = modest_mail_operation_get_type_operation (mail_op);
- switch (op_type) {
-/* case MODEST_MAIL_OPERATION_TYPE_SEND: */
- case MODEST_MAIL_OPERATION_TYPE_RECEIVE:
- case MODEST_MAIL_OPERATION_TYPE_OPEN:
- mode = TOOLBAR_MODE_TRANSFER;
- break;
- default:
- mode = TOOLBAR_MODE_NORMAL;
-
- }
-
- /* Add operation observers and change toolbar if neccessary*/
tmp = priv->progress_widgets;
- switch (type) {
- case MODEST_MAIL_OPERATION_QUEUE_OPERATION_ADDED:
- if (mode == TOOLBAR_MODE_TRANSFER) {
- /* Enable transfer toolbar mode */
+ if (G_OBJECT (self) == modest_mail_operation_get_source(mail_op)) {
+ if (op_type == MODEST_MAIL_OPERATION_TYPE_RECEIVE || op_type == MODEST_MAIL_OPERATION_TYPE_OPEN ) {
set_toolbar_transfer_mode(self);
while (tmp) {
- modest_progress_object_add_operation (MODEST_PROGRESS_OBJECT (tmp->data),
- mail_op);
+ 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:
- if (mode == TOOLBAR_MODE_TRANSFER) {
- while (tmp) {
- modest_progress_object_remove_operation (MODEST_PROGRESS_OBJECT (tmp->data),
- mail_op);
- tmp = g_slist_next (tmp);
-
- }
+ }
+ g_object_unref (G_OBJECT (mail_op));
+}
- /* If no more operations are being observed, NORMAL mode is enabled again */
- if (observers_empty (self)) {
- set_toolbar_mode (self, TOOLBAR_MODE_NORMAL);
- }
+static void
+on_mail_operation_finished (ModestMailOperation *mail_op,
+ gpointer user_data)
+{
+ ModestMsgViewWindow *self;
+ ModestMailOperationTypeOperation op_type;
+ GSList *tmp;
+ ModestMsgViewWindowPrivate *priv;
+
+ self = MODEST_MSG_VIEW_WINDOW (user_data);
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
+ op_type = modest_mail_operation_get_type_operation (mail_op);
+ tmp = priv->progress_widgets;
+
+ if (op_type == MODEST_MAIL_OPERATION_TYPE_RECEIVE || op_type == MODEST_MAIL_OPERATION_TYPE_OPEN ) {
+ while (tmp) {
+ modest_progress_object_remove_operation (
+ MODEST_PROGRESS_OBJECT (tmp->data),
+ mail_op);
+ tmp = g_slist_next (tmp);
+ }
+
+ /* If no more operations are being observed, NORMAL mode is enabled again */
+ if (observers_empty (self)) {
+ set_toolbar_mode (self, TOOLBAR_MODE_NORMAL);
}
- break;
+ }
+}
+
+static void
+on_queue_changed (ModestMailOperationQueue *queue,
+ ModestMailOperation *mail_op,
+ ModestMailOperationQueueNotification type,
+ ModestMsgViewWindow *self)
+{
+ ModestMsgViewWindowPrivate *priv;
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
+
+ /* If this operations was created by another window, do nothing */
+ if (!modest_mail_operation_is_mine (mail_op, G_OBJECT(self)))
+ return;
+
+ if (type == MODEST_MAIL_OPERATION_QUEUE_OPERATION_ADDED) {
+ priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,
+ G_OBJECT (mail_op),
+ "operation-started",
+ G_CALLBACK (on_mail_operation_started),
+ self);
+ priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,
+ G_OBJECT (mail_op),
+ "operation-finished",
+ G_CALLBACK (on_mail_operation_finished),
+ self);
+ } else if (type == MODEST_MAIL_OPERATION_QUEUE_OPERATION_REMOVED) {
+ priv->sighandlers = modest_signal_mgr_disconnect (priv->sighandlers,
+ G_OBJECT (mail_op),
+ "operation-started");
+ priv->sighandlers = modest_signal_mgr_disconnect (priv->sighandlers,
+ G_OBJECT (mail_op),
+ "operation-finished");
}
}
if (!TNY_IS_MSG (mime_part)) {
gchar *filepath = NULL;
const gchar *att_filename = tny_mime_part_get_filename (mime_part);
+ const gchar *content_type;
TnyFsStream *temp_stream = NULL;
- temp_stream = modest_maemo_utils_create_temp_stream (att_filename, attachment_uid, &filepath);
+ temp_stream = modest_utils_create_temp_stream (att_filename, attachment_uid,
+ &filepath);
- if (temp_stream) {
- const gchar *content_type;
+ if (temp_stream != NULL) {
content_type = tny_mime_part_get_content_type (mime_part);
tny_mime_part_decode_to_stream (mime_part, TNY_STREAM (temp_stream));
+
+ /* make the file read-only */
+ if (g_chmod(filepath, 0444) != 0)
+ g_warning ("%s: failed to set file '%s' to read-only: %s",
+ __FUNCTION__, filepath, strerror(errno));
modest_platform_activate_file (filepath, content_type);
g_object_unref (temp_stream);
g_free (filepath);
/* NOTE: files in the temporary area will be automatically
* cleaned after some time if they are no longer in use */
+ } else if (filepath != NULL) {
+ /* the file may already exist but it isn't writable,
+ * let's try to open it anyway */
+ content_type = tny_mime_part_get_content_type (mime_part);
+ modest_platform_activate_file (filepath, content_type);
+ g_free (filepath);
}
} else {
/* message attachment */
TnyStream *stream;
SaveMimePartPair *pair = (SaveMimePartPair *) info->pairs->data;
- result = gnome_vfs_create (&handle, pair->filename, GNOME_VFS_OPEN_WRITE, FALSE, 0444);
+ result = gnome_vfs_create (&handle, pair->filename, GNOME_VFS_OPEN_WRITE, FALSE, 0644);
if (result == GNOME_VFS_OK) {
stream = tny_vfs_stream_new (handle);
tny_mime_part_decode_to_stream (pair->part, stream);
for (iter = files; (iter != NULL) && (replaced_files < 2); iter = g_list_next(iter)) {
SaveMimePartPair *pair = iter->data;
- if (modest_maemo_utils_file_exists (pair->filename)) {
- replaced_files++;
+ if (modest_utils_file_exists (pair->filename)) {
+ replaced_files++;
}
}
if (replaced_files) {
if (gtk_dialog_run (GTK_DIALOG (save_dialog)) == GTK_RESPONSE_OK) {
gchar *chooser_uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (save_dialog));
- if (!modest_maemo_utils_folder_writable (chooser_uri)) {
+ if (!modest_utils_folder_writable (chooser_uri)) {
hildon_banner_show_information
(NULL, NULL, dgettext("hildon-fm", "sfil_ib_readonly_location"));
} else {
}
-static void on_move_focus (ModestMsgViewWindow *window,
+static void on_move_focus (GtkWidget *widget,
GtkDirectionType direction,
gpointer userdata)
{
- GtkWidget *current_focus = NULL;
-
- current_focus = gtk_window_get_focus (GTK_WINDOW (window));
- if ((current_focus != NULL) &&
- MODEST_IS_ATTACHMENTS_VIEW (current_focus)) {
- g_signal_stop_emission_by_name (G_OBJECT (window), "move-focus");
- }
+ g_signal_stop_emission_by_name (G_OBJECT (widget), "move-focus");
}