2
* (GBONDS) GNOME based Savings Bond Inventory Program
4
* edit.c: Savings Bond Edit module
6
* Copyright (C) 2000-2003 Jim Evins <evins@snaught.com>.
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License as published by
10
* the Free Software Foundation; either version 2 of the License, or
11
* (at your option) any later version.
13
* This program is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
* GNU General Public License for more details.
18
* You should have received a copy of the GNU General Public License
19
* along with this program; if not, write to the Free Software
20
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28
/*===========================================*/
30
/*===========================================*/
32
/*============================================*/
33
/* Private function prototypes. */
34
/*============================================*/
35
static void create_add_dialog_widgets (gbHigDialog *add_dlg,
38
static void add_response (GtkDialog *dlg,
42
static void create_title_dialog_widgets (gbHigDialog *add_dlg,
45
static void title_response (GtkDialog *dlg,
51
/*****************************************************************************/
52
/* create "Add bond" dialog. */
53
/*****************************************************************************/
55
gb_edit_add_bond (gbView *view,
60
g_return_if_fail (view && GB_IS_VIEW(view));
61
g_return_if_fail (win && BONOBO_IS_WINDOW(win));
63
add_dlg = gb_hig_dialog_new_with_buttons ( _("Add new bond"),
65
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
66
GTK_STOCK_OK, GTK_RESPONSE_OK,
67
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
70
create_add_dialog_widgets (GB_HIG_DIALOG(add_dlg), view);
72
g_signal_connect( G_OBJECT(add_dlg), "response",
73
G_CALLBACK(add_response), view );
75
gtk_widget_show_all( GTK_WIDGET(add_dlg) );
78
/*---------------------------------------------------------------------------*/
79
/* PRIVATE. Create widgets to enter a bond by sn and idate. */
80
/*---------------------------------------------------------------------------*/
82
create_add_dialog_widgets (gbHigDialog *add_dlg,
85
GtkWidget *wframe, *whbox, *wlabel, *sn_entry, *idate_entry;
86
GtkSizeGroup *size_group;
89
size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
91
name = gb_doc_get_title (view->doc);
93
name = gb_doc_get_short_name (view->doc);
94
g_return_if_fail (name != NULL);
96
label = g_strdup_printf (_("Add bond to \"%s\" "), name);
98
wframe = gb_hig_category_new (label);
100
gb_hig_dialog_add_widget (add_dlg, wframe);
102
whbox = gb_hig_hbox_new();
103
gb_hig_category_add_widget (GB_HIG_CATEGORY(wframe), whbox);
105
wlabel = gtk_label_new(_("Serial Number: "));
106
gtk_misc_set_alignment (GTK_MISC(wlabel), 0, 0.5);
107
gtk_size_group_add_widget (size_group, wlabel);
108
gb_hig_hbox_add_widget (GB_HIG_HBOX(whbox), wlabel);
109
sn_entry = gtk_entry_new();
110
gb_hig_hbox_add_widget (GB_HIG_HBOX(whbox), sn_entry);
112
whbox = gb_hig_hbox_new();
113
gb_hig_category_add_widget (GB_HIG_CATEGORY(wframe), whbox);
115
wlabel = gtk_label_new(_("Issue Date: "));
116
gtk_misc_set_alignment (GTK_MISC(wlabel), 0, 0.5);
117
gtk_size_group_add_widget (size_group, wlabel);
118
gb_hig_hbox_add_widget (GB_HIG_HBOX(whbox), wlabel);
119
idate_entry = gtk_entry_new();
120
gb_hig_hbox_add_widget (GB_HIG_HBOX(whbox), idate_entry);
122
g_object_set_data( G_OBJECT(add_dlg), "sn_entry", sn_entry );
123
g_object_set_data( G_OBJECT(add_dlg), "idate_entry", idate_entry );
126
/*---------------------------------------------------------------------------*/
127
/* Add "response" callback. */
128
/*---------------------------------------------------------------------------*/
130
add_response (GtkDialog *add_dlg,
134
GtkWidget *sn_entry, *idate_entry;
135
gchar *sn, *idate, *msg;
142
case GTK_RESPONSE_OK:
144
GTK_WIDGET( g_object_get_data( G_OBJECT(add_dlg), "sn_entry" ) );
146
GTK_WIDGET( g_object_get_data( G_OBJECT(add_dlg), "idate_entry" ) );
148
sn = gtk_editable_get_chars( GTK_EDITABLE(sn_entry), 0, -1 );
149
idate = gtk_editable_get_chars( GTK_EDITABLE(idate_entry), 0, -1 );
151
p_bond = gb_doc_bond_new_from_sn_idate( sn, idate, &status );
158
case GB_ERROR_PARSE_SN_EMPTY:
159
msg=g_strdup_printf( _("Must enter serial number.") );
162
case GB_ERROR_PARSE_SN_BAD_DENOM:
163
msg=g_strdup_printf( _("Bad serial number, unknown denomination.") );
166
case GB_ERROR_PARSE_SN_DIGITS:
167
msg=g_strdup_printf( _("Bad serial number, must contain 1-10 digits.") );
170
case GB_ERROR_PARSE_SN_BAD_SERIES:
171
msg=g_strdup_printf( _("Bad serial number, bad series.") );
174
case GB_ERROR_PARSE_DATE_EMPTY:
175
msg=g_strdup_printf( _("Must enter issue date.") );
178
case GB_ERROR_PARSE_DATE_FORMAT:
179
msg=g_strdup_printf( _("Bad issue date, format should be mm/yyyy.") );
182
case GB_ERROR_PARSE_DATE_MONTH:
183
msg=g_strdup_printf( _("Bad issue date, month must be 1-12.") );
186
case GB_ERROR_PARSE_DATE_YEAR:
188
_("Bad issue date, year must be in 4 digit format 1940 or later.") );
191
case GB_ERROR_BAD_SERIES_DENOM:
192
msg=g_strdup_printf( _("Denomination not valid for series") );
195
case GB_ERROR_BAD_ISSUE_DATE:
196
msg=g_strdup_printf( _("Issue date not valid for series") );
200
msg=g_strdup_printf( _("Unknown error(%d) while adding bond"), status );
204
status = gb_doc_add_bond( view->doc, p_bond );
205
if ( status == GB_ERROR_DUPLICATE_SN ) {
206
msg = g_strdup_printf( _("Duplicate Serial Number, %s"),
214
gtk_widget_destroy( GTK_WIDGET(add_dlg) );
216
g_print ("ALERT: %s\n", msg);
217
dlg = gb_hig_alert_new (GTK_WINDOW(add_dlg),
218
GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
221
_("Cannot create or add bond"), msg);
222
gtk_dialog_run (GTK_DIALOG (dlg));
223
gtk_widget_destroy (dlg);
231
gtk_widget_destroy( GTK_WIDGET(add_dlg) );
236
/*****************************************************************************/
237
/* create "Delete" dialog(s). */
238
/*****************************************************************************/
240
gb_edit_delete_bonds (gbView *view,
248
GList *selected_bond_list, *p;
250
enum { ASK, DONT_ASK, CANCEL } state = ASK;
252
g_return_if_fail (view && GB_IS_VIEW(view));
253
g_return_if_fail (win && BONOBO_IS_WINDOW(win));
255
selected_bond_list = gb_view_get_selected_bond_list( view );
257
for ( p=selected_bond_list; (p != NULL) && (state != CANCEL); p=p->next ) {
258
p_bond = (gbDocBond *)p->data;
259
info = gb_doc_bond_get_info( p_bond, view->rdate, &status );
261
gb_hig_alert_new (GTK_WINDOW(win),
262
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
266
_("Problem getting bond information!"));
269
if ( state == ASK ) {
270
msg=g_strdup_printf( _(" SN: %s\n"
271
" Issue date: %s\n"),
272
info->sn, info->issue_date );
274
if ( p->next == NULL ) /* Last or only selected bond */ {
277
gb_hig_alert_new (GTK_WINDOW(win),
278
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
279
GTK_MESSAGE_QUESTION,
281
_("Delete selected bond?"),
283
gb_doc_bond_free_info( info );
286
switch ( gtk_dialog_run( GTK_DIALOG(del_dlg) ) ) {
288
case GTK_RESPONSE_YES:
289
gb_doc_delete_bond( view->doc, p_bond );
296
gtk_widget_destroy( GTK_WIDGET(del_dlg) );
299
else /* Multiple selected bonds, more complex question */ {
302
gb_hig_alert_new (GTK_WINDOW(win),
303
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
304
GTK_MESSAGE_QUESTION,
308
gb_doc_bond_free_info( info );
311
gtk_dialog_add_buttons (GTK_DIALOG(del_dlg),
312
GTK_STOCK_YES, GTK_RESPONSE_YES,
314
GTK_STOCK_NO, GTK_RESPONSE_NO,
315
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
318
switch ( gtk_dialog_run( GTK_DIALOG(del_dlg) ) ) {
320
case GTK_RESPONSE_YES:
321
gb_doc_delete_bond( view->doc, p_bond );
325
case 1: /* Yes to All */
326
gb_doc_delete_bond( view->doc, p_bond );
330
case GTK_RESPONSE_NO:
334
default: /* Cancel */
338
gtk_widget_destroy( GTK_WIDGET(del_dlg) );
343
else /* DONT_ASK */ {
345
/* Just go ahead and delete bond */
346
gb_doc_delete_bond( view->doc, p_bond );
351
g_list_free( selected_bond_list );
354
/*****************************************************************************/
355
/* create "Edit title" dialog. */
356
/*****************************************************************************/
358
gb_edit_title (gbView *view,
361
GtkWidget *title_dlg;
363
g_return_if_fail (view && GB_IS_VIEW(view));
364
g_return_if_fail (win && BONOBO_IS_WINDOW(win));
366
title_dlg = gb_hig_dialog_new_with_buttons (_("Edit inventory title"),
368
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
369
GTK_STOCK_OK, GTK_RESPONSE_OK,
370
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
373
create_title_dialog_widgets (GB_HIG_DIALOG(title_dlg), view);
375
g_signal_connect( G_OBJECT(title_dlg), "response",
376
G_CALLBACK(title_response), view );
378
gtk_widget_show_all( GTK_WIDGET(title_dlg) );
381
/*---------------------------------------------------------------------------*/
382
/* PRIVATE. Create widgets to edit title of inventory. . */
383
/*---------------------------------------------------------------------------*/
385
create_title_dialog_widgets (gbHigDialog *title_dlg,
388
GtkWidget *wframe, *title_entry;
389
gchar *name, *label, *text;
391
name = gb_doc_get_short_name (view->doc);
392
label = g_strdup_printf (_("Title for \"%s\" "), name);
394
wframe = gb_hig_category_new (label);
396
gb_hig_dialog_add_widget (title_dlg, wframe);
398
title_entry = gtk_entry_new ();
399
text = gb_doc_get_title (view->doc);
400
if ( text != NULL ) {
401
gtk_entry_set_text( GTK_ENTRY(title_entry), text );
404
gb_hig_category_add_widget( GB_HIG_CATEGORY(wframe), title_entry );
406
g_object_set_data( G_OBJECT(title_dlg), "title_entry", title_entry );
409
/*---------------------------------------------------------------------------*/
410
/* Title "response" callback. */
411
/*---------------------------------------------------------------------------*/
413
title_response (GtkDialog *title_dlg,
417
GtkWidget *title_entry;
422
case GTK_RESPONSE_OK:
424
GTK_WIDGET(g_object_get_data( G_OBJECT(title_dlg), "title_entry"));
426
text = gtk_editable_get_chars( GTK_EDITABLE(title_entry), 0, -1 );
427
gb_doc_set_title (view->doc, text );
436
gtk_widget_destroy( GTK_WIDGET(title_dlg) );