From aefeab1033cac6a97d7f507a5f8cd836e5aa5fe0 Mon Sep 17 00:00:00 2001 From: Derek Atkins Date: Thu, 29 Nov 2001 23:04:34 +0000 Subject: [PATCH] Add dialog-order (to test gncEntryLedger) and hook into the extensions to create an order git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@6142 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/business/business-core/gncInvoice.h | 4 + src/business/business-core/gncOrder.h | 1 + src/business/business-gnome/Makefile.am | 10 +- src/business/business-gnome/dialog-order.c | 340 ++++++++++++++++++ src/business/business-gnome/dialog-order.h | 27 ++ .../business-gnome/gw-business-gnome-spec.scm | 31 ++ src/business/business-gnome/order.glade | 138 +++++++ src/business/business-ledger/gncEntryLedger.c | 7 + src/business/business-ledger/gncEntryLedger.h | 3 + src/scm/extensions.scm | 11 +- 10 files changed, 568 insertions(+), 4 deletions(-) create mode 100644 src/business/business-gnome/dialog-order.c create mode 100644 src/business/business-gnome/dialog-order.h create mode 100644 src/business/business-gnome/order.glade diff --git a/src/business/business-core/gncInvoice.h b/src/business/business-core/gncInvoice.h index 650a060d3d..d14e39ab7b 100644 --- a/src/business/business-core/gncInvoice.h +++ b/src/business/business-core/gncInvoice.h @@ -16,6 +16,10 @@ typedef enum { GNC_INVOICE_VENDOR = 2 } GncInvoiceType; +#include "gncCustomer.h" +#include "gncVendor.h" +#include "gncEntry.h" + #define GNC_INVOICE_MODULE_NAME "gncInvoice" /* Create/Destroy Functions */ diff --git a/src/business/business-core/gncOrder.h b/src/business/business-core/gncOrder.h index 7d61e5e901..bcecb1a9a7 100644 --- a/src/business/business-core/gncOrder.h +++ b/src/business/business-core/gncOrder.h @@ -16,6 +16,7 @@ typedef enum { } GncOrderType; #include "gnc-book.h" +#include "gncEntry.h" #include "gncJob.h" #include "gncVendor.h" diff --git a/src/business/business-gnome/Makefile.am b/src/business/business-gnome/Makefile.am index 209f60ea30..c755baad41 100644 --- a/src/business/business-gnome/Makefile.am +++ b/src/business/business-gnome/Makefile.am @@ -8,6 +8,7 @@ AM_CFLAGS = \ -I${top_srcdir}/src/gnome \ -I${top_srcdir}/src/app-utils \ -I${top_srcdir}/src/business/business-core \ + -I${top_srcdir}/src/business/business-ledger \ ${GNOME_PRINT_CFLAGS} \ ${GNOME_INCLUDEDIR} \ ${GLADE_CFLAGS} \ @@ -16,8 +17,9 @@ AM_CFLAGS = \ ${GLIB_CFLAGS} \ ${G_WRAP_COMPILE_ARGS} \ ${GUILE_INCS} \ - -I${top_srcdir}/src/register/ledger-core \ - -I${top_srcdir}/src/register/register-core + -I${top_srcdir}/src/register/register-core \ + -I${top_srcdir}/src/register/register-gnome \ + -I${top_srcdir}/src/register/ledger-core libgncmod_business_gnome_la_SOURCES = \ businessmod-gnome.c \ @@ -26,6 +28,7 @@ libgncmod_business_gnome_la_SOURCES = \ dialog-employee.c \ dialog-job.c \ dialog-job-select.c \ + dialog-order.c \ dialog-vendor.c noinst_HEADERS = \ @@ -34,12 +37,14 @@ noinst_HEADERS = \ dialog-employee.h \ dialog-job.h \ dialog-job-select.h \ + dialog-order.h \ dialog-vendor.h libgncmod_business_gnome_la_LDFLAGS = -module libgncmod_business_gnome_la_LIBADD = \ ../business-core/libgncmod-business-core.la \ + ../business-ledger/libgnc-business-ledger.la \ ${top_srcdir}/src/gnc-module/libgncmodule.la \ ${top_srcdir}/src/engine/libgncmod-engine.la \ ${top_srcdir}/src/app-utils/libgncmod-app-utils.la \ @@ -63,6 +68,7 @@ glade_DATA = \ customer.glade \ employee.glade \ job.glade \ + order.glade \ vendor.glade EXTRA_DIST = $(glade_DATA) diff --git a/src/business/business-gnome/dialog-order.c b/src/business/business-gnome/dialog-order.c new file mode 100644 index 0000000000..f319ef0b58 --- /dev/null +++ b/src/business/business-gnome/dialog-order.c @@ -0,0 +1,340 @@ +/* + * dialog-order.c -- Dialog for Order entry + * Copyright (C) 2001 Derek Atkins + * Author: Derek Atkins + */ + +#include "config.h" + +#include + +#include "dialog-utils.h" +#include "gnc-component-manager.h" +#include "gnc-ui.h" +#include "gnc-gui-query.h" +#include "gnc-ui-util.h" +#include "gnc-engine-util.h" +#include "gnucash-sheet.h" +#include "window-help.h" + +#include "gncOrder.h" +#include "gncOrderP.h" + +#include "gncEntryLedger.h" + +#include "dialog-order.h" +#include "business-chooser.h" + +#define DIALOG_NEW_ORDER_CM_CLASS "dialog-new-order" +#define DIALOG_EDIT_ORDER_CM_CLASS "dialog-edit-order" + +typedef enum +{ + NEW_ORDER, + EDIT_ORDER +} OrderDialogType; + +struct _order_select_window { + GNCBook * book; +}; + +typedef struct _order_window { + GtkWidget * dialog; + + GnucashRegister * reg; + + OrderDialogType dialog_type; + GUID order_guid; + gint component_id; + GNCBook * book; + GncOrder * created_order; + +} OrderWindow; + +static GncOrder * +ow_get_order (OrderWindow *ow) +{ + if (!ow) + return NULL; + + return gncOrderLookup (ow->book, &ow->order_guid); +} + +static void gnc_ui_to_order (OrderWindow *ow, GncOrder *order) +{ + /* Fill this in */ + + // gncOrderCommitEdit (order); + gnc_resume_gui_refresh (); +} + +static void +gnc_order_window_ok_cb (GtkWidget *widget, gpointer data) +{ + OrderWindow *ow = data; + GncOrder *order; + + /* Now save it off */ + { + GncOrder *order = ow_get_order (ow); + if (order) { + gnc_ui_to_order (ow, order); + } + ow->created_order = order; + ow->order_guid = *xaccGUIDNULL (); + } + + gnc_close_gui_component (ow->component_id); +} + +static void +gnc_order_window_cancel_cb (GtkWidget *widget, gpointer data) +{ + OrderWindow *ow = data; + + gnc_close_gui_component (ow->component_id); +} + +static void +gnc_order_window_help_cb (GtkWidget *widget, gpointer data) +{ + OrderWindow *ow = data; + char *help_file = ""; /* xxx */ + + helpWindow(NULL, NULL, help_file); +} + +static void +gnc_order_window_destroy_cb (GtkWidget *widget, gpointer data) +{ + OrderWindow *ow = data; + GncOrder *order = ow_get_order (ow); + + gnc_suspend_gui_refresh (); + + if (ow->dialog_type == NEW_ORDER && order != NULL) { + gncOrderDestroy (order); + ow->order_guid = *xaccGUIDNULL (); + } + + gnc_unregister_gui_component (ow->component_id); + gnc_resume_gui_refresh (); + + g_free (ow); +} + +static int +gnc_order_on_close_cb (GnomeDialog *dialog, gpointer data) +{ + OrderWindow *ow; + GncOrder **created_order = data; + + if (data) { + ow = gtk_object_get_data (GTK_OBJECT (dialog), "dialog_info"); + *created_order = ow->created_order; + } + + gtk_main_quit (); + + return FALSE; +} + +static void +gnc_order_window_close_handler (gpointer user_data) +{ + OrderWindow *ow = user_data; + + gnome_dialog_close (GNOME_DIALOG (ow->dialog)); +} + +static void +gnc_order_window_refresh_handler (GHashTable *changes, gpointer user_data) +{ + OrderWindow *ow = user_data; + const EventInfo *info; + GncOrder *order = ow_get_order (ow); + + /* If there isn't a order behind us, close down */ + if (!order) { + gnc_close_gui_component (ow->component_id); + return; + } + + /* Next, close if this is a destroy event */ + if (changes) { + info = gnc_gui_get_entity_events (changes, &ow->order_guid); + if (info && (info->event_mask & GNC_EVENT_DESTROY)) { + gnc_close_gui_component (ow->component_id); + return; + } + } +} + +static OrderWindow * +gnc_order_new_window (GtkWidget *parent, GNCBook *bookp, + GncOrder *order) +{ + OrderWindow *ow; + GladeXML *xml; + GtkWidget *vbox, *regWidget; + GncEntryLedger *entry_ledger; + GnomeDialog *owd; + + ow = g_new0 (OrderWindow, 1); + + ow->book = bookp; + + /* Find the dialog */ + xml = gnc_glade_xml_new ("order.glade", "Order Entry Dialog"); + ow->dialog = glade_xml_get_widget (xml, "Order Entry Dialog"); + owd = GNOME_DIALOG (ow->dialog); + + gtk_object_set_data (GTK_OBJECT (ow->dialog), "dialog_info", ow); + + /* default to ok */ + gnome_dialog_set_default (owd, 0); + + /* Build the ledger */ + entry_ledger = gnc_entry_ledger_new (ow->book, GNCENTRY_LEDGER); + + /* Watch the order of operations, here... */ + gnucash_register_set_initial_rows( 6 ); + regWidget = gnucash_register_new (gnc_entry_ledger_get_table (entry_ledger)); + gnc_table_init_gui( regWidget, entry_ledger ); + ow->reg = GNUCASH_REGISTER(regWidget); + GNUCASH_SHEET(ow->reg->sheet)->window = GTK_WIDGET(ow->dialog); + + vbox = glade_xml_get_widget (xml, "ledger_vbox"); + // gtk_box_pack_start (GTK_BOX(vbox), toolbar, FALSE, FALSE, 2); + gtk_box_pack_start (GTK_BOX(vbox), regWidget, TRUE, TRUE, 2); + + if (parent) + gnome_dialog_set_parent (owd, GTK_WINDOW (parent)); + + gtk_signal_connect (GTK_OBJECT (ow->dialog), "destroy", + GTK_SIGNAL_FUNC(gnc_order_window_destroy_cb), ow); + + /* Setup initial values */ + if (order != NULL) { + ow->dialog_type = EDIT_ORDER; + ow->order_guid = *gncOrderGetGUID (order); + + ow->component_id = + gnc_register_gui_component (DIALOG_EDIT_ORDER_CM_CLASS, + gnc_order_window_refresh_handler, + gnc_order_window_close_handler, + ow); + + } else { + order = gncOrderCreate (bookp, GNC_ORDER_SALES); /* XXX */ + ow->order_guid = *gncOrderGetGUID (order); + + ow->dialog_type = NEW_ORDER; + + ow->component_id = + gnc_register_gui_component (DIALOG_NEW_ORDER_CM_CLASS, + gnc_order_window_refresh_handler, + gnc_order_window_close_handler, + ow); + } + + gnc_gui_component_watch_entity_type (ow->component_id, + GNC_ID_NONE, + GNC_EVENT_MODIFY | GNC_EVENT_DESTROY); + + gtk_widget_show_all (ow->dialog); + + return ow; +} + +GncOrder * +gnc_order_new (GtkWidget *parent, GNCBook *bookp) +{ + OrderWindow *ow; + GncOrder *created_order = NULL; + + /* Make sure required options exist */ + if (!bookp) return NULL; + + ow = gnc_order_new_window (parent, bookp, NULL); + + gtk_signal_connect (GTK_OBJECT (ow->dialog), "close", + GTK_SIGNAL_FUNC (gnc_order_on_close_cb), + &created_order); + + gtk_window_set_modal (GTK_WINDOW (ow->dialog), TRUE); + + gtk_main (); + + return created_order; +} + +void +gnc_order_edit (GtkWidget *parent, GncOrder *order) +{ + OrderWindow *ow; + + if (!order) return; + + ow = gnc_order_new_window (parent, gncOrderGetBook(order), order); + + gtk_signal_connect (GTK_OBJECT (ow->dialog), "close", + GTK_SIGNAL_FUNC (gnc_order_on_close_cb), + NULL); + + gtk_window_set_modal (GTK_WINDOW (ow->dialog), TRUE); + + gtk_main (); + + return; +} + +/* Functions for widgets for order selection */ + +static gpointer gnc_order_edit_new_cb (gpointer arg, GtkWidget *toplevel) +{ + struct _order_select_window *sw = arg; + + if (!arg) return NULL; + + return gnc_order_new (toplevel, sw->book); +} + +static void gnc_order_edit_edit_cb (gpointer arg, gpointer obj, GtkWidget *toplevel) +{ + GncOrder *order = obj; + struct _order_select_window *sw = arg; + + if (!arg || !obj) return; + + gnc_order_edit (toplevel, order); +} + +gpointer gnc_order_edit_new_select (gpointer bookp, gpointer order, + GtkWidget *toplevel) +{ + GNCBook *book = bookp; + struct _order_select_window sw; + + g_return_val_if_fail (bookp != NULL, NULL); + + sw.book = book; + + return + gnc_ui_business_chooser_new (toplevel, order, + book, GNC_ORDER_MODULE_NAME, + gnc_order_edit_new_cb, + gnc_order_edit_edit_cb, &sw); +} + +gpointer gnc_order_edit_new_edit (gpointer bookp, gpointer v, + GtkWidget *toplevel) +{ + GNCBook *book = bookp; + GncOrder *order = v; + + g_return_val_if_fail (order != NULL, NULL); + + gnc_order_edit (toplevel, order); + return order; +} diff --git a/src/business/business-gnome/dialog-order.h b/src/business/business-gnome/dialog-order.h new file mode 100644 index 0000000000..002f7e6d9c --- /dev/null +++ b/src/business/business-gnome/dialog-order.h @@ -0,0 +1,27 @@ +/* + * dialog-order.h -- Dialog(s) for Order search and entry + * Copyright (C) 2001 Derek Atkins + * Author: Derek Atkins + */ + + +#ifndef GNC_DIALOG_ORDER_H_ +#define GNC_DIALOG_ORDER_H_ + +/* Functions to create and edit orders */ +GncOrder * gnc_order_new (GtkWidget *parent, GNCBook *book); +void gnc_order_edit (GtkWidget *parent, GncOrder *order); + +/* Callbacks to select a order that match the necessary functions + * for use with the gnc_general_select widget. + * + * new_select provides a selection and the ability to create and edit + * orders. + * new_edit provides only the ability to edit the current selection + */ +gpointer gnc_order_edit_new_select (gpointer book, gpointer c, + GtkWidget *toplevel); +gpointer gnc_order_edit_new_edit (gpointer book, gpointer order, + GtkWidget *toplevel); + +#endif /* GNC_DIALOG_ORDER_H_ */ diff --git a/src/business/business-gnome/gw-business-gnome-spec.scm b/src/business/business-gnome/gw-business-gnome-spec.scm index 074ee6613b..a91f5b69cc 100644 --- a/src/business/business-gnome/gw-business-gnome-spec.scm +++ b/src/business/business-gnome/gw-business-gnome-spec.scm @@ -47,6 +47,7 @@ "#include \n" "#include \n" "#include \n" + "#include \n" "#include \n" ))) @@ -151,6 +152,36 @@ ( cust) ( job)) "Dialog: Select a new job. Parent and Customer may be NULL.") + ;; + ;; dialog-order.h + ;; + + (gw:wrap-function + mod + 'gnc:order-new + ' + "gnc_order_new" + '(( parent) ( book)) + "Dialog: create a new GncOrder. Parent may be NULL.") + + (gw:wrap-function + mod + 'gnc:order-edit + ' + "gnc_order_edit" + '(( parent) ( order)) + "Dialog: Edit a GncOrder. Parent may be NULL.") + + + (gw:wrap-function + mod + 'gnc:order-select + ' + "gnc_order_edit_new_select" + '(( book) ( start_selection) + ( parent)) + "Dialog: Select a GncOrder. Parent and start_selection may be NULL.") + ;; ;; dialog-vendor.h ;; diff --git a/src/business/business-gnome/order.glade b/src/business/business-gnome/order.glade new file mode 100644 index 0000000000..4370576535 --- /dev/null +++ b/src/business/business-gnome/order.glade @@ -0,0 +1,138 @@ + + + + + Order + order + + src + pixmaps + C + True + True + False + False + False + False + + + + GnomeDialog + Order Entry Dialog + Order Entry + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + False + False + False + False + False + + + GtkVBox + GnomeDialog:vbox + dialog-vbox1 + False + 8 + + 4 + True + True + + + + GtkHButtonBox + GnomeDialog:action_area + dialog-action_area1 + GTK_BUTTONBOX_END + 8 + 85 + 27 + 7 + 0 + + 0 + False + True + GTK_PACK_END + + + + GtkButton + button1 + True + True + GNOME_STOCK_BUTTON_OK + + + + GtkButton + button2 + True + True + GNOME_STOCK_BUTTON_APPLY + + + + GtkButton + button3 + True + True + GNOME_STOCK_BUTTON_CANCEL + + + + + GtkVBox + vbox1 + False + 0 + + 0 + True + True + + + + Placeholder + + + + Placeholder + + + + GtkFrame + ledger_frame + 3 + + 0 + GTK_SHADOW_ETCHED_IN + + 3 + True + True + + + + GtkVBox + ledger_vbox + 3 + False + 0 + + + Placeholder + + + + Placeholder + + + + + + + + diff --git a/src/business/business-ledger/gncEntryLedger.c b/src/business/business-ledger/gncEntryLedger.c index adf478fd4b..3449feae48 100644 --- a/src/business/business-ledger/gncEntryLedger.c +++ b/src/business/business-ledger/gncEntryLedger.c @@ -121,3 +121,10 @@ void gnc_entry_ledger_destroy (GncEntryLedger *ledger) gnc_table_destroy (ledger->table); g_free (ledger); } + +Table * gnc_entry_ledger_get_table (GncEntryLedger *ledger) +{ + if (!ledger) return; + return ledger->table; +} + diff --git a/src/business/business-ledger/gncEntryLedger.h b/src/business/business-ledger/gncEntryLedger.h index da5eaf21a7..79606e68df 100644 --- a/src/business/business-ledger/gncEntryLedger.h +++ b/src/business/business-ledger/gncEntryLedger.h @@ -45,4 +45,7 @@ GncEntry * gnc_entry_ledger_get_current_entry (GncEntryLedger *ledger); /* Copy GncEntry information from the list to the rows of the Ledger. */ void gnc_entry_ledger_load (GncEntryLedger *ledger, GList *entry_list); +/* Get the Table */ +Table * gnc_entry_ledger_get_table (GncEntryLedger *ledger); + #endif /* GNC_ENTRY_LEDGER_H */ diff --git a/src/scm/extensions.scm b/src/scm/extensions.scm index ab1aadced8..120a168bae 100644 --- a/src/scm/extensions.scm +++ b/src/scm/extensions.scm @@ -62,8 +62,7 @@ (if gnc:extensions-temp-book gnc:extensions-temp-book (begin - (set! gnc:extensions-temp-book (gnc:book-create - (gnc:get-current-book))) + (set! gnc:extensions-temp-book (gnc:get-current-book)) (gnc:business-create-book gnc:extensions-temp-book) gnc:extensions-temp-book))) @@ -119,7 +118,15 @@ (gnc:employee-select (gnc:extensions-get-book) #f #f)))) + (define new-order-item + (gnc:make-menu-item (N_ "Test New Order Dialog") + (N_ "Test New Order Dialog") + (list "Extensions" "") + (lambda () + (gnc:order-new #f (gnc:extensions-get-book))))) + (gnc:add-extension menu) + (gnc:add-extension new-order-item) (gnc:add-extension select-employee-item) (gnc:add-extension new-employee-item) (gnc:add-extension select-vendor-item)