GnuCash  2.6.99
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
gncEntryLedgerDisplay.c
1 /*
2  * gncEntryLedgerDisplay.c -- handle the display management for an Entry Ledger
3  * Copyright (C) 2002, 2003 Derek Atkins
4  * Author: Derek Atkins <[email protected]>
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation; either version 2 of
9  * the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, contact:
18  *
19  * Free Software Foundation Voice: +1-617-542-5942
20  * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
21  * Boston, MA 02110-1301, USA [email protected]
22  */
23 
24 #include "config.h"
25 
26 #include <glib.h>
27 
28 #include "gnc-ui-util.h"
29 #include "gnc-component-manager.h"
30 #include "gnc-event.h"
31 #include "gnc-prefs.h"
32 
33 #include "gncEntry.h"
34 #include "gncEntryLedger.h"
35 #include "gncEntryLedgerP.h"
36 
37 #define ENTRYLEDGER_CLASS "entry-ledger-class"
38 
39 /* Return the list of entries (NOTE: Should use a query here!) */
40 static GList *
41 gnc_entry_ledger_get_entries (GncEntryLedger *ledger)
42 {
43  if (ledger->query)
44  return qof_query_run (ledger->query);
45 
46  // g_warning ("No query to run?");
47  return NULL;
48 }
49 
50 static void
51 gnc_entry_ledger_refresh_internal (GncEntryLedger *ledger, GList *entries)
52 {
53  if (!ledger || ledger->loading)
54  return;
55 
56  /* If not full refresh ok, just load the xfer cells */
57  if (!ledger->full_refresh)
58  {
59  gnc_entry_ledger_load_xfer_cells (ledger);
60  return;
61  }
62 
63  /* Viewers must always have at least one entry! */
64  if ((ledger->type == GNCENTRY_ORDER_VIEWER ||
65  ledger->type == GNCENTRY_INVOICE_VIEWER ||
66  ledger->type == GNCENTRY_BILL_VIEWER ||
67  ledger->type == GNCENTRY_EXPVOUCHER_VIEWER) && !entries)
68  return;
69 
70  ledger->loading = TRUE;
71  gnc_entry_ledger_load (ledger, entries);
72  ledger->loading = FALSE;
73 }
74 
75 static void
76 gnc_entry_ledger_pref_changed (gpointer prefs, gchar *pref, gpointer user_data)
77 {
78  GncEntryLedger *ledger = user_data;
79 
80  g_return_if_fail (ledger && pref);
81 
82  if (g_str_has_suffix (pref, GNC_PREF_ACCOUNT_SEPARATOR))
83  {
84  gnc_entry_ledger_display_refresh (ledger);
85  }
86  else
87  {
88  g_warning ("gnc_entry_ledger_pref_changed: Unknown preference %s", pref);
89  }
90 }
91 
92 static void
93 gnc_entry_ledger_set_watches (GncEntryLedger *ledger, GList *entries)
94 {
95  GList *node;
96  QofIdType type = NULL;
97 
98  gnc_gui_component_clear_watches (ledger->component_id);
99 
100  switch (ledger->type)
101  {
102  case GNCENTRY_ORDER_ENTRY:
103  case GNCENTRY_ORDER_VIEWER:
104  type = GNC_ORDER_MODULE_NAME;
105  break;
106 
107  case GNCENTRY_INVOICE_ENTRY:
108  case GNCENTRY_CUST_CREDIT_NOTE_ENTRY:
109  /* Watch the invoice owner to see when items get added via orders */
110  gnc_gui_component_watch_entity (ledger->component_id,
112  (gncInvoiceGetOwner (ledger->invoice)),
113  QOF_EVENT_MODIFY);
114  case GNCENTRY_INVOICE_VIEWER:
115  case GNCENTRY_CUST_CREDIT_NOTE_VIEWER:
116  case GNCENTRY_BILL_ENTRY:
117  case GNCENTRY_BILL_VIEWER:
118  case GNCENTRY_EXPVOUCHER_ENTRY:
119  case GNCENTRY_EXPVOUCHER_VIEWER:
120  case GNCENTRY_VEND_CREDIT_NOTE_ENTRY:
121  case GNCENTRY_VEND_CREDIT_NOTE_VIEWER:
122  case GNCENTRY_EMPL_CREDIT_NOTE_ENTRY:
123  case GNCENTRY_EMPL_CREDIT_NOTE_VIEWER:
124  type = GNC_INVOICE_MODULE_NAME;
125  break;
126 
127  default:
128  g_warning ("Invalid ledger type");
129  break;
130  }
131 
132  gnc_gui_component_watch_entity_type (ledger->component_id,
133  type,
134  QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
135 
136  /* To make sure the xfer cell is up to date */
137  gnc_gui_component_watch_entity_type (ledger->component_id,
138  GNC_ID_ACCOUNT,
139  QOF_EVENT_MODIFY | QOF_EVENT_DESTROY
140  | GNC_EVENT_ITEM_CHANGED);
141 
142  /* To make sure the taxtable cell is up to date */
143  gnc_gui_component_watch_entity_type (ledger->component_id,
144  GNC_TAXTABLE_MODULE_NAME,
145  QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
146 
147  /* For expense vouchers, watch the employee and refresh if it's changed */
148  if (ledger->type == GNCENTRY_EXPVOUCHER_ENTRY)
149  {
150  const GncOwner *owner = gncOwnerGetEndOwner (gncInvoiceGetOwner (ledger->invoice));
151  GncEmployee *employee = gncOwnerGetEmployee (owner);
152 
153  if (employee)
154  gnc_gui_component_watch_entity (ledger->component_id,
155  gncEmployeeGetGUID (employee),
156  QOF_EVENT_MODIFY);
157  }
158 
159  for (node = entries; node; node = node->next)
160  {
161  GncEntry *entry = node->data;
162  gnc_gui_component_watch_entity (ledger->component_id,
163  gncEntryGetGUID (entry),
164  QOF_EVENT_MODIFY);
165  }
166 }
167 
168 static void
169 refresh_handler (GHashTable *changes, gpointer user_data)
170 {
171  GncEntryLedger *ledger = user_data;
172 
173  gnc_entry_ledger_display_refresh (ledger);
174 }
175 
176 void
177 gnc_entry_ledger_display_init (GncEntryLedger *ledger)
178 {
179  if (!ledger) return;
180 
181  ledger->full_refresh = TRUE;
182  ledger->component_id = gnc_register_gui_component (ENTRYLEDGER_CLASS,
183  refresh_handler,
184  NULL, ledger);
185  gnc_prefs_register_cb (GNC_PREFS_GROUP_GENERAL, GNC_PREF_ACCOUNT_SEPARATOR,
186  gnc_entry_ledger_pref_changed, ledger);
187 
188  gnc_entry_ledger_display_refresh (ledger);
189 }
190 
191 void
192 gnc_entry_ledger_display_fini (GncEntryLedger *ledger)
193 {
194  if (!ledger) return;
195 
196  gnc_unregister_gui_component (ledger->component_id);
197  gnc_prefs_remove_cb_by_func (GNC_PREFS_GROUP_GENERAL, GNC_PREF_ACCOUNT_SEPARATOR,
198  gnc_entry_ledger_pref_changed, ledger);
199 }
200 
201 void
202 gnc_entry_ledger_display_refresh (GncEntryLedger *ledger)
203 {
204  GList *entries;
205 
206  if (!ledger || ledger->loading) return;
207 
208  entries = gnc_entry_ledger_get_entries (ledger);
209 
210  gnc_entry_ledger_set_watches (ledger, entries);
211 
212  gnc_entry_ledger_refresh_internal (ledger, entries);
213 }
const GncGUID * gncOwnerGetGUID(const GncOwner *owner)
Definition: gncOwner.c:496
gulong gnc_prefs_register_cb(const char *group, const gchar *pref_name, gpointer func, gpointer user_data)
Definition: gnc-prefs.c:128
utility functions for the GnuCash UI
const gchar * QofIdType
Definition: qofid.h:85
Additional event handling code.
Generic api to store and retrieve preferences.
const GncOwner * gncOwnerGetEndOwner(const GncOwner *owner)
Definition: gncOwner.c:550
GList * qof_query_run(QofQuery *query)
Business Entry Interface.
GncEmployee * gncOwnerGetEmployee(const GncOwner *owner)
Definition: gncOwner.c:368
#define gncEmployeeGetGUID(E)
Definition: gncEmployee.h:131
void gnc_prefs_remove_cb_by_func(const gchar *group, const gchar *pref_name, gpointer func, gpointer user_data)
Definition: gnc-prefs.c:148