GnuCash c935c2f+
Loading...
Searching...
No Matches
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
55void gnc_vendor_taxtable_check_cb (GtkToggleButton *togglebutton, gpointer user_data);
56void gnc_vendor_window_ok_cb (GtkWidget *widget, gpointer data);
57void gnc_vendor_window_cancel_cb (GtkWidget *widget, gpointer data);
58void gnc_vendor_window_help_cb (GtkWidget *widget, gpointer data);
59void gnc_vendor_window_destroy_cb (GtkWidget *widget, gpointer data);
60void gnc_vendor_name_changed_cb (GtkWidget *widget, gpointer data);
61void gnc_vendor_terms_changed_cb (GtkWidget *widget, gpointer data);
62void gnc_vendor_taxincluded_changed_cb (GtkWidget *widget, gpointer data);
63void gnc_vendor_taxtable_changed_cb (GtkWidget *widget, gpointer data);
64
65typedef 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
113void
114gnc_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
125static GncVendor *
126vw_get_vendor (VendorWindow *vw)
127{
128 if (!vw)
129 return NULL;
130
131 return gncVendorLookup (vw->book, &vw->vendor_guid);
132}
133
134static 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
184static 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
197void
198gnc_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
231void
232gnc_vendor_window_cancel_cb (GtkWidget *widget, gpointer data)
233{
234 VendorWindow *vw = data;
235
236 gnc_close_gui_component (vw->component_id);
237}
238
239void
240gnc_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
246void
247gnc_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
267void
268gnc_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
280void
281gnc_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
292void
293gnc_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
304void
305gnc_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
316static void
317gnc_vendor_window_close_handler (gpointer user_data)
318{
319 VendorWindow *vw = user_data;
320
321 gtk_widget_destroy (vw->dialog);
322}
323
324static void
325gnc_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
350static gboolean
351find_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
359static VendorWindow *
360gnc_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
526VendorWindow *
527gnc_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
538VendorWindow *
539gnc_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
552static void
553invoice_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
571static void
572order_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
590static void
591jobs_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
609static void
610payment_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
628static void
629edit_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
644static gpointer
645new_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
656static void
657free_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
666GNCSearchWindow *
667gnc_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
734GNCSearchWindow *
735gnc_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
742GNCSearchWindow *
743gnc_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}
Currency selection widget.
utility functions for the GnuCash UI
an Address object
Vendor Interface.
const gchar * QofIdType
QofIdType declaration.
Definition qofid.h:80
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
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.
Definition guid.cpp:165
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:237
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.
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.
GncTaxIncluded
How to interpret the TaxIncluded.
Definition gncTaxTable.h:86
#define gncVendorGetBook(X)
deprecated functions
Definition gncVendor.h:132
The type used to store guids in C.
Definition guid.h:75
modtime is the internal date of the last modtime See libgnucash/engine/TaxTableBillTermImmutability....
QofBook reference.
Definition qofbook-p.hpp:47
A Query.
Definition qofquery.cpp:75