GnuCash c935c2f+
Loading...
Searching...
No Matches
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 <warlord@MIT.EDU>
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 gnu@gnu.org
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!) */
40static GList *
41gnc_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
50static void
51gnc_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
75static void
76gnc_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
92static void
93gnc_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
168static void
169refresh_handler (GHashTable *changes, gpointer user_data)
170{
171 GncEntryLedger *ledger = user_data;
172
173 gnc_entry_ledger_display_refresh (ledger);
174}
175
176void
177gnc_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
191void
192gnc_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
201void
202gnc_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}
Additional event handling code.
Generic api to store and retrieve preferences.
utility functions for the GnuCash UI
Business Entry Interface.
void gnc_entry_ledger_load(GncEntryLedger *ledger, GList *entry_list)
Copy GncEntry information from the list to the rows of the Ledger.
#define gncEmployeeGetGUID(E)
deprecated routines
const gchar * QofIdType
QofIdType declaration.
Definition qofid.h:80
GncEmployee * gncOwnerGetEmployee(const GncOwner *owner)
If the given owner is of type GNC_OWNER_EMPLOYEE, returns the pointer to the employee object.
Definition gncOwner.c:390
const GncOwner * gncOwnerGetEndOwner(const GncOwner *owner)
Get the "parent" Owner or GncGUID thereof.
Definition gncOwner.c:572
const GncGUID * gncOwnerGetGUID(const GncOwner *owner)
Get the GncGUID of the immediate owner.
Definition gncOwner.c:518
void gnc_prefs_remove_cb_by_func(const gchar *group, const gchar *pref_name, gpointer func, gpointer user_data)
Remove a function that was registered for a callback when the given preference changed.
gulong gnc_prefs_register_cb(const char *group, const gchar *pref_name, gpointer func, gpointer user_data)
Register a callback that gets triggered when the given preference changes.
GList * qof_query_run(QofQuery *query)
Perform the query, return the results.