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"
60void gnc_customer_taxtable_check_cb (GtkToggleButton *togglebutton,
63void gnc_customer_window_ok_cb (GtkWidget *widget, gpointer data);
64void gnc_customer_window_cancel_cb (GtkWidget *widget, gpointer data);
65void gnc_customer_window_help_cb (GtkWidget *widget, gpointer data);
66void gnc_customer_window_destroy_cb (GtkWidget *widget, gpointer data);
67void gnc_customer_name_changed_cb (GtkWidget *widget, gpointer data);
68void gnc_customer_terms_changed_cb (GtkWidget *widget, gpointer data);
69void gnc_customer_taxincluded_changed_cb (GtkWidget *widget, gpointer data);
70void gnc_customer_taxtable_changed_cb (GtkWidget *widget, gpointer data);
71void gnc_customer_addr2_insert_cb(GtkEditable *editable,
72 gchar *new_text, gint new_text_length,
73 gint *position, gpointer user_data);
74void gnc_customer_addr3_insert_cb(GtkEditable *editable,
75 gchar *new_text, gint new_text_length,
76 gint *position, gpointer user_data);
77void gnc_customer_addr4_insert_cb(GtkEditable *editable,
78 gchar *new_text, gint new_text_length,
79 gint *position, gpointer user_data);
80void gnc_customer_shipaddr2_insert_cb(GtkEditable *editable,
81 gchar *new_text, gint new_text_length,
82 gint *position, gpointer user_data);
83void gnc_customer_shipaddr3_insert_cb(GtkEditable *editable,
84 gchar *new_text, gint new_text_length,
85 gint *position, gpointer user_data);
86void gnc_customer_shipaddr4_insert_cb(GtkEditable *editable,
87 gchar *new_text, gint new_text_length,
88 gint *position, gpointer user_data);
90gnc_customer_addr2_key_press_cb( GtkEntry *entry, GdkEventKey *event,
93gnc_customer_addr3_key_press_cb( GtkEntry *entry, GdkEventKey *event,
96gnc_customer_addr4_key_press_cb( GtkEntry *entry, GdkEventKey *event,
99gnc_customer_shipaddr2_key_press_cb( GtkEntry *entry, GdkEventKey *event,
100 gpointer user_data );
102gnc_customer_shipaddr3_key_press_cb( GtkEntry *entry, GdkEventKey *event,
103 gpointer user_data );
105gnc_customer_shipaddr4_key_press_cb( GtkEntry *entry, GdkEventKey *event,
106 gpointer user_data );
108#define ADDR_QUICKFILL "GncAddress-Quickfill"
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;
179gnc_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);
191cw_get_customer (CustomerWindow *cw)
196 return gncCustomerLookup (cw->book, &cw->customer_guid);
199static 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 ();
264static 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));
290static 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)
304gnc_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);
361gnc_customer_window_cancel_cb (GtkWidget *widget, gpointer data)
363 CustomerWindow *cw = data;
365 gnc_close_gui_component (cw->component_id);
369gnc_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);
376gnc_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 ();
400gnc_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);
413gnc_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);
425gnc_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));
437gnc_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);
449gnc_customer_window_close_handler (gpointer user_data)
451 CustomerWindow *cw = user_data;
453 gtk_widget_destroy (cw->dialog);
459gnc_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);
485find_handler (gpointer
find_data, gpointer user_data)
488 CustomerWindow *cw = user_data;
490 return(cw &&
guid_equal(&cw->customer_guid, customer_guid));
493static CustomerWindow *
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));
721gnc_ui_customer_edit (GtkWindow *parent,
GncCustomer *cust)
725 if (!cust)
return NULL;
727 cw = gnc_customer_new_window (parent, gncCustomerGetBook(cust), cust);
733gnc_ui_customer_new (GtkWindow *parent,
QofBook *bookp)
738 if (!bookp)
return NULL;
740 cw = gnc_customer_new_window (parent, bookp, NULL);
748invoice_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);
767order_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);
786jobs_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);
805payment_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);
824edit_customer_cb (GtkWindow *dialog, gpointer *cust_p, gpointer user_data)
828 g_return_if_fail (cust_p);
834 gnc_ui_customer_edit (dialog, cust);
840new_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);
852free_userdata_cb (gpointer user_data)
856 g_return_if_fail (sw);
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");
936gnc_customer_search_select (GtkWindow *parent, gpointer start, gpointer book)
938 if (!book)
return NULL;
940 return gnc_customer_search (parent, start, book);
944gnc_customer_search_edit (GtkWindow *parent, gpointer start, gpointer book)
947 gnc_ui_customer_edit (parent, start);
953idle_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;
969idle_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;
982idle_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;
995idle_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;
1009idle_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;
1022idle_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;
1037gnc_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;
1111void 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,
1133void 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,
1153void 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,
1173void 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,
1193void 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,
1213void 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,
1234gnc_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 );
1263gnc_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);
1272gnc_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);
1281gnc_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);
1290gnc_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);
1299gnc_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);
1308gnc_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);
QuickFill is used to auto-complete typed user entries.
Currency selection widget.
utility functions for the GnuCash UI
int gnc_commodity_get_fraction(const gnc_commodity *cm)
Retrieve the fraction for the specified commodity.
#define gncCustomerGetGUID(x)
const gchar * QofIdType
QofIdType declaration.
void qof_event_gen(QofInstance *entity, QofEventId event_id, gpointer event_data)
Invoke all registered event handlers using the given arguments.
void gnc_currency_edit_set_currency(GNCCurrencyEdit *gce, const gnc_commodity *currency)
Set the widget to display a certain currency name.
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...
gnc_commodity * gnc_currency_edit_get_currency(GNCCurrencyEdit *gce)
Retrieve the displayed currency of the widget.
const GncGUID * guid_null(void)
Returns a GncGUID which is guaranteed to never reference any entity.
gboolean guid_equal(const GncGUID *guid_1, const GncGUID *guid_2)
Given two GUIDs, return TRUE if they are non-NULL and equal.
GtkWindow * gnc_ui_get_gtk_window(GtkWidget *widget)
Get a pointer to the widget's immediate top level GtkWindow.
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...
gnc_commodity * gnc_default_currency(void)
Return the default currency set by the user.
int gnc_numeric_compare(gnc_numeric a, gnc_numeric b)
Returns 1 if a>b, -1 if b>a, 0 if a == b
void qof_query_add_guid_match(QofQuery *q, QofQueryParamList *param_list, const GncGUID *guid, QofQueryOp op)
DOCUMENT ME !!
QofQuery * qof_query_copy(QofQuery *q)
Make a copy of the indicated query.
void qof_query_set_book(QofQuery *query, QofBook *book)
Set the book to be searched.
void qof_query_destroy(QofQuery *query)
Frees the resources associate with a Query object.
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.
QuickFill * gnc_get_shared_address_addr3_quickfill(QofBook *book, const char *key)
Create/fetch a quickfill GncAddress description strings on the Addr3 part.
const char * gnc_quickfill_string(QuickFill *qf)
For the given node 'qf', return the best-guess matching string.
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...
QuickFill * gnc_get_shared_address_addr4_quickfill(QofBook *book, const char *key)
Create/fetch a quickfill GncAddress description strings on the Addr4 part.
GncTaxIncluded
How to interpret the TaxIncluded.
credit, discount and shipaddr are unique to GncCustomer id, name, notes, terms, addr,...
The type used to store guids in C.
modtime is the internal date of the last modtime See libgnucash/engine/TaxTableBillTermImmutability....