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 "app-utils/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;
173 gint addrX_start_selection;
174 gint addrX_end_selection;
175 guint addrX_selection_source_id;
179 gnc_customer_taxtable_check_cb (GtkToggleButton *togglebutton,
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);
196 return gncCustomerLookup (cw->book, &cw->customer_guid);
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_editable_get_chars
217 (GTK_EDITABLE (cw->id_entry), 0, -1));
218 gncCustomerSetName (cust, gtk_editable_get_chars
219 (GTK_EDITABLE (cw->company_entry), 0, -1));
221 gncAddressSetName (addr, gtk_editable_get_chars
222 (GTK_EDITABLE (cw->name_entry), 0, -1));
223 gncAddressSetAddr1 (addr, gtk_editable_get_chars
224 (GTK_EDITABLE (cw->addr1_entry), 0, -1));
225 gncAddressSetAddr2 (addr, gtk_editable_get_chars
226 (GTK_EDITABLE (cw->addr2_entry), 0, -1));
227 gncAddressSetAddr3 (addr, gtk_editable_get_chars
228 (GTK_EDITABLE (cw->addr3_entry), 0, -1));
229 gncAddressSetAddr4 (addr, gtk_editable_get_chars
230 (GTK_EDITABLE (cw->addr4_entry), 0, -1));
231 gncAddressSetPhone (addr, gtk_editable_get_chars
232 (GTK_EDITABLE (cw->phone_entry), 0, -1));
233 gncAddressSetFax (addr, gtk_editable_get_chars
234 (GTK_EDITABLE (cw->fax_entry), 0, -1));
235 gncAddressSetEmail (addr, gtk_editable_get_chars
236 (GTK_EDITABLE (cw->email_entry), 0, -1));
238 gncAddressSetName (shipaddr, gtk_editable_get_chars
239 (GTK_EDITABLE (cw->shipname_entry), 0, -1));
240 gncAddressSetAddr1 (shipaddr, gtk_editable_get_chars
241 (GTK_EDITABLE (cw->shipaddr1_entry), 0, -1));
242 gncAddressSetAddr2 (shipaddr, gtk_editable_get_chars
243 (GTK_EDITABLE (cw->shipaddr2_entry), 0, -1));
244 gncAddressSetAddr3 (shipaddr, gtk_editable_get_chars
245 (GTK_EDITABLE (cw->shipaddr3_entry), 0, -1));
246 gncAddressSetAddr4 (shipaddr, gtk_editable_get_chars
247 (GTK_EDITABLE (cw->shipaddr4_entry), 0, -1));
248 gncAddressSetPhone (shipaddr, gtk_editable_get_chars
249 (GTK_EDITABLE (cw->shipphone_entry), 0, -1));
250 gncAddressSetFax (shipaddr, gtk_editable_get_chars
251 (GTK_EDITABLE (cw->shipfax_entry), 0, -1));
252 gncAddressSetEmail (shipaddr, gtk_editable_get_chars
253 (GTK_EDITABLE (cw->shipemail_entry), 0, -1));
255 gncCustomerSetActive (cust, gtk_toggle_button_get_active
256 (GTK_TOGGLE_BUTTON (cw->active_check)));
257 gncCustomerSetTaxIncluded (cust, cw->taxincluded);
259 text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(cw->notes_text));
260 gtk_text_buffer_get_bounds (text_buffer, &start, &end);
261 text = gtk_text_buffer_get_text (text_buffer, &start, &end, FALSE);
262 gncCustomerSetNotes (cust, text);
265 gncCustomerSetCurrency (cust,
267 (cw->currency_edit)));
268 gncCustomerSetTerms (cust, cw->terms);
269 gncCustomerSetDiscount (cust, gnc_amount_edit_get_amount
270 (GNC_AMOUNT_EDIT (cw->discount_amount)));
271 gncCustomerSetCredit (cust, gnc_amount_edit_get_amount
272 (GNC_AMOUNT_EDIT (cw->credit_amount)));
274 gncCustomerSetTaxTableOverride
275 (cust, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cw->taxtable_check)));
276 gncCustomerSetTaxTable (cust, cw->taxtable);
278 gncCustomerCommitEdit (cust);
279 gnc_resume_gui_refresh ();
282 static gboolean check_edit_amount (GtkWidget *dialog, GtkWidget *amount,
284 const char * error_message)
286 if (!gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT (amount)))
289 gnc_error_dialog (dialog,
"%s", error_message);
295 gnc_numeric val = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (amount));
300 gnc_error_dialog (dialog,
"%s", error_message);
307 static gboolean check_entry_nonempty (GtkWidget *dialog, GtkWidget *entry,
308 const char * error_message)
310 const char *res = gtk_entry_get_text (GTK_ENTRY (entry));
311 if (g_strcmp0 (res,
"") == 0)
314 gnc_error_dialog (dialog,
"%s", error_message);
321 gnc_customer_window_ok_cb (GtkWidget *widget, gpointer data)
328 if (check_entry_nonempty (cw->dialog, cw->company_entry,
329 _(
"You must enter a company name. "
330 "If this customer is an individual (and not a company) "
331 "you should enter the same value for:\nIdentification "
332 "- Company Name, and\nPayment Address - Name.")))
336 if (check_entry_nonempty (cw->dialog, cw->addr1_entry, NULL) &&
337 check_entry_nonempty (cw->dialog, cw->addr2_entry, NULL) &&
338 check_entry_nonempty (cw->dialog, cw->addr3_entry, NULL) &&
339 check_entry_nonempty (cw->dialog, cw->addr4_entry, NULL))
341 const char *msg = _(
"You must enter a billing address.");
342 gnc_error_dialog (cw->dialog,
"%s", msg);
347 min = gnc_numeric_zero ();
348 max = gnc_numeric_create (100, 1);
350 if (check_edit_amount (cw->dialog, cw->discount_amount, &min, &max,
351 _(
"Discount percentage must be between 0-100 "
352 "or you must leave it blank.")))
355 if (check_edit_amount (cw->dialog, cw->credit_amount, &min, NULL,
356 _(
"Credit must be a positive amount or "
357 "you must leave it blank.")))
361 if (g_strcmp0 (gtk_entry_get_text (GTK_ENTRY (cw->id_entry)),
"") == 0)
363 string = gncCustomerNextID (cw->book);
364 gtk_entry_set_text (GTK_ENTRY (cw->id_entry),
string);
373 gnc_ui_to_customer (cw, customer);
375 cw->created_customer = customer;
379 gnc_close_gui_component (cw->component_id);
383 gnc_customer_window_cancel_cb (GtkWidget *widget, gpointer data)
387 gnc_close_gui_component (cw->component_id);
391 gnc_customer_window_help_cb (GtkWidget *widget, gpointer data)
397 gnc_customer_window_destroy_cb (GtkWidget *widget, gpointer data)
402 gnc_suspend_gui_refresh ();
404 if (cw->dialog_type == NEW_CUSTOMER && customer != NULL)
406 gncCustomerBeginEdit (customer);
407 gncCustomerDestroy (customer);
411 if (cw->addrX_selection_source_id)
412 g_source_remove (cw->addrX_selection_source_id);
414 gnc_unregister_gui_component (cw->component_id);
415 gnc_resume_gui_refresh ();
421 gnc_customer_name_changed_cb (GtkWidget *widget, gpointer data)
424 char *fullname, *title;
425 const char *id, *name;
430 name = gtk_entry_get_text (GTK_ENTRY (cw->company_entry));
431 if (!name || *name ==
'\0')
432 name = _(
"<No name>");
434 id = gtk_entry_get_text (GTK_ENTRY (cw->id_entry));
436 fullname = g_strconcat (name,
" (",
id,
")", (
char *)NULL);
438 if (cw->dialog_type == EDIT_CUSTOMER)
439 title = g_strconcat (_(
"Edit Customer"),
" - ", fullname, (
char *)NULL);
441 title = g_strconcat (_(
"New Customer"),
" - ", fullname, (
char *)NULL);
443 gtk_window_set_title (GTK_WINDOW (cw->dialog), title);
450 gnc_customer_terms_changed_cb (GtkWidget *widget, gpointer data)
452 GtkComboBox *cbox = GTK_COMBO_BOX (widget);
458 cw->terms = gnc_simple_combo_get_value (cbox);
462 gnc_customer_taxincluded_changed_cb (GtkWidget *widget, gpointer data)
464 GtkComboBox *cbox = GTK_COMBO_BOX (widget);
470 cw->taxincluded = GPOINTER_TO_INT (gnc_simple_combo_get_value (cbox));
474 gnc_customer_taxtable_changed_cb (GtkWidget *widget, gpointer data)
476 GtkComboBox *cbox = GTK_COMBO_BOX (widget);
482 cw->taxtable = gnc_simple_combo_get_value (cbox);
486 gnc_customer_window_close_handler (gpointer user_data)
490 gtk_widget_destroy (cw->dialog);
496 gnc_customer_window_refresh_handler (GHashTable *changes, gpointer user_data)
505 gnc_close_gui_component (cw->component_id);
512 info = gnc_gui_get_entity_events (changes, &cw->customer_guid);
513 if (info && (info->event_mask & QOF_EVENT_DESTROY))
515 gnc_close_gui_component (cw->component_id);
522 find_handler (gpointer
find_data, gpointer user_data)
524 const GncGUID *customer_guid = find_data;
527 return(cw &&
guid_equal(&cw->customer_guid, customer_guid));
535 GtkWidget *hbox, *edit;
548 cw = gnc_find_first_gui_component (DIALOG_EDIT_CUSTOMER_CM_CLASS,
549 find_handler, &customer_guid);
552 gtk_window_present (GTK_WINDOW(cw->dialog));
559 currency = gncCustomerGetCurrency (cust);
571 builder = gtk_builder_new();
572 gnc_builder_add_from_file (builder,
"dialog-customer.glade",
"terms_store");
573 gnc_builder_add_from_file (builder,
"dialog-customer.glade",
"tax_included_store");
574 gnc_builder_add_from_file (builder,
"dialog-customer.glade",
"taxtable_store");
575 gnc_builder_add_from_file (builder,
"dialog-customer.glade",
"Customer Dialog");
576 cw->dialog = GTK_WIDGET (gtk_builder_get_object (builder,
"Customer Dialog"));
578 g_object_set_data (G_OBJECT (cw->dialog),
"dialog_info", cw);
581 cw->id_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"id_entry"));
582 cw->company_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"company_entry"));
584 cw->name_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"name_entry"));
585 cw->addr1_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"addr1_entry"));
586 cw->addr2_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"addr2_entry"));
587 cw->addr3_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"addr3_entry"));
588 cw->addr4_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"addr4_entry"));
589 cw->phone_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"phone_entry"));
590 cw->fax_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"fax_entry"));
591 cw->email_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"email_entry"));
593 cw->shipname_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"shipname_entry"));
594 cw->shipaddr1_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"shipaddr1_entry"));
595 cw->shipaddr2_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"shipaddr2_entry"));
596 cw->shipaddr3_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"shipaddr3_entry"));
597 cw->shipaddr4_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"shipaddr4_entry"));
598 cw->shipphone_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"shipphone_entry"));
599 cw->shipfax_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"shipfax_entry"));
600 cw->shipemail_entry = GTK_WIDGET (gtk_builder_get_object (builder,
"shipemail_entry"));
602 cw->active_check = GTK_WIDGET (gtk_builder_get_object (builder,
"active_check"));
603 cw->taxincluded_menu = GTK_WIDGET (gtk_builder_get_object (builder,
"tax_included_menu"));
604 cw->notes_text = GTK_WIDGET (gtk_builder_get_object (builder,
"notes_text"));
606 cw->terms_menu = GTK_WIDGET (gtk_builder_get_object (builder,
"terms_menu"));
608 cw->taxtable_check = GTK_WIDGET (gtk_builder_get_object (builder,
"taxtable_button"));
609 cw->taxtable_menu = GTK_WIDGET (gtk_builder_get_object (builder,
"taxtable_menu"));
614 cw->currency_edit = edit;
616 hbox = GTK_WIDGET (gtk_builder_get_object (builder,
"currency_box"));
617 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
620 edit = gnc_amount_edit_new();
621 gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (edit), TRUE);
622 print_info = gnc_integral_print_info ();
623 print_info.max_decimal_places = 5;
624 gnc_amount_edit_set_print_info (GNC_AMOUNT_EDIT (edit), print_info);
625 gnc_amount_edit_set_fraction (GNC_AMOUNT_EDIT (edit), 100000);
626 cw->discount_amount = edit;
627 gtk_widget_show (edit);
629 hbox = GTK_WIDGET (gtk_builder_get_object (builder,
"discount_box"));
630 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
633 edit = gnc_amount_edit_new();
634 print_info = gnc_commodity_print_info (currency, FALSE);
635 gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (edit), TRUE);
636 gnc_amount_edit_set_print_info (GNC_AMOUNT_EDIT (edit), print_info);
637 gnc_amount_edit_set_fraction (GNC_AMOUNT_EDIT (edit),
639 cw->credit_amount = edit;
640 gtk_widget_show (edit);
642 hbox = GTK_WIDGET (gtk_builder_get_object (builder,
"credit_box"));
643 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
646 gtk_builder_connect_signals_full( builder,
647 gnc_builder_connect_full_func,
653 GtkTextBuffer* text_buffer;
657 cw->dialog_type = EDIT_CUSTOMER;
660 addr = gncCustomerGetAddr (cust);
661 shipaddr = gncCustomerGetShipAddr (cust);
663 gtk_entry_set_text (GTK_ENTRY (cw->id_entry), gncCustomerGetID (cust));
664 gtk_entry_set_text (GTK_ENTRY (cw->company_entry), gncCustomerGetName (cust));
667 gtk_entry_set_text (GTK_ENTRY (cw->name_entry), gncAddressGetName (addr));
668 gtk_entry_set_text (GTK_ENTRY (cw->addr1_entry), gncAddressGetAddr1 (addr));
669 gtk_entry_set_text (GTK_ENTRY (cw->addr2_entry), gncAddressGetAddr2 (addr));
670 gtk_entry_set_text (GTK_ENTRY (cw->addr3_entry), gncAddressGetAddr3 (addr));
671 gtk_entry_set_text (GTK_ENTRY (cw->addr4_entry), gncAddressGetAddr4 (addr));
672 gtk_entry_set_text (GTK_ENTRY (cw->phone_entry), gncAddressGetPhone (addr));
673 gtk_entry_set_text (GTK_ENTRY (cw->fax_entry), gncAddressGetFax (addr));
674 gtk_entry_set_text (GTK_ENTRY (cw->email_entry), gncAddressGetEmail (addr));
677 gtk_entry_set_text (GTK_ENTRY (cw->shipname_entry), gncAddressGetName (shipaddr));
678 gtk_entry_set_text (GTK_ENTRY (cw->shipaddr1_entry), gncAddressGetAddr1 (shipaddr));
679 gtk_entry_set_text (GTK_ENTRY (cw->shipaddr2_entry), gncAddressGetAddr2 (shipaddr));
680 gtk_entry_set_text (GTK_ENTRY (cw->shipaddr3_entry), gncAddressGetAddr3 (shipaddr));
681 gtk_entry_set_text (GTK_ENTRY (cw->shipaddr4_entry), gncAddressGetAddr4 (shipaddr));
682 gtk_entry_set_text (GTK_ENTRY (cw->shipphone_entry), gncAddressGetPhone (shipaddr));
683 gtk_entry_set_text (GTK_ENTRY (cw->shipfax_entry), gncAddressGetFax (shipaddr));
684 gtk_entry_set_text (GTK_ENTRY (cw->shipemail_entry), gncAddressGetEmail (shipaddr));
687 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cw->active_check),
688 gncCustomerGetActive (cust));
690 string = gncCustomerGetNotes (cust);
691 text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(cw->notes_text));
692 gtk_text_buffer_set_text (text_buffer,
string, -1);
695 gnc_register_gui_component (DIALOG_EDIT_CUSTOMER_CM_CLASS,
696 gnc_customer_window_refresh_handler,
697 gnc_customer_window_close_handler,
699 cw->terms = gncCustomerGetTerms (cust);
704 cust = gncCustomerCreate (bookp);
707 cw->dialog_type = NEW_CUSTOMER;
709 gnc_register_gui_component (DIALOG_NEW_CUSTOMER_CM_CLASS,
710 gnc_customer_window_refresh_handler,
711 gnc_customer_window_close_handler,
720 cw->taxincluded = gncCustomerGetTaxIncluded (cust);
721 gnc_taxincluded_combo (GTK_COMBO_BOX(cw->taxincluded_menu), cw->taxincluded);
722 gnc_billterms_combo (GTK_COMBO_BOX(cw->terms_menu), bookp, TRUE, cw->terms);
724 cw->taxtable = gncCustomerGetTaxTable (cust);
725 gnc_taxtables_combo (GTK_COMBO_BOX(cw->taxtable_menu), bookp, TRUE, cw->taxtable);
726 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cw->taxtable_check),
727 gncCustomerGetTaxTableOverride (cust));
728 gnc_customer_taxtable_check_cb (GTK_TOGGLE_BUTTON (cw->taxtable_check), cw);
736 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (cw->discount_amount),
737 gncCustomerGetDiscount (cust));
738 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (cw->credit_amount),
739 gncCustomerGetCredit (cust));
741 gnc_gui_component_watch_entity_type (cw->component_id,
742 GNC_CUSTOMER_MODULE_NAME,
743 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
745 gtk_widget_show_all (cw->dialog);
746 g_object_unref(G_OBJECT(builder));
756 if (!cust)
return NULL;
758 cw = gnc_customer_new_window (gncCustomerGetBook(cust), cust);
764 gnc_ui_customer_new (
QofBook *bookp)
769 if (!bookp)
return NULL;
771 cw = gnc_customer_new_window (bookp, NULL);
779 invoice_customer_cb (gpointer *cust_p, gpointer user_data)
785 g_return_if_fail (cust_p && user_data);
792 gncOwnerInitCustomer (&owner, cust);
793 gnc_invoice_search (NULL, &owner, sw->book);
798 order_customer_cb (gpointer *cust_p, gpointer user_data)
804 g_return_if_fail (cust_p && user_data);
811 gncOwnerInitCustomer (&owner, cust);
812 gnc_order_search (NULL, &owner, sw->book);
817 jobs_customer_cb (gpointer *cust_p, gpointer user_data)
823 g_return_if_fail (cust_p && user_data);
830 gncOwnerInitCustomer (&owner, cust);
831 gnc_job_search (NULL, &owner, sw->book);
836 payment_customer_cb (gpointer *cust_p, gpointer user_data)
842 g_return_if_fail (cust_p && user_data);
849 gncOwnerInitCustomer (&owner, cust);
850 gnc_ui_payment_new (&owner, sw->book);
855 edit_customer_cb (gpointer *cust_p, gpointer user_data)
859 g_return_if_fail (cust_p);
865 gnc_ui_customer_edit (cust);
871 new_customer_cb (gpointer user_data)
876 g_return_val_if_fail (sw, NULL);
878 cw = gnc_ui_customer_new (sw->book);
879 return cw_get_customer (cw);
883 free_userdata_cb (gpointer user_data)
887 g_return_if_fail (sw);
897 QofIdType type = GNC_CUSTOMER_MODULE_NAME;
899 static GList *params = NULL;
900 static GList *columns = NULL;
903 { N_(
"View/Edit Customer"), edit_customer_cb, NULL, TRUE},
904 { N_(
"Customer's Jobs"), jobs_customer_cb, NULL, TRUE},
906 { N_(
"Customer's Invoices"), invoice_customer_cb, NULL, TRUE},
907 { N_(
"Process Payment"), payment_customer_cb, NULL, FALSE},
910 (void)order_customer_cb;
912 g_return_val_if_fail (book, NULL);
917 params = gnc_search_param_prepend (params, _(
"Shipping Contact"), NULL, type,
918 CUSTOMER_SHIPADDR, ADDRESS_NAME, NULL);
919 params = gnc_search_param_prepend (params, _(
"Billing Contact"), NULL, type,
920 CUSTOMER_ADDR, ADDRESS_NAME, NULL);
921 params = gnc_search_param_prepend (params, _(
"Customer ID"), NULL, type,
923 params = gnc_search_param_prepend (params, _(
"Company Name"), NULL, type,
924 CUSTOMER_NAME, NULL);
930 columns = gnc_search_param_prepend (columns, _(
"Contact"), NULL, type,
931 CUSTOMER_ADDR, ADDRESS_NAME, NULL);
932 columns = gnc_search_param_prepend (columns, _(
"Company"), NULL, type,
933 CUSTOMER_NAME, NULL);
934 columns = gnc_search_param_prepend (columns, _(
"ID #"), NULL, type,
939 q = qof_query_create_for (type);
957 return gnc_search_dialog_create (type, _(
"Find Customer"),
958 params, columns, q, q2, buttons, NULL,
959 new_customer_cb, sw, free_userdata_cb,
960 GNC_PREFS_GROUP_SEARCH, NULL);
964 gnc_customer_search_select (gpointer start, gpointer book)
966 if (!book)
return NULL;
968 return gnc_customer_search (start, book);
972 gnc_customer_search_edit (gpointer start, gpointer book)
975 gnc_ui_customer_edit (start);
981 idle_select_region_addr2(gpointer user_data)
984 g_return_val_if_fail(user_data, FALSE);
988 gtk_editable_select_region(GTK_EDITABLE(wdata->addr2_entry),
989 wdata->addrX_start_selection,
990 wdata->addrX_end_selection);
992 wdata->addrX_selection_source_id = 0;
997 idle_select_region_addr3(gpointer user_data)
1000 g_return_val_if_fail(user_data, FALSE);
1002 gtk_editable_select_region(GTK_EDITABLE(wdata->addr3_entry),
1003 wdata->addrX_start_selection,
1004 wdata->addrX_end_selection);
1006 wdata->addrX_selection_source_id = 0;
1010 idle_select_region_addr4(gpointer user_data)
1013 g_return_val_if_fail(user_data, FALSE);
1015 gtk_editable_select_region(GTK_EDITABLE(wdata->addr4_entry),
1016 wdata->addrX_start_selection,
1017 wdata->addrX_end_selection);
1018 wdata->addrX_selection_source_id = 0;
1023 idle_select_region_shipaddr2(gpointer user_data)
1026 g_return_val_if_fail(user_data, FALSE);
1028 gtk_editable_select_region(GTK_EDITABLE(wdata->shipaddr2_entry),
1029 wdata->addrX_start_selection,
1030 wdata->addrX_end_selection);
1032 wdata->addrX_selection_source_id = 0;
1037 idle_select_region_shipaddr3(gpointer user_data)
1040 g_return_val_if_fail(user_data, FALSE);
1042 gtk_editable_select_region(GTK_EDITABLE(wdata->shipaddr3_entry),
1043 wdata->addrX_start_selection,
1044 wdata->addrX_end_selection);
1046 wdata->addrX_selection_source_id = 0;
1050 idle_select_region_shipaddr4(gpointer user_data)
1053 g_return_val_if_fail(user_data, FALSE);
1055 gtk_editable_select_region(GTK_EDITABLE(wdata->shipaddr4_entry),
1056 wdata->addrX_start_selection,
1057 wdata->addrX_end_selection);
1058 wdata->addrX_selection_source_id = 0;
1065 gnc_customer_addr_common_insert_cb(GtkEditable *editable,
1066 gchar *new_text, gint new_text_length,
1067 gint *position, gpointer user_data,
QuickFill *qf)
1070 gchar *concatenated_text;
1072 gint prefix_len, concatenated_text_len;
1074 if (new_text_length <= 0)
1080 gchar *suffix = gtk_editable_get_chars(editable, *position, -1);
1091 gchar *prefix = gtk_editable_get_chars(editable, 0, *position);
1092 prefix_len = strlen(prefix);
1093 concatenated_text = g_strconcat(prefix, new_text, (gchar*) NULL);
1094 concatenated_text_len = prefix_len + new_text_length;
1099 g_free(concatenated_text);
1105 gint match_str_len = strlen(match_str);
1106 if (match_str_len > concatenated_text_len)
1110 g_signal_handlers_block_matched (G_OBJECT (editable),
1111 G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, user_data);
1113 gtk_editable_insert_text(editable,
1114 match_str + prefix_len,
1115 match_str_len - prefix_len,
1118 g_signal_handlers_unblock_matched (G_OBJECT (editable),
1119 G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, user_data);
1122 g_signal_stop_emission_by_name (G_OBJECT (editable),
"insert_text");
1125 *position = concatenated_text_len;
1129 wdata->addrX_start_selection = *position;
1130 wdata->addrX_end_selection = -1;
1139 void gnc_customer_addr2_insert_cb(GtkEditable *editable,
1140 gchar *new_text, gint new_text_length,
1141 gint *position, gpointer user_data)
1148 r = gnc_customer_addr_common_insert_cb(editable, new_text, new_text_length,
1149 position, user_data, wdata->addr2_quickfill);
1156 wdata->addrX_selection_source_id = g_idle_add(idle_select_region_addr2,
1161 void gnc_customer_addr3_insert_cb(GtkEditable *editable,
1162 gchar *new_text, gint new_text_length,
1163 gint *position, gpointer user_data)
1170 r = gnc_customer_addr_common_insert_cb(editable, new_text, new_text_length,
1171 position, user_data, wdata->addr3_quickfill);
1176 wdata->addrX_selection_source_id = g_idle_add(idle_select_region_addr3,
1181 void gnc_customer_addr4_insert_cb(GtkEditable *editable,
1182 gchar *new_text, gint new_text_length,
1183 gint *position, gpointer user_data)
1190 r = gnc_customer_addr_common_insert_cb(editable, new_text, new_text_length,
1191 position, user_data, wdata->addr4_quickfill);
1196 wdata->addrX_selection_source_id = g_idle_add(idle_select_region_addr4,
1201 void gnc_customer_shipaddr2_insert_cb(GtkEditable *editable,
1202 gchar *new_text, gint new_text_length,
1203 gint *position, gpointer user_data)
1210 r = gnc_customer_addr_common_insert_cb(editable, new_text, new_text_length,
1211 position, user_data, wdata->addr2_quickfill);
1216 wdata->addrX_selection_source_id = g_idle_add(idle_select_region_shipaddr2,
1221 void gnc_customer_shipaddr3_insert_cb(GtkEditable *editable,
1222 gchar *new_text, gint new_text_length,
1223 gint *position, gpointer user_data)
1230 r = gnc_customer_addr_common_insert_cb(editable, new_text, new_text_length,
1231 position, user_data, wdata->addr3_quickfill);
1236 wdata->addrX_selection_source_id = g_idle_add(idle_select_region_shipaddr3,
1241 void gnc_customer_shipaddr4_insert_cb(GtkEditable *editable,
1242 gchar *new_text, gint new_text_length,
1243 gint *position, gpointer user_data)
1250 r = gnc_customer_addr_common_insert_cb(editable, new_text, new_text_length,
1251 position, user_data, wdata->addr4_quickfill);
1256 wdata->addrX_selection_source_id = g_idle_add(idle_select_region_shipaddr4,
1262 gnc_customer_common_key_press_cb( GtkEntry *entry,
1264 gpointer user_data, GtkWidget* editable )
1266 gboolean done_with_input = FALSE;
1272 switch ( event->keyval )
1275 case GDK_ISO_Left_Tab:
1276 if ( !( event->state & GDK_SHIFT_MASK) )
1282 gtk_editable_select_region( GTK_EDITABLE(editable),
1288 return( done_with_input );
1291 gnc_customer_addr2_key_press_cb( GtkEntry *entry,
1293 gpointer user_data )
1296 return gnc_customer_common_key_press_cb(entry, event, user_data,
1297 wdata->addr2_entry);
1300 gnc_customer_addr3_key_press_cb( GtkEntry *entry,
1302 gpointer user_data )
1305 return gnc_customer_common_key_press_cb(entry, event, user_data,
1306 wdata->addr3_entry);
1309 gnc_customer_addr4_key_press_cb( GtkEntry *entry,
1311 gpointer user_data )
1314 return gnc_customer_common_key_press_cb(entry, event, user_data,
1315 wdata->addr4_entry);
1318 gnc_customer_shipaddr2_key_press_cb( GtkEntry *entry,
1320 gpointer user_data )
1323 return gnc_customer_common_key_press_cb(entry, event, user_data,
1324 wdata->shipaddr2_entry);
1327 gnc_customer_shipaddr3_key_press_cb( GtkEntry *entry,
1329 gpointer user_data )
1332 return gnc_customer_common_key_press_cb(entry, event, user_data,
1333 wdata->shipaddr3_entry);
1336 gnc_customer_shipaddr4_key_press_cb( GtkEntry *entry,
1338 gpointer user_data )
1341 return gnc_customer_common_key_press_cb(entry, event, user_data,
1342 wdata->shipaddr4_entry);
int gnc_commodity_get_fraction(const gnc_commodity *cm)
void gnc_currency_edit_set_currency(GNCCurrencyEdit *gce, const gnc_commodity *currency)
utility functions for the GnuCash UI
QofQuery * qof_query_copy(QofQuery *q)
gint gnc_numeric_compare(gnc_numeric a, gnc_numeric b)
struct _QofQuery QofQuery
gnc_commodity * gnc_default_currency(void)
Currency selection widget.
void qof_query_destroy(QofQuery *q)
gboolean guid_equal(const GncGUID *guid_1, const GncGUID *guid_2)
QuickFill * gnc_get_shared_address_addr3_quickfill(QofBook *book, const char *key)
void qof_query_set_book(QofQuery *q, QofBook *book)
gnc_commodity * gnc_currency_edit_get_currency(GNCCurrencyEdit *gce)
QuickFill * gnc_quickfill_get_string_match(QuickFill *qf, const char *str)
void gnc_gnome_help(const char *file_name, const char *anchor)
#define gncCustomerGetGUID(x)
void qof_query_add_guid_match(QofQuery *q, QofQueryParamList *param_list, const GncGUID *guid, QofQueryOp op)
const char * gnc_quickfill_string(QuickFill *qf)
GtkWidget * gnc_currency_edit_new(void)
QuickFill * gnc_get_shared_address_addr2_quickfill(QofBook *book, const char *key)
const GncGUID * guid_null(void)
QuickFill is used to auto-complete typed user entries.
QuickFill * gnc_get_shared_address_addr4_quickfill(QofBook *book, const char *key)
void qof_event_gen(QofInstance *entity, QofEventId event_type, gpointer event_data)
Invoke all registered event handlers using the given arguments.