27 #include <glib/gi18n.h> 28 #include <gdk/gdkkeysyms.h> 30 #include "dialog-utils.h" 31 #include "gnc-amount-edit.h" 33 #include "gnc-component-manager.h" 35 #include "gnc-gui-query.h" 39 #include "dialog-search.h" 40 #include "search-param.h" 42 #include "gnc-addr-quickfill.h" 46 #include "gncCustomerP.h" 48 #include "business-gnome-utils.h" 49 #include "dialog-customer.h" 50 #include "dialog-job.h" 51 #include "dialog-order.h" 52 #include "dialog-invoice.h" 53 #include "dialog-payment.h" 55 #define DIALOG_NEW_CUSTOMER_CM_CLASS "dialog-new-customer" 56 #define DIALOG_EDIT_CUSTOMER_CM_CLASS "dialog-edit-customer" 58 #define GNC_PREFS_GROUP_SEARCH "dialogs.business.customer-search" 60 void gnc_customer_taxtable_check_cb (GtkToggleButton *togglebutton,
63 void gnc_customer_window_ok_cb (GtkWidget *widget, gpointer data);
64 void gnc_customer_window_cancel_cb (GtkWidget *widget, gpointer data);
65 void gnc_customer_window_help_cb (GtkWidget *widget, gpointer data);
66 void gnc_customer_window_destroy_cb (GtkWidget *widget, gpointer data);
67 void gnc_customer_name_changed_cb (GtkWidget *widget, gpointer data);
68 void gnc_customer_terms_changed_cb (GtkWidget *widget, gpointer data);
69 void gnc_customer_taxincluded_changed_cb (GtkWidget *widget, gpointer data);
70 void gnc_customer_taxtable_changed_cb (GtkWidget *widget, gpointer data);
71 void gnc_customer_addr2_insert_cb(GtkEditable *editable,
72 gchar *new_text, gint new_text_length,
73 gint *position, gpointer user_data);
74 void gnc_customer_addr3_insert_cb(GtkEditable *editable,
75 gchar *new_text, gint new_text_length,
76 gint *position, gpointer user_data);
77 void gnc_customer_addr4_insert_cb(GtkEditable *editable,
78 gchar *new_text, gint new_text_length,
79 gint *position, gpointer user_data);
80 void gnc_customer_shipaddr2_insert_cb(GtkEditable *editable,
81 gchar *new_text, gint new_text_length,
82 gint *position, gpointer user_data);
83 void gnc_customer_shipaddr3_insert_cb(GtkEditable *editable,
84 gchar *new_text, gint new_text_length,
85 gint *position, gpointer user_data);
86 void gnc_customer_shipaddr4_insert_cb(GtkEditable *editable,
87 gchar *new_text, gint new_text_length,
88 gint *position, gpointer user_data);
90 gnc_customer_addr2_key_press_cb( GtkEntry *entry, GdkEventKey *event,
93 gnc_customer_addr3_key_press_cb( GtkEntry *entry, GdkEventKey *event,
96 gnc_customer_addr4_key_press_cb( GtkEntry *entry, GdkEventKey *event,
99 gnc_customer_shipaddr2_key_press_cb( GtkEntry *entry, GdkEventKey *event,
100 gpointer user_data );
102 gnc_customer_shipaddr3_key_press_cb( GtkEntry *entry, GdkEventKey *event,
103 gpointer user_data );
105 gnc_customer_shipaddr4_key_press_cb( GtkEntry *entry, GdkEventKey *event,
106 gpointer user_data );
108 #define ADDR_QUICKFILL "GncAddress-Quickfill" 114 } CustomerDialogType;
126 GtkWidget * id_entry;
127 GtkWidget * company_entry;
129 GtkWidget * name_entry;
130 GtkWidget * addr1_entry;
131 GtkWidget * addr2_entry;
132 GtkWidget * addr3_entry;
133 GtkWidget * addr4_entry;
134 GtkWidget * phone_entry;
135 GtkWidget * fax_entry;
136 GtkWidget * email_entry;
138 GtkWidget * shipname_entry;
139 GtkWidget * shipaddr1_entry;
140 GtkWidget * shipaddr2_entry;
141 GtkWidget * shipaddr3_entry;
142 GtkWidget * shipaddr4_entry;
143 GtkWidget * shipphone_entry;
144 GtkWidget * shipfax_entry;
145 GtkWidget * shipemail_entry;
147 GtkWidget * currency_edit;
148 GtkWidget * terms_menu;
149 GtkWidget * discount_amount;
150 GtkWidget * credit_amount;
152 GtkWidget * active_check;
153 GtkWidget * taxincluded_menu;
154 GtkWidget * notes_text;
156 GtkWidget * taxtable_check;
157 GtkWidget * taxtable_menu;
161 CustomerDialogType dialog_type;
170 QuickFill *addr2_quickfill;
171 QuickFill *addr3_quickfill;
172 QuickFill *addr4_quickfill;
173 gint addrX_start_selection;
174 gint addrX_end_selection;
175 guint addrX_selection_source_id;
179 gnc_customer_taxtable_check_cb (GtkToggleButton *togglebutton,
182 CustomerWindow *cw = user_data;
184 if (gtk_toggle_button_get_active (togglebutton))
185 gtk_widget_set_sensitive (cw->taxtable_menu, TRUE);
187 gtk_widget_set_sensitive (cw->taxtable_menu, FALSE);
191 cw_get_customer (CustomerWindow *cw)
196 return gncCustomerLookup (cw->book, &cw->customer_guid);
199 static void gnc_ui_to_customer (CustomerWindow *cw,
GncCustomer *cust)
201 GtkTextBuffer* text_buffer;
202 GtkTextIter start, end;
206 addr = gncCustomerGetAddr (cust);
207 shipaddr = gncCustomerGetShipAddr (cust);
209 gnc_suspend_gui_refresh ();
211 gncCustomerBeginEdit (cust);
213 if (cw->dialog_type == NEW_CUSTOMER)
216 gncCustomerSetID (cust, gtk_entry_get_text (GTK_ENTRY (cw->id_entry)));
217 gncCustomerSetName (cust, gtk_entry_get_text (GTK_ENTRY (cw->company_entry)));
219 gncAddressSetName (addr, gtk_entry_get_text (GTK_ENTRY (cw->name_entry)));
220 gncAddressSetAddr1 (addr, gtk_entry_get_text (GTK_ENTRY (cw->addr1_entry)));
221 gncAddressSetAddr2 (addr, gtk_entry_get_text (GTK_ENTRY (cw->addr2_entry)));
222 gncAddressSetAddr3 (addr, gtk_entry_get_text (GTK_ENTRY (cw->addr3_entry)));
223 gncAddressSetAddr4 (addr, gtk_entry_get_text (GTK_ENTRY (cw->addr4_entry)));
224 gncAddressSetPhone (addr, gtk_entry_get_text (GTK_ENTRY (cw->phone_entry)));
225 gncAddressSetFax (addr, gtk_entry_get_text (GTK_ENTRY (cw->fax_entry)));
226 gncAddressSetEmail (addr, gtk_entry_get_text (GTK_ENTRY (cw->email_entry)));
227 gncAddressSetName (shipaddr, gtk_entry_get_text (GTK_ENTRY (cw->shipname_entry)));
228 gncAddressSetAddr1 (shipaddr, gtk_entry_get_text (GTK_ENTRY (cw->shipaddr1_entry)));
229 gncAddressSetAddr2 (shipaddr, gtk_entry_get_text (GTK_ENTRY (cw->shipaddr2_entry)));
230 gncAddressSetAddr3 (shipaddr, gtk_entry_get_text (GTK_ENTRY (cw->shipaddr3_entry)));
231 gncAddressSetAddr4 (shipaddr, gtk_entry_get_text (GTK_ENTRY (cw->shipaddr4_entry)));
232 gncAddressSetPhone (shipaddr, gtk_entry_get_text (GTK_ENTRY (cw->shipphone_entry)));
233 gncAddressSetFax (shipaddr, gtk_entry_get_text (GTK_ENTRY (cw->shipfax_entry)));
234 gncAddressSetEmail (shipaddr, gtk_entry_get_text (GTK_ENTRY (cw->shipemail_entry)));
236 gncCustomerSetActive (cust, gtk_toggle_button_get_active
237 (GTK_TOGGLE_BUTTON (cw->active_check)));
238 gncCustomerSetTaxIncluded (cust, cw->taxincluded);
240 text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(cw->notes_text));
241 gtk_text_buffer_get_bounds (text_buffer, &start, &end);
242 text = gtk_text_buffer_get_text (text_buffer, &start, &end, FALSE);
243 gncCustomerSetNotes (cust, text);
246 gncCustomerSetCurrency (cust,
248 (cw->currency_edit)));
249 gncCustomerSetTerms (cust, cw->terms);
250 gncCustomerSetDiscount (cust, gnc_amount_edit_get_amount
251 (GNC_AMOUNT_EDIT (cw->discount_amount)));
252 gncCustomerSetCredit (cust, gnc_amount_edit_get_amount
253 (GNC_AMOUNT_EDIT (cw->credit_amount)));
255 gncCustomerSetTaxTableOverride
256 (cust, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cw->taxtable_check)));
257 gncCustomerSetTaxTable (cust, cw->taxtable);
259 gncCustomerCommitEdit (cust);
260 gnc_resume_gui_refresh ();
264 static gboolean check_edit_amount (GtkWidget *amount,
265 gnc_numeric *min, gnc_numeric *max,
266 const char * error_message)
268 GError *error = NULL;
269 if (!gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT (amount), &error))
272 g_error_free (error);
278 gnc_numeric val = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (amount));
290 static gboolean check_entry_nonempty (GtkWidget *entry,
291 const char * error_message)
293 const char *res = gtk_entry_get_text (GTK_ENTRY (entry));
294 if (g_strcmp0 (res,
"") == 0)
304 gnc_customer_window_ok_cb (GtkWidget *widget, gpointer data)
306 CustomerWindow *cw = data;
307 gnc_numeric min, max;
309 gnc_commodity *currency;
313 if (check_entry_nonempty (cw->company_entry,
314 _(
"The Company Name field cannot be left blank, please " 315 "enter a company name or a person's name.")))
319 min = gnc_numeric_zero ();
320 max = gnc_numeric_create (100, 1);
322 if (check_edit_amount (cw->discount_amount, &min, &max,
323 _(
"Discount percentage must be between 0-100 " 324 "or you must leave it blank.")))
328 print_info = gnc_commodity_print_info (currency, FALSE);
329 gnc_amount_edit_set_print_info (GNC_AMOUNT_EDIT (cw->credit_amount), print_info);
330 gnc_amount_edit_set_fraction (GNC_AMOUNT_EDIT (cw->credit_amount),
333 if (check_edit_amount (cw->credit_amount, &min, NULL,
334 _(
"Credit must be a positive amount or " 335 "you must leave it blank.")))
339 if (g_strcmp0 (gtk_entry_get_text (GTK_ENTRY (cw->id_entry)),
"") == 0)
341 string = gncCustomerNextID (cw->book);
342 gtk_entry_set_text (GTK_ENTRY (cw->id_entry),
string);
351 gnc_ui_to_customer (cw, customer);
353 cw->created_customer = customer;
357 gnc_close_gui_component (cw->component_id);
361 gnc_customer_window_cancel_cb (GtkWidget *widget, gpointer data)
363 CustomerWindow *cw = data;
365 gnc_close_gui_component (cw->component_id);
369 gnc_customer_window_help_cb (GtkWidget *widget, gpointer data)
371 CustomerWindow *cw = data;
372 gnc_gnome_help (GTK_WINDOW(cw->dialog), DF_MANUAL, DL_USAGE_CUSTOMER);
376 gnc_customer_window_destroy_cb (GtkWidget *widget, gpointer data)
378 CustomerWindow *cw = data;
381 gnc_suspend_gui_refresh ();
383 if (cw->dialog_type == NEW_CUSTOMER && customer != NULL)
385 gncCustomerBeginEdit (customer);
386 gncCustomerDestroy (customer);
390 if (cw->addrX_selection_source_id)
391 g_source_remove (cw->addrX_selection_source_id);
393 gnc_unregister_gui_component (cw->component_id);
394 gnc_resume_gui_refresh ();
400 gnc_customer_name_changed_cb (GtkWidget *widget, gpointer data)
402 CustomerWindow *cw = data;
406 gnc_owner_window_set_title (GTK_WINDOW (cw->dialog),
407 (cw->dialog_type == EDIT_CUSTOMER) ?
408 _(
"Edit Customer") : _(
"New Customer"),
409 cw->company_entry, cw->id_entry);
413 gnc_customer_terms_changed_cb (GtkWidget *widget, gpointer data)
415 GtkComboBox *cbox = GTK_COMBO_BOX (widget);
416 CustomerWindow *cw = data;
421 cw->terms = gnc_simple_combo_get_value (cbox);
425 gnc_customer_taxincluded_changed_cb (GtkWidget *widget, gpointer data)
427 GtkComboBox *cbox = GTK_COMBO_BOX (widget);
428 CustomerWindow *cw = data;
433 cw->taxincluded = GPOINTER_TO_INT (gnc_simple_combo_get_value (cbox));
437 gnc_customer_taxtable_changed_cb (GtkWidget *widget, gpointer data)
439 GtkComboBox *cbox = GTK_COMBO_BOX (widget);
440 CustomerWindow *cw = data;
445 cw->taxtable = gnc_simple_combo_get_value (cbox);
449 gnc_customer_window_close_handler (gpointer user_data)
451 CustomerWindow *cw = user_data;
453 gtk_widget_destroy (cw->dialog);
459 gnc_customer_window_refresh_handler (GHashTable *changes, gpointer user_data)
461 CustomerWindow *cw = user_data;
468 gnc_close_gui_component (cw->component_id);
475 info = gnc_gui_get_entity_events (changes, &cw->customer_guid);
476 if (info && (info->event_mask & QOF_EVENT_DESTROY))
478 gnc_close_gui_component (cw->component_id);
485 find_handler (gpointer
find_data, gpointer user_data)
488 CustomerWindow *cw = user_data;
490 return(cw &&
guid_equal(&cw->customer_guid, customer_guid));
493 static CustomerWindow *
494 gnc_customer_new_window (GtkWindow *parent, QofBook *bookp,
GncCustomer *cust)
498 GtkWidget *hbox, *edit;
499 gnc_commodity *currency;
511 cw = gnc_find_first_gui_component (DIALOG_EDIT_CUSTOMER_CM_CLASS,
512 find_handler, &customer_guid);
515 gtk_window_set_transient_for (GTK_WINDOW(cw->dialog), parent);
516 gtk_window_present (GTK_WINDOW(cw->dialog));
523 currency = gncCustomerGetCurrency (cust);
530 cw = g_new0 (CustomerWindow, 1);
535 builder = gtk_builder_new();
536 gnc_builder_add_from_file (builder,
"dialog-customer.glade",
"terms_store");
537 gnc_builder_add_from_file (builder,
"dialog-customer.glade",
"tax_included_store");
538 gnc_builder_add_from_file (builder,
"dialog-customer.glade",
"taxtable_store");
539 gnc_builder_add_from_file (builder,
"dialog-customer.glade",
"customer_dialog");
540 cw->dialog = GTK_WIDGET (gtk_builder_get_object (builder,
"customer_dialog"));
541 gtk_window_set_transient_for (GTK_WINDOW(cw->dialog), parent);
544 gtk_widget_set_name (GTK_WIDGET(cw->dialog),
"gnc-id-customer");
545 gnc_widget_style_context_add_class (GTK_WIDGET(cw->dialog),
"gnc-class-customers");
547 g_object_set_data (G_OBJECT (cw->dialog),
"dialog_info", cw);
550 cw->id_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"id_entry"));
551 cw->company_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"company_entry"));
553 cw->name_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"name_entry"));
554 cw->addr1_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"addr1_entry"));
555 cw->addr2_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"addr2_entry"));
556 cw->addr3_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"addr3_entry"));
557 cw->addr4_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"addr4_entry"));
558 cw->phone_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"phone_entry"));
559 cw->fax_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"fax_entry"));
560 cw->email_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"email_entry"));
562 cw->shipname_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"shipname_entry"));
563 cw->shipaddr1_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"shipaddr1_entry"));
564 cw->shipaddr2_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"shipaddr2_entry"));
565 cw->shipaddr3_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"shipaddr3_entry"));
566 cw->shipaddr4_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"shipaddr4_entry"));
567 cw->shipphone_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"shipphone_entry"));
568 cw->shipfax_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"shipfax_entry"));
569 cw->shipemail_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"shipemail_entry"));
571 cw->active_check = GTK_WIDGET (gtk_builder_get_object (builder,
"active_check"));
572 cw->taxincluded_menu = GTK_WIDGET (gtk_builder_get_object (builder,
"tax_included_menu"));
573 cw->notes_text = GTK_WIDGET (gtk_builder_get_object (builder,
"notes_text"));
575 cw->terms_menu = GTK_WIDGET (gtk_builder_get_object (builder,
"terms_menu"));
577 cw->taxtable_check = GTK_WIDGET (gtk_builder_get_object (builder,
"taxtable_button"));
578 cw->taxtable_menu = GTK_WIDGET (gtk_builder_get_object (builder,
"taxtable_menu"));
583 cw->currency_edit = edit;
585 hbox = GTK_WIDGET (gtk_builder_get_object (builder,
"currency_box"));
586 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
589 edit = gnc_amount_edit_new();
590 gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (edit), TRUE);
591 print_info = gnc_integral_print_info ();
592 print_info.max_decimal_places = 5;
593 gnc_amount_edit_set_print_info (GNC_AMOUNT_EDIT (edit), print_info);
594 gnc_amount_edit_set_fraction (GNC_AMOUNT_EDIT (edit), 100000);
595 cw->discount_amount = edit;
596 gtk_widget_show (edit);
598 hbox = GTK_WIDGET (gtk_builder_get_object (builder,
"discount_box"));
599 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
602 edit = gnc_amount_edit_new();
603 print_info = gnc_commodity_print_info (currency, FALSE);
604 gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (edit), TRUE);
605 gnc_amount_edit_set_print_info (GNC_AMOUNT_EDIT (edit), print_info);
606 gnc_amount_edit_set_fraction (GNC_AMOUNT_EDIT (edit),
608 cw->credit_amount = edit;
609 gtk_widget_show (edit);
611 hbox = GTK_WIDGET (gtk_builder_get_object (builder,
"credit_box"));
612 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
615 gtk_builder_connect_signals_full( builder,
616 gnc_builder_connect_full_func,
622 GtkTextBuffer* text_buffer;
626 cw->dialog_type = EDIT_CUSTOMER;
629 addr = gncCustomerGetAddr (cust);
630 shipaddr = gncCustomerGetShipAddr (cust);
632 gtk_entry_set_text (GTK_ENTRY (cw->id_entry), gncCustomerGetID (cust));
633 gtk_entry_set_text (GTK_ENTRY (cw->company_entry), gncCustomerGetName (cust));
636 gtk_entry_set_text (GTK_ENTRY (cw->name_entry), gncAddressGetName (addr));
637 gtk_entry_set_text (GTK_ENTRY (cw->addr1_entry), gncAddressGetAddr1 (addr));
638 gtk_entry_set_text (GTK_ENTRY (cw->addr2_entry), gncAddressGetAddr2 (addr));
639 gtk_entry_set_text (GTK_ENTRY (cw->addr3_entry), gncAddressGetAddr3 (addr));
640 gtk_entry_set_text (GTK_ENTRY (cw->addr4_entry), gncAddressGetAddr4 (addr));
641 gtk_entry_set_text (GTK_ENTRY (cw->phone_entry), gncAddressGetPhone (addr));
642 gtk_entry_set_text (GTK_ENTRY (cw->fax_entry), gncAddressGetFax (addr));
643 gtk_entry_set_text (GTK_ENTRY (cw->email_entry), gncAddressGetEmail (addr));
646 gtk_entry_set_text (GTK_ENTRY (cw->shipname_entry), gncAddressGetName (shipaddr));
647 gtk_entry_set_text (GTK_ENTRY (cw->shipaddr1_entry), gncAddressGetAddr1 (shipaddr));
648 gtk_entry_set_text (GTK_ENTRY (cw->shipaddr2_entry), gncAddressGetAddr2 (shipaddr));
649 gtk_entry_set_text (GTK_ENTRY (cw->shipaddr3_entry), gncAddressGetAddr3 (shipaddr));
650 gtk_entry_set_text (GTK_ENTRY (cw->shipaddr4_entry), gncAddressGetAddr4 (shipaddr));
651 gtk_entry_set_text (GTK_ENTRY (cw->shipphone_entry), gncAddressGetPhone (shipaddr));
652 gtk_entry_set_text (GTK_ENTRY (cw->shipfax_entry), gncAddressGetFax (shipaddr));
653 gtk_entry_set_text (GTK_ENTRY (cw->shipemail_entry), gncAddressGetEmail (shipaddr));
656 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cw->active_check),
657 gncCustomerGetActive (cust));
659 string = gncCustomerGetNotes (cust);
660 text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(cw->notes_text));
661 gtk_text_buffer_set_text (text_buffer,
string, -1);
664 gnc_register_gui_component (DIALOG_EDIT_CUSTOMER_CM_CLASS,
665 gnc_customer_window_refresh_handler,
666 gnc_customer_window_close_handler,
668 cw->terms = gncCustomerGetTerms (cust);
673 cust = gncCustomerCreate (bookp);
676 cw->dialog_type = NEW_CUSTOMER;
678 gnc_register_gui_component (DIALOG_NEW_CUSTOMER_CM_CLASS,
679 gnc_customer_window_refresh_handler,
680 gnc_customer_window_close_handler,
689 cw->taxincluded = gncCustomerGetTaxIncluded (cust);
690 gnc_taxincluded_combo (GTK_COMBO_BOX(cw->taxincluded_menu), cw->taxincluded);
691 gnc_billterms_combo (GTK_COMBO_BOX(cw->terms_menu), bookp, TRUE, cw->terms);
693 cw->taxtable = gncCustomerGetTaxTable (cust);
694 gnc_taxtables_combo (GTK_COMBO_BOX(cw->taxtable_menu), bookp, TRUE, cw->taxtable);
695 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cw->taxtable_check),
696 gncCustomerGetTaxTableOverride (cust));
697 gnc_customer_taxtable_check_cb (GTK_TOGGLE_BUTTON (cw->taxtable_check), cw);
705 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (cw->discount_amount),
706 gncCustomerGetDiscount (cust));
707 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (cw->credit_amount),
708 gncCustomerGetCredit (cust));
710 gnc_gui_component_watch_entity_type (cw->component_id,
711 GNC_CUSTOMER_MODULE_NAME,
712 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
714 gtk_widget_show_all (cw->dialog);
715 g_object_unref(G_OBJECT(builder));
721 gnc_ui_customer_edit (GtkWindow *parent,
GncCustomer *cust)
725 if (!cust)
return NULL;
727 cw = gnc_customer_new_window (parent, gncCustomerGetBook(cust), cust);
733 gnc_ui_customer_new (GtkWindow *parent, QofBook *bookp)
738 if (!bookp)
return NULL;
740 cw = gnc_customer_new_window (parent, bookp, NULL);
748 invoice_customer_cb (GtkWindow *dialog, gpointer *cust_p, gpointer user_data)
754 g_return_if_fail (cust_p && user_data);
761 gncOwnerInitCustomer (&owner, cust);
762 gnc_invoice_search (dialog, NULL, &owner, sw->book);
767 order_customer_cb (GtkWindow *dialog, gpointer *cust_p, gpointer user_data)
773 g_return_if_fail (cust_p && user_data);
780 gncOwnerInitCustomer (&owner, cust);
781 gnc_order_search (dialog, NULL, &owner, sw->book);
786 jobs_customer_cb (GtkWindow *dialog, gpointer *cust_p, gpointer user_data)
792 g_return_if_fail (cust_p && user_data);
799 gncOwnerInitCustomer (&owner, cust);
800 gnc_job_search (dialog, NULL, &owner, sw->book);
805 payment_customer_cb (GtkWindow *dialog, gpointer *cust_p, gpointer user_data)
811 g_return_if_fail (cust_p && user_data);
818 gncOwnerInitCustomer (&owner, cust);
819 gnc_ui_payment_new (dialog, &owner, sw->book);
824 edit_customer_cb (GtkWindow *dialog, gpointer *cust_p, gpointer user_data)
828 g_return_if_fail (cust_p);
834 gnc_ui_customer_edit (dialog, cust);
840 new_customer_cb (GtkWindow *dialog, gpointer user_data)
845 g_return_val_if_fail (sw, NULL);
847 cw = gnc_ui_customer_new (dialog, sw->book);
848 return cw_get_customer (cw);
852 free_userdata_cb (gpointer user_data)
856 g_return_if_fail (sw);
863 gnc_customer_search (GtkWindow *parent,
GncCustomer *start, QofBook *book)
866 QofIdType type = GNC_CUSTOMER_MODULE_NAME;
868 static GList *params = NULL;
869 static GList *columns = NULL;
872 { N_(
"View/Edit Customer"), edit_customer_cb, NULL, TRUE},
873 { N_(
"Customer's Jobs"), jobs_customer_cb, NULL, TRUE},
875 { N_(
"Customer's Invoices"), invoice_customer_cb, NULL, TRUE},
876 { N_(
"Process Payment"), payment_customer_cb, NULL, FALSE},
879 (void)order_customer_cb;
881 g_return_val_if_fail (book, NULL);
886 params = gnc_search_param_prepend (params, _(
"Shipping Contact"), NULL, type,
887 CUSTOMER_SHIPADDR, ADDRESS_NAME, NULL);
888 params = gnc_search_param_prepend (params, _(
"Billing Contact"), NULL, type,
889 CUSTOMER_ADDR, ADDRESS_NAME, NULL);
890 params = gnc_search_param_prepend (params, _(
"Customer ID"), NULL, type,
892 params = gnc_search_param_prepend (params, _(
"Company Name"), NULL, type,
893 CUSTOMER_NAME, NULL);
899 columns = gnc_search_param_prepend (columns, _(
"Shipping Contact"), NULL, type,
900 CUSTOMER_SHIPADDR, ADDRESS_NAME, NULL);
901 columns = gnc_search_param_prepend (columns, _(
"Contact"), NULL, type,
902 CUSTOMER_ADDR, ADDRESS_NAME, NULL);
903 columns = gnc_search_param_prepend (columns, _(
"Company"), NULL, type,
904 CUSTOMER_NAME, NULL);
905 columns = gnc_search_param_prepend (columns, _(
"ID #"), NULL, type,
910 q = qof_query_create_for (type);
928 return gnc_search_dialog_create (parent, type, _(
"Find Customer"),
929 params, columns, q, q2, buttons, NULL,
930 new_customer_cb, sw, free_userdata_cb,
931 GNC_PREFS_GROUP_SEARCH, NULL,
932 "gnc-class-customers");
936 gnc_customer_search_select (GtkWindow *parent, gpointer start, gpointer book)
938 if (!book)
return NULL;
940 return gnc_customer_search (parent, start, book);
944 gnc_customer_search_edit (GtkWindow *parent, gpointer start, gpointer book)
947 gnc_ui_customer_edit (parent, start);
953 idle_select_region_addr2(gpointer user_data)
955 CustomerWindow *wdata = user_data;
956 g_return_val_if_fail(user_data, FALSE);
960 gtk_editable_select_region(GTK_EDITABLE(wdata->addr2_entry),
961 wdata->addrX_start_selection,
962 wdata->addrX_end_selection);
964 wdata->addrX_selection_source_id = 0;
969 idle_select_region_addr3(gpointer user_data)
971 CustomerWindow *wdata = user_data;
972 g_return_val_if_fail(user_data, FALSE);
974 gtk_editable_select_region(GTK_EDITABLE(wdata->addr3_entry),
975 wdata->addrX_start_selection,
976 wdata->addrX_end_selection);
978 wdata->addrX_selection_source_id = 0;
982 idle_select_region_addr4(gpointer user_data)
984 CustomerWindow *wdata = user_data;
985 g_return_val_if_fail(user_data, FALSE);
987 gtk_editable_select_region(GTK_EDITABLE(wdata->addr4_entry),
988 wdata->addrX_start_selection,
989 wdata->addrX_end_selection);
990 wdata->addrX_selection_source_id = 0;
995 idle_select_region_shipaddr2(gpointer user_data)
997 CustomerWindow *wdata = user_data;
998 g_return_val_if_fail(user_data, FALSE);
1000 gtk_editable_select_region(GTK_EDITABLE(wdata->shipaddr2_entry),
1001 wdata->addrX_start_selection,
1002 wdata->addrX_end_selection);
1004 wdata->addrX_selection_source_id = 0;
1009 idle_select_region_shipaddr3(gpointer user_data)
1011 CustomerWindow *wdata = user_data;
1012 g_return_val_if_fail(user_data, FALSE);
1014 gtk_editable_select_region(GTK_EDITABLE(wdata->shipaddr3_entry),
1015 wdata->addrX_start_selection,
1016 wdata->addrX_end_selection);
1018 wdata->addrX_selection_source_id = 0;
1022 idle_select_region_shipaddr4(gpointer user_data)
1024 CustomerWindow *wdata = user_data;
1025 g_return_val_if_fail(user_data, FALSE);
1027 gtk_editable_select_region(GTK_EDITABLE(wdata->shipaddr4_entry),
1028 wdata->addrX_start_selection,
1029 wdata->addrX_end_selection);
1030 wdata->addrX_selection_source_id = 0;
1037 gnc_customer_addr_common_insert_cb(GtkEditable *editable,
1038 gchar *new_text, gint new_text_length,
1039 gint *position, gpointer user_data, QuickFill *qf)
1041 CustomerWindow *wdata = user_data;
1042 gchar *concatenated_text;
1044 gint prefix_len, concatenated_text_len;
1046 if (new_text_length <= 0)
1052 gchar *suffix = gtk_editable_get_chars(editable, *position, -1);
1063 gchar *prefix = gtk_editable_get_chars(editable, 0, *position);
1064 prefix_len = strlen(prefix);
1065 concatenated_text = g_strconcat(prefix, new_text, (gchar*) NULL);
1066 concatenated_text_len = prefix_len + new_text_length;
1071 g_free(concatenated_text);
1077 gint match_str_len = strlen(match_str);
1078 if (match_str_len > concatenated_text_len)
1082 g_signal_handlers_block_matched (G_OBJECT (editable),
1083 G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, user_data);
1085 gtk_editable_insert_text(editable,
1086 match_str + prefix_len,
1087 match_str_len - prefix_len,
1090 g_signal_handlers_unblock_matched (G_OBJECT (editable),
1091 G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, user_data);
1094 g_signal_stop_emission_by_name (G_OBJECT (editable),
"insert_text");
1097 *position = concatenated_text_len;
1101 wdata->addrX_start_selection = *position;
1102 wdata->addrX_end_selection = -1;
1111 void gnc_customer_addr2_insert_cb(GtkEditable *editable,
1112 gchar *new_text, gint new_text_length,
1113 gint *position, gpointer user_data)
1115 CustomerWindow *wdata = user_data;
1120 r = gnc_customer_addr_common_insert_cb(editable, new_text, new_text_length,
1121 position, user_data, wdata->addr2_quickfill);
1128 wdata->addrX_selection_source_id = g_idle_add(idle_select_region_addr2,
1133 void gnc_customer_addr3_insert_cb(GtkEditable *editable,
1134 gchar *new_text, gint new_text_length,
1135 gint *position, gpointer user_data)
1137 CustomerWindow *wdata = user_data;
1142 r = gnc_customer_addr_common_insert_cb(editable, new_text, new_text_length,
1143 position, user_data, wdata->addr3_quickfill);
1148 wdata->addrX_selection_source_id = g_idle_add(idle_select_region_addr3,
1153 void gnc_customer_addr4_insert_cb(GtkEditable *editable,
1154 gchar *new_text, gint new_text_length,
1155 gint *position, gpointer user_data)
1157 CustomerWindow *wdata = user_data;
1162 r = gnc_customer_addr_common_insert_cb(editable, new_text, new_text_length,
1163 position, user_data, wdata->addr4_quickfill);
1168 wdata->addrX_selection_source_id = g_idle_add(idle_select_region_addr4,
1173 void gnc_customer_shipaddr2_insert_cb(GtkEditable *editable,
1174 gchar *new_text, gint new_text_length,
1175 gint *position, gpointer user_data)
1177 CustomerWindow *wdata = user_data;
1182 r = gnc_customer_addr_common_insert_cb(editable, new_text, new_text_length,
1183 position, user_data, wdata->addr2_quickfill);
1188 wdata->addrX_selection_source_id = g_idle_add(idle_select_region_shipaddr2,
1193 void gnc_customer_shipaddr3_insert_cb(GtkEditable *editable,
1194 gchar *new_text, gint new_text_length,
1195 gint *position, gpointer user_data)
1197 CustomerWindow *wdata = user_data;
1202 r = gnc_customer_addr_common_insert_cb(editable, new_text, new_text_length,
1203 position, user_data, wdata->addr3_quickfill);
1208 wdata->addrX_selection_source_id = g_idle_add(idle_select_region_shipaddr3,
1213 void gnc_customer_shipaddr4_insert_cb(GtkEditable *editable,
1214 gchar *new_text, gint new_text_length,
1215 gint *position, gpointer user_data)
1217 CustomerWindow *wdata = user_data;
1222 r = gnc_customer_addr_common_insert_cb(editable, new_text, new_text_length,
1223 position, user_data, wdata->addr4_quickfill);
1228 wdata->addrX_selection_source_id = g_idle_add(idle_select_region_shipaddr4,
1234 gnc_customer_common_key_press_cb( GtkEntry *entry,
1236 gpointer user_data, GtkWidget* editable )
1238 gboolean done_with_input = FALSE;
1244 switch ( event->keyval )
1247 case GDK_KEY_ISO_Left_Tab:
1248 if ( !( event->state & GDK_SHIFT_MASK) )
1254 gtk_editable_select_region( GTK_EDITABLE(editable),
1260 return( done_with_input );
1263 gnc_customer_addr2_key_press_cb( GtkEntry *entry,
1265 gpointer user_data )
1267 CustomerWindow *wdata = user_data;
1268 return gnc_customer_common_key_press_cb(entry, event, user_data,
1269 wdata->addr2_entry);
1272 gnc_customer_addr3_key_press_cb( GtkEntry *entry,
1274 gpointer user_data )
1276 CustomerWindow *wdata = user_data;
1277 return gnc_customer_common_key_press_cb(entry, event, user_data,
1278 wdata->addr3_entry);
1281 gnc_customer_addr4_key_press_cb( GtkEntry *entry,
1283 gpointer user_data )
1285 CustomerWindow *wdata = user_data;
1286 return gnc_customer_common_key_press_cb(entry, event, user_data,
1287 wdata->addr4_entry);
1290 gnc_customer_shipaddr2_key_press_cb( GtkEntry *entry,
1292 gpointer user_data )
1294 CustomerWindow *wdata = user_data;
1295 return gnc_customer_common_key_press_cb(entry, event, user_data,
1296 wdata->shipaddr2_entry);
1299 gnc_customer_shipaddr3_key_press_cb( GtkEntry *entry,
1301 gpointer user_data )
1303 CustomerWindow *wdata = user_data;
1304 return gnc_customer_common_key_press_cb(entry, event, user_data,
1305 wdata->shipaddr3_entry);
1308 gnc_customer_shipaddr4_key_press_cb( GtkEntry *entry,
1310 gpointer user_data )
1312 CustomerWindow *wdata = user_data;
1313 return gnc_customer_common_key_press_cb(entry, event, user_data,
1314 wdata->shipaddr4_entry);
int gnc_commodity_get_fraction(const gnc_commodity *cm)
Retrieve the fraction for the specified commodity.
void gnc_currency_edit_set_currency(GNCCurrencyEdit *gce, const gnc_commodity *currency)
Set the widget to display a certain currency name.
utility functions for the GnuCash UI
GncTaxIncluded
How to interpret the TaxIncluded.
QofQuery * qof_query_copy(QofQuery *q)
Make a copy of the indicated query.
int gnc_numeric_compare(gnc_numeric a, gnc_numeric b)
Returns 1 if a>b, -1 if b>a, 0 if a == b.
GtkWindow * gnc_ui_get_gtk_window(GtkWidget *widget)
Get a pointer to the widget's immediate top level GtkWindow.
gnc_commodity * gnc_default_currency(void)
Return the default currency set by the user.
const gchar * QofIdType
QofIdType declaration.
Currency selection widget.
void qof_query_destroy(QofQuery *query)
Frees the resources associate with a Query object.
void gnc_gnome_help(GtkWindow *parent, const char *file_name, const char *anchor)
Launch the systems default help browser, gnome's yelp for linux, and open to a given link within a gi...
gboolean guid_equal(const GncGUID *guid_1, const GncGUID *guid_2)
Given two GUIDs, return TRUE if they are non-NULL and equal.
QuickFill * gnc_get_shared_address_addr3_quickfill(QofBook *book, const char *key)
Create/fetch a quickfill GncAddress description strings on the Addr3 part.
void qof_query_set_book(QofQuery *query, QofBook *book)
Set the book to be searched.
gnc_commodity * gnc_currency_edit_get_currency(GNCCurrencyEdit *gce)
Retrieve the displayed currency of the widget.
QuickFill * gnc_quickfill_get_string_match(QuickFill *qf, const char *str)
Return a subnode in the tree whose strings all match the string 'str' as the next substring...
#define gncCustomerGetGUID(x)
void qof_query_add_guid_match(QofQuery *q, QofQueryParamList *param_list, const GncGUID *guid, QofQueryOp op)
DOCUMENT ME !!
credit, discount and shipaddr are unique to GncCustomer id, name, notes, terms, addr, currency, taxtable, taxtable_override taxincluded, active and jobs are identical to ::GncVendor.
const char * gnc_quickfill_string(QuickFill *qf)
For the given node 'qf', return the best-guess matching string.
GtkWidget * gnc_currency_edit_new(void)
Create a new GNCCurrencyEdit widget which can be used to provide an easy way to enter ISO currency co...
QuickFill * gnc_get_shared_address_addr2_quickfill(QofBook *book, const char *key)
Similar to the Account Names account name quickfill, we create a cached quickfill with the address li...
const GncGUID * guid_null(void)
Returns a GncGUID which is guaranteed to never reference any entity.
QuickFill is used to auto-complete typed user entries.
QuickFill * gnc_get_shared_address_addr4_quickfill(QofBook *book, const char *key)
Create/fetch a quickfill GncAddress description strings on the Addr4 part.
void qof_event_gen(QofInstance *entity, QofEventId event_id, gpointer event_data)
Invoke all registered event handlers using the given arguments.
The type used to store guids in C.
modtime is the internal date of the last modtime See libgnucash/engine/TaxTableBillTermImmutability.txt for an explanation of the following Code that handles refcount, parent, child, invisible and children is identical to that in ::GncBillTerm