diff options
Diffstat (limited to 'gtk/progress_dlg.c')
-rw-r--r-- | gtk/progress_dlg.c | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/gtk/progress_dlg.c b/gtk/progress_dlg.c new file mode 100644 index 0000000000..e3f016e81e --- /dev/null +++ b/gtk/progress_dlg.c @@ -0,0 +1,190 @@ +/* progress_dlg.c + * Routines for progress-bar (modal) dialog + * + * $Id: progress_dlg.c,v 1.1 2000/07/03 08:36:52 guy Exp $ + * + * Ethereal - Network traffic analyzer + * By Gerald Combs <gerald@zing.org> + * Copyright 1998 Gerald Combs + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "gtkglobals.h" +#include "ui_util.h" + +#define PROG_BAR_KEY "progress_bar" + +static void delete_cb(GtkWidget *w, GdkEvent *event, gpointer data); +static void cancel_cb(GtkWidget *w, gpointer data); + +/* + * Create and pop up the progress dialog; return a pointer to it, as + * a "void *", so that our caller doesn't have to know the GUI + * implementation. + * + * The first argument is the title to give the dialog box; the second + * argument is a pointer to a Boolean variable that will be set to + * TRUE if the user hits the "Cancel" button. + * + * XXX - should the button say "Cancel", or "Stop"? + * + * XXX - provide a way to specify the progress in units, with the total + * number of units specified as an argument when the progress dialog + * is created; updates would be given in units, with the progress dialog + * code computing the percentage, and the progress bar would have a + * label "0" on the left and <total number of units> on the right, with + * a label in the middle giving the number of units we've processed + * so far. This could be used when filtering packets, for example; we + * wouldn't always use it, as we have no idea how many packets are to + * be read. + */ +void * +create_progress_dlg(gchar *title, gboolean *stop_flag) +{ + GtkWidget *dlg_w, *main_vb, *title_al, *title_lb, *prog_bar, + *cancel_al, *cancel_bt; + + dlg_w = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(dlg_w), title); + + /* + * Container for dialog widgets. + */ + main_vb = gtk_vbox_new(FALSE, 1); + gtk_container_border_width(GTK_CONTAINER(main_vb), 5); + gtk_container_add(GTK_CONTAINER(dlg_w), main_vb); + gtk_widget_show(main_vb); + + /* + * Put the title here as a label indicating what we're + * doing; stick it on the left, by putting it inside a + * GtkAlignment. + */ + title_al = gtk_alignment_new(0.0, 0.0, 0.0, 0.0); + title_lb = gtk_label_new(title); + gtk_container_add(GTK_CONTAINER(title_al), title_lb); + gtk_box_pack_start(GTK_BOX(main_vb), title_al, FALSE, TRUE, 3); + gtk_widget_show(title_lb); + gtk_widget_show(title_al); + + /* + * The progress bar. + */ + prog_bar = gtk_progress_bar_new(); + gtk_progress_set_activity_mode(GTK_PROGRESS(prog_bar), FALSE); + gtk_box_pack_start(GTK_BOX(main_vb), prog_bar, FALSE, TRUE, 3); + gtk_widget_show(prog_bar); + + /* + * Attach a pointer to the progress bar widget to the top-level + * widget. + */ + gtk_object_set_data(GTK_OBJECT(dlg_w), PROG_BAR_KEY, prog_bar); + + /* + * Allow user to either click a "Cancel" button, or the close button + * on the window, to stop an operation in progress. + * + * Put the button in an alignment so it doesn't get any wider than + * it needs to to say "Cancel". + */ + cancel_al = gtk_alignment_new(0.5, 0.0, 0.0, 0.0); + cancel_bt = gtk_button_new_with_label("Cancel"); + gtk_container_add(GTK_CONTAINER(cancel_al), cancel_bt); + gtk_signal_connect(GTK_OBJECT(cancel_bt), "clicked", + GTK_SIGNAL_FUNC(cancel_cb), (gpointer) stop_flag); + gtk_signal_connect(GTK_OBJECT(dlg_w), "delete_event", + GTK_SIGNAL_FUNC(delete_cb), (gpointer) stop_flag); + gtk_box_pack_end(GTK_BOX(main_vb), cancel_al, FALSE, FALSE, 3); + GTK_WIDGET_SET_FLAGS(cancel_bt, GTK_CAN_DEFAULT); + gtk_widget_grab_default(cancel_bt); + GTK_WIDGET_SET_FLAGS(cancel_bt, GTK_CAN_DEFAULT); + gtk_widget_grab_default(cancel_bt); + gtk_widget_show(cancel_bt); + gtk_widget_show(cancel_al); + + gtk_widget_show(dlg_w); + gtk_grab_add(dlg_w); /* make it modal */ + + return dlg_w; /* return as opaque pointer */ +} + +/* + * Called when the dialog box is to be deleted. + * We just treat this the same way we treat clicking the "Cancel" button. + */ +static void +delete_cb(GtkWidget *w, GdkEvent *event, gpointer data) +{ + cancel_cb(NULL, data); +} + +/* + * Called when the "Cancel" button is clicked. + * Set the Boolean to TRUE. + */ +static void +cancel_cb(GtkWidget *w, gpointer data) +{ + gboolean *stop_flag = (gboolean *) data; + GtkWidget *toplevel; + + *stop_flag = TRUE; + if (w != NULL) { + /* + * The cancel button was clicked, so we have to destroy + * the dialog box ourselves. + */ + toplevel = gtk_widget_get_toplevel(w); + destroy_progress_dlg(toplevel); + } +} + +/* + * Set the percentage value of the progress bar. + */ +void +update_progress_dlg(void *dlg, gfloat percentage) +{ + GtkWidget *dlg_w = dlg; + GtkWidget *prog_bar; + + prog_bar = gtk_object_get_data(GTK_OBJECT(dlg_w), PROG_BAR_KEY); + gtk_progress_bar_update(GTK_PROGRESS_BAR(prog_bar), percentage); + + /* + * Flush out the update and process any input events. + */ + while (gtk_events_pending()) + gtk_main_iteration(); +} + +/* + * Destroy the progress bar. + */ +void +destroy_progress_dlg(void *dlg) +{ + GtkWidget *dlg_w = dlg; + + gtk_grab_remove(GTK_WIDGET(dlg_w)); + gtk_widget_destroy(GTK_WIDGET(dlg_w)); +} |