#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>
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 */
enum {
/* 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,
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;
/* Init window */
init_window (MODEST_MSG_VIEW_WINDOW(obj));
+
/* Set window icon */
- window_icon = modest_platform_get_icon (MODEST_APP_MSG_VIEW_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");
/* Sets current toolbar mode */
priv->current_toolbar_mode = mode;
- /* Update toolbar dimming state */
- modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (self));
+ /* Update window dimming state */
+ modest_ui_actions_check_window_dimming_rules (MODEST_WINDOW (self));
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);
}
-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)
{
GObject *obj = NULL;
ModestMsgViewWindowPrivate *priv = NULL;
ModestWindowPrivate *parent_priv = NULL;
- ModestDimmingRulesGroup *menu_rules_group = NULL;
- ModestDimmingRulesGroup *toolbar_rules_group = NULL;
+ ModestDimmingRulesGroup *window_rules_group = NULL;
ModestDimmingRulesGroup *clipboard_rules_group = NULL;
obj = G_OBJECT (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);
+ window_rules_group = modest_dimming_rules_group_new ("ModestWindowDimmingRules", TRUE);
clipboard_rules_group = modest_dimming_rules_group_new ("ModestClipboardDimmingRules", FALSE);
/* Add common dimming rules */
- modest_dimming_rules_group_add_rules (menu_rules_group,
- modest_msg_view_menu_dimming_entries,
- G_N_ELEMENTS (modest_msg_view_menu_dimming_entries),
- MODEST_WINDOW (self));
- modest_dimming_rules_group_add_rules (toolbar_rules_group,
+ modest_dimming_rules_group_add_rules (window_rules_group,
modest_msg_view_toolbar_dimming_entries,
G_N_ELEMENTS (modest_msg_view_toolbar_dimming_entries),
MODEST_WINDOW (self));
+ modest_dimming_rules_group_add_rules (window_rules_group,
+ modest_msg_view_menu_dimming_entries,
+ G_N_ELEMENTS (modest_msg_view_menu_dimming_entries),
+ MODEST_WINDOW (self));
modest_dimming_rules_group_add_rules (clipboard_rules_group,
modest_msg_view_clipboard_dimming_entries,
G_N_ELEMENTS (modest_msg_view_clipboard_dimming_entries),
MODEST_WINDOW (self));
/* Insert dimming rules group for this window */
- modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, menu_rules_group);
- modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, toolbar_rules_group);
+ modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, window_rules_group);
modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, clipboard_rules_group);
- g_object_unref (menu_rules_group);
- g_object_unref (toolbar_rules_group);
+ g_object_unref (window_rules_group);
g_object_unref (clipboard_rules_group);
restore_settings (MODEST_MSG_VIEW_WINDOW(obj));
/* 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");
}
* 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);
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",
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 */
- modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
+ /* Check window dimming rules */
+ modest_ui_actions_check_window_dimming_rules (MODEST_WINDOW (window));
+ modest_window_check_dimming_rules_group (MODEST_WINDOW (window), "ModestClipboardDimmingRules");
return MODEST_WINDOW(window);
}
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);
}
tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
update_window_title (MODEST_MSG_VIEW_WINDOW (obj));
+ /* Check window dimming rules */
+ modest_ui_actions_check_window_dimming_rules (MODEST_WINDOW (obj));
+ modest_window_check_dimming_rules_group (MODEST_WINDOW (obj), "ModestClipboardDimmingRules");
+
return MODEST_WINDOW(obj);
}
GtkTreePath *arg1,
GtkTreeIter *arg2,
ModestMsgViewWindow *window){
- modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
+ modest_ui_actions_check_window_dimming_rules (MODEST_WINDOW (window));
}
void modest_msg_view_window_on_row_deleted(
GtkTreeModel *header_model,
GtkTreePath *arg1,
ModestMsgViewWindow *window){
- modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
+ modest_ui_actions_check_window_dimming_rules (MODEST_WINDOW (window));
}
/* On insertions we check if the folder still has the message we are
* 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);
- modest_ui_actions_check_toolbar_dimming_rules (
+ select_next_valid_row (priv->header_model,
+ &(priv->next_row_reference), FALSE);
+ }
+ modest_ui_actions_check_window_dimming_rules (
MODEST_WINDOW (window));
return;
}
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. */
select_next_valid_row (priv->header_model,
&(priv->next_row_reference), FALSE);
- modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
+ modest_ui_actions_check_window_dimming_rules (MODEST_WINDOW (window));
}
void modest_msg_view_window_on_row_reordered(
GtkTreeIter *arg2,
gpointer arg3,
ModestMsgViewWindow *window){
- modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
+ modest_ui_actions_check_window_dimming_rules (MODEST_WINDOW (window));
}
/* The modest_msg_view_window_update_model_replaced implements update
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));
+ modest_ui_actions_check_window_dimming_rules(MODEST_WINDOW(window));
g_assert(model != NULL);
/* 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);
}
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 ||
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);
TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
&header, -1);
if (header) {
- if (!(tny_header_get_flags(header) & TNY_HEADER_FLAG_DELETED))
+ if (msg_is_visible (header, priv->is_outbox))
is_last_selected = FALSE;
g_object_unref(G_OBJECT(header));
}
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);
TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
&header, -1);
if (header) {
- if (!(tny_header_get_flags(header) & TNY_HEADER_FLAG_DELETED))
+ if (msg_is_visible (header, priv->is_outbox))
is_first_selected = FALSE;
g_object_unref(G_OBJECT(header));
}
*
* If the message was not previously downloaded then ask the user
* before downloading. If there is no connection launch the connection
- * dialog. Update toolbar dimming rules.
+ * dialog. Update window dimming rules.
*
* Returns: TRUE if the mail operation was started, otherwise if the
* user do not want to download the message, or if the user do not
modest_mail_operation_get_msg (mail_op, header, view_msg_cb, row_reference);
g_object_unref (mail_op);
- /* Update toolbar dimming rules */
- modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
+ /* Update window dimming rules */
+ modest_ui_actions_check_window_dimming_rules (MODEST_WINDOW (window));
return TRUE;
}
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
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 (tny_header_get_flags (header) & TNY_HEADER_FLAG_DELETED) {
- 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;
gtk_tree_model_get (priv->header_model, &iter,
TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
&header, -1);
- if (!header)
- break;
- if (tny_header_get_flags (header) & TNY_HEADER_FLAG_DELETED) {
- 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
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);
- 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)
{
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 ();
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);
}
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
}
}
-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);
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));
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);
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;
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_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 != 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;
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));
}
}
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;
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) {
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;
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),
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 {
- 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);
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));
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",
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); */
/* 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);