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
This commit is contained in:
Derek Atkins 2001-11-29 23:04:34 +00:00
parent bc86148363
commit aefeab1033
10 changed files with 568 additions and 4 deletions

View File

@ -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 */

View File

@ -16,6 +16,7 @@ typedef enum {
} GncOrderType;
#include "gnc-book.h"
#include "gncEntry.h"
#include "gncJob.h"
#include "gncVendor.h"

View File

@ -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)

View File

@ -0,0 +1,340 @@
/*
* dialog-order.c -- Dialog for Order entry
* Copyright (C) 2001 Derek Atkins
* Author: Derek Atkins <warlord@MIT.EDU>
*/
#include "config.h"
#include <gnome.h>
#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;
}

View File

@ -0,0 +1,27 @@
/*
* dialog-order.h -- Dialog(s) for Order search and entry
* Copyright (C) 2001 Derek Atkins
* Author: Derek Atkins <warlord@MIT.EDU>
*/
#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_ */

View File

@ -47,6 +47,7 @@
"#include <dialog-employee.h>\n"
"#include <dialog-job.h>\n"
"#include <dialog-job-select.h>\n"
"#include <dialog-order.h>\n"
"#include <dialog-vendor.h>\n"
)))
@ -151,6 +152,36 @@
(<gnc:GncCustomer*> cust) (<gnc:GncJob*> job))
"Dialog: Select a new job. Parent and Customer may be NULL.")
;;
;; dialog-order.h
;;
(gw:wrap-function
mod
'gnc:order-new
'<gnc:GncOrder*>
"gnc_order_new"
'((<gnc:UIWidget> parent) (<gnc:Book*> book))
"Dialog: create a new GncOrder. Parent may be NULL.")
(gw:wrap-function
mod
'gnc:order-edit
'<gw:void>
"gnc_order_edit"
'((<gnc:UIWidget> parent) (<gnc:GncOrder*> order))
"Dialog: Edit a GncOrder. Parent may be NULL.")
(gw:wrap-function
mod
'gnc:order-select
'<gnc:GncOrder*>
"gnc_order_edit_new_select"
'((<gnc:Book*> book) (<gnc:GncOrder*> start_selection)
(<gnc:UIWidget> parent))
"Dialog: Select a GncOrder. Parent and start_selection may be NULL.")
;;
;; dialog-vendor.h
;;

View File

@ -0,0 +1,138 @@
<?xml version="1.0"?>
<GTK-Interface>
<project>
<name>Order</name>
<program_name>order</program_name>
<directory></directory>
<source_directory>src</source_directory>
<pixmaps_directory>pixmaps</pixmaps_directory>
<language>C</language>
<gnome_support>True</gnome_support>
<gettext_support>True</gettext_support>
<output_main_file>False</output_main_file>
<output_support_files>False</output_support_files>
<output_build_files>False</output_build_files>
<backup_source_files>False</backup_source_files>
</project>
<widget>
<class>GnomeDialog</class>
<name>Order Entry Dialog</name>
<title>Order Entry</title>
<type>GTK_WINDOW_TOPLEVEL</type>
<position>GTK_WIN_POS_NONE</position>
<modal>False</modal>
<allow_shrink>False</allow_shrink>
<allow_grow>False</allow_grow>
<auto_shrink>False</auto_shrink>
<auto_close>False</auto_close>
<hide_on_close>False</hide_on_close>
<widget>
<class>GtkVBox</class>
<child_name>GnomeDialog:vbox</child_name>
<name>dialog-vbox1</name>
<homogeneous>False</homogeneous>
<spacing>8</spacing>
<child>
<padding>4</padding>
<expand>True</expand>
<fill>True</fill>
</child>
<widget>
<class>GtkHButtonBox</class>
<child_name>GnomeDialog:action_area</child_name>
<name>dialog-action_area1</name>
<layout_style>GTK_BUTTONBOX_END</layout_style>
<spacing>8</spacing>
<child_min_width>85</child_min_width>
<child_min_height>27</child_min_height>
<child_ipad_x>7</child_ipad_x>
<child_ipad_y>0</child_ipad_y>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>True</fill>
<pack>GTK_PACK_END</pack>
</child>
<widget>
<class>GtkButton</class>
<name>button1</name>
<can_default>True</can_default>
<can_focus>True</can_focus>
<stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
</widget>
<widget>
<class>GtkButton</class>
<name>button2</name>
<can_default>True</can_default>
<can_focus>True</can_focus>
<stock_button>GNOME_STOCK_BUTTON_APPLY</stock_button>
</widget>
<widget>
<class>GtkButton</class>
<name>button3</name>
<can_default>True</can_default>
<can_focus>True</can_focus>
<stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
</widget>
</widget>
<widget>
<class>GtkVBox</class>
<name>vbox1</name>
<homogeneous>False</homogeneous>
<spacing>0</spacing>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
<widget>
<class>Placeholder</class>
</widget>
<widget>
<class>Placeholder</class>
</widget>
<widget>
<class>GtkFrame</class>
<name>ledger_frame</name>
<border_width>3</border_width>
<label>Order Entries</label>
<label_xalign>0</label_xalign>
<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
<child>
<padding>3</padding>
<expand>True</expand>
<fill>True</fill>
</child>
<widget>
<class>GtkVBox</class>
<name>ledger_vbox</name>
<border_width>3</border_width>
<homogeneous>False</homogeneous>
<spacing>0</spacing>
<widget>
<class>Placeholder</class>
</widget>
<widget>
<class>Placeholder</class>
</widget>
</widget>
</widget>
</widget>
</widget>
</widget>
</GTK-Interface>

View File

@ -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;
}

View File

@ -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 */

View File

@ -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)