|
GnuCash 2.4.99
|
00001 /* 00002 * gncEntryLedgerDisplay.c -- handle the display management for an Entry Ledger 00003 * Copyright (C) 2002, 2003 Derek Atkins 00004 * Author: Derek Atkins <warlord@MIT.EDU> 00005 * 00006 * This program is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU General Public License as 00008 * published by the Free Software Foundation; either version 2 of 00009 * the License, or (at your option) any later version. 00010 * 00011 * This program is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 * GNU General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU General Public License 00017 * along with this program; if not, contact: 00018 * 00019 * Free Software Foundation Voice: +1-617-542-5942 00020 * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 00021 * Boston, MA 02110-1301, USA gnu@gnu.org 00022 */ 00023 00024 #include "config.h" 00025 00026 #include <glib.h> 00027 00028 #include "gnc-ui-util.h" 00029 #include "gnc-component-manager.h" 00030 #include "gnc-event.h" 00031 #include "gnc-gconf-utils.h" 00032 00033 #include "gncEntry.h" 00034 #include "gncEntryLedger.h" 00035 #include "gncEntryLedgerP.h" 00036 00037 #define ENTRYLEDGER_CLASS "entry-ledger-class" 00038 00039 /* Return the list of entries (NOTE: Should use a query here!) */ 00040 static GList * 00041 gnc_entry_ledger_get_entries (GncEntryLedger *ledger) 00042 { 00043 if (ledger->query) 00044 return qof_query_run (ledger->query); 00045 00046 // g_warning ("No query to run?"); 00047 return NULL; 00048 } 00049 00050 static void 00051 gnc_entry_ledger_refresh_internal (GncEntryLedger *ledger, GList *entries) 00052 { 00053 if (!ledger || ledger->loading) 00054 return; 00055 00056 /* If not full refresh ok, just load the xfer cells */ 00057 if (!ledger->full_refresh) 00058 { 00059 gnc_entry_ledger_load_xfer_cells (ledger); 00060 return; 00061 } 00062 00063 /* Viewers must always have at least one entry! */ 00064 if ((ledger->type == GNCENTRY_ORDER_VIEWER || 00065 ledger->type == GNCENTRY_INVOICE_VIEWER || 00066 ledger->type == GNCENTRY_BILL_VIEWER || 00067 ledger->type == GNCENTRY_EXPVOUCHER_VIEWER) && !entries) 00068 return; 00069 00070 ledger->loading = TRUE; 00071 gnc_entry_ledger_load (ledger, entries); 00072 ledger->loading = FALSE; 00073 } 00074 00075 static void 00076 gnc_entry_ledger_gconf_changed (GConfEntry *entry, gpointer user_data) 00077 { 00078 GncEntryLedger *ledger = user_data; 00079 00080 g_return_if_fail (ledger && entry && entry->key); 00081 00082 if (g_str_has_suffix (entry->key, KEY_ACCOUNT_SEPARATOR)) 00083 { 00084 gnc_entry_ledger_display_refresh (ledger); 00085 } 00086 else 00087 { 00088 g_warning ("gnc_entry_gconf_changed: Unknown gconf key %s", entry->key); 00089 } 00090 } 00091 00092 static void 00093 gnc_entry_ledger_set_watches (GncEntryLedger *ledger, GList *entries) 00094 { 00095 GList *node; 00096 QofIdType type = NULL; 00097 00098 gnc_gui_component_clear_watches (ledger->component_id); 00099 00100 switch (ledger->type) 00101 { 00102 case GNCENTRY_ORDER_ENTRY: 00103 case GNCENTRY_ORDER_VIEWER: 00104 type = GNC_ORDER_MODULE_NAME; 00105 break; 00106 00107 case GNCENTRY_INVOICE_ENTRY: 00108 case GNCENTRY_CUST_CREDIT_NOTE_ENTRY: 00109 /* Watch the invoice owner to see when items get added via orders */ 00110 gnc_gui_component_watch_entity (ledger->component_id, 00111 gncOwnerGetGUID 00112 (gncInvoiceGetOwner (ledger->invoice)), 00113 QOF_EVENT_MODIFY); 00114 case GNCENTRY_INVOICE_VIEWER: 00115 case GNCENTRY_CUST_CREDIT_NOTE_VIEWER: 00116 case GNCENTRY_BILL_ENTRY: 00117 case GNCENTRY_BILL_VIEWER: 00118 case GNCENTRY_EXPVOUCHER_ENTRY: 00119 case GNCENTRY_EXPVOUCHER_VIEWER: 00120 case GNCENTRY_VEND_CREDIT_NOTE_ENTRY: 00121 case GNCENTRY_VEND_CREDIT_NOTE_VIEWER: 00122 case GNCENTRY_EMPL_CREDIT_NOTE_ENTRY: 00123 case GNCENTRY_EMPL_CREDIT_NOTE_VIEWER: 00124 type = GNC_INVOICE_MODULE_NAME; 00125 break; 00126 00127 default: 00128 g_warning ("Invalid ledger type"); 00129 break; 00130 } 00131 00132 gnc_gui_component_watch_entity_type (ledger->component_id, 00133 type, 00134 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY); 00135 00136 /* To make sure the xfer cell is up to date */ 00137 gnc_gui_component_watch_entity_type (ledger->component_id, 00138 GNC_ID_ACCOUNT, 00139 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY 00140 | GNC_EVENT_ITEM_CHANGED); 00141 00142 /* To make sure the taxtable cell is up to date */ 00143 gnc_gui_component_watch_entity_type (ledger->component_id, 00144 GNC_TAXTABLE_MODULE_NAME, 00145 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY); 00146 00147 /* For expense vouchers, watch the employee and refresh if it's changed */ 00148 if (ledger->type == GNCENTRY_EXPVOUCHER_ENTRY) 00149 { 00150 const GncOwner *owner = gncOwnerGetEndOwner (gncInvoiceGetOwner (ledger->invoice)); 00151 GncEmployee *employee = gncOwnerGetEmployee (owner); 00152 00153 if (employee) 00154 gnc_gui_component_watch_entity (ledger->component_id, 00155 gncEmployeeGetGUID (employee), 00156 QOF_EVENT_MODIFY); 00157 } 00158 00159 for (node = entries; node; node = node->next) 00160 { 00161 GncEntry *entry = node->data; 00162 gnc_gui_component_watch_entity (ledger->component_id, 00163 gncEntryGetGUID (entry), 00164 QOF_EVENT_MODIFY); 00165 } 00166 } 00167 00168 static void 00169 refresh_handler (GHashTable *changes, gpointer user_data) 00170 { 00171 GncEntryLedger *ledger = user_data; 00172 00173 gnc_entry_ledger_display_refresh (ledger); 00174 } 00175 00176 void 00177 gnc_entry_ledger_display_init (GncEntryLedger *ledger) 00178 { 00179 if (!ledger) return; 00180 00181 ledger->full_refresh = TRUE; 00182 ledger->component_id = gnc_register_gui_component (ENTRYLEDGER_CLASS, 00183 refresh_handler, 00184 NULL, ledger); 00185 gnc_gconf_general_register_cb(KEY_ACCOUNT_SEPARATOR, 00186 gnc_entry_ledger_gconf_changed, ledger); 00187 00188 gnc_entry_ledger_display_refresh (ledger); 00189 } 00190 00191 void 00192 gnc_entry_ledger_display_fini (GncEntryLedger *ledger) 00193 { 00194 if (!ledger) return; 00195 00196 gnc_unregister_gui_component (ledger->component_id); 00197 gnc_gconf_general_remove_cb(KEY_ACCOUNT_SEPARATOR, 00198 gnc_entry_ledger_gconf_changed, ledger); 00199 } 00200 00201 void 00202 gnc_entry_ledger_display_refresh (GncEntryLedger *ledger) 00203 { 00204 GList *entries; 00205 00206 if (!ledger || ledger->loading) return; 00207 00208 entries = gnc_entry_ledger_get_entries (ledger); 00209 00210 gnc_entry_ledger_set_watches (ledger, entries); 00211 00212 gnc_entry_ledger_refresh_internal (ledger, entries); 00213 }
1.7.4