+
+
+ModestWindow *
+modest_window_mgr_get_current_top (ModestWindowMgr *self)
+{
+ return MODEST_WINDOW_MGR_GET_CLASS (self)->get_current_top (self);
+}
+
+
+static ModestWindow *
+modest_window_mgr_get_current_top_default (ModestWindowMgr *self)
+{
+ g_return_val_if_reached (NULL);
+}
+
+gboolean
+modest_window_mgr_screen_is_on (ModestWindowMgr *self)
+{
+ return MODEST_WINDOW_MGR_GET_CLASS (self)->screen_is_on (self);
+}
+
+static gboolean
+modest_window_mgr_screen_is_on_default (ModestWindowMgr *self)
+{
+ /* Default implementation is assuming screen is always on */
+
+ return TRUE;
+}
+
+void
+modest_window_mgr_create_caches (ModestWindowMgr *mgr)
+{
+ MODEST_WINDOW_MGR_GET_CLASS (mgr)->create_caches (mgr);
+}
+
+static void
+modest_window_mgr_create_caches_default (ModestWindowMgr *self)
+{
+ load_new_editor (self);
+ load_new_view (self);
+}
+
+static gboolean
+tny_list_find (TnyList *list, GObject *item)
+{
+ TnyIterator *iterator;
+ gboolean found = FALSE;
+
+ for (iterator = tny_list_create_iterator (list);
+ !tny_iterator_is_done (iterator) && !found;
+ tny_iterator_next (iterator)) {
+ GObject *current = tny_iterator_get_current (iterator);
+ if (current == item)
+ found = TRUE;
+ g_object_unref (current);
+ }
+ g_object_unref (iterator);
+
+ return found;
+}
+
+static void
+modest_window_mgr_on_queue_changed (ModestMailOperationQueue *queue,
+ ModestMailOperation *mail_op,
+ ModestMailOperationQueueNotification type,
+ ModestWindowMgr *self)
+{
+ ModestWindowMgrPrivate *priv;
+
+ priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
+
+ /* We register to track progress */
+ if (type == MODEST_MAIL_OPERATION_QUEUE_OPERATION_ADDED) {
+ priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,
+ G_OBJECT (mail_op),
+ "operation-started",
+ G_CALLBACK (on_mail_operation_started),
+ self);
+ priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,
+ G_OBJECT (mail_op),
+ "operation-finished",
+ G_CALLBACK (on_mail_operation_finished),
+ self);
+ } else if (type == MODEST_MAIL_OPERATION_QUEUE_OPERATION_REMOVED) {
+ priv->sighandlers = modest_signal_mgr_disconnect (priv->sighandlers,
+ G_OBJECT (mail_op),
+ "operation-started");
+ priv->sighandlers = modest_signal_mgr_disconnect (priv->sighandlers,
+ G_OBJECT (mail_op),
+ "operation-finished");
+ if (tny_list_find (priv->progress_operations, G_OBJECT (mail_op))) {
+ tny_list_remove (priv->progress_operations, G_OBJECT (mail_op));
+ g_signal_emit (self, signals[PROGRESS_LIST_CHANGED_SIGNAL], 0);
+ }
+ }
+}
+
+static void
+on_mail_operation_started (ModestMailOperation *mail_op,
+ gpointer user_data)
+{
+ ModestWindowMgr *self;
+ ModestWindowMgrPrivate *priv;
+ ModestMailOperationTypeOperation op_type;
+
+ self = MODEST_WINDOW_MGR (user_data);
+ priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
+
+ /* First we check if the operation is a send receive operation,
+ * If now, we don't handle this */
+ op_type = modest_mail_operation_get_type_operation (mail_op);
+ if (op_type != MODEST_MAIL_OPERATION_TYPE_SEND &&
+ op_type != MODEST_MAIL_OPERATION_TYPE_SEND_AND_RECEIVE) {
+ return;
+ }
+
+ if (!tny_list_find (priv->progress_operations, G_OBJECT (mail_op))) {
+ tny_list_prepend (priv->progress_operations, G_OBJECT (mail_op));
+ g_signal_emit (self, signals[PROGRESS_LIST_CHANGED_SIGNAL], 0);
+ }
+}
+
+static void
+on_mail_operation_finished (ModestMailOperation *mail_op,
+ gpointer user_data)
+{
+ ModestWindowMgr *self;
+ ModestWindowMgrPrivate *priv;
+
+ self = MODEST_WINDOW_MGR (user_data);
+ priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
+
+ if (tny_list_find (priv->progress_operations, G_OBJECT (mail_op))) {
+ tny_list_remove (priv->progress_operations, G_OBJECT (mail_op));
+ g_signal_emit (self, signals[PROGRESS_LIST_CHANGED_SIGNAL], 0);
+ }
+}
+
+TnyList *
+modest_window_mgr_get_progress_operations (ModestWindowMgr *self)
+{
+ ModestWindowMgrPrivate *priv;
+
+ priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
+
+ return tny_list_copy (priv->progress_operations);
+}
+
+gboolean
+modest_window_mgr_has_progress_operation (ModestWindowMgr *self)
+{
+ ModestWindowMgrPrivate *priv;
+
+ priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
+
+ return tny_list_get_length (priv->progress_operations) > 0;
+}
+
+gboolean
+modest_window_mgr_has_progress_operation_on_account (ModestWindowMgr *self,
+ const gchar *account_name)
+{
+ ModestWindowMgrPrivate *priv;
+ gint account_ops = 0;
+ TnyIterator *iterator;
+
+ priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
+
+ if (account_name == NULL)
+ return 0;
+
+ for (iterator = tny_list_create_iterator (priv->progress_operations);
+ !tny_iterator_is_done (iterator);
+ tny_iterator_next (iterator)) {
+ ModestMailOperation *mail_op;
+ TnyAccount *account;
+
+ mail_op= MODEST_MAIL_OPERATION (tny_iterator_get_current (iterator));
+ account = modest_mail_operation_get_account (mail_op);
+
+ if (account != NULL) {
+ const gchar *current_name;
+
+ current_name = tny_account_get_id (account);
+ if (current_name && strcmp (current_name, account_name) == 0)
+ account_ops ++;
+ g_object_unref (account);
+ }
+
+ g_object_unref (mail_op);
+ }
+ g_object_unref (iterator);
+
+ return account_ops;
+}
+