34 #include "gnc-component-manager.h"
38 #include "gnc-ledger-display2.h"
42 #include "split-register-control.h"
43 #include "split-register-model.h"
45 #include "gnc-tree-model-split-reg.h"
48 #define REGISTER_SINGLE_CM_CLASS "register-single"
49 #define REGISTER_SUBACCOUNT_CM_CLASS "register-subaccount"
50 #define REGISTER_GL_CM_CLASS "register-gl"
51 #define REGISTER_TEMPLATE_CM_CLASS "register-template"
53 #define GNC_PREF_DOUBLE_LINE_MODE "double-line-mode"
54 #define GNC_PREF_MAX_TRANS "max-transactions"
55 #define GNC_PREF_DEFAULT_STYLE_LEDGER "default-style-ledger"
56 #define GNC_PREF_DEFAULT_STYLE_AUTOLEDGER "default-style-autoledger"
57 #define GNC_PREF_DEFAULT_STYLE_JOURNAL "default-style-journal"
66 GNCLedgerDisplay2Type ld_type;
74 gboolean use_double_line_default;
76 GNCLedgerDisplay2Destroy destroy;
77 GNCLedgerDisplay2GetParent get_parent;
91 gnc_ledger_display2_internal (
Account *lead_account, Query *q,
92 GNCLedgerDisplay2Type ld_type,
93 SplitRegisterType2 reg_type,
94 SplitRegisterStyle2 style,
95 gboolean use_double_line,
96 gboolean is_template);
98 static void gnc_ledger_display2_refresh_internal (
GNCLedgerDisplay2 *ld, GList *splits);
100 static void gnc_ledger_display2_refresh_cb (
GncTreeModelSplitReg *model, gpointer item, gpointer user_data);
113 GNCLedgerDisplay2Type
128 ld->user_data = user_data;
137 return ld->user_data;
142 GNCLedgerDisplay2Destroy destroy,
143 GNCLedgerDisplay2GetParent get_parent)
148 ld->destroy = destroy;
149 ld->get_parent = get_parent;
171 find_by_leader (gpointer
find_data, gpointer user_data)
179 return (account == gnc_ledger_display2_leader (ld));
183 find_by_query (gpointer find_data, gpointer user_data)
185 Query *q = find_data;
191 return ld->query == q;
196 find_by_reg (gpointer find_data, gpointer user_data)
204 return ld->model == model;
207 static SplitRegisterStyle2
210 SplitRegisterStyle2 new_style = REG2_STYLE_LEDGER;
213 GNC_PREF_DEFAULT_STYLE_JOURNAL))
214 new_style = REG2_STYLE_JOURNAL;
216 GNC_PREF_DEFAULT_STYLE_AUTOLEDGER))
217 new_style = REG2_STYLE_AUTO_LEDGER;
223 look_for_portfolio_cb (
Account *account, gpointer data)
228 static SplitRegisterType2
229 gnc_get_reg_type (
Account *leader, GNCLedgerDisplay2Type ld_type)
232 SplitRegisterType2 reg_type;
234 if (ld_type == LD2_GL)
235 return GENERAL_LEDGER2;
239 if (ld_type == LD2_SINGLE)
241 switch (account_type)
244 return BANK_REGISTER2;
247 return CASH_REGISTER2;
250 return ASSET_REGISTER2;
253 return CREDIT_REGISTER2;
256 return LIABILITY_REGISTER2;
259 return PAYABLE_REGISTER2;
262 return RECEIVABLE_REGISTER2;
266 return STOCK_REGISTER2;
269 return INCOME_REGISTER2;
272 return EXPENSE_REGISTER2;
275 return EQUITY_REGISTER2;
278 return CURRENCY_REGISTER2;
281 return TRADING_REGISTER2;
284 PERR (
"unknown account type %d\n", account_type);
285 return BANK_REGISTER2;
289 if (ld_type != LD2_SUBACCOUNT)
291 PERR (
"unknown ledger type %d\n", ld_type);
292 return BANK_REGISTER2;
295 switch (account_type)
309 reg_type = GENERAL_LEDGER2;
312 if (ret) reg_type = PORTFOLIO_LEDGER2;
319 reg_type = PORTFOLIO_LEDGER2;
324 reg_type = INCOME_LEDGER2;
329 reg_type = GENERAL_LEDGER2;
333 PERR (
"unknown account type:%d", account_type);
334 reg_type = GENERAL_LEDGER2;
346 return (gld->use_double_line_default ||
352 gnc_ledger_display2_simple (
Account *account)
354 SplitRegisterType2 reg_type;
356 gboolean use_double_line;
359 ENTER(
"account=%p", account);
365 use_double_line = TRUE;
368 use_double_line = FALSE;
372 reg_type = gnc_get_reg_type (account, LD2_SINGLE);
374 ld = gnc_ledger_display2_internal (account, NULL, LD2_SINGLE, reg_type,
375 gnc_get_default_register_style(acc_type),
376 use_double_line, FALSE);
384 gnc_ledger_display2_subaccounts (
Account *account)
386 SplitRegisterType2 reg_type;
389 ENTER(
"account=%p", account);
391 reg_type = gnc_get_reg_type (account, LD2_SUBACCOUNT);
393 ld = gnc_ledger_display2_internal (account, NULL, LD2_SUBACCOUNT,
394 reg_type, REG2_STYLE_JOURNAL, FALSE,
402 gnc_ledger_display2_gl (
void)
411 query = qof_query_create_for (GNC_ID_SPLIT);
427 xaccQueryAddAccountMatch( query, al, QOF_GUID_MATCH_NONE, QOF_QUERY_AND );
436 xaccQueryAddDateMatchTT (query,
441 ld = gnc_ledger_display2_internal (NULL, query, LD2_GL, GENERAL_LEDGER2,
442 REG2_STYLE_JOURNAL, FALSE, FALSE);
456 gnc_ledger_display2_template_gl (
char *
id)
463 gboolean isTemplateModeTrue;
465 ENTER(
"id=%s",
id ?
id :
"(null)");
468 isTemplateModeTrue = TRUE;
470 q = qof_query_create_for(GNC_ID_SPLIT);
472 book = gnc_get_current_book ();
480 xaccQueryAddSingleAccountMatch (q, acct, QOF_QUERY_AND);
483 ld = gnc_ledger_display2_internal (NULL, q, LD2_GL,
490 model = gnc_ledger_display2_get_split_model_register (ld);
493 gnc_tree_model_split_reg_set_template_account (model, acct);
506 if ( ld->get_parent == NULL )
509 return ld->get_parent( ld );
513 gnc_ledger_display2_parent (
void *user_data)
516 return gnc_ledger_display2_get_parent( ld );
524 gnc_gui_component_clear_watches (ld->component_id);
526 gnc_gui_component_watch_entity_type (ld->component_id,
528 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY
529 | GNC_EVENT_ITEM_CHANGED);
531 for (node = splits; node; node = node->next)
533 Split *split = node->data;
536 gnc_gui_component_watch_entity (ld->component_id,
543 refresh_handler (GHashTable *changes, gpointer user_data)
550 ENTER(
"changes=%p, user_data=%p", changes, user_data);
554 LEAVE(
"already loading");
558 has_leader = (ld->ld_type == LD2_SINGLE || ld->ld_type == LD2_SUBACCOUNT);
562 Account *leader = gnc_ledger_display2_leader (ld);
565 gnc_close_gui_component (ld->component_id);
571 if (changes && has_leader)
573 info = gnc_gui_get_entity_events (changes, &ld->leader);
574 if (info && (info->event_mask & QOF_EVENT_DESTROY))
576 gnc_close_gui_component (ld->component_id);
593 gnc_ledger_display2_refresh_internal (ld, splits);
599 close_handler (gpointer user_data)
608 gnc_unregister_gui_component (ld->component_id);
613 gnc_tree_model_split_reg_destroy (ld->model);
627 SplitRegisterType2 type)
645 PERR (
"unknown ledger type: %d", ld->ld_type);
650 ld->query = qof_query_create_for(GNC_ID_SPLIT);
656 if ((limit != 0) && (type != SEARCH_LEDGER2))
661 leader = gnc_ledger_display2_leader (ld);
663 if (ld->ld_type == LD2_SUBACCOUNT)
668 accounts = g_list_prepend (accounts, leader);
670 xaccQueryAddAccountMatch (ld->query, accounts,
673 g_list_free (accounts);
678 gnc_ledger_display2_query (Query *query, SplitRegisterType2 type,
679 SplitRegisterStyle2 style)
683 ENTER(
"query=%p", query);
685 ld = gnc_ledger_display2_internal (NULL, query, LD2_GL, type, style,
692 gnc_ledger_display2_internal (
Account *lead_account, Query *q,
693 GNCLedgerDisplay2Type ld_type,
694 SplitRegisterType2 reg_type,
695 SplitRegisterStyle2 style,
696 gboolean use_double_line,
697 gboolean is_template )
703 gboolean display_subaccounts = FALSE;
704 gboolean is_gl = FALSE;
709 klass = REGISTER_SINGLE_CM_CLASS;
711 if (reg_type >= NUM_SINGLE_REGISTER_TYPES2)
713 PERR (
"single-account register with wrong split register type");
719 PERR (
"single-account register with no account specified");
725 PWARN (
"single-account register with external query");
729 ld = gnc_find_first_gui_component (klass, find_by_leader, lead_account);
736 klass = REGISTER_SUBACCOUNT_CM_CLASS;
740 PERR (
"sub-account register with no lead account");
746 PWARN (
"account register with external query");
750 ld = gnc_find_first_gui_component (klass, find_by_leader, lead_account);
754 display_subaccounts = TRUE;
758 klass = REGISTER_GL_CM_CLASS;
762 PWARN (
"general ledger with no query");
769 PERR (
"bad ledger type: %d", ld_type);
778 ld->ld_type = ld_type;
780 ld->refresh_ok = FALSE;
782 ld->get_parent = NULL;
783 ld->user_data = NULL;
791 gnc_ledger_display2_make_query (ld, limit, reg_type);
793 ld->component_id = gnc_register_gui_component (klass,
801 ld->use_double_line_default = use_double_line;
803 ld->model = gnc_tree_model_split_reg_new (reg_type, style, use_double_line, is_template);
805 gnc_tree_model_split_reg_set_data (ld->model, ld, gnc_ledger_display2_parent);
806 gnc_tree_model_split_reg_set_display (ld->model, display_subaccounts, is_gl);
809 g_signal_connect (G_OBJECT (ld->model),
"refresh_trans",
810 G_CALLBACK (gnc_ledger_display2_refresh_cb), ld );
817 gnc_ledger_display2_refresh_internal (ld, NULL);
828 ledger_display->view = view;
837 return ledger_display->view;
843 if (!ledger_display || !q)
846 g_return_if_fail (ledger_display->ld_type == LD2_GL);
853 gnc_ledger_display2_find_by_query (Query *q)
861 ledger_display = gnc_find_first_gui_component (REGISTER_GL_CM_CLASS, find_by_query, q);
865 model = ledger_display->model;
867 if (model->
type == GENERAL_LEDGER2)
868 ledger_display = NULL;
870 return ledger_display;
880 GtkTreeModel *s_model, *model;
882 if (!ld || ld->loading)
885 if (!(ld->refresh_ok))
888 gnc_tree_model_split_reg_load (ld->model, splits, gnc_ledger_display2_leader (ld));
896 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW (ld->view));
897 model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (s_model));
899 g_object_ref (s_model);
900 g_object_ref (model);
902 gnc_tree_view_split_reg_block_selection (ld->view, TRUE);
903 gtk_tree_view_set_model (GTK_TREE_VIEW (ld->view), NULL);
904 gnc_tree_model_split_reg_load (ld->model, splits, gnc_ledger_display2_leader (ld));
905 gtk_tree_view_set_model (GTK_TREE_VIEW (ld->view), GTK_TREE_MODEL (s_model));
906 gnc_tree_view_split_reg_block_selection (ld->view, FALSE);
908 g_object_unref (model);
909 g_object_unref (s_model);
912 gnc_tree_view_split_reg_default_selection (ld->view);
924 gnc_tree_view_split_reg_default_selection (ld->view);
942 LEAVE(
"already loading");
945 gnc_ledger_display2_refresh_internal (ld, splits);
962 LEAVE(
"already loading");
967 gnc_tree_model_split_reg_update_query (ld->model, ld->query);
968 gnc_ledger_display2_refresh_internal (ld,
qof_query_run (ld->query));
980 ld = gnc_find_first_gui_component (REGISTER_SINGLE_CM_CLASS,
984 gnc_ledger_display2_refresh (ld);
988 ld = gnc_find_first_gui_component (REGISTER_SUBACCOUNT_CM_CLASS,
992 gnc_ledger_display2_refresh (ld);
996 ld = gnc_find_first_gui_component (REGISTER_GL_CM_CLASS,
1000 gnc_ledger_display2_refresh (ld);
1004 ld = gnc_find_first_gui_component (REGISTER_TEMPLATE_CM_CLASS,
1005 find_by_reg, model);
1008 gnc_ledger_display2_refresh (ld);
1018 ld->refresh_ok = ok;
1023 gnc_ledger_display2_refresh_cb (
GncTreeModelSplitReg *model, gpointer item, gpointer user_data)
1028 g_idle_add ((GSourceFunc)gnc_ledger_display2_refresh, ld);
1037 gnc_close_gui_component (ld->component_id);
Date and Time handling routines.
gboolean xaccAccountIsPriced(const Account *acc)
utility functions for the GnuCash UI
GNCAccountType xaccAccountGetType(const Account *acc)
gpointer gnc_account_foreach_descendant_until(const Account *acc, AccountCb2 thunk, gpointer user_data)
QofQuery * qof_query_copy(QofQuery *q)
Account * gnc_book_get_template_root(const QofBook *book)
Transaction * xaccSplitGetParent(const Split *split)
#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.
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)
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
#define LEAVE(format, args...)
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)