+ return g_slist_length(priv->observables);
+}
+
+static void
+modest_progress_bar_cancel_current_operation (ModestProgressObject *self)
+{
+ ModestProgressBarWidget *me;
+ ModestProgressBarWidgetPrivate *priv;
+
+ me = MODEST_PROGRESS_BAR_WIDGET (self);
+ priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (me);
+
+ if (priv->current == NULL) return;
+
+ modest_mail_operation_cancel (priv->current);
+}
+
+static void
+modest_progress_bar_cancel_all_operations (ModestProgressObject *self)
+{
+ ModestProgressBarWidget *me;
+ ModestProgressBarWidgetPrivate *priv;
+
+ me = MODEST_PROGRESS_BAR_WIDGET (self);
+ priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (me);
+
+ /* Cancel all the mail operations */
+ modest_mail_operation_queue_cancel_all (modest_runtime_get_mail_operation_queue ());
+}
+
+static void
+on_progress_changed (ModestMailOperation *mail_op,
+ ModestMailOperationState *state,
+ ModestProgressBarWidget *self)
+{
+ ModestProgressBarWidgetPrivate *priv;
+ gboolean determined = FALSE;
+
+ priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (self);
+
+ /* If the mail operation is the currently shown one */
+ if (priv->current == mail_op) {
+ gchar *msg = NULL;
+
+ determined = (state->done > 0 && state->total > 1) &&
+ !(state->done == 1 && state->total == 100);
+
+ switch (state->op_type) {
+ case MODEST_MAIL_OPERATION_TYPE_RECEIVE:
+ if (determined)
+ msg = g_strdup_printf(_("mcen_me_receiving"),
+ state->done, state->total);
+ else
+ msg = g_strdup(_("mail_me_receiving"));
+ break;
+ case MODEST_MAIL_OPERATION_TYPE_SEND:
+ if (determined)
+ msg = g_strdup_printf(_("mcen_me_sending"), state->done,
+ state->total);
+ else
+ msg = g_strdup(_("mail_me_sending"));
+ break;
+
+ case MODEST_MAIL_OPERATION_TYPE_OPEN:
+ msg = g_strdup(_("mail_me_opening"));
+ break;
+ default:
+ msg = g_strdup("");
+ }
+
+ /* If we have byte information use it */
+ if ((state->bytes_done != 0) && (state->bytes_total != 0))
+ modest_progress_bar_widget_set_progress (self, msg,
+ state->bytes_done,
+ state->bytes_total);
+ else if ((state->done == 0) && (state->total == 0))
+ modest_progress_bar_widget_set_pulsating_mode (self, msg, TRUE);
+ else
+ modest_progress_bar_widget_set_progress (self, msg,
+ state->done,
+ state->total);
+ g_free (msg);
+ }
+}
+
+static gboolean
+progressbar_clean (GtkProgressBar *bar)
+{
+ gtk_progress_bar_set_fraction (bar, 0);
+ gtk_progress_bar_set_text (bar, " ");
+ return FALSE;
+}
+