First pass at an Entry Ledger. It compiles. It still needs

to be tested, and then it needs to be used.


git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@6073 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Derek Atkins
2001-11-26 23:30:33 +00:00
parent 3cb615cae2
commit 997d8e92a7
16 changed files with 1126 additions and 9 deletions

View File

@@ -530,10 +530,10 @@ AC_CHECK_LIB(zvt, main, true,
[AC_MSG_ERROR([libzvt development files not found. See config.log.])],
`$GNOME_CONFIG --libs zvt gtkhtml`)
AC_CHECK_LIB(bonobo, main, true,
[AC_MSG_ERROR([libbonobo development files not found. See config.log.])
],
`$GNOME_CONFIG --libs bonobo`)
#AC_CHECK_LIB(bonobo, main, true,
# [AC_MSG_ERROR([libbonobo development files not found. See config.log.])
#],
# `$GNOME_CONFIG --libs bonobo`)
AC_CHECK_LIB(oaf, main, true,
[AC_MSG_ERROR([liboaf development files not found. See config.log.])],
@@ -843,6 +843,7 @@ AC_OUTPUT(
src/business/business-core/Makefile
src/business/business-core/test/Makefile
src/business/business-gnome/Makefile
src/business/business-ledger/Makefile
dnl # non-makefiles
dnl # Please read doc/build-system before adding *anything* here

View File

@@ -1,4 +1,4 @@
SUBDIRS = \
business-core \
business-gnome
business-gnome \
business-ledger

View File

@@ -59,6 +59,33 @@ struct _gncEntry {
static void addObj (GncEntry *entry);
static void remObj (GncEntry *entry);
static char * typeStrs[] = {
N_("Value"),
N_("Percent"),
N_("Value/Pretax"),
N_("Percent/Pretax")
};
const char *gncEntryGetTaxTypeStr (gint type)
{
return typeStrs[type & 0x01]; /* Only 0, 1 */
}
const char *gncEntryGetDiscountTypeStr (gint type)
{
return typeStrs[type & 0x03]; /* Only 0, 1, 2, 3 */
}
gint gncEntryGetTypeFromStr (const char *type)
{
gint i;
for (i = 0; i < 3; i++)
if (!safe_strcmp (typeStrs[i], type))
return i;
return -1;
}
/* Create/Destroy Functions */
GncEntry *gncEntryCreate (GNCBook *book)
@@ -193,7 +220,7 @@ void gncEntrySetInvoice (GncEntry *entry, GncInvoice *invoice)
void gncEntrySetTaxType (GncEntry *entry, gint type)
{
if (!entry) return;
if (type < 0 || type > 3) return;
if (type < 0 || type > 1) return;
entry->tax_type = type;
entry->dirty = TRUE;

View File

@@ -22,7 +22,7 @@ typedef struct _gncEntry GncEntry;
*/
#define GNC_ENTRY_INTERP_VALUE 0x00
#define GNC_ENTRY_INTERP_PERCENT 0x01
#define GNC_ENTRY_INTERP_PRETAX 0x02
#define GNC_ENTRY_PRETAX_FLAG 0x02
#define GNC_ENTRY_INTERP_IS_VALUE(x) (((x)&0x01) == GNC_ENTRY_INTERP_VALUE)
#define GNC_ENTRY_INTERP_IS_PERCENT(x) (((x)&0x01) == GNC_ENTRY_INTERP_PERCENT)
@@ -58,9 +58,12 @@ gnc_numeric gncEntryGetQuantity (GncEntry *entry);
gnc_numeric gncEntryGetPrice (GncEntry *entry);
gnc_numeric gncEntryGetTax (GncEntry *entry);
gint gncEntryGetTaxType (GncEntry *entry);
const char * gncEntryGetTaxTypeStr (gint type);
gnc_numeric gncEntryGetDiscount (GncEntry *entry);
gint gncEntryGetDiscountType (GncEntry *entry);
const char * gncEntryGetDiscountTypeStr (gint type);
gint gncEntryGetTypeFromStr (const char *type);
Account * gncEntryGetAccount (GncEntry *entry);
Account * gncEntryGetTaxAccount (GncEntry *entry);

View File

@@ -434,7 +434,7 @@ Transaction * gncInvoicePostToAccount (GncInvoice *invoice, Account *acc,
disc = gnc_numeric_mul (subtotal, disc, 100 /* XXX */, GNC_RND_ROUND);
value = gnc_numeric_sub_fixed (subtotal, disc);
if (disc_type & GNC_ENTRY_INTERP_PRETAX)
if (disc_type & GNC_ENTRY_PRETAX_FLAG)
subtotal = value;
acc_val->val = gnc_numeric_add_fixed (acc_val->val, value);

View File

@@ -0,0 +1,6 @@
*.lo
*.la
.deps
.libs
Makefile
Makefile.in

View File

@@ -0,0 +1,36 @@
SUBDIRS = .
pkglib_LTLIBRARIES = libgnc-business-ledger.la
libgnc_business_ledger_la_SOURCES = \
gncEntryLedger.c \
gncEntryLedgerControl.c \
gncEntryLedgerLayout.c \
gncEntryLedgerModel.c
noinst_HEADERS = \
gncEntryLedger.h \
gncEntryLedgerP.h \
gncEntryLedgerControl.h \
gncEntryLedgerLayout.h \
gncEntryLedgerModel.h
libgnc_business_ledger_la_LDFLAGS = -module
libgnc_business_ledger_la_LIBADD = \
${top_srcdir}/src/gnome-utils/libgncmod-gnome-utils.la \
${top_srcdir}/src/app-utils/libgncmod-app-utils.la \
${top_srcdir}/src/register/register-core/libgncmod-register-core.la \
${top_srcdir}/src/register/register-gnome/libgncmod-register-gnome.la
AM_CFLAGS = \
-I../business-core \
-I${top_srcdir}/src \
-I${top_srcdir}/src/engine \
-I${top_srcdir}/src/gnc-module \
-I${top_srcdir}/src/app-utils \
-I${top_srcdir}/src/gnome-utils \
-I${top_srcdir}/src/register/register-core \
${GUILE_INCS} \
${GLADE_CFLAGS} \
${GNOME_INCLUDEDIR} \
${GLIB_CFLAGS}

View File

@@ -0,0 +1,123 @@
/*
* gncEntryLedger.c -- a Ledger widget for entering GncEntry objects
* Copyright (C) 2001 Derek Atkins
* Author: Derek Atkins <warlord@MIT.EDU>
*/
#define _GNU_SOURCE
#include "config.h"
#include <glib.h>
#include "Account.h"
#include "gnc-ui-util.h"
#include "gncEntry.h"
#include "gncEntryLedger.h"
#include "gncEntryLedgerP.h"
#include "gncEntryLedgerLayout.h"
#include "gncEntryLedgerModel.h"
#include "gncEntryLedgerControl.h"
/** Static Functions ***************************************************/
/** Exported Functions ***************************************************/
Account * gnc_entry_ledger_get_account (GncEntryLedger *ledger,
const char * cell_name)
{
const char *name;
if (!gnc_table_layout_get_cell_changed (ledger->table->layout, cell_name,
TRUE))
return NULL;
name = gnc_table_layout_get_cell_value (ledger->table->layout, cell_name);
return xaccGetAccountFromFullName (gnc_book_get_group (ledger->book),
name,
gnc_get_account_separator ());
}
gint gnc_entry_ledger_get_type (GncEntryLedger *ledger, const char * cell_name)
{
const char *typeval;
if (!gnc_table_layout_get_cell_changed (ledger->table->layout, cell_name,
TRUE))
return -1;
typeval = gnc_table_layout_get_cell_value (ledger->table->layout, cell_name);
return gncEntryGetTypeFromStr (typeval);
}
GncEntry * gnc_entry_ledger_get_entry (GncEntryLedger *ledger,
VirtualCellLocation vcell_loc)
{
GUID *guid;
if (!ledger) return NULL;
guid = gnc_table_get_vcell_data (ledger->table, vcell_loc);
if (!guid) return NULL;
return gncEntryLookup (ledger->book, guid);
}
/* Returns the Entry where the cursor is currently located. */
GncEntry * gnc_entry_ledger_get_current_entry (GncEntryLedger *ledger)
{
GUID *guid;
if (!ledger) return NULL;
return
gnc_entry_ledger_get_entry (ledger,
ledger->table->current_cursor_loc.vcell_loc);
}
/* Copy GncEntry information from the list to the rows of the Ledger. */
void gnc_entry_ledger_load (GncEntryLedger *ledger, GList *entry_list);
/* Create and return a new GncEntry Ledger */
GncEntryLedger * gnc_entry_ledger_new (GNCBook *book, GncEntryLedgerType type)
{
GncEntryLedger *ledger;
if (!book) return NULL;
if (type < 0 || type >= GNCENTRY_NUM_REGISTER_TYPES) return NULL;
ledger = g_new0 (GncEntryLedger, 1);
ledger->type = type;
ledger->book = book;
{
TableLayout *layout = gnc_entry_ledger_layout_new (ledger);
TableModel *model = gnc_entry_ledger_model_new ();
TableControl *control = gnc_entry_ledger_control_new ();
control->user_data = ledger;
ledger->table = gnc_table_new (layout, model, control);
}
/* config_cells? */
/* set up header */
/* set up first initial row */
return ledger;
}
/* Destroy the GncEntry Ledger */
void gnc_entry_ledger_destroy (GncEntryLedger *ledger)
{
if (!ledger) return;
gnc_table_destroy (ledger->table);
g_free (ledger);
}

View File

@@ -0,0 +1,48 @@
/*
* gncEntryLedger.h -- a ledger widget for manipulating GncEntry's
* Copyright (C) 2001 Derek Atkins
* Author: Derek Atkins <warlord@MIT.EDU>
*/
#ifndef GNC_ENTRY_LEDGER_H
#define GNC_ENTRY_LEDGER_H
#include "gncEntry.h"
#include "gnc-book.h"
#include "table-allgui.h"
typedef enum {
GNCENTRY_LEDGER,
GNCENTRY_CHOOSER,
GNCENTRY_NUM_REGISTER_TYPES
} GncEntryLedgerType;
#define ENTRY_ACCT_CELL "account"
#define ENTRY_ACTN_CELL "action"
#define ENTRY_DATE_CELL "date"
#define ENTRY_DESC_CELL "description"
#define ENTRY_DISC_CELL "discount"
#define ENTRY_DISTYPE_CELL "discount-type"
#define ENTRY_PRIC_CELL "price"
#define ENTRY_QTY_CELL "quantity"
#define ENTRY_TAXACC_CELL "tax-account"
#define ENTRY_TAXTYPE_CELL "tax-type"
#define ENTRY_TAX_CELL "tax"
typedef struct GncEntryLedger_s GncEntryLedger;
/** Prototypes ***************************************************/
/* Create and return a new GncEntry Ledger */
GncEntryLedger * gnc_entry_ledger_new (GNCBook *book, GncEntryLedgerType type);
/* Destroy the GncEntry Ledger */
void gnc_entry_ledger_destroy (GncEntryLedger *ledger);
/* Returns the Entry where the cursor is currently located. */
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);
#endif /* GNC_ENTRY_LEDGER_H */

View File

@@ -0,0 +1,46 @@
/*
* gncEntryLedgerControl.c -- Control for GncEntry ledger
* Copyright (C) 2001 Derek Atkins
* Author: Derek Atkins <warlord@MIT.EDU>
*/
#define _GNU_SOURCE
#include "config.h"
#include <glib.h>
#include "gncEntryLedgerP.h"
#include "gncEntryLedgerControl.h"
static void gnc_entry_ledger_move_cursor (VirtualLocation *p_new_virt_loc,
gpointer user_data)
{
GncEntryLedger *ledger = user_data;
GncEntry *entry;
if (!ledger) return;
}
static gboolean gnc_entry_ledger_traverse (VirtualLocation *p_new_virt_loc,
gncTableTraversalDir dir,
gpointer user_data)
{
GncEntryLedger *ledger = user_data;
if (!ledger) return FALSE;
return FALSE;
}
TableControl * gnc_entry_ledger_control_new (void)
{
TableControl * control;
control = gnc_table_control_new ();
control->move_cursor = gnc_entry_ledger_move_cursor;
control->traverse = gnc_entry_ledger_traverse;
return control;
}

View File

@@ -0,0 +1,14 @@
/*
* gncEntryLedgerControl.h -- Control of GncEntry Manipulation Widget
* Copyright (C) 2001 Derek Atkins
* Author: Derek Atkins <warlord@MIT.EDU>
*/
#ifndef GNC_ENTRY_LEDGER_CONTROL_H
#define GNC_ENTRY_LEDGER_CONTROL_H
#include "gncEntryLedger.h"
TableControl * gnc_entry_ledger_control_new (void);
#endif /* GNC_ENTRY_LEDGER_CONTROL_H */

View File

@@ -0,0 +1,154 @@
/*
* gncEntryLedgerLayout.c -- Layout for GncEntry ledger
* Copyright (C) 2001 Derek Atkins
* Author: Derek Atkins <warlord@MIT.EDU>
*/
#define _GNU_SOURCE
#include "config.h"
#include <glib.h>
#include "messages.h"
#include "gncEntryLedgerP.h"
#include "gncEntryLedgerLayout.h"
static void
gnc_register_add_cell (TableLayout *layout,
const char *cell_name,
const char *cell_type_name,
const char *sample_text,
CellAlignment alignment,
gboolean expandable,
gboolean span)
{
BasicCell *cell;
g_return_if_fail (layout != NULL);
g_return_if_fail (cell_type_name != NULL);
cell = gnc_register_make_cell (cell_type_name);
gnc_basic_cell_set_name (cell, cell_name);
gnc_basic_cell_set_sample_text (cell, sample_text);
gnc_basic_cell_set_alignment (cell, alignment);
gnc_basic_cell_set_expandable (cell, expandable);
gnc_basic_cell_set_span (cell, span);
gnc_table_layout_add_cell (layout, cell);
}
static void gnc_entry_ledger_layout_add_cells (GncEntryLedger *ledger,
TableLayout *layout)
{
struct cell_list {
const char *cell_name;
const char *cell_type_name;
const char *sample_text;
CellAlignment alignment;
gboolean expandable;
gboolean span;
} cells[] = {
{ ENTRY_DATE_CELL, DATE_CELL_TYPE_NAME, N_("sample:12/12/2000")+7,
CELL_ALIGN_RIGHT, FALSE, FALSE },
{ ENTRY_DESC_CELL, QUICKFILL_CELL_TYPE_NAME,
N_("sample:Description of an Entry")+7, CELL_ALIGN_LEFT, TRUE, FALSE },
{ ENTRY_ACTN_CELL, COMBO_CELL_TYPE_NAME,
N_("sample:Expenses:Automobile:Gasoline")+7, CELL_ALIGN_RIGHT,
FALSE, FALSE },
{ ENTRY_QTY_CELL, PRICE_CELL_TYPE_NAME, N_("sample:999,999.000") + 7,
CELL_ALIGN_RIGHT, FALSE, FALSE },
{ ENTRY_PRIC_CELL, PRICE_CELL_TYPE_NAME, N_("sample:999,999.000") + 7,
CELL_ALIGN_RIGHT, FALSE, FALSE },
{ ENTRY_TAX_CELL, PRICE_CELL_TYPE_NAME, N_("sample:999,999.000") + 7,
CELL_ALIGN_RIGHT, FALSE, FALSE },
{ ENTRY_DISC_CELL, PRICE_CELL_TYPE_NAME, N_("sample:999,999.000") + 7,
CELL_ALIGN_RIGHT, FALSE, FALSE },
{ ENTRY_ACCT_CELL, COMBO_CELL_TYPE_NAME, N_("sample:Transfer:Account")+7,
CELL_ALIGN_LEFT, FALSE, FALSE },
{ ENTRY_TAXACC_CELL, COMBO_CELL_TYPE_NAME, N_("sample:Tax:Account")+7,
CELL_ALIGN_LEFT, FALSE, FALSE },
{ ENTRY_TAXTYPE_CELL, COMBO_CELL_TYPE_NAME, N_("sample:TaxType")+7,
CELL_ALIGN_LEFT, FALSE, FALSE },
{ ENTRY_DISTYPE_CELL, COMBO_CELL_TYPE_NAME, N_("sample:DiscountType")+7,
CELL_ALIGN_LEFT, FALSE, FALSE }
};
int i;
for (i = 0; i < (sizeof(cells)/sizeof(*cells)); i++)
gnc_register_add_cell (layout, cells[i].cell_name, cells[i].cell_type_name,
cells[i].sample_text, cells[i].alignment,
cells[i].expandable, cells[i].span);
}
static void gnc_entry_ledger_layout_add_cursors (GncEntryLedger *ledger,
TableLayout *layout)
{
CellBlock *cursor;
int num_cols;
switch (ledger->type) {
case GNCENTRY_LEDGER:
case GNCENTRY_CHOOSER:
num_cols = 11; /* ??? */
break;
default:
g_assert (FALSE);
return;
}
cursor = gnc_cellblock_new (1, num_cols, CURSOR_HEADER);
gnc_table_layout_add_cursor (layout, cursor);
cursor = gnc_cellblock_new (1, num_cols, "cursor");
gnc_table_layout_add_cursor (layout, cursor);
gnc_table_layout_set_primary_cursor (layout, cursor);
}
static void gnc_entry_ledger_set_cells (GncEntryLedger *ledger,
TableLayout *layout)
{
CellBlock *curs;
CellBlock *curs_last;
int x = 0;
switch (ledger->type) {
case GNCENTRY_LEDGER:
case GNCENTRY_CHOOSER:
curs = gnc_table_layout_get_cursor (layout, "cursor");
gnc_table_layout_set_cell (layout, curs, ENTRY_DATE_CELL, 0, x++);
gnc_table_layout_set_cell (layout, curs, ENTRY_DESC_CELL, 0, x++);
gnc_table_layout_set_cell (layout, curs, ENTRY_ACTN_CELL, 0, x++);
gnc_table_layout_set_cell (layout, curs, ENTRY_ACCT_CELL, 0, x++);
gnc_table_layout_set_cell (layout, curs, ENTRY_QTY_CELL, 0, x++);
gnc_table_layout_set_cell (layout, curs, ENTRY_PRIC_CELL, 0, x++);
gnc_table_layout_set_cell (layout, curs, ENTRY_DISTYPE_CELL, 0, x++);
gnc_table_layout_set_cell (layout, curs, ENTRY_DISC_CELL, 0, x++);
gnc_table_layout_set_cell (layout, curs, ENTRY_TAXTYPE_CELL, 0, x++);
gnc_table_layout_set_cell (layout, curs, ENTRY_TAX_CELL, 0, x++);
gnc_table_layout_set_cell (layout, curs, ENTRY_TAXACC_CELL, 0, x++);
break;
default:
g_assert (FALSE);
return;
}
}
TableLayout * gnc_entry_ledger_layout_new (GncEntryLedger *ledger)
{
TableLayout *layout;
layout = gnc_table_layout_new ();
gnc_entry_ledger_layout_add_cells (ledger, layout);
gnc_entry_ledger_layout_add_cursors (ledger, layout);
gnc_entry_ledger_set_cells (ledger, layout);
return layout;
}

View File

@@ -0,0 +1,14 @@
/*
* gncEntryLedgerLayout.h -- Layout of GncEntry Manipulation Widget
* Copyright (C) 2001 Derek Atkins
* Author: Derek Atkins <warlord@MIT.EDU>
*/
#ifndef GNC_ENTRY_LEDGER_LAYOUT_H
#define GNC_ENTRY_LEDGER_LAYOUT_H
#include "gncEntryLedger.h"
TableLayout * gnc_entry_ledger_layout_new (GncEntryLedger *ledger);
#endif /* GNC_ENTRY_LEDGER_LAYOUT_H */

View File

@@ -0,0 +1,605 @@
/*
* gncEntryLedgerModel.c -- Model for GncEntry ledger
* Copyright (C) 2001 Derek Atkins
* Author: Derek Atkins <warlord@MIT.EDU>
*/
#define _GNU_SOURCE
#include "config.h"
#include <glib.h>
#include "messages.h"
#include "Account.h"
#include "gnc-ui-util.h"
#include "datecell.h"
#include "pricecell.h"
#include "gncEntryLedgerP.h"
#include "gncEntryLedgerModel.h"
/** Private Interfaces ***********************************************/
/* GET_LABEL */
static const char * get_acct_label (VirtualLocation virt_loc, gpointer data)
{
return _("Account");
}
static const char * get_actn_label (VirtualLocation virt_loc, gpointer data)
{
return _("Action");
}
static const char * get_date_label (VirtualLocation virt_loc, gpointer data)
{
return _("Date");
}
static const char * get_desc_label (VirtualLocation virt_loc, gpointer data)
{
return _("Description");
}
static const char * get_disc_label (VirtualLocation virt_loc, gpointer data)
{
return _("Discount");
}
static const char * get_distype_label (VirtualLocation virt_loc, gpointer data)
{
return _("Discount Type");
}
static const char * get_pric_label (VirtualLocation virt_loc, gpointer data)
{
return _("Price");
}
static const char * get_qty_label (VirtualLocation virt_loc, gpointer data)
{
return _("Quantity");
}
static const char * get_taxacc_label (VirtualLocation virt_loc, gpointer data)
{
return _("Tax Account");
}
static const char * get_taxtype_label (VirtualLocation virt_loc, gpointer data)
{
return _("Tax Type");
}
static const char * get_tax_label (VirtualLocation virt_loc, gpointer data)
{
return _("Tax");
}
/* GET_ENTRY */
static const char * get_acct_entry (VirtualLocation virt_loc,
gboolean translate,
gboolean *conditionally_changed,
gpointer user_data)
{
static char *name = NULL;
GncEntryLedger *ledger = user_data;
GncEntry *entry;
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
g_free (name);
name = xaccAccountGetFullName (gncEntryGetAccount (entry),
gnc_get_account_separator ());
return name;
}
static const char * get_actn_entry (VirtualLocation virt_loc,
gboolean translate,
gboolean *conditionally_changed,
gpointer user_data)
{
GncEntryLedger *ledger = user_data;
GncEntry *entry;
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
return gncEntryGetAction (entry);
}
static const char * get_date_entry (VirtualLocation virt_loc,
gboolean translate,
gboolean *conditionally_changed,
gpointer user_data)
{
GncEntryLedger *ledger = user_data;
GncEntry *entry;
Timespec ts;
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
ts = gncEntryGetDate (entry);
return gnc_print_date (ts);
}
static const char * get_desc_entry (VirtualLocation virt_loc,
gboolean translate,
gboolean *conditionally_changed,
gpointer user_data)
{
GncEntryLedger *ledger = user_data;
GncEntry *entry;
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
return gncEntryGetDescription (entry);
}
static const char * get_disc_entry (VirtualLocation virt_loc,
gboolean translate,
gboolean *conditionally_changed,
gpointer user_data)
{
GncEntryLedger *ledger = user_data;
GncEntry *entry;
gnc_numeric discount;
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
discount = gncEntryGetDiscount (entry);
if (gnc_numeric_zero_p (discount))
return NULL;
return xaccPrintAmount (discount, gnc_default_price_print_info ());
}
static const char * get_distype_entry (VirtualLocation virt_loc,
gboolean translate,
gboolean *conditionally_changed,
gpointer user_data)
{
GncEntryLedger *ledger = user_data;
GncEntry *entry;
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
return gncEntryGetDiscountTypeStr (gncEntryGetDiscountType (entry));
}
static const char * get_pric_entry (VirtualLocation virt_loc,
gboolean translate,
gboolean *conditionally_changed,
gpointer user_data)
{
GncEntryLedger *ledger = user_data;
GncEntry *entry;
gnc_numeric price;
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
price = gncEntryGetPrice (entry);
if (gnc_numeric_zero_p (price))
return NULL;
return xaccPrintAmount (price, gnc_default_price_print_info ());
}
static const char * get_qty_entry (VirtualLocation virt_loc,
gboolean translate,
gboolean *conditionally_changed,
gpointer user_data)
{
GncEntryLedger *ledger = user_data;
GncEntry *entry;
gnc_numeric qty;
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
qty = gncEntryGetQuantity (entry);
if (gnc_numeric_zero_p (qty))
return NULL;
return xaccPrintAmount (qty, gnc_default_price_print_info ());
}
static const char * get_taxacc_entry (VirtualLocation virt_loc,
gboolean translate,
gboolean *conditionally_changed,
gpointer user_data)
{
char * name = NULL;
GncEntryLedger *ledger = user_data;
GncEntry *entry;
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
g_free (name);
name = xaccAccountGetFullName (gncEntryGetTaxAccount (entry),
gnc_get_account_separator ());
return name;
}
static const char * get_taxtype_entry (VirtualLocation virt_loc,
gboolean translate,
gboolean *conditionally_changed,
gpointer user_data)
{
GncEntryLedger *ledger = user_data;
GncEntry *entry;
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
return gncEntryGetTaxTypeStr (gncEntryGetTaxType (entry));
}
static const char * get_tax_entry (VirtualLocation virt_loc,
gboolean translate,
gboolean *conditionally_changed,
gpointer user_data)
{
GncEntryLedger *ledger = user_data;
GncEntry *entry;
gnc_numeric tax;
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
tax = gncEntryGetTax (entry);
if (gnc_numeric_zero_p (tax))
return NULL;
return xaccPrintAmount (tax, gnc_default_price_print_info ());
}
/* GET_HELP */
static char * get_acct_help (VirtualLocation virt_loc, gpointer user_data)
{
const char *help;
GncEntryLedger *ledger = user_data;
help = gnc_table_get_entry (ledger->table, virt_loc);
if (!help || *help == '\0')
help = _("Enter the income/expense account for the Entry, "
"or choose one from the list");
return g_strdup (help);
}
static char * get_actn_help (VirtualLocation virt_loc, gpointer user_data)
{
GncEntryLedger *ledger = user_data;
const char *help;
help = gnc_table_get_entry (ledger->table, virt_loc);
if (!help || *help == '\0')
help = _("Enter the type of Entry");
return g_strdup (help);
}
static char * get_date_help (VirtualLocation virt_loc, gpointer user_data)
{
GncEntryLedger *ledger = user_data;
BasicCell *cell;
char string[1024];
struct tm *tm;
Timespec ts;
time_t tt;
cell = gnc_table_get_cell (ledger->table, virt_loc);
if (!cell)
return NULL;
if (!cell->value || *cell->value == '\0')
return NULL;
gnc_date_cell_get_date ((DateCell *) cell, &ts);
tt = ts.tv_sec;
tm = localtime (&tt);
strftime (string, sizeof(string), "%A %d %B %Y", tm);
return g_strdup (string);
}
static char * get_desc_help (VirtualLocation virt_loc, gpointer user_data)
{
GncEntryLedger *ledger = user_data;
const char *help;
help = gnc_table_get_entry (ledger->table, virt_loc);
if (!help || *help == '\0')
help = _("Enter the Entry Description");
return g_strdup (help);
}
static char * get_disc_help (VirtualLocation virt_loc, gpointer user_data)
{
GncEntryLedger *ledger = user_data;
const char *help;
GncEntry *entry;
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
if (GNC_ENTRY_INTERP_IS_VALUE (gncEntryGetDiscountType (entry)))
help = _("Enter the Discount Amount");
else
help = _("Enter the Discount Percent");
return g_strdup (help);
}
static char * get_distype_help (VirtualLocation virt_loc, gpointer user_data)
{
GncEntryLedger *ledger = user_data;
const char *help;
help = gnc_table_get_entry (ledger->table, virt_loc);
if (!help || *help == '\0')
help = _("Select the Discount type");
return g_strdup (help);
}
static char * get_pric_help (VirtualLocation virt_loc, gpointer user_data)
{
GncEntryLedger *ledger = user_data;
const char *help;
help = gnc_table_get_entry (ledger->table, virt_loc);
if (!help || *help == '\0')
help = _("Enter the unit-Price for this Entry");
return g_strdup (help);
}
static char * get_qty_help (VirtualLocation virt_loc, gpointer user_data)
{
GncEntryLedger *ledger = user_data;
const char *help;
help = gnc_table_get_entry (ledger->table, virt_loc);
if (!help || *help == '\0')
help = _("Enter the Quantity of units for this Entry");
return g_strdup (help);
}
static char * get_taxacc_help (VirtualLocation virt_loc, gpointer user_data)
{
GncEntryLedger *ledger = user_data;
const char *help;
help = gnc_table_get_entry (ledger->table, virt_loc);
if (!help || *help == '\0')
help = _("Enter the Account for tax holdings or choose one from the list");
return g_strdup (help);
}
static char * get_taxtype_help (VirtualLocation virt_loc, gpointer user_data)
{
GncEntryLedger *ledger = user_data;
const char *help;
help = gnc_table_get_entry (ledger->table, virt_loc);
if (!help || *help == '\0')
help = _("Select the Tax Type");
return g_strdup (help);
}
static char * get_tax_help (VirtualLocation virt_loc, gpointer user_data)
{
GncEntryLedger *ledger = user_data;
const char *help;
GncEntry *entry;
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
if (GNC_ENTRY_INTERP_IS_VALUE (gncEntryGetDiscountType (entry)))
help = _("Enter the Tax Amount");
else
help = _("Enter the Tax Percent");
return g_strdup (help);
}
/* GET_IO_FLAGS */
static CellIOFlags get_standard_io_flags (VirtualLocation virt_loc,
gpointer user_data)
{
return XACC_CELL_ALLOW_ALL;
}
/* SAVE CELLS */
static void gnc_entry_ledger_save_cells (gpointer save_data,
gpointer user_data)
{
GncEntryLedger *ledger = user_data;
GncEntry *entry = save_data;
g_return_if_fail (entry != NULL);
/* copy the contents from the cursor to the split */
if (gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_ACCT_CELL, TRUE)) {
Account *acc;
acc = gnc_entry_ledger_get_account (ledger, ENTRY_ACCT_CELL);
if (acc != NULL)
gncEntrySetAccount (entry, acc);
}
if (gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_ACTN_CELL, TRUE)) {
const char *value;
value = gnc_table_layout_get_cell_value (ledger->table->layout,
ENTRY_ACTN_CELL);
gncEntrySetAction (entry, value);
}
if (gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_DATE_CELL, TRUE)) {
BasicCell *cell;
Timespec ts;
cell = gnc_table_layout_get_cell (ledger->table->layout, ENTRY_DATE_CELL);
/* commit any pending changes */
gnc_date_cell_commit ((DateCell *) cell);
gnc_date_cell_get_date ((DateCell *) cell, &ts);
gncEntrySetDate (entry, &ts);
}
if (gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_DESC_CELL, TRUE)) {
const char *value;
value = gnc_table_layout_get_cell_value (ledger->table->layout,
ENTRY_DESC_CELL);
gncEntrySetDescription (entry, value);
}
if (gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_DISC_CELL, TRUE)) {
PriceCell *cell;
gnc_numeric amount;
cell = (PriceCell *) gnc_table_layout_get_cell (ledger->table->layout,
ENTRY_DISC_CELL);
amount = gnc_price_cell_get_value (cell);
gncEntrySetDiscount (entry, amount);
}
if (gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_DISTYPE_CELL, TRUE)) {
gint type;
type = gnc_entry_ledger_get_type (ledger, ENTRY_DISTYPE_CELL);
if (type != -1)
gncEntrySetDiscountType (entry, type);
}
if (gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_PRIC_CELL, TRUE)) {
PriceCell *cell;
gnc_numeric amount;
cell = (PriceCell *) gnc_table_layout_get_cell (ledger->table->layout,
ENTRY_PRIC_CELL);
amount = gnc_price_cell_get_value (cell);
gncEntrySetPrice (entry, amount);
}
if (gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_QTY_CELL, TRUE)) {
PriceCell *cell;
gnc_numeric amount;
cell = (PriceCell *) gnc_table_layout_get_cell (ledger->table->layout,
ENTRY_QTY_CELL);
amount = gnc_price_cell_get_value (cell);
gncEntrySetQuantity (entry, amount);
}
if (gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_TAXACC_CELL, TRUE)) {
Account *acc;
acc = gnc_entry_ledger_get_account (ledger, ENTRY_TAXACC_CELL);
if (acc != NULL)
gncEntrySetTaxAccount (entry, acc);
}
if (gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_TAXTYPE_CELL, TRUE)) {
gint type;
type = gnc_entry_ledger_get_type (ledger, ENTRY_TAXTYPE_CELL);
if (type != -1)
gncEntrySetTaxType (entry, type);
}
if (gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_TAX_CELL, TRUE)) {
PriceCell *cell;
gnc_numeric amount;
cell = (PriceCell *) gnc_table_layout_get_cell (ledger->table->layout,
ENTRY_TAX_CELL);
amount = gnc_price_cell_get_value (cell);
gncEntrySetTax (entry, amount);
}
}
/* Set Cell Handlers */
static void gnc_entry_ledger_model_new_handlers (TableModel *model)
{
struct model_desc {
const char * cell;
gpointer entry_handler;
gpointer label_handler;
gpointer help_handler;
gpointer io_flags_handler;
} models[] = {
{ ENTRY_ACCT_CELL, get_acct_entry, get_acct_label, get_acct_help, get_standard_io_flags },
{ ENTRY_ACTN_CELL, get_actn_entry, get_actn_label, get_actn_help, get_standard_io_flags },
{ ENTRY_DATE_CELL, get_date_entry, get_date_label, get_date_help, get_standard_io_flags },
{ ENTRY_DESC_CELL, get_desc_entry, get_desc_label, get_desc_help, get_standard_io_flags },
{ ENTRY_DISC_CELL, get_disc_entry, get_disc_label, get_disc_help, get_standard_io_flags },
{ ENTRY_DISTYPE_CELL, get_distype_entry, get_distype_label, get_distype_help, get_standard_io_flags },
{ ENTRY_PRIC_CELL, get_pric_entry, get_pric_label, get_pric_help, get_standard_io_flags },
{ ENTRY_QTY_CELL, get_qty_entry, get_qty_label, get_qty_help, get_standard_io_flags },
{ ENTRY_TAXACC_CELL, get_taxacc_entry, get_taxacc_label, get_taxacc_help, get_standard_io_flags },
{ ENTRY_TAXTYPE_CELL, get_taxtype_entry, get_taxtype_label, get_taxtype_help, get_standard_io_flags },
{ ENTRY_TAX_CELL, get_tax_entry, get_tax_label, get_tax_help, get_standard_io_flags }
};
int i;
for (i = 0; i < (sizeof(models)/sizeof(*models)); i++) {
if (models[i].entry_handler)
gnc_table_model_set_entry_handler (model, models[i].entry_handler,
models[i].cell);
if (models[i].label_handler)
gnc_table_model_set_label_handler (model, models[i].label_handler,
models[i].cell);
if (models[i].help_handler)
gnc_table_model_set_help_handler (model, models[i].help_handler,
models[i].cell);
if (models[i].io_flags_handler)
gnc_table_model_set_io_flags_handler (model, models[i].io_flags_handler,
models[i].cell);
} /* for */
/*
model->cell_data_allocator = ;
model->cell_data_deallocator = ;
model->cell_data_copy = ;
*/
model->save_handler = gnc_entry_ledger_save_cells;
}
/** Public Interface ***********************************************/
TableModel * gnc_entry_ledger_model_new (void)
{
TableModel * model;
model = gnc_table_model_new ();
gnc_entry_ledger_model_new_handlers (model);
return model;
}

View File

@@ -0,0 +1,14 @@
/*
* gncEntryLedgerModel.h -- Model of GncEntry Manipulation Widget
* Copyright (C) 2001 Derek Atkins
* Author: Derek Atkins <warlord@MIT.EDU>
*/
#ifndef GNC_ENTRY_LEDGER_MODEL_H
#define GNC_ENTRY_LEDGER_MODEL_H
#include "gncEntryLedger.h"
TableModel * gnc_entry_ledger_model_new (void);
#endif /* GNC_ENTRY_LEDGER_MODEL_H */

View File

@@ -0,0 +1,26 @@
/*
* gncEntryLedgerP.h -- a ledger widget for manipulating GncEntry's
* Copyright (C) 2001 Derek Atkins
* Author: Derek Atkins <warlord@MIT.EDU>
*/
#ifndef GNC_ENTRY_LEDGERP_H
#define GNC_ENTRY_LEDGERP_H
#include "gnc-book.h"
#include "table-allgui.h"
#include "gncEntryLedger.h"
struct GncEntryLedger_s {
GNCBook *book;
Table *table;
GncEntryLedgerType type;
};
GncEntry * gnc_entry_ledger_get_entry (GncEntryLedger *ledger,
VirtualCellLocation vcell_loc);
Account * gnc_entry_ledger_get_account (GncEntryLedger *ledger,
const char * cell_name);
gint gnc_entry_ledger_get_type (GncEntryLedger *ledger, const char * cell_name);
#endif /* GNC_ENTRY_LEDGERP_H */