1
/********************************************************************\
2
* dialog-progress.c -- GnuCash progress dialog *
3
* Copyright (C) 2000 Dave Peticolas *
5
* This program is free software; you can redistribute it and/or *
6
* modify it under the terms of the GNU General Public License as *
7
* published by the Free Software Foundation; either version 2 of *
8
* the License, or (at your option) any later version. *
10
* This program is distributed in the hope that it will be useful, *
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13
* GNU General Public License for more details. *
15
* You should have received a copy of the GNU General Public License*
16
* along with this program; if not, contact: *
18
* Free Software Foundation Voice: +1-617-542-5942 *
19
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
20
* Boston, MA 02110-1301, USA gnu@gnu.org *
22
\********************************************************************/
27
#include <glib/gi18n.h>
29
#include "guile-mappings.h"
31
#include "dialog-progress.h"
32
#include "dialog-utils.h"
35
struct _GNCProgressDialog
39
GtkWidget *heading_label;
40
GtkWidget *progress_bar;
43
GtkWidget *cancel_button;
45
GNCProgressCancelFunc cancel_func;
50
gboolean use_ok_button;
59
gnc_progress_maybe_destroy (GNCProgressDialog *progress)
61
if (!(progress->closed && progress->destroyed))
64
gtk_widget_destroy(progress->dialog);
68
ok_cb(GtkWidget * widget, gpointer data)
70
GNCProgressDialog *progress = data;
72
gtk_widget_hide(progress->dialog);
73
progress->closed = TRUE;
74
gnc_progress_maybe_destroy (progress);
78
cancel_cb(GtkWidget * widget, gpointer data)
80
GNCProgressDialog *progress = data;
82
if (progress->cancel_func && !progress->cancel_func (progress->user_data))
85
if (progress->cancel_scm_func != SCM_UNDEFINED)
89
result = scm_call_0(progress->cancel_scm_func);
91
if (!SCM_NFALSEP (result))
95
gtk_widget_hide(progress->dialog);
96
progress->closed = TRUE;
97
gnc_progress_maybe_destroy (progress);
101
delete_cb(GtkWidget *widget, GdkEvent *event, gpointer data)
103
GNCProgressDialog *progress = data;
105
if (progress->finished)
107
gtk_widget_hide(progress->dialog);
108
progress->closed = TRUE;
109
gnc_progress_maybe_destroy (progress);
113
if (progress->cancel_func)
115
if (progress->cancel_func (progress->user_data))
117
gtk_widget_hide(progress->dialog);
118
progress->closed = TRUE;
119
gnc_progress_maybe_destroy (progress);
124
if (progress->cancel_scm_func != SCM_UNDEFINED)
128
result = scm_call_0(progress->cancel_scm_func);
130
if (SCM_NFALSEP (result))
132
gtk_widget_hide(progress->dialog);
133
progress->closed = TRUE;
134
gnc_progress_maybe_destroy (progress);
139
/* Don't delete the window, wait for gnc_progress_dialog_destroy. */
144
destroy_cb(GtkObject *object, gpointer data)
146
GNCProgressDialog *progress = data;
148
/* Make sure the callbacks aren't invoked */
149
progress->cancel_func = NULL;
150
if (progress->cancel_scm_func != SCM_UNDEFINED)
151
scm_gc_unprotect_object (progress->cancel_scm_func);
152
progress->cancel_scm_func = SCM_UNDEFINED;
158
gnc_progress_dialog_create(GtkWidget * parent, GNCProgressDialog *progress)
164
xml = gnc_glade_xml_new ("progress.glade", "Progress Dialog");
166
dialog = glade_xml_get_widget (xml, "Progress Dialog");
167
progress->dialog = dialog;
168
tdo = GTK_OBJECT (dialog);
172
gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent));
174
g_signal_connect (tdo, "delete_event",
175
G_CALLBACK (delete_cb), progress);
177
g_signal_connect (tdo, "destroy", G_CALLBACK (destroy_cb), progress);
179
progress->heading_label = glade_xml_get_widget (xml, "heading_label");
180
gtk_widget_hide(progress->heading_label);
182
progress->progress_bar = glade_xml_get_widget (xml, "progress_bar");
184
progress->ok_button = glade_xml_get_widget (xml, "ok_button");
186
g_signal_connect(progress->ok_button, "clicked",
187
G_CALLBACK(ok_cb), progress);
189
if (!progress->use_ok_button)
190
gtk_widget_hide (progress->ok_button);
192
progress->cancel_button = glade_xml_get_widget (xml, "cancel_button");
194
g_signal_connect(progress->cancel_button, "clicked",
195
G_CALLBACK(cancel_cb), progress);
197
progress->cancel_func = NULL;
198
progress->user_data = NULL;
200
progress->cancel_scm_func = SCM_UNDEFINED;
202
progress->closed = FALSE;
203
progress->finished = FALSE;
204
progress->destroyed = FALSE;
205
progress->title_set = FALSE;
209
gnc_progress_dialog_new (GtkWidget * parent, gboolean use_ok_button)
211
GNCProgressDialog *progress;
213
progress = g_new0(GNCProgressDialog, 1);
215
progress->use_ok_button = use_ok_button;
217
gnc_progress_dialog_create(parent, progress);
219
gtk_widget_show(progress->dialog);
221
gnc_progress_dialog_update (progress);
227
gnc_progress_dialog_set_title (GNCProgressDialog *progress, const char *title)
229
if (progress == NULL)
235
gtk_window_set_title (GTK_WINDOW (progress->dialog), title);
237
progress->title_set = TRUE;
239
gnc_progress_dialog_update (progress);
243
gnc_progress_dialog_set_heading (GNCProgressDialog *progress,
246
if (progress == NULL)
249
if (heading == NULL || *heading == '\0')
250
gtk_widget_hide (progress->heading_label);
253
gtk_label_set_text (GTK_LABEL (progress->heading_label), heading);
254
gtk_widget_show (progress->heading_label);
257
gnc_progress_dialog_update (progress);
261
gnc_progress_dialog_set_cancel_func (GNCProgressDialog *progress,
262
GNCProgressCancelFunc cancel_func,
265
if (progress == NULL)
268
progress->cancel_func = cancel_func;
269
progress->user_data = user_data;
272
gtk_widget_show (progress->cancel_button);
276
gnc_progress_dialog_set_cancel_scm_func (GNCProgressDialog *progress,
279
if (progress == NULL)
282
if (progress->cancel_scm_func != SCM_UNDEFINED)
283
scm_gc_unprotect_object (progress->cancel_scm_func);
285
if (SCM_PROCEDUREP(cancel_scm_func))
287
progress->cancel_scm_func = cancel_scm_func;
288
scm_gc_protect_object (cancel_scm_func);
289
gtk_widget_show (progress->cancel_button);
292
progress->cancel_scm_func = SCM_UNDEFINED;
296
gnc_progress_dialog_set_value (GNCProgressDialog *progress, gdouble value)
298
if (progress == NULL)
301
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress->progress_bar), value);
303
gnc_progress_dialog_update (progress);
307
gnc_progress_dialog_update (GNCProgressDialog *progress)
309
while (gtk_events_pending())
310
gtk_main_iteration();
314
gnc_progress_dialog_finish (GNCProgressDialog *progress)
316
if (progress == NULL)
319
if (!progress->use_ok_button)
321
gtk_widget_hide (progress->dialog);
322
progress->closed = TRUE;
325
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress->progress_bar), 1.0);
327
gtk_widget_set_sensitive (progress->ok_button, TRUE);
328
gtk_widget_set_sensitive (progress->cancel_button, FALSE);
330
if (GTK_WIDGET_VISIBLE(progress->heading_label))
331
gnc_progress_dialog_set_heading (progress, _("Complete"));
333
if (!progress->title_set)
334
gtk_window_set_title (GTK_WINDOW (progress->dialog), _("Complete"));
336
gtk_window_set_modal (GTK_WINDOW (progress->dialog), FALSE);
338
progress->finished = TRUE;
340
gnc_progress_dialog_update (progress);
344
gnc_progress_dialog_destroy (GNCProgressDialog *progress)
346
if (progress == NULL)
349
/* Make sure the callbacks aren't invoked */
350
progress->cancel_func = NULL;
351
if (progress->cancel_scm_func != SCM_UNDEFINED)
352
scm_gc_unprotect_object (progress->cancel_scm_func);
353
progress->cancel_scm_func = SCM_UNDEFINED;
355
if (!progress->finished)
357
gtk_widget_hide (progress->dialog);
358
progress->closed = TRUE;
361
progress->destroyed = TRUE;
363
gnc_progress_maybe_destroy (progress);