00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "config.h"
00026
00027 #include <gtk/gtk.h>
00028 #include <glib/gi18n.h>
00029
00030 #include "dialog-utils.h"
00031 #include "gnc-component-manager.h"
00032 #include "gnc-ui.h"
00033 #include "gnc-gui-query.h"
00034 #include "gnc-gconf-utils.h"
00035 #include "gnc-ui-util.h"
00036 #include "qof.h"
00037
00038 #include "gncBillTerm.h"
00039 #include "dialog-billterms.h"
00040
00041 #define DIALOG_BILLTERMS_CM_CLASS "billterms-dialog"
00042
00043 enum term_cols
00044 {
00045 BILL_TERM_COL_NAME = 0,
00046 BILL_TERM_COL_TERM,
00047 NUM_BILL_TERM_COLS
00048 };
00049
00050 void billterms_new_term_cb (GtkButton *button, BillTermsWindow *btw);
00051 void billterms_delete_term_cb (GtkButton *button, BillTermsWindow *btw);
00052 void billterms_edit_term_cb (GtkButton *button, BillTermsWindow *btw);
00053 void billterms_window_close (GtkWidget *widget, gpointer data);
00054 void billterms_window_destroy_cb (GtkWidget *widget, gpointer data);
00055 void billterms_type_combobox_changed (GtkComboBox *cb, gpointer data);
00056
00057 typedef struct _billterm_notebook
00058 {
00059 GtkTooltips * tooltips;
00060 GtkWidget * notebook;
00061
00062
00063 GtkWidget * days_due_days;
00064 GtkWidget * days_disc_days;
00065 GtkWidget * days_disc;
00066
00067
00068 GtkWidget * prox_due_day;
00069 GtkWidget * prox_disc_day;
00070 GtkWidget * prox_disc;
00071 GtkWidget * prox_cutoff;
00072
00073
00074 GncBillTermType type;
00075 } BillTermNB;
00076
00077 struct _billterms_window
00078 {
00079 GtkWidget * dialog;
00080 GtkWidget * terms_view;
00081 GtkWidget * desc_entry;
00082 GtkWidget * type_label;
00083 GtkWidget * term_vbox;
00084 BillTermNB notebook;
00085
00086 GncBillTerm * current_term;
00087 QofBook * book;
00088 gint component_id;
00089 };
00090
00091 typedef struct _new_billterms
00092 {
00093 GtkWidget * dialog;
00094 GtkWidget * name_entry;
00095 GtkWidget * desc_entry;
00096 BillTermNB notebook;
00097
00098 BillTermsWindow * btw;
00099 GncBillTerm * this_term;
00100 } NewBillTerm;
00101
00102
00103 static GtkWidget *
00104 read_widget (GladeXML *xml, char *name, gboolean read_only)
00105 {
00106 GtkWidget *widget = glade_xml_get_widget (xml, name);
00107 if (read_only)
00108 {
00109 GtkAdjustment *adj;
00110 gtk_editable_set_editable (GTK_EDITABLE (widget), FALSE);
00111 adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
00112 adj->step_increment = 0.0;
00113 adj->page_increment = 0.0;
00114 gtk_adjustment_changed (adj);
00115 }
00116
00117 return widget;
00118 }
00119
00120
00121 static void
00122 init_notebook_widgets (BillTermNB *notebook, gboolean read_only,
00123 GtkDialog *dialog, gpointer user_data)
00124 {
00125 GladeXML *xml;
00126 GtkWidget *parent;
00127
00128
00129 notebook->tooltips = gtk_tooltips_new ();
00130
00131
00132 xml = gnc_glade_xml_new ("billterms.glade", "Term Notebook");
00133 notebook->notebook = glade_xml_get_widget (xml, "term_notebook");
00134 parent = glade_xml_get_widget (xml, "Term Notebook");
00135
00136
00137 notebook->days_due_days = read_widget (xml, "days:due_days", read_only);
00138 notebook->days_disc_days = read_widget (xml, "days:discount_days", read_only);
00139 notebook->days_disc = read_widget (xml, "days:discount", read_only);
00140
00141
00142 notebook->prox_due_day = read_widget (xml, "prox:due_day", read_only);
00143 notebook->prox_disc_day = read_widget (xml, "prox:discount_day", read_only);
00144 notebook->prox_disc = read_widget (xml, "prox:discount", read_only);
00145 notebook->prox_cutoff = read_widget (xml, "prox:cutoff_day", read_only);
00146
00147
00148 g_object_ref (notebook->notebook);
00149 gtk_container_remove (GTK_CONTAINER (parent), notebook->notebook);
00150 gtk_widget_destroy (parent);
00151
00152
00153 }
00154
00155 static void
00156 set_numeric (GtkWidget *widget, GncBillTerm *term,
00157 void (*func)(GncBillTerm *, gnc_numeric))
00158 {
00159 gnc_numeric val;
00160 gdouble fl = 0.0;
00161
00162 fl = gtk_spin_button_get_value (GTK_SPIN_BUTTON (widget));
00163 val = double_to_gnc_numeric (fl, 100000, GNC_HOW_RND_ROUND_HALF_UP);
00164 func (term, val);
00165 }
00166
00167 static void
00168 get_numeric (GtkWidget *widget, GncBillTerm *term,
00169 gnc_numeric (*func)(const GncBillTerm *))
00170 {
00171 gnc_numeric val;
00172 gdouble fl;
00173
00174 val = func (term);
00175 fl = gnc_numeric_to_double (val);
00176 gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), fl);
00177 }
00178
00179 static void
00180 set_int (GtkWidget *widget, GncBillTerm *term,
00181 void (*func)(GncBillTerm *, gint))
00182 {
00183 gint val;
00184
00185 val = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (widget));
00186 func (term, val);
00187 }
00188
00189 static void
00190 get_int (GtkWidget *widget, GncBillTerm *term,
00191 gint (*func)(const GncBillTerm *))
00192 {
00193 gint val;
00194
00195 val = func (term);
00196 gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), (gfloat)val);
00197 }
00198
00199
00200 static gboolean
00201 ui_to_billterm (NewBillTerm *nbt)
00202 {
00203 BillTermNB *notebook;
00204 GncBillTerm *term;
00205 const char *text;
00206
00207 term = nbt->this_term;
00208 notebook = &nbt->notebook;
00209
00210 text = gtk_entry_get_text (GTK_ENTRY (nbt->desc_entry));
00211 if (text)
00212 gncBillTermSetDescription (term, text);
00213
00214 gncBillTermSetType (nbt->this_term, nbt->notebook.type);
00215
00216 switch (nbt->notebook.type)
00217 {
00218 case GNC_TERM_TYPE_DAYS:
00219 set_int (notebook->days_due_days, term, gncBillTermSetDueDays);
00220 set_int (notebook->days_disc_days, term, gncBillTermSetDiscountDays);
00221 set_numeric (notebook->days_disc, term, gncBillTermSetDiscount);
00222 break;
00223
00224 case GNC_TERM_TYPE_PROXIMO:
00225 set_int (notebook->prox_due_day, term, gncBillTermSetDueDays);
00226 set_int (notebook->prox_disc_day, term, gncBillTermSetDiscountDays);
00227 set_numeric (notebook->prox_disc, term, gncBillTermSetDiscount);
00228 set_int (notebook->prox_cutoff, term, gncBillTermSetCutoff);
00229 break;
00230 }
00231
00232 return gncBillTermIsDirty (term);
00233 }
00234
00235 static void
00236 billterm_to_ui (GncBillTerm *term, GtkWidget *desc, BillTermNB *notebook)
00237 {
00238 gtk_entry_set_text (GTK_ENTRY (desc), gncBillTermGetDescription (term));
00239 notebook->type = gncBillTermGetType (term);
00240
00241 switch (notebook->type)
00242 {
00243 case GNC_TERM_TYPE_DAYS:
00244 get_int (notebook->days_due_days, term, gncBillTermGetDueDays);
00245 get_int (notebook->days_disc_days, term, gncBillTermGetDiscountDays);
00246 get_numeric (notebook->days_disc, term, gncBillTermGetDiscount);
00247 break;
00248
00249 case GNC_TERM_TYPE_PROXIMO:
00250 get_int (notebook->prox_due_day, term, gncBillTermGetDueDays);
00251 get_int (notebook->prox_disc_day, term, gncBillTermGetDiscountDays);
00252 get_numeric (notebook->prox_disc, term, gncBillTermGetDiscount);
00253 get_int (notebook->prox_cutoff, term, gncBillTermGetCutoff);
00254 break;
00255 }
00256 }
00257
00258 static gboolean
00259 verify_term_ok (NewBillTerm *nbt)
00260 {
00261 char *message;
00262 gnc_numeric num;
00263
00264 return TRUE;
00265
00266
00267 num = gnc_numeric_zero ();
00268 if (gnc_numeric_negative_p (num))
00269 {
00270 message = _("Negative amounts are not allowed.");
00271 gnc_error_dialog (nbt->dialog, "%s", message);
00272 return FALSE;
00273 }
00274 if (gnc_numeric_compare (num, gnc_numeric_create (100, 1)) > 0)
00275 {
00276 message = _("Percentage amount must be between 0 and 100.");
00277 gnc_error_dialog (nbt->dialog, "%s", message);
00278 return FALSE;
00279 }
00280 return TRUE;
00281 }
00282
00283 static gboolean
00284 new_billterm_ok_cb (NewBillTerm *nbt)
00285 {
00286 BillTermsWindow *btw;
00287 const char *name = NULL;
00288 char *message;
00289
00290 g_return_val_if_fail (nbt, FALSE);
00291 btw = nbt->btw;
00292
00293
00294
00295
00296 if (nbt->this_term == NULL)
00297 {
00298 name = gtk_entry_get_text (GTK_ENTRY (nbt->name_entry));
00299 if (name == NULL || *name == '\0')
00300 {
00301 message = _("You must provide a name for this Billing Term.");
00302 gnc_error_dialog (nbt->dialog, "%s", message);
00303 return FALSE;
00304 }
00305 if (gncBillTermLookupByName (btw->book, name))
00306 {
00307 message = g_strdup_printf(_(
00308 "You must provide a unique name for this Billing Term. "
00309 "Your choice \"%s\" is already in use."), name);
00310 gnc_error_dialog (nbt->dialog, "%s", message);
00311 g_free (message);
00312 return FALSE;
00313 }
00314 }
00315
00316
00317 if (!verify_term_ok (nbt))
00318 return FALSE;
00319
00320 gnc_suspend_gui_refresh ();
00321
00322
00323 if (nbt->this_term == NULL)
00324 {
00325 nbt->this_term = gncBillTermCreate (btw->book);
00326 gncBillTermBeginEdit (nbt->this_term);
00327 gncBillTermSetName (nbt->this_term, name);
00328
00329 btw->current_term = nbt->this_term;
00330 }
00331 else
00332 gncBillTermBeginEdit (btw->current_term);
00333
00334
00335 if (ui_to_billterm (nbt))
00336 gncBillTermChanged (btw->current_term);
00337
00338
00339 gncBillTermCommitEdit (btw->current_term);
00340
00341 gnc_resume_gui_refresh();
00342 return TRUE;
00343 }
00344
00345 static void
00346 show_notebook (BillTermNB *notebook)
00347 {
00348 g_return_if_fail (notebook->type > 0);
00349 gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook->notebook),
00350 notebook->type - 1);
00351 }
00352
00353 static void
00354 maybe_set_type (NewBillTerm *nbt, GncBillTermType type)
00355 {
00356
00357 if (type == nbt->notebook.type)
00358 return;
00359
00360
00361 nbt->notebook.type = type;
00362 show_notebook (&nbt->notebook);
00363 }
00364
00365 void
00366 billterms_type_combobox_changed (GtkComboBox *cb, gpointer data)
00367 {
00368 NewBillTerm *nbt = data;
00369 gint value;
00370
00371 value = gtk_combo_box_get_active(cb);
00372 maybe_set_type (nbt, value + 1);
00373 }
00374
00375 static GncBillTerm *
00376 new_billterm_dialog (BillTermsWindow *btw, GncBillTerm *term,
00377 const char *name)
00378 {
00379 GncBillTerm *created_term = NULL;
00380 NewBillTerm *nbt;
00381 GladeXML *xml;
00382 GtkWidget *box, *combo_box;
00383 gint response;
00384 gboolean done;
00385 const gchar *dialog_name;
00386
00387 if (!btw) return NULL;
00388
00389 nbt = g_new0 (NewBillTerm, 1);
00390 nbt->btw = btw;
00391 nbt->this_term = term;
00392
00393
00394 dialog_name = term ? "Edit Term Dialog" : "New Term Dialog";
00395 xml = gnc_glade_xml_new ("billterms.glade", dialog_name);
00396 nbt->dialog = glade_xml_get_widget (xml, dialog_name);
00397 nbt->name_entry = glade_xml_get_widget (xml, "name_entry");
00398 nbt->desc_entry = glade_xml_get_widget (xml, "desc_entry");
00399 if (name)
00400 gtk_entry_set_text (GTK_ENTRY (nbt->name_entry), name);
00401
00402
00403 init_notebook_widgets (&nbt->notebook, FALSE,
00404 GTK_DIALOG (nbt->dialog), nbt);
00405
00406
00407 box = glade_xml_get_widget (xml, "notebook_box");
00408 gtk_box_pack_start (GTK_BOX (box), nbt->notebook.notebook, TRUE, TRUE, 0);
00409 g_object_unref (nbt->notebook.notebook);
00410
00411
00412 if (term)
00413 billterm_to_ui (term, nbt->desc_entry, &nbt->notebook);
00414 else
00415 nbt->notebook.type = GNC_TERM_TYPE_DAYS;
00416
00417
00418 combo_box = glade_xml_get_widget (xml, "type_combobox");
00419 gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), nbt->notebook.type - 1);
00420
00421
00422 show_notebook (&nbt->notebook);
00423
00424
00425 glade_xml_signal_autoconnect_full( xml,
00426 gnc_glade_autoconnect_full_func,
00427 nbt);
00428
00429 gtk_window_set_transient_for (GTK_WINDOW(nbt->dialog),
00430 GTK_WINDOW(btw->dialog));
00431
00432
00433 gtk_widget_show_all (nbt->dialog);
00434 if (term)
00435 {
00436 gtk_widget_grab_focus (nbt->desc_entry);
00437 }
00438 else
00439 gtk_widget_grab_focus (nbt->name_entry);
00440
00441 done = FALSE;
00442 while (!done)
00443 {
00444 response = gtk_dialog_run (GTK_DIALOG (nbt->dialog));
00445 switch (response)
00446 {
00447 case GTK_RESPONSE_OK:
00448 if (new_billterm_ok_cb (nbt))
00449 {
00450 created_term = nbt->this_term;
00451 done = TRUE;
00452 }
00453 break;
00454 default:
00455 done = TRUE;
00456 break;
00457 }
00458 }
00459
00460 gtk_widget_destroy(nbt->dialog);
00461 g_free(nbt);
00462
00463 return created_term;
00464 }
00465
00466
00467
00468 static void
00469 billterms_term_refresh (BillTermsWindow *btw)
00470 {
00471 char *type_label;
00472
00473 g_return_if_fail (btw);
00474
00475 if (!btw->current_term)
00476 {
00477 gtk_widget_hide_all (btw->term_vbox);
00478 return;
00479 }
00480
00481 gtk_widget_show_all (btw->term_vbox);
00482 billterm_to_ui (btw->current_term, btw->desc_entry, &btw->notebook);
00483 switch (gncBillTermGetType (btw->current_term))
00484 {
00485 case GNC_TERM_TYPE_DAYS:
00486 type_label = _("Days");
00487 break;
00488 case GNC_TERM_TYPE_PROXIMO:
00489 type_label = _("Proximo");
00490 break;
00491 default:
00492 type_label = _("Unknown");
00493 break;
00494 }
00495 show_notebook (&btw->notebook);
00496 gtk_label_set_text (GTK_LABEL (btw->type_label), type_label);
00497 }
00498
00499 static void
00500 billterms_window_refresh (BillTermsWindow *btw)
00501 {
00502 GList *list, *node;
00503 GncBillTerm *term;
00504 GtkTreeView *view;
00505 GtkListStore *store;
00506 GtkTreeIter iter;
00507 GtkTreePath *path;
00508 GtkTreeSelection *selection;
00509 GtkTreeRowReference *reference = NULL;
00510
00511 g_return_if_fail (btw);
00512 view = GTK_TREE_VIEW (btw->terms_view);
00513 store = GTK_LIST_STORE(gtk_tree_view_get_model(view));
00514
00515
00516 gtk_list_store_clear (store);
00517 gnc_gui_component_clear_watches (btw->component_id);
00518
00519
00520 list = gncBillTermGetTerms (btw->book);
00521
00522
00523 if (list == NULL)
00524 {
00525 btw->current_term = NULL;
00526 billterms_term_refresh (btw);
00527 }
00528 else
00529 {
00530 list = g_list_reverse (g_list_copy (list));
00531 }
00532
00533 for ( node = list; node; node = node->next)
00534 {
00535 term = node->data;
00536 gnc_gui_component_watch_entity (btw->component_id,
00537 gncBillTermGetGUID (term),
00538 QOF_EVENT_MODIFY);
00539
00540 gtk_list_store_prepend(store, &iter);
00541 gtk_list_store_set(store, &iter,
00542 BILL_TERM_COL_NAME, gncBillTermGetName(term),
00543 BILL_TERM_COL_TERM, term,
00544 -1);
00545 if (term == btw->current_term)
00546 {
00547 path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
00548 reference = gtk_tree_row_reference_new(GTK_TREE_MODEL(store), path);
00549 gtk_tree_path_free(path);
00550 }
00551 }
00552
00553 g_list_free (list);
00554
00555 gnc_gui_component_watch_entity_type (btw->component_id,
00556 GNC_BILLTERM_MODULE_NAME,
00557 QOF_EVENT_CREATE | QOF_EVENT_DESTROY);
00558
00559 if (reference)
00560 {
00561 path = gtk_tree_row_reference_get_path(reference);
00562 gtk_tree_row_reference_free(reference);
00563 if (path)
00564 {
00565 selection = gtk_tree_view_get_selection(view);
00566 gtk_tree_selection_select_path(selection, path);
00567 gtk_tree_view_scroll_to_cell(view, path, NULL, TRUE, 0.5, 0.0);
00568 gtk_tree_path_free(path);
00569 }
00570 }
00571 }
00572
00573 static void
00574 billterm_selection_changed (GtkTreeSelection *selection,
00575 BillTermsWindow *btw)
00576 {
00577 GncBillTerm *term = NULL;
00578 GtkTreeModel *model;
00579 GtkTreeIter iter;
00580
00581 g_return_if_fail (btw);
00582
00583 if (gtk_tree_selection_get_selected(selection, &model, &iter))
00584 gtk_tree_model_get(model, &iter, BILL_TERM_COL_TERM, &term, -1);
00585
00586
00587 if (term != btw->current_term)
00588 btw->current_term = term;
00589
00590
00591 billterms_term_refresh (btw);
00592 }
00593
00594 static void
00595 billterm_selection_activated (GtkTreeView *tree_view,
00596 GtkTreePath *path,
00597 GtkTreeViewColumn *column,
00598 BillTermsWindow *btw)
00599 {
00600 new_billterm_dialog (btw, btw->current_term, NULL);
00601 }
00602
00603 void
00604 billterms_new_term_cb (GtkButton *button, BillTermsWindow *btw)
00605 {
00606 g_return_if_fail (btw);
00607 new_billterm_dialog (btw, NULL, NULL);
00608 }
00609
00610 void
00611 billterms_delete_term_cb (GtkButton *button, BillTermsWindow *btw)
00612 {
00613 g_return_if_fail (btw);
00614
00615 if (!btw->current_term)
00616 return;
00617
00618 if (gncBillTermGetRefcount (btw->current_term) > 0)
00619 {
00620 gnc_error_dialog (btw->dialog,
00621 _("Term \"%s\" is in use. You cannot delete it."),
00622 gncBillTermGetName (btw->current_term));
00623 return;
00624 }
00625
00626 if (gnc_verify_dialog (btw->dialog, FALSE,
00627 _("Are you sure you want to delete \"%s\"?"),
00628 gncBillTermGetName (btw->current_term)))
00629 {
00630
00631 gnc_suspend_gui_refresh ();
00632 gncBillTermBeginEdit (btw->current_term);
00633 gncBillTermDestroy (btw->current_term);
00634 btw->current_term = NULL;
00635 gnc_resume_gui_refresh ();
00636 }
00637 }
00638
00639 void
00640 billterms_edit_term_cb (GtkButton *button, BillTermsWindow *btw)
00641 {
00642 g_return_if_fail (btw);
00643 if (!btw->current_term)
00644 return;
00645 new_billterm_dialog (btw, btw->current_term, NULL);
00646 }
00647
00648 static void
00649 billterms_window_refresh_handler (GHashTable *changes, gpointer data)
00650 {
00651 BillTermsWindow *btw = data;
00652
00653 g_return_if_fail (data);
00654 billterms_window_refresh (btw);
00655 }
00656
00657 static void
00658 billterms_window_close_handler (gpointer data)
00659 {
00660 BillTermsWindow *btw = data;
00661 g_return_if_fail (btw);
00662
00663 gtk_widget_destroy (btw->dialog);
00664 }
00665
00666 void
00667 billterms_window_close (GtkWidget *widget, gpointer data)
00668 {
00669 BillTermsWindow *btw = data;
00670
00671 gnc_ui_billterms_window_destroy (btw);
00672 }
00673
00674 void
00675 billterms_window_destroy_cb (GtkWidget *widget, gpointer data)
00676 {
00677 BillTermsWindow *btw = data;
00678
00679 if (!btw) return;
00680
00681 gnc_unregister_gui_component (btw->component_id);
00682
00683 g_free (btw);
00684 }
00685
00686 static gboolean
00687 find_handler (gpointer find_data, gpointer user_data)
00688 {
00689 BillTermsWindow *btw = user_data;
00690 QofBook *book = find_data;
00691
00692 return (btw != NULL && btw->book == book);
00693 }
00694
00695
00696 BillTermsWindow *
00697 gnc_ui_billterms_window_new (QofBook *book)
00698 {
00699 BillTermsWindow *btw;
00700 GladeXML *xml;
00701 GtkWidget *widget;
00702 GtkTreeView *view;
00703 GtkTreeViewColumn *column;
00704 GtkCellRenderer *renderer;
00705 GtkListStore *store;
00706 GtkTreeSelection *selection;
00707
00708 if (!book) return NULL;
00709
00710
00711
00712
00713
00714
00715 btw = gnc_find_first_gui_component (DIALOG_BILLTERMS_CM_CLASS,
00716 find_handler, book);
00717 if (btw)
00718 {
00719 gtk_window_present (GTK_WINDOW(btw->dialog));
00720 return btw;
00721 }
00722
00723
00724 btw = g_new0 (BillTermsWindow, 1);
00725 btw->book = book;
00726
00727
00728 xml = gnc_glade_xml_new ("billterms.glade", "Terms Window");
00729 btw->dialog = glade_xml_get_widget (xml, "Terms Window");
00730 btw->terms_view = glade_xml_get_widget (xml, "terms_view");
00731 btw->desc_entry = glade_xml_get_widget (xml, "desc_entry");
00732 btw->type_label = glade_xml_get_widget (xml, "type_label");
00733 btw->term_vbox = glade_xml_get_widget (xml, "term_vbox");
00734
00735
00736 view = GTK_TREE_VIEW(btw->terms_view);
00737 store = gtk_list_store_new (NUM_BILL_TERM_COLS, G_TYPE_STRING, G_TYPE_POINTER);
00738 gtk_tree_view_set_model(view, GTK_TREE_MODEL(store));
00739 g_object_unref(store);
00740
00741 renderer = gtk_cell_renderer_text_new();
00742 column = gtk_tree_view_column_new_with_attributes("", renderer,
00743 "text", BILL_TERM_COL_NAME,
00744 NULL);
00745 gtk_tree_view_append_column(view, column);
00746
00747 g_signal_connect(view, "row-activated",
00748 G_CALLBACK(billterm_selection_activated), btw);
00749 selection = gtk_tree_view_get_selection(view);
00750 g_signal_connect(selection, "changed",
00751 G_CALLBACK(billterm_selection_changed), btw);
00752
00753
00754 init_notebook_widgets (&btw->notebook, TRUE,
00755 GTK_DIALOG (btw->dialog), btw);
00756
00757
00758 widget = glade_xml_get_widget (xml, "notebook_box");
00759 gtk_box_pack_start (GTK_BOX (widget), btw->notebook.notebook,
00760 TRUE, TRUE, 0);
00761 g_object_unref (btw->notebook.notebook);
00762
00763
00764 glade_xml_signal_autoconnect_full( xml,
00765 gnc_glade_autoconnect_full_func,
00766 btw);
00767
00768
00769 btw->component_id =
00770 gnc_register_gui_component (DIALOG_BILLTERMS_CM_CLASS,
00771 billterms_window_refresh_handler,
00772 billterms_window_close_handler,
00773 btw);
00774
00775 gtk_widget_show_all (btw->dialog);
00776 billterms_window_refresh (btw);
00777
00778 return btw;
00779 }
00780
00781
00782 void
00783 gnc_ui_billterms_window_destroy (BillTermsWindow *btw)
00784 {
00785 if (!btw)
00786 return;
00787
00788 gnc_close_gui_component (btw->component_id);
00789 }
00790
00791 #if 0
00792
00793 GncBillTerm *
00794 gnc_ui_billterms_new_from_name (QofBook *book, const char *name)
00795 {
00796 BillTermsWindow *btw;
00797
00798 if (!book) return NULL;
00799
00800 btw = gnc_ui_billterms_window_new (book);
00801 if (!btw) return NULL;
00802
00803 return new_billterm_dialog (btw, NULL, name);
00804 }
00805 #endif