GnuCash  5.6-150-g038405b370+
dialog-vendor.c
1 /*
2  * dialog-vendor.c -- Dialog for Vendor entry
3  * Copyright (C) 2001 Derek Atkins
4  * Author: Derek Atkins <warlord@MIT.EDU>
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation; either version 2 of
9  * the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, contact:
18  *
19  * Free Software Foundation Voice: +1-617-542-5942
20  * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
21  * Boston, MA 02110-1301, USA gnu@gnu.org
22  */
23 
24 #include <config.h>
25 
26 #include <gtk/gtk.h>
27 #include <glib/gi18n.h>
28 
29 #include "dialog-utils.h"
30 #include "gnc-currency-edit.h"
31 #include "gnc-component-manager.h"
32 #include "gnc-ui.h"
33 #include "gnc-gui-query.h"
34 #include "gnc-ui-util.h"
35 #include "qof.h"
36 #include "dialog-search.h"
37 #include "search-param.h"
38 
39 #include "gncAddress.h"
40 #include "gncVendor.h"
41 #include "gncVendorP.h"
42 
43 #include "business-gnome-utils.h"
44 #include "dialog-vendor.h"
45 #include "dialog-job.h"
46 #include "dialog-order.h"
47 #include "dialog-invoice.h"
48 #include "dialog-payment.h"
49 
50 #define DIALOG_NEW_VENDOR_CM_CLASS "dialog-new-vendor"
51 #define DIALOG_EDIT_VENDOR_CM_CLASS "dialog-edit-vendor"
52 
53 #define GNC_PREFS_GROUP_SEARCH "dialogs.business.vendor-search"
54 
55 void gnc_vendor_taxtable_check_cb (GtkToggleButton *togglebutton, gpointer user_data);
56 void gnc_vendor_window_ok_cb (GtkWidget *widget, gpointer data);
57 void gnc_vendor_window_cancel_cb (GtkWidget *widget, gpointer data);
58 void gnc_vendor_window_help_cb (GtkWidget *widget, gpointer data);
59 void gnc_vendor_window_destroy_cb (GtkWidget *widget, gpointer data);
60 void gnc_vendor_name_changed_cb (GtkWidget *widget, gpointer data);
61 void gnc_vendor_terms_changed_cb (GtkWidget *widget, gpointer data);
62 void gnc_vendor_taxincluded_changed_cb (GtkWidget *widget, gpointer data);
63 void gnc_vendor_taxtable_changed_cb (GtkWidget *widget, gpointer data);
64 
65 typedef enum
66 {
67  NEW_VENDOR,
68  EDIT_VENDOR
69 } VendorDialogType;
70 
72 {
73  QofBook *book;
74  QofQuery *q;
75 };
76 
78 {
79  GtkWidget * dialog;
80 
81  GtkWidget * id_entry;
82  GtkWidget * company_entry;
83 
84  GtkWidget * name_entry;
85  GtkWidget * addr1_entry;
86  GtkWidget * addr2_entry;
87  GtkWidget * addr3_entry;
88  GtkWidget * addr4_entry;
89  GtkWidget * phone_entry;
90  GtkWidget * fax_entry;
91  GtkWidget * email_entry;
92  GtkWidget * terms_menu;
93  GtkWidget * currency_edit;
94 
95  GtkWidget * active_check;
96  GtkWidget * taxincluded_menu;
97  GtkWidget * notes_text;
98 
99  GtkWidget * taxtable_check;
100  GtkWidget * taxtable_menu;
101 
102  GncTaxIncluded taxincluded;
103  GncBillTerm * terms;
104  VendorDialogType dialog_type;
105  GncGUID vendor_guid;
106  gint component_id;
107  QofBook * book;
108  GncVendor * created_vendor;
109 
110  GncTaxTable * taxtable;
111 };
112 
113 void
114 gnc_vendor_taxtable_check_cb (GtkToggleButton *togglebutton,
115  gpointer user_data)
116 {
117  VendorWindow *vw = user_data;
118 
119  if (gtk_toggle_button_get_active (togglebutton))
120  gtk_widget_set_sensitive (vw->taxtable_menu, TRUE);
121  else
122  gtk_widget_set_sensitive (vw->taxtable_menu, FALSE);
123 }
124 
125 static GncVendor *
126 vw_get_vendor (VendorWindow *vw)
127 {
128  if (!vw)
129  return NULL;
130 
131  return gncVendorLookup (vw->book, &vw->vendor_guid);
132 }
133 
134 static void gnc_ui_to_vendor (VendorWindow *vw, GncVendor *vendor)
135 {
136  GtkTextBuffer* text_buffer;
137  GtkTextIter start, end;
138  gchar *text;
139  GncAddress *addr;
140 
141  addr = gncVendorGetAddr (vendor);
142 
143  gnc_suspend_gui_refresh ();
144  gncVendorBeginEdit (vendor);
145 
146  if (vw->dialog_type == NEW_VENDOR)
147  qof_event_gen(QOF_INSTANCE(vendor), QOF_EVENT_ADD, NULL);
148 
149  gncVendorSetID (vendor, gtk_entry_get_text (GTK_ENTRY (vw->id_entry)));
150  gncVendorSetName (vendor, gtk_entry_get_text (GTK_ENTRY (vw->company_entry)));
151 
152  gncAddressSetName (addr, gtk_entry_get_text (GTK_ENTRY (vw->name_entry)));
153  gncAddressSetAddr1 (addr, gtk_entry_get_text (GTK_ENTRY (vw->addr1_entry)));
154  gncAddressSetAddr2 (addr, gtk_entry_get_text (GTK_ENTRY (vw->addr2_entry)));
155  gncAddressSetAddr3 (addr, gtk_entry_get_text (GTK_ENTRY (vw->addr3_entry)));
156  gncAddressSetAddr4 (addr, gtk_entry_get_text (GTK_ENTRY (vw->addr4_entry)));
157  gncAddressSetPhone (addr, gtk_entry_get_text (GTK_ENTRY (vw->phone_entry)));
158  gncAddressSetFax (addr, gtk_entry_get_text (GTK_ENTRY (vw->fax_entry)));
159  gncAddressSetEmail (addr, gtk_entry_get_text (GTK_ENTRY (vw->email_entry)));
160 
161  gncVendorSetActive (vendor, gtk_toggle_button_get_active
162  (GTK_TOGGLE_BUTTON (vw->active_check)));
163  gncVendorSetTaxIncluded (vendor, vw->taxincluded);
164 
165  text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(vw->notes_text));
166  gtk_text_buffer_get_bounds (text_buffer, &start, &end);
167  text = gtk_text_buffer_get_text (text_buffer, &start, &end, FALSE);
168  gncVendorSetNotes (vendor, text);
169 
170  gncVendorSetTerms (vendor, vw->terms);
171  gncVendorSetCurrency (vendor,
172  gnc_currency_edit_get_currency (GNC_CURRENCY_EDIT
173  (vw->currency_edit)));
174 
175  gncVendorSetTaxTableOverride
176  (vendor, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (vw->taxtable_check)));
177  gncVendorSetTaxTable (vendor, vw->taxtable);
178 
179  gncVendorCommitEdit (vendor);
180  gnc_resume_gui_refresh ();
181  g_free (text);
182 }
183 
184 static gboolean check_entry_nonempty (GtkWidget *entry,
185  const char * error_message)
186 {
187  const char *res = gtk_entry_get_text (GTK_ENTRY (entry));
188  if (g_strcmp0 (res, "") == 0)
189  {
190  if (error_message)
191  gnc_error_dialog (gnc_ui_get_gtk_window (entry), "%s", error_message);
192  return TRUE;
193  }
194  return FALSE;
195 }
196 
197 void
198 gnc_vendor_window_ok_cb (GtkWidget *widget, gpointer data)
199 {
200  VendorWindow *vw = data;
201  gchar *string;
202 
203  /* Check for valid company name */
204  if (check_entry_nonempty (vw->company_entry,
205  _("The Company Name field cannot be left blank, please "
206  "enter a company name or a person's name.")))
207  return;
208 
209  /* Check for valid id and set one if necessary */
210  if (g_strcmp0 (gtk_entry_get_text (GTK_ENTRY (vw->id_entry)), "") == 0)
211  {
212  string = gncVendorNextID(vw->book);
213  gtk_entry_set_text (GTK_ENTRY (vw->id_entry), string);
214  g_free(string);
215  }
216 
217  /* Now save it off */
218  {
219  GncVendor *vendor = vw_get_vendor (vw);
220  if (vendor)
221  {
222  gnc_ui_to_vendor (vw, vendor);
223  }
224  vw->created_vendor = vendor;
225  vw->vendor_guid = *guid_null ();
226  }
227 
228  gnc_close_gui_component (vw->component_id);
229 }
230 
231 void
232 gnc_vendor_window_cancel_cb (GtkWidget *widget, gpointer data)
233 {
234  VendorWindow *vw = data;
235 
236  gnc_close_gui_component (vw->component_id);
237 }
238 
239 void
240 gnc_vendor_window_help_cb (GtkWidget *widget, gpointer data)
241 {
242  VendorWindow *vw = data;
243  gnc_gnome_help (GTK_WINDOW(vw->dialog), DF_MANUAL, DL_USAGE_VENDOR);
244 }
245 
246 void
247 gnc_vendor_window_destroy_cb (GtkWidget *widget, gpointer data)
248 {
249  VendorWindow *vw = data;
250  GncVendor *vendor = vw_get_vendor (vw);
251 
252  gnc_suspend_gui_refresh ();
253 
254  if (vw->dialog_type == NEW_VENDOR && vendor != NULL)
255  {
256  gncVendorBeginEdit (vendor);
257  gncVendorDestroy (vendor);
258  vw->vendor_guid = *guid_null ();
259  }
260 
261  gnc_unregister_gui_component (vw->component_id);
262  gnc_resume_gui_refresh ();
263 
264  g_free (vw);
265 }
266 
267 void
268 gnc_vendor_name_changed_cb (GtkWidget *widget, gpointer data)
269 {
270  VendorWindow *vw = data;
271  if (!vw)
272  return;
273 
274  gnc_owner_window_set_title (GTK_WINDOW (vw->dialog),
275  (vw->dialog_type == EDIT_VENDOR) ?
276  _("Edit Vendor") : _("New Vendor"),
277  vw->company_entry, vw->id_entry);
278 }
279 
280 void
281 gnc_vendor_terms_changed_cb (GtkWidget *widget, gpointer data)
282 {
283  GtkComboBox *cbox = GTK_COMBO_BOX (widget);
284  VendorWindow *vw = data;
285 
286  if (!vw) return;
287  if (!cbox) return;
288 
289  vw->terms = gnc_simple_combo_get_value (cbox);
290 }
291 
292 void
293 gnc_vendor_taxincluded_changed_cb (GtkWidget *widget, gpointer data)
294 {
295  GtkComboBox *cbox = GTK_COMBO_BOX (widget);
296  VendorWindow *vw = data;
297 
298  if (!vw) return;
299  if (!cbox) return;
300 
301  vw->taxincluded = GPOINTER_TO_INT (gnc_simple_combo_get_value (cbox));
302 }
303 
304 void
305 gnc_vendor_taxtable_changed_cb (GtkWidget *widget, gpointer data)
306 {
307  GtkComboBox *cbox = GTK_COMBO_BOX (widget);
308  VendorWindow *vw = data;
309 
310  if (!vw) return;
311  if (!cbox) return;
312 
313  vw->taxtable = gnc_simple_combo_get_value (cbox);
314 }
315 
316 static void
317 gnc_vendor_window_close_handler (gpointer user_data)
318 {
319  VendorWindow *vw = user_data;
320 
321  gtk_widget_destroy (vw->dialog);
322 }
323 
324 static void
325 gnc_vendor_window_refresh_handler (GHashTable *changes, gpointer user_data)
326 {
327  VendorWindow *vw = user_data;
328  const EventInfo *info;
329  GncVendor *vendor = vw_get_vendor (vw);
330 
331  /* If there isn't a vendor behind us, close down */
332  if (!vendor)
333  {
334  gnc_close_gui_component (vw->component_id);
335  return;
336  }
337 
338  /* Next, close if this is a destroy event */
339  if (changes)
340  {
341  info = gnc_gui_get_entity_events (changes, &vw->vendor_guid);
342  if (info && (info->event_mask & QOF_EVENT_DESTROY))
343  {
344  gnc_close_gui_component (vw->component_id);
345  return;
346  }
347  }
348 }
349 
350 static gboolean
351 find_handler (gpointer find_data, gpointer user_data)
352 {
353  const GncGUID *vendor_guid = find_data;
354  VendorWindow *vw = user_data;
355 
356  return(vw && guid_equal(&vw->vendor_guid, vendor_guid));
357 }
358 
359 static VendorWindow *
360 gnc_vendor_new_window (GtkWindow *parent, QofBook *bookp, GncVendor *vendor)
361 {
362  VendorWindow *vw;
363  GtkBuilder *builder;
364  GtkWidget *edit, *hbox;
365  gnc_commodity *currency;
366 
367  /*
368  * Find an existing window for this vendor. If found, bring it to
369  * the front.
370  */
371  if (vendor)
372  {
373  GncGUID vendor_guid;
374 
375  vendor_guid = *gncVendorGetGUID (vendor);
376  vw = gnc_find_first_gui_component (DIALOG_EDIT_VENDOR_CM_CLASS,
377  find_handler, &vendor_guid);
378  if (vw)
379  {
380  gtk_window_set_transient_for (GTK_WINDOW(vw->dialog), parent);
381  gtk_window_present (GTK_WINDOW(vw->dialog));
382  return(vw);
383  }
384  }
385 
386  /* Find the default currency */
387  if (vendor)
388  currency = gncVendorGetCurrency (vendor);
389  else
390  currency = gnc_default_currency ();
391 
392  /*
393  * No existing vendor window found. Build a new one.
394  */
395  vw = g_new0 (VendorWindow, 1);
396 
397  vw->book = bookp;
398 
399  /* Find the dialog */
400  builder = gtk_builder_new();
401  gnc_builder_add_from_file (builder, "dialog-vendor.glade", "terms_store");
402  gnc_builder_add_from_file (builder, "dialog-vendor.glade", "tax_included_store");
403  gnc_builder_add_from_file (builder, "dialog-vendor.glade", "taxtable_store");
404  gnc_builder_add_from_file (builder, "dialog-vendor.glade", "vendor_dialog");
405  vw->dialog = GTK_WIDGET (gtk_builder_get_object (builder, "vendor_dialog"));
406  gtk_window_set_transient_for (GTK_WINDOW(vw->dialog), parent);
407 
408  // Set the name for this dialog so it can be easily manipulated with css
409  gtk_widget_set_name (GTK_WIDGET(vw->dialog), "gnc-id-vendor");
410  gnc_widget_style_context_add_class (GTK_WIDGET(vw->dialog), "gnc-class-vendors");
411 
412  /* Get entry points */
413  vw->id_entry = GTK_WIDGET (gtk_builder_get_object (builder, "id_entry"));
414  vw->company_entry = GTK_WIDGET (gtk_builder_get_object (builder, "company_entry"));
415 
416  vw->name_entry = GTK_WIDGET (gtk_builder_get_object (builder, "name_entry"));
417  vw->addr1_entry = GTK_WIDGET (gtk_builder_get_object (builder, "addr1_entry"));
418  vw->addr2_entry = GTK_WIDGET (gtk_builder_get_object (builder, "addr2_entry"));
419  vw->addr3_entry = GTK_WIDGET (gtk_builder_get_object (builder, "addr3_entry"));
420  vw->addr4_entry = GTK_WIDGET (gtk_builder_get_object (builder, "addr4_entry"));
421  vw->phone_entry = GTK_WIDGET (gtk_builder_get_object (builder, "phone_entry"));
422  vw->fax_entry = GTK_WIDGET (gtk_builder_get_object (builder, "fax_entry"));
423  vw->email_entry = GTK_WIDGET (gtk_builder_get_object (builder, "email_entry"));
424 
425  vw->active_check = GTK_WIDGET (gtk_builder_get_object (builder, "active_check"));
426  vw->taxincluded_menu = GTK_WIDGET (gtk_builder_get_object (builder, "tax_included_menu"));
427  vw->notes_text = GTK_WIDGET (gtk_builder_get_object (builder, "notes_text"));
428  vw->terms_menu = GTK_WIDGET (gtk_builder_get_object (builder, "terms_menu"));
429 
430  vw->taxtable_check = GTK_WIDGET (gtk_builder_get_object (builder, "taxtable_button"));
431  vw->taxtable_menu = GTK_WIDGET (gtk_builder_get_object (builder, "taxtable_menu"));
432 
433  /* Currency */
434  edit = gnc_currency_edit_new();
435  gnc_currency_edit_set_currency (GNC_CURRENCY_EDIT(edit), currency);
436  vw->currency_edit = edit;
437 
438  hbox = GTK_WIDGET (gtk_builder_get_object (builder, "currency_box"));
439  gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
440 
441  /* Setup signals */
442  gtk_builder_connect_signals_full( builder,
443  gnc_builder_connect_full_func,
444  vw);
445 
446  /* Setup initial values */
447  if (vendor != NULL)
448  {
449  GtkTextBuffer* text_buffer;
450  GncAddress *addr;
451  const char *string;
452 
453  vw->dialog_type = EDIT_VENDOR;
454  vw->vendor_guid = *gncVendorGetGUID (vendor);
455 
456  addr = gncVendorGetAddr (vendor);
457 
458  gtk_entry_set_text (GTK_ENTRY (vw->id_entry), gncVendorGetID (vendor));
459  gtk_entry_set_text (GTK_ENTRY (vw->company_entry), gncVendorGetName (vendor));
460 
461  /* Setup Address */
462  gtk_entry_set_text (GTK_ENTRY (vw->name_entry), gncAddressGetName (addr));
463  gtk_entry_set_text (GTK_ENTRY (vw->addr1_entry), gncAddressGetAddr1 (addr));
464  gtk_entry_set_text (GTK_ENTRY (vw->addr2_entry), gncAddressGetAddr2 (addr));
465  gtk_entry_set_text (GTK_ENTRY (vw->addr3_entry), gncAddressGetAddr3 (addr));
466  gtk_entry_set_text (GTK_ENTRY (vw->addr4_entry), gncAddressGetAddr4 (addr));
467  gtk_entry_set_text (GTK_ENTRY (vw->phone_entry), gncAddressGetPhone (addr));
468  gtk_entry_set_text (GTK_ENTRY (vw->fax_entry), gncAddressGetFax (addr));
469  gtk_entry_set_text (GTK_ENTRY (vw->email_entry), gncAddressGetEmail (addr));
470 
471  /* Set toggle buttons */
472  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (vw->active_check),
473  gncVendorGetActive (vendor));
474 
475  string = gncVendorGetNotes (vendor);
476  text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(vw->notes_text));
477  gtk_text_buffer_set_text (text_buffer, string, -1);
478 
479  vw->component_id =
480  gnc_register_gui_component (DIALOG_EDIT_VENDOR_CM_CLASS,
481  gnc_vendor_window_refresh_handler,
482  gnc_vendor_window_close_handler,
483  vw);
484 
485  vw->terms = gncVendorGetTerms (vendor);
486 
487  }
488  else
489  {
490  vendor = gncVendorCreate (bookp);
491  vw->vendor_guid = *gncVendorGetGUID (vendor);
492 
493  vw->dialog_type = NEW_VENDOR;
494  vw->component_id =
495  gnc_register_gui_component (DIALOG_NEW_VENDOR_CM_CLASS,
496  gnc_vendor_window_refresh_handler,
497  gnc_vendor_window_close_handler,
498  vw);
499 
500  /* XXX: Get the default Billing Terms */
501  vw->terms = NULL;
502  }
503 
504  /* I know that vendor exists here -- either passed in or just created */
505 
506  vw->taxincluded = gncVendorGetTaxIncluded (vendor);
507  gnc_taxincluded_combo (GTK_COMBO_BOX(vw->taxincluded_menu), vw->taxincluded);
508  gnc_billterms_combo (GTK_COMBO_BOX(vw->terms_menu), bookp, TRUE, vw->terms);
509 
510  vw->taxtable = gncVendorGetTaxTable (vendor);
511  gnc_taxtables_combo (GTK_COMBO_BOX(vw->taxtable_menu), bookp, TRUE, vw->taxtable);
512  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (vw->taxtable_check),
513  gncVendorGetTaxTableOverride (vendor));
514  gnc_vendor_taxtable_check_cb (GTK_TOGGLE_BUTTON (vw->taxtable_check), vw);
515 
516  gnc_gui_component_watch_entity_type (vw->component_id,
517  GNC_VENDOR_MODULE_NAME,
518  QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
519 
520  gtk_widget_show_all (vw->dialog);
521  g_object_unref(G_OBJECT(builder));
522 
523  return vw;
524 }
525 
526 VendorWindow *
527 gnc_ui_vendor_new (GtkWindow *parent, QofBook *bookp)
528 {
529  VendorWindow *vw;
530 
531  /* Make sure required options exist */
532  if (!bookp) return NULL;
533 
534  vw = gnc_vendor_new_window (parent, bookp, NULL);
535  return vw;
536 }
537 
538 VendorWindow *
539 gnc_ui_vendor_edit (GtkWindow *parent, GncVendor *vendor)
540 {
541  VendorWindow *vw;
542 
543  if (!vendor) return NULL;
544 
545  vw = gnc_vendor_new_window (parent, gncVendorGetBook(vendor), vendor);
546 
547  return vw;
548 }
549 
550 /* Functions for vendor selection widgets */
551 
552 static void
553 invoice_vendor_cb (GtkWindow *dialog, gpointer *vendor_p, gpointer user_data)
554 {
555  struct _vendor_select_window *sw = user_data;
556  GncOwner owner;
557  GncVendor *vendor;
558 
559  g_return_if_fail (vendor_p && user_data);
560 
561  vendor = *vendor_p;
562 
563  if (!vendor)
564  return;
565 
566  gncOwnerInitVendor (&owner, vendor);
567  gnc_invoice_search (dialog, NULL, &owner, sw->book);
568  return;
569 }
570 
571 static void
572 order_vendor_cb (GtkWindow *dialog, gpointer *vendor_p, gpointer user_data)
573 {
574  struct _vendor_select_window *sw = user_data;
575  GncOwner owner;
576  GncVendor *vendor;
577 
578  g_return_if_fail (vendor_p && user_data);
579 
580  vendor = *vendor_p;
581 
582  if (!vendor)
583  return;
584 
585  gncOwnerInitVendor (&owner, vendor);
586  gnc_order_search (dialog, NULL, &owner, sw->book);
587  return;
588 }
589 
590 static void
591 jobs_vendor_cb (GtkWindow *dialog, gpointer *vendor_p, gpointer user_data)
592 {
593  struct _vendor_select_window *sw = user_data;
594  GncOwner owner;
595  GncVendor *vendor;
596 
597  g_return_if_fail (vendor_p && user_data);
598 
599  vendor = *vendor_p;
600 
601  if (!vendor)
602  return;
603 
604  gncOwnerInitVendor (&owner, vendor);
605  gnc_job_search (dialog, NULL, &owner, sw->book);
606  return;
607 }
608 
609 static void
610 payment_vendor_cb (GtkWindow *dialog, gpointer *vendor_p, gpointer user_data)
611 {
612  struct _vendor_select_window *sw = user_data;
613  GncOwner owner;
614  GncVendor *vendor;
615 
616  g_return_if_fail (vendor_p && user_data);
617 
618  vendor = *vendor_p;
619 
620  if (!vendor)
621  return;
622 
623  gncOwnerInitVendor (&owner, vendor);
624  gnc_ui_payment_new (dialog, &owner, sw->book);
625  return;
626 }
627 
628 static void
629 edit_vendor_cb (GtkWindow *dialog, gpointer *vendor_p, gpointer user_data)
630 {
631  GncVendor *vendor;
632 
633  g_return_if_fail (vendor_p && user_data);
634 
635  vendor = *vendor_p;
636 
637  if (!vendor)
638  return;
639 
640  gnc_ui_vendor_edit (dialog, vendor);
641  return;
642 }
643 
644 static gpointer
645 new_vendor_cb (GtkWindow *dialog, gpointer user_data)
646 {
647  struct _vendor_select_window *sw = user_data;
648  VendorWindow *vw;
649 
650  g_return_val_if_fail (user_data, NULL);
651 
652  vw = gnc_ui_vendor_new (dialog, sw->book);
653  return vw_get_vendor (vw);
654 }
655 
656 static void
657 free_vendor_cb (gpointer user_data)
658 {
659  struct _vendor_select_window *sw = user_data;
660  g_return_if_fail (sw);
661 
662  qof_query_destroy (sw->q);
663  g_free (sw);
664 }
665 
666 GNCSearchWindow *
667 gnc_vendor_search (GtkWindow *parent, GncVendor *start, QofBook *book)
668 {
669  QofIdType type = GNC_VENDOR_MODULE_NAME;
670  struct _vendor_select_window *sw;
671  QofQuery *q, *q2 = NULL;
672  static GList *params = NULL;
673  static GList *columns = NULL;
674  static GNCSearchCallbackButton buttons[] =
675  {
676  { N_("View/Edit Vendor"), edit_vendor_cb, NULL, TRUE},
677  { N_("Vendor's Jobs"), jobs_vendor_cb, NULL, TRUE},
678  // { N_("Vendor Orders"), order_vendor_cb, NULL, TRUE},
679  { N_("Vendor's Bills"), invoice_vendor_cb, NULL, TRUE},
680  { N_("Pay Bill"), payment_vendor_cb, NULL, FALSE},
681  { NULL },
682  };
683  (void)order_vendor_cb;
684 
685  g_return_val_if_fail (book, NULL);
686 
687  /* Build parameter list in reverse order */
688  if (params == NULL)
689  {
690  params = gnc_search_param_prepend (params, _("Billing Contact"), NULL, type,
691  VENDOR_ADDR, ADDRESS_NAME, NULL);
692  params = gnc_search_param_prepend (params, _("Vendor ID"), NULL, type,
693  VENDOR_ID, NULL);
694  params = gnc_search_param_prepend (params, _("Company Name"), NULL, type,
695  VENDOR_NAME, NULL);
696  }
697 
698  /* Build the column list in reverse order */
699  if (columns == NULL)
700  {
701  columns = gnc_search_param_prepend (columns, _("Contact"), NULL, type,
702  VENDOR_ADDR, ADDRESS_NAME, NULL);
703  columns = gnc_search_param_prepend (columns, _("Company"), NULL, type,
704  VENDOR_NAME, NULL);
705  columns = gnc_search_param_prepend (columns, _("ID #"), NULL, type,
706  VENDOR_ID, NULL);
707  }
708 
709  /* Build the queries */
710  q = qof_query_create_for (type);
711  qof_query_set_book (q, book);
712 
713 #if 0
714  if (start)
715  {
716  q2 = qof_query_copy (q);
717  qof_query_add_guid_match (q2, g_slist_prepend (NULL, QOF_PARAM_GUID),
718  gncVendorGetGUID (start), QOF_QUERY_AND);
719  }
720 #endif
721 
722  /* launch select dialog and return the result */
723  sw = g_new0 (struct _vendor_select_window, 1);
724  sw->book = book;
725  sw->q = q;
726 
727  return gnc_search_dialog_create (parent, type, _("Find Vendor"),
728  params, columns, q, q2, buttons, NULL,
729  new_vendor_cb, sw, free_vendor_cb,
730  GNC_PREFS_GROUP_SEARCH, NULL,
731  "gnc-class-vendors");
732 }
733 
734 GNCSearchWindow *
735 gnc_vendor_search_select (GtkWindow *parent, gpointer start, gpointer book)
736 {
737  if (!book) return NULL;
738 
739  return gnc_vendor_search (parent, start, book);
740 }
741 
742 GNCSearchWindow *
743 gnc_vendor_search_edit (GtkWindow *parent, gpointer start, gpointer book)
744 {
745  if (start)
746  gnc_ui_vendor_edit (parent, start);
747 
748  return NULL;
749 }
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.
Definition: gncTaxTable.h:85
QofQuery * qof_query_copy(QofQuery *q)
Make a copy of the indicated query.
Definition: qofquery.cpp:1018
GtkWindow * gnc_ui_get_gtk_window(GtkWidget *widget)
Get a pointer to the widget&#39;s immediate top level GtkWindow.
gnc_commodity * gnc_default_currency(void)
Return the default currency set by the user.
const gchar * QofIdType
QofIdType declaration.
Definition: qofid.h:80
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&#39;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.
Definition: guid.cpp:204
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.
#define gncVendorGetBook(X)
deprecated functions
Definition: gncVendor.h:132
void qof_query_add_guid_match(QofQuery *q, QofQueryParamList *param_list, const GncGUID *guid, QofQueryOp op)
DOCUMENT ME !!
Definition: qofquery.cpp:1310
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...
const GncGUID * guid_null(void)
Returns a GncGUID which is guaranteed to never reference any entity.
Definition: guid.cpp:130
Vendor Interface.
an Address object
void qof_event_gen(QofInstance *entity, QofEventId event_id, gpointer event_data)
Invoke all registered event handlers using the given arguments.
Definition: qofevent.cpp:231
The type used to store guids in C.
Definition: guid.h:75
A Query.
Definition: qofquery.cpp:74
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