33 #include "gnc-component-manager.h"
37 #include "gnc-ledger-display.h"
40 #include "split-register-control.h"
41 #include "split-register-model.h"
44 #define REGISTER_SINGLE_CM_CLASS "register-single"
45 #define REGISTER_SUBACCOUNT_CM_CLASS "register-subaccount"
46 #define REGISTER_GL_CM_CLASS "register-gl"
47 #define REGISTER_TEMPLATE_CM_CLASS "register-template"
49 #define GNC_PREF_DOUBLE_LINE_MODE "double-line-mode"
50 #define GNC_PREF_MAX_TRANS "max-transactions"
51 #define GNC_PREF_DEFAULT_STYLE_LEDGER "default-style-ledger"
52 #define GNC_PREF_DEFAULT_STYLE_AUTOLEDGER "default-style-autoledger"
53 #define GNC_PREF_DEFAULT_STYLE_JOURNAL "default-style-journal"
62 GNCLedgerDisplayType ld_type;
67 gboolean use_double_line_default;
69 GNCLedgerDisplayDestroy destroy;
70 GNCLedgerDisplayGetParent get_parent;
84 gnc_ledger_display_internal (
Account *lead_account, Query *q,
85 GNCLedgerDisplayType ld_type,
88 gboolean use_double_line,
89 gboolean is_template);
120 ld->user_data = user_data;
129 return ld->user_data;
134 GNCLedgerDisplayDestroy destroy,
135 GNCLedgerDisplayGetParent get_parent)
140 ld->destroy = destroy;
141 ld->get_parent = get_parent;
163 find_by_leader (gpointer
find_data, gpointer user_data)
171 return (account == gnc_ledger_display_leader (ld));
175 find_by_query (gpointer find_data, gpointer user_data)
177 Query *q = find_data;
183 return ld->query == q;
187 find_by_reg (gpointer find_data, gpointer user_data)
195 return ld->reg == reg;
204 GNC_PREF_DEFAULT_STYLE_JOURNAL))
205 new_style = REG_STYLE_JOURNAL;
207 GNC_PREF_DEFAULT_STYLE_AUTOLEDGER))
208 new_style = REG_STYLE_AUTO_LEDGER;
214 look_for_portfolio_cb (
Account *account, gpointer data)
220 gnc_get_reg_type (
Account *leader, GNCLedgerDisplayType ld_type)
225 if (ld_type == LD_GL)
226 return GENERAL_LEDGER;
230 if (ld_type == LD_SINGLE)
232 switch (account_type)
235 return BANK_REGISTER;
238 return CASH_REGISTER;
241 return ASSET_REGISTER;
244 return CREDIT_REGISTER;
247 return LIABILITY_REGISTER;
250 return PAYABLE_REGISTER;
253 return RECEIVABLE_REGISTER;
257 return STOCK_REGISTER;
260 return INCOME_REGISTER;
263 return EXPENSE_REGISTER;
266 return EQUITY_REGISTER;
269 return CURRENCY_REGISTER;
272 return TRADING_REGISTER;
275 PERR (
"unknown account type %d\n", account_type);
276 return BANK_REGISTER;
280 if (ld_type != LD_SUBACCOUNT)
282 PERR (
"unknown ledger type %d\n", ld_type);
283 return BANK_REGISTER;
286 switch (account_type)
300 reg_type = GENERAL_LEDGER;
303 if (ret) reg_type = PORTFOLIO_LEDGER;
310 reg_type = PORTFOLIO_LEDGER;
315 reg_type = INCOME_LEDGER;
320 reg_type = GENERAL_LEDGER;
324 PERR (
"unknown account type:%d", account_type);
325 reg_type = GENERAL_LEDGER;
337 return (gld->use_double_line_default ||
343 gnc_ledger_display_simple (
Account *account)
347 gboolean use_double_line;
350 ENTER(
"account=%p", account);
356 use_double_line = TRUE;
359 use_double_line = FALSE;
363 reg_type = gnc_get_reg_type (account, LD_SINGLE);
365 ld = gnc_ledger_display_internal (account, NULL, LD_SINGLE, reg_type,
366 gnc_get_default_register_style(acc_type),
367 use_double_line, FALSE);
375 gnc_ledger_display_subaccounts (
Account *account)
380 ENTER(
"account=%p", account);
382 reg_type = gnc_get_reg_type (account, LD_SUBACCOUNT);
384 ld = gnc_ledger_display_internal (account, NULL, LD_SUBACCOUNT,
385 reg_type, REG_STYLE_JOURNAL, FALSE,
393 gnc_ledger_display_gl (
void)
402 query = qof_query_create_for(GNC_ID_SPLIT);
418 xaccQueryAddAccountMatch( query, al, QOF_GUID_MATCH_NONE, QOF_QUERY_AND );
427 xaccQueryAddDateMatchTT (query,
432 ld = gnc_ledger_display_internal (NULL, query, LD_GL, GENERAL_LEDGER,
433 REG_STYLE_JOURNAL, FALSE, FALSE);
447 gnc_ledger_display_template_gl (
char *
id)
454 gboolean isTemplateModeTrue;
456 ENTER(
"id=%s",
id ?
id :
"(null)");
459 isTemplateModeTrue = TRUE;
461 q = qof_query_create_for(GNC_ID_SPLIT);
463 book = gnc_get_current_book ();
471 xaccQueryAddSingleAccountMatch (q, acct, QOF_QUERY_AND);
474 ld = gnc_ledger_display_internal (NULL, q, LD_GL,
480 sr = gnc_ledger_display_get_split_register (ld);
496 if ( ld->get_parent == NULL )
499 return ld->get_parent( ld );
503 gnc_ledger_display_parent (
void *user_data)
506 return gnc_ledger_display_get_parent( ld );
514 gnc_gui_component_clear_watches (ld->component_id);
516 gnc_gui_component_watch_entity_type (ld->component_id,
518 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY
519 | GNC_EVENT_ITEM_CHANGED);
521 for (node = splits; node; node = node->next)
523 Split *split = node->data;
526 gnc_gui_component_watch_entity (ld->component_id,
533 refresh_handler (GHashTable *changes, gpointer user_data)
540 ENTER(
"changes=%p, user_data=%p", changes, user_data);
544 LEAVE(
"already loading");
548 has_leader = (ld->ld_type == LD_SINGLE || ld->ld_type == LD_SUBACCOUNT);
552 Account *leader = gnc_ledger_display_leader (ld);
555 gnc_close_gui_component (ld->component_id);
561 if (changes && has_leader)
563 info = gnc_gui_get_entity_events (changes, &ld->leader);
564 if (info && (info->event_mask & QOF_EVENT_DESTROY))
566 gnc_close_gui_component (ld->component_id);
579 gnc_ledger_display_set_watches (ld, splits);
581 gnc_ledger_display_refresh_internal (ld, splits);
586 close_handler (gpointer user_data)
593 gnc_unregister_gui_component (ld->component_id);
628 PERR (
"unknown ledger type: %d", ld->ld_type);
633 ld->query = qof_query_create_for(GNC_ID_SPLIT);
639 if ((limit != 0) && (type != SEARCH_LEDGER))
644 leader = gnc_ledger_display_leader (ld);
646 if (ld->ld_type == LD_SUBACCOUNT)
651 accounts = g_list_prepend (accounts, leader);
653 xaccQueryAddAccountMatch (ld->query, accounts,
656 g_list_free (accounts);
666 ENTER(
"query=%p", query);
668 ld = gnc_ledger_display_internal (NULL, query, LD_GL, type, style,
675 gnc_ledger_display_internal (
Account *lead_account, Query *q,
676 GNCLedgerDisplayType ld_type,
679 gboolean use_double_line,
680 gboolean is_template )
690 klass = REGISTER_SINGLE_CM_CLASS;
692 if (reg_type >= NUM_SINGLE_REGISTER_TYPES)
694 PERR (
"single-account register with wrong split register type");
700 PERR (
"single-account register with no account specified");
706 PWARN (
"single-account register with external query");
710 ld = gnc_find_first_gui_component (klass, find_by_leader, lead_account);
717 klass = REGISTER_SUBACCOUNT_CM_CLASS;
721 PERR (
"sub-account register with no lead account");
727 PWARN (
"account register with external query");
731 ld = gnc_find_first_gui_component (klass, find_by_leader, lead_account);
738 klass = REGISTER_GL_CM_CLASS;
742 PWARN (
"general ledger with no query");
748 PERR (
"bad ledger type: %d", ld_type);
757 ld->ld_type = ld_type;
760 ld->get_parent = NULL;
761 ld->user_data = NULL;
769 gnc_ledger_display_make_query (ld, limit, reg_type);
771 ld->component_id = gnc_register_gui_component (klass,
779 ld->use_double_line_default = use_double_line;
787 gnc_ledger_display_set_watches (ld, splits);
789 gnc_ledger_display_refresh_internal (ld, splits);
797 if (!ledger_display || !q)
800 g_return_if_fail (ledger_display->ld_type == LD_GL);
807 gnc_ledger_display_find_by_query (Query *q)
812 return gnc_find_first_gui_component (REGISTER_GL_CM_CLASS, find_by_query, q);
822 if (!ld || ld->loading)
831 gnc_ledger_display_leader (ld));
849 LEAVE(
"already loading");
853 gnc_ledger_display_refresh_internal (ld,
qof_query_run (ld->query));
858 gnc_ledger_display_refresh_by_split_register (
SplitRegister *reg)
865 ld = gnc_find_first_gui_component (REGISTER_SINGLE_CM_CLASS,
869 gnc_ledger_display_refresh (ld);
873 ld = gnc_find_first_gui_component (REGISTER_SUBACCOUNT_CM_CLASS,
877 gnc_ledger_display_refresh (ld);
881 ld = gnc_find_first_gui_component (REGISTER_GL_CM_CLASS,
885 gnc_ledger_display_refresh (ld);
889 ld = gnc_find_first_gui_component (REGISTER_TEMPLATE_CM_CLASS,
893 gnc_ledger_display_refresh (ld);
903 gnc_close_gui_component (ld->component_id);
Date and Time handling routines.
gboolean xaccAccountIsPriced(const Account *acc)
utility functions for the GnuCash UI
The type, style and table for the register.
GNCAccountType xaccAccountGetType(const Account *acc)
gpointer gnc_account_foreach_descendant_until(const Account *acc, AccountCb2 thunk, gpointer user_data)
gboolean gnc_split_register_full_refresh_ok(SplitRegister *reg)
QofQuery * qof_query_copy(QofQuery *q)
SplitRegister * gnc_split_register_new(SplitRegisterType type, SplitRegisterStyle style, gboolean use_double_line, gboolean is_template)
Account * gnc_book_get_template_root(const QofBook *book)
Transaction * xaccSplitGetParent(const Split *split)
SplitRegisterType
Register types.
#define PERR(format, args...)
#define ENTER(format, args...)
void qof_query_set_max_results(QofQuery *q, int n)
Account * gnc_account_lookup_by_name(const Account *parent, const char *name)
#define PWARN(format, args...)
#define xaccAccountGetGUID(X)
Account handling public routines.
void qof_query_destroy(QofQuery *q)
void qof_query_set_book(QofQuery *q, QofBook *book)
Anchor Scheduled Transaction info in a book. See src/doc/books.txt for design overview.
void gnc_split_register_set_template_account(SplitRegister *reg, Account *template_account)
time64 gnc_mktime(struct tm *time)
calculate seconds from the epoch given a time struct
Additional event handling code.
All type declarations for the whole Gnucash engine.
#define xaccTransGetGUID(X)
Generic api to store and retrieve preferences.
GList * gnc_account_get_descendants(const Account *account)
void gnc_tm_get_today_start(struct tm *tm)
GList * qof_query_run(QofQuery *query)
void gnc_split_register_load(SplitRegister *reg, GList *slist, Account *default_account)
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
#define LEAVE(format, args...)
void gnc_split_register_destroy(SplitRegister *reg)
void gnc_split_register_set_data(SplitRegister *reg, gpointer user_data, SRGetParentCallback get_parent)
API for Transactions and Splits (journal entries)
const gchar * QofLogModule
gdouble gnc_prefs_get_float(const gchar *group, const gchar *pref_name)
Account * xaccAccountLookup(const GncGUID *guid, QofBook *book)