#include <glib/gstdio.h>
#include <modest-debug.h>
#include <modest-header-window.h>
+#include <modest-account-protocol.h>
+#include <tny-camel-msg.h>
#define MYDOCS_ENV "MYDOCSDIR"
#define DOCS_FOLDER ".documents"
static void modest_msg_view_window_class_init (ModestMsgViewWindowClass *klass);
static void modest_msg_view_window_init (ModestMsgViewWindow *obj);
-static void modest_header_view_observer_init(
- ModestHeaderViewObserverIface *iface_class);
+static void modest_header_view_observer_init (ModestHeaderViewObserverIface *iface_class);
static void modest_msg_view_window_finalize (GObject *obj);
-static void modest_msg_view_window_toggle_find_toolbar (GtkToggleAction *obj,
- gpointer data);
-static void modest_msg_view_window_find_toolbar_close (GtkWidget *widget,
- ModestMsgViewWindow *obj);
+static void modest_msg_view_window_show_find_toolbar (GtkWidget *obj, gpointer data);
+static void modest_msg_view_window_find_toolbar_close (GtkWidget *widget,
+ ModestMsgViewWindow *obj);
static void modest_msg_view_window_find_toolbar_search (GtkWidget *widget,
- ModestMsgViewWindow *obj);
-
+ ModestMsgViewWindow *obj);
+static void modest_msg_view_window_toggle_find_toolbar (GtkWidget *obj,
+ gpointer data);
static void modest_msg_view_window_disconnect_signals (ModestWindow *self);
-static gdouble modest_msg_view_window_get_zoom (ModestWindow *window);
-static void modest_msg_view_window_set_zoom (ModestWindow *window,
- gdouble zoom);
+static gdouble modest_msg_view_window_get_zoom (ModestWindow *window);
+static void modest_msg_view_window_set_zoom (ModestWindow *window,
+ gdouble zoom);
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_event (GtkWidget *window,
- GdkEventKey *event,
- gpointer userdata);
+static gboolean modest_msg_view_window_zoom_plus (ModestWindow *window);
+static gboolean modest_msg_view_window_key_event (GtkWidget *window,
+ GdkEventKey *event,
+ gpointer userdata);
static void modest_msg_view_window_update_priority (ModestMsgViewWindow *window);
static void modest_msg_view_window_show_toolbar (ModestWindow *window,
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);
static gboolean message_reader (ModestMsgViewWindow *window,
ModestMsgViewWindowPrivate *priv,
TnyHeader *header,
+ const gchar *msg_uid,
+ TnyFolder *folder,
GtkTreeRowReference *row_reference);
static void setup_menu (ModestMsgViewWindow *self);
static gboolean _modest_msg_view_window_map_event (GtkWidget *widget,
GdkEvent *event,
gpointer userdata);
-
+static void update_branding (ModestMsgViewWindow *self);
/* list my signals */
enum {
save_state (ModestWindow *self)
{
modest_widget_memory_save (modest_runtime_get_conf (),
- G_OBJECT(self),
+ G_OBJECT(self),
MODEST_CONF_MSG_VIEW_WINDOW_KEY);
}
-static
-gboolean modest_msg_view_window_scroll_child (ModestMsgViewWindow *self,
- GtkScrollType scroll_type,
- gboolean horizontal,
- gpointer userdata)
+static gboolean
+modest_msg_view_window_scroll_child (ModestMsgViewWindow *self,
+ GtkScrollType scroll_type,
+ gboolean horizontal,
+ gpointer userdata)
{
ModestMsgViewWindowPrivate *priv;
- gboolean return_value;
+ gint step = 0;
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
- g_signal_emit_by_name (priv->main_scroll, "scroll-child", scroll_type, horizontal, &return_value);
- return return_value;
+
+ switch (scroll_type) {
+ case GTK_SCROLL_STEP_UP:
+ step = -1;
+ break;
+ case GTK_SCROLL_STEP_DOWN:
+ step = +1;
+ break;
+ case GTK_SCROLL_PAGE_UP:
+ step = -6;
+ break;
+ case GTK_SCROLL_PAGE_DOWN:
+ step = +6;
+ break;
+ case GTK_SCROLL_START:
+ step = -100;
+ break;
+ case GTK_SCROLL_END:
+ step = +100;
+ break;
+ default:
+ step = 0;
+ }
+
+ if (step)
+ modest_maemo_utils_scroll_pannable((HildonPannableArea *) priv->main_scroll, 0, step);
+
+ return (gboolean) step;
}
static void
GtkScrollType scroll)
{
guint keypad_keyval = keyval - GDK_Left + GDK_KP_Left;
-
+
gtk_binding_entry_add_signal (binding_set, keyval, 0,
"scroll_child", 2,
GTK_TYPE_SCROLL_TYPE, scroll,
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);
/* 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));
}
-
-static gboolean
-set_toolbar_transfer_mode (ModestMsgViewWindow *self)
-{
- ModestMsgViewWindowPrivate *priv = NULL;
-
- g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), FALSE);
-
- priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
-
- set_progress_hint (self, TRUE);
-
- return FALSE;
-}
-
static void
update_progress_hint (ModestMsgViewWindow *self)
{
modest_msg_view_set_shadow_type (MODEST_MSG_VIEW (priv->msg_view), GTK_SHADOW_NONE);
main_vbox = gtk_vbox_new (FALSE, 6);
priv->main_scroll = hildon_pannable_area_new ();
+ g_object_set (G_OBJECT (priv->main_scroll),
+ "mov-mode", HILDON_MOVEMENT_MODE_BOTH,
+ "hovershoot-max", 0,
+ NULL);
gtk_container_add (GTK_CONTAINER (priv->main_scroll), priv->msg_view);
gtk_box_pack_start (GTK_BOX(main_vbox), priv->main_scroll, TRUE, TRUE, 0);
gtk_container_add (GTK_CONTAINER(obj), main_vbox);
- 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);
-
/* NULL-ize fields if the window is destroyed */
g_signal_connect (priv->msg_view, "destroy", G_CALLBACK (gtk_widget_destroyed), &(priv->msg_view));
G_CALLBACK (modest_ui_actions_on_details), obj);
g_signal_connect (G_OBJECT(priv->msg_view), "link_contextual",
G_CALLBACK (modest_ui_actions_on_msg_link_contextual), obj);
+ g_signal_connect (G_OBJECT(priv->msg_view), "limit_error",
+ G_CALLBACK (modest_ui_actions_on_limit_error), obj);
g_signal_connect (G_OBJECT (priv->msg_view), "fetch_image",
G_CALLBACK (on_fetch_image), obj);
modest_window_set_active_account (MODEST_WINDOW(obj), modest_account_name);
modest_window_set_active_mailbox (MODEST_WINDOW(obj), mailbox);
- 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;
-
+ /* First add out toolbar ... */
modest_msg_view_window_show_toolbar (MODEST_WINDOW (obj), TRUE);
+ /* ... and later the find toolbar. This way find toolbar will
+ be shown over the other */
+ 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->last_search = NULL;
+
/* Init the clipboard actions dim status */
modest_msg_view_grab_focus(MODEST_MSG_VIEW (priv->msg_view));
/* Setup row references and connect signals */
priv->header_model = g_object_ref (model);
- if (row_reference) {
+ if (row_reference && gtk_tree_row_reference_valid (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, priv->is_outbox);
tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
update_window_title (MODEST_MSG_VIEW_WINDOW (window));
+ update_branding (MODEST_MSG_VIEW_WINDOW (window));
/* gtk_widget_show_all (GTK_WIDGET (window)); */
modest_msg_view_window_update_priority (window);
}
ModestWindow *
+modest_msg_view_window_new_from_uid (const gchar *modest_account_name,
+ const gchar *mailbox,
+ const gchar *msg_uid)
+{
+ ModestMsgViewWindow *window = NULL;
+ ModestMsgViewWindowPrivate *priv = NULL;
+ ModestWindowMgr *mgr = NULL;
+ gboolean is_merge;
+ TnyAccount *account = 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, mailbox, msg_uid);
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+
+
+
+ is_merge = g_str_has_prefix (msg_uid, "merge:");
+
+ /* Get the account */
+ if (!is_merge)
+ account = tny_account_store_find_account (TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()),
+ msg_uid);
+
+
+ if (is_merge || account) {
+ TnyFolder *folder = NULL;
+
+ /* Try to get the message, if it's already downloaded
+ we don't need to connect */
+ if (account) {
+ folder = modest_tny_folder_store_find_folder_from_uri (TNY_FOLDER_STORE (account), msg_uid);
+ } else {
+ ModestTnyAccountStore *account_store;
+ ModestTnyLocalFoldersAccount *local_folders_account;
+
+ account_store = modest_runtime_get_account_store ();
+ local_folders_account = MODEST_TNY_LOCAL_FOLDERS_ACCOUNT (
+ modest_tny_account_store_get_local_folders_account (account_store));
+ folder = modest_tny_local_folders_account_get_merged_outbox (local_folders_account);
+ g_object_unref (local_folders_account);
+ }
+ if (folder) {
+ TnyDevice *device;
+ gboolean device_online;
+
+ device = modest_runtime_get_device();
+ device_online = tny_device_is_online (device);
+ if (device_online) {
+ message_reader (window, priv, NULL, msg_uid, folder, NULL);
+ } else {
+ TnyMsg *msg = tny_folder_find_msg (folder, msg_uid, NULL);
+ if (msg) {
+ tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
+ update_window_title (MODEST_MSG_VIEW_WINDOW (window));
+ update_branding (MODEST_MSG_VIEW_WINDOW (window));
+ g_object_unref (msg);
+ } else {
+ message_reader (window, priv, NULL, msg_uid, folder, NULL);
+ }
+ }
+ g_object_unref (folder);
+ }
+
+ }
+
+ /* 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);
+}
+
+ModestWindow *
modest_msg_view_window_new_from_header_view (ModestHeaderView *header_view,
const gchar *modest_account_name,
const gchar *mailbox,
priv->header_model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
g_object_ref (priv->header_model);
- if (row_reference) {
+ if (row_reference && gtk_tree_row_reference_valid (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 (priv->header_model, &(priv->next_row_reference), TRUE, priv->is_outbox);
}
tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), NULL);
+ update_branding (MODEST_MSG_VIEW_WINDOW (window));
- path = gtk_tree_row_reference_get_path (row_reference);
- if (gtk_tree_model_get_iter (priv->header_model, &iter, path)) {
- TnyHeader *header;
- gtk_tree_model_get (priv->header_model, &iter,
- TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
- &header, -1);
- message_reader (window, priv, header, row_reference);
- g_object_unref (header);
+ if (priv->row_reference) {
+ path = gtk_tree_row_reference_get_path (priv->row_reference);
+ if (gtk_tree_model_get_iter (priv->header_model, &iter, path)) {
+ TnyHeader *header;
+ gtk_tree_model_get (priv->header_model, &iter,
+ TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
+ &header, -1);
+ message_reader (window, priv, header, NULL, NULL, priv->row_reference);
+ g_object_unref (header);
+ }
+ gtk_tree_path_free (path);
}
- gtk_tree_path_free (path);
-
/* Check dimming rules */
modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
}
ModestWindow *
-modest_msg_view_window_new_for_search_result (TnyMsg *msg,
+modest_msg_view_window_new_for_search_result (TnyMsg *msg,
const gchar *modest_account_name,
const gchar *mailbox,
const gchar *msg_uid)
priv->is_search_result = TRUE;
tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
+ update_branding (MODEST_MSG_VIEW_WINDOW (window));
update_window_title (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 (obj));
+ update_branding (MODEST_MSG_VIEW_WINDOW (obj));
/* gtk_widget_show_all (GTK_WIDGET (obj)); */
/* Setup row_reference for the actual msg. */
priv->row_reference = gtk_tree_row_reference_new (priv->header_model, tree_path);
if (priv->row_reference == NULL) {
- g_warning("No reference for msg header item.");
+ g_warning("%s: No reference for msg header item.", __FUNCTION__);
return;
}
gpointer arg3,
ModestMsgViewWindow *window)
{
- ModestMsgViewWindowPrivate *priv = NULL;
+ ModestMsgViewWindowPrivate *priv = NULL;
gboolean already_changed = FALSE;
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(window);
/* If the current row was reordered select the proper next
valid row. The same if the next row reference changes */
- if (priv->row_reference &&
- gtk_tree_row_reference_valid (priv->row_reference)) {
- GtkTreePath *path;
- path = gtk_tree_row_reference_get_path (priv->row_reference);
- if (gtk_tree_path_compare (path, arg1) == 0) {
- if (priv->next_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 (header_model, &(priv->next_row_reference), FALSE, priv->is_outbox);
- already_changed = TRUE;
- }
- gtk_tree_path_free (path);
- }
- if (!already_changed &&
- priv->next_row_reference &&
+ if (!priv->row_reference ||
+ !gtk_tree_row_reference_valid (priv->row_reference))
+ return;
+
+ if (priv->next_row_reference &&
gtk_tree_row_reference_valid (priv->next_row_reference)) {
- GtkTreePath *path;
- path = gtk_tree_row_reference_get_path (priv->next_row_reference);
- if (gtk_tree_path_compare (path, arg1) == 0) {
- if (priv->next_row_reference) {
- gtk_tree_row_reference_free (priv->next_row_reference);
- }
+ GtkTreePath *cur, *next;
+ /* Check that the order is still the correct one */
+ cur = gtk_tree_row_reference_get_path (priv->row_reference);
+ next = gtk_tree_row_reference_get_path (priv->next_row_reference);
+ gtk_tree_path_next (cur);
+ if (gtk_tree_path_compare (cur, next) != 0) {
+ 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 (header_model, &(priv->next_row_reference), FALSE, priv->is_outbox);
+ already_changed = TRUE;
}
- gtk_tree_path_free (path);
+ gtk_tree_path_free (cur);
+ gtk_tree_path_free (next);
+ } else {
+ if (priv->next_row_reference)
+ gtk_tree_row_reference_free (priv->next_row_reference);
+ /* Update next row reference */
+ priv->next_row_reference = gtk_tree_row_reference_copy (priv->row_reference);
+ select_next_valid_row (header_model, &(priv->next_row_reference), FALSE, priv->is_outbox);
+ already_changed = TRUE;
}
+
check_dimming_rules_after_change (window);
}
return (const gchar*) priv->msg_uid;
}
-static void
-modest_msg_view_window_toggle_find_toolbar (GtkToggleAction *toggle,
+/* Used for the Ctrl+F accelerator */
+static void
+modest_msg_view_window_toggle_find_toolbar (GtkWidget *obj,
gpointer data)
{
ModestMsgViewWindow *window = MODEST_MSG_VIEW_WINDOW (data);
ModestMsgViewWindowPrivate *priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
- ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
- gboolean is_active;
- GtkAction *action;
- is_active = gtk_toggle_action_get_active (toggle);
-
- if (is_active) {
- gtk_widget_show (priv->find_toolbar);
- hildon_find_toolbar_highlight_entry (HILDON_FIND_TOOLBAR (priv->find_toolbar), TRUE);
- } else {
- gtk_widget_hide (priv->find_toolbar);
- modest_msg_view_grab_focus (MODEST_MSG_VIEW (priv->msg_view));
- }
+ if (GTK_WIDGET_VISIBLE (priv->find_toolbar)) {
+ modest_msg_view_window_find_toolbar_close (obj, data);
+ } else {
+ modest_msg_view_window_show_find_toolbar (obj, data);
+ }
+}
- /* update the toggle buttons status */
- action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage");
- if (action)
- modest_utils_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), is_active);
+/* Handler for menu option */
+static void
+modest_msg_view_window_show_find_toolbar (GtkWidget *obj,
+ gpointer data)
+{
+ ModestMsgViewWindow *window = MODEST_MSG_VIEW_WINDOW (data);
+ ModestMsgViewWindowPrivate *priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+ gtk_widget_show (priv->find_toolbar);
+ hildon_find_toolbar_highlight_entry (HILDON_FIND_TOOLBAR (priv->find_toolbar), TRUE);
}
+/* Handler for click on the "X" close button in find toolbar */
static void
modest_msg_view_window_find_toolbar_close (GtkWidget *widget,
ModestMsgViewWindow *obj)
{
- GtkToggleAction *toggle;
- ModestWindowPrivate *parent_priv;
ModestMsgViewWindowPrivate *priv;
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (obj);
- parent_priv = MODEST_WINDOW_GET_PRIVATE (obj);
- toggle = GTK_TOGGLE_ACTION (gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage"));
- gtk_toggle_action_set_active (toggle, FALSE);
+ /* Hide toolbar */
+ gtk_widget_hide (priv->find_toolbar);
modest_msg_view_grab_focus (MODEST_MSG_VIEW (priv->msg_view));
}
modest_zoomable_set_zoom (MODEST_ZOOMABLE (priv->msg_view), zoom_level);
return TRUE;
-
}
static gboolean
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 ||
- 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_PRESS) {
- 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 FALSE;
} else {
return FALSE;
}
- } else {
- return FALSE;
}
+ return FALSE;
}
gboolean
typedef struct {
TnyHeader *header;
+ gchar *msg_uid;
+ TnyFolder *folder;
GtkTreeRowReference *row_reference;
} MsgReaderInfo;
}
/* Register the header - it'll be unregistered in the callback */
- modest_window_mgr_register_header (modest_runtime_get_window_mgr (), info->header, NULL);
+ if (info->header)
+ modest_window_mgr_register_header (modest_runtime_get_window_mgr (), info->header, NULL);
/* New mail operation */
mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window),
NULL, NULL);
modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
- modest_mail_operation_get_msg (mail_op, info->header, TRUE, view_msg_cb, info->row_reference);
+ if (info->header)
+ modest_mail_operation_get_msg (mail_op, info->header, TRUE, view_msg_cb, info->row_reference);
+ else
+ modest_mail_operation_find_msg (mail_op, info->folder, info->msg_uid, TRUE, view_msg_cb, NULL);
g_object_unref (mail_op);
/* Update dimming rules */
frees:
/* Frees. The row_reference will be freed by the view_msg_cb callback */
- g_object_unref (info->header);
+ g_free (info->msg_uid);
+ if (info->folder)
+ g_object_unref (info->folder);
+ if (info->header)
+ g_object_unref (info->header);
g_slice_free (MsgReaderInfo, info);
}
message_reader (ModestMsgViewWindow *window,
ModestMsgViewWindowPrivate *priv,
TnyHeader *header,
+ const gchar *msg_uid,
+ TnyFolder *folder,
GtkTreeRowReference *row_reference)
{
ModestWindowMgr *mgr;
- TnyAccount *account;
- TnyFolder *folder;
+ TnyAccount *account = NULL;
MsgReaderInfo *info;
- g_return_val_if_fail (row_reference != NULL, FALSE);
-
/* We set the header from model while we're loading */
tny_header_view_set_header (TNY_HEADER_VIEW (priv->msg_view), header);
gtk_window_set_title (GTK_WINDOW (window), _CS("ckdg_pb_updating"));
+ if (header)
+ folder = NULL;
+
+ if (folder)
+ g_object_ref (folder);
+
mgr = modest_runtime_get_window_mgr ();
/* Msg download completed */
- if (!(tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED)) {
+ if (!header || !(tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED)) {
/* Ask the user if he wants to download the message if
we're not online */
return FALSE;
}
- folder = tny_header_get_folder (header);
+ if (header) {
+ folder = tny_header_get_folder (header);
+ }
info = g_slice_new (MsgReaderInfo);
- info->header = g_object_ref (header);
- info->row_reference = gtk_tree_row_reference_copy (row_reference);
+ info->msg_uid = g_strdup (msg_uid);
+ if (header)
+ info->header = g_object_ref (header);
+ else
+ info->header = NULL;
+ if (folder)
+ info->folder = g_object_ref (folder);
+ else
+ info->folder = NULL;
+ if (row_reference) {
+ info->row_reference = gtk_tree_row_reference_copy (row_reference);
+ } else {
+ info->row_reference = NULL;
+ }
/* Offer the connection dialog if necessary */
modest_platform_connect_if_remote_and_perform ((GtkWindow *) window,
TNY_FOLDER_STORE (folder),
message_reader_performer,
info);
- g_object_unref (folder);
+ if (folder)
+ g_object_unref (folder);
return TRUE;
}
}
- folder = tny_header_get_folder (header);
- account = tny_folder_get_account (folder);
+ if (header) {
+ folder = tny_header_get_folder (header);
+ }
+ if (folder)
+ account = tny_folder_get_account (folder);
+
info = g_slice_new (MsgReaderInfo);
- info->header = g_object_ref (header);
- info->row_reference = gtk_tree_row_reference_copy (row_reference);
+ info->msg_uid = g_strdup (msg_uid);
+ if (folder)
+ info->folder = g_object_ref (folder);
+ else
+ info->folder = NULL;
+ if (header)
+ info->header = g_object_ref (header);
+ else
+ info->header = NULL;
+ if (row_reference)
+ info->row_reference = gtk_tree_row_reference_copy (row_reference);
+ else
+ info->row_reference = NULL;
message_reader_performer (FALSE, NULL, (GtkWindow *) window, account, info);
- g_object_unref (account);
- g_object_unref (folder);
+ if (account)
+ g_object_unref (account);
+ if (folder)
+ g_object_unref (folder);
return TRUE;
}
-gboolean
+gboolean
modest_msg_view_window_select_next_message (ModestMsgViewWindow *window)
{
ModestMsgViewWindowPrivate *priv;
tree models and reports the deletion when the row is still
there */
if (!gtk_tree_row_reference_valid (priv->next_row_reference)) {
+ if (priv->next_row_reference) {
+ gtk_tree_row_reference_free (priv->next_row_reference);
+ }
if (gtk_tree_row_reference_valid (priv->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, priv->is_outbox);
+ } else {
+ priv->next_row_reference = NULL;
}
}
if (priv->next_row_reference)
&header, -1);
/* Read the message & show it */
- if (!message_reader (window, priv, header, row_reference)) {
+ if (!message_reader (window, priv, header, NULL, NULL, row_reference)) {
retval = FALSE;
}
gtk_tree_row_reference_free (row_reference);
g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), FALSE);
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+ if (priv->row_reference && !gtk_tree_row_reference_valid (priv->row_reference)) {
+ gtk_tree_row_reference_free (priv->row_reference);
+ priv->row_reference = NULL;
+ }
+
/* Return inmediatly if there is no header model */
if (!priv->header_model || !priv->row_reference)
return FALSE;
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);
+ retval = message_reader (window, priv, header, NULL, NULL, row_reference);
gtk_tree_row_reference_free (row_reference);
} else {
finished = FALSE;
row_reference = (GtkTreeRowReference *) user_data;
if (canceled) {
- gtk_tree_row_reference_free (row_reference);
+ if (row_reference)
+ gtk_tree_row_reference_free (row_reference);
self = (ModestMsgViewWindow *) modest_mail_operation_get_source (mail_op);
if (self) {
/* Restore window title */
update_window_title (self);
+ modest_ui_actions_on_close_window (NULL, MODEST_WINDOW (self));
g_object_unref (self);
}
return;
/* If there was any error */
if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg)) {
- gtk_tree_row_reference_free (row_reference);
+ if (row_reference)
+ gtk_tree_row_reference_free (row_reference);
self = (ModestMsgViewWindow *) modest_mail_operation_get_source (mail_op);
if (self) {
/* Restore window title */
update_window_title (self);
+ modest_ui_actions_on_close_window (NULL, MODEST_WINDOW (self));
g_object_unref (self);
}
return;
/* Update the 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->row_reference = (row_reference && gtk_tree_row_reference_valid (row_reference))?gtk_tree_row_reference_copy (row_reference):NULL;
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, priv->is_outbox);
+ if (priv->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, priv->is_outbox);
+ } else {
+ priv->next_row_reference = NULL;
+ }
}
/* Mark header as read */
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));
+ update_branding (MODEST_MSG_VIEW_WINDOW (self));
modest_msg_view_grab_focus (MODEST_MSG_VIEW (priv->msg_view));
}
/* Frees */
g_object_unref (self);
- gtk_tree_row_reference_free (row_reference);
+ if (row_reference)
+ gtk_tree_row_reference_free (row_reference);
}
TnyFolderType
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
- if (priv->header_model && priv->row_reference) {
+ if (priv->header_model && priv->row_reference && gtk_tree_row_reference_valid (priv->row_reference)) {
GtkTreeIter iter;
GtkTreePath *path = NULL;
static_button_size = modest_window_mgr_get_fullscreen_mode (mgr)?120:120;
if (parent_priv->toolbar) {
- /* left size buttons */
+ /* Set expandable and homogeneous tool 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);
+ gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), TRUE);
+ gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), TRUE);
+ widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReplyAll");
+ gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), TRUE);
+ gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), TRUE);
+ widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageForward");
+ gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), TRUE);
+ gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), TRUE);
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_expand (GTK_TOOL_ITEM (widget), TRUE);
+ gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), TRUE);
+ widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarDownloadExternalImages");
+ gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), TRUE);
+ gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), TRUE);
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);
tmp = priv->progress_widgets;
source = modest_mail_operation_get_source(mail_op);
if (G_OBJECT (self) == source) {
- if (op_type == MODEST_MAIL_OPERATION_TYPE_RECEIVE) {
- set_toolbar_transfer_mode(self);
+ if (op_type == MODEST_MAIL_OPERATION_TYPE_RECEIVE ||
+ op_type == MODEST_MAIL_OPERATION_TYPE_OPEN ||
+ op_type == MODEST_MAIL_OPERATION_TYPE_DELETE) {
+ set_progress_hint (self, TRUE);
while (tmp) {
modest_progress_object_add_operation (
MODEST_PROGRESS_OBJECT (tmp->data),
}
}
g_object_unref (source);
+
+ /* Update dimming rules */
+ check_dimming_rules_after_change (self);
}
-static void
+static void
on_mail_operation_finished (ModestMailOperation *mail_op,
gpointer user_data)
{
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) {
+
+ if (op_type == MODEST_MAIL_OPERATION_TYPE_RECEIVE ||
+ op_type == MODEST_MAIL_OPERATION_TYPE_OPEN ||
+ op_type == MODEST_MAIL_OPERATION_TYPE_DELETE) {
while (tmp) {
modest_progress_object_remove_operation (MODEST_PROGRESS_OBJECT (tmp->data),
mail_op);
won't let the user delete the message that has been
readed for example */
check_dimming_rules_after_change (self);
-
}
static void
typedef struct {
ModestMsgViewWindow *self;
gchar *file_path;
+ gchar *attachment_uid;
} DecodeAsyncHelper;
static void
gpointer user_data)
{
DecodeAsyncHelper *helper = (DecodeAsyncHelper *) user_data;
+ const gchar *content_type;
/* It could happen that the window was closed */
if (GTK_WIDGET_VISIBLE (helper->self))
if (cancelled || err) {
if (err) {
- gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
+ gchar *msg;
+ if ((err->domain == TNY_ERROR_DOMAIN) &&
+ (err->code == TNY_IO_ERROR_WRITE) &&
+ (errno == ENOSPC)) {
+ msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
+ } else {
+ msg = g_strdup (_("mail_ib_file_operation_failed"));
+ }
modest_platform_information_banner (NULL, NULL, msg);
g_free (msg);
}
goto free;
}
- /* make the file read-only */
- g_chmod(helper->file_path, 0444);
+ content_type = tny_mime_part_get_content_type (mime_part);
+ if (g_str_has_prefix (content_type, "message/rfc822")) {
+ ModestWindowMgr *mgr;
+ ModestWindow *msg_win = NULL;
+ TnyMsg * msg;
+ gchar *account;
+ const gchar *mailbox;
+ TnyStream *file_stream;
+ gint fd;
+
+ fd = g_open (helper->file_path, O_RDONLY, 0644);
+ if (fd != -1) {
+ file_stream = tny_fs_stream_new (fd);
+
+ mgr = modest_runtime_get_window_mgr ();
- /* Activate the file */
- modest_platform_activate_file (helper->file_path, tny_mime_part_get_content_type (mime_part));
+ account = g_strdup (modest_window_get_active_account (MODEST_WINDOW (helper->self)));
+ mailbox = modest_window_get_active_mailbox (MODEST_WINDOW (helper->self));
+
+ if (!account)
+ account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr ());
+
+ msg = tny_camel_msg_new ();
+ tny_camel_msg_parse (msg, file_stream);
+ msg_win = modest_msg_view_window_new_for_attachment (TNY_MSG (msg), account, mailbox, helper->attachment_uid);
+ modest_window_set_zoom (MODEST_WINDOW (msg_win),
+ modest_window_get_zoom (MODEST_WINDOW (helper->self)));
+ if (modest_window_mgr_register_window (mgr, msg_win, MODEST_WINDOW (helper->self)))
+ gtk_widget_show_all (GTK_WIDGET (msg_win));
+ else
+ gtk_widget_destroy (GTK_WIDGET (msg_win));
+ g_object_unref (msg);
+ g_object_unref (file_stream);
+ } else {
+ modest_platform_information_banner (NULL, NULL, _("mail_ib_file_operation_failed"));
+ }
+
+ } else {
+
+ /* make the file read-only */
+ g_chmod(helper->file_path, 0444);
+
+ /* Activate the file */
+ modest_platform_activate_file (helper->file_path, tny_mime_part_get_content_type (mime_part));
+ }
free:
/* Frees */
g_object_unref (helper->self);
g_free (helper->file_path);
+ g_free (helper->attachment_uid);
g_slice_free (DecodeAsyncHelper, helper);
}
&filepath);
if (temp_stream != NULL) {
+ ModestAccountMgr *mgr;
DecodeAsyncHelper *helper;
+ gboolean decode_in_provider;
+ ModestProtocol *protocol;
+ const gchar *account;
/* Activate progress hint */
set_progress_hint (window, TRUE);
helper = g_slice_new0 (DecodeAsyncHelper);
helper->self = g_object_ref (window);
helper->file_path = g_strdup (filepath);
+ helper->attachment_uid = g_strdup (attachment_uid);
+
+ decode_in_provider = FALSE;
+ mgr = modest_runtime_get_account_mgr ();
+ account = modest_window_get_active_account (MODEST_WINDOW (window));
+ if (modest_account_mgr_account_is_multimailbox (mgr, account, &protocol)) {
+ if (MODEST_IS_ACCOUNT_PROTOCOL (protocol)) {
+ gchar *uri;
+ uri = g_strconcat ("file://", filepath, NULL);
+ decode_in_provider =
+ modest_account_protocol_decode_part_to_stream_async (
+ MODEST_ACCOUNT_PROTOCOL (protocol),
+ mime_part,
+ filepath,
+ TNY_STREAM (temp_stream),
+ on_decode_to_stream_async_handler,
+ NULL,
+ helper);
+ g_free (uri);
+ }
+ }
- tny_mime_part_decode_to_stream_async (mime_part, TNY_STREAM (temp_stream),
- on_decode_to_stream_async_handler,
- NULL,
- helper);
+ if (!decode_in_provider)
+ tny_mime_part_decode_to_stream_async (mime_part, TNY_STREAM (temp_stream),
+ on_decode_to_stream_async_handler,
+ NULL,
+ helper);
g_object_unref (temp_stream);
/* NOTE: files in the temporary area will be automatically
* cleaned after some time if they are no longer in use */
&msg_win);
if (found) {
- g_warning ("window for this body is already being created");
+ g_debug ("window for this body is already being created");
} else {
/* it's not found, so create a new window for it */
if (found) {
/* if it's found, but there is no msg_win, it's probably in the process of being created;
* thus, we don't do anything */
- g_warning ("window for is already being created");
+ g_debug ("window for is already being created");
} else {
/* it's not found, so create a new window for it */
modest_window_mgr_register_header (mgr, header, attachment_uid); /* register the uid before building the window */
{
GList *pairs;
GnomeVFSResult result;
+ gchar *uri;
+ ModestMsgViewWindow *window;
} SaveMimePartInfo;
static void save_mime_part_info_free (SaveMimePartInfo *info, gboolean with_struct);
static gboolean idle_save_mime_part_show_result (SaveMimePartInfo *info);
static gpointer save_mime_part_to_file (SaveMimePartInfo *info);
-static void save_mime_parts_to_file_with_checks (SaveMimePartInfo *info);
+static void save_mime_parts_to_file_with_checks (GtkWindow *parent, SaveMimePartInfo *info);
static void
save_mime_part_info_free (SaveMimePartInfo *info, gboolean with_struct)
}
g_list_free (info->pairs);
info->pairs = NULL;
+ g_free (info->uri);
+ g_object_unref (info->window);
+ info->window = NULL;
if (with_struct) {
g_slice_free (SaveMimePartInfo, info);
}
static gboolean
idle_save_mime_part_show_result (SaveMimePartInfo *info)
{
- if (info->pairs != NULL) {
- save_mime_part_to_file (info);
- } else {
- /* This is a GDK lock because we are an idle callback and
- * hildon_banner_show_information is or does Gtk+ code */
+ /* This is a GDK lock because we are an idle callback and
+ * hildon_banner_show_information is or does Gtk+ code */
- gdk_threads_enter (); /* CHECKED */
- save_mime_part_info_free (info, TRUE);
- if (info->result == GNOME_VFS_OK) {
- hildon_banner_show_information (NULL, NULL, _CS("sfil_ib_saved"));
- } else if (info->result == GNOME_VFS_ERROR_NO_SPACE) {
- gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
- modest_platform_information_banner (NULL, NULL, msg);
- g_free (msg);
- } else {
- hildon_banner_show_information (NULL, NULL, _("mail_ib_file_operation_failed"));
- }
- gdk_threads_leave (); /* CHECKED */
+ gdk_threads_enter (); /* CHECKED */
+ if (info->result == GNOME_VFS_OK) {
+ hildon_banner_show_information (NULL, NULL, _CS("sfil_ib_saved"));
+ } else if (info->result == GNOME_VFS_ERROR_NO_SPACE) {
+ gchar *msg = NULL;
+
+ /* Check if the uri belongs to the external mmc */
+ if (g_str_has_prefix (info->uri, g_getenv (MODEST_MMC1_VOLUMEPATH_ENV)))
+ msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
+ else
+ msg = g_strdup (_KR("cerm_memory_card_full"));
+ modest_platform_information_banner (NULL, NULL, msg);
+ g_free (msg);
+ } else {
+ hildon_banner_show_information (NULL, NULL, _("mail_ib_file_operation_failed"));
}
+ save_mime_part_info_free (info, FALSE);
+ gdk_threads_leave (); /* CHECKED */
return FALSE;
}
info->result = gnome_vfs_create (&handle, pair->filename, GNOME_VFS_OPEN_WRITE, FALSE, 0644);
if (info->result == GNOME_VFS_OK) {
GError *error = NULL;
+ gboolean decode_in_provider;
+ gssize written;
+ ModestAccountMgr *mgr;
+ const gchar *account;
+ ModestProtocol *protocol = NULL;
+
stream = tny_vfs_stream_new (handle);
- if (tny_mime_part_decode_to_stream (pair->part, stream, &error) < 0) {
+
+ decode_in_provider = FALSE;
+ mgr = modest_runtime_get_account_mgr ();
+ account = modest_window_get_active_account (MODEST_WINDOW (info->window));
+ if (modest_account_mgr_account_is_multimailbox (mgr, account, &protocol)) {
+ if (MODEST_IS_ACCOUNT_PROTOCOL (protocol)) {
+ decode_in_provider =
+ modest_account_protocol_decode_part_to_stream (
+ MODEST_ACCOUNT_PROTOCOL (protocol),
+ pair->part,
+ pair->filename,
+ stream,
+ &written,
+ &error);
+ }
+ }
+ if (!decode_in_provider)
+ written = tny_mime_part_decode_to_stream (pair->part, stream, &error);
+
+ if (written < 0) {
g_warning ("modest: could not save attachment %s: %d (%s)\n", pair->filename, error?error->code:-1, error?error->message:"Unknown error");
if ((error->domain == TNY_ERROR_DOMAIN) &&
}
}
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);
} else {
- g_warning ("modest: could not create save attachment %s: %s\n", pair->filename, gnome_vfs_result_to_string (info->result));
- save_mime_part_info_free (info, FALSE);
+ g_warning ("Could not create save attachment %s: %s\n",
+ pair->filename, gnome_vfs_result_to_string (info->result));
+ }
+
+ /* Go on saving remaining files */
+ info->pairs = g_list_remove_link (info->pairs, info->pairs);
+ if (info->pairs != NULL) {
+ save_mime_part_to_file (info);
+ } else {
+ g_idle_add ((GSourceFunc) idle_save_mime_part_show_result, info);
}
- g_idle_add ((GSourceFunc) idle_save_mime_part_show_result, info);
return NULL;
}
static void
-save_mime_parts_to_file_with_checks (SaveMimePartInfo *info)
+save_mime_parts_to_file_with_checks (GtkWindow *parent,
+ SaveMimePartInfo *info)
{
gboolean is_ok = TRUE;
gint replaced_files = 0;
const GList *files = info->pairs;
- const GList *iter;
+ const GList *iter, *to_replace = NULL;
for (iter = files; (iter != NULL) && (replaced_files < 2); iter = g_list_next(iter)) {
SaveMimePartPair *pair = iter->data;
- if (modest_utils_file_exists (pair->filename)) {
+ gchar *unescaped = g_uri_unescape_string (pair->filename, NULL);
+
+ if (modest_utils_file_exists (unescaped)) {
replaced_files++;
+ if (replaced_files == 1)
+ to_replace = iter;
}
+ g_free (unescaped);
}
if (replaced_files) {
- GtkWidget *confirm_overwrite_dialog;
+ gint response;
if (replaced_files == 1) {
- SaveMimePartPair *pair = files->data;
+ SaveMimePartPair *pair = to_replace->data;
const gchar *basename = strrchr (pair->filename, G_DIR_SEPARATOR) + 1;
gchar *escaped_basename, *message;
message = g_strdup_printf ("%s\n%s",
_FM("docm_nc_replace_file"),
(escaped_basename) ? escaped_basename : "");
- confirm_overwrite_dialog = hildon_note_new_confirmation (NULL, message);
+ response = modest_platform_run_confirmation_dialog (parent, message);
g_free (message);
g_free (escaped_basename);
} else {
- confirm_overwrite_dialog = hildon_note_new_confirmation (NULL,
- _FM("docm_nc_replace_multiple"));
+ response = modest_platform_run_confirmation_dialog (parent,
+ _FM("docm_nc_replace_multiple"));
}
- if (gtk_dialog_run (GTK_DIALOG (confirm_overwrite_dialog)) != GTK_RESPONSE_OK)
+ if (response != GTK_RESPONSE_OK)
is_ok = FALSE;
-
- gtk_widget_destroy (confirm_overwrite_dialog);
}
if (!is_ok) {
}
+typedef struct _SaveAttachmentsInfo {
+ TnyList *attachments_list;
+ ModestMsgViewWindow *window;
+} SaveAttachmentsInfo;
+
static void
save_attachments_response (GtkDialog *dialog,
gint arg1,
gchar *chooser_uri;
GList *files_to_save = NULL;
gchar *current_folder;
+ SaveAttachmentsInfo *sa_info = (SaveAttachmentsInfo *) user_data;
- mime_parts = TNY_LIST (user_data);
+ mime_parts = TNY_LIST (sa_info->attachments_list);
if (arg1 != GTK_RESPONSE_OK)
goto end;
chooser_uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog));
current_folder = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (dialog));
- if (current_folder && current_folder != '\0') {
+ if (current_folder && *current_folder != '\0') {
GError *err = NULL;
- modest_conf_set_string (modest_runtime_get_conf (), MODEST_CONF_LATEST_SAVE_ATTACHMENT_PATH,
+ modest_conf_set_string (modest_runtime_get_conf (), MODEST_CONF_LATEST_SAVE_ATTACHMENT_PATH,
current_folder,&err);
if (err != NULL) {
g_debug ("Error storing latest used folder: %s", err->message);
g_free (current_folder);
if (!modest_utils_folder_writable (chooser_uri)) {
- hildon_banner_show_information
- (NULL, NULL, _FM("sfil_ib_readonly_location"));
+ const gchar *err_msg;
+
+#ifdef MODEST_PLATFORM_MAEMO
+ if (modest_maemo_utils_in_usb_mode ()) {
+ err_msg = dgettext ("hildon-status-bar-usb", "usbh_ib_mmc_usb_connected");
+ } else {
+ err_msg = _FM("sfil_ib_readonly_location");
+ }
+#else
+ err_msg = _FM("sfil_ib_readonly_location");
+#endif
+ hildon_banner_show_information (NULL, NULL, err_msg);
} else {
TnyIterator *iter;
}
g_object_unref (iter);
}
- g_free (chooser_uri);
if (files_to_save != NULL) {
SaveMimePartInfo *info = g_slice_new0 (SaveMimePartInfo);
info->pairs = files_to_save;
info->result = TRUE;
- save_mime_parts_to_file_with_checks (info);
+ info->uri = g_strdup (chooser_uri);
+ info->window = g_object_ref (sa_info->window);
+ save_mime_parts_to_file_with_checks ((GtkWindow *) dialog, info);
}
+ g_free (chooser_uri);
end:
/* Free and close the dialog */
g_object_unref (mime_parts);
+ g_object_unref (sa_info->window);
+ g_slice_free (SaveAttachmentsInfo, sa_info);
gtk_widget_destroy (GTK_WIDGET (dialog));
}
gchar *conf_folder = NULL;
gchar *filename = NULL;
gchar *save_multiple_str = NULL;
+ const gchar *root_folder = "file:///";
g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window));
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
filename = g_strdup (tny_mime_part_get_filename (mime_part));
} else {
/* TODO: show any error? */
- g_warning ("Tried to save a non-file attachment");
+ g_warning ("%s: Tried to save a non-file attachment", __FUNCTION__);
g_object_unref (mime_parts);
return;
}
save_dialog = hildon_file_chooser_dialog_new (GTK_WINDOW (window),
GTK_FILE_CHOOSER_ACTION_SAVE);
- /* set folder */
- conf_folder = modest_conf_get_string (modest_runtime_get_conf (), MODEST_CONF_LATEST_SAVE_ATTACHMENT_PATH, NULL);
+ /* Get last used folder */
+ conf_folder = modest_conf_get_string (modest_runtime_get_conf (),
+ MODEST_CONF_LATEST_SAVE_ATTACHMENT_PATH, NULL);
+
+ /* File chooser stops working if we select "file:///" as current folder */
+ if (conf_folder && g_ascii_strcasecmp (root_folder, conf_folder) != 0) {
+ g_free (conf_folder);
+ conf_folder = NULL;
+ }
+
if (conf_folder && conf_folder[0] != '\0') {
gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (save_dialog), conf_folder);
} else {
gchar *docs_folder;
- /* Set the default folder to images folder */
- docs_folder = g_build_filename (g_getenv (MYDOCS_ENV), DOCS_FOLDER, NULL);
+ /* Set the default folder to documents folder */
+ docs_folder = (gchar *) g_strdup(g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS));
+ if (!docs_folder) {
+ /* fallback */
+ docs_folder = g_build_filename (g_getenv (MYDOCS_ENV), DOCS_FOLDER, NULL);
+ }
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (save_dialog), docs_folder);
g_free (docs_folder);
}
if (save_multiple_str) {
g_object_set (G_OBJECT (save_dialog), "save-multiple", save_multiple_str, NULL);
gtk_window_set_title (GTK_WINDOW (save_dialog), _FM("sfil_ti_save_objects_files"));
+ g_free (save_multiple_str);
}
/* We must run this asynchronously, because the hildon dialog
performs a gtk_dialog_run by itself which leads to gdk
deadlocks */
+ SaveAttachmentsInfo *sa_info;
+ sa_info = g_slice_new (SaveAttachmentsInfo);
+ sa_info->attachments_list = mime_parts;
+ sa_info->window = g_object_ref (window);
g_signal_connect (save_dialog, "response",
- G_CALLBACK (save_attachments_response), mime_parts);
+ G_CALLBACK (save_attachments_response), sa_info);
gtk_widget_show_all (save_dialog);
}
tny_msg_rewrite_cache (msg);
tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
g_object_unref (msg);
+ update_branding (MODEST_MSG_VIEW_WINDOW (window));
g_object_unref (mime_parts);
g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW(self));
/* Settings menu buttons */
- modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_inbox_replytoall"), NULL,
- APP_MENU_CALLBACK (modest_ui_actions_on_reply_all),
- MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_reply_msg));
- modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_inbox_forward"), "<Control>d",
- APP_MENU_CALLBACK (modest_ui_actions_on_forward),
- MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_reply_msg));
+ modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_viewer_find"), NULL,
+ APP_MENU_CALLBACK (modest_msg_view_window_show_find_toolbar),
+ MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_find_in_msg));
+
+ modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self),
+ dngettext(GETTEXT_PACKAGE,
+ "mcen_me_move_message",
+ "mcen_me_move_messages",
+ 1),
+ NULL,
+ APP_MENU_CALLBACK (modest_ui_actions_on_move_to),
+ MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_move_to));
modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_inbox_mark_as_read"), NULL,
APP_MENU_CALLBACK (modest_ui_actions_on_mark_as_read),
MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_mark_as_read_msg_in_view));
+
modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_inbox_mark_as_unread"), NULL,
APP_MENU_CALLBACK (modest_ui_actions_on_mark_as_unread),
MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_mark_as_unread_msg_in_view));
APP_MENU_CALLBACK (modest_ui_actions_add_to_contacts),
MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_add_to_contacts));
- modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mail_bd_external_images"), NULL,
- APP_MENU_CALLBACK (modest_ui_actions_on_fetch_images),
- MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_fetch_images));
modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_ti_message_properties"), NULL,
APP_MENU_CALLBACK (modest_ui_actions_on_details),
MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_details));
gtk_widget_destroy (picker_dialog);
if (selected)
- modest_address_book_add_address (selected);
+ modest_address_book_add_address (selected, (GtkWindow *) self);
g_free (selected);
} else {
modest_msg_view_window_reload (ModestMsgViewWindow *self)
{
ModestMsgViewWindowPrivate *priv;
- TnyHeader *header;
+ const gchar *msg_uid;
+ TnyHeader *header = NULL;
+ TnyFolder *folder = NULL;
g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self));
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
- header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (self));
- if (!message_reader (self, priv, header, priv->row_reference)) {
- g_warning ("Shouldn't happen, trying to reload a message failed");
- }
+ header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (self));
+ if (!header)
+ return;
+ folder = tny_header_get_folder (header);
g_object_unref (header);
+
+ if (!folder)
+ return;
+
+ msg_uid = modest_msg_view_window_get_message_uid (self);
+ if (msg_uid) {
+ GtkTreeRowReference *row_reference;
+
+ if (priv->row_reference && gtk_tree_row_reference_valid (priv->row_reference)) {
+ row_reference = priv->row_reference;
+ } else {
+ row_reference = NULL;
+ }
+ if (!message_reader (self, priv, NULL, msg_uid, folder, row_reference))
+ g_warning ("Shouldn't happen, trying to reload a message failed");
+ }
+
+ g_object_unref (folder);
+}
+
+static void
+update_branding (ModestMsgViewWindow *self)
+{
+ const gchar *account;
+ const gchar *mailbox;
+ ModestAccountMgr *mgr;
+ ModestProtocol *protocol = NULL;
+ gchar *service_name = NULL;
+ const GdkPixbuf *service_icon = NULL;
+ ModestMsgViewWindowPrivate *priv;
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
+
+ account = modest_window_get_active_account (MODEST_WINDOW (self));
+ mailbox = modest_window_get_active_mailbox (MODEST_WINDOW (self));
+
+ mgr = modest_runtime_get_account_mgr ();
+
+ if (modest_account_mgr_account_is_multimailbox (mgr, account, &protocol)) {
+ if (MODEST_IS_ACCOUNT_PROTOCOL (protocol)) {
+ service_name = modest_account_protocol_get_service_name (MODEST_ACCOUNT_PROTOCOL (protocol),
+ account, mailbox);
+ service_icon = modest_account_protocol_get_service_icon (MODEST_ACCOUNT_PROTOCOL (protocol),
+ account, mailbox, MODEST_ICON_SIZE_SMALL);
+ }
+ }
+
+ modest_msg_view_set_branding (MODEST_MSG_VIEW (priv->msg_view), service_name, service_icon);
+ g_free (service_name);
}