GnuCash 2.4.99
gncEntryLedgerDisplay.c
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 }
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines