~ubuntu-branches/ubuntu/vivid/gbonds/vivid

« back to all changes in this revision

Viewing changes to src/edit.c

  • Committer: Bazaar Package Importer
  • Author(s): Richard Laager
  • Date: 2007-03-14 23:50:34 UTC
  • Revision ID: james.westby@ubuntu.com-20070314235034-997qegw33jx0wb9r
Tags: upstream-2.0.2
ImportĀ upstreamĀ versionĀ 2.0.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  (GBONDS) GNOME based Savings Bond Inventory Program
 
3
 *
 
4
 *  edit.c:  Savings Bond Edit module
 
5
 *
 
6
 *  Copyright (C) 2000-2003  Jim Evins <evins@snaught.com>.
 
7
 *
 
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.
 
12
 *
 
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.
 
17
 *
 
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
 
21
 */
 
22
#include <config.h>
 
23
#include <gnome.h>
 
24
 
 
25
#include "edit.h"
 
26
#include "hig.h"
 
27
 
 
28
/*===========================================*/
 
29
/* Private globals                           */
 
30
/*===========================================*/
 
31
 
 
32
/*============================================*/
 
33
/* Private function prototypes.               */
 
34
/*============================================*/
 
35
static void create_add_dialog_widgets    (gbHigDialog *add_dlg,
 
36
                                          gbView      *view);
 
37
 
 
38
static void add_response                 (GtkDialog   *dlg,
 
39
                                          gint         response,
 
40
                                          gbView      *view);
 
41
 
 
42
static void create_title_dialog_widgets  (gbHigDialog *add_dlg,
 
43
                                          gbView      *view);
 
44
 
 
45
static void title_response               (GtkDialog   *dlg,
 
46
                                          gint         response,
 
47
                                          gbView      *view);
 
48
 
 
49
 
 
50
 
 
51
/*****************************************************************************/
 
52
/* create "Add bond" dialog.                                                 */
 
53
/*****************************************************************************/
 
54
void
 
55
gb_edit_add_bond (gbView       *view,
 
56
                  BonoboWindow *win)
 
57
{
 
58
        GtkWidget *add_dlg;
 
59
 
 
60
        g_return_if_fail (view && GB_IS_VIEW(view));
 
61
        g_return_if_fail (win && BONOBO_IS_WINDOW(win));
 
62
 
 
63
        add_dlg = gb_hig_dialog_new_with_buttons ( _("Add new bond"),
 
64
                                                   GTK_WINDOW(win),
 
65
                                                   GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
66
                                                   GTK_STOCK_OK, GTK_RESPONSE_OK,
 
67
                                                   GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
 
68
                                                   NULL );
 
69
 
 
70
        create_add_dialog_widgets (GB_HIG_DIALOG(add_dlg), view);
 
71
 
 
72
        g_signal_connect( G_OBJECT(add_dlg), "response",
 
73
                          G_CALLBACK(add_response), view );
 
74
 
 
75
        gtk_widget_show_all( GTK_WIDGET(add_dlg) );
 
76
}
 
77
 
 
78
/*---------------------------------------------------------------------------*/
 
79
/* PRIVATE.  Create widgets to enter a bond by sn and idate.                 */
 
80
/*---------------------------------------------------------------------------*/
 
81
static void
 
82
create_add_dialog_widgets (gbHigDialog *add_dlg,
 
83
                           gbView      *view)
 
84
{
 
85
        GtkWidget    *wframe, *whbox, *wlabel, *sn_entry, *idate_entry;
 
86
        GtkSizeGroup *size_group;
 
87
        gchar        *name, *label;
 
88
 
 
89
        size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
 
90
 
 
91
        name = gb_doc_get_title (view->doc);
 
92
        if ( name == NULL ) {
 
93
                name = gb_doc_get_short_name (view->doc);
 
94
                g_return_if_fail (name != NULL);
 
95
        }
 
96
        label = g_strdup_printf (_("Add bond to \"%s\" "), name);
 
97
        g_free (name);
 
98
        wframe = gb_hig_category_new (label);
 
99
        g_free (label);
 
100
        gb_hig_dialog_add_widget (add_dlg, wframe);
 
101
 
 
102
        whbox = gb_hig_hbox_new();
 
103
        gb_hig_category_add_widget (GB_HIG_CATEGORY(wframe), whbox);
 
104
 
 
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);
 
111
 
 
112
        whbox = gb_hig_hbox_new();
 
113
        gb_hig_category_add_widget (GB_HIG_CATEGORY(wframe), whbox);
 
114
 
 
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);
 
121
 
 
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 );
 
124
}
 
125
 
 
126
/*---------------------------------------------------------------------------*/
 
127
/* Add "response" callback.                                                  */
 
128
/*---------------------------------------------------------------------------*/
 
129
static void
 
130
add_response (GtkDialog *add_dlg,
 
131
              gint       response,
 
132
              gbView    *view)
 
133
{
 
134
        GtkWidget *sn_entry, *idate_entry;
 
135
        gchar     *sn, *idate, *msg;
 
136
        gbDocBond *p_bond;
 
137
        gbStatus   status;
 
138
        GtkWidget *dlg;
 
139
 
 
140
        switch (response) {
 
141
 
 
142
        case GTK_RESPONSE_OK:
 
143
                sn_entry =
 
144
                        GTK_WIDGET( g_object_get_data( G_OBJECT(add_dlg), "sn_entry" ) );
 
145
                idate_entry =
 
146
                        GTK_WIDGET( g_object_get_data( G_OBJECT(add_dlg), "idate_entry" ) );
 
147
 
 
148
                sn    = gtk_editable_get_chars( GTK_EDITABLE(sn_entry), 0, -1 );
 
149
                idate = gtk_editable_get_chars( GTK_EDITABLE(idate_entry), 0, -1 );
 
150
 
 
151
                p_bond = gb_doc_bond_new_from_sn_idate( sn, idate, &status );
 
152
 
 
153
                g_free( sn );
 
154
                g_free( idate );
 
155
 
 
156
                switch (status) {
 
157
 
 
158
                case GB_ERROR_PARSE_SN_EMPTY:
 
159
                        msg=g_strdup_printf( _("Must enter serial number.") );
 
160
                        break;
 
161
 
 
162
                case GB_ERROR_PARSE_SN_BAD_DENOM:
 
163
                        msg=g_strdup_printf( _("Bad serial number, unknown denomination.") );
 
164
                        break;
 
165
 
 
166
                case GB_ERROR_PARSE_SN_DIGITS:
 
167
                        msg=g_strdup_printf( _("Bad serial number, must contain 1-10 digits.") );
 
168
                        break;
 
169
 
 
170
                case GB_ERROR_PARSE_SN_BAD_SERIES:
 
171
                        msg=g_strdup_printf( _("Bad serial number, bad series.") );
 
172
                        break;
 
173
 
 
174
                case GB_ERROR_PARSE_DATE_EMPTY:
 
175
                        msg=g_strdup_printf( _("Must enter issue date.") );
 
176
                        break;
 
177
 
 
178
                case GB_ERROR_PARSE_DATE_FORMAT:
 
179
                        msg=g_strdup_printf( _("Bad issue date, format should be mm/yyyy.") );
 
180
                        break;
 
181
 
 
182
                case GB_ERROR_PARSE_DATE_MONTH:
 
183
                        msg=g_strdup_printf( _("Bad issue date, month must be 1-12.") );
 
184
                        break;
 
185
 
 
186
                case GB_ERROR_PARSE_DATE_YEAR:
 
187
                        msg=g_strdup_printf(
 
188
                                _("Bad issue date, year must be in 4 digit format 1940 or later.") );
 
189
                        break;
 
190
 
 
191
                case GB_ERROR_BAD_SERIES_DENOM:
 
192
                        msg=g_strdup_printf( _("Denomination not valid for series") );
 
193
                        break;
 
194
 
 
195
                case GB_ERROR_BAD_ISSUE_DATE:
 
196
                        msg=g_strdup_printf( _("Issue date not valid for series") );
 
197
                        break;
 
198
 
 
199
                default:
 
200
                        msg=g_strdup_printf( _("Unknown error(%d) while adding bond"), status );
 
201
                        break;
 
202
 
 
203
                case GB_OK:
 
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"),
 
207
                                                       p_bond->sn );
 
208
                        }
 
209
                        else {
 
210
                                msg = NULL;
 
211
                        }
 
212
                }
 
213
                if ( msg == NULL ) {
 
214
                        gtk_widget_destroy( GTK_WIDGET(add_dlg) );
 
215
                } else {
 
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,
 
219
                                                GTK_MESSAGE_WARNING,
 
220
                                                GTK_BUTTONS_CLOSE,
 
221
                                                _("Cannot create or add bond"), msg);
 
222
                        gtk_dialog_run (GTK_DIALOG (dlg));
 
223
                        gtk_widget_destroy (dlg);
 
224
 
 
225
                }
 
226
                g_free( msg );
 
227
                break;
 
228
 
 
229
 
 
230
        default:
 
231
                gtk_widget_destroy( GTK_WIDGET(add_dlg) );
 
232
                break;
 
233
        }
 
234
}
 
235
 
 
236
/*****************************************************************************/
 
237
/* create "Delete" dialog(s).                                                */
 
238
/*****************************************************************************/
 
239
void
 
240
gb_edit_delete_bonds (gbView       *view,
 
241
                      BonoboWindow *win)
 
242
{
 
243
        GtkWidget     *del_dlg;
 
244
        gbDocBond     *p_bond;
 
245
        gbDocBondInfo *info;
 
246
        gbStatus       status;
 
247
        gchar         *msg;
 
248
        GList         *selected_bond_list, *p;
 
249
 
 
250
        enum { ASK, DONT_ASK, CANCEL } state = ASK;
 
251
 
 
252
        g_return_if_fail (view && GB_IS_VIEW(view));
 
253
        g_return_if_fail (win && BONOBO_IS_WINDOW(win));
 
254
 
 
255
        selected_bond_list = gb_view_get_selected_bond_list( view );
 
256
 
 
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 );
 
260
                if ( !info ) {
 
261
                        gb_hig_alert_new (GTK_WINDOW(win),
 
262
                                          GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
263
                                          GTK_MESSAGE_ERROR,
 
264
                                          GTK_BUTTONS_CLOSE,
 
265
                                          _("Error"),
 
266
                                          _("Problem getting bond information!"));
 
267
                        return;
 
268
                }
 
269
                if ( state == ASK ) {
 
270
                        msg=g_strdup_printf( _("        SN: %s\n"
 
271
                                               "        Issue date: %s\n"),
 
272
                                             info->sn, info->issue_date );
 
273
 
 
274
                        if ( p->next == NULL ) /* Last or only selected bond */ {
 
275
 
 
276
                                del_dlg =
 
277
                                        gb_hig_alert_new (GTK_WINDOW(win),
 
278
                                                          GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
279
                                                          GTK_MESSAGE_QUESTION,
 
280
                                                          GTK_BUTTONS_YES_NO,
 
281
                                                          _("Delete selected bond?"),
 
282
                                                          msg);
 
283
                                gb_doc_bond_free_info( info );
 
284
                                g_free( msg );
 
285
 
 
286
                                switch ( gtk_dialog_run( GTK_DIALOG(del_dlg) ) ) {
 
287
 
 
288
                                case GTK_RESPONSE_YES:
 
289
                                        gb_doc_delete_bond( view->doc, p_bond );
 
290
                                        break;
 
291
 
 
292
                                default: /* No */
 
293
                                        break;
 
294
                                        
 
295
                                }
 
296
                                gtk_widget_destroy( GTK_WIDGET(del_dlg) );
 
297
 
 
298
                        }
 
299
                        else /* Multiple selected bonds, more complex question */ {
 
300
 
 
301
                                del_dlg =
 
302
                                        gb_hig_alert_new (GTK_WINDOW(win),
 
303
                                                          GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
304
                                                          GTK_MESSAGE_QUESTION,
 
305
                                                          GTK_BUTTONS_NONE,
 
306
                                                          _("Delete bond?"),
 
307
                                                          msg);
 
308
                                gb_doc_bond_free_info( info );
 
309
                                g_free( msg );
 
310
 
 
311
                                gtk_dialog_add_buttons (GTK_DIALOG(del_dlg),
 
312
                                                        GTK_STOCK_YES, GTK_RESPONSE_YES,
 
313
                                                        _("Yes to All"), 1,
 
314
                                                        GTK_STOCK_NO, GTK_RESPONSE_NO,
 
315
                                                        GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
 
316
                                                        NULL);
 
317
 
 
318
                                switch ( gtk_dialog_run( GTK_DIALOG(del_dlg) ) ) {
 
319
 
 
320
                                case GTK_RESPONSE_YES:
 
321
                                        gb_doc_delete_bond( view->doc, p_bond );
 
322
                                        state = ASK;
 
323
                                        break;
 
324
 
 
325
                                case 1: /* Yes to All */
 
326
                                        gb_doc_delete_bond( view->doc, p_bond );
 
327
                                        state = DONT_ASK;
 
328
                                        break;
 
329
 
 
330
                                case GTK_RESPONSE_NO:
 
331
                                        state = ASK;
 
332
                                        break;
 
333
 
 
334
                                default: /* Cancel */
 
335
                                        state = CANCEL;
 
336
                                        break;
 
337
                                }
 
338
                                gtk_widget_destroy( GTK_WIDGET(del_dlg) );
 
339
 
 
340
                        }
 
341
 
 
342
                }
 
343
                else /* DONT_ASK */ {
 
344
 
 
345
                        /* Just go ahead and delete bond */
 
346
                        gb_doc_delete_bond( view->doc, p_bond );
 
347
 
 
348
                }
 
349
 
 
350
        }
 
351
        g_list_free( selected_bond_list );
 
352
}
 
353
 
 
354
/*****************************************************************************/
 
355
/* create "Edit title" dialog.                                               */
 
356
/*****************************************************************************/
 
357
void
 
358
gb_edit_title (gbView       *view,
 
359
               BonoboWindow *win)
 
360
{
 
361
        GtkWidget *title_dlg;
 
362
 
 
363
        g_return_if_fail (view && GB_IS_VIEW(view));
 
364
        g_return_if_fail (win && BONOBO_IS_WINDOW(win));
 
365
 
 
366
        title_dlg = gb_hig_dialog_new_with_buttons (_("Edit inventory title"),
 
367
                                                    GTK_WINDOW(win),
 
368
                                                    GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
369
                                                    GTK_STOCK_OK, GTK_RESPONSE_OK,
 
370
                                                    GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
 
371
                                                    NULL);
 
372
 
 
373
        create_title_dialog_widgets (GB_HIG_DIALOG(title_dlg), view);
 
374
 
 
375
        g_signal_connect( G_OBJECT(title_dlg), "response",
 
376
                          G_CALLBACK(title_response), view );
 
377
 
 
378
        gtk_widget_show_all( GTK_WIDGET(title_dlg) );
 
379
}
 
380
 
 
381
/*---------------------------------------------------------------------------*/
 
382
/* PRIVATE.  Create widgets to edit title of inventory.    .                 */
 
383
/*---------------------------------------------------------------------------*/
 
384
static void
 
385
create_title_dialog_widgets (gbHigDialog *title_dlg,
 
386
                             gbView      *view)
 
387
{
 
388
        GtkWidget *wframe, *title_entry;
 
389
        gchar     *name, *label, *text;
 
390
 
 
391
        name = gb_doc_get_short_name (view->doc);
 
392
        label = g_strdup_printf (_("Title for \"%s\" "), name);
 
393
        g_free(name);
 
394
        wframe = gb_hig_category_new (label);
 
395
        g_free(label);
 
396
        gb_hig_dialog_add_widget (title_dlg, wframe);
 
397
 
 
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 );
 
402
                g_free( text );
 
403
        }
 
404
        gb_hig_category_add_widget( GB_HIG_CATEGORY(wframe), title_entry );
 
405
 
 
406
        g_object_set_data( G_OBJECT(title_dlg), "title_entry", title_entry );
 
407
}
 
408
 
 
409
/*---------------------------------------------------------------------------*/
 
410
/* Title "response" callback.                                                */
 
411
/*---------------------------------------------------------------------------*/
 
412
static void
 
413
title_response (GtkDialog *title_dlg,
 
414
                gint       response,
 
415
                gbView    *view)
 
416
{
 
417
        GtkWidget *title_entry;
 
418
        gchar     *text;
 
419
 
 
420
        switch (response) {
 
421
 
 
422
        case GTK_RESPONSE_OK:
 
423
                title_entry =
 
424
                        GTK_WIDGET(g_object_get_data( G_OBJECT(title_dlg), "title_entry"));
 
425
 
 
426
                text = gtk_editable_get_chars( GTK_EDITABLE(title_entry), 0, -1 );
 
427
                gb_doc_set_title (view->doc, text );
 
428
                g_free( text );
 
429
                break;
 
430
 
 
431
        default:
 
432
                break;
 
433
 
 
434
        }
 
435
 
 
436
        gtk_widget_destroy( GTK_WIDGET(title_dlg) );
 
437
}
 
438
 
 
439
 
 
440
 
 
441
 
 
442
 
 
443