GnuCash  2.6.99
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
gnc-ledger-display.c
1 /********************************************************************\
2  * gnc-ledger-display.c -- utilities for dealing with multiple *
3  * register/ledger windows in GnuCash *
4  * *
5  * Copyright (C) 1997 Robin D. Clark *
6  * Copyright (C) 1997, 1998 Linas Vepstas *
7  * *
8  * This program is free software; you can redistribute it and/or *
9  * modify it under the terms of the GNU General Public License as *
10  * published by the Free Software Foundation; either version 2 of *
11  * the License, or (at your option) any later version. *
12  * *
13  * This program is distributed in the hope that it will be useful, *
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16  * GNU General Public License for more details. *
17  * *
18  * You should have received a copy of the GNU General Public License*
19  * along with this program; if not, write to the Free Software *
20  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
21  * *
22 \********************************************************************/
23 
24 #include "config.h"
25 
26 #include <time.h>
27 
28 #include "Account.h"
29 #include "Query.h"
30 #include "qof.h"
31 #include "SX-book.h"
32 #include "Transaction.h"
33 #include "gnc-component-manager.h"
34 #include "gnc-date.h"
35 #include "gnc-engine.h"
36 #include "gnc-event.h"
37 #include "gnc-ledger-display.h"
38 #include "gnc-prefs.h"
39 #include "gnc-ui-util.h"
40 #include "split-register-control.h"
41 #include "split-register-model.h"
42 
43 
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"
48 
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"
54 
55 
57 {
58  GncGUID leader;
59 
60  Query *query;
61 
62  GNCLedgerDisplayType ld_type;
63 
64  SplitRegister *reg;
65 
66  gboolean loading;
67  gboolean use_double_line_default;
68 
69  GNCLedgerDisplayDestroy destroy;
70  GNCLedgerDisplayGetParent get_parent;
71 
72  gpointer user_data;
73 
74  gint component_id;
75 };
76 
77 
79 static QofLogModule log_module = GNC_MOD_LEDGER;
80 
81 
83 static GNCLedgerDisplay *
84 gnc_ledger_display_internal (Account *lead_account, Query *q,
85  GNCLedgerDisplayType ld_type,
86  SplitRegisterType reg_type,
87  SplitRegisterStyle style,
88  gboolean use_double_line,
89  gboolean is_template);
90 static void gnc_ledger_display_refresh_internal (GNCLedgerDisplay *ld,
91  GList *splits);
92 
93 
96 Account *
97 gnc_ledger_display_leader (GNCLedgerDisplay *ld)
98 {
99  if (!ld)
100  return NULL;
101 
102  return xaccAccountLookup (&ld->leader, gnc_get_current_book ());
103 }
104 
105 GNCLedgerDisplayType
106 gnc_ledger_display_type (GNCLedgerDisplay *ld)
107 {
108  if (!ld)
109  return -1;
110 
111  return ld->ld_type;
112 }
113 
114 void
115 gnc_ledger_display_set_user_data (GNCLedgerDisplay *ld, gpointer user_data)
116 {
117  if (!ld)
118  return;
119 
120  ld->user_data = user_data;
121 }
122 
123 gpointer
124 gnc_ledger_display_get_user_data (GNCLedgerDisplay *ld)
125 {
126  if (!ld)
127  return NULL;
128 
129  return ld->user_data;
130 }
131 
132 void
133 gnc_ledger_display_set_handlers (GNCLedgerDisplay *ld,
134  GNCLedgerDisplayDestroy destroy,
135  GNCLedgerDisplayGetParent get_parent)
136 {
137  if (!ld)
138  return;
139 
140  ld->destroy = destroy;
141  ld->get_parent = get_parent;
142 }
143 
145 gnc_ledger_display_get_split_register (GNCLedgerDisplay *ld)
146 {
147  if (!ld)
148  return NULL;
149 
150  return ld->reg;
151 }
152 
153 Query *
154 gnc_ledger_display_get_query (GNCLedgerDisplay *ld)
155 {
156  if (!ld)
157  return NULL;
158 
159  return ld->query;
160 }
161 
162 static gboolean
163 find_by_leader (gpointer find_data, gpointer user_data)
164 {
165  Account *account = find_data;
166  GNCLedgerDisplay *ld = user_data;
167 
168  if (!account || !ld)
169  return FALSE;
170 
171  return (account == gnc_ledger_display_leader (ld));
172 }
173 
174 static gboolean
175 find_by_query (gpointer find_data, gpointer user_data)
176 {
177  Query *q = find_data;
178  GNCLedgerDisplay *ld = user_data;
179 
180  if (!q || !ld)
181  return FALSE;
182 
183  return ld->query == q;
184 }
185 
186 static gboolean
187 find_by_reg (gpointer find_data, gpointer user_data)
188 {
189  SplitRegister *reg = find_data;
190  GNCLedgerDisplay *ld = user_data;
191 
192  if (!reg || !ld)
193  return FALSE;
194 
195  return ld->reg == reg;
196 }
197 
198 static SplitRegisterStyle
199 gnc_get_default_register_style (GNCAccountType type)
200 {
201  SplitRegisterStyle new_style = REG_STYLE_LEDGER;
202 
203  if (gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL_REGISTER,
204  GNC_PREF_DEFAULT_STYLE_JOURNAL))
205  new_style = REG_STYLE_JOURNAL;
206  else if (gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL_REGISTER,
207  GNC_PREF_DEFAULT_STYLE_AUTOLEDGER))
208  new_style = REG_STYLE_AUTO_LEDGER;
209 
210  return new_style;
211 }
212 
213 static gpointer
214 look_for_portfolio_cb (Account *account, gpointer data)
215 {
216  return xaccAccountIsPriced(account) ? (gpointer) PORTFOLIO_LEDGER : NULL;
217 }
218 
219 static SplitRegisterType
220 gnc_get_reg_type (Account *leader, GNCLedgerDisplayType ld_type)
221 {
222  GNCAccountType account_type;
223  SplitRegisterType reg_type;
224 
225  if (ld_type == LD_GL)
226  return GENERAL_LEDGER;
227 
228  account_type = xaccAccountGetType (leader);
229 
230  if (ld_type == LD_SINGLE)
231  {
232  switch (account_type)
233  {
234  case ACCT_TYPE_BANK:
235  return BANK_REGISTER;
236 
237  case ACCT_TYPE_CASH:
238  return CASH_REGISTER;
239 
240  case ACCT_TYPE_ASSET:
241  return ASSET_REGISTER;
242 
243  case ACCT_TYPE_CREDIT:
244  return CREDIT_REGISTER;
245 
246  case ACCT_TYPE_LIABILITY:
247  return LIABILITY_REGISTER;
248 
249  case ACCT_TYPE_PAYABLE:
250  return PAYABLE_REGISTER;
251 
253  return RECEIVABLE_REGISTER;
254 
255  case ACCT_TYPE_STOCK:
256  case ACCT_TYPE_MUTUAL:
257  return STOCK_REGISTER;
258 
259  case ACCT_TYPE_INCOME:
260  return INCOME_REGISTER;
261 
262  case ACCT_TYPE_EXPENSE:
263  return EXPENSE_REGISTER;
264 
265  case ACCT_TYPE_EQUITY:
266  return EQUITY_REGISTER;
267 
268  case ACCT_TYPE_CURRENCY:
269  return CURRENCY_REGISTER;
270 
271  case ACCT_TYPE_TRADING:
272  return TRADING_REGISTER;
273 
274  default:
275  PERR ("unknown account type %d\n", account_type);
276  return BANK_REGISTER;
277  }
278  }
279 
280  if (ld_type != LD_SUBACCOUNT)
281  {
282  PERR ("unknown ledger type %d\n", ld_type);
283  return BANK_REGISTER;
284  }
285 
286  switch (account_type)
287  {
288  case ACCT_TYPE_BANK:
289  case ACCT_TYPE_CASH:
290  case ACCT_TYPE_ASSET:
291  case ACCT_TYPE_CREDIT:
292  case ACCT_TYPE_LIABILITY:
294  case ACCT_TYPE_PAYABLE:
295  {
296  /* If any of the sub-accounts have ACCT_TYPE_STOCK or
297  * ACCT_TYPE_MUTUAL types, then we must use the PORTFOLIO_LEDGER
298  * ledger. Otherwise, a plain old GENERAL_LEDGER will do. */
299  gpointer ret;
300  reg_type = GENERAL_LEDGER;
301 
302  ret = gnc_account_foreach_descendant_until(leader, look_for_portfolio_cb, NULL);
303  if (ret) reg_type = PORTFOLIO_LEDGER;
304  break;
305  }
306 
307  case ACCT_TYPE_STOCK:
308  case ACCT_TYPE_MUTUAL:
309  case ACCT_TYPE_CURRENCY:
310  reg_type = PORTFOLIO_LEDGER;
311  break;
312 
313  case ACCT_TYPE_INCOME:
314  case ACCT_TYPE_EXPENSE:
315  reg_type = INCOME_LEDGER;
316  break;
317 
318  case ACCT_TYPE_EQUITY:
319  case ACCT_TYPE_TRADING:
320  reg_type = GENERAL_LEDGER;
321  break;
322 
323  default:
324  PERR ("unknown account type:%d", account_type);
325  reg_type = GENERAL_LEDGER;
326  break;
327  }
328 
329  return reg_type;
330 }
331 
332 /* Returns a boolean of whether this display should be single or double lined
333  * mode by default */
334 gboolean
335 gnc_ledger_display_default_double_line (GNCLedgerDisplay *gld)
336 {
337  return (gld->use_double_line_default ||
338  gnc_prefs_get_bool(GNC_PREFS_GROUP_GENERAL_REGISTER, GNC_PREF_DOUBLE_LINE_MODE));
339 }
340 
341 /* Opens up a register window to display a single account */
343 gnc_ledger_display_simple (Account *account)
344 {
345  SplitRegisterType reg_type;
346  GNCAccountType acc_type = xaccAccountGetType (account);
347  gboolean use_double_line;
348  GNCLedgerDisplay *ld;
349 
350  ENTER("account=%p", account);
351 
352  switch (acc_type)
353  {
354  case ACCT_TYPE_PAYABLE:
356  use_double_line = TRUE;
357  break;
358  default:
359  use_double_line = FALSE;
360  break;
361  }
362 
363  reg_type = gnc_get_reg_type (account, LD_SINGLE);
364 
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);
368  LEAVE("%p", ld);
369  return ld;
370 }
371 
372 /* Opens up a register window to display an account, and all of its
373  * children, in the same window */
375 gnc_ledger_display_subaccounts (Account *account)
376 {
377  SplitRegisterType reg_type;
378  GNCLedgerDisplay *ld;
379 
380  ENTER("account=%p", account);
381 
382  reg_type = gnc_get_reg_type (account, LD_SUBACCOUNT);
383 
384  ld = gnc_ledger_display_internal (account, NULL, LD_SUBACCOUNT,
385  reg_type, REG_STYLE_JOURNAL, FALSE,
386  FALSE);
387  LEAVE("%p", ld);
388  return ld;
389 }
390 
391 /* Opens up a general ledger window. */
393 gnc_ledger_display_gl (void)
394 {
395  Query *query;
396  time64 start;
397  struct tm tm;
398  GNCLedgerDisplay *ld;
399 
400  ENTER(" ");
401 
402  query = qof_query_create_for(GNC_ID_SPLIT);
403 
404  qof_query_set_book (query, gnc_get_current_book());
405 
406  /* In lieu of not "mis-using" some portion of the infrastructure by writing
407  * a bunch of new code, we just filter out the accounts of the template
408  * transactions. While these are in a seperate Account trees just for this
409  * reason, the query engine makes no distinction between Account trees.
410  * See Gnome Bug 86302.
411  * -- jsled */
412  {
413  Account *tRoot;
414  GList *al;
415 
416  tRoot = gnc_book_get_template_root( gnc_get_current_book() );
417  al = gnc_account_get_descendants( tRoot );
418  xaccQueryAddAccountMatch( query, al, QOF_GUID_MATCH_NONE, QOF_QUERY_AND );
419  g_list_free (al);
420  al = NULL;
421  tRoot = NULL;
422  }
423 
425  tm.tm_mon--; /* Default the register to the last month's worth of transactions. */
426  start = gnc_mktime (&tm);
427  xaccQueryAddDateMatchTT (query,
428  TRUE, start,
429  FALSE, 0,
430  QOF_QUERY_AND);
431 
432  ld = gnc_ledger_display_internal (NULL, query, LD_GL, GENERAL_LEDGER,
433  REG_STYLE_JOURNAL, FALSE, FALSE);
434  LEAVE("%p", ld);
435  return ld;
436 }
437 
447 gnc_ledger_display_template_gl (char *id)
448 {
449  QofBook *book;
450  Query *q;
451  GNCLedgerDisplay *ld;
452  SplitRegister *sr;
453  Account *root, *acct;
454  gboolean isTemplateModeTrue;
455 
456  ENTER("id=%s", id ? id : "(null)");
457 
458  acct = NULL;
459  isTemplateModeTrue = TRUE;
460 
461  q = qof_query_create_for(GNC_ID_SPLIT);
462 
463  book = gnc_get_current_book ();
464  qof_query_set_book (q, book);
465 
466  if ( id != NULL )
467  {
468  root = gnc_book_get_template_root (book);
469  acct = gnc_account_lookup_by_name(root, id);
470  g_assert( acct );
471  xaccQueryAddSingleAccountMatch (q, acct, QOF_QUERY_AND);
472  }
473 
474  ld = gnc_ledger_display_internal (NULL, q, LD_GL,
475  SEARCH_LEDGER,
476  REG_STYLE_JOURNAL,
477  FALSE,
478  isTemplateModeTrue);
479 
480  sr = gnc_ledger_display_get_split_register (ld);
481  if ( acct )
482  {
484  }
485 
486  LEAVE("%p", ld);
487  return ld;
488 }
489 
490 GtkWidget *
491 gnc_ledger_display_get_parent( GNCLedgerDisplay *ld )
492 {
493  if ( ld == NULL )
494  return NULL;
495 
496  if ( ld->get_parent == NULL )
497  return NULL;
498 
499  return ld->get_parent( ld );
500 }
501 
502 static GtkWidget *
503 gnc_ledger_display_parent (void *user_data)
504 {
505  GNCLedgerDisplay *ld = user_data;
506  return gnc_ledger_display_get_parent( ld );
507 }
508 
509 static void
510 gnc_ledger_display_set_watches (GNCLedgerDisplay *ld, GList *splits)
511 {
512  GList *node;
513 
514  gnc_gui_component_clear_watches (ld->component_id);
515 
516  gnc_gui_component_watch_entity_type (ld->component_id,
517  GNC_ID_ACCOUNT,
518  QOF_EVENT_MODIFY | QOF_EVENT_DESTROY
519  | GNC_EVENT_ITEM_CHANGED);
520 
521  for (node = splits; node; node = node->next)
522  {
523  Split *split = node->data;
524  Transaction *trans = xaccSplitGetParent (split);
525 
526  gnc_gui_component_watch_entity (ld->component_id,
527  xaccTransGetGUID (trans),
528  QOF_EVENT_MODIFY);
529  }
530 }
531 
532 static void
533 refresh_handler (GHashTable *changes, gpointer user_data)
534 {
535  GNCLedgerDisplay *ld = user_data;
536  const EventInfo *info;
537  gboolean has_leader;
538  GList *splits;
539 
540  ENTER("changes=%p, user_data=%p", changes, user_data);
541 
542  if (ld->loading)
543  {
544  LEAVE("already loading");
545  return;
546  }
547 
548  has_leader = (ld->ld_type == LD_SINGLE || ld->ld_type == LD_SUBACCOUNT);
549 
550  if (has_leader)
551  {
552  Account *leader = gnc_ledger_display_leader (ld);
553  if (!leader)
554  {
555  gnc_close_gui_component (ld->component_id);
556  LEAVE("no leader");
557  return;
558  }
559  }
560 
561  if (changes && has_leader)
562  {
563  info = gnc_gui_get_entity_events (changes, &ld->leader);
564  if (info && (info->event_mask & QOF_EVENT_DESTROY))
565  {
566  gnc_close_gui_component (ld->component_id);
567  LEAVE("destroy");
568  return;
569  }
570  }
571 
572  /* Its not clear if we should re-run the query, or if we should
573  * just use qof_query_last_run(). Its possible that the dates
574  * changed, requiring a full new query. Similar considerations
575  * needed for multi-user mode.
576  */
577  splits = qof_query_run (ld->query);
578 
579  gnc_ledger_display_set_watches (ld, splits);
580 
581  gnc_ledger_display_refresh_internal (ld, splits);
582  LEAVE(" ");
583 }
584 
585 static void
586 close_handler (gpointer user_data)
587 {
588  GNCLedgerDisplay *ld = user_data;
589 
590  if (!ld)
591  return;
592 
593  gnc_unregister_gui_component (ld->component_id);
594 
595  if (ld->destroy)
596  ld->destroy (ld);
597 
598  gnc_split_register_destroy (ld->reg);
599  ld->reg = NULL;
600 
601  qof_query_destroy (ld->query);
602  ld->query = NULL;
603 
604  g_free (ld);
605 }
606 
607 static void
608 gnc_ledger_display_make_query (GNCLedgerDisplay *ld,
609  gint limit,
610  SplitRegisterType type)
611 {
612  Account *leader;
613  GList *accounts;
614 
615  if (!ld)
616  return;
617 
618  switch (ld->ld_type)
619  {
620  case LD_SINGLE:
621  case LD_SUBACCOUNT:
622  break;
623 
624  case LD_GL:
625  return;
626 
627  default:
628  PERR ("unknown ledger type: %d", ld->ld_type);
629  return;
630  }
631 
632  qof_query_destroy (ld->query);
633  ld->query = qof_query_create_for(GNC_ID_SPLIT);
634 
635  /* This is a bit of a hack. The number of splits should be
636  * configurable, or maybe we should go back a time range instead
637  * of picking a number, or maybe we should be able to exclude
638  * based on reconciled status. Anyway, this works for now. */
639  if ((limit != 0) && (type != SEARCH_LEDGER))
640  qof_query_set_max_results (ld->query, limit);
641 
642  qof_query_set_book (ld->query, gnc_get_current_book());
643 
644  leader = gnc_ledger_display_leader (ld);
645 
646  if (ld->ld_type == LD_SUBACCOUNT)
647  accounts = gnc_account_get_descendants (leader);
648  else
649  accounts = NULL;
650 
651  accounts = g_list_prepend (accounts, leader);
652 
653  xaccQueryAddAccountMatch (ld->query, accounts,
654  QOF_GUID_MATCH_ANY, QOF_QUERY_AND);
655 
656  g_list_free (accounts);
657 }
658 
659 /* Opens up a ledger window for an arbitrary query. */
661 gnc_ledger_display_query (Query *query, SplitRegisterType type,
662  SplitRegisterStyle style)
663 {
664  GNCLedgerDisplay *ld;
665 
666  ENTER("query=%p", query);
667 
668  ld = gnc_ledger_display_internal (NULL, query, LD_GL, type, style,
669  FALSE, FALSE);
670  LEAVE("%p", ld);
671  return ld;
672 }
673 
674 static GNCLedgerDisplay *
675 gnc_ledger_display_internal (Account *lead_account, Query *q,
676  GNCLedgerDisplayType ld_type,
677  SplitRegisterType reg_type,
678  SplitRegisterStyle style,
679  gboolean use_double_line,
680  gboolean is_template )
681 {
682  GNCLedgerDisplay *ld;
683  gint limit;
684  const char *klass;
685  GList *splits;
686 
687  switch (ld_type)
688  {
689  case LD_SINGLE:
690  klass = REGISTER_SINGLE_CM_CLASS;
691 
692  if (reg_type >= NUM_SINGLE_REGISTER_TYPES)
693  {
694  PERR ("single-account register with wrong split register type");
695  return NULL;
696  }
697 
698  if (!lead_account)
699  {
700  PERR ("single-account register with no account specified");
701  return NULL;
702  }
703 
704  if (q)
705  {
706  PWARN ("single-account register with external query");
707  q = NULL;
708  }
709 
710  ld = gnc_find_first_gui_component (klass, find_by_leader, lead_account);
711  if (ld)
712  return ld;
713 
714  break;
715 
716  case LD_SUBACCOUNT:
717  klass = REGISTER_SUBACCOUNT_CM_CLASS;
718 
719  if (!lead_account)
720  {
721  PERR ("sub-account register with no lead account");
722  return NULL;
723  }
724 
725  if (q)
726  {
727  PWARN ("account register with external query");
728  q = NULL;
729  }
730 
731  ld = gnc_find_first_gui_component (klass, find_by_leader, lead_account);
732  if (ld)
733  return ld;
734 
735  break;
736 
737  case LD_GL:
738  klass = REGISTER_GL_CM_CLASS;
739 
740  if (!q)
741  {
742  PWARN ("general ledger with no query");
743  }
744 
745  break;
746 
747  default:
748  PERR ("bad ledger type: %d", ld_type);
749  return NULL;
750 
751  }
752 
753  ld = g_new (GNCLedgerDisplay, 1);
754 
755  ld->leader = *xaccAccountGetGUID (lead_account);
756  ld->query = NULL;
757  ld->ld_type = ld_type;
758  ld->loading = FALSE;
759  ld->destroy = NULL;
760  ld->get_parent = NULL;
761  ld->user_data = NULL;
762 
763  limit = gnc_prefs_get_float(GNC_PREFS_GROUP_GENERAL_REGISTER, GNC_PREF_MAX_TRANS);
764 
765  /* set up the query filter */
766  if (q)
767  ld->query = qof_query_copy (q);
768  else
769  gnc_ledger_display_make_query (ld, limit, reg_type);
770 
771  ld->component_id = gnc_register_gui_component (klass,
772  refresh_handler,
773  close_handler, ld);
774 
775  /******************************************************************\
776  * The main register window itself *
777  \******************************************************************/
778 
779  ld->use_double_line_default = use_double_line;
780  ld->reg = gnc_split_register_new (reg_type, style, use_double_line,
781  is_template);
782 
783  gnc_split_register_set_data (ld->reg, ld, gnc_ledger_display_parent);
784 
785  splits = qof_query_run (ld->query);
786 
787  gnc_ledger_display_set_watches (ld, splits);
788 
789  gnc_ledger_display_refresh_internal (ld, splits);
790 
791  return ld;
792 }
793 
794 void
795 gnc_ledger_display_set_query (GNCLedgerDisplay *ledger_display, Query *q)
796 {
797  if (!ledger_display || !q)
798  return;
799 
800  g_return_if_fail (ledger_display->ld_type == LD_GL);
801 
802  qof_query_destroy (ledger_display->query);
803  ledger_display->query = qof_query_copy (q);
804 }
805 
807 gnc_ledger_display_find_by_query (Query *q)
808 {
809  if (!q)
810  return NULL;
811 
812  return gnc_find_first_gui_component (REGISTER_GL_CM_CLASS, find_by_query, q);
813 }
814 
815 /********************************************************************\
816  * refresh only the indicated register window *
817 \********************************************************************/
818 
819 static void
820 gnc_ledger_display_refresh_internal (GNCLedgerDisplay *ld, GList *splits)
821 {
822  if (!ld || ld->loading)
823  return;
824 
825  if (!gnc_split_register_full_refresh_ok (ld->reg))
826  return;
827 
828  ld->loading = TRUE;
829 
830  gnc_split_register_load (ld->reg, splits,
831  gnc_ledger_display_leader (ld));
832 
833  ld->loading = FALSE;
834 }
835 
836 void
837 gnc_ledger_display_refresh (GNCLedgerDisplay *ld)
838 {
839  ENTER("ld=%p", ld);
840 
841  if (!ld)
842  {
843  LEAVE("no display");
844  return;
845  }
846 
847  if (ld->loading)
848  {
849  LEAVE("already loading");
850  return;
851  }
852 
853  gnc_ledger_display_refresh_internal (ld, qof_query_run (ld->query));
854  LEAVE(" ");
855 }
856 
857 void
858 gnc_ledger_display_refresh_by_split_register (SplitRegister *reg)
859 {
860  GNCLedgerDisplay *ld;
861 
862  if (!reg)
863  return;
864 
865  ld = gnc_find_first_gui_component (REGISTER_SINGLE_CM_CLASS,
866  find_by_reg, reg);
867  if (ld)
868  {
869  gnc_ledger_display_refresh (ld);
870  return;
871  }
872 
873  ld = gnc_find_first_gui_component (REGISTER_SUBACCOUNT_CM_CLASS,
874  find_by_reg, reg);
875  if (ld)
876  {
877  gnc_ledger_display_refresh (ld);
878  return;
879  }
880 
881  ld = gnc_find_first_gui_component (REGISTER_GL_CM_CLASS,
882  find_by_reg, reg);
883  if (ld)
884  {
885  gnc_ledger_display_refresh (ld);
886  return;
887  }
888 
889  ld = gnc_find_first_gui_component (REGISTER_TEMPLATE_CM_CLASS,
890  find_by_reg, reg );
891  if (ld)
892  {
893  gnc_ledger_display_refresh (ld);
894  }
895 }
896 
897 void
898 gnc_ledger_display_close (GNCLedgerDisplay *ld)
899 {
900  if (!ld)
901  return;
902 
903  gnc_close_gui_component (ld->component_id);
904 }
Date and Time handling routines.
gboolean xaccAccountIsPriced(const Account *acc)
Definition: Account.c:4249
utility functions for the GnuCash UI
The type, style and table for the register.
GNCAccountType xaccAccountGetType(const Account *acc)
Definition: Account.c:3009
gpointer gnc_account_foreach_descendant_until(const Account *acc, AccountCb2 thunk, gpointer user_data)
Definition: Account.c:2979
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)
Definition: SX-book.c:65
Transaction * xaccSplitGetParent(const Split *split)
Definition: Split.c:1903
SplitRegisterType
Register types.
#define PERR(format, args...)
Definition: qoflog.h:237
#define ENTER(format, args...)
Definition: qoflog.h:261
Definition: guid.h:65
void qof_query_set_max_results(QofQuery *q, int n)
Account * gnc_account_lookup_by_name(const Account *parent, const char *name)
Definition: Account.c:2803
#define PWARN(format, args...)
Definition: qoflog.h:243
#define xaccAccountGetGUID(X)
Definition: Account.h:239
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.
GNCAccountType
Definition: Account.h:96
#define xaccTransGetGUID(X)
Definition: Transaction.h:755
Generic api to store and retrieve preferences.
GList * gnc_account_get_descendants(const Account *account)
Definition: Account.c:2755
void gnc_tm_get_today_start(struct tm *tm)
GList * qof_query_run(QofQuery *query)
Definition: SplitP.h:71
void gnc_split_register_load(SplitRegister *reg, GList *slist, Account *default_account)
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
Definition: gnc-prefs.c:196
#define LEAVE(format, args...)
Definition: qoflog.h:271
gint64 time64
Definition: gnc-date.h:83
void gnc_split_register_destroy(SplitRegister *reg)
void gnc_split_register_set_data(SplitRegister *reg, gpointer user_data, SRGetParentCallback get_parent)
SplitRegisterStyle
API for Transactions and Splits (journal entries)
const gchar * QofLogModule
Definition: qofid.h:89
gdouble gnc_prefs_get_float(const gchar *group, const gchar *pref_name)
Definition: gnc-prefs.c:227
Account * xaccAccountLookup(const GncGUID *guid, QofBook *book)
Definition: Account.c:1827