From 0157fe7291bed654b46a5efeff4b9231b6b8a916 Mon Sep 17 00:00:00 2001 From: Sergio Villar Senin Date: Mon, 28 Jan 2008 08:56:02 +0000 Subject: [PATCH] * Removed ModestGnomeInfoBar and ModestProgressBarWidget * Replaced by a common ModestProgressBar * Added progress information to GNOME client * Fixed API change in tinymail pmo-trunk-r4093 --- src/gnome/Makefile.am | 2 - src/gnome/modest-gnome-info-bar.c | 477 ---------------------------- src/gnome/modest-gnome-info-bar.h | 96 ------ src/gnome/modest-main-window.c | 58 ++-- src/maemo/Makefile.am | 2 - src/maemo/modest-main-window.c | 4 +- src/maemo/modest-msg-view-window.c | 4 +- src/maemo/modest-progress-bar-widget.c | 533 -------------------------------- src/maemo/modest-progress-bar-widget.h | 85 ----- src/modest-tny-send-queue.c | 4 +- src/widgets/Makefile.am | 2 + src/widgets/modest-progress-bar.c | 533 ++++++++++++++++++++++++++++++++ src/widgets/modest-progress-bar.h | 255 +++++++++++++++ 13 files changed, 824 insertions(+), 1231 deletions(-) delete mode 100644 src/gnome/modest-gnome-info-bar.c delete mode 100644 src/gnome/modest-gnome-info-bar.h delete mode 100644 src/maemo/modest-progress-bar-widget.c delete mode 100644 src/maemo/modest-progress-bar-widget.h create mode 100644 src/widgets/modest-progress-bar.c create mode 100644 src/widgets/modest-progress-bar.h diff --git a/src/gnome/Makefile.am b/src/gnome/Makefile.am index 1c453ee..b9bf266 100644 --- a/src/gnome/Makefile.am +++ b/src/gnome/Makefile.am @@ -29,8 +29,6 @@ libmodest_ui_la_SOURCES= \ modest-address-book.c \ modest-msg-edit-window.c \ modest-icon-names.h \ - modest-gnome-info-bar.c \ - modest-gnome-info-bar.h \ modest-gnome-global-settings-dialog.c \ modest-gnome-global-settings-dialog.h \ modest-main-window.c \ diff --git a/src/gnome/modest-gnome-info-bar.c b/src/gnome/modest-gnome-info-bar.c deleted file mode 100644 index 36a8776..0000000 --- a/src/gnome/modest-gnome-info-bar.c +++ /dev/null @@ -1,477 +0,0 @@ -/* Copyright (c) 2006, Nokia Corporation - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Nokia Corporation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -#include -#include "modest-gnome-info-bar.h" -#include -#include -/* include other impl specific header files */ - -/* 'private'/'protected' functions */ -static void modest_gnome_info_bar_class_init (ModestGnomeInfoBarClass *klass); -static void modest_gnome_info_bar_init (ModestGnomeInfoBar *obj); -static void modest_gnome_info_bar_finalize (GObject *obj); - -static void modest_gnome_info_bar_add_operation (ModestProgressObject *self, - ModestMailOperation *mail_op); - -static void modest_gnome_info_bar_remove_operation (ModestProgressObject *self, - ModestMailOperation *mail_op); - -static void modest_gnome_info_bar_set_pulsating_mode (ModestGnomeInfoBar *self, - const gchar* msg, - gboolean is_pulsating); - -static void on_progress_changed (ModestMailOperation *mail_op, - ModestMailOperationState *state, - ModestGnomeInfoBar *self); - -static gboolean progressbar_clean (GtkProgressBar *bar); -static gboolean statusbar_clean (GtkStatusbar *bar); - -#define MODEST_GNOME_INFO_BAR_PULSE_INTERVAL 125 - -/* list my signals */ -enum { - /* MY_SIGNAL_1, */ - /* MY_SIGNAL_2, */ - LAST_SIGNAL -}; - -typedef struct _ObservableData ObservableData; -struct _ObservableData { - guint signal_handler; - ModestMailOperation *mail_op; -}; - -typedef struct _ModestGnomeInfoBarPrivate ModestGnomeInfoBarPrivate; -struct _ModestGnomeInfoBarPrivate { - GSList *observables; - ModestMailOperation *current; - - GtkWidget *status_bar; - GtkWidget *progress_bar; - - guint status_bar_timeout; - guint progress_bar_timeout; - guint pulsating_timeout; -}; - -#define MODEST_GNOME_INFO_BAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ - MODEST_TYPE_GNOME_INFO_BAR, \ - ModestGnomeInfoBarPrivate)) -/* globals */ -static GtkHBoxClass *parent_class = NULL; - -/* uncomment the following if you have defined any signals */ -/* static guint signals[LAST_SIGNAL] = {0}; */ - -static void -modest_progress_object_init (gpointer g, gpointer iface_data) -{ - ModestProgressObjectIface *klass = (ModestProgressObjectIface *)g; - - klass->add_operation_func = modest_gnome_info_bar_add_operation; - klass->remove_operation_func = modest_gnome_info_bar_remove_operation; -} - -GType -modest_gnome_info_bar_get_type (void) -{ - static GType my_type = 0; - if (!my_type) { - static const GTypeInfo my_info = { - sizeof(ModestGnomeInfoBarClass), - NULL, /* base init */ - NULL, /* base finalize */ - (GClassInitFunc) modest_gnome_info_bar_class_init, - NULL, /* class finalize */ - NULL, /* class data */ - sizeof(ModestGnomeInfoBar), - 1, /* n_preallocs */ - (GInstanceInitFunc) modest_gnome_info_bar_init, - NULL - }; - - static const GInterfaceInfo modest_progress_object_info = - { - (GInterfaceInitFunc) modest_progress_object_init, /* interface_init */ - NULL, /* interface_finalize */ - NULL /* interface_data */ - }; - - my_type = g_type_register_static (GTK_TYPE_HBOX, - "ModestGnomeInfoBar", - &my_info, 0); - - g_type_add_interface_static (my_type, MODEST_TYPE_PROGRESS_OBJECT, - &modest_progress_object_info); - } - return my_type; -} - -static void -modest_gnome_info_bar_class_init (ModestGnomeInfoBarClass *klass) -{ - GObjectClass *gobject_class; - gobject_class = (GObjectClass*) klass; - - parent_class = g_type_class_peek_parent (klass); - gobject_class->finalize = modest_gnome_info_bar_finalize; - - g_type_class_add_private (gobject_class, sizeof(ModestGnomeInfoBarPrivate)); -} - -static void -modest_gnome_info_bar_init (ModestGnomeInfoBar *obj) -{ - ModestGnomeInfoBarPrivate *priv = MODEST_GNOME_INFO_BAR_GET_PRIVATE(obj); - - priv->observables = NULL; - priv->current = NULL; - - /* Status bar */ - priv->status_bar = gtk_statusbar_new (); - gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (priv->status_bar), FALSE); - - /* Progress bar */ - priv->progress_bar = gtk_progress_bar_new (); - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (priv->progress_bar), 1.0); - gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (priv->progress_bar), - PANGO_ELLIPSIZE_END); - - /* Timeouts */ - priv->status_bar_timeout = 0; - priv->progress_bar_timeout = 0; - - /* Pack */ - gtk_box_pack_start (GTK_BOX (obj), priv->status_bar, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (obj), priv->progress_bar, FALSE, FALSE, 0); -} - -static void -destroy_observable_data (ObservableData *data) -{ - g_signal_handler_disconnect (data->mail_op, data->signal_handler); - g_object_unref (data->mail_op); -} - -static void -modest_gnome_info_bar_finalize (GObject *obj) -{ - ModestGnomeInfoBarPrivate *priv; - - priv = MODEST_GNOME_INFO_BAR_GET_PRIVATE(obj); - if (priv->observables) { - GSList *tmp; - - for (tmp = priv->observables; tmp; tmp = g_slist_next (tmp)) { - destroy_observable_data ((ObservableData *) tmp->data); - g_free (tmp->data); - } - g_slist_free (priv->observables); - priv->observables = NULL; - } - - if (priv->status_bar_timeout > 0) { - g_source_remove (priv->status_bar_timeout); - priv->status_bar_timeout = 0; - } - - if (priv->progress_bar_timeout > 0) { - g_source_remove (priv->progress_bar_timeout); - priv->progress_bar_timeout = 0; - } - - G_OBJECT_CLASS(parent_class)->finalize (obj); -} - -GtkWidget * -modest_gnome_info_bar_new (void) -{ - return GTK_WIDGET (g_object_new (MODEST_TYPE_GNOME_INFO_BAR, NULL)); -} - -static void -modest_gnome_info_bar_add_operation (ModestProgressObject *self, - ModestMailOperation *mail_op) -{ - ModestGnomeInfoBar *me; - ObservableData *data; - ModestGnomeInfoBarPrivate *priv; - - me = MODEST_GNOME_INFO_BAR (self); - priv = MODEST_GNOME_INFO_BAR_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_gnome_info_bar_remove_operation (ModestProgressObject *self, - ModestMailOperation *mail_op) -{ - ModestGnomeInfoBar *me; - ModestGnomeInfoBarPrivate *priv; - GSList *link; - ObservableData *tmp_data = NULL; - gboolean is_current; - - me = MODEST_GNOME_INFO_BAR (self); - priv = MODEST_GNOME_INFO_BAR_GET_PRIVATE (me); - - is_current = (priv->current == mail_op); - - /* Find item */ - tmp_data = g_malloc0 (sizeof (ObservableData)); - tmp_data->mail_op = mail_op; - link = g_slist_find_custom (priv->observables, - tmp_data, - (GCompareFunc) compare_observable_data); - - /* Remove the item */ - if (link) { - ObservableData *ob_data = link->data; - g_signal_handler_disconnect (ob_data->mail_op, ob_data->signal_handler); - g_object_unref (ob_data->mail_op); - g_free (ob_data); - priv->observables = g_slist_delete_link (priv->observables, link); - tmp_data->mail_op = NULL; - link = NULL; - } - - /* Update the current mail operation */ - if (is_current) { - if (priv->observables) - priv->current = ((ObservableData *) priv->observables->data)->mail_op; - else - priv->current = NULL; - - /* Refresh the view */ - modest_gnome_info_bar_set_pulsating_mode (me, NULL, FALSE); - progressbar_clean (GTK_PROGRESS_BAR (priv->progress_bar)); - } - - /* free */ - g_free(tmp_data); -} - -static void -on_progress_changed (ModestMailOperation *mail_op, - ModestMailOperationState *state, - ModestGnomeInfoBar *self) -{ - ModestGnomeInfoBarPrivate *priv; - gboolean determined = FALSE; - - priv = MODEST_GNOME_INFO_BAR_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_gnome_info_bar_set_progress (self, msg, - state->bytes_done, - state->bytes_total); - else if ((state->done == 0) && (state->total == 0)) - modest_gnome_info_bar_set_pulsating_mode (self, msg, TRUE); - else - modest_gnome_info_bar_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, 0); - return FALSE; -} - -static gboolean -statusbar_clean (GtkStatusbar *bar) -{ - gtk_statusbar_push (bar, 0, ""); - return FALSE; -} - -void -modest_gnome_info_bar_set_message (ModestGnomeInfoBar *self, - const gchar *message) -{ - ModestGnomeInfoBarPrivate *priv; - - priv = MODEST_GNOME_INFO_BAR_GET_PRIVATE (self); - - /* Set a message. Clean it after 2.5 seconds */ - gtk_statusbar_push (GTK_STATUSBAR (priv->status_bar), 0, message); - priv->status_bar_timeout = g_timeout_add (2500, - (GSourceFunc) statusbar_clean, - priv->status_bar); -} - -static gboolean -modest_gnome_info_bar_is_pulsating (ModestGnomeInfoBar *self) -{ - ModestGnomeInfoBarPrivate *priv; - - g_return_val_if_fail (MODEST_IS_GNOME_INFO_BAR(self), FALSE); - - priv = MODEST_GNOME_INFO_BAR_GET_PRIVATE (self); - - return priv->pulsating_timeout != 0; -} - -void -modest_gnome_info_bar_set_progress (ModestGnomeInfoBar *self, - const gchar *message, - gint done, - gint total) -{ - ModestGnomeInfoBarPrivate *priv; - gboolean determined = FALSE; - - g_return_if_fail (MODEST_IS_GNOME_INFO_BAR(self)); - g_return_if_fail (done <= total); - - priv = MODEST_GNOME_INFO_BAR_GET_PRIVATE (self); - - if (modest_gnome_info_bar_is_pulsating (self)) - modest_gnome_info_bar_set_pulsating_mode (self, NULL, FALSE); - - /* Set progress. Tinymail sometimes returns us 1/100 when it - does not have any clue, NOTE that 1/100 could be also a - valid progress (we will loose it), but it will be recovered - once the done is greater than 1 */ - determined = (done > 0 && total > 1) && - !(done == 1 && total == 100); - if (!determined) { - gtk_progress_bar_pulse (GTK_PROGRESS_BAR (priv->progress_bar)); - } else { - gdouble percent = 0; - if (total != 0) /* Avoid division by zero. */ - percent = (gdouble)done/(gdouble)total; - - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (priv->progress_bar), - percent); - } - - /* Set text */ - gtk_progress_bar_set_text (GTK_PROGRESS_BAR (priv->progress_bar), - (message && message[0] != '\0')?message:" "); -} - -static gboolean -do_pulse (gpointer data) -{ - ModestGnomeInfoBarPrivate *priv; - - g_return_val_if_fail (MODEST_IS_GNOME_INFO_BAR(data), FALSE); - - priv = MODEST_GNOME_INFO_BAR_GET_PRIVATE (data); - gtk_progress_bar_pulse (GTK_PROGRESS_BAR (priv->progress_bar)); - return TRUE; -} - -static void -modest_gnome_info_bar_set_pulsating_mode (ModestGnomeInfoBar *self, - const gchar* msg, - gboolean is_pulsating) -{ - ModestGnomeInfoBarPrivate *priv; - - g_return_if_fail (MODEST_IS_GNOME_INFO_BAR (self)); - - priv = MODEST_GNOME_INFO_BAR_GET_PRIVATE (self); - - if (msg != NULL) - gtk_progress_bar_set_text (GTK_PROGRESS_BAR (priv->progress_bar), msg); - - if (is_pulsating == (priv->pulsating_timeout != 0)) - return; - else if (is_pulsating && (priv->pulsating_timeout == 0)) { - /* enable */ - priv->pulsating_timeout = g_timeout_add (MODEST_GNOME_INFO_BAR_PULSE_INTERVAL, - do_pulse, self); - } else if (!is_pulsating && (priv->pulsating_timeout != 0)) { - /* disable */ - g_source_remove (priv->pulsating_timeout); - priv->pulsating_timeout = 0; - } -} diff --git a/src/gnome/modest-gnome-info-bar.h b/src/gnome/modest-gnome-info-bar.h deleted file mode 100644 index 195d5a5..0000000 --- a/src/gnome/modest-gnome-info-bar.h +++ /dev/null @@ -1,96 +0,0 @@ -/* Copyright (c) 2006, Nokia Corporation - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Nokia Corporation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -#ifndef __MODEST_GNOME_INFO_BAR_H__ -#define __MODEST_GNOME_INFO_BAR_H__ - -#include -#include "modest-progress-object.h" -/* other include files */ - -G_BEGIN_DECLS - -/* convenience macros */ -#define MODEST_TYPE_GNOME_INFO_BAR (modest_gnome_info_bar_get_type()) -#define MODEST_GNOME_INFO_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),MODEST_TYPE_GNOME_INFO_BAR,ModestGnomeInfoBar)) -#define MODEST_GNOME_INFO_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),MODEST_TYPE_GNOME_INFO_BAR,ModestProgressObject)) -#define MODEST_IS_GNOME_INFO_BAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),MODEST_TYPE_GNOME_INFO_BAR)) -#define MODEST_IS_GNOME_INFO_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),MODEST_TYPE_GNOME_INFO_BAR)) -#define MODEST_GNOME_INFO_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),MODEST_TYPE_GNOME_INFO_BAR,ModestGnomeInfoBarClass)) - -typedef struct _ModestGnomeInfoBar ModestGnomeInfoBar; -typedef struct _ModestGnomeInfoBarClass ModestGnomeInfoBarClass; - -struct _ModestGnomeInfoBar { - GtkHBox parent; -}; - -struct _ModestGnomeInfoBarClass { - GtkHBoxClass parent_class; -}; - -/* member functions */ -GType modest_gnome_info_bar_get_type (void) G_GNUC_CONST; - -/* typical parameter-less _new function */ -GtkWidget* modest_gnome_info_bar_new (void); - -/** - * modest_gnome_info_bar_new: - * @void: - * - * Sets a text in the status bar of the widget - * - * Return value: - **/ -void modest_gnome_info_bar_set_message (ModestGnomeInfoBar *self, - const gchar *message); - - -/** - * modest_gnome_info_bar_set_progress: - * @self: - * @message: - * @done: - * @total: - * - * Causes the progress bar of the widget to fill in the amount of work - * done of a given total. If message is supplied then it'll be - * superimposed on the progress bar - **/ -void modest_gnome_info_bar_set_progress (ModestGnomeInfoBar *self, - const gchar *message, - gint done, - gint total); - -G_END_DECLS - -#endif /* __MODEST_GNOME_INFO_BAR_H__ */ - diff --git a/src/gnome/modest-main-window.c b/src/gnome/modest-main-window.c index 6bbbfe4..8217bad 100644 --- a/src/gnome/modest-main-window.c +++ b/src/gnome/modest-main-window.c @@ -37,6 +37,7 @@ #include #include #include +#include "widgets/modest-progress-bar.h" #include #include "modest-widget-memory.h" @@ -47,7 +48,6 @@ #include #include "modest-mail-operation.h" #include "modest-icon-names.h" -#include "modest-gnome-info-bar.h" /* 'private'/'protected' functions */ static void modest_main_window_class_init (ModestMainWindowClass *klass); @@ -76,12 +76,6 @@ static void on_queue_changed (ModestMailOperationQue ModestMailOperationQueueNotification type, ModestMainWindow *self); -static void on_header_status_update (ModestHeaderView *header_view, - const gchar *msg, - gint num, - gint total, - ModestMainWindow *main_window); - static void on_header_selected (ModestHeaderView *header_view, TnyHeader *header, ModestMainWindow *main_window); @@ -165,6 +159,29 @@ modest_main_window_class_init (ModestMainWindowClass *klass) g_type_class_add_private (gobject_class, sizeof(ModestMainWindowPrivate)); } +static GtkWidget * +create_main_bar (GtkWidget *progress_bar) +{ + GtkWidget *status_bar, *main_bar; + + main_bar = gtk_hbox_new (FALSE, 6); + + /* Status bar */ + status_bar = gtk_statusbar_new (); + gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (status_bar), FALSE); + + /* Progress bar */ + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress_bar), 1.0); + gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (progress_bar), + PANGO_ELLIPSIZE_END); + + /* Pack */ + gtk_box_pack_start (GTK_BOX (main_bar), status_bar, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (main_bar), progress_bar, FALSE, FALSE, 0); + + return main_bar; +} + static void modest_main_window_init (ModestMainWindow *obj) { @@ -173,6 +190,7 @@ modest_main_window_init (ModestMainWindow *obj) TnyFolderStoreQuery *query; GtkWidget *icon; gboolean online; + GtkWidget *progress_bar; priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj); @@ -198,9 +216,10 @@ modest_main_window_init (ModestMainWindow *obj) /* Main bar */ priv->folder_info_label = gtk_label_new (NULL); - priv->main_bar = modest_gnome_info_bar_new (); + progress_bar = modest_progress_bar_new (); + priv->main_bar = create_main_bar (progress_bar); priv->progress_widgets = g_slist_prepend (priv->progress_widgets, - priv->main_bar); + progress_bar); /* msg preview */ priv->msg_preview = MODEST_MSG_VIEW(tny_platform_factory_new_msg_view @@ -611,27 +630,6 @@ on_queue_changed (ModestMailOperationQueue *queue, } } -static void -on_header_status_update (ModestHeaderView *header_view, - const gchar *msg, gint num, - gint total, ModestMainWindow *self) -{ - ModestMainWindowPrivate *priv; - gchar *txt; - - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - - /* Set progress */ - txt = g_strdup_printf (_("Downloading %d of %d"), num, total); - modest_gnome_info_bar_set_progress (MODEST_GNOME_INFO_BAR (priv->main_bar), - (const gchar*) txt, - num, total); - g_free (txt); - - /* Set status message */ - modest_gnome_info_bar_set_message (MODEST_GNOME_INFO_BAR (priv->main_bar), msg); -} - void modest_main_window_set_style (ModestMainWindow *self, ModestMainWindowStyle style) diff --git a/src/maemo/Makefile.am b/src/maemo/Makefile.am index e8b4e2b..9e4a488 100644 --- a/src/maemo/Makefile.am +++ b/src/maemo/Makefile.am @@ -70,8 +70,6 @@ libmodest_ui_la_SOURCES= \ modest-connection-specific-smtp-window.c \ modest-connection-specific-smtp-edit-window.h \ modest-connection-specific-smtp-edit-window.c \ - modest-progress-bar-widget.c \ - modest-progress-bar-widget.h \ modest-osso-autosave-callbacks.c \ modest-osso-autosave-callbacks.h \ modest-osso-state-saving.c \ diff --git a/src/maemo/modest-main-window.c b/src/maemo/modest-main-window.c index 80abed1..7f99b19 100644 --- a/src/maemo/modest-main-window.c +++ b/src/maemo/modest-main-window.c @@ -59,7 +59,7 @@ #include "modest-tny-msg.h" #include "modest-mail-operation.h" #include "modest-icon-names.h" -#include "modest-progress-bar-widget.h" +#include "modest-progress-bar.h" #include "modest-text-utils.h" #include "modest-ui-dimming-manager.h" #include "maemo/modest-osso-state-saving.h" @@ -1491,7 +1491,7 @@ modest_main_window_show_toolbar (ModestWindow *self, toolbar_resize (MODEST_MAIN_WINDOW (self)); /* Add ProgressBar (Transfer toolbar) */ - priv->progress_bar = modest_progress_bar_widget_new (); + priv->progress_bar = modest_progress_bar_new (); gtk_widget_set_no_show_all (priv->progress_bar, TRUE); placeholder = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ProgressBarView"); insert_index = gtk_toolbar_get_item_index(GTK_TOOLBAR (parent_priv->toolbar), GTK_TOOL_ITEM(placeholder)); diff --git a/src/maemo/modest-msg-view-window.c b/src/maemo/modest-msg-view-window.c index 8c6d40f..08c65d5 100644 --- a/src/maemo/modest-msg-view-window.c +++ b/src/maemo/modest-msg-view-window.c @@ -47,7 +47,7 @@ #include #include #include -#include "modest-progress-bar-widget.h" +#include "modest-progress-bar.h" #include "modest-defs.h" #include "modest-hildon-includes.h" #include "modest-ui-dimming-manager.h" @@ -2012,7 +2012,7 @@ modest_msg_view_window_show_toolbar (ModestWindow *self, toolbar_resize (MODEST_MSG_VIEW_WINDOW (self)); /* Add ProgressBar (Transfer toolbar) */ - priv->progress_bar = modest_progress_bar_widget_new (); + priv->progress_bar = modest_progress_bar_new (); gtk_widget_set_no_show_all (priv->progress_bar, TRUE); placeholder = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ProgressbarView"); insert_index = gtk_toolbar_get_item_index(GTK_TOOLBAR (parent_priv->toolbar), GTK_TOOL_ITEM(placeholder)); diff --git a/src/maemo/modest-progress-bar-widget.c b/src/maemo/modest-progress-bar-widget.c deleted file mode 100644 index 8ab228d..0000000 --- a/src/maemo/modest-progress-bar-widget.c +++ /dev/null @@ -1,533 +0,0 @@ -/* Copyright (c) 2006, Nokia Corporation - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Nokia Corporation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include "modest-progress-bar-widget.h" -#include "modest-tny-account.h" -#include "modest-platform.h" -#include "modest-runtime.h" - -/* 'private'/'protected' functions */ -static void modest_progress_bar_widget_class_init (ModestProgressBarWidgetClass *klass); -static void modest_progress_bar_widget_init (ModestProgressBarWidget *obj); -static void modest_progress_bar_widget_finalize (GObject *obj); - -static void modest_progress_bar_add_operation (ModestProgressObject *self, - ModestMailOperation *mail_op); - -static void modest_progress_bar_remove_operation (ModestProgressObject *self, - ModestMailOperation *mail_op); - -static void modest_progress_bar_cancel_current_operation (ModestProgressObject *self); - -static void modest_progress_bar_cancel_all_operations (ModestProgressObject *self); - -static guint modest_progress_bar_num_pending_operations (ModestProgressObject *self); - -static void on_progress_changed (ModestMailOperation *mail_op, - ModestMailOperationState *state, - ModestProgressBarWidget *self); - -static gboolean progressbar_clean (GtkProgressBar *bar); - -static gboolean modest_progress_bar_widget_is_pulsating (ModestProgressBarWidget *self); - -static void modest_progress_bar_widget_set_pulsating_mode (ModestProgressBarWidget *self, - const gchar* msg, - gboolean is_pulsating); - -#define XALIGN 0.5 -#define YALIGN 0.5 -#define XSPACE 1 -#define YSPACE 0 - -#define LOWER 0 -#define UPPER 150 - -#define MODEST_PROGRESS_BAR_PULSE_INTERVAL 125 - -/* list my signals */ -/* enum { */ -/* LAST_SIGNAL */ -/* }; */ - -typedef struct _ObservableData ObservableData; -struct _ObservableData { - guint signal_handler; - ModestMailOperation *mail_op; -}; - -typedef struct _ModestProgressBarWidgetPrivate ModestProgressBarWidgetPrivate; -struct _ModestProgressBarWidgetPrivate { - GSList *observables; - ModestMailOperation *current; - guint count; - GtkWidget *progress_bar; - guint pulsating_timeout; -}; -#define MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ - MODEST_TYPE_PROGRESS_BAR_WIDGET, \ - ModestProgressBarWidgetPrivate)) - -/* globals */ -static GtkContainerClass *parent_class = NULL; - -/* uncomment the following if you have defined any signals */ -/* static guint signals[LAST_SIGNAL] = {0}; */ - -static void -modest_progress_object_init (gpointer g, gpointer iface_data) -{ - ModestProgressObjectIface *klass = (ModestProgressObjectIface *)g; - - klass->add_operation_func = modest_progress_bar_add_operation; - klass->remove_operation_func = modest_progress_bar_remove_operation; - klass->cancel_current_operation_func = modest_progress_bar_cancel_current_operation; - klass->cancel_all_operations_func = modest_progress_bar_cancel_all_operations; - klass->num_pending_operations_func = modest_progress_bar_num_pending_operations; -} - - -GType -modest_progress_bar_widget_get_type (void) -{ - static GType my_type = 0; - if (!my_type) { - static const GTypeInfo my_info = { - sizeof(ModestProgressBarWidgetClass), - NULL, /* base init */ - NULL, /* base finalize */ - (GClassInitFunc) modest_progress_bar_widget_class_init, - NULL, /* class finalize */ - NULL, /* class data */ - sizeof(ModestProgressBarWidget), - 1, /* n_preallocs */ - (GInstanceInitFunc) modest_progress_bar_widget_init, - NULL - }; - - static const GInterfaceInfo modest_progress_object_info = - { - (GInterfaceInitFunc) modest_progress_object_init, /* interface_init */ - NULL, /* interface_finalize */ - NULL /* interface_data */ - }; - - my_type = g_type_register_static (GTK_TYPE_VBOX, - "ModestProgressBarWidget", - &my_info, 0); - - g_type_add_interface_static (my_type, MODEST_TYPE_PROGRESS_OBJECT, - &modest_progress_object_info); - } - return my_type; -} - -static void -modest_progress_bar_widget_class_init (ModestProgressBarWidgetClass *klass) -{ - GObjectClass *gobject_class; - gobject_class = (GObjectClass*) klass; - - parent_class = g_type_class_peek_parent (klass); - gobject_class->finalize = modest_progress_bar_widget_finalize; - - g_type_class_add_private (gobject_class, sizeof(ModestProgressBarWidgetPrivate)); -} - -static void -modest_progress_bar_widget_init (ModestProgressBarWidget *self) -{ - - ModestProgressBarWidgetPrivate *priv; - GtkWidget *align = NULL; - GtkRequisition req; - GtkAdjustment *adj; - - priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE(self); - - /* Alignment */ - align = gtk_alignment_new(XALIGN, YALIGN, XSPACE, YSPACE); - - /* Build GtkProgressBar */ - adj = (GtkAdjustment *) gtk_adjustment_new (0, LOWER, UPPER, 0, 0, 0); - priv->progress_bar = gtk_progress_bar_new_with_adjustment (adj); - req.width = 228; - req.height = 64; - gtk_progress_set_text_alignment (GTK_PROGRESS (priv->progress_bar), 0, 0.5); - gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (priv->progress_bar), PANGO_ELLIPSIZE_END); - gtk_progress_bar_set_pulse_step (GTK_PROGRESS_BAR (priv->progress_bar), 0.25); - gtk_progress_bar_set_text (GTK_PROGRESS_BAR (priv->progress_bar), " "); - gtk_widget_size_request (priv->progress_bar, &req); - gtk_container_add (GTK_CONTAINER (align), priv->progress_bar); - gtk_widget_size_request (align, &req); - - /* Add progress bar widget */ - gtk_box_pack_start (GTK_BOX(self), align, TRUE, TRUE, 0); - gtk_widget_show_all (GTK_WIDGET(self)); - - priv->pulsating_timeout = 0; -} - -static void -modest_progress_bar_widget_finalize (GObject *obj) -{ - ModestProgressBarWidgetPrivate *priv; - - priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE(obj); - if (priv->observables) { - GSList *tmp; - - for (tmp = priv->observables; tmp; tmp = g_slist_next (tmp)) { - ObservableData *ob_data = tmp->data; - g_signal_handler_disconnect (ob_data->mail_op, ob_data->signal_handler); - g_object_unref (ob_data->mail_op); - g_free (ob_data); - } - g_slist_free (priv->observables); - priv->observables = NULL; - } - - /* remove timeout */ - if (priv->pulsating_timeout != 0) - g_source_remove (priv->pulsating_timeout); - - G_OBJECT_CLASS(parent_class)->finalize (obj); -} - - -static void -modest_progress_bar_add_operation (ModestProgressObject *self, - ModestMailOperation *mail_op) -{ - ModestProgressBarWidget *me = NULL; - ObservableData *data = NULL; - ModestProgressBarWidgetPrivate *priv = NULL; - - 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); - /* Set curent operation */ - if (priv->current == NULL) { - priv->current = mail_op; - - priv->count = 0; - - /* Call progress_change handler to initialize progress message */ -/* modest_progress_bar_widget_set_undetermined_progress (MODEST_PROGRESS_BAR_WIDGET(self), mail_op); */ - } - - /* Add operation to obserbable objects list */ - priv->observables = g_slist_prepend (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; - ObservableData *tmp_data = NULL; - gboolean is_current; - - me = MODEST_PROGRESS_BAR_WIDGET (self); - priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (me); - - is_current = (priv->current == mail_op); - - /* Find item */ - tmp_data = g_malloc0 (sizeof (ObservableData)); - tmp_data->mail_op = mail_op; - link = g_slist_find_custom (priv->observables, - tmp_data, - (GCompareFunc) compare_observable_data); - - /* Remove the item */ - if (link) { - ObservableData *ob_data = link->data; - g_signal_handler_disconnect (ob_data->mail_op, ob_data->signal_handler); - g_object_unref (ob_data->mail_op); - g_free (ob_data); - priv->observables = g_slist_delete_link (priv->observables, link); - tmp_data->mail_op = NULL; - link = NULL; - } - - /* Update the current mail operation */ - if (is_current) { - if (priv->observables) - priv->current = ((ObservableData *) priv->observables->data)->mail_op; - else - priv->current = NULL; - - /* Refresh the view */ - modest_progress_bar_widget_set_pulsating_mode (me, NULL, FALSE); - progressbar_clean (GTK_PROGRESS_BAR (priv->progress_bar)); - } - - /* free */ - g_free(tmp_data); -} - -static guint -modest_progress_bar_num_pending_operations (ModestProgressObject *self) -{ - ModestProgressBarWidget *me; - ModestProgressBarWidgetPrivate *priv; - - me = MODEST_PROGRESS_BAR_WIDGET (self); - priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (me); - - 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; -} - - -GtkWidget* -modest_progress_bar_widget_new () -{ - return GTK_WIDGET (g_object_new (MODEST_TYPE_PROGRESS_BAR_WIDGET, NULL)); -} - - -void -modest_progress_bar_widget_set_progress (ModestProgressBarWidget *self, - const gchar *message, - gint done, - gint total) -{ - ModestProgressBarWidgetPrivate *priv; - gboolean determined = FALSE; - - g_return_if_fail (MODEST_IS_PROGRESS_BAR_WIDGET(self)); - g_return_if_fail (done <= total); - - priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (self); - - priv->count++; - - if (modest_progress_bar_widget_is_pulsating (self)) - modest_progress_bar_widget_set_pulsating_mode (self, NULL, FALSE); - - /* Set progress. Tinymail sometimes returns us 1/100 when it - does not have any clue, NOTE that 1/100 could be also a - valid progress (we will loose it), but it will be recovered - once the done is greater than 1 */ - determined = (done > 0 && total > 1) && - !(done == 1 && total == 100); - if (!determined) { - gtk_progress_bar_pulse (GTK_PROGRESS_BAR (priv->progress_bar)); - } else { - gdouble percent = 0; - if (total != 0) /* Avoid division by zero. */ - percent = (gdouble)done/(gdouble)total; - - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (priv->progress_bar), - percent); - } - - /* Set text */ - gtk_progress_bar_set_text (GTK_PROGRESS_BAR (priv->progress_bar), - (message && message[0] != '\0')?message:" "); -} - - -void -modest_progress_bar_widget_set_undetermined_progress (ModestProgressBarWidget *self, - ModestMailOperation *mail_op) -{ - ModestMailOperationState *state = NULL; - - state = g_malloc0(sizeof(ModestMailOperationState)); - state->done = 0; - state->total = 0; - state->op_type = modest_mail_operation_get_type_operation (mail_op); - on_progress_changed (mail_op, state, self); - g_free(state); -} - -/* this has to be explicitly removed */ -static gboolean -do_pulse (gpointer data) -{ - ModestProgressBarWidgetPrivate *priv; - - g_return_val_if_fail (MODEST_IS_PROGRESS_BAR_WIDGET(data), FALSE); - - priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (data); - gtk_progress_bar_pulse (GTK_PROGRESS_BAR (priv->progress_bar)); - return TRUE; -} - -gboolean -modest_progress_bar_widget_is_pulsating (ModestProgressBarWidget *self) -{ - ModestProgressBarWidgetPrivate *priv; - - g_return_val_if_fail (MODEST_IS_PROGRESS_BAR_WIDGET(self), FALSE); - - priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (self); - - return priv->pulsating_timeout != 0; -} - -void -modest_progress_bar_widget_set_pulsating_mode (ModestProgressBarWidget *self, - const gchar* msg, - gboolean is_pulsating) -{ - ModestProgressBarWidgetPrivate *priv; - - g_return_if_fail (MODEST_IS_PROGRESS_BAR_WIDGET(self)); - - priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (self); - - if (msg != NULL) - gtk_progress_bar_set_text (GTK_PROGRESS_BAR (priv->progress_bar), msg); - - if (is_pulsating == (priv->pulsating_timeout != 0)) - return; - else if (is_pulsating && (priv->pulsating_timeout == 0)) { - /* enable */ - priv->pulsating_timeout = g_timeout_add (MODEST_PROGRESS_BAR_PULSE_INTERVAL, - do_pulse, self); - } else if (!is_pulsating && (priv->pulsating_timeout != 0)) { - /* disable */ - g_source_remove (priv->pulsating_timeout); - priv->pulsating_timeout = 0; - } -} diff --git a/src/maemo/modest-progress-bar-widget.h b/src/maemo/modest-progress-bar-widget.h deleted file mode 100644 index 24b4d44..0000000 --- a/src/maemo/modest-progress-bar-widget.h +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (c) 2006, Nokia Corporation - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Nokia Corporation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __MODEST_PROGRESS_BAR_WIDGET_H__ -#define __MODEST_PROGRESS_BAR_WIDGET_H__ - -#include -#include "modest-progress-object.h" - -G_BEGIN_DECLS - -/* convenience macros */ -#define MODEST_TYPE_PROGRESS_BAR_WIDGET (modest_progress_bar_widget_get_type()) -#define MODEST_PROGRESS_BAR_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),MODEST_TYPE_PROGRESS_BAR_WIDGET,ModestProgressBarWidget)) -#define MODEST_PROGRESS_BAR_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),MODEST_TYPE_PROGRESS_BAR_WIDGET,GtkContainer)) -#define MODEST_IS_PROGRESS_BAR_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),MODEST_TYPE_PROGRESS_BAR_WIDGET)) -#define MODEST_IS_PROGRESS_BAR_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),MODEST_TYPE_PROGRESS_BAR_WIDGET)) -#define MODEST_PROGRESS_BAR_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),MODEST_TYPE_PROGRESS_BAR_WIDGET,ModestProgressBarWidgetClass)) - -typedef struct _ModestProgressBarWidget ModestProgressBarWidget; -typedef struct _ModestProgressBarWidgetClass ModestProgressBarWidgetClass; - -struct _ModestProgressBarWidget { - GtkVBox parent; - /* insert public members, if any */ -}; - -struct _ModestProgressBarWidgetClass { - GtkVBoxClass parent_class; - -}; - -typedef enum { - STATUS_RECEIVING, - STATUS_SENDING, - STATUS_OPENING -} ModestProgressStatus; - - - -/* member functions */ -GType modest_progress_bar_widget_get_type (void) G_GNUC_CONST; - -GtkWidget* modest_progress_bar_widget_new (void); - -void modest_progress_bar_widget_set_progress (ModestProgressBarWidget *self, - const gchar *msg, - gint done, - gint total); - -void -modest_progress_bar_widget_set_undetermined_progress (ModestProgressBarWidget *self, - ModestMailOperation *mail_op); - - -G_END_DECLS - -#endif /* __MODEST_PROGRESS_BAR_WIDGET_H__ */ - diff --git a/src/modest-tny-send-queue.c b/src/modest-tny-send-queue.c index b1f8560..bf79501 100644 --- a/src/modest-tny-send-queue.c +++ b/src/modest-tny-send-queue.c @@ -73,7 +73,7 @@ static void _on_msg_error_happened (TnySendQueue *self, static void _on_queue_start (TnySendQueue *self, gpointer user_data); -static void modest_tny_send_queue_add_async (TnyCamelSendQueue *self, +static void modest_tny_send_queue_add_async (TnySendQueue *self, TnyMsg *msg, TnySendQueueAddCallback callback, TnyStatusCallback status_callback, @@ -275,7 +275,7 @@ _add_message (ModestTnySendQueue *self, TnyHeader *header) } static void -modest_tny_send_queue_add_async (TnyCamelSendQueue *self, +modest_tny_send_queue_add_async (TnySendQueue *self, TnyMsg *msg, TnySendQueueAddCallback callback, TnyStatusCallback status_callback, diff --git a/src/widgets/Makefile.am b/src/widgets/Makefile.am index 4d648b5..225375d 100644 --- a/src/widgets/Makefile.am +++ b/src/widgets/Makefile.am @@ -63,6 +63,8 @@ libmodest_widgets_la_SOURCES= \ modest-gtkhtml-msg-view.h \ modest-details-dialog.c \ modest-details-dialog.h \ + modest-progress-bar.c \ + modest-progress-bar.h \ modest-recpt-editor.c \ modest-recpt-editor.h \ modest-recpt-view.c \ diff --git a/src/widgets/modest-progress-bar.c b/src/widgets/modest-progress-bar.c new file mode 100644 index 0000000..615e154 --- /dev/null +++ b/src/widgets/modest-progress-bar.c @@ -0,0 +1,533 @@ +/* Copyright (c) 2006, Nokia Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Nokia Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include "widgets/modest-progress-bar.h" +#include "modest-tny-account.h" +#include "modest-platform.h" +#include "modest-runtime.h" + +/* 'private'/'protected' functions */ +static void modest_progress_bar_class_init (ModestProgressBarClass *klass); +static void modest_progress_bar_init (ModestProgressBar *obj); +static void modest_progress_bar_finalize (GObject *obj); + +static void modest_progress_bar_add_operation (ModestProgressObject *self, + ModestMailOperation *mail_op); + +static void modest_progress_bar_remove_operation (ModestProgressObject *self, + ModestMailOperation *mail_op); + +static void modest_progress_bar_cancel_current_operation (ModestProgressObject *self); + +static void modest_progress_bar_cancel_all_operations (ModestProgressObject *self); + +static guint modest_progress_bar_num_pending_operations (ModestProgressObject *self); + +static void on_progress_changed (ModestMailOperation *mail_op, + ModestMailOperationState *state, + ModestProgressBar *self); + +static gboolean progressbar_clean (GtkProgressBar *bar); + +static gboolean modest_progress_bar_is_pulsating (ModestProgressBar *self); + +static void modest_progress_bar_set_pulsating_mode (ModestProgressBar *self, + const gchar* msg, + gboolean is_pulsating); + +#define XALIGN 0.5 +#define YALIGN 0.5 +#define XSPACE 1 +#define YSPACE 0 + +#define LOWER 0 +#define UPPER 150 + +#define MODEST_PROGRESS_BAR_PULSE_INTERVAL 125 + +/* list my signals */ +/* enum { */ +/* LAST_SIGNAL */ +/* }; */ + +typedef struct _ObservableData ObservableData; +struct _ObservableData { + guint signal_handler; + ModestMailOperation *mail_op; +}; + +typedef struct _ModestProgressBarPrivate ModestProgressBarPrivate; +struct _ModestProgressBarPrivate { + GSList *observables; + ModestMailOperation *current; + guint count; + GtkWidget *progress_bar; + guint pulsating_timeout; +}; +#define MODEST_PROGRESS_BAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ + MODEST_TYPE_PROGRESS_BAR_WIDGET, \ + ModestProgressBarPrivate)) + +/* globals */ +static GtkContainerClass *parent_class = NULL; + +/* uncomment the following if you have defined any signals */ +/* static guint signals[LAST_SIGNAL] = {0}; */ + +static void +modest_progress_object_init (gpointer g, gpointer iface_data) +{ + ModestProgressObjectIface *klass = (ModestProgressObjectIface *)g; + + klass->add_operation_func = modest_progress_bar_add_operation; + klass->remove_operation_func = modest_progress_bar_remove_operation; + klass->cancel_current_operation_func = modest_progress_bar_cancel_current_operation; + klass->cancel_all_operations_func = modest_progress_bar_cancel_all_operations; + klass->num_pending_operations_func = modest_progress_bar_num_pending_operations; +} + + +GType +modest_progress_bar_get_type (void) +{ + static GType my_type = 0; + if (!my_type) { + static const GTypeInfo my_info = { + sizeof(ModestProgressBarClass), + NULL, /* base init */ + NULL, /* base finalize */ + (GClassInitFunc) modest_progress_bar_class_init, + NULL, /* class finalize */ + NULL, /* class data */ + sizeof(ModestProgressBar), + 1, /* n_preallocs */ + (GInstanceInitFunc) modest_progress_bar_init, + NULL + }; + + static const GInterfaceInfo modest_progress_object_info = + { + (GInterfaceInitFunc) modest_progress_object_init, /* interface_init */ + NULL, /* interface_finalize */ + NULL /* interface_data */ + }; + + my_type = g_type_register_static (GTK_TYPE_VBOX, + "ModestProgressBar", + &my_info, 0); + + g_type_add_interface_static (my_type, MODEST_TYPE_PROGRESS_OBJECT, + &modest_progress_object_info); + } + return my_type; +} + +static void +modest_progress_bar_class_init (ModestProgressBarClass *klass) +{ + GObjectClass *gobject_class; + gobject_class = (GObjectClass*) klass; + + parent_class = g_type_class_peek_parent (klass); + gobject_class->finalize = modest_progress_bar_finalize; + + g_type_class_add_private (gobject_class, sizeof(ModestProgressBarPrivate)); +} + +static void +modest_progress_bar_init (ModestProgressBar *self) +{ + + ModestProgressBarPrivate *priv; + GtkWidget *align = NULL; + GtkRequisition req; + GtkAdjustment *adj; + + priv = MODEST_PROGRESS_BAR_GET_PRIVATE(self); + + /* Alignment */ + align = gtk_alignment_new(XALIGN, YALIGN, XSPACE, YSPACE); + + /* Build GtkProgressBar */ + adj = (GtkAdjustment *) gtk_adjustment_new (0, LOWER, UPPER, 0, 0, 0); + priv->progress_bar = gtk_progress_bar_new_with_adjustment (adj); + req.width = 228; + req.height = 64; + gtk_progress_set_text_alignment (GTK_PROGRESS (priv->progress_bar), 0, 0.5); + gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (priv->progress_bar), PANGO_ELLIPSIZE_END); + gtk_progress_bar_set_pulse_step (GTK_PROGRESS_BAR (priv->progress_bar), 0.25); + gtk_progress_bar_set_text (GTK_PROGRESS_BAR (priv->progress_bar), " "); + gtk_widget_size_request (priv->progress_bar, &req); + gtk_container_add (GTK_CONTAINER (align), priv->progress_bar); + gtk_widget_size_request (align, &req); + + /* Add progress bar widget */ + gtk_box_pack_start (GTK_BOX(self), align, TRUE, TRUE, 0); + gtk_widget_show_all (GTK_WIDGET(self)); + + priv->pulsating_timeout = 0; +} + +static void +modest_progress_bar_finalize (GObject *obj) +{ + ModestProgressBarPrivate *priv; + + priv = MODEST_PROGRESS_BAR_GET_PRIVATE(obj); + if (priv->observables) { + GSList *tmp; + + for (tmp = priv->observables; tmp; tmp = g_slist_next (tmp)) { + ObservableData *ob_data = tmp->data; + g_signal_handler_disconnect (ob_data->mail_op, ob_data->signal_handler); + g_object_unref (ob_data->mail_op); + g_free (ob_data); + } + g_slist_free (priv->observables); + priv->observables = NULL; + } + + /* remove timeout */ + if (priv->pulsating_timeout != 0) + g_source_remove (priv->pulsating_timeout); + + G_OBJECT_CLASS(parent_class)->finalize (obj); +} + + +static void +modest_progress_bar_add_operation (ModestProgressObject *self, + ModestMailOperation *mail_op) +{ + ModestProgressBar *me = NULL; + ObservableData *data = NULL; + ModestProgressBarPrivate *priv = NULL; + + me = MODEST_PROGRESS_BAR (self); + priv = MODEST_PROGRESS_BAR_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); + /* Set curent operation */ + if (priv->current == NULL) { + priv->current = mail_op; + + priv->count = 0; + + /* Call progress_change handler to initialize progress message */ +/* modest_progress_bar_set_undetermined_progress (MODEST_PROGRESS_BAR(self), mail_op); */ + } + + /* Add operation to obserbable objects list */ + priv->observables = g_slist_prepend (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) +{ + ModestProgressBar *me; + ModestProgressBarPrivate *priv; + GSList *link; + ObservableData *tmp_data = NULL; + gboolean is_current; + + me = MODEST_PROGRESS_BAR (self); + priv = MODEST_PROGRESS_BAR_GET_PRIVATE (me); + + is_current = (priv->current == mail_op); + + /* Find item */ + tmp_data = g_malloc0 (sizeof (ObservableData)); + tmp_data->mail_op = mail_op; + link = g_slist_find_custom (priv->observables, + tmp_data, + (GCompareFunc) compare_observable_data); + + /* Remove the item */ + if (link) { + ObservableData *ob_data = link->data; + g_signal_handler_disconnect (ob_data->mail_op, ob_data->signal_handler); + g_object_unref (ob_data->mail_op); + g_free (ob_data); + priv->observables = g_slist_delete_link (priv->observables, link); + tmp_data->mail_op = NULL; + link = NULL; + } + + /* Update the current mail operation */ + if (is_current) { + if (priv->observables) + priv->current = ((ObservableData *) priv->observables->data)->mail_op; + else + priv->current = NULL; + + /* Refresh the view */ + modest_progress_bar_set_pulsating_mode (me, NULL, FALSE); + progressbar_clean (GTK_PROGRESS_BAR (priv->progress_bar)); + } + + /* free */ + g_free(tmp_data); +} + +static guint +modest_progress_bar_num_pending_operations (ModestProgressObject *self) +{ + ModestProgressBar *me; + ModestProgressBarPrivate *priv; + + me = MODEST_PROGRESS_BAR (self); + priv = MODEST_PROGRESS_BAR_GET_PRIVATE (me); + + return g_slist_length(priv->observables); +} + +static void +modest_progress_bar_cancel_current_operation (ModestProgressObject *self) +{ + ModestProgressBar *me; + ModestProgressBarPrivate *priv; + + me = MODEST_PROGRESS_BAR (self); + priv = MODEST_PROGRESS_BAR_GET_PRIVATE (me); + + if (priv->current == NULL) return; + + modest_mail_operation_cancel (priv->current); +} + +static void +modest_progress_bar_cancel_all_operations (ModestProgressObject *self) +{ + ModestProgressBar *me; + ModestProgressBarPrivate *priv; + + me = MODEST_PROGRESS_BAR (self); + priv = MODEST_PROGRESS_BAR_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, + ModestProgressBar *self) +{ + ModestProgressBarPrivate *priv; + gboolean determined = FALSE; + + priv = MODEST_PROGRESS_BAR_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_set_progress (self, msg, + state->bytes_done, + state->bytes_total); + else if ((state->done == 0) && (state->total == 0)) + modest_progress_bar_set_pulsating_mode (self, msg, TRUE); + else + modest_progress_bar_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; +} + + +GtkWidget* +modest_progress_bar_new () +{ + return GTK_WIDGET (g_object_new (MODEST_TYPE_PROGRESS_BAR_WIDGET, NULL)); +} + + +void +modest_progress_bar_set_progress (ModestProgressBar *self, + const gchar *message, + gint done, + gint total) +{ + ModestProgressBarPrivate *priv; + gboolean determined = FALSE; + + g_return_if_fail (MODEST_IS_PROGRESS_BAR_WIDGET(self)); + g_return_if_fail (done <= total); + + priv = MODEST_PROGRESS_BAR_GET_PRIVATE (self); + + priv->count++; + + if (modest_progress_bar_is_pulsating (self)) + modest_progress_bar_set_pulsating_mode (self, NULL, FALSE); + + /* Set progress. Tinymail sometimes returns us 1/100 when it + does not have any clue, NOTE that 1/100 could be also a + valid progress (we will loose it), but it will be recovered + once the done is greater than 1 */ + determined = (done > 0 && total > 1) && + !(done == 1 && total == 100); + if (!determined) { + gtk_progress_bar_pulse (GTK_PROGRESS_BAR (priv->progress_bar)); + } else { + gdouble percent = 0; + if (total != 0) /* Avoid division by zero. */ + percent = (gdouble)done/(gdouble)total; + + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (priv->progress_bar), + percent); + } + + /* Set text */ + gtk_progress_bar_set_text (GTK_PROGRESS_BAR (priv->progress_bar), + (message && message[0] != '\0')?message:" "); +} + + +void +modest_progress_bar_set_undetermined_progress (ModestProgressBar *self, + ModestMailOperation *mail_op) +{ + ModestMailOperationState *state = NULL; + + state = g_malloc0(sizeof(ModestMailOperationState)); + state->done = 0; + state->total = 0; + state->op_type = modest_mail_operation_get_type_operation (mail_op); + on_progress_changed (mail_op, state, self); + g_free(state); +} + +/* this has to be explicitly removed */ +static gboolean +do_pulse (gpointer data) +{ + ModestProgressBarPrivate *priv; + + g_return_val_if_fail (MODEST_IS_PROGRESS_BAR_WIDGET(data), FALSE); + + priv = MODEST_PROGRESS_BAR_GET_PRIVATE (data); + gtk_progress_bar_pulse (GTK_PROGRESS_BAR (priv->progress_bar)); + return TRUE; +} + +gboolean +modest_progress_bar_is_pulsating (ModestProgressBar *self) +{ + ModestProgressBarPrivate *priv; + + g_return_val_if_fail (MODEST_IS_PROGRESS_BAR_WIDGET(self), FALSE); + + priv = MODEST_PROGRESS_BAR_GET_PRIVATE (self); + + return priv->pulsating_timeout != 0; +} + +void +modest_progress_bar_set_pulsating_mode (ModestProgressBar *self, + const gchar* msg, + gboolean is_pulsating) +{ + ModestProgressBarPrivate *priv; + + g_return_if_fail (MODEST_IS_PROGRESS_BAR_WIDGET(self)); + + priv = MODEST_PROGRESS_BAR_GET_PRIVATE (self); + + if (msg != NULL) + gtk_progress_bar_set_text (GTK_PROGRESS_BAR (priv->progress_bar), msg); + + if (is_pulsating == (priv->pulsating_timeout != 0)) + return; + else if (is_pulsating && (priv->pulsating_timeout == 0)) { + /* enable */ + priv->pulsating_timeout = g_timeout_add (MODEST_PROGRESS_BAR_PULSE_INTERVAL, + do_pulse, self); + } else if (!is_pulsating && (priv->pulsating_timeout != 0)) { + /* disable */ + g_source_remove (priv->pulsating_timeout); + priv->pulsating_timeout = 0; + } +} diff --git a/src/widgets/modest-progress-bar.h b/src/widgets/modest-progress-bar.h new file mode 100644 index 0000000..fb124d8 --- /dev/null +++ b/src/widgets/modest-progress-bar.h @@ -0,0 +1,255 @@ +/* Copyright (c) 2006, Nokia Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Nokia Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __MODEST_PROGRESS_BAR_H__ +#define __MODEST_PROGRESS_BAR_H__ + +#include +#include "modest-progress-object.h" + +G_BEGIN_DECLS + +/* convenience macros */ +#define MODEST_TYPE_PROGRESS_BAR_WIDGET (modest_progress_bar_get_type()) +#define MODEST_PROGRESS_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),MODEST_TYPE_PROGRESS_BAR_WIDGET,ModestProgressBar)) +#define MODEST_PROGRESS_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),MODEST_TYPE_PROGRESS_BAR_WIDGET,GtkContainer)) +#define MODEST_IS_PROGRESS_BAR_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),MODEST_TYPE_PROGRESS_BAR_WIDGET)) +#define MODEST_IS_PROGRESS_BAR_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),MODEST_TYPE_PROGRESS_BAR_WIDGET)) +#define MODEST_PROGRESS_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),MODEST_TYPE_PROGRESS_BAR_WIDGET,ModestProgressBarClass)) + +typedef struct _ModestProgressBar ModestProgressBar; +typedef struct _ModestProgressBarClass ModestProgressBarClass; + +struct _ModestProgressBar { + GtkVBox parent; + /* insert public members, if any */ +}; + +struct _ModestProgressBarClass { + GtkVBoxClass parent_class; + +}; + +typedef enum { + STATUS_RECEIVING, + STATUS_SENDING, + STATUS_OPENING +} ModestProgressStatus; + + + +/* member functions */ +GType modest_progress_bar_get_type (void) G_GNUC_CONST; + +GtkWidget* modest_progress_bar_new (void); + +void modest_progress_bar_set_progress (ModestProgressBar *self, + const gchar *msg, + gint done, + gint total); + +void +modest_progress_bar_set_undetermined_progress (ModestProgressBar *self, + ModestMailOperation *mail_op); + + +G_END_DECLS + +#endif /* __MODEST_PROGRESS_BAR_H__ */ + +/* Copyright (c) 2006, Nokia Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Nokia Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __MODEST_PROGRESS_BAR_H__ +#define __MODEST_PROGRESS_BAR_H__ + +#include +#include "modest-progress-object.h" + +G_BEGIN_DECLS + +/* convenience macros */ +#define MODEST_TYPE_PROGRESS_BAR_WIDGET (modest_progress_bar_get_type()) +#define MODEST_PROGRESS_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),MODEST_TYPE_PROGRESS_BAR_WIDGET,ModestProgressBar)) +#define MODEST_PROGRESS_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),MODEST_TYPE_PROGRESS_BAR_WIDGET,GtkContainer)) +#define MODEST_IS_PROGRESS_BAR_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),MODEST_TYPE_PROGRESS_BAR_WIDGET)) +#define MODEST_IS_PROGRESS_BAR_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),MODEST_TYPE_PROGRESS_BAR_WIDGET)) +#define MODEST_PROGRESS_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),MODEST_TYPE_PROGRESS_BAR_WIDGET,ModestProgressBarClass)) + +typedef struct _ModestProgressBar ModestProgressBar; +typedef struct _ModestProgressBarClass ModestProgressBarClass; + +struct _ModestProgressBar { + GtkVBox parent; + /* insert public members, if any */ +}; + +struct _ModestProgressBarClass { + GtkVBoxClass parent_class; + +}; + +typedef enum { + STATUS_RECEIVING, + STATUS_SENDING, + STATUS_OPENING +} ModestProgressStatus; + + + +/* member functions */ +GType modest_progress_bar_get_type (void) G_GNUC_CONST; + +GtkWidget* modest_progress_bar_new (void); + +void modest_progress_bar_set_progress (ModestProgressBar *self, + const gchar *msg, + gint done, + gint total); + +void +modest_progress_bar_set_undetermined_progress (ModestProgressBar *self, + ModestMailOperation *mail_op); + + +G_END_DECLS + +#endif /* __MODEST_PROGRESS_BAR_H__ */ + +/* Copyright (c) 2006, Nokia Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Nokia Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __MODEST_PROGRESS_BAR_H__ +#define __MODEST_PROGRESS_BAR_H__ + +#include +#include "modest-progress-object.h" + +G_BEGIN_DECLS + +/* convenience macros */ +#define MODEST_TYPE_PROGRESS_BAR_WIDGET (modest_progress_bar_get_type()) +#define MODEST_PROGRESS_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),MODEST_TYPE_PROGRESS_BAR_WIDGET,ModestProgressBar)) +#define MODEST_PROGRESS_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),MODEST_TYPE_PROGRESS_BAR_WIDGET,GtkContainer)) +#define MODEST_IS_PROGRESS_BAR_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),MODEST_TYPE_PROGRESS_BAR_WIDGET)) +#define MODEST_IS_PROGRESS_BAR_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),MODEST_TYPE_PROGRESS_BAR_WIDGET)) +#define MODEST_PROGRESS_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),MODEST_TYPE_PROGRESS_BAR_WIDGET,ModestProgressBarClass)) + +typedef struct _ModestProgressBar ModestProgressBar; +typedef struct _ModestProgressBarClass ModestProgressBarClass; + +struct _ModestProgressBar { + GtkVBox parent; + /* insert public members, if any */ +}; + +struct _ModestProgressBarClass { + GtkVBoxClass parent_class; + +}; + +typedef enum { + STATUS_RECEIVING, + STATUS_SENDING, + STATUS_OPENING +} ModestProgressStatus; + + + +/* member functions */ +GType modest_progress_bar_get_type (void) G_GNUC_CONST; + +GtkWidget* modest_progress_bar_new (void); + +void modest_progress_bar_set_progress (ModestProgressBar *self, + const gchar *msg, + gint done, + gint total); + +void +modest_progress_bar_set_undetermined_progress (ModestProgressBar *self, + ModestMailOperation *mail_op); + + +G_END_DECLS + +#endif /* __MODEST_PROGRESS_BAR_H__ */ + -- 1.7.9.5