X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-msg-view-window.c;h=8c6d40fb5b99261aa880e5e77218208a7acbb7e7;hp=72214e2a8c959c4a25c28063894ca20651c6c1ca;hb=8438d9ebb6238da6d110a6ad632086b4774792cc;hpb=02b6ad38a4e0e221276c28d84baa0ff6534443d2 diff --git a/src/maemo/modest-msg-view-window.c b/src/maemo/modest-msg-view-window.c index 72214e2..8c6d40f 100644 --- a/src/maemo/modest-msg-view-window.c +++ b/src/maemo/modest-msg-view-window.c @@ -39,7 +39,6 @@ #include #include #include -#include #include #include "modest-msg-view-window-ui-dimming.h" #include @@ -534,26 +533,13 @@ set_toolbar_mode (ModestMsgViewWindow *self, } -static GtkWidget * -menubar_to_menu (GtkUIManager *ui_manager) -{ - GtkWidget *main_menu; - - /* Get the menubar from the UI manager */ - main_menu = gtk_ui_manager_get_widget (ui_manager, "/MenuBar"); - - return main_menu; -} - static void init_window (ModestMsgViewWindow *obj) { GtkWidget *main_vbox; ModestMsgViewWindowPrivate *priv; - ModestWindowPrivate *parent_priv; priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj); - parent_priv = MODEST_WINDOW_GET_PRIVATE(obj); priv->msg_view = GTK_WIDGET (tny_platform_factory_new_msg_view (modest_tny_platform_factory_get_instance ())); modest_msg_view_set_shadow_type (MODEST_MSG_VIEW (priv->msg_view), GTK_SHADOW_NONE); @@ -702,7 +688,8 @@ select_next_valid_row (GtkTreeModel *model, gboolean cycle) { GtkTreeIter tmp_iter; - GtkTreePath *path, *next; + GtkTreePath *path; + GtkTreePath *next = NULL; gboolean retval = FALSE; g_return_val_if_fail (gtk_tree_row_reference_valid (*row_reference), FALSE); @@ -728,6 +715,8 @@ select_next_valid_row (GtkTreeModel *model, /* Free */ gtk_tree_path_free (path); + if (next) + gtk_tree_path_free (next); return retval; } @@ -752,14 +741,14 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self, priv->msg_uid = g_strdup (msg_uid); /* Menubar */ - parent_priv->menubar = menubar_to_menu (parent_priv->ui_manager); + 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(); - 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); + 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); + clipboard_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_CLIPBOARD, FALSE); /* Add common dimming rules */ modest_dimming_rules_group_add_rules (menu_rules_group, @@ -835,11 +824,9 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self, /* Init the clipboard actions dim status */ modest_msg_view_grab_focus(MODEST_MSG_VIEW (priv->msg_view)); + gtk_widget_show_all (GTK_WIDGET (obj)); update_window_title (MODEST_MSG_VIEW_WINDOW (obj)); - /* Check toolbar dimming rules */ - modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (obj)); - modest_window_check_dimming_rules_group (MODEST_WINDOW (obj), "ModestClipboardDimmingRules"); } @@ -870,14 +857,12 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg, * and change the list selection when necessary: */ main_window = modest_window_mgr_get_main_window(mgr, FALSE); /* don't create */ - if (!main_window) { - g_warning ("%s: BUG: no main window", __FUNCTION__); - return NULL; + 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); @@ -888,9 +873,14 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg, } 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", @@ -917,11 +907,12 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg, 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); - /* Check toolbar dimming rules */ + /* Check dimming rules */ modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window)); + modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window)); + modest_window_check_dimming_rules_group (MODEST_WINDOW (window), MODEST_DIMMING_RULES_CLIPBOARD); return MODEST_WINDOW(window); } @@ -947,7 +938,10 @@ modest_msg_view_window_new_for_search_result (TnyMsg *msg, 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); } @@ -971,6 +965,11 @@ modest_msg_view_window_new_for_attachment (TnyMsg *msg, tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg); update_window_title (MODEST_MSG_VIEW_WINDOW (obj)); + /* Check dimming rules */ + modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (obj)); + modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (obj)); + modest_window_check_dimming_rules_group (MODEST_WINDOW (obj), MODEST_DIMMING_RULES_CLIPBOARD); + return MODEST_WINDOW(obj); } @@ -1017,11 +1016,13 @@ void modest_msg_view_window_on_row_inserted( * 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; @@ -1033,12 +1034,16 @@ void modest_msg_view_window_on_row_inserted( gtk_tree_model_get (new_model, tree_iter, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, -1); uid = modest_tny_folder_get_header_unique_id(header); - g_object_unref(G_OBJECT(header)); - header = NULL; 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. */ @@ -1135,9 +1140,11 @@ void modest_msg_view_window_update_model_replaced( 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)); @@ -1179,7 +1186,7 @@ modest_msg_view_window_get_header (ModestMsgViewWindow *self) /* 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); @@ -1412,7 +1419,21 @@ modest_msg_view_window_key_event (GtkWidget *window, GdkEventKey *event, gpointer userdata) { - + GtkWidget *focus; + + focus = gtk_window_get_focus (GTK_WINDOW (window)); + + /* for the find toolbar case */ + if (focus && GTK_IS_ENTRY (focus)) { + if (event->keyval == GDK_BackSpace) { + GdkEvent *copy; + copy = gdk_event_copy ((GdkEvent *) event); + gtk_widget_event (focus, copy); + gdk_event_free (copy); + return TRUE; + } else + return FALSE; + } 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 || @@ -1470,7 +1491,7 @@ 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); @@ -1539,7 +1560,7 @@ 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); @@ -1646,8 +1667,9 @@ message_reader (ModestMsgViewWindow *window, modest_mail_operation_get_msg (mail_op, header, view_msg_cb, row_reference); g_object_unref (mail_op); - /* Update toolbar dimming rules */ + /* Update dimming rules */ modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window)); + modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window)); return TRUE; } @@ -1665,6 +1687,9 @@ modest_msg_view_window_select_next_message (ModestMsgViewWindow *window) 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 @@ -1705,62 +1730,23 @@ modest_msg_view_window_select_next_message (ModestMsgViewWindow *window) return retval; } -gboolean -modest_msg_view_window_select_first_message (ModestMsgViewWindow *self) -{ - ModestMsgViewWindowPrivate *priv = NULL; - TnyHeader *header = NULL; - GtkTreeIter iter; - GtkTreePath *path = NULL; - GtkTreeRowReference *row_reference = NULL; - - g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), FALSE); - priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self); - - /* Check that the model is not empty */ - if (!gtk_tree_model_get_iter_first (priv->header_model, &iter)) - return FALSE; - - /* Get the header */ - gtk_tree_model_get (priv->header_model, - &iter, - TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, - &header, -1); - g_return_val_if_fail (TNY_IS_HEADER (header), FALSE); - if (!msg_is_visible (header, priv->is_outbox)) { - g_object_unref (header); - return modest_msg_view_window_select_next_message (self); - } - - path = gtk_tree_model_get_path (priv->header_model, &iter); - row_reference = gtk_tree_row_reference_new (priv->header_model, path); - gtk_tree_path_free (path); - - /* Read the message & show it */ - message_reader (self, priv, header, row_reference); - - /* Free */ - g_object_unref (header); - - return TRUE; -} - gboolean modest_msg_view_window_select_previous_message (ModestMsgViewWindow *window) { ModestMsgViewWindowPrivate *priv = NULL; GtkTreePath *path; - GtkTreeRowReference *row_reference = NULL; + gboolean finished = FALSE; + gboolean retval = FALSE; g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), FALSE); 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); - while (gtk_tree_path_prev (path)) { + while (!finished && gtk_tree_path_prev (path)) { TnyHeader *header; GtkTreeIter iter; @@ -1768,29 +1754,24 @@ modest_msg_view_window_select_previous_message (ModestMsgViewWindow *window) gtk_tree_model_get (priv->header_model, &iter, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, -1); - if (!header) - break; - if (!msg_is_visible (header, priv->is_outbox)) { - g_object_unref (header); - continue; - } - - row_reference = gtk_tree_row_reference_new (priv->header_model, path); - /* Read the message & show it */ - if (!message_reader (window, priv, header, row_reference)) { - gtk_tree_row_reference_free (row_reference); + finished = TRUE; + if (header) { + if (msg_is_visible (header, priv->is_outbox)) { + GtkTreeRowReference *row_reference; + row_reference = gtk_tree_row_reference_new (priv->header_model, path); + /* Read the message & show it */ + retval = message_reader (window, priv, header, row_reference); + if (!retval) + gtk_tree_row_reference_free (row_reference); + } else { + finished = FALSE; + } g_object_unref (header); - break; } - - gtk_tree_path_free (path); - g_object_unref (header); - - return TRUE; } gtk_tree_path_free (path); - return FALSE; + return retval; } static void @@ -1805,6 +1786,11 @@ view_msg_cb (ModestMailOperation *mail_op, 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)) { @@ -1818,21 +1804,28 @@ view_msg_cb (ModestMailOperation *mail_op, 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); + if (priv->next_row_reference != NULL) { + 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), 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) { @@ -1879,12 +1872,12 @@ static void 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; @@ -1896,17 +1889,72 @@ modest_msg_view_window_update_priority (ModestMsgViewWindow *window) gtk_tree_model_get (priv->header_model, &iter, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, -1); - if (header) { - flags = tny_header_get_flags (header); - g_object_unref(G_OBJECT(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) { @@ -1927,6 +1975,7 @@ modest_msg_view_window_window_state_event (GtkWidget *widget, GdkEventWindowStat 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; @@ -1934,16 +1983,6 @@ modest_msg_view_window_window_state_event (GtkWidget *widget, GdkEventWindowStat } 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) { @@ -1966,18 +2005,11 @@ modest_msg_view_window_show_toolbar (ModestWindow *self, "/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 (); @@ -2046,7 +2078,7 @@ modest_msg_view_window_clipboard_owner_change (GtkClipboard *clipboard, if (!GTK_WIDGET_VISIBLE (window)) return; - modest_window_check_dimming_rules_group (MODEST_WINDOW (window), "ModestClipboardDimmingRules"); + modest_window_check_dimming_rules_group (MODEST_WINDOW (window), MODEST_DIMMING_RULES_CLIPBOARD); } gboolean @@ -2126,21 +2158,25 @@ on_mail_operation_started (ModestMailOperation *mail_op, ModestMailOperationTypeOperation op_type; GSList *tmp; ModestMsgViewWindowPrivate *priv; + GObject *source = NULL; 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 ) { - set_toolbar_transfer_mode(self); - while (tmp) { - modest_progress_object_add_operation ( - MODEST_PROGRESS_OBJECT (tmp->data), - mail_op); - tmp = g_slist_next (tmp); + source = modest_mail_operation_get_source(mail_op); + if (G_OBJECT (self) == source) { + 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); + tmp = g_slist_next (tmp); + } } } + g_object_unref (source); } static void @@ -2207,11 +2243,11 @@ on_queue_changed (ModestMailOperationQueue *queue, } } -GList * +TnyList * modest_msg_view_window_get_attachments (ModestMsgViewWindow *win) { ModestMsgViewWindowPrivate *priv; - GList *selected_attachments = NULL; + TnyList *selected_attachments = NULL; g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), NULL); priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (win); @@ -2228,7 +2264,7 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, TnyMimePart const gchar *msg_uid; gchar *attachment_uid = NULL; gint attachment_index = 0; - GList *attachments; + TnyList *attachments; g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window)); g_return_if_fail (TNY_IS_MIME_PART (mime_part) || (mime_part == NULL)); @@ -2236,8 +2272,8 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, TnyMimePart msg_uid = modest_msg_view_window_get_message_uid (MODEST_MSG_VIEW_WINDOW (window)); attachments = modest_msg_view_get_attachments (MODEST_MSG_VIEW (priv->msg_view)); - attachment_index = g_list_index (attachments, mime_part); - g_list_free (attachments); + attachment_index = modest_list_index (attachments, (GObject *) mime_part); + g_object_unref (attachments); if (msg_uid && attachment_index >= 0) { attachment_uid = g_strdup_printf ("%s/%d", msg_uid, attachment_index); @@ -2245,18 +2281,19 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, TnyMimePart if (mime_part == NULL) { gboolean error = FALSE; - GList *selected_attachments = modest_msg_view_get_selected_attachments (MODEST_MSG_VIEW (priv->msg_view)); - if (selected_attachments == NULL) { + TnyList *selected_attachments = modest_msg_view_get_selected_attachments (MODEST_MSG_VIEW (priv->msg_view)); + if (selected_attachments == NULL || tny_list_get_length (selected_attachments) == 0) { error = TRUE; - } else if (g_list_length (selected_attachments) > 1) { + } else if (tny_list_get_length (selected_attachments) > 1) { hildon_banner_show_information (NULL, NULL, _("mcen_ib_unable_to_display_more")); error = TRUE; } else { - mime_part = (TnyMimePart *) selected_attachments->data; - g_object_ref (mime_part); + TnyIterator *iter; + iter = tny_list_create_iterator (selected_attachments); + mime_part = (TnyMimePart *) tny_iterator_get_current (iter); + g_object_unref (iter); } - g_list_foreach (selected_attachments, (GFunc) g_object_unref, NULL); - g_list_free (selected_attachments); + g_object_unref (selected_attachments); if (error) return; @@ -2273,31 +2310,47 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, TnyMimePart gchar *filepath = NULL; const gchar *att_filename = tny_mime_part_get_filename (mime_part); const gchar *content_type; + gboolean show_error_banner = FALSE; + GError *err; TnyFsStream *temp_stream = NULL; temp_stream = modest_utils_create_temp_stream (att_filename, attachment_uid, &filepath); 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)); + if (tny_mime_part_decode_to_stream (mime_part, TNY_STREAM (temp_stream), &err) >= 0) { + /* 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)); - /* 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); + modest_platform_activate_file (filepath, content_type); + } else { + /* error while saving attachment, maybe cerm_device_memory_full */ + show_error_banner = TRUE; + if (err != NULL) { + g_warning ("%s: tny_mime_part_decode_to_stream failed (%s)", __FUNCTION__, err->message); + g_error_free (err); + } + } 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 { + 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 { + g_warning ("%s: modest_utils_create_temp_stream failed", __FUNCTION__); + show_error_banner = TRUE; + } } + if (show_error_banner) + modest_platform_information_banner (NULL, NULL, _("mail_ib_file_operation_failed")); } else { /* message attachment */ TnyHeader *header = NULL; @@ -2326,7 +2379,6 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, TnyMimePart modest_window_set_zoom (MODEST_WINDOW (msg_win), modest_window_get_zoom (MODEST_WINDOW (window))); modest_window_mgr_register_window (mgr, msg_win); - gtk_window_set_transient_for (GTK_WINDOW (msg_win), GTK_WINDOW (window)); gtk_widget_show_all (GTK_WIDGET (msg_win)); } } @@ -2403,16 +2455,19 @@ save_mime_part_to_file (SaveMimePartInfo *info) GnomeVFSHandle *handle; TnyStream *stream; SaveMimePartPair *pair = (SaveMimePartPair *) info->pairs->data; + gboolean decode_result = TRUE; 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); + if (tny_mime_part_decode_to_stream (pair->part, stream, NULL) < 0) { + decode_result = FALSE; + } g_object_unref (G_OBJECT (stream)); g_object_unref (pair->part); g_slice_free (SaveMimePartPair, pair); info->pairs = g_list_delete_link (info->pairs, info->pairs); - info->result = TRUE; + info->result = decode_result; } else { save_mime_part_info_free (info, FALSE); info->result = FALSE; @@ -2461,9 +2516,8 @@ save_mime_parts_to_file_with_checks (SaveMimePartInfo *info) void -modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, GList *mime_parts) +modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, TnyList *mime_parts) { - gboolean clean_list = FALSE; ModestMsgViewWindowPrivate *priv; GList *files_to_save = NULL; GtkWidget *save_dialog = NULL; @@ -2477,24 +2531,29 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, GList *mim if (mime_parts == NULL) { mime_parts = modest_msg_view_get_selected_attachments (MODEST_MSG_VIEW (priv->msg_view)); - if (mime_parts == NULL) + if (mime_parts == NULL || tny_list_get_length (mime_parts) == 0) return; - clean_list = TRUE; + } else { + g_object_ref (mime_parts); } /* prepare dialog */ - if (mime_parts->next == NULL) { + if (tny_list_get_length (mime_parts) == 1) { + TnyIterator *iter; /* only one attachment selected */ - TnyMimePart *mime_part = (TnyMimePart *) mime_parts->data; + iter = tny_list_create_iterator (mime_parts); + TnyMimePart *mime_part = (TnyMimePart *) tny_iterator_get_current (iter); + g_object_unref (iter); if (!TNY_IS_MSG (mime_part) && tny_mime_part_is_attachment (mime_part)) { filename = tny_mime_part_get_filename (mime_part); } else { g_warning ("Tried to save a non-file attachment"); canceled = TRUE; } + g_object_unref (mime_part); } else { save_multiple_str = g_strdup_printf (_FM("sfil_va_number_of_objects_attachments"), - g_list_length (mime_parts)); + tny_list_get_length (mime_parts)); } save_dialog = hildon_file_chooser_dialog_new (GTK_WINDOW (window), @@ -2523,40 +2582,42 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, GList *mim hildon_banner_show_information (NULL, NULL, dgettext("hildon-fm", "sfil_ib_readonly_location")); } else { - GList *node = NULL; + TnyIterator *iter; - for (node = mime_parts; node != NULL; node = g_list_next (node)) { - TnyMimePart *mime_part = (TnyMimePart *) node->data; - + iter = tny_list_create_iterator (mime_parts); + while (!tny_iterator_is_done (iter)) { + TnyMimePart *mime_part = (TnyMimePart *) tny_iterator_get_current (iter); + + tny_iterator_next (iter); if (tny_mime_part_is_attachment (mime_part)) { SaveMimePartPair *pair; - if ((mime_parts->next != NULL) && - (tny_mime_part_get_filename (mime_part) == NULL)) + if ((!tny_iterator_is_done (iter)) && + (tny_mime_part_get_filename (mime_part) == NULL)) { + g_object_unref (mime_part); continue; + } pair = g_slice_new0 (SaveMimePartPair); - if (mime_parts->next == NULL) { + if (tny_iterator_is_done (iter)) { pair->filename = g_strdup (chooser_uri); } else { pair->filename = g_build_filename (chooser_uri, tny_mime_part_get_filename (mime_part), NULL); } - pair->part = g_object_ref (mime_part); + pair->part = mime_part; files_to_save = g_list_prepend (files_to_save, pair); } } + g_object_unref (iter); } g_free (chooser_uri); } gtk_widget_destroy (save_dialog); - if (clean_list) { - g_list_foreach (mime_parts, (GFunc) g_object_unref, NULL); - g_list_free (mime_parts); - } + g_object_unref (mime_parts); if (files_to_save != NULL) { SaveMimePartInfo *info = g_slice_new0 (SaveMimePartInfo); @@ -2592,11 +2653,12 @@ void modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean get_all) { ModestMsgViewWindowPrivate *priv; - GList *mime_parts = NULL, *node; + TnyList *mime_parts = NULL; gchar *confirmation_message; gint response; gint n_attachments; TnyMsg *msg; + TnyIterator *iter; /* TnyFolder *folder; */ g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window)); @@ -2608,37 +2670,42 @@ modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean mime_parts = modest_msg_view_get_selected_attachments (MODEST_MSG_VIEW (priv->msg_view)); /* Remove already purged messages from mime parts list */ - node = mime_parts; - while (node != NULL) { - TnyMimePart *part = TNY_MIME_PART (node->data); + iter = tny_list_create_iterator (mime_parts); + while (!tny_iterator_is_done (iter)) { + TnyMimePart *part = TNY_MIME_PART (tny_iterator_get_current (iter)); + tny_iterator_next (iter); if (tny_mime_part_is_purged (part)) { - GList *deleted_node = node; - node = g_list_next (node); - g_object_unref (part); - mime_parts = g_list_delete_link (mime_parts, deleted_node); - } else { - node = g_list_next (node); + tny_list_remove (mime_parts, (GObject *) part); } + g_object_unref (part); } + g_object_unref (iter); - if (mime_parts == NULL) + if (tny_list_get_length (mime_parts) == 0) { + g_object_unref (mime_parts); return; + } - n_attachments = g_list_length (mime_parts); + n_attachments = tny_list_get_length (mime_parts); if (n_attachments == 1) { const gchar *filename; + TnyMimePart *part; - if (TNY_IS_MSG (mime_parts->data)) { + iter = tny_list_create_iterator (mime_parts); + part = (TnyMimePart *) tny_iterator_get_current (iter); + g_object_unref (iter); + if (TNY_IS_MSG (part)) { TnyHeader *header; - header = tny_msg_get_header (TNY_MSG (mime_parts->data)); + header = tny_msg_get_header (TNY_MSG (part)); filename = tny_header_get_subject (header); g_object_unref (header); if (filename == NULL) filename = _("mail_va_no_subject"); } else { - filename = tny_mime_part_get_filename (TNY_MIME_PART (mime_parts->data)); + filename = tny_mime_part_get_filename (TNY_MIME_PART (part)); } confirmation_message = g_strdup_printf (_("mcen_nc_purge_file_text"), filename); + g_object_unref (part); } else { confirmation_message = g_strdup_printf (ngettext("mcen_nc_purge_file_text", "mcen_nc_purge_files_text", @@ -2648,8 +2715,10 @@ modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean confirmation_message); g_free (confirmation_message); - if (response != GTK_RESPONSE_OK) + if (response != GTK_RESPONSE_OK) { + g_object_unref (mime_parts); return; + } priv->purge_timeout = g_timeout_add (2000, show_remove_attachment_information, window); /* folder = tny_msg_get_folder (msg); */ @@ -2657,18 +2726,25 @@ modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean /* tny_folder_refresh (folder, NULL); */ /* g_object_unref (folder); */ - for (node = mime_parts; node != NULL; node = g_list_next (node)) { - tny_mime_part_set_purged (TNY_MIME_PART (node->data)); + iter = tny_list_create_iterator (mime_parts); + while (!tny_iterator_is_done (iter)) { + TnyMimePart *part; + + part = (TnyMimePart *) tny_iterator_get_current (iter); + tny_mime_part_set_purged (TNY_MIME_PART (part)); /* modest_msg_view_remove_attachment (MODEST_MSG_VIEW (priv->msg_view), node->data); */ + g_object_unref (part); + tny_iterator_next (iter); } + g_object_unref (iter); msg = tny_msg_view_get_msg (TNY_MSG_VIEW (priv->msg_view)); tny_msg_view_clear (TNY_MSG_VIEW (priv->msg_view)); tny_msg_rewrite_cache (msg); tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg); + g_object_unref (msg); - g_list_foreach (mime_parts, (GFunc) g_object_unref, NULL); - g_list_free (mime_parts); + g_object_unref (mime_parts); if (priv->purge_timeout > 0) { g_source_remove (priv->purge_timeout);