From a04fd0f69065fd0c8026a6b6e95a31efa4cbdd7c Mon Sep 17 00:00:00 2001 From: Dave Peticolas Date: Fri, 29 Dec 2000 11:45:55 +0000 Subject: [PATCH] More work on refresh arch. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@3368 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/MultiLedger.c | 559 +++++++++++++++++---------- src/MultiLedger.h | 51 ++- src/gnc-component-manager.c | 62 ++- src/gnome/dialog-find-transactions.c | 5 +- src/gnome/dialog-transfer.c | 8 +- src/gnome/window-main.c | 30 +- src/gnome/window-reconcile.c | 30 +- src/gnome/window-register.c | 356 ++++++++++------- 8 files changed, 671 insertions(+), 430 deletions(-) diff --git a/src/MultiLedger.c b/src/MultiLedger.c index 86befce630..fccb572d9e 100644 --- a/src/MultiLedger.c +++ b/src/MultiLedger.c @@ -39,18 +39,112 @@ #define REGISTER_SUBACCOUNT_CM_CLASS "register-subaccount" #define REGISTER_GL_CM_CLASS "register-gl" + +struct _xaccLedgerDisplay +{ + GUID leader; + + Query *query; + + LedgerDisplayType ld_type; + + SplitRegister *reg; + + LedgerDisplayDestroy destroy; + LedgerDisplayGetParent get_parent; + LedgerDisplaySetHelp set_help; + + gpointer user_data; + + gint component_id; +}; + + /** GLOBALS *********************************************************/ static short module = MOD_LEDGER; /** Declarations ****************************************************/ static xaccLedgerDisplay * -xaccLedgerDisplayInternal (Account *lead_account, GList *accounts, Query *q, - SplitRegisterType type, SplitRegisterStyle style); +xaccLedgerDisplayInternal (Account *lead_account, Query *q, + LedgerDisplayType ld_type, + SplitRegisterType reg_type, + SplitRegisterStyle style); /** Implementations *************************************************/ +Account * +xaccLedgerDisplayLeader (xaccLedgerDisplay *ld) +{ + if (!ld) + return NULL; + + return xaccAccountLookup (&ld->leader); +} + +void +xaccLedgerDisplaySetUserData (xaccLedgerDisplay *ld, gpointer user_data) +{ + if (!ld) + return; + + ld->user_data = user_data; +} + +gpointer +xaccLedgerDisplayGetUserData (xaccLedgerDisplay *ld) +{ + if (!ld) + return NULL; + + return ld->user_data; +} + +void +xaccLedgerDisplaySetHandlers (xaccLedgerDisplay *ld, + LedgerDisplayDestroy destroy, + LedgerDisplayGetParent get_parent, + LedgerDisplaySetHelp set_help) +{ + if (!ld) + return; + + ld->destroy = destroy; + ld->get_parent = get_parent; + ld->set_help = set_help; +} + +SplitRegister * +xaccLedgerDisplayGetSR (xaccLedgerDisplay *ld) +{ + if (!ld) + return NULL; + + return ld->reg; +} + +Query * +xaccLedgerDisplayGetQuery (xaccLedgerDisplay *ld) +{ + if (!ld) + return NULL; + + return ld->query; +} + +static gboolean +find_by_leader (gpointer find_data, gpointer user_data) +{ + Account *account = find_data; + xaccLedgerDisplay *ld = user_data; + + if (!account || !ld) + return FALSE; + + return (account == xaccLedgerDisplayLeader (ld)); +} + static gboolean find_by_account (gpointer find_data, gpointer user_data) { @@ -60,15 +154,12 @@ find_by_account (gpointer find_data, gpointer user_data) if (!account || !ld) return FALSE; - if (account == ld->leader) + if (account == xaccLedgerDisplayLeader (ld)) return TRUE; - if (ld->type < NUM_SINGLE_REGISTER_TYPES) + if (ld->ld_type == LD_SINGLE) return FALSE; - if (ld->displayed_accounts) - return g_list_find (ld->displayed_accounts, account) != NULL; - /* Hack. */ return TRUE; } @@ -108,6 +199,121 @@ gnc_get_default_register_style () return new_style; } +static SplitRegisterType +get_reg_type (Account *leader, LedgerDisplayType ld_type) +{ + GNCAccountType account_type; + SplitRegisterType reg_type; + GList *subaccounts; + GList *node; + + if (ld_type == LD_GL) + return GENERAL_LEDGER; + + account_type = xaccAccountGetType (leader); + + if (ld_type == LD_SINGLE) + { + switch (account_type) + { + case BANK: + return BANK_REGISTER; + + case CASH: + return CASH_REGISTER; + + case ASSET: + return ASSET_REGISTER; + + case CREDIT: + return CREDIT_REGISTER; + + case LIABILITY: + return LIABILITY_REGISTER; + + case STOCK: + case MUTUAL: + return STOCK_REGISTER; + + case INCOME: + return INCOME_REGISTER; + + case EXPENSE: + return EXPENSE_REGISTER; + + case EQUITY: + return EQUITY_REGISTER; + + case CURRENCY: + return CURRENCY_REGISTER; + + default: + PERR ("unknown account type %d\n", account_type); + return BANK_REGISTER; + } + } + + if (ld_type != LD_SUBACCOUNT) + { + PERR ("unknown ledger type %d\n", ld_type); + return BANK_REGISTER; + } + + subaccounts = xaccGroupGetSubAccounts (xaccAccountGetChildren (leader)); + + switch (account_type) + { + case BANK: + case CASH: + case ASSET: + case CREDIT: + case LIABILITY: + /* if any of the sub-accounts have STOCK or MUTUAL types, + * then we must use the PORTFOLIO_LEDGER ledger. Otherwise, + * a plain old GENERAL_LEDGER will do. */ + reg_type = GENERAL_LEDGER; + + for (node = subaccounts; node; node = node->next) + { + GNCAccountType le_type; + + le_type = xaccAccountGetType (node->data); + if ((STOCK == le_type) || + (MUTUAL == le_type) || + (CURRENCY == le_type)) + { + reg_type = PORTFOLIO_LEDGER; + break; + } + } + break; + + case STOCK: + case MUTUAL: + case CURRENCY: + reg_type = PORTFOLIO_LEDGER; + break; + + case INCOME: + case EXPENSE: + reg_type = INCOME_LEDGER; + break; + + case EQUITY: + reg_type = GENERAL_LEDGER; + break; + + default: + PERR ("unknown account type:%d", account_type); + reg_type = GENERAL_LEDGER; + break; + } + + g_list_free (subaccounts); + + return reg_type; +} + /********************************************************************\ * regWindowSimple * * opens up a register window to display a single account * @@ -120,78 +326,13 @@ xaccLedgerDisplay * xaccLedgerDisplaySimple (Account *account) { SplitRegisterType reg_type; - GNCAccountType account_type; - account_type = xaccAccountGetType (account); + reg_type = get_reg_type (account, LD_SINGLE); - /* translate between different enumerants */ - switch (account_type) - { - case BANK: - reg_type = BANK_REGISTER; - break; - case CASH: - reg_type = CASH_REGISTER; - break; - case ASSET: - reg_type = ASSET_REGISTER; - break; - case CREDIT: - reg_type = CREDIT_REGISTER; - break; - case LIABILITY: - reg_type = LIABILITY_REGISTER; - break; - case STOCK: - case MUTUAL: - reg_type = STOCK_REGISTER; - break; - case INCOME: - reg_type = INCOME_REGISTER; - break; - case EXPENSE: - reg_type = EXPENSE_REGISTER; - break; - case EQUITY: - reg_type = EQUITY_REGISTER; - break; - case CURRENCY: - reg_type = CURRENCY_REGISTER; - break; - default: - PERR ("unknown account type %d\n", account_type); - return NULL; - } - - return xaccLedgerDisplayInternal (account, NULL, NULL, reg_type, + return xaccLedgerDisplayInternal (account, NULL, LD_SINGLE, reg_type, gnc_get_default_register_style ()); } -static GList * -xaccAccountPrependChildren (Account *account, GList *list) -{ - AccountGroup *group; - int num_accounts; - int i; - - if (!account) return NULL; - - list = g_list_prepend(list, account); - - group = xaccAccountGetChildren (account); - if (group == NULL) - return list; - - num_accounts = xaccGroupGetNumAccounts (group); - for (i = 0; i < num_accounts; i++) - { - account = xaccGroupGetAccount (group, i); - list = xaccAccountPrependChildren (account, list); - } - - return list; -} - /********************************************************************\ * xaccLedgerDisplayAccGroup * * opens up a register window to display an account, and all * @@ -206,62 +347,12 @@ xaccLedgerDisplayAccGroup (Account *account) { xaccLedgerDisplay *ld; SplitRegisterType reg_type; - GNCAccountType le_type; - GList *accounts; - GList *node; - /* build a flat list from the tree */ - accounts = xaccAccountPrependChildren (account, NULL); - accounts = g_list_reverse (accounts); + reg_type = get_reg_type (account, LD_SUBACCOUNT); - switch (xaccAccountGetType (account)) - { - case BANK: - case CASH: - case ASSET: - case CREDIT: - case LIABILITY: - /* if any of the sub-accounts have STOCK or MUTUAL types, - * then we must use the PORTFOLIO_LEDGER ledger. Otherwise, - * a plain old GENERAL_LEDGER will do. */ - reg_type = GENERAL_LEDGER; - - for (node = accounts; node; node = node->next) - { - le_type = xaccAccountGetType (node->data); - if ((STOCK == le_type) || (MUTUAL == le_type)) - { - reg_type = PORTFOLIO_LEDGER; - break; - } - } - break; - - case STOCK: - case MUTUAL: - reg_type = PORTFOLIO_LEDGER; - break; - - case INCOME: - case EXPENSE: - reg_type = INCOME_LEDGER; - break; - - case EQUITY: - reg_type = GENERAL_LEDGER; - break; - - default: - PERR ("unknown account type \n"); - g_list_free (accounts); - return NULL; - } - - ld = xaccLedgerDisplayInternal (account, accounts, NULL, + ld = xaccLedgerDisplayInternal (account, NULL, LD_SUBACCOUNT, reg_type, REG_STYLE_JOURNAL); - g_list_free (accounts); - return ld; } @@ -332,6 +423,36 @@ xaccGUIDCopy (gpointer _to, gconstpointer _from) *to = *from; } +#if 0 +static void +refresh_handler (GHashTable *changes, gpointer user_data) +{ + xaccLedgerDisplay *ld = user_data; + const EventInfo *info; + + if (ld->type > NUM_SINGLE_REGISTER_TYPES) + { + Account *leader = xaccLedgerDisplayLeader (ld); + if (!account) + { + gnc_close_gui_component (ld->component_id); + return; + } + + if (changes) + { + info = gnc_gui_get_entity_events (changes, &recnData->account); + if (info && (info->event_mask & GNC_EVENT_DESTROY)) + { + gnc_close_gui_component_by_data (WINDOW_RECONCILE_CM_CLASS, recnData); + return; + } + } + + recnRefresh (recnData); +} +#endif + static void close_handler (gpointer user_data) { @@ -351,16 +472,35 @@ close_handler (gpointer user_data) xaccFreeQuery (ld->query); ld->query = NULL; - g_list_free (ld->displayed_accounts); - ld->displayed_accounts = NULL; - g_free (ld); } static void -make_ledger_query (xaccLedgerDisplay *ld, gboolean show_all, +make_ledger_query (xaccLedgerDisplay *ld, + gboolean show_all, SplitRegisterType type) { + Account *leader; + GList *accounts; + + if (!ld) + return; + + switch (ld->ld_type) + { + case LD_SINGLE: + case LD_SUBACCOUNT: + break; + + case LD_GL: + return; + + default: + PERR ("unknown ledger type: %d", ld->ld_type); + return; + } + + xaccFreeQuery (ld->query); ld->query = xaccMallocQuery (); /* This is a bit of a hack. The number of splits should be @@ -372,13 +512,19 @@ make_ledger_query (xaccLedgerDisplay *ld, gboolean show_all, xaccQuerySetGroup (ld->query, gncGetCurrentGroup()); - if (ld->displayed_accounts) - xaccQueryAddAccountMatch (ld->query, ld->displayed_accounts, - ACCT_MATCH_ANY, QUERY_OR); + leader = xaccLedgerDisplayLeader (ld); - if (ld->leader && - (g_list_find (ld->displayed_accounts, ld->leader) == NULL)) - xaccQueryAddSingleAccountMatch (ld->query, ld->leader, QUERY_OR); + if (ld->ld_type == LD_SUBACCOUNT) + accounts = xaccGroupGetSubAccounts (xaccAccountGetChildren (leader)); + else + accounts = NULL; + + accounts = g_list_prepend (accounts, leader); + + xaccQueryAddAccountMatch (ld->query, accounts, + ACCT_MATCH_ANY, QUERY_OR); + + g_list_free (accounts); } /********************************************************************\ @@ -394,75 +540,93 @@ xaccLedgerDisplay * xaccLedgerDisplayQuery (Query *query, SplitRegisterType type, SplitRegisterStyle style) { - return xaccLedgerDisplayInternal (NULL, NULL, query, type, style); + return xaccLedgerDisplayInternal (NULL, query, LD_GL, type, style); } static xaccLedgerDisplay * -xaccLedgerDisplayInternal (Account *lead_account, GList *accounts, Query *q, - SplitRegisterType type, SplitRegisterStyle style) +xaccLedgerDisplayInternal (Account *lead_account, Query *q, + LedgerDisplayType ld_type, + SplitRegisterType reg_type, + SplitRegisterStyle style) { xaccLedgerDisplay *ld; gboolean show_all; const char *class; - if (type < NUM_SINGLE_REGISTER_TYPES) /* single account types */ + switch (ld_type) { - if (!lead_account) - { - PERR ("single-account register with no account specified"); + case LD_SINGLE: + class = REGISTER_SINGLE_CM_CLASS; + + if (reg_type >= NUM_SINGLE_REGISTER_TYPES) + { + PERR ("single-account register with wrong split register type"); + return NULL; + } + + if (!lead_account) + { + PERR ("single-account register with no account specified"); + return NULL; + } + + if (q) + { + PWARN ("single-account register with external query"); + q = NULL; + } + + ld = gnc_find_first_gui_component (class, find_by_leader, lead_account); + if (ld) + return ld; + + break; + + case LD_SUBACCOUNT: + class = REGISTER_SUBACCOUNT_CM_CLASS; + + if (!lead_account) + { + PERR ("sub-account register with no lead account"); + return NULL; + } + + if (q) + { + PWARN ("account register with external query"); + q = NULL; + } + + ld = gnc_find_first_gui_component (class, find_by_leader, lead_account); + if (ld) + return ld; + + break; + + case LD_GL: + class = REGISTER_GL_CM_CLASS; + + if (!q) + { + PWARN ("general ledger with no query"); + } + + break; + + default: + PERR ("bad ledger type: %d", ld_type); return NULL; - } - - if (q) - { - PWARN ("single-account register with external query"); - q = NULL; - } - - class = REGISTER_SINGLE_CM_CLASS; - - ld = gnc_find_first_gui_component (class, find_by_account, lead_account); - - if (ld) - return ld; - } - else if (lead_account) /* sub-account registers */ - { - class = REGISTER_SUBACCOUNT_CM_CLASS; - - ld = gnc_find_first_gui_component (class, find_by_account, lead_account); - - if (q) - { - PWARN ("account register with external query"); - q = NULL; - } - - if (ld) - return ld; - } - else - { - class = REGISTER_GL_CM_CLASS; - - if (!q) - { - PWARN ("general ledger with no query"); - } } ld = g_new (xaccLedgerDisplay, 1); - ld->type = type; - ld->leader = lead_account; + ld->leader = *xaccAccountGetGUID (lead_account); + ld->query = NULL; + ld->ld_type = ld_type; ld->destroy = NULL; ld->get_parent = NULL; ld->set_help = NULL; - ld->gui_hook = NULL; - ld->dirty = FALSE; - - /* store the displayed accounts */ - ld->displayed_accounts = g_list_copy (accounts); + ld->user_data = NULL; show_all = gnc_lookup_boolean_option ("Register", "Show All Transactions", @@ -472,7 +636,7 @@ xaccLedgerDisplayInternal (Account *lead_account, GList *accounts, Query *q, if (q) ld->query = xaccQueryCopy (q); else - make_ledger_query (ld, show_all, type); + make_ledger_query (ld, show_all, reg_type); ld->component_id = gnc_register_gui_component (class, NULL, close_handler, ld); @@ -483,7 +647,7 @@ xaccLedgerDisplayInternal (Account *lead_account, GList *accounts, Query *q, /* xaccMallocSplitRegister will malloc & initialize the register, * but will not do the gui init */ - ld->reg = xaccMallocSplitRegister (type, style, FALSE, + ld->reg = xaccMallocSplitRegister (reg_type, style, FALSE, xaccSRGetEntryHandler, xaccSRGetLabelHandler, xaccSRGetIOFlagsHandler, @@ -498,7 +662,6 @@ xaccLedgerDisplayInternal (Account *lead_account, GList *accounts, Query *q, xaccLedgerDisplayParent, xaccLedgerDisplaySetHelp); - ld->dirty = TRUE; xaccLedgerDisplayRefresh (ld); return ld; @@ -510,6 +673,8 @@ xaccLedgerDisplaySetQuery (xaccLedgerDisplay *ledger_display, Query *q) if (!ledger_display || !q) return; + g_return_if_fail (ledger_display->ld_type == LD_GL); + xaccFreeQuery (ledger_display->query); ledger_display->query = xaccQueryCopy (q); } @@ -530,18 +695,17 @@ xaccFindGeneralLedgerByQuery (Query *q) void xaccLedgerDisplayRefresh (xaccLedgerDisplay *ld) { - /* If we don't really need the redraw, don't do it. */ - if (!ld->dirty) + if (!ld) return; - ld->dirty = FALSE; /* mark clean */ - /* The leader account is used by the register gui to * assign a default source account for a "blank split" * that is attached to the bottom of the register. * The "blank split" is what the user edits to create * new splits and get them into the system. */ - xaccSRLoadRegister (ld->reg, xaccQueryGetSplits (ld->query), ld->leader); + xaccSRLoadRegister (ld->reg, + xaccQueryGetSplits (ld->query), + xaccLedgerDisplayLeader (ld)); } /********************************************************************\ @@ -558,9 +722,6 @@ MarkDirtyAllRegsClass (Account *account, const char *component_class) for (node = list; node; node = node->next) { - xaccLedgerDisplay *ld = node->data; - - ld->dirty = TRUE; } } diff --git a/src/MultiLedger.h b/src/MultiLedger.h index d373640ee4..fa6ad4f7be 100644 --- a/src/MultiLedger.h +++ b/src/MultiLedger.h @@ -35,37 +35,43 @@ #include "Transaction.h" -/** Structures ******************************************************/ +/** Definitions *****************************************************/ /* The xaccLedgerDisplay struct describes a single register/ledger * instance. */ typedef struct _xaccLedgerDisplay xaccLedgerDisplay; -struct _xaccLedgerDisplay +typedef void (*LedgerDisplayDestroy) (xaccLedgerDisplay *ld); +typedef gncUIWidget (*LedgerDisplayGetParent) (xaccLedgerDisplay *ld); +typedef void (*LedgerDisplaySetHelp) (xaccLedgerDisplay *ld, + const char *help_str); + +typedef enum { - Account *leader; /* leading. "master" account, if any */ - GList *displayed_accounts; /* The list of accounts shown here */ - Query *query; /* query engine & filter for displaying */ - - SplitRegisterType type; /* register display type, usually equal to * - * account type, but not always. */ - - /* GUI related stuff */ - gboolean dirty; /* dirty flag, non zero if redraw needed */ - - SplitRegister *reg; /* main ledger window */ - gpointer gui_hook; /* GUI-specific state */ - - void (*destroy) (xaccLedgerDisplay *); /* destroy callback */ - gncUIWidget (*get_parent) (xaccLedgerDisplay *); /* get parent widget */ - void (*set_help) (xaccLedgerDisplay *, const char *); /* help string */ - - gint component_id; /* id of ledger component */ -}; + LD_SINGLE, + LD_SUBACCOUNT, + LD_GL +} LedgerDisplayType; /** Prototypes ******************************************************/ +/* returns the 'lead' account of a ledger display, or NULL if none. */ +Account * xaccLedgerDisplayLeader (xaccLedgerDisplay *ld); + +/* get and set the user data associated with the ledger */ +void xaccLedgerDisplaySetUserData (xaccLedgerDisplay *ld, gpointer user_data); +gpointer xaccLedgerDisplayGetUserData (xaccLedgerDisplay *ld); + +/* set the handlers used by the ledger display */ +void xaccLedgerDisplaySetHandlers (xaccLedgerDisplay *ld, + LedgerDisplayDestroy destroy, + LedgerDisplayGetParent get_parent, + LedgerDisplaySetHelp set_help); + +/* return the split register associated with a ledger display */ +SplitRegister * xaccLedgerDisplayGetSR (xaccLedgerDisplay *ld); + /* opens up a register window to display a single account */ xaccLedgerDisplay * xaccLedgerDisplaySimple (Account *account); @@ -81,6 +87,9 @@ xaccLedgerDisplay * xaccLedgerDisplayQuery (Query *query, /* Set the query used for a register. */ void xaccLedgerDisplaySetQuery (xaccLedgerDisplay *ledger_display, Query *q); +/* return the query associated with a ledger */ +Query * xaccLedgerDisplayGetQuery (xaccLedgerDisplay *ld); + /* If the given ledger display still exists, return it. Otherwise, * return NULL */ xaccLedgerDisplay * xaccFindGeneralLedgerByQuery (Query *q); diff --git a/src/gnc-component-manager.c b/src/gnc-component-manager.c index 305f78db8a..e5ed9c02e7 100644 --- a/src/gnc-component-manager.c +++ b/src/gnc-component-manager.c @@ -225,7 +225,29 @@ gnc_cm_event_handler (GUID *entity, GNCEngineEventType event_type, gpointer user_data) { + GNCIdType id_type; + add_event (&changes, entity, event_type, TRUE); + + id_type = xaccGUIDType (entity); + switch (id_type) + { + case GNC_ID_TRANS: + changes.trans_event_mask |= event_type; + break; + + case GNC_ID_ACCOUNT: + changes.account_event_mask |= event_type; + break; + + case GNC_ID_NONE: + break; + + default: + PERR ("unexpected id type: %d", id_type); + break; + } + got_events = TRUE; #if CM_DEBUG @@ -557,43 +579,6 @@ changes_match (ComponentEventInfo *cei) return big_cei->match; } -static void -compile_helper (gpointer key, gpointer value, gpointer user_data) -{ - GUID *guid = key; - EventInfo *info = value; - ComponentEventInfo *cei = user_data; - GNCIdType id_type; - - id_type = xaccGUIDType (guid); - switch (id_type) - { - case GNC_ID_TRANS: - cei->trans_event_mask |= info->event_mask; - break; - - case GNC_ID_ACCOUNT: - cei->account_event_mask |= info->event_mask; - break; - - case GNC_ID_NONE: - break; - - default: - PERR ("unexpected id type: %d", id_type); - break; - } -} - -static void -compile_changes (ComponentEventInfo *cei) -{ - if (!cei) - return; - - g_hash_table_foreach (cei->entity_events, compile_helper, cei); -} - static void gnc_gui_refresh_internal (gboolean force) { @@ -607,9 +592,6 @@ gnc_gui_refresh_internal (gboolean force) if (!got_events) return; - if (!force) - compile_changes (&changes); - list = find_component_ids_by_class (NULL); for (node = list; node; node = node->next) diff --git a/src/gnome/dialog-find-transactions.c b/src/gnome/dialog-find-transactions.c index 2436401b96..dcd6b423d8 100644 --- a/src/gnome/dialog-find-transactions.c +++ b/src/gnome/dialog-find-transactions.c @@ -88,8 +88,8 @@ gnc_ui_find_transactions_dialog_create(xaccLedgerDisplay * orig_ledg) { ftd->dialog = create_Find_Transactions(); if(orig_ledg) { - ftd->q = xaccQueryCopy (orig_ledg->query); - ftd->ledger_q = orig_ledg->query; + ftd->q = xaccQueryCopy (xaccLedgerDisplayGetQuery (orig_ledg)); + ftd->ledger_q = xaccLedgerDisplayGetQuery (orig_ledg); } else { ftd->q = NULL; @@ -589,7 +589,6 @@ gnc_ui_find_transactions_dialog_ok_cb(GtkButton * button, xaccFreeQuery (new_q); - ledger->dirty = TRUE; xaccLedgerDisplayRefresh(ledger); if (new_ledger) diff --git a/src/gnome/dialog-transfer.c b/src/gnome/dialog-transfer.c index 4fe8c6ada1..f46b36df2a 100644 --- a/src/gnome/dialog-transfer.c +++ b/src/gnome/dialog-transfer.c @@ -716,7 +716,9 @@ gnc_xfer_dialog_ok_cb(GtkWidget * widget, gpointer data) to_amount = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT(xferData->to_amount_edit)); - + + gnc_suspend_gui_refresh (); + /* from -> curr transaction */ /* Create the transaction */ trans = xaccMallocTransaction(); @@ -801,9 +803,12 @@ gnc_xfer_dialog_ok_cb(GtkWidget * widget, gpointer data) gnc_account_ui_refresh(to); gnc_account_ui_refresh(from); gnc_account_ui_refresh(curr); + gnc_resume_gui_refresh (); } else { + gnc_suspend_gui_refresh (); + /* Create the transaction */ trans = xaccMallocTransaction(); @@ -850,6 +855,7 @@ gnc_xfer_dialog_ok_cb(GtkWidget * widget, gpointer data) /* Refresh everything */ gnc_account_ui_refresh(to); gnc_account_ui_refresh(from); + gnc_resume_gui_refresh (); } gnc_refresh_main_window(); diff --git a/src/gnome/window-main.c b/src/gnome/window-main.c index 51760c060d..d483c42919 100644 --- a/src/gnome/window-main.c +++ b/src/gnome/window-main.c @@ -47,6 +47,7 @@ #include "file-history.h" #include "global-options.h" #include "gnc-commodity.h" +#include "gnc-component-manager.h" #include "gnc-engine-util.h" #include "gnc-engine.h" #include "gnc-ui.h" @@ -542,19 +543,16 @@ gnc_ui_add_account (GtkWidget *widget, gpointer data) static void gnc_ui_delete_account (Account *account) { - /* Step 1: Delete associated windows */ - xaccAccountWindowDestroy(account); + xaccAccountWindowDestroy (account); - /* Step 2: Remove the account from all trees */ - gnc_account_tree_remove_account_all(account); + gnc_suspend_gui_refresh (); - /* Step 3: Delete the actual account */ - xaccRemoveAccount(account); - xaccFreeAccount(account); + xaccRemoveAccount (account); + xaccFreeAccount (account); - /* Step 4: Refresh things */ - gnc_refresh_main_window(); - gnc_group_ui_refresh(gncGetCurrentGroup()); + gnc_refresh_main_window (); + gnc_group_ui_refresh (gncGetCurrentGroup ()); + gnc_resume_gui_refresh (); } static void @@ -681,11 +679,14 @@ gnc_ui_mainWindow_scrub(GtkWidget *widget, gpointer data) return; } + gnc_suspend_gui_refresh (); + xaccAccountScrubOrphans(account); xaccAccountScrubImbalance(account); gnc_account_ui_refresh(account); gnc_refresh_main_window(); + gnc_resume_gui_refresh (); } static void @@ -700,11 +701,14 @@ gnc_ui_mainWindow_scrub_sub(GtkWidget *widget, gpointer data) return; } + gnc_suspend_gui_refresh (); + xaccAccountTreeScrubOrphans(account); xaccAccountTreeScrubImbalance(account); gnc_account_ui_refresh(account); gnc_refresh_main_window(); + gnc_resume_gui_refresh (); } static void @@ -712,11 +716,14 @@ gnc_ui_mainWindow_scrub_all(GtkWidget *widget, gpointer data) { AccountGroup *group = gncGetCurrentGroup(); + gnc_suspend_gui_refresh (); + xaccGroupScrubOrphans(group); xaccGroupScrubImbalance(group); gnc_group_ui_refresh(group); gnc_refresh_main_window(); + gnc_resume_gui_refresh (); } static void @@ -728,7 +735,7 @@ gnc_ui_options_cb(GtkWidget *widget, gpointer data) static void gnc_ui_filemenu_cb(GtkWidget *widget, gpointer menuItem) { - switch(GPOINTER_TO_INT(menuItem)) + switch (GPOINTER_TO_INT(menuItem)) { case FMB_NEW: gncFileNew(); @@ -887,7 +894,6 @@ gnc_configure_account_tree(void *data) memset(&new_avi, 0, sizeof(new_avi)); - info = gnc_get_main_info(); tree = GNC_MAINWIN_ACCOUNT_TREE(info->account_tree); diff --git a/src/gnome/window-reconcile.c b/src/gnome/window-reconcile.c index 8914fcb89b..c34f05b6dc 100644 --- a/src/gnome/window-reconcile.c +++ b/src/gnome/window-reconcile.c @@ -177,7 +177,7 @@ recn_get_account (RecnWindow *recnData) * and the 'effective' ending balance. * \********************************************************************/ static gnc_numeric -recnRecalculateBalance(RecnWindow *recnData) +recnRecalculateBalance (RecnWindow *recnData) { Account *account; const char *amount; @@ -323,7 +323,7 @@ startRecnWindow(GtkWidget *parent, Account *account, *new_ending = gnc_numeric_neg (*new_ending); } - /* Create the dialog box... */ + /* Create the dialog box */ title = gnc_recn_make_window_name(account); dialog = gnome_dialog_new(title, @@ -836,11 +836,14 @@ gnc_recn_scrub_cb(GtkWidget *widget, gpointer data) if (account == NULL) return; + gnc_suspend_gui_refresh (); + xaccAccountTreeScrubOrphans (account); xaccAccountTreeScrubImbalance (account); gnc_account_ui_refresh (account); gnc_refresh_main_window (); + gnc_resume_gui_refresh (); } static void @@ -1661,7 +1664,10 @@ recn_destroy_cb (GtkWidget *w, gpointer data) gnc_unregister_option_change_callback_id (id); if (recnData->delete_refresh) + { gnc_account_ui_refresh (recn_get_account (recnData)); + gnc_resume_gui_refresh (); + } g_free (recnData); } @@ -1679,21 +1685,22 @@ recn_destroy_cb (GtkWidget *w, gpointer data) static Account * find_payment_account(Account *account) { - int i; + GList *list; + GList *node; if (account == NULL) return NULL; - i = xaccAccountGetNumSplits(account); + list = xaccAccountGetSplitList (account); + /* Search backwards to find the latest payment */ - for (i -= 1; i >= 0; i--) + for (node = g_list_last (list); node; node = node->prev) { Transaction *trans; Split *split; - int num_splits; - int j; + GList *n; - split = xaccAccountGetSplit(account, i); + split = node->data; if (split == NULL) continue; @@ -1705,14 +1712,13 @@ find_payment_account(Account *account) if (trans == NULL) continue; - num_splits = xaccTransCountSplits(trans); - for (j = 0; j < num_splits; j++) + for (n = xaccTransGetSplitList (trans); n; n = n->next) { GNCAccountType type; Account *a; Split *s; - s = xaccTransGetSplit(trans, j); + s = n->data; if ((s == NULL) || (s == split)) continue; @@ -1756,6 +1762,8 @@ recnFinishCB (GtkWidget *w, gpointer data) date = recnData->statement_date; + gnc_suspend_gui_refresh (); + gnc_reconcile_list_commit(GNC_RECONCILE_LIST(recnData->credit), date); gnc_reconcile_list_commit(GNC_RECONCILE_LIST(recnData->debit), date); diff --git a/src/gnome/window-register.c b/src/gnome/window-register.c index 7bc29bfc5e..50861d9eca 100644 --- a/src/gnome/window-register.c +++ b/src/gnome/window-register.c @@ -30,28 +30,29 @@ #include -#include "window-register.h" -#include "gnc-ui.h" -#include "MultiLedger.h" +#include "AccWindow.h" +#include "EuroUtils.h" #include "MainWindow.h" +#include "MultiLedger.h" #include "Refresh.h" #include "RegWindow.h" #include "Scrub.h" -#include "window-reconcile.h" -#include "AccWindow.h" -#include "window-help.h" +#include "dialog-find-transactions.h" #include "dialog-transfer.h" #include "dialog-utils.h" -#include "query-user.h" -#include "messages.h" -#include "table-allgui.h" -#include "gnucash-sheet.h" #include "global-options.h" -#include "dialog-find-transactions.h" +#include "gnc-component-manager.h" #include "gnc-dateedit.h" #include "gnc-engine-util.h" #include "gnc-ui-util.h" -#include "EuroUtils.h" +#include "gnc-ui.h" +#include "gnucash-sheet.h" +#include "messages.h" +#include "query-user.h" +#include "table-allgui.h" +#include "window-help.h" +#include "window-reconcile.h" +#include "window-register.h" typedef struct _RegDateWindow RegDateWindow; @@ -217,16 +218,18 @@ gnc_register_jump_to_split(RegWindow *regData, Split *split) { Transaction *trans; VirtualCellLocation vcell_loc; + SplitRegister *reg; trans = xaccSplitGetParent(split); if (trans != NULL) if (gnc_register_include_date(regData, xaccTransGetDate(trans))) { - regData->ledger->dirty = TRUE; xaccLedgerDisplayRefresh(regData->ledger); } - if (xaccSRGetSplitVirtLoc(regData->ledger->reg, split, &vcell_loc)) + reg = xaccLedgerDisplayGetSR (regData->ledger); + + if (xaccSRGetSplitVirtLoc(reg, split, &vcell_loc)) gnucash_register_goto_virt_cell(regData->reg, vcell_loc); } @@ -244,16 +247,18 @@ gnc_register_jump_to_split_amount(RegWindow *regData, Split *split) { Transaction *trans; VirtualLocation virt_loc; + SplitRegister *reg; trans = xaccSplitGetParent(split); if (trans != NULL) if (gnc_register_include_date(regData, xaccTransGetDate(trans))) { - regData->ledger->dirty = TRUE; xaccLedgerDisplayRefresh (regData->ledger); } - if (xaccSRGetSplitAmountVirtLoc(regData->ledger->reg, split, &virt_loc)) + reg = xaccLedgerDisplayGetSR (regData->ledger); + + if (xaccSRGetSplitAmountVirtLoc(reg, split, &virt_loc)) gnucash_register_goto_virt_loc(regData->reg, virt_loc); } @@ -261,14 +266,13 @@ gnc_register_jump_to_split_amount(RegWindow *regData, Split *split) static void gnc_register_change_style (RegWindow *regData, SplitRegisterStyle style) { - SplitRegister *reg = regData->ledger->reg; + SplitRegister *reg = xaccLedgerDisplayGetSR (regData->ledger); if (style == reg->style) return; xaccConfigSplitRegister (reg, reg->type, style, reg->use_double_line); - regData->ledger->dirty = TRUE; xaccLedgerDisplayRefresh (regData->ledger); } @@ -309,7 +313,7 @@ static void gnc_register_double_line_cb (GtkWidget *w, gpointer data) { RegWindow *regData = data; - SplitRegister *reg = regData->ledger->reg; + SplitRegister *reg = xaccLedgerDisplayGetSR (regData->ledger); gboolean use_double_line; use_double_line = GTK_CHECK_MENU_ITEM(w)->active; @@ -317,17 +321,17 @@ gnc_register_double_line_cb (GtkWidget *w, gpointer data) if (use_double_line == reg->use_double_line) return; - xaccConfigSplitRegister(reg, reg->type, reg->style, use_double_line); + xaccConfigSplitRegister (reg, reg->type, reg->style, use_double_line); - regData->ledger->dirty = TRUE; - xaccLedgerDisplayRefresh(regData->ledger); + xaccLedgerDisplayRefresh (regData->ledger); } static void -gnc_register_sort(RegWindow *regData, sort_type_t sort_code) +gnc_register_sort (RegWindow *regData, sort_type_t sort_code) { - Query *query = regData->ledger->query; + Query *query = xaccLedgerDisplayGetQuery (regData->ledger); gboolean show_present_divider = FALSE; + SplitRegister *reg; if (regData->sort_type == sort_code) return; @@ -365,11 +369,12 @@ gnc_register_sort(RegWindow *regData, sort_type_t sort_code) assert(0); /* we should never be here */ } - xaccSRShowPresentDivider (regData->ledger->reg, show_present_divider); + reg = xaccLedgerDisplayGetSR (regData->ledger); + + xaccSRShowPresentDivider (reg, show_present_divider); regData->sort_type = sort_code; - regData->ledger->dirty = TRUE; xaccLedgerDisplayRefresh(regData->ledger); } @@ -474,10 +479,17 @@ gnc_date_range_set_sensitivities(RegWindow *regData) { RegDateWindow *regDateData; GtkToggleButton *toggle; + Query *query; - assert(regData != NULL); - assert(regData->ledger != NULL); - assert(regData->ledger->query != NULL); + if (!regData) + return; + + if (!regData->ledger) + return; + + query = xaccLedgerDisplayGetQuery (regData->ledger); + if (!query) + return; regDateData = regData->date_window; if (regDateData == NULL) @@ -507,10 +519,17 @@ gnc_register_set_date_range(RegWindow *regData) { RegDateWindow *regDateData; GtkToggleButton *toggle; + Query *query; - assert(regData != NULL); - assert(regData->ledger != NULL); - assert(regData->ledger->query != NULL); + if (!regData) + return; + + if (!regData->ledger) + return; + + query = xaccLedgerDisplayGetQuery (regData->ledger); + if (!query) + return; regDateData = regData->date_window; if (regDateData == NULL) @@ -520,28 +539,30 @@ gnc_register_set_date_range(RegWindow *regData) toggle = GTK_TOGGLE_BUTTON(regDateData->show_earliest); - xaccQueryPurgeTerms(regData->ledger->query, PD_DATE); + xaccQueryPurgeTerms (query, PD_DATE); - if (!gtk_toggle_button_get_active(toggle)) { + if (!gtk_toggle_button_get_active(toggle)) + { time_t start; start = gnc_date_edit_get_date(GNC_DATE_EDIT(regDateData->start_date)); start = gnc_register_min_day_time(start); - xaccQueryAddDateMatchTT(regData->ledger->query, + xaccQueryAddDateMatchTT(query, TRUE, start, FALSE, 0, QUERY_AND); } toggle = GTK_TOGGLE_BUTTON(regDateData->show_latest); - if (!gtk_toggle_button_get_active(toggle)) { + if (!gtk_toggle_button_get_active(toggle)) + { time_t end; end = gnc_date_edit_get_date(GNC_DATE_EDIT(regDateData->end_date)); end = gnc_register_max_day_time(end); - xaccQueryAddDateMatchTT(regData->ledger->query, + xaccQueryAddDateMatchTT(query, FALSE, 0, TRUE, end, QUERY_AND); @@ -557,7 +578,6 @@ gnc_register_date_cb(GtkWidget *widget, gpointer data) gnc_register_set_date_range(regData); - regData->ledger->dirty = TRUE; xaccLedgerDisplayRefresh (regData->ledger); } @@ -711,7 +731,8 @@ gnc_register_date_window(RegWindow *regData) gtk_box_pack_start(GTK_BOX(hbox), date, FALSE, FALSE, 0); regDateData->start_date = date; - time_val = xaccQueryGetEarliestDateFound(regData->ledger->query); + time_val = xaccQueryGetEarliestDateFound + (xaccLedgerDisplayGetQuery (regData->ledger)); if (time_val < time(NULL)) gnc_date_edit_set_time(GNC_DATE_EDIT(date), time_val); @@ -904,10 +925,13 @@ gnc_register_create_tool_bar (RegWindow *regData) static void gnc_ui_find_transactions_cb (GtkWidget *widget, gpointer data) { - RegWindow * regdata = data; + RegWindow * regData = data; + SplitRegister *reg; - if (regdata->ledger->type == SEARCH_LEDGER) - gnc_ui_find_transactions_dialog_create (regdata->ledger); + reg = xaccLedgerDisplayGetSR (regData->ledger); + + if (reg->type == SEARCH_LEDGER) + gnc_ui_find_transactions_dialog_create (regData->ledger); else gnc_ui_find_transactions_dialog_create (NULL); } @@ -916,6 +940,7 @@ gnc_ui_find_transactions_cb (GtkWidget *widget, gpointer data) static GtkWidget * gnc_register_create_status_bar(RegWindow *regData) { + SplitRegister *reg; GtkWidget *statusbar; GtkWidget *hbox; GtkWidget *label; @@ -926,7 +951,9 @@ gnc_register_create_status_bar(RegWindow *regData) regData->statusbar = statusbar; - switch (regData->ledger->type) + reg = xaccLedgerDisplayGetSR (regData->ledger); + + switch (reg->type) { case GENERAL_LEDGER: case INCOME_LEDGER: @@ -970,15 +997,15 @@ gnc_register_create_status_bar(RegWindow *regData) void gnc_register_jump_to_blank(RegWindow *regData) { - SplitRegister *sr = regData->ledger->reg; + SplitRegister *reg = xaccLedgerDisplayGetSR (regData->ledger); Split *blank; VirtualCellLocation vcell_loc; - blank = xaccSRGetBlankSplit(sr); + blank = xaccSRGetBlankSplit(reg); if (blank == NULL) return; - if (xaccSRGetSplitVirtLoc(sr, blank, &vcell_loc)) + if (xaccSRGetSplitVirtLoc(reg, blank, &vcell_loc)) gnucash_register_goto_virt_cell(regData->reg, vcell_loc); } @@ -988,13 +1015,16 @@ expand_trans_check_cb (GtkWidget *widget, gpointer data) { RegWindow *regData = data; gboolean expand; + SplitRegister *reg; if (!regData) return; + reg = xaccLedgerDisplayGetSR (regData->ledger); + expand = GTK_CHECK_MENU_ITEM (widget)->active; - xaccSRExpandCurrentTrans (regData->ledger->reg, expand); + xaccSRExpandCurrentTrans (reg, expand); } static void @@ -1002,36 +1032,46 @@ expand_trans_cb (GtkWidget *widget, gpointer data) { RegWindow *regData = data; gboolean expand; + SplitRegister *reg; + + reg = xaccLedgerDisplayGetSR (regData->ledger); expand = GTK_TOGGLE_BUTTON (widget)->active; - xaccSRExpandCurrentTrans (regData->ledger->reg, expand); + xaccSRExpandCurrentTrans (reg, expand); } static void new_trans_cb(GtkWidget *widget, gpointer data) { RegWindow *regData = data; + SplitRegister *reg; - if (xaccSRCheckReconciled (regData->ledger->reg)) + reg = xaccLedgerDisplayGetSR (regData->ledger); + + if (xaccSRCheckReconciled (reg)) { - if (xaccSRSaveRegEntry (regData->ledger->reg, TRUE)) - xaccSRRedrawReg (regData->ledger->reg); + if (xaccSRSaveRegEntry (reg, TRUE)) + xaccSRRedrawReg (reg); } else - xaccSRCancelCursorTransChanges (regData->ledger->reg); + xaccSRCancelCursorTransChanges (reg); - gnc_register_jump_to_blank(regData); + gnc_register_jump_to_blank (regData); } static void jump_cb(GtkWidget *widget, gpointer data) { RegWindow *regData = data; + SplitRegister *reg; Account *account; + Account *leader; Split *split; - split = xaccSRGetCurrentSplit(regData->ledger->reg); + reg = xaccLedgerDisplayGetSR (regData->ledger); + + split = xaccSRGetCurrentSplit (reg); if (split == NULL) return; @@ -1039,7 +1079,9 @@ jump_cb(GtkWidget *widget, gpointer data) if (account == NULL) return; - if (account == regData->ledger->leader) + leader = xaccLedgerDisplayLeader (regData->ledger); + + if (account == leader) { split = xaccGetOtherSplit(split); if (split == NULL) @@ -1048,7 +1090,7 @@ jump_cb(GtkWidget *widget, gpointer data) account = xaccSplitGetAccount(split); if (account == NULL) return; - if (account == regData->ledger->leader) + if (account == leader) return; } @@ -1056,21 +1098,22 @@ jump_cb(GtkWidget *widget, gpointer data) if (regData == NULL) return; - gnc_register_raise(regData); - gnc_register_jump_to_split(regData, split); + gnc_register_raise (regData); + gnc_register_jump_to_split (regData, split); } static void print_check_cb(GtkWidget * widget, gpointer data) { - RegWindow * reg_data = data; - Split * split = xaccSRGetCurrentSplit(reg_data->ledger->reg); - Transaction * trans = xaccSplitGetParent(split); + RegWindow * reg_data = data; + SplitRegister * reg = xaccLedgerDisplayGetSR (reg_data->ledger); + Split * split = xaccSRGetCurrentSplit(reg); + Transaction * trans = xaccSplitGetParent(split); - const char * payee; - const char * memo; - gnc_numeric amount; - time_t date; + const char * payee; + const char * memo; + gnc_numeric amount; + time_t date; SCM print_check = gh_eval_str("gnc:print-check"); @@ -1096,16 +1139,19 @@ static void gnc_register_scrub_cb(GtkWidget *widget, gpointer data) { RegWindow *regData = data; - Account *account = regData->ledger->leader; + Account *account = xaccLedgerDisplayLeader (regData->ledger); if (account == NULL) return; + gnc_suspend_gui_refresh (); + xaccAccountTreeScrubOrphans(account); xaccAccountTreeScrubImbalance(account); gnc_account_ui_refresh(account); gnc_refresh_main_window(); + gnc_resume_gui_refresh (); } static GtkWidget * @@ -1413,10 +1459,13 @@ gnc_register_create_menu_bar(RegWindow *regData, GtkWidget *statusbar) /* Make sure the right style radio item is active */ { + SplitRegister *reg; GtkWidget *widget; int index; - switch (regData->ledger->reg->style) + reg = xaccLedgerDisplayGetSR (regData->ledger); + + switch (reg->style) { default: case REG_STYLE_LEDGER: @@ -1431,7 +1480,7 @@ gnc_register_create_menu_bar(RegWindow *regData, GtkWidget *statusbar) } /* registers with more than one account can only use journal mode */ - if (regData->ledger->reg->type >= NUM_SINGLE_REGISTER_TYPES) + if (reg->type >= NUM_SINGLE_REGISTER_TYPES) { widget = style_list[0].widget; gtk_widget_set_sensitive (widget, FALSE); @@ -1549,7 +1598,7 @@ gnc_register_record_cb(GnucashRegister *reg, gpointer data) * when you are entering transactions. */ if (!goto_blank) { - SplitRegister *sr = regData->ledger->reg; + SplitRegister *sr = xaccLedgerDisplayGetSR (regData->ledger); SplitRegisterStyle style = sr->style; if (style == REG_STYLE_LEDGER) @@ -1617,12 +1666,8 @@ gnc_register_destroy_cb(GtkWidget *widget, gpointer data) static gncUIWidget gnc_register_get_parent(xaccLedgerDisplay *ledger) { - RegWindow *regData; + RegWindow *regData = xaccLedgerDisplayGetUserData (ledger); - if (ledger == NULL) - return NULL; - - regData = ledger->gui_hook; if (regData == NULL) return NULL; @@ -1632,6 +1677,7 @@ gnc_register_get_parent(xaccLedgerDisplay *ledger) static void gnc_reg_set_window_name(RegWindow *regData) { + SplitRegister *reg; Account *leader; gchar *windowname; gchar *account_name; @@ -1641,7 +1687,9 @@ gnc_reg_set_window_name(RegWindow *regData) if (regData == NULL) return; - switch (regData->ledger->type) + reg = xaccLedgerDisplayGetSR (regData->ledger); + + switch (reg->type) { case GENERAL_LEDGER: case INCOME_LEDGER: @@ -1662,7 +1710,7 @@ gnc_reg_set_window_name(RegWindow *regData) break; } - leader = regData->ledger->leader; + leader = xaccLedgerDisplayLeader (regData->ledger); if ((leader != NULL) && single_account) { @@ -1681,11 +1729,11 @@ gnc_reg_set_window_name(RegWindow *regData) } static void -gnc_toolbar_change_cb(void *data) +gnc_toolbar_change_cb (void *data) { RegWindow *regData = data; - gnc_reg_refresh_toolbar(regData); + gnc_reg_refresh_toolbar (regData); } /********************************************************************\ @@ -1698,6 +1746,7 @@ gnc_toolbar_change_cb(void *data) RegWindow * regWindowLedger (xaccLedgerDisplay *ledger) { + SplitRegister *reg; RegWindow *regData; GtkWidget *vbox; GtkWidget *register_window; @@ -1705,16 +1754,20 @@ regWindowLedger (xaccLedgerDisplay *ledger) GtkWidget *table_frame; GtkWidget *statusbar; - regData = ledger->gui_hook; + reg = xaccLedgerDisplayGetSR (ledger); + + regData = xaccLedgerDisplayGetUserData (ledger); if (regData != NULL) return regData; - regData = g_new(RegWindow, 1); + regData = g_new (RegWindow, 1); - ledger->gui_hook = regData; - ledger->destroy = regDestroy; - ledger->set_help = regSetHelp; - ledger->get_parent = gnc_register_get_parent; + xaccLedgerDisplaySetUserData (ledger, regData); + + xaccLedgerDisplaySetHandlers (ledger, + regDestroy, + gnc_register_get_parent, + regSetHelp); register_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); @@ -1739,12 +1792,12 @@ regWindowLedger (xaccLedgerDisplay *ledger) regData->date_window = gnc_register_date_window(regData); - if (ledger->type != SEARCH_LEDGER) + if (reg->type != SEARCH_LEDGER) gnc_register_set_date_range(regData); /* Now that we have a date range, remove any existing * maximum on the number of splits returned. */ - xaccQuerySetMaxSplits(regData->ledger->query, -1); + xaccQuerySetMaxSplits (xaccLedgerDisplayGetQuery (regData->ledger), -1); statusbar = gnc_register_create_status_bar(regData); gtk_box_pack_start(GTK_BOX(vbox), statusbar, FALSE, FALSE, 0); @@ -1797,8 +1850,8 @@ regWindowLedger (xaccLedgerDisplay *ledger) "Number of Rows", 15.0); gnucash_register_set_initial_rows(num_rows); - register_widget = gnucash_register_new(ledger->reg->table); - gnc_table_init_gui(register_widget, ledger->reg); + register_widget = gnucash_register_new(reg->table); + gnc_table_init_gui(register_widget, reg); gtk_container_add(GTK_CONTAINER(table_frame), register_widget); @@ -1823,10 +1876,7 @@ regWindowLedger (xaccLedgerDisplay *ledger) FALSE); /* be sure to initialize the gui elements associated with the cursor */ - xaccConfigSplitRegister (ledger->reg, - ledger->type, - ledger->reg->style, - use_double_line); + xaccConfigSplitRegister (reg, reg->type, reg->style, use_double_line); } /* Allow grow, allow shrink, auto-shrink */ @@ -1836,7 +1886,7 @@ regWindowLedger (xaccLedgerDisplay *ledger) int *width; char *prefix; - switch (ledger->type) + switch (reg->type) { case STOCK_REGISTER: case PORTFOLIO_LEDGER: @@ -1851,22 +1901,21 @@ regWindowLedger (xaccLedgerDisplay *ledger) } if (*width == 0) - gnc_get_window_size(prefix, width, NULL); + gnc_get_window_size (prefix, width, NULL); - gtk_window_set_default_size(GTK_WINDOW(register_window), *width, 0); + gtk_window_set_default_size (GTK_WINDOW(register_window), *width, 0); } - gtk_widget_show_all(register_window); + gtk_widget_show_all (register_window); - xaccSRShowPresentDivider (ledger->reg, TRUE); + xaccSRShowPresentDivider (reg, TRUE); - ledger->dirty = TRUE; - xaccLedgerDisplayRefresh(ledger); - gnc_reg_refresh_toolbar(regData); + xaccLedgerDisplayRefresh (ledger); + gnc_reg_refresh_toolbar (regData); - gnc_register_jump_to_blank(regData); + gnc_register_jump_to_blank (regData); - gnc_window_adjust_for_screen(GTK_WINDOW(register_window)); + gnc_window_adjust_for_screen (GTK_WINDOW(register_window)); return regData; } @@ -1901,7 +1950,7 @@ gnc_register_redraw_all_cb (GnucashRegister *g_reg, gpointer data) if (regData->window == NULL) return; - leader = regData->ledger->leader; + leader = xaccLedgerDisplayLeader (regData->ledger); euro = gnc_lookup_boolean_option ("International", "Enable EURO support", @@ -1962,8 +2011,11 @@ gnc_register_redraw_all_cb (GnucashRegister *g_reg, gpointer data) { gboolean expand; gboolean sensitive; + SplitRegister *reg; - expand = xaccSRCurrentTransExpanded (regData->ledger->reg); + reg = xaccLedgerDisplayGetSR (regData->ledger); + + expand = xaccSRCurrentTransExpanded (reg); gtk_signal_handler_block_by_data (GTK_OBJECT (regData->split_button), regData); @@ -1982,7 +2034,7 @@ gnc_register_redraw_all_cb (GnucashRegister *g_reg, gpointer data) gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (regData->split_popup_check), expand); - sensitive = regData->ledger->reg->style == REG_STYLE_LEDGER; + sensitive = reg->style == REG_STYLE_LEDGER; gtk_widget_set_sensitive (regData->split_button, sensitive); gtk_widget_set_sensitive (regData->split_menu_check, sensitive); @@ -1992,12 +2044,15 @@ gnc_register_redraw_all_cb (GnucashRegister *g_reg, gpointer data) static void -gnc_reg_save_size(RegWindow *regData) +gnc_reg_save_size (RegWindow *regData) { + SplitRegister *reg; int *width; char *prefix; - switch (regData->ledger->type) + reg = xaccLedgerDisplayGetSR (regData->ledger); + + switch (reg->type) { case STOCK_REGISTER: case PORTFOLIO_LEDGER: @@ -2011,10 +2066,10 @@ gnc_reg_save_size(RegWindow *regData) break; } - gdk_window_get_geometry(regData->window->window, NULL, NULL, - width, NULL, NULL); + gdk_window_get_geometry (regData->window->window, NULL, NULL, + width, NULL, NULL); - gnc_save_window_size(prefix, *width, 0); + gnc_save_window_size (prefix, *width, 0); } @@ -2025,27 +2080,35 @@ gnc_reg_save_size(RegWindow *regData) static void regDestroy (xaccLedgerDisplay *ledger) { - RegWindow *regData = ledger->gui_hook; + RegWindow *regData = xaccLedgerDisplayGetUserData (ledger); if (regData) { + SplitRegister *reg; + gnc_reg_save_size (regData); - if (ledger->reg && ledger->reg->table) - gnc_table_save_state (ledger->reg->table); + + reg = xaccLedgerDisplayGetSR (ledger); + + if (reg && reg->table) + gnc_table_save_state (reg->table); gtk_widget_destroy (regData->window); } - ledger->gui_hook = NULL; + xaccLedgerDisplaySetUserData (ledger, NULL); } static void regSetHelp(xaccLedgerDisplay *ledger, const char *help_str) { - RegWindow *regData = ledger->gui_hook; + RegWindow *regData = xaccLedgerDisplayGetUserData (ledger); const gchar *status; + if (!regData) + return; + if (help_str != NULL) status = help_str; else @@ -2122,7 +2185,7 @@ cutTransCB(GtkWidget *w, gpointer data) { RegWindow *regData = data; - xaccSRCutCurrent(regData->ledger->reg); + xaccSRCutCurrent (xaccLedgerDisplayGetSR (regData->ledger)); } @@ -2138,7 +2201,7 @@ copyTransCB(GtkWidget *w, gpointer data) { RegWindow *regData = data; - xaccSRCopyCurrent(regData->ledger->reg); + xaccSRCopyCurrent (xaccLedgerDisplayGetSR (regData->ledger)); } @@ -2154,7 +2217,7 @@ pasteTransCB(GtkWidget *w, gpointer data) { RegWindow *regData = data; - xaccSRPasteCurrent(regData->ledger->reg); + xaccSRPasteCurrent (xaccLedgerDisplayGetSR (regData->ledger)); } @@ -2170,7 +2233,8 @@ xferCB(GtkWidget * w, gpointer data) { RegWindow *regData = data; - gnc_xfer_dialog (regData->window, regData->ledger->leader); + gnc_xfer_dialog (regData->window, + xaccLedgerDisplayLeader (regData->ledger)); } @@ -2185,8 +2249,7 @@ static void editCB(GtkWidget * w, gpointer data) { RegWindow *regData = data; - xaccLedgerDisplay *ledger = regData->ledger; - Account *account = ledger->leader; + Account *account = xaccLedgerDisplayLeader (regData->ledger); if (account == NULL) return; @@ -2207,8 +2270,7 @@ static void startRecnCB(GtkWidget * w, gpointer data) { RegWindow *regData = data; - xaccLedgerDisplay *ledger = regData->ledger; - Account *account = ledger->leader; + Account *account = xaccLedgerDisplayLeader (regData->ledger); if (account == NULL) return; @@ -2259,25 +2321,28 @@ static void recordCB(GtkWidget *w, gpointer data) { RegWindow *regData = data; + SplitRegister *reg; Transaction *trans; - trans = xaccSRGetCurrentTrans(regData->ledger->reg); + reg = xaccLedgerDisplayGetSR (regData->ledger); - if (xaccSRCheckReconciled (regData->ledger->reg)) + trans = xaccSRGetCurrentTrans (reg); + + if (xaccSRCheckReconciled (reg)) { - if (!xaccSRSaveRegEntry(regData->ledger->reg, TRUE)) + if (!xaccSRSaveRegEntry (reg, TRUE)) return; } else { - xaccSRCancelCursorTransChanges (regData->ledger->reg); + xaccSRCancelCursorTransChanges (reg); return; } if (trans != NULL) gnc_register_include_date(regData, xaccTransGetDate(trans)); - xaccSRRedrawReg (regData->ledger->reg); + xaccSRRedrawReg (reg); } @@ -2414,31 +2479,33 @@ deleteCB(GtkWidget *widget, gpointer data) RegWindow *regData = data; SplitRegisterStyle style; CursorClass cursor_class; + SplitRegister *reg; Transaction *trans; char *buf = NULL; Split *split; gint result; + reg = xaccLedgerDisplayGetSR (regData->ledger); + /* get the current split based on cursor position */ - split = xaccSRGetCurrentSplit(regData->ledger->reg); + split = xaccSRGetCurrentSplit(reg); if (split == NULL) { - xaccSRCancelCursorSplitChanges(regData->ledger->reg); + xaccSRCancelCursorSplitChanges(reg); return; } trans = xaccSplitGetParent(split); - style = regData->ledger->reg->style; - cursor_class = - xaccSplitRegisterGetCurrentCursorClass(regData->ledger->reg); + style = reg->style; + cursor_class = xaccSplitRegisterGetCurrentCursorClass(reg); /* Deleting the blank split just cancels */ { - Split *blank_split = xaccSRGetBlankSplit(regData->ledger->reg); + Split *blank_split = xaccSRGetBlankSplit (reg); if (split == blank_split) { - xaccSRCancelCursorTransChanges(regData->ledger->reg); + xaccSRCancelCursorTransChanges (reg); return; } } @@ -2462,7 +2529,7 @@ deleteCB(GtkWidget *widget, gpointer data) if (!result) return; - xaccSRDeleteCurrentSplit(regData->ledger->reg); + xaccSRDeleteCurrentSplit (reg); return; } @@ -2480,7 +2547,7 @@ deleteCB(GtkWidget *widget, gpointer data) if (!result) return; - xaccSRDeleteCurrentTrans(regData->ledger->reg); + xaccSRDeleteCurrentTrans (reg); return; } @@ -2498,13 +2565,13 @@ deleteCB(GtkWidget *widget, gpointer data) if (del_type == DELETE_TRANS) { - xaccSRDeleteCurrentTrans(regData->ledger->reg); + xaccSRDeleteCurrentTrans (reg); return; } if (del_type == DELETE_SPLITS) { - xaccSREmptyCurrentTrans(regData->ledger->reg); + xaccSREmptyCurrentTrans (reg); return; } } @@ -2522,7 +2589,7 @@ static void duplicateCB(GtkWidget *w, gpointer data) { RegWindow *regData = data; - xaccSRDuplicateCurrent (regData->ledger->reg); + xaccSRDuplicateCurrent (xaccLedgerDisplayGetSR (regData->ledger)); } @@ -2538,7 +2605,7 @@ cancelCB(GtkWidget *w, gpointer data) { RegWindow *regData = data; - xaccSRCancelCursorTransChanges (regData->ledger->reg); + xaccSRCancelCursorTransChanges (xaccLedgerDisplayGetSR (regData->ledger)); } @@ -2552,8 +2619,11 @@ static void gnc_register_check_close(RegWindow *regData) { gboolean pending_changes; + SplitRegister *reg; - pending_changes = xaccSRHasPendingChanges(regData->ledger->reg); + reg = xaccLedgerDisplayGetSR (regData->ledger); + + pending_changes = xaccSRHasPendingChanges (reg); if (pending_changes) { const char *message = _("The current transaction has been changed.\n" @@ -2561,7 +2631,7 @@ gnc_register_check_close(RegWindow *regData) if (gnc_verify_dialog_parented(regData->window, message, TRUE)) recordCB(regData->window, regData); else - xaccSRCancelCursorTransChanges(regData->ledger->reg); + xaccSRCancelCursorTransChanges (reg); } }