+
+static void
+modest_progress_bar_add_operation (ModestProgressObject *self,
+ ModestMailOperation *mail_op)
+{
+ ModestProgressBarWidget *me;
+ ObservableData *data;
+ ModestProgressBarWidgetPrivate *priv;
+
+ me = MODEST_PROGRESS_BAR_WIDGET (self);
+ priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (me);
+
+ data = g_malloc0 (sizeof (ObservableData));
+ data->mail_op = g_object_ref (mail_op);
+ data->signal_handler = g_signal_connect (data->mail_op,
+ "progress-changed",
+ G_CALLBACK (on_progress_changed),
+ me);
+
+ if (priv->observables == NULL) {
+ priv->current = mail_op;
+ }
+ priv->observables = g_slist_append (priv->observables, data);
+}
+
+static gint
+compare_observable_data (ObservableData *data1, ObservableData *data2)
+{
+ if (data1->mail_op == data2->mail_op)
+ return 0;
+ else
+ return 1;
+}
+
+static void
+modest_progress_bar_remove_operation (ModestProgressObject *self,
+ ModestMailOperation *mail_op)
+{
+ ModestProgressBarWidget *me;
+ ModestProgressBarWidgetPrivate *priv;
+ GSList *link;
+
+ me = MODEST_PROGRESS_BAR_WIDGET (self);
+ priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (me);
+
+ link = g_slist_find_custom (priv->observables,
+ mail_op,
+ (GCompareFunc) compare_observable_data);
+
+ /* Remove the item */
+ if (link) {
+ priv->observables = g_slist_remove_link (priv->observables, link);
+ destroy_observable_data ((ObservableData *) link->data);
+ }
+
+ /* Update the current mail operation */
+ if (priv->current == mail_op) {
+ if (priv->observables)
+ priv->current = ((ObservableData *) priv->observables->data)->mail_op;
+ else
+ priv->current = NULL;
+
+ /* Refresh the view */
+ progressbar_clean (GTK_PROGRESS_BAR (priv->progress_bar));
+ }
+}
+
+static void
+on_progress_changed (ModestMailOperation *mail_op,
+ ModestProgressBarWidget *self)
+{
+ ModestProgressBarWidgetPrivate *priv;
+ gboolean determined = FALSE;
+ guint id = 0;
+
+ 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;
+ gint done = modest_mail_operation_get_task_done (mail_op);
+ gint total = modest_mail_operation_get_task_total (mail_op);
+
+ switch (id) {
+ case STATUS_RECEIVING:
+ if (determined)
+ msg = g_strdup_printf(_("mcen_me_receiving"), done, total);
+ else
+ msg = g_strdup(_("mail_me_receiving"));
+ break;
+ case STATUS_SENDING:
+ if (determined)
+ msg = g_strdup_printf(_("mcen_me_sending"), done, total);
+ else
+ msg = g_strdup(_("mail_me_sending"));
+ break;
+
+ case STATUS_OPENING:
+ msg = g_strdup(_("mail_me_opening"));
+ break;
+ default:
+ g_return_if_reached();
+ }
+
+ modest_progress_bar_widget_set_progress (self, msg, done, total);
+ g_free (msg);
+ }
+}
+
+static gboolean
+progressbar_clean (GtkProgressBar *bar)
+{
+ gtk_progress_bar_set_fraction (bar, 0);
+ gtk_progress_bar_set_text (bar, 0);
+ return FALSE;
+}
+
+