GnuCash 2.4.99
gnc-plugin-page-register.c
Go to the documentation of this file.
00001 /**********************************************************************
00002  * gnc-plugin-page-register.c -- register page functions              *
00003  *                                                                    *
00004  * Copyright (C) 2003 Jan Arne Petersen <jpetersen@uni-bonn.de>       *
00005  * Copyright (C) 2003,2005,2006 David Hampton <hampton@employees.org> *
00006  * Copyright (C) 2011, Robert Fewell                                  *
00007  *                                                                    *
00008  * This program is free software; you can redistribute it and/or      *
00009  * modify it under the terms of the GNU General Public License as     *
00010  * published by the Free Software Foundation; either version 2 of     *
00011  * the License, or (at your option) any later version.                *
00012  *                                                                    *
00013  * This program is distributed in the hope that it will be useful,    *
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the      *
00016  * GNU General Public License for more details.                       *
00017  *                                                                    *
00018  * You should have received a copy of the GNU General Public License  *
00019  * along with this program; if not, contact:                          *
00020  *                                                                    *
00021  * Free Software Foundation           Voice:  +1-617-542-5942         *
00022  * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652         *
00023  * Boston, MA  02110-1301,  USA       gnu@gnu.org                     *
00024  **********************************************************************/
00025 
00036 #include "config.h"
00037 
00038 #include <libguile.h>
00039 #include "guile-mappings.h"
00040 #include <gtk/gtk.h>
00041 #include <glib/gi18n.h>
00042 #include "swig-runtime.h"
00043 
00044 #include "gnc-plugin-page-register.h"
00045 #include "gnc-plugin-register.h"
00046 #include "gnc-plugin-menu-additions.h"
00047 #include "gnc-plugin-page-report.h"
00048 
00049 #include "dialog-account.h"
00050 #include "dialog-find-transactions.h"
00051 #include "dialog-print-check.h"
00052 #include "dialog-transfer.h"
00053 #include "dialog-utils.h"
00054 #include "assistant-stock-split.h"
00055 #include "gnc-gconf-utils.h"
00056 #include "gnc-component-manager.h"
00057 #include "gnc-date.h"
00058 #include "gnc-date-edit.h"
00059 #include "gnc-engine.h"
00060 #include "gnc-event.h"
00061 #include "gnc-gconf-utils.h"
00062 #include "gnc-gnome-utils.h"
00063 #include "gnc-gobject-utils.h"
00064 #include "gnc-gui-query.h"
00065 #include "gnc-icons.h"
00066 #include "gnc-split-reg.h"
00067 #include "gnc-ui-util.h"
00068 #include "gnc-window.h"
00069 #include "gnc-main-window.h"
00070 #include "gnc-session.h"
00071 #include "gnucash-sheet.h"
00072 #include "dialog-lot-viewer.h"
00073 #include "Scrub.h"
00074 #include "qof.h"
00075 #include "window-reconcile.h"
00076 #include "window-autoclear.h"
00077 #include "window-report.h"
00078 
00079 /* This static indicates the debugging module that this .o belongs to.  */
00080 static QofLogModule log_module = GNC_MOD_GUI;
00081 
00082 #define DEFAULT_LINES_AMOUNT         50
00083 
00084 static void gnc_plugin_page_register_class_init (GncPluginPageRegisterClass *klass);
00085 static void gnc_plugin_page_register_init (GncPluginPageRegister *plugin_page);
00086 static void gnc_plugin_page_register_finalize (GObject *object);
00087 
00088 /* static Account *gnc_plugin_page_register_get_current_account (GncPluginPageRegister *page); */
00089 
00090 static GtkWidget *gnc_plugin_page_register_create_widget (GncPluginPage *plugin_page);
00091 static void gnc_plugin_page_register_destroy_widget (GncPluginPage *plugin_page);
00092 static void gnc_plugin_page_register_window_changed (GncPluginPage *plugin_page, GtkWidget *window);
00093 static void gnc_plugin_page_register_save_page (GncPluginPage *plugin_page, GKeyFile *file, const gchar *group);
00094 static GncPluginPage *gnc_plugin_page_register_recreate_page (GtkWidget *window, GKeyFile *file, const gchar *group);
00095 static void gnc_plugin_page_register_update_edit_menu (GncPluginPage *page, gboolean hide);
00096 static gboolean gnc_plugin_page_register_finish_pending (GncPluginPage *page);
00097 
00098 static gchar *gnc_plugin_page_register_get_tab_name (GncPluginPage *plugin_page);
00099 static gchar *gnc_plugin_page_register_get_tab_color (GncPluginPage *plugin_page);
00100 static gchar *gnc_plugin_page_register_get_long_name (GncPluginPage *plugin_page);
00101 
00102 static void gnc_plugin_page_register_summarybar_position_changed(GConfEntry *entry, gpointer user_data);
00103 
00104 /* Callbacks for the "Sort By" dialog */
00105 void gnc_plugin_page_register_sort_button_cb(GtkToggleButton *button, GncPluginPageRegister *page);
00106 void gnc_plugin_page_register_sort_response_cb(GtkDialog *dialog, gint response, GncPluginPageRegister *plugin_page);
00107 void gnc_plugin_page_register_sort_order_save_cb(GtkToggleButton *button, GncPluginPageRegister *page);
00108 
00109 static gchar *gnc_plugin_page_register_get_sort_order (GncPluginPage *plugin_page);
00110 void gnc_plugin_page_register_set_sort_order (GncPluginPage *plugin_page, const gchar *sort_order);
00111 
00112 /* Callbacks for the "Filter By" dialog */
00113 void gnc_plugin_page_register_filter_select_range_cb(GtkRadioButton *button, GncPluginPageRegister *page);
00114 void gnc_plugin_page_register_filter_start_cb(GtkWidget *radio, GncPluginPageRegister *page);
00115 void gnc_plugin_page_register_filter_end_cb(GtkWidget *radio, GncPluginPageRegister *page);
00116 void gnc_plugin_page_register_filter_response_cb(GtkDialog *dialog, gint response, GncPluginPageRegister *plugin_page);
00117 void gnc_plugin_page_register_filter_status_all_cb(GtkButton *button, GncPluginPageRegister *plugin_page);
00118 void gnc_plugin_page_register_filter_status_one_cb(GtkToggleButton *button, GncPluginPageRegister *page);
00119 void gnc_plugin_page_register_filter_save_cb(GtkToggleButton *button, GncPluginPageRegister *page);
00120 
00121 static time_t gnc_plugin_page_register_filter_dmy2time (char *date_string);
00122 static gchar *gnc_plugin_page_register_filter_time2dmy (time_t raw_time);
00123 static gchar *gnc_plugin_page_register_get_filter (GncPluginPage *plugin_page);
00124 void gnc_plugin_page_register_set_filter (GncPluginPage *plugin_page, const gchar *filter);
00125 
00126 static void gnc_ppr_update_status_query (GncPluginPageRegister *page);
00127 static void gnc_ppr_update_date_query (GncPluginPageRegister *page);
00128 
00129 /* Command callbacks */
00130 static void gnc_plugin_page_register_cmd_print_check (GtkAction *action, GncPluginPageRegister *plugin_page);
00131 static void gnc_plugin_page_register_cmd_cut (GtkAction *action, GncPluginPageRegister *plugin_page);
00132 static void gnc_plugin_page_register_cmd_copy (GtkAction *action, GncPluginPageRegister *plugin_page);
00133 static void gnc_plugin_page_register_cmd_paste (GtkAction *action, GncPluginPageRegister *plugin_page);
00134 static void gnc_plugin_page_register_cmd_edit_account (GtkAction *action, GncPluginPageRegister *plugin_page);
00135 static void gnc_plugin_page_register_cmd_find_transactions (GtkAction *action, GncPluginPageRegister *plugin_page);
00136 static void gnc_plugin_page_register_cmd_cut_transaction (GtkAction *action, GncPluginPageRegister *plugin_page);
00137 static void gnc_plugin_page_register_cmd_copy_transaction (GtkAction *action, GncPluginPageRegister *plugin_page);
00138 static void gnc_plugin_page_register_cmd_paste_transaction (GtkAction *action, GncPluginPageRegister *plugin_page);
00139 static void gnc_plugin_page_register_cmd_void_transaction (GtkAction *action, GncPluginPageRegister *plugin_page);
00140 static void gnc_plugin_page_register_cmd_unvoid_transaction (GtkAction *action, GncPluginPageRegister *plugin_page);
00141 static void gnc_plugin_page_register_cmd_reverse_transaction (GtkAction *action, GncPluginPageRegister *plugin_page);
00142 static void gnc_plugin_page_register_cmd_shift_transaction_forward (GtkAction *action, GncPluginPageRegister *plugin_page);
00143 static void gnc_plugin_page_register_cmd_view_sort_by (GtkAction *action, GncPluginPageRegister *plugin_page);
00144 static void gnc_plugin_page_register_cmd_view_filter_by (GtkAction *action, GncPluginPageRegister *plugin_page);
00145 static void gnc_plugin_page_register_cmd_style_changed (GtkAction *action, GtkRadioAction *current, GncPluginPageRegister *plugin_page);
00146 static void gnc_plugin_page_register_cmd_style_double_line (GtkToggleAction *action, GncPluginPageRegister *plugin_page);
00147 
00148 static void gnc_plugin_page_register_cmd_reconcile (GtkAction *action, GncPluginPageRegister *plugin_page);
00149 static void gnc_plugin_page_register_cmd_autoclear (GtkAction *action, GncPluginPageRegister *plugin_page);
00150 static void gnc_plugin_page_register_cmd_transfer (GtkAction *action, GncPluginPageRegister *plugin_page);
00151 static void gnc_plugin_page_register_cmd_stock_split (GtkAction *action, GncPluginPageRegister *plugin_page);
00152 static void gnc_plugin_page_register_cmd_lots (GtkAction *action, GncPluginPageRegister *plugin_page);
00153 static void gnc_plugin_page_register_cmd_enter_transaction (GtkAction *action, GncPluginPageRegister *plugin_page);
00154 static void gnc_plugin_page_register_cmd_cancel_transaction (GtkAction *action, GncPluginPageRegister *plugin_page);
00155 static void gnc_plugin_page_register_cmd_delete_transaction (GtkAction *action, GncPluginPageRegister *plugin_page);
00156 static void gnc_plugin_page_register_cmd_blank_transaction (GtkAction *action, GncPluginPageRegister *plugin_page);
00157 static void gnc_plugin_page_register_cmd_duplicate_transaction (GtkAction *action, GncPluginPageRegister *plugin_page);
00158 static void gnc_plugin_page_register_cmd_reinitialize_transaction (GtkAction *action, GncPluginPageRegister *plugin_page);
00159 static void gnc_plugin_page_register_cmd_expand_transaction (GtkToggleAction *action, GncPluginPageRegister *plugin_page);
00160 static void gnc_plugin_page_register_cmd_exchange_rate (GtkAction *action, GncPluginPageRegister *plugin_page);
00161 static void gnc_plugin_page_register_cmd_jump (GtkAction *action, GncPluginPageRegister *plugin_page);
00162 static void gnc_plugin_page_register_cmd_schedule (GtkAction *action, GncPluginPageRegister *plugin_page);
00163 static void gnc_plugin_page_register_cmd_scrub_all (GtkAction *action, GncPluginPageRegister *plugin_page);
00164 static void gnc_plugin_page_register_cmd_scrub_current (GtkAction *action, GncPluginPageRegister *plugin_page);
00165 static void gnc_plugin_page_register_cmd_account_report (GtkAction *action, GncPluginPageRegister *plugin_page);
00166 static void gnc_plugin_page_register_cmd_transaction_report (GtkAction *action, GncPluginPageRegister *plugin_page);
00167 
00168 static void gnc_plugin_page_help_changed_cb( GNCSplitReg *gsr, GncPluginPageRegister *register_page );
00169 static void gnc_plugin_page_register_refresh_cb (GHashTable *changes, gpointer user_data);
00170 static void gnc_plugin_page_register_close_cb (gpointer user_data);
00171 
00172 static void gnc_plugin_page_register_ui_update (gpointer various, GncPluginPageRegister *page);
00173 static void gppr_account_destroy_cb (Account *account);
00174 static void gnc_plugin_page_register_event_handler (QofInstance *entity,
00175         QofEventId event_type,
00176         GncPluginPageRegister *page,
00177         GncEventData *ed);
00178 
00179 /************************************************************/
00180 /*                          Actions                         */
00181 /************************************************************/
00182 
00183 static GtkActionEntry gnc_plugin_page_register_actions [] =
00184 {
00185     /* File menu */
00186 
00187     {
00188         "FilePrintAction", GTK_STOCK_PRINT, N_("_Print Checks..."), "<control>p", NULL,
00189         G_CALLBACK (gnc_plugin_page_register_cmd_print_check)
00190     },
00191 
00192     /* Edit menu */
00193 
00194     {
00195         "EditCutAction", GTK_STOCK_CUT, N_("Cu_t"), NULL,
00196         N_("Cut the current selection and copy it to clipboard"),
00197         G_CALLBACK (gnc_plugin_page_register_cmd_cut)
00198     },
00199     {
00200         "EditCopyAction", GTK_STOCK_COPY, N_("_Copy"), NULL,
00201         N_("Copy the current selection to clipboard"),
00202         G_CALLBACK (gnc_plugin_page_register_cmd_copy)
00203     },
00204     {
00205         "EditPasteAction", GTK_STOCK_PASTE, N_("_Paste"), NULL,
00206         N_("Paste the clipboard content at the cursor position"),
00207         G_CALLBACK (gnc_plugin_page_register_cmd_paste)
00208     },
00209     {
00210         "EditEditAccountAction", GNC_STOCK_EDIT_ACCOUNT, N_("Edit _Account"), "<control>e",
00211         N_("Edit the selected account"),
00212         G_CALLBACK (gnc_plugin_page_register_cmd_edit_account)
00213     },
00214     {
00215         "EditFindTransactionsAction", GTK_STOCK_FIND, N_("_Find..."), "<control>f",
00216         N_("Find transactions with a search"),
00217         G_CALLBACK (gnc_plugin_page_register_cmd_find_transactions)
00218     },
00219 
00220     /* Transaction menu */
00221 
00222     {
00223         "CutTransactionAction", GTK_STOCK_CUT, N_("Cu_t Transaction"), "",
00224         N_("Cut the selected transaction into clipboard"),
00225         G_CALLBACK (gnc_plugin_page_register_cmd_cut_transaction)
00226     },
00227     {
00228         "CopyTransactionAction", GTK_STOCK_COPY, N_("_Copy Transaction"), "",
00229         N_("Copy the selected transaction into clipboard"),
00230         G_CALLBACK (gnc_plugin_page_register_cmd_copy_transaction)
00231     },
00232     {
00233         "PasteTransactionAction", GTK_STOCK_PASTE, N_("_Paste Transaction"), "",
00234         N_("Paste the transaction from the clipboard"),
00235         G_CALLBACK (gnc_plugin_page_register_cmd_paste_transaction)
00236     },
00237     {
00238         "DuplicateTransactionAction", GTK_STOCK_COPY, N_("Dup_licate Transaction"), "",
00239         N_("Make a copy of the current transaction"),
00240         G_CALLBACK (gnc_plugin_page_register_cmd_duplicate_transaction)
00241     },
00242     {
00243         "DeleteTransactionAction", GTK_STOCK_DELETE, N_("_Delete Transaction"), NULL,
00244         N_("Delete the current transaction"),
00245         G_CALLBACK (gnc_plugin_page_register_cmd_delete_transaction)
00246     },
00247     {
00248         "RemoveTransactionSplitsAction", GTK_STOCK_CLEAR, N_("Remo_ve Transaction Splits"), NULL,
00249         N_("Remove all splits in the current transaction"),
00250         G_CALLBACK (gnc_plugin_page_register_cmd_reinitialize_transaction)
00251     },
00252     {
00253         "RecordTransactionAction", GTK_STOCK_ADD, N_("_Enter Transaction"), NULL,
00254         N_("Record the current transaction"),
00255         G_CALLBACK (gnc_plugin_page_register_cmd_enter_transaction)
00256     },
00257     {
00258         "CancelTransactionAction", GTK_STOCK_CANCEL, N_("Ca_ncel Transaction"), NULL,
00259         N_("Cancel the current transaction"),
00260         G_CALLBACK (gnc_plugin_page_register_cmd_cancel_transaction)
00261     },
00262     {
00263         "VoidTransactionAction", NULL, N_("_Void Transaction"), NULL, NULL,
00264         G_CALLBACK (gnc_plugin_page_register_cmd_void_transaction)
00265     },
00266     {
00267         "UnvoidTransactionAction", NULL, N_("_Unvoid Transaction"), NULL, NULL,
00268         G_CALLBACK (gnc_plugin_page_register_cmd_unvoid_transaction)
00269     },
00270     {
00271         "ReverseTransactionAction", NULL, N_("Add _Reversing Transaction"), NULL, NULL,
00272         G_CALLBACK (gnc_plugin_page_register_cmd_reverse_transaction)
00273     },
00274     {
00275         "ShiftTransactionForwardAction", NULL, N_("_Shift Transaction Forward"), NULL, NULL,
00276         G_CALLBACK (gnc_plugin_page_register_cmd_shift_transaction_forward)
00277     },
00278 
00279     /* View menu */
00280 
00281     {
00282         "ViewSortByAction", NULL, N_("_Sort By..."), NULL, NULL,
00283         G_CALLBACK (gnc_plugin_page_register_cmd_view_sort_by)
00284     },
00285     {
00286         "ViewFilterByAction", NULL, N_("_Filter By..."), NULL, NULL,
00287         G_CALLBACK (gnc_plugin_page_register_cmd_view_filter_by)
00288     },
00289 
00290     /* Actions menu */
00291 
00292     {
00293         "ActionsTransferAction", GNC_STOCK_TRANSFER, N_("_Transfer..."), "<control>t",
00294         N_("Transfer funds from one account to another"),
00295         G_CALLBACK (gnc_plugin_page_register_cmd_transfer)
00296     },
00297     {
00298         "ActionsReconcileAction", GTK_STOCK_INDEX, N_("_Reconcile..."), NULL,
00299         N_("Reconcile the selected account"),
00300         G_CALLBACK (gnc_plugin_page_register_cmd_reconcile)
00301     },
00302     {
00303         "ActionsAutoClearAction", GTK_STOCK_INDEX, N_("_Auto-clear..."), NULL,
00304         N_("Automatically clear individual transactions, so as to reach a certain cleared amount"),
00305         G_CALLBACK (gnc_plugin_page_register_cmd_autoclear)
00306     },
00307     {
00308         "ActionsStockSplitAction", NULL, N_("Stoc_k Split..."), NULL,
00309         N_("Record a stock split or a stock merger"),
00310         G_CALLBACK (gnc_plugin_page_register_cmd_stock_split)
00311     },
00312     {
00313         "ActionsLotsAction", NULL, N_("View _Lots..."), NULL,
00314         N_("Bring up the lot viewer/editor window"),
00315         G_CALLBACK (gnc_plugin_page_register_cmd_lots)
00316     },
00317     {
00318         "BlankTransactionAction", GTK_STOCK_GOTO_BOTTOM, N_("_Blank Transaction"), "<control>Page_Down",
00319         N_("Move to the blank transaction at the bottom of the register"),
00320         G_CALLBACK (gnc_plugin_page_register_cmd_blank_transaction)
00321     },
00322     {
00323         "EditExchangeRateAction", NULL, N_("Edit E_xchange Rate"), NULL,
00324         N_("Edit the exchange rate for the current transaction"),
00325         G_CALLBACK (gnc_plugin_page_register_cmd_exchange_rate)
00326     },
00327     {
00328         "JumpTransactionAction", GNC_STOCK_JUMP_TO, N_("_Jump"), NULL,
00329         N_("Jump to the corresponding transaction in the other account"),
00330         G_CALLBACK (gnc_plugin_page_register_cmd_jump)
00331     },
00332     {
00333         "ScheduleTransactionAction", GNC_STOCK_SCHEDULE, N_("Sche_dule..."), NULL,
00334         N_("Create a Scheduled Transaction with the current transaction as a template"),
00335         G_CALLBACK (gnc_plugin_page_register_cmd_schedule)
00336     },
00337     {
00338         "ScrubAllAction", NULL, N_("_All transactions"), NULL, NULL,
00339         G_CALLBACK (gnc_plugin_page_register_cmd_scrub_all)
00340     },
00341     {
00342         "ScrubCurrentAction", NULL, N_("_This transaction"), NULL, NULL,
00343         G_CALLBACK (gnc_plugin_page_register_cmd_scrub_current)
00344     },
00345 
00346     /* Reports menu */
00347 
00348     {
00349         "ReportsAccountReportAction", NULL, N_("Account Report"), NULL,
00350         N_("Open a register report for this Account"),
00351         G_CALLBACK (gnc_plugin_page_register_cmd_account_report)
00352     },
00353     {
00354         "ReportsAcctTransReportAction", NULL, N_("Account Transaction Report"), NULL,
00355         N_("Open a register report for the selected Transaction"),
00356         G_CALLBACK (gnc_plugin_page_register_cmd_transaction_report)
00357     },
00358 };
00359 
00360 static guint gnc_plugin_page_register_n_actions = G_N_ELEMENTS (gnc_plugin_page_register_actions);
00361 
00362 static GtkToggleActionEntry toggle_entries[] =
00363 {
00364     {
00365         "ViewStyleDoubleLineAction", NULL, N_("_Double Line"), NULL,
00366         N_("Show two lines of information for each transaction"),
00367         G_CALLBACK (gnc_plugin_page_register_cmd_style_double_line), FALSE
00368     },
00369 
00370     {
00371         "SplitTransactionAction", GNC_STOCK_SPLIT_TRANS, N_("S_plit Transaction"), NULL,
00372         N_("Show all splits in the current transaction"),
00373         G_CALLBACK (gnc_plugin_page_register_cmd_expand_transaction), FALSE
00374     },
00375 };
00376 
00377 static guint n_toggle_entries = G_N_ELEMENTS (toggle_entries);
00378 
00379 static GtkRadioActionEntry radio_entries_2 [] =
00380 {
00381     /* Translators: This is a menu item in the View menu */
00382     {
00383         "ViewStyleBasicAction", NULL, N_("_Basic Ledger"), NULL,
00384         N_("Show transactions on one or two lines"), REG_STYLE_LEDGER
00385     },
00386     /* Translators: This is a menu item in the View menu */
00387     {
00388         "ViewStyleAutoSplitAction", NULL, N_("_Auto-Split Ledger"), NULL,
00389         N_("Show transactions on one or two lines and expand the current transaction"), REG_STYLE_AUTO_LEDGER
00390     },
00391     /* Translators: This is a menu item in the View menu */
00392     {
00393         "ViewStyleJournalAction", NULL, N_("Transaction _Journal"), NULL,
00394         N_("Show expanded transactions with all splits"), REG_STYLE_JOURNAL
00395     }
00396 };
00397 
00398 static guint n_radio_entries_2 = G_N_ELEMENTS (radio_entries_2);
00399 
00403 static const gchar *important_actions[] =
00404 {
00405     "SplitTransactionAction",
00406     NULL,
00407 };
00408 
00411 static const gchar *actions_requiring_account[] =
00412 {
00413     "EditEditAccountAction",
00414     "ActionsReconcileAction",
00415     "ActionsAutoClearAction",
00416     "ActionsLotsAction",
00417     NULL
00418 };
00419 
00421 static const gchar *view_style_actions[] =
00422 {
00423     "ViewStyleBasicAction",
00424     "ViewStyleAutoSplitAction",
00425     "ViewStyleJournalAction",
00426     NULL
00427 };
00428 
00430 static action_toolbar_labels toolbar_labels[] =
00431 {
00432     { "ActionsTransferAction",    N_("Transfer") },
00433     { "RecordTransactionAction",          N_("Enter") },
00434     { "CancelTransactionAction",          N_("Cancel") },
00435     { "DeleteTransactionAction",          N_("Delete") },
00436     { "DuplicateTransactionAction", N_("Duplicate") },
00437     { "SplitTransactionAction",     N_("Split") },
00438     { "ScheduleTransactionAction",  N_("Schedule") },
00439     { "BlankTransactionAction",     N_("Blank") },
00440     { "ActionsReconcileAction",     N_("Reconcile") },
00441     { "ActionsAutoClearAction",     N_("Auto-clear") },
00442     { NULL, NULL },
00443 };
00444 
00445 struct status_action
00446 {
00447     const char *action_name;
00448     int value;
00449     GtkWidget *widget;
00450 };
00451 
00452 static struct status_action status_actions[] =
00453 {
00454     { "filter_status_reconciled",   CLEARED_RECONCILED, NULL },
00455     { "filter_status_cleared",      CLEARED_CLEARED, NULL },
00456     { "filter_status_voided",       CLEARED_VOIDED, NULL },
00457     { "filter_status_frozen",       CLEARED_FROZEN, NULL },
00458     { "filter_status_unreconciled", CLEARED_NO, NULL },
00459     { NULL, 0, NULL },
00460 };
00461 
00462 #define CLEARED_VALUE "cleared_value"
00463 #define DEFAULT_FILTER "0x001f"
00464 #define DEFAULT_SORT_ORDER "BY_STANDARD"
00465 
00466 /************************************************************/
00467 /*                      Data Structures                     */
00468 /************************************************************/
00469 
00470 typedef struct GncPluginPageRegisterPrivate
00471 {
00472     GNCLedgerDisplay *ledger;
00473     GNCSplitReg *gsr;
00474 
00475     GtkWidget *widget;
00476 
00477     gint event_handler_id;
00478     gint component_manager_id;
00479     GncGUID key;  /* The guid of the Account we're watching */
00480 
00481     gint lines_default;
00482     gboolean read_only;
00483 
00484     struct
00485     {
00486         GtkWidget *dialog;
00487         SortType original_sort_type;
00488         gboolean original_save_order;
00489         gboolean save_order;
00490     } sd;
00491 
00492     struct
00493     {
00494         GtkWidget *dialog;
00495         GtkWidget *table;
00496         GtkWidget *start_date_choose;
00497         GtkWidget *start_date_today;
00498         GtkWidget *start_date;
00499         GtkWidget *end_date_choose;
00500         GtkWidget *end_date_today;
00501         GtkWidget *end_date;
00502         cleared_match_t original_cleared_match;
00503         cleared_match_t cleared_match;
00504         time_t original_start_time;
00505         time_t original_end_time;
00506         time_t start_time;
00507         time_t end_time;
00508         gboolean original_save_filter;
00509         gboolean save_filter;
00510     } fd;
00511 } GncPluginPageRegisterPrivate;
00512 
00513 #define GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(o)  \
00514    (G_TYPE_INSTANCE_GET_PRIVATE ((o), GNC_TYPE_PLUGIN_PAGE_REGISTER, GncPluginPageRegisterPrivate))
00515 
00516 static GObjectClass *parent_class = NULL;
00517 
00518 /************************************************************/
00519 /*                      Implementation                      */
00520 /************************************************************/
00521 
00522 GType
00523 gnc_plugin_page_register_get_type (void)
00524 {
00525     static GType gnc_plugin_page_register_type = 0;
00526 
00527     if (gnc_plugin_page_register_type == 0)
00528     {
00529         static const GTypeInfo our_info =
00530         {
00531             sizeof (GncPluginPageRegisterClass),
00532             NULL,
00533             NULL,
00534             (GClassInitFunc) gnc_plugin_page_register_class_init,
00535             NULL,
00536             NULL,
00537             sizeof (GncPluginPageRegister),
00538             0,
00539             (GInstanceInitFunc) gnc_plugin_page_register_init
00540         };
00541 
00542         gnc_plugin_page_register_type = g_type_register_static (GNC_TYPE_PLUGIN_PAGE,
00543                                         GNC_PLUGIN_PAGE_REGISTER_NAME,
00544                                         &our_info, 0);
00545     }
00546 
00547     return gnc_plugin_page_register_type;
00548 }
00549 
00550 static GncPluginPage *
00551 gnc_plugin_page_register_new_common (GNCLedgerDisplay *ledger)
00552 {
00553     GncPluginPageRegister *register_page;
00554     GncPluginPageRegisterPrivate *priv;
00555     GncPluginPage *plugin_page;
00556     GNCSplitReg *gsr;
00557     SplitRegister *reg;
00558     const GList *item;
00559     GList *book_list;
00560     gchar *label;
00561     gchar *label_color;
00562     QofQuery *q;
00563 
00564     /* Is there an existing page? */
00565     gsr = gnc_ledger_display_get_user_data (ledger);
00566     if (gsr)
00567     {
00568         item = gnc_gobject_tracking_get_list(GNC_PLUGIN_PAGE_REGISTER_NAME);
00569         for ( ; item; item = g_list_next(item))
00570         {
00571             register_page = (GncPluginPageRegister *)item->data;
00572             priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(register_page);
00573             if (priv->gsr == gsr)
00574                 return GNC_PLUGIN_PAGE(register_page);
00575         }
00576     }
00577 
00578     register_page = g_object_new (GNC_TYPE_PLUGIN_PAGE_REGISTER, NULL);
00579     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(register_page);
00580     priv->ledger = ledger;
00581     priv->key = *guid_null();
00582 
00583     plugin_page = GNC_PLUGIN_PAGE(register_page);
00584     label = gnc_plugin_page_register_get_tab_name(plugin_page);
00585     gnc_plugin_page_set_page_name(plugin_page, label);
00586     g_free(label);
00587 
00588     label_color = gnc_plugin_page_register_get_tab_color(plugin_page);
00589     gnc_plugin_page_set_page_color(plugin_page, label_color);
00590     g_free(label_color);
00591 
00592     label = gnc_plugin_page_register_get_long_name(plugin_page);
00593     gnc_plugin_page_set_page_long_name(plugin_page, label);
00594     g_free(label);
00595 
00596     q = gnc_ledger_display_get_query (ledger);
00597     book_list = qof_query_get_books (q);
00598     for (item = book_list; item; item = g_list_next(item))
00599         gnc_plugin_page_add_book (plugin_page, (QofBook *)item->data);
00600     // Do not free the list. It is owned by the query.
00601 
00602     reg = gnc_ledger_display_get_split_register(priv->ledger);
00603 
00604 
00605 
00606     priv->component_manager_id = 0;
00607     return plugin_page;
00608 }
00609 
00610 GncPluginPage *
00611 gnc_plugin_page_register_new (Account *account, gboolean subaccounts)
00612 {
00613     GNCLedgerDisplay *ledger;
00614     GncPluginPage *page;
00615     GncPluginPageRegisterPrivate *priv;
00616 
00617     ENTER("account=%p, subaccounts=%s", account,
00618           subaccounts ? "TRUE" : "FALSE");
00619 
00620     if (subaccounts)
00621         ledger = gnc_ledger_display_subaccounts (account);
00622     else
00623         ledger = gnc_ledger_display_simple (account);
00624 
00625     page = gnc_plugin_page_register_new_common(ledger);
00626     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
00627     priv->key = *xaccAccountGetGUID(account);
00628 
00629     LEAVE("%p", page);
00630     return page;
00631 }
00632 
00633 GncPluginPage *
00634 gnc_plugin_page_register_new_gl (void)
00635 {
00636     GNCLedgerDisplay *ledger;
00637 
00638     ledger = gnc_ledger_display_gl ();
00639     return gnc_plugin_page_register_new_common(ledger);
00640 }
00641 
00642 GncPluginPage *
00643 gnc_plugin_page_register_new_ledger (GNCLedgerDisplay *ledger)
00644 {
00645     return gnc_plugin_page_register_new_common(ledger);
00646 }
00647 
00648 static void
00649 gnc_plugin_page_register_class_init (GncPluginPageRegisterClass *klass)
00650 {
00651     GObjectClass *object_class = G_OBJECT_CLASS (klass);
00652     GncPluginPageClass *gnc_plugin_class = GNC_PLUGIN_PAGE_CLASS(klass);
00653 
00654     parent_class = g_type_class_peek_parent (klass);
00655 
00656     object_class->finalize = gnc_plugin_page_register_finalize;
00657 
00658     gnc_plugin_class->tab_icon        = GNC_STOCK_ACCOUNT;
00659     gnc_plugin_class->plugin_name     = GNC_PLUGIN_PAGE_REGISTER_NAME;
00660     gnc_plugin_class->create_widget   = gnc_plugin_page_register_create_widget;
00661     gnc_plugin_class->destroy_widget  = gnc_plugin_page_register_destroy_widget;
00662     gnc_plugin_class->window_changed  = gnc_plugin_page_register_window_changed;
00663     gnc_plugin_class->save_page       = gnc_plugin_page_register_save_page;
00664     gnc_plugin_class->recreate_page   = gnc_plugin_page_register_recreate_page;
00665     gnc_plugin_class->update_edit_menu_actions = gnc_plugin_page_register_update_edit_menu;
00666     gnc_plugin_class->finish_pending  = gnc_plugin_page_register_finish_pending;
00667 
00668     g_type_class_add_private(klass, sizeof(GncPluginPageRegisterPrivate));
00669 
00670     gnc_ui_register_account_destroy_callback (gppr_account_destroy_cb);
00671 }
00672 
00673 static void
00674 gnc_plugin_page_register_init (GncPluginPageRegister *plugin_page)
00675 {
00676     GncPluginPageRegisterPrivate *priv;
00677     GncPluginPage *parent;
00678     GtkActionGroup *action_group;
00679     gboolean use_new;
00680 
00681     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
00682 
00683     /* Init parent declared variables */
00684     parent = GNC_PLUGIN_PAGE(plugin_page);
00685     use_new = gnc_gconf_get_bool(GCONF_GENERAL_REGISTER, KEY_USE_NEW, NULL);
00686     g_object_set(G_OBJECT(plugin_page),
00687                  "page-name",      _("General Ledger"),
00688                  "page-uri",       "default:",
00689                  "ui-description", "gnc-plugin-page-register-ui.xml",
00690                  "use-new-window", use_new,
00691                  NULL);
00692 
00693     /* Create menu and toolbar information */
00694     action_group =
00695         gnc_plugin_page_create_action_group(parent,
00696                                             "GncPluginPageRegisterActions");
00697     gtk_action_group_add_actions (action_group, gnc_plugin_page_register_actions,
00698                                   gnc_plugin_page_register_n_actions, plugin_page);
00699     gtk_action_group_add_toggle_actions (action_group,
00700                                          toggle_entries, n_toggle_entries,
00701                                          plugin_page);
00702     gtk_action_group_add_radio_actions (action_group,
00703                                         radio_entries_2, n_radio_entries_2,
00704                                         REG_STYLE_LEDGER,
00705                                         G_CALLBACK(gnc_plugin_page_register_cmd_style_changed),
00706                                         plugin_page);
00707 
00708     gnc_plugin_init_short_names (action_group, toolbar_labels);
00709     gnc_plugin_set_important_actions (action_group, important_actions);
00710 
00711     priv->lines_default     = DEFAULT_LINES_AMOUNT;
00712     priv->read_only         = FALSE;
00713     priv->fd.cleared_match  = CLEARED_ALL;
00714 }
00715 
00716 static void
00717 gnc_plugin_page_register_finalize (GObject *object)
00718 {
00719     GncPluginPageRegister *page;
00720     GncPluginPageRegisterPrivate *priv;
00721 
00722     g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (object));
00723 
00724     ENTER("object %p", object);
00725     page = GNC_PLUGIN_PAGE_REGISTER (object);
00726     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
00727 
00728     G_OBJECT_CLASS (parent_class)->finalize (object);
00729     LEAVE(" ");
00730 }
00731 
00732 Account *
00733 gnc_plugin_page_register_get_account (GncPluginPageRegister *page)
00734 {
00735     GncPluginPageRegisterPrivate *priv;
00736     GNCLedgerDisplayType ledger_type;
00737     Account *leader;
00738 
00739     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
00740     ledger_type = gnc_ledger_display_type (priv->ledger);
00741     leader = gnc_ledger_display_leader (priv->ledger);
00742 
00743     if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
00744         return leader;
00745     return NULL;
00746 }
00747 
00748 /* This is the list of actions which are switched inactive in a read-only book. */
00749 static const char* readonly_inactive_actions[] =
00750 {
00751     "EditCutAction",
00752     "EditPasteAction",
00753     "CutTransactionAction",
00754     "PasteTransactionAction",
00755     "DuplicateTransactionAction",
00756     "DeleteTransactionAction",
00757     "RemoveTransactionSplitsAction",
00758     "RecordTransactionAction",
00759     "CancelTransactionAction",
00760     "UnvoidTransactionAction",
00761     "VoidTransactionAction",
00762     "ReverseTransactionAction",
00763     "ShiftTransactionForwardAction",
00764     "ActionsTransferAction",
00765     "ActionsReconcileAction",
00766     "ActionsStockSplitAction",
00767     "ScheduleTransactionAction",
00768     "ScrubAllAction",
00769     "ScrubCurrentAction",
00770     NULL
00771 };
00772 
00773 static void
00774 gnc_plugin_page_register_ui_update (gpointer various, GncPluginPageRegister *page)
00775 {
00776     GncPluginPageRegisterPrivate *priv;
00777     SplitRegister *reg;
00778     GtkAction *action;
00779     gboolean expanded, voided;
00780     Transaction *trans;
00781 
00782     /* Set 'Split Transaction' */
00783     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
00784     reg = gnc_ledger_display_get_split_register(priv->ledger);
00785     expanded = gnc_split_register_current_trans_expanded(reg);
00786     action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
00787                                          "SplitTransactionAction");
00788     gtk_action_set_sensitive (action, reg->style == REG_STYLE_LEDGER);
00789     g_signal_handlers_block_by_func
00790     (action, gnc_plugin_page_register_cmd_expand_transaction, page);
00791     gtk_toggle_action_set_active (GTK_TOGGLE_ACTION(action), expanded);
00792     g_signal_handlers_unblock_by_func
00793     (action, gnc_plugin_page_register_cmd_expand_transaction, page);
00794 
00795     /* Set 'Void' and 'Unvoid' */
00796     trans = gnc_split_register_get_current_trans(reg);
00797     voided = xaccTransHasSplitsInState(trans, VREC);
00798     action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
00799                                          "VoidTransactionAction");
00800     gtk_action_set_sensitive (GTK_ACTION(action), !voided);
00801 
00802     action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
00803                                          "UnvoidTransactionAction");
00804     gtk_action_set_sensitive (GTK_ACTION(action), voided);
00805 
00806     /* If we are in a readonly book, make any modifying action inactive */
00807     if (qof_book_is_readonly(gnc_get_current_book()))
00808     {
00809         const char **iter;
00810         for (iter = readonly_inactive_actions; *iter; ++iter)
00811         {
00812             /* Set the action's sensitivity */
00813             GtkAction *action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page), *iter);
00814             gtk_action_set_sensitive(action, FALSE);
00815         }
00816 
00817     }
00818 }
00819 
00820 static void
00821 gnc_plugin_page_register_ui_initial_state (GncPluginPageRegister *page)
00822 {
00823     GncPluginPageRegisterPrivate *priv ;
00824     GtkActionGroup *action_group;
00825     GtkAction *action;
00826     Account *account;
00827     SplitRegister *reg;
00828     GNCLedgerDisplayType ledger_type;
00829     int i;
00830     gboolean is_readwrite = !qof_book_is_readonly(gnc_get_current_book());
00831 
00832     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
00833     account = gnc_plugin_page_register_get_account (page);
00834     action_group = gnc_plugin_page_get_action_group(GNC_PLUGIN_PAGE(page));
00835     gnc_plugin_update_actions(action_group, actions_requiring_account,
00836                               "sensitive", is_readwrite && account != NULL);
00837 
00838     /* Set "style" radio button */
00839     ledger_type = gnc_ledger_display_type(priv->ledger);
00840     gnc_plugin_update_actions(action_group, view_style_actions,
00841                               "sensitive", ledger_type == LD_SINGLE);
00842 
00843     reg = gnc_ledger_display_get_split_register(priv->ledger);
00844     for (i = n_radio_entries_2 - 1; i > 0; i--)
00845     {
00846         DEBUG(" index %d: comparing %x to %x", i, radio_entries_2[i].value,
00847               reg->style);
00848         if (radio_entries_2[i].value == reg->style)
00849         {
00850             DEBUG("match");
00851             break;
00852         }
00853     }
00854 
00855     /* Either a match was found, or fell out with i = 0 */
00856     action = gtk_action_group_get_action(action_group, radio_entries_2[i].name);
00857     g_signal_handlers_block_by_func(action, gnc_plugin_page_register_cmd_style_changed, page);
00858     gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), TRUE);
00859     g_signal_handlers_unblock_by_func(action, gnc_plugin_page_register_cmd_style_changed, page);
00860 
00861     /* Set "double line" toggle button */
00862     action = gtk_action_group_get_action (action_group,
00863                                           "ViewStyleDoubleLineAction");
00864     g_signal_handlers_block_by_func(action, gnc_plugin_page_register_cmd_style_double_line, page);
00865     gtk_toggle_action_set_active (GTK_TOGGLE_ACTION(action), reg->use_double_line);
00866     g_signal_handlers_unblock_by_func(action, gnc_plugin_page_register_cmd_style_double_line, page);
00867 }
00868 
00869 /* Virtual Functions */
00870 
00871 static GtkWidget *
00872 gnc_plugin_page_register_create_widget (GncPluginPage *plugin_page)
00873 {
00874     GncPluginPageRegister *page;
00875     GncPluginPageRegisterPrivate *priv;
00876     GNCLedgerDisplayType ledger_type;
00877     GncWindow *gnc_window;
00878     guint numRows;
00879     GtkWidget *gsr;
00880     SplitRegister *reg;
00881     Account *acct;
00882     gchar **filter;
00883     gchar *order;
00884     int filter_changed = 0;
00885 
00886     ENTER("page %p", plugin_page);
00887     page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
00888     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
00889     if (priv->widget != NULL)
00890     {
00891         LEAVE("existing widget %p", priv->widget);
00892         return priv->widget;
00893     }
00894 
00895     priv->widget = gtk_vbox_new (FALSE, 0);
00896     gtk_widget_show (priv->widget);
00897 
00898     numRows = priv->lines_default;
00899     numRows = MIN(numRows, DEFAULT_LINES_AMOUNT);
00900 
00901     gnc_window = GNC_WINDOW(GNC_PLUGIN_PAGE(page)->window);
00902     gsr = gnc_split_reg_new(priv->ledger,
00903                             gnc_window_get_gtk_window(gnc_window),
00904                             numRows, priv->read_only);
00905     priv->gsr = (GNCSplitReg *)gsr;
00906     gtk_widget_show (gsr);
00907     gtk_box_pack_start (GTK_BOX (priv->widget), gsr, TRUE, TRUE, 0);
00908 
00909     g_signal_connect (G_OBJECT (gsr), "help-changed",
00910                       G_CALLBACK ( gnc_plugin_page_help_changed_cb ),
00911                       page );
00912 
00913     reg = gnc_ledger_display_get_split_register(priv->ledger);
00914     gnc_split_register_config(reg, reg->type, reg->style,
00915                               reg->use_double_line);
00916     gnc_ledger_display_refresh(priv->ledger);
00917 
00918     gnc_plugin_page_register_ui_initial_state (page);
00919     gnc_plugin_page_register_ui_update (NULL, page);
00920 
00921     ledger_type = gnc_ledger_display_type (priv->ledger);
00922 
00923     if (ledger_type == LD_SINGLE || ledger_type == LD_SUBACCOUNT)
00924     {
00925         /* Set the sort order for the split register and status of save order button */
00926         priv->sd.save_order = FALSE;
00927         order = gnc_plugin_page_register_get_sort_order(plugin_page);
00928 
00929         PINFO("Loaded Sort order is %s", order);
00930 
00931         gnc_split_reg_set_sort_type(priv->gsr, SortTypefromString(order));
00932 
00933         if (order && (g_strcmp0 (order, DEFAULT_SORT_ORDER) != 0))
00934             priv->sd.save_order = TRUE;
00935 
00936         priv->sd.original_save_order = priv->sd.save_order;
00937         g_free(order);
00938 
00939         /* Set the filter for the split register and status of save filter button */
00940         priv->fd.save_filter = FALSE;
00941 
00942         filter = g_strsplit(gnc_plugin_page_register_get_filter(plugin_page), ",", -1);
00943 
00944         PINFO("Loaded Filter Status is %s", filter[0]);
00945 
00946         priv->fd.cleared_match = (gint)g_ascii_strtoll( filter[0], NULL, 16 );
00947 
00948         if (filter[0] && (g_strcmp0 (filter[0], DEFAULT_FILTER) != 0))
00949             filter_changed = filter_changed + 1;
00950 
00951         if (filter[1] && (g_strcmp0 (filter[1], "0") != 0 ))
00952         {
00953             PINFO("Loaded Filter Start Date is %s", filter[1]);
00954 
00955             priv->fd.start_time = gnc_plugin_page_register_filter_dmy2time( filter[1] );
00956             priv->fd.start_time = gnc_timet_get_day_start(priv->fd.start_time);
00957             filter_changed = filter_changed + 1;
00958 
00959             if (filter[2] && (g_strcmp0 (filter[2], "0") != 0 ))
00960             {
00961                 PINFO("Loaded Filter End Date is %s", filter[2]);
00962 
00963                 priv->fd.end_time = gnc_plugin_page_register_filter_dmy2time( filter[2] );
00964                 priv->fd.end_time = gnc_timet_get_day_end(priv->fd.end_time);
00965                 filter_changed = filter_changed + 1;
00966             }
00967         }
00968 
00969         if (filter_changed != 0)
00970             priv->fd.save_filter = TRUE;
00971 
00972         priv->fd.original_save_filter = priv->fd.save_filter;
00973         g_strfreev(filter);
00974 
00975         /* Update Query with Filter Status and Dates */
00976         gnc_ppr_update_status_query (page);
00977         gnc_ppr_update_date_query(page);
00978     }
00979 
00980     plugin_page->summarybar = gsr_create_summary_bar(priv->gsr);
00981     if (plugin_page->summarybar)
00982     {
00983         gtk_widget_show_all(plugin_page->summarybar);
00984         gtk_box_pack_start(GTK_BOX (priv->widget), plugin_page->summarybar,
00985                            FALSE, FALSE, 0);
00986         gnc_plugin_page_register_summarybar_position_changed(NULL, page);
00987         gnc_gconf_general_register_cb(KEY_SUMMARYBAR_POSITION,
00988                                       gnc_plugin_page_register_summarybar_position_changed, page);
00989     }
00990 
00991     priv->event_handler_id = qof_event_register_handler
00992                              ((QofEventHandler)gnc_plugin_page_register_event_handler, page);
00993     priv->component_manager_id =
00994         gnc_register_gui_component(GNC_PLUGIN_PAGE_REGISTER_NAME,
00995                                    gnc_plugin_page_register_refresh_cb,
00996                                    gnc_plugin_page_register_close_cb,
00997                                    page);
00998     gnc_gui_component_set_session (priv->component_manager_id,
00999                                    gnc_get_current_session());
01000     acct = gnc_plugin_page_register_get_account(page);
01001     if (acct)
01002         gnc_gui_component_watch_entity (
01003             priv->component_manager_id, xaccAccountGetGUID(acct),
01004             QOF_EVENT_DESTROY | QOF_EVENT_MODIFY);
01005 
01006     gnc_split_reg_set_moved_cb
01007     (priv->gsr, (GFunc)gnc_plugin_page_register_ui_update, page);
01008 
01009     /* DRH - Probably lots of other stuff from regWindowLedger should end up here. */
01010     LEAVE(" ");
01011     return priv->widget;
01012 }
01013 
01014 static void
01015 gnc_plugin_page_register_destroy_widget (GncPluginPage *plugin_page)
01016 {
01017     GncPluginPageRegister *page;
01018     GncPluginPageRegisterPrivate *priv;
01019 
01020     ENTER("page %p", plugin_page);
01021     page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
01022     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
01023 
01024     gnc_gconf_general_remove_cb(KEY_SUMMARYBAR_POSITION,
01025                                 gnc_plugin_page_register_summarybar_position_changed, page);
01026 
01027     if (priv->widget == NULL)
01028         return;
01029 
01030     if (priv->component_manager_id)
01031     {
01032         gnc_unregister_gui_component(priv->component_manager_id);
01033         priv->component_manager_id = 0;
01034     }
01035 
01036     if (priv->event_handler_id)
01037     {
01038         qof_event_unregister_handler(priv->event_handler_id);
01039         priv->event_handler_id = 0;
01040     }
01041 
01042     if (priv->sd.dialog)
01043     {
01044         gtk_widget_destroy(priv->sd.dialog);
01045         memset(&priv->sd, 0, sizeof(priv->sd));
01046     }
01047 
01048     if (priv->fd.dialog)
01049     {
01050         gtk_widget_destroy(priv->fd.dialog);
01051         memset(&priv->fd, 0, sizeof(priv->fd));
01052     }
01053 
01054     gtk_widget_hide(priv->widget);
01055     gnc_ledger_display_close (priv->ledger);
01056     priv->ledger = NULL;
01057     LEAVE(" ");
01058 }
01059 
01060 static void
01061 gnc_plugin_page_register_window_changed (GncPluginPage *plugin_page,
01062         GtkWidget *window)
01063 {
01064     GncPluginPageRegister *page;
01065     GncPluginPageRegisterPrivate *priv;
01066 
01067     g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page));
01068 
01069     page = GNC_PLUGIN_PAGE_REGISTER(plugin_page);
01070     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
01071     priv->gsr->window =
01072         GTK_WIDGET(gnc_window_get_gtk_window(GNC_WINDOW(window)));
01073 }
01074 
01075 static const gchar *style_names[] =
01076 {
01077     "Ledger",
01078     "Auto Ledger",
01079     "Journal",
01080     NULL
01081 };
01082 
01083 #define KEY_REGISTER_TYPE       "RegisterType"
01084 #define KEY_ACCOUNT_NAME        "AccountName"
01085 #define KEY_REGISTER_STYLE      "RegisterStyle"
01086 #define KEY_DOUBLE_LINE         "DoubleLineMode"
01087 
01088 #define LABEL_ACCOUNT           "Account"
01089 #define LABEL_SUBACCOUNT        "SubAccount"
01090 #define LABEL_GL                "GL"
01091 #define LABEL_SEARCH            "Search"
01092 
01093 
01103 static void
01104 gnc_plugin_page_register_save_page (GncPluginPage *plugin_page,
01105                                     GKeyFile *key_file,
01106                                     const gchar *group_name)
01107 {
01108     GncPluginPageRegister *page;
01109     GncPluginPageRegisterPrivate *priv;
01110     GNCLedgerDisplayType ledger_type;
01111     SplitRegister *reg;
01112     Account *leader;
01113 
01114     g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
01115     g_return_if_fail (key_file != NULL);
01116     g_return_if_fail (group_name != NULL);
01117 
01118     ENTER("page %p, key_file %p, group_name %s", plugin_page, key_file,
01119           group_name);
01120 
01121     page = GNC_PLUGIN_PAGE_REGISTER(plugin_page);
01122     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
01123 
01124     reg = gnc_ledger_display_get_split_register(priv->ledger);
01125     ledger_type = gnc_ledger_display_type(priv->ledger);
01126     if (ledger_type > LD_GL)
01127     {
01128         LEAVE("Unsupported ledger type");
01129         return;
01130     }
01131     if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
01132     {
01133         const gchar *label;
01134         gchar* name;
01135         label = (ledger_type == LD_SINGLE) ? LABEL_ACCOUNT : LABEL_SUBACCOUNT;
01136         leader = gnc_ledger_display_leader(priv->ledger);
01137         g_key_file_set_string(key_file, group_name, KEY_REGISTER_TYPE, label);
01138         name = gnc_account_get_full_name(leader);
01139         g_key_file_set_string(key_file, group_name, KEY_ACCOUNT_NAME, name);
01140         g_free(name);
01141     }
01142     else if (reg->type == GENERAL_LEDGER)
01143     {
01144         g_key_file_set_string(key_file, group_name, KEY_REGISTER_TYPE,
01145                               LABEL_GL);
01146     }
01147     else if (reg->type == SEARCH_LEDGER)
01148     {
01149         g_key_file_set_string(key_file, group_name, KEY_REGISTER_TYPE,
01150                               LABEL_SEARCH);
01151     }
01152     else
01153     {
01154         LEAVE("Unsupported register type");
01155         return;
01156     }
01157 
01158     g_key_file_set_string(key_file, group_name, KEY_REGISTER_STYLE,
01159                           style_names[reg->style]);
01160     g_key_file_set_boolean(key_file, group_name, KEY_DOUBLE_LINE,
01161                            reg->use_double_line);
01162 
01163     LEAVE(" ");
01164 }
01165 
01166 
01179 static void
01180 gnc_plugin_page_register_restore_edit_menu (GncPluginPage *page,
01181         GKeyFile *key_file,
01182         const gchar *group_name)
01183 {
01184     GncPluginPageRegisterPrivate *priv;
01185     GtkAction *action;
01186     GError *error = NULL;
01187     gchar *style_name;
01188     gint i;
01189     gboolean use_double_line;
01190 
01191     ENTER(" ");
01192     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
01193 
01194     /* Convert the style name to an index */
01195     style_name = g_key_file_get_string(key_file, group_name,
01196                                        KEY_REGISTER_STYLE, &error);
01197     for (i = 0 ; style_names[i]; i++)
01198     {
01199         if (g_ascii_strcasecmp(style_name, style_names[i]) == 0)
01200         {
01201             DEBUG("Found match for style name: %s", style_name);
01202             break;
01203         }
01204     }
01205     g_free(style_name);
01206 
01207     /* Update the style menu action for this page */
01208     if (i <= REG_STYLE_JOURNAL)
01209     {
01210         DEBUG("Setting style: %d", i);
01211         action = gnc_plugin_page_get_action(page, radio_entries_2[i].name);
01212         gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), TRUE);
01213     }
01214 
01215     /* Update the  double line action on this page */
01216     use_double_line =
01217         g_key_file_get_boolean(key_file, group_name, KEY_DOUBLE_LINE, &error);
01218     DEBUG("Setting double_line_mode: %d", use_double_line);
01219     action = gnc_plugin_page_get_action(page, "ViewStyleDoubleLineAction");
01220     gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), use_double_line);
01221 
01222     LEAVE(" ");
01223 }
01224 
01225 
01235 static GncPluginPage *
01236 gnc_plugin_page_register_recreate_page (GtkWidget *window,
01237                                         GKeyFile *key_file,
01238                                         const gchar *group_name)
01239 {
01240     GncPluginPage *page;
01241     GError *error = NULL;
01242     gchar *reg_type, *acct_name;
01243     Account *account;
01244     QofBook *book;
01245     gboolean include_subs;
01246 
01247     g_return_val_if_fail(key_file, NULL);
01248     g_return_val_if_fail(group_name, NULL);
01249     ENTER("key_file %p, group_name %s", key_file, group_name);
01250 
01251     /* Create the new page. */
01252     reg_type = g_key_file_get_string(key_file, group_name,
01253                                      KEY_REGISTER_TYPE, &error);
01254     DEBUG("Page type: %s", reg_type);
01255     if ((g_ascii_strcasecmp(reg_type, LABEL_ACCOUNT) == 0) ||
01256             (g_ascii_strcasecmp(reg_type, LABEL_SUBACCOUNT) == 0))
01257     {
01258         include_subs = (g_ascii_strcasecmp(reg_type, LABEL_SUBACCOUNT) == 0);
01259         DEBUG("Include subs: %d", include_subs);
01260         acct_name = g_key_file_get_string(key_file, group_name,
01261                                           KEY_ACCOUNT_NAME, &error);
01262         book = qof_session_get_book(gnc_get_current_session());
01263         account = gnc_account_lookup_by_full_name(gnc_book_get_root_account(book),
01264                   acct_name);
01265         g_free(acct_name);
01266         if (account == NULL)
01267         {
01268             LEAVE("Bad account name");
01269             g_free(reg_type);
01270             return NULL;
01271         }
01272         page = gnc_plugin_page_register_new (account, include_subs);
01273     }
01274     else if (g_ascii_strcasecmp(reg_type, LABEL_GL) == 0)
01275     {
01276         page = gnc_plugin_page_register_new_gl();
01277     }
01278     else
01279     {
01280         LEAVE("Bad ledger type");
01281         g_free(reg_type);
01282         return NULL;
01283     }
01284     g_free(reg_type);
01285 
01286     /* Recreate page in given window */
01287     gnc_plugin_page_set_use_new_window(page, FALSE);
01288 
01289     /* Install it now so we can them manipulate the created widget */
01290     gnc_main_window_open_page(GNC_MAIN_WINDOW(window), page);
01291 
01292     /* Now update the page to the last state it was in */
01293     gnc_plugin_page_register_restore_edit_menu(page, key_file, group_name);
01294     LEAVE(" ");
01295     return page;
01296 }
01297 
01298 
01299 /*
01300  * Based on code from Epiphany (src/ephy-window.c)
01301  */
01302 static void
01303 gnc_plugin_page_register_update_edit_menu (GncPluginPage *page, gboolean hide)
01304 {
01305     GncPluginPageRegisterPrivate *priv;
01306     GncPluginPageRegister *reg_page;
01307     GtkAction *action;
01308     gboolean can_copy = FALSE, can_cut = FALSE, can_paste = FALSE;
01309     gboolean has_selection;
01310     gboolean is_readwrite = !qof_book_is_readonly(gnc_get_current_book());
01311 
01312     reg_page = GNC_PLUGIN_PAGE_REGISTER(page);
01313     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(reg_page);
01314     has_selection = gnucash_register_has_selection (priv->gsr->reg);
01315 
01316     can_copy = has_selection;
01317     can_cut = is_readwrite && has_selection;
01318     can_paste = is_readwrite;
01319 
01320     action = gnc_plugin_page_get_action (page, "EditCopyAction");
01321     gtk_action_set_sensitive (action, can_copy);
01322     gtk_action_set_visible (action, !hide || can_copy);
01323     action = gnc_plugin_page_get_action (page, "EditCutAction");
01324     gtk_action_set_sensitive (action, can_cut);
01325     gtk_action_set_visible (action, !hide || can_cut);
01326     action = gnc_plugin_page_get_action (page, "EditPasteAction");
01327     gtk_action_set_sensitive (action, can_paste);
01328     gtk_action_set_visible (action,  !hide || can_paste);
01329 }
01330 
01331 
01332 static gboolean
01333 gnc_plugin_page_register_finish_pending (GncPluginPage *page)
01334 {
01335     GncPluginPageRegisterPrivate *priv;
01336     GncPluginPageRegister *reg_page;
01337     SplitRegister *reg;
01338     GtkWidget *dialog, *window;
01339     const gchar *name;
01340     gint response;
01341 
01342     reg_page = GNC_PLUGIN_PAGE_REGISTER(page);
01343     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(reg_page);
01344     reg = gnc_ledger_display_get_split_register(priv->ledger);
01345 
01346     if (!reg || !gnc_split_register_changed(reg))
01347         return TRUE;
01348 
01349     name = gnc_plugin_page_register_get_tab_name(page);
01350     window = gnc_plugin_page_get_window(page);
01351     dialog = gtk_message_dialog_new(GTK_WINDOW(window),
01352                                     GTK_DIALOG_DESTROY_WITH_PARENT,
01353                                     GTK_MESSAGE_WARNING,
01354                                     GTK_BUTTONS_NONE,
01355                                     /* Translators: %s is the name
01356                                        of the tab page */
01357                                     _("Save changes to %s?"), name);
01358     gtk_message_dialog_format_secondary_text
01359     (GTK_MESSAGE_DIALOG(dialog),
01360      "%s",
01361      _("This register has pending changes to a transaction.  "
01362        "Would you like to save the changes to this transaction, "
01363        "discard the transaction, or cancel the operation?"));
01364     gnc_gtk_dialog_add_button(dialog, _("_Discard Transaction"),
01365                               GTK_STOCK_DELETE, GTK_RESPONSE_REJECT);
01366     gtk_dialog_add_button(GTK_DIALOG(dialog),
01367                           GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
01368     gnc_gtk_dialog_add_button(dialog, _("_Save Transaction"),
01369                               GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT);
01370 
01371     response = gtk_dialog_run(GTK_DIALOG(dialog));
01372     gtk_widget_destroy(dialog);
01373 
01374     switch (response)
01375     {
01376     case GTK_RESPONSE_ACCEPT:
01377         gnc_split_register_save(reg, TRUE);
01378         return TRUE;
01379 
01380     case GTK_RESPONSE_REJECT:
01381         gnc_split_register_cancel_cursor_trans_changes(reg);
01382         gnc_split_register_save (reg, TRUE);
01383         return TRUE;
01384 
01385     default:
01386         return FALSE;
01387     }
01388 }
01389 
01390 
01391 static gchar *
01392 gnc_plugin_page_register_get_tab_name (GncPluginPage *plugin_page)
01393 {
01394     GncPluginPageRegisterPrivate *priv;
01395     GNCLedgerDisplayType ledger_type;
01396     GNCLedgerDisplay *ld;
01397     SplitRegister *reg;
01398     Account *leader;
01399 
01400     g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), _("unknown"));
01401 
01402     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
01403     ld = priv->ledger;
01404     reg = gnc_ledger_display_get_split_register (ld);
01405     ledger_type = gnc_ledger_display_type (ld);
01406     leader = gnc_ledger_display_leader (ld);
01407 
01408     switch (ledger_type)
01409     {
01410     case LD_SINGLE:
01411         return g_strdup(xaccAccountGetName (leader));
01412 
01413     case LD_SUBACCOUNT:
01414         return g_strdup_printf("%s+", xaccAccountGetName (leader));
01415 
01416     case LD_GL:
01417         switch (reg->type)
01418         {
01419         case GENERAL_LEDGER:
01420         case INCOME_LEDGER:
01421             return g_strdup(_("General Ledger"));
01422         case PORTFOLIO_LEDGER:
01423             return g_strdup(_("Portfolio"));
01424         case SEARCH_LEDGER:
01425             return g_strdup(_("Search Results"));
01426         default:
01427             break;
01428         }
01429         break;
01430 
01431     default:
01432         break;
01433     }
01434 
01435     return g_strdup(_("unknown"));
01436 }
01437 
01438 static gchar *
01439 gnc_plugin_page_register_get_tab_color (GncPluginPage *plugin_page)
01440 {
01441     GncPluginPageRegisterPrivate *priv;
01442     GNCLedgerDisplayType ledger_type;
01443     GNCLedgerDisplay *ld;
01444     SplitRegister *reg;
01445     Account *leader;
01446     const char* color;
01447 
01448     g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), _("unknown"));
01449 
01450     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
01451     ld = priv->ledger;
01452     reg = gnc_ledger_display_get_split_register (ld);
01453     ledger_type = gnc_ledger_display_type (ld);
01454     leader = gnc_ledger_display_leader (ld);
01455     color = NULL;
01456 
01457     if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
01458         color = xaccAccountGetColor (leader);
01459 
01460     return g_strdup(color ? color : "Not Set");
01461 }
01462 
01463 static gchar *
01464 gnc_plugin_page_register_get_filter (GncPluginPage *plugin_page)
01465 {
01466     GncPluginPageRegisterPrivate *priv;
01467     GNCLedgerDisplayType ledger_type;
01468     GNCLedgerDisplay *ld;
01469     SplitRegister *reg;
01470     Account *leader;
01471     const char* filter;
01472 
01473     g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), _("unknown"));
01474 
01475     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
01476     ld = priv->ledger;
01477     reg = gnc_ledger_display_get_split_register (ld);
01478     ledger_type = gnc_ledger_display_type (ld);
01479     leader = gnc_ledger_display_leader (ld);
01480     filter = NULL;
01481 
01482     if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
01483         filter = xaccAccountGetFilter (leader);
01484 
01485     return filter ? g_strdup(filter) : g_strdup_printf("%s,%s,%s", DEFAULT_FILTER, "0", "0");
01486 }
01487 
01488 void
01489 gnc_plugin_page_register_set_filter (GncPluginPage *plugin_page, const gchar *filter )
01490 {
01491     GncPluginPageRegisterPrivate *priv;
01492     GNCLedgerDisplayType ledger_type;
01493     GNCLedgerDisplay *ld;
01494     SplitRegister *reg;
01495     Account *leader;
01496     gchar *default_filter;
01497 
01498     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
01499     ld = priv->ledger;
01500     reg = gnc_ledger_display_get_split_register (ld);
01501     ledger_type = gnc_ledger_display_type (ld);
01502     leader = gnc_ledger_display_leader (ld);
01503 
01504     if (leader != NULL)
01505     {
01506         default_filter = g_strdup_printf("%s,%s,%s", DEFAULT_FILTER, "0", "0");
01507 
01508         if (!filter || (g_strcmp0 (filter, default_filter) == 0))
01509             xaccAccountSetFilter (leader, NULL);
01510         else
01511             xaccAccountSetFilter (leader, filter);
01512 
01513         g_free (default_filter);
01514     }
01515 
01516     return;
01517 }
01518 
01519 static gchar *
01520 gnc_plugin_page_register_get_sort_order (GncPluginPage *plugin_page)
01521 {
01522     GncPluginPageRegisterPrivate *priv;
01523     GNCLedgerDisplayType ledger_type;
01524     GNCLedgerDisplay *ld;
01525     SplitRegister *reg;
01526     Account *leader;
01527     const char* sort_order;
01528 
01529     g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), _("unknown"));
01530 
01531     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
01532     ld = priv->ledger;
01533     reg = gnc_ledger_display_get_split_register (ld);
01534     ledger_type = gnc_ledger_display_type (ld);
01535     leader = gnc_ledger_display_leader (ld);
01536     sort_order = NULL;
01537 
01538     if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
01539         sort_order = xaccAccountGetSortOrder (leader);
01540 
01541     return g_strdup(sort_order ? sort_order : DEFAULT_SORT_ORDER);
01542 }
01543 
01544 void
01545 gnc_plugin_page_register_set_sort_order (GncPluginPage *plugin_page, const gchar *sort_order )
01546 {
01547     GncPluginPageRegisterPrivate *priv;
01548     GNCLedgerDisplayType ledger_type;
01549     GNCLedgerDisplay *ld;
01550     SplitRegister *reg;
01551     Account *leader;
01552 
01553     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
01554     ld = priv->ledger;
01555     reg = gnc_ledger_display_get_split_register (ld);
01556     ledger_type = gnc_ledger_display_type (ld);
01557     leader = gnc_ledger_display_leader (ld);
01558 
01559     if (leader != NULL)
01560     {
01561         if (!sort_order || (g_strcmp0 (sort_order, DEFAULT_SORT_ORDER) == 0))
01562             xaccAccountSetSortOrder (leader, NULL);
01563         else
01564             xaccAccountSetSortOrder (leader, sort_order);
01565     }
01566 
01567     return;
01568 }
01569 
01570 static gchar *
01571 gnc_plugin_page_register_get_long_name (GncPluginPage *plugin_page)
01572 {
01573     GncPluginPageRegisterPrivate *priv;
01574     GNCLedgerDisplayType ledger_type;
01575     GNCLedgerDisplay *ld;
01576     SplitRegister *reg;
01577     Account *leader;
01578 
01579     g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), _("unknown"));
01580 
01581     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
01582     ld = priv->ledger;
01583     reg = gnc_ledger_display_get_split_register (ld);
01584     ledger_type = gnc_ledger_display_type (ld);
01585     leader = gnc_ledger_display_leader (ld);
01586 
01587     switch (ledger_type)
01588     {
01589     case LD_SINGLE:
01590         return gnc_account_get_full_name (leader);
01591 
01592     case LD_SUBACCOUNT:
01593     {
01594         gchar *account_full_name = gnc_account_get_full_name (leader);
01595         gchar *return_string = g_strdup_printf("%s+", account_full_name);
01596         g_free ((gpointer *) account_full_name);
01597         return return_string;
01598     }
01599 
01600     default:
01601         break;
01602     }
01603 
01604     return NULL;
01605 }
01606 
01607 static void
01608 gnc_plugin_page_register_summarybar_position_changed(GConfEntry *entry,
01609         gpointer user_data)
01610 {
01611     GncPluginPage *plugin_page;
01612     GncPluginPageRegister *page;
01613     GncPluginPageRegisterPrivate *priv;
01614     GtkPositionType position = GTK_POS_BOTTOM;
01615     gchar *conf_string;
01616 
01617     g_return_if_fail(user_data != NULL);
01618 
01619     plugin_page = GNC_PLUGIN_PAGE(user_data);
01620     page = GNC_PLUGIN_PAGE_REGISTER (user_data);
01621     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
01622 
01623     conf_string = gnc_gconf_get_string (GCONF_GENERAL,
01624                                         KEY_SUMMARYBAR_POSITION, NULL);
01625     if (conf_string)
01626     {
01627         position = gnc_enum_from_nick (GTK_TYPE_POSITION_TYPE,
01628                                        conf_string, GTK_POS_BOTTOM);
01629         g_free (conf_string);
01630     }
01631 
01632     gtk_box_reorder_child(GTK_BOX(priv->widget),
01633                           plugin_page->summarybar,
01634                           (position == GTK_POS_TOP ? 0 : -1) );
01635 }
01636 
01637 /************************************************************/
01638 /*                     "Sort By" Dialog                     */
01639 /************************************************************/
01640 
01652 void
01653 gnc_plugin_page_register_sort_response_cb (GtkDialog *dialog,
01654         gint response,
01655         GncPluginPageRegister *page)
01656 {
01657     GncPluginPageRegisterPrivate *priv;
01658     GncPluginPage *plugin_page;
01659     SortType type;
01660     const gchar *order;
01661 
01662     g_return_if_fail(GTK_IS_DIALOG(dialog));
01663     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
01664 
01665     ENTER(" ");
01666     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
01667     plugin_page = GNC_PLUGIN_PAGE(page);
01668 
01669     if (response != GTK_RESPONSE_OK)
01670     {
01671         /* Restore the original sort order */
01672         gnc_split_reg_set_sort_type(priv->gsr, priv->sd.original_sort_type);
01673         priv->sd.save_order = priv->sd.original_save_order;
01674     }
01675     else
01676     {
01677         priv->sd.original_save_order = priv->sd.save_order;
01678 
01679         if (priv->sd.save_order)
01680         {
01681             type = gnc_split_reg_get_sort_type(priv->gsr);
01682             order = SortTypeasString(type);
01683             gnc_plugin_page_register_set_sort_order (plugin_page, order);
01684         }
01685     }
01686     priv->sd.dialog = NULL;
01687     gtk_widget_destroy(GTK_WIDGET(dialog));
01688     LEAVE(" ");
01689 }
01690 
01691 
01700 void
01701 gnc_plugin_page_register_sort_button_cb (GtkToggleButton *button,
01702         GncPluginPageRegister *page)
01703 {
01704     GncPluginPageRegisterPrivate *priv;
01705     const gchar *name;
01706     SortType type;
01707 
01708     g_return_if_fail(GTK_IS_TOGGLE_BUTTON(button));
01709     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
01710 
01711     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
01712     name = gtk_buildable_get_name(GTK_BUILDABLE(button));
01713     ENTER("button %s(%p), page %p", name, button, page);
01714     type = SortTypefromString(name);
01715     gnc_split_reg_set_sort_type(priv->gsr, type);
01716     LEAVE(" ");
01717 }
01718 
01719 
01728 void
01729 gnc_plugin_page_register_sort_order_save_cb (GtkToggleButton *button,
01730         GncPluginPageRegister *page)
01731 {
01732     GncPluginPageRegisterPrivate *priv;
01733 
01734     g_return_if_fail(GTK_IS_CHECK_BUTTON(button));
01735     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
01736 
01737     ENTER("Save toggle button (%p), plugin_page %p", button, page);
01738 
01739     /* Compute the new save sort order */
01740     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
01741 
01742     if (gtk_toggle_button_get_active(button))
01743         priv->sd.save_order = TRUE;
01744     else
01745         priv->sd.save_order = FALSE;
01746     LEAVE(" ");
01747 }
01748 
01749 
01750 /************************************************************/
01751 /*                    "Filter By" Dialog                    */
01752 /************************************************************/
01753 
01766 static void
01767 gnc_ppr_update_status_query (GncPluginPageRegister *page)
01768 {
01769     GncPluginPageRegisterPrivate *priv;
01770     GSList *param_list;
01771     Query *query;
01772 
01773     ENTER(" ");
01774     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
01775     query = gnc_ledger_display_get_query( priv->ledger );
01776     if (!query)
01777     {
01778         LEAVE("no query found");
01779         return;
01780     }
01781 
01782     /* Remove the old status match */
01783     param_list = qof_query_build_param_list (SPLIT_RECONCILE, NULL);
01784     if (param_list)
01785     {
01786         qof_query_purge_terms (query, param_list);
01787         g_slist_free(param_list);
01788     }
01789 
01790     /* Install the new status match */
01791     if (priv->fd.cleared_match != CLEARED_ALL)
01792         xaccQueryAddClearedMatch(query, priv->fd.cleared_match, QOF_QUERY_AND);
01793 
01794     gnc_ledger_display_refresh (priv->ledger);
01795     LEAVE(" ");
01796 }
01797 
01798 
01811 static void
01812 gnc_ppr_update_date_query (GncPluginPageRegister *page)
01813 {
01814     GncPluginPageRegisterPrivate *priv;
01815     GSList *param_list;
01816     Query *query;
01817 
01818     ENTER(" ");
01819     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
01820     if (!priv->ledger)
01821     {
01822         LEAVE("no ledger");
01823         return;
01824     }
01825 
01826     query = gnc_ledger_display_get_query( priv->ledger );
01827     if (!query)
01828     {
01829         LEAVE("no query");
01830         return;
01831     }
01832 
01833     /* Delete any existing old date spec. */
01834     param_list = qof_query_build_param_list(SPLIT_TRANS, TRANS_DATE_POSTED, NULL);
01835     if (param_list)
01836     {
01837         qof_query_purge_terms (query, param_list);
01838         g_slist_free(param_list);
01839     }
01840 
01841     if (priv->fd.start_time || priv->fd.end_time)
01842     {
01843         /* Build a new spec */
01844         xaccQueryAddDateMatchTT(query,
01845                                 priv->fd.start_time != 0, priv->fd.start_time,
01846                                 priv->fd.end_time != 0,   priv->fd.end_time,
01847                                 QOF_QUERY_AND);
01848     }
01849 
01850     gnc_ledger_display_refresh (priv->ledger);
01851     LEAVE(" ");
01852 }
01853 
01854 
01855 /* This function converts a time_t value date to a string */
01856 static gchar *
01857 gnc_plugin_page_register_filter_time2dmy ( time_t raw_time)
01858 {
01859     struct tm * timeinfo;
01860     gchar date_string[11];
01861     gint i;
01862 
01863     timeinfo = localtime ( &raw_time );
01864     i = strftime(date_string, 11, "%d-%m-%Y", timeinfo );
01865     PINFO("Date string is %s", date_string);
01866 
01867     return g_strdup(date_string);
01868 }
01869 
01870 
01871 /* This function converts a string date to a time_t value */
01872 static time_t
01873 gnc_plugin_page_register_filter_dmy2time ( char *date_string)
01874 {
01875     struct tm *when;
01876     gint yy = 0, mm = 0, dd = 0;
01877 
01878     time_t raw_time;
01879 
01880     PINFO("Date string is %s", date_string);
01881 
01882     sscanf(date_string, "%d-%d-%d", &dd, &mm, &yy );
01883 
01884     time(&raw_time);
01885     when = localtime ( &raw_time );
01886 
01887     when->tm_year = yy - 1900;
01888     when->tm_mon = mm - 1 ;
01889     when->tm_mday = dd;
01890 
01891     return mktime(when);
01892 }
01893 
01894 
01905 void
01906 gnc_plugin_page_register_filter_status_one_cb (GtkToggleButton *button,
01907         GncPluginPageRegister *page)
01908 {
01909     GncPluginPageRegisterPrivate *priv;
01910     const gchar *name;
01911     gint i, value;
01912 
01913     g_return_if_fail(GTK_IS_CHECK_BUTTON(button));
01914     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
01915 
01916     name = gtk_buildable_get_name(GTK_BUILDABLE(button));
01917     ENTER("toggle button %s (%p), plugin_page %p", name, button, page);
01918 
01919     /* Determine what status bit to change */
01920     value = CLEARED_NONE;
01921     for (i = 0; status_actions[i].action_name; i++)
01922     {
01923         if (g_strcmp0(name, status_actions[i].action_name) == 0)
01924         {
01925             value = status_actions[i].value;
01926             break;
01927         }
01928     }
01929 
01930     /* Compute the new match status */
01931     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
01932     if (gtk_toggle_button_get_active(button))
01933         priv->fd.cleared_match |= value;
01934     else
01935         priv->fd.cleared_match &= ~value;
01936     gnc_ppr_update_status_query(page);
01937     LEAVE(" ");
01938 }
01939 
01940 
01950 void
01951 gnc_plugin_page_register_filter_status_all_cb (GtkButton *button,
01952         GncPluginPageRegister *page)
01953 {
01954     GncPluginPageRegisterPrivate *priv;
01955     GtkWidget *widget;
01956     gint i;
01957 
01958     g_return_if_fail(GTK_IS_BUTTON(button));
01959     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
01960 
01961     ENTER("(button %p, page %p)", button, page);
01962 
01963     /* Turn on all the check menu items */
01964     for (i = 0; status_actions[i].action_name; i++)
01965     {
01966         widget = status_actions[i].widget;
01967         g_signal_handlers_block_by_func(widget, gnc_plugin_page_register_filter_status_one_cb, page);
01968         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(widget), TRUE);
01969         g_signal_handlers_unblock_by_func(widget, gnc_plugin_page_register_filter_status_one_cb, page);
01970     }
01971 
01972     /* Set the requested status */
01973     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
01974     priv->fd.cleared_match = CLEARED_ALL;
01975     gnc_ppr_update_status_query(page);
01976     LEAVE(" ");
01977 }
01978 
01979 
01991 static void
01992 get_filter_times(GncPluginPageRegister *page)
01993 {
01994     GncPluginPageRegisterPrivate *priv;
01995     GtkWidget *button, *today, *gde;
01996     time_t time_val;
01997 
01998     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
01999     if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->fd.start_date_choose)))
02000     {
02001         time_val = gnc_date_edit_get_date(GNC_DATE_EDIT(priv->fd.start_date));
02002         time_val = gnc_timet_get_day_start(time_val);
02003         priv->fd.start_time = time_val;
02004     }
02005     else
02006     {
02007         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->fd.start_date_today)))
02008         {
02009             priv->fd.start_time = gnc_timet_get_today_start();
02010         }
02011         else
02012         {
02013             priv->fd.start_time = 0;
02014         }
02015     }
02016 
02017     if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->fd.end_date_choose)))
02018     {
02019         time_val = gnc_date_edit_get_date(GNC_DATE_EDIT(priv->fd.end_date));
02020         time_val = gnc_timet_get_day_end(time_val);
02021         priv->fd.end_time = time_val;
02022     }
02023     else
02024     {
02025         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->fd.start_date_today)))
02026         {
02027             priv->fd.end_time = gnc_timet_get_today_end();
02028         }
02029         else
02030         {
02031             priv->fd.end_time = 0;
02032         }
02033     }
02034 }
02035 
02036 
02052 void
02053 gnc_plugin_page_register_filter_select_range_cb (GtkRadioButton *button,
02054         GncPluginPageRegister *page)
02055 {
02056     GncPluginPageRegisterPrivate *priv;
02057     gboolean active;
02058 
02059     g_return_if_fail(GTK_IS_RADIO_BUTTON(button));
02060     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02061 
02062     ENTER("(button %p, page %p)", button, page);
02063     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
02064     active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
02065     gtk_widget_set_sensitive(priv->fd.table, active);
02066     if (active)
02067     {
02068         get_filter_times(page);
02069     }
02070     else
02071     {
02072         priv->fd.start_time = 0;
02073         priv->fd.end_time = 0;
02074     }
02075     gnc_ppr_update_date_query(page);
02076     LEAVE(" ");
02077 }
02078 
02079 
02090 static void
02091 gnc_plugin_page_register_filter_gde_changed_cb (GtkWidget *unused,
02092         GncPluginPageRegister *page)
02093 {
02094     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02095 
02096     ENTER("(widget %s(%p), page %p)", gtk_buildable_get_name(GTK_BUILDABLE(unused)), unused, page);
02097     get_filter_times(page);
02098     gnc_ppr_update_date_query(page);
02099     LEAVE(" ");
02100 }
02101 
02102 
02122 void
02123 gnc_plugin_page_register_filter_start_cb (GtkWidget *radio,
02124         GncPluginPageRegister *page)
02125 {
02126     GncPluginPageRegisterPrivate *priv;
02127     const gchar *name;
02128     gboolean active;
02129 
02130     g_return_if_fail(GTK_IS_RADIO_BUTTON(radio));
02131     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02132 
02133     ENTER("(radio %s(%p), page %p)", gtk_buildable_get_name(GTK_BUILDABLE(radio)), radio, page);
02134     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
02135     if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio)))
02136     {
02137         LEAVE("1st callback of pair. Defer to 2nd callback.");
02138         return;
02139     }
02140 
02141     name = gtk_buildable_get_name(GTK_BUILDABLE(radio));
02142     active = ( g_strcmp0(name, g_strdup("start_date_choose")) == 0 ? 1 : 0 );
02143     gtk_widget_set_sensitive(priv->fd.start_date, active);
02144     get_filter_times(page);
02145     gnc_ppr_update_date_query(page);
02146     LEAVE(" ");
02147 }
02148 
02149 
02169 void
02170 gnc_plugin_page_register_filter_end_cb (GtkWidget *radio,
02171                                         GncPluginPageRegister *page)
02172 {
02173     GncPluginPageRegisterPrivate *priv;
02174     const gchar *name;
02175     gboolean active;
02176 
02177     g_return_if_fail(GTK_IS_RADIO_BUTTON(radio));
02178     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02179 
02180     ENTER("(radio %s(%p), page %p)", gtk_buildable_get_name(GTK_BUILDABLE(radio)), radio, page);
02181     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
02182     if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio)))
02183     {
02184         LEAVE("1st callback of pair. Defer to 2nd callback.");
02185         return;
02186     }
02187 
02188     name = gtk_buildable_get_name(GTK_BUILDABLE(radio));
02189     active = ( g_strcmp0(name, g_strdup("end_date_choose")) == 0 ? 1 : 0 );
02190     gtk_widget_set_sensitive(priv->fd.end_date, active);
02191     get_filter_times(page);
02192     gnc_ppr_update_date_query(page);
02193     LEAVE(" ");
02194 }
02195 
02196 
02205 void
02206 gnc_plugin_page_register_filter_save_cb (GtkToggleButton *button,
02207         GncPluginPageRegister *page)
02208 {
02209     GncPluginPageRegisterPrivate *priv;
02210 
02211     g_return_if_fail(GTK_IS_CHECK_BUTTON(button));
02212     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02213 
02214     ENTER("Save toggle button (%p), plugin_page %p", button, page);
02215 
02216     /* Compute the new save filter status */
02217     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
02218     if (gtk_toggle_button_get_active(button))
02219         priv->fd.save_filter = TRUE;
02220     else
02221         priv->fd.save_filter = FALSE;
02222     LEAVE(" ");
02223 }
02224 
02225 
02237 void
02238 gnc_plugin_page_register_filter_response_cb (GtkDialog *dialog,
02239         gint response,
02240         GncPluginPageRegister *page)
02241 {
02242     GncPluginPageRegisterPrivate *priv;
02243     GncPluginPage *plugin_page;
02244 
02245     g_return_if_fail(GTK_IS_DIALOG(dialog));
02246     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02247 
02248     ENTER(" ");
02249     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
02250     plugin_page = GNC_PLUGIN_PAGE(page);
02251 
02252     if (response != GTK_RESPONSE_OK)
02253     {
02254         /* Remove the old status match */
02255         priv->fd.cleared_match = priv->fd.original_cleared_match;
02256         gnc_ppr_update_status_query(page);
02257         priv->fd.start_time = priv->fd.original_start_time;
02258         priv->fd.end_time = priv->fd.original_end_time;
02259         priv->fd.save_filter = priv->fd.original_save_filter;
02260         gnc_ppr_update_date_query(page);
02261     }
02262     else
02263     {
02264         priv->fd.original_save_filter = priv->fd.save_filter;
02265 
02266         if (priv->fd.save_filter)
02267         {
02268             gchar* filter;
02269             filter = g_strdup_printf("0x%04x", priv->fd.cleared_match);
02270 
02271             if ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->fd.start_date_choose)) && priv->fd.start_time != 0 )
02272             {
02273                 gchar *timeval = gnc_plugin_page_register_filter_time2dmy(priv->fd.start_time);
02274                 filter = g_strconcat ( filter, ",", timeval, NULL);
02275                 g_free (timeval);
02276             }
02277             else
02278                 filter = g_strconcat ( filter, ",0", NULL);
02279 
02280             if ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->fd.end_date_choose)) && priv->fd.end_time != 0 )
02281             {
02282                 gchar *timeval = gnc_plugin_page_register_filter_time2dmy(priv->fd.end_time);
02283                 filter = g_strconcat ( filter, ",", timeval, NULL);
02284                 g_free (timeval);
02285             }
02286             else
02287                 filter = g_strconcat ( filter, ",0", NULL);
02288 
02289             PINFO("The filter to save is %s", filter);
02290 
02291             gnc_plugin_page_register_set_filter (plugin_page, filter);
02292             g_free (filter);
02293         }
02294     }
02295     priv->fd.dialog = NULL;
02296     gtk_widget_destroy(GTK_WIDGET(dialog));
02297     LEAVE(" ");
02298 }
02299 
02300 
02301 /************************************************************/
02302 /*                  Report Helper Functions                 */
02303 /************************************************************/
02304 
02305 static char *
02306 gnc_reg_get_name (GNCLedgerDisplay *ledger, gboolean for_window)
02307 {
02308     Account *leader;
02309     SplitRegister *reg;
02310     gchar *account_name;
02311     gchar *reg_name;
02312     gchar *name;
02313     GNCLedgerDisplayType ledger_type;
02314 
02315     if (ledger == NULL)
02316         return NULL;
02317 
02318     reg = gnc_ledger_display_get_split_register (ledger);
02319     ledger_type = gnc_ledger_display_type (ledger);
02320 
02321     switch (reg->type)
02322     {
02323     case GENERAL_LEDGER:
02324     case INCOME_LEDGER:
02325         if (for_window)
02326             reg_name = _("General Ledger");
02327         else
02328             reg_name = _("General Ledger Report");
02329         break;
02330     case PORTFOLIO_LEDGER:
02331         if (for_window)
02332             reg_name = _("Portfolio");
02333         else
02334             reg_name = _("Portfolio Report");
02335         break;
02336     case SEARCH_LEDGER:
02337         if (for_window)
02338             reg_name = _("Search Results");
02339         else
02340             reg_name = _("Search Results Report");
02341         break;
02342     default:
02343         if (for_window)
02344             reg_name = _("Register");
02345         else
02346             reg_name = _("Register Report");
02347         break;
02348     }
02349 
02350     leader = gnc_ledger_display_leader (ledger);
02351 
02352     if ((leader != NULL) && (ledger_type != LD_GL))
02353     {
02354         account_name = gnc_account_get_full_name (leader);
02355 
02356         if (ledger_type == LD_SINGLE)
02357         {
02358             name = g_strconcat (account_name, " - ", reg_name, NULL);
02359         }
02360         else
02361         {
02362             name = g_strconcat (account_name, " ", _("and subaccounts"), " - ", reg_name, NULL);
02363         }
02364         g_free(account_name);
02365     }
02366     else
02367         name = g_strdup (reg_name);
02368 
02369     return name;
02370 }
02371 
02372 static int
02373 report_helper (GNCLedgerDisplay *ledger, Split *split, Query *query)
02374 {
02375     SplitRegister *reg = gnc_ledger_display_get_split_register (ledger);
02376     Account *account;
02377     char *str;
02378     swig_type_info * qtype;
02379     SCM args;
02380     SCM func;
02381     SCM arg;
02382 
02383     args = SCM_EOL;
02384 
02385     func = scm_c_eval_string ("gnc:register-report-create");
02386     g_return_val_if_fail (scm_is_procedure (func), -1);
02387 
02388     arg = scm_makfrom0str (gnc_split_register_get_credit_string (reg));
02389     args = scm_cons (arg, args);
02390 
02391     arg = scm_makfrom0str (gnc_split_register_get_debit_string (reg));
02392     args = scm_cons (arg, args);
02393 
02394     str = gnc_reg_get_name (ledger, FALSE);
02395     arg = scm_makfrom0str (str);
02396     args = scm_cons (arg, args);
02397     g_free (str);
02398 
02399     arg = SCM_BOOL (reg->use_double_line);
02400     args = scm_cons (arg, args);
02401 
02402     arg = SCM_BOOL (reg->style == REG_STYLE_JOURNAL);
02403     args = scm_cons (arg, args);
02404 
02405     if (!query)
02406     {
02407         query = gnc_ledger_display_get_query (ledger);
02408         g_return_val_if_fail (query != NULL, -1);
02409     }
02410 
02411     qtype = SWIG_TypeQuery ("_p__QofQuery");
02412     g_return_val_if_fail (qtype, -1);
02413 
02414     arg = SWIG_NewPointerObj (query, qtype, 0);
02415     args = scm_cons (arg, args);
02416     g_return_val_if_fail (arg != SCM_UNDEFINED, -1);
02417 
02418 
02419     if (split)
02420     {
02421         qtype = SWIG_TypeQuery ("_p_Split");
02422         g_return_val_if_fail (qtype, -1);
02423         arg = SWIG_NewPointerObj (split, qtype, 0);
02424     }
02425     else
02426     {
02427         arg = SCM_BOOL_F;
02428     }
02429     args = scm_cons (arg, args);
02430     g_return_val_if_fail (arg != SCM_UNDEFINED, -1);
02431 
02432 
02433     qtype = SWIG_TypeQuery ("_p_Account");
02434     g_return_val_if_fail (qtype, -1);
02435 
02436     account = gnc_ledger_display_leader (ledger);
02437     arg = SWIG_NewPointerObj (account, qtype, 0);
02438     args = scm_cons (arg, args);
02439     g_return_val_if_fail (arg != SCM_UNDEFINED, -1);
02440 
02441 
02442     /* Apply the function to the args */
02443     arg = scm_apply (func, args, SCM_EOL);
02444     g_return_val_if_fail (scm_is_exact (arg), -1);
02445 
02446     return scm_num2int (arg, SCM_ARG1, G_STRFUNC);
02447 }
02448 
02449 /************************************************************/
02450 /*                     Command callbacks                    */
02451 /************************************************************/
02452 
02453 static void
02454 gnc_plugin_page_register_cmd_print_check (GtkAction *action,
02455         GncPluginPageRegister *plugin_page)
02456 {
02457     GncPluginPageRegisterPrivate *priv;
02458     SplitRegister * reg;
02459     Split         * split;
02460     Transaction   * trans;
02461     GList         * splits = NULL, *item;
02462     GNCLedgerDisplayType ledger_type;
02463 
02464     ENTER("(action %p, plugin_page %p)", action, plugin_page);
02465 
02466     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
02467 
02468     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
02469     reg = gnc_ledger_display_get_split_register (priv->ledger);
02470     ledger_type = gnc_ledger_display_type(priv->ledger);
02471     if (ledger_type == LD_SINGLE || ledger_type == LD_SUBACCOUNT)
02472     {
02473         split    = gnc_split_register_get_current_split(reg);
02474         trans    = xaccSplitGetParent(split);
02475 
02476         if (split && trans)
02477         {
02478             splits = g_list_append(splits, split);
02479             gnc_ui_print_check_dialog_create(plugin_page, splits);
02480             g_list_free(splits);
02481         }
02482     }
02483     else if (ledger_type == LD_GL && reg->type == SEARCH_LEDGER)
02484     {
02485         Account *common_acct = NULL, *account;
02486         splits = qof_query_run(gnc_ledger_display_get_query(priv->ledger));
02487         /* Make sure each split is from the same account */
02488         for (item = splits; item; item = g_list_next(item))
02489         {
02490             split = (Split *) item->data;
02491             if (common_acct == NULL)
02492             {
02493                 common_acct = xaccSplitGetAccount(split);
02494             }
02495             else
02496             {
02497                 if (xaccSplitGetAccount(split) != common_acct)
02498                 {
02499                     GtkWidget *dialog, *window;
02500                     gint response;
02501                     const gchar *title = _("Print checks from multiple accounts?");
02502                     const gchar *message =
02503                         _("This search result contains splits from more than one account. "
02504                           "Do you want to print the checks even though they are not all "
02505                           "from the same account?");
02506                     window = gnc_plugin_page_get_window(GNC_PLUGIN_PAGE(plugin_page));
02507                     dialog = gtk_message_dialog_new(GTK_WINDOW(window),
02508                                                     GTK_DIALOG_DESTROY_WITH_PARENT,
02509                                                     GTK_MESSAGE_WARNING,
02510                                                     GTK_BUTTONS_CANCEL,
02511                                                     "%s", title);
02512                     gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
02513                             "%s", message);
02514                     gtk_dialog_add_button(GTK_DIALOG(dialog), _("_Print checks"),
02515                                           GTK_RESPONSE_YES);
02516                     response = gnc_dialog_run(GTK_DIALOG(dialog), "print_multi_acct_checks");
02517                     gtk_widget_destroy(dialog);
02518                     if (response != GTK_RESPONSE_YES)
02519                     {
02520                         LEAVE("Multiple accounts");
02521                         return;
02522                     }
02523                     break;
02524                 }
02525             }
02526         }
02527         gnc_ui_print_check_dialog_create(plugin_page, splits);
02528     }
02529     else
02530     {
02531         gnc_error_dialog(gnc_plugin_page_get_window(GNC_PLUGIN_PAGE(plugin_page)), "%s",
02532                          _("You can only print checks from a bank account register or search results."));
02533         LEAVE("Unsupported ledger type");
02534         return;
02535     }
02536     LEAVE(" ");
02537 }
02538 
02539 
02540 static void
02541 gnc_plugin_page_register_cmd_cut (GtkAction *action,
02542                                   GncPluginPageRegister *page)
02543 {
02544     GncPluginPageRegisterPrivate *priv;
02545 
02546     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02547 
02548     ENTER("(action %p, page %p)", action, page);
02549     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
02550     gnucash_register_cut_clipboard(priv->gsr->reg);
02551     LEAVE("");
02552 }
02553 
02554 
02555 static void
02556 gnc_plugin_page_register_cmd_copy (GtkAction *action,
02557                                    GncPluginPageRegister *page)
02558 {
02559     GncPluginPageRegisterPrivate *priv;
02560 
02561     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02562 
02563     ENTER("(action %p, page %p)", action, page);
02564     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
02565     gnucash_register_copy_clipboard(priv->gsr->reg);
02566     LEAVE("");
02567 }
02568 
02569 
02570 static void
02571 gnc_plugin_page_register_cmd_paste (GtkAction *action,
02572                                     GncPluginPageRegister *page)
02573 {
02574     GncPluginPageRegisterPrivate *priv;
02575 
02576     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02577 
02578     ENTER("(action %p, page %p)", action, page);
02579     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
02580     gnucash_register_paste_clipboard(priv->gsr->reg);
02581     LEAVE("");
02582 }
02583 
02584 
02585 static void
02586 gnc_plugin_page_register_cmd_edit_account (GtkAction *action,
02587         GncPluginPageRegister *page)
02588 {
02589     Account *account;
02590 
02591     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02592 
02593     ENTER("(action %p, page %p)", action, page);
02594     account = gnc_plugin_page_register_get_account (page);
02595     if (account)
02596         gnc_ui_edit_account_window (account);
02597     LEAVE(" ");
02598 }
02599 
02600 
02601 static void
02602 gnc_plugin_page_register_cmd_find_transactions (GtkAction *action,
02603         GncPluginPageRegister *page)
02604 {
02605     GncPluginPageRegisterPrivate *priv;
02606 
02607     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02608 
02609     ENTER("(action %p, page %p)", action, page);
02610     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
02611     gnc_ui_find_transactions_dialog_create(priv->ledger);
02612     LEAVE(" ");
02613 }
02614 
02615 
02616 static void
02617 gnc_plugin_page_register_cmd_cut_transaction (GtkAction *action,
02618         GncPluginPageRegister *page)
02619 {
02620     GncPluginPageRegisterPrivate *priv;
02621     SplitRegister *reg;
02622 
02623     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02624 
02625     ENTER("(action %p, page %p)", action, page);
02626     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
02627     reg = gnc_ledger_display_get_split_register(priv->ledger);
02628     gnc_split_register_cut_current(reg);
02629     LEAVE(" ");
02630 }
02631 
02632 
02633 static void
02634 gnc_plugin_page_register_cmd_copy_transaction (GtkAction *action,
02635         GncPluginPageRegister *page)
02636 {
02637     GncPluginPageRegisterPrivate *priv;
02638     SplitRegister *reg;
02639 
02640     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02641 
02642     ENTER("(action %p, page %p)", action, page);
02643     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
02644     reg = gnc_ledger_display_get_split_register(priv->ledger);
02645     gnc_split_register_copy_current(reg);
02646     LEAVE(" ");
02647 }
02648 
02649 
02650 static void
02651 gnc_plugin_page_register_cmd_paste_transaction (GtkAction *action,
02652         GncPluginPageRegister *page)
02653 {
02654     GncPluginPageRegisterPrivate *priv;
02655     SplitRegister *reg;
02656 
02657     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02658 
02659     ENTER("(action %p, page %p)", action, page);
02660     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
02661     reg = gnc_ledger_display_get_split_register(priv->ledger);
02662     gnc_split_register_paste_current(reg);
02663     LEAVE(" ");
02664 }
02665 
02666 
02667 static void
02668 gnc_plugin_page_register_cmd_void_transaction (GtkAction *action,
02669         GncPluginPageRegister *page)
02670 {
02671     GncPluginPageRegisterPrivate *priv;
02672     GtkWidget *dialog, *entry;
02673     SplitRegister *reg;
02674     Transaction *trans;
02675     GtkBuilder *builder;
02676     const char *reason;
02677     gint result;
02678 
02679     ENTER("(action %p, page %p)", action, page);
02680 
02681     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02682 
02683     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
02684     reg = gnc_ledger_display_get_split_register(priv->ledger);
02685     trans = gnc_split_register_get_current_trans(reg);
02686     if (trans == NULL)
02687         return;
02688     if (xaccTransHasSplitsInState(trans, VREC))
02689         return;
02690     if (xaccTransHasReconciledSplits(trans) || xaccTransHasSplitsInState(trans, CREC))
02691     {
02692         gnc_error_dialog(NULL, "%s", _("You cannot void a transaction with reconciled or cleared splits."));
02693         return;
02694     }
02695 
02696     if (!gnc_plugin_page_register_finish_pending(GNC_PLUGIN_PAGE(page)))
02697         return;
02698 
02699     builder = gtk_builder_new();
02700     gnc_builder_add_from_file  (builder , "gnc-plugin-page-register.glade", "Void Transaction");
02701     dialog = GTK_WIDGET(gtk_builder_get_object (builder, "Void Transaction"));
02702     entry = GTK_WIDGET(gtk_builder_get_object (builder, "reason"));
02703 
02704     result = gtk_dialog_run(GTK_DIALOG(dialog));
02705     if (result == GTK_RESPONSE_OK)
02706     {
02707         reason = gtk_entry_get_text(GTK_ENTRY(entry));
02708         if (reason == NULL)
02709             reason = "";
02710         gnc_split_register_void_current_trans(reg, reason);
02711     }
02712 
02713     /* All done. Get rid of it. */
02714     gtk_widget_destroy(dialog);
02715     g_object_unref(G_OBJECT(builder));
02716 }
02717 
02718 
02719 static void
02720 gnc_plugin_page_register_cmd_unvoid_transaction (GtkAction *action,
02721         GncPluginPageRegister *page)
02722 {
02723     GncPluginPageRegisterPrivate *priv;
02724     SplitRegister *reg;
02725     Transaction *trans;
02726 
02727     ENTER("(action %p, page %p)", action, page);
02728 
02729     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02730 
02731     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
02732     reg = gnc_ledger_display_get_split_register(priv->ledger);
02733     trans = gnc_split_register_get_current_trans(reg);
02734     if (!xaccTransHasSplitsInState(trans, VREC))
02735         return;
02736     gnc_split_register_unvoid_current_trans(reg);
02737     LEAVE(" ");
02738 }
02739 
02740 
02741 static void
02742 gnc_plugin_page_register_cmd_reverse_transaction (GtkAction *action,
02743         GncPluginPageRegister *page)
02744 {
02745     GncPluginPageRegisterPrivate *priv;
02746     SplitRegister *reg;
02747     GNCSplitReg *gsr;
02748     Transaction *trans, *new_trans;
02749 
02750     ENTER("(action %p, page %p)", action, page);
02751 
02752     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02753 
02754     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
02755     reg = gnc_ledger_display_get_split_register(priv->ledger);
02756     trans = gnc_split_register_get_current_trans(reg);
02757     if (trans == NULL)
02758         return;
02759 
02760     if (xaccTransGetReversedBy(trans))
02761     {
02762         gnc_error_dialog(gnc_plugin_page_get_window(GNC_PLUGIN_PAGE(page)), "%s",
02763                          _("A reversing entry has already been created for this transaction."));
02764         return;
02765     }
02766 
02767     qof_event_suspend();
02768     new_trans = xaccTransReverse(trans);
02769 
02770     /* Clear transaction level info */
02771     xaccTransSetDatePostedSecs(new_trans, time(NULL));
02772     xaccTransSetDateEnteredSecs(new_trans, time(NULL));
02773 
02774     qof_event_resume();
02775 
02776     /* Now jump to new trans */
02777     gsr = gnc_plugin_page_register_get_gsr(GNC_PLUGIN_PAGE(page));
02778     gnc_split_reg_jump_to_split(gsr, xaccTransGetSplit(new_trans, 0));
02779     LEAVE(" ");
02780 }
02781 
02782 static void
02783 gnc_plugin_page_register_cmd_shift_transaction_forward (GtkAction *action,
02784         GncPluginPageRegister *page)
02785 {
02786     GncPluginPageRegisterPrivate *priv;
02787     SplitRegister *reg;
02788     GNCSplitReg *gsr;
02789     Transaction *trans, *new_trans;
02790     Timespec entered;
02791 
02792     ENTER("(action %p, page %p)", action, page);
02793 
02794     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02795 
02796     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
02797     reg = gnc_ledger_display_get_split_register(priv->ledger);
02798     trans = gnc_split_register_get_current_trans(reg);
02799     if (trans == NULL)
02800         return;
02801 
02802     qof_event_suspend();
02803 
02804     xaccTransGetDatePostedTS(trans, &entered);
02805     xaccTransSetDatePostedSecs(trans, entered.tv_sec + 1);
02806 
02807     qof_event_resume();
02808 
02809     LEAVE(" ");
02810 }
02811 
02812 static void
02813 gnc_plugin_page_register_cmd_view_sort_by (GtkAction *action,
02814         GncPluginPageRegister *page)
02815 {
02816     GncPluginPageRegisterPrivate *priv;
02817     GtkWidget *dialog, *button;
02818     GtkBuilder *builder;
02819     SortType sort;
02820     const gchar *name;
02821     gchar *title;
02822 
02823     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02824     ENTER("(action %p, page %p)", action, page);
02825 
02826     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
02827     if (priv->sd.dialog)
02828     {
02829         gtk_window_present(GTK_WINDOW(priv->sd.dialog));
02830         LEAVE("existing dialog");
02831         return;
02832     }
02833 
02834     /* Create the dialog */
02835 
02836     builder = gtk_builder_new();
02837     gnc_builder_add_from_file  (builder, "gnc-plugin-page-register.glade", "Sort By");
02838     dialog = GTK_WIDGET(gtk_builder_get_object (builder, "Sort By"));
02839     priv->sd.dialog = dialog;
02840     gtk_window_set_transient_for(GTK_WINDOW(dialog),
02841                                  gnc_window_get_gtk_window(GNC_WINDOW(GNC_PLUGIN_PAGE(page)->window)));
02842     /* Translations: The %s is the name of the plugin page */
02843     title = g_strdup_printf(_("Sort %s by..."),
02844                             gnc_plugin_page_get_page_name(GNC_PLUGIN_PAGE(page)));
02845     gtk_window_set_title(GTK_WINDOW(dialog), title);
02846     g_free(title);
02847 
02848     /* Set the button for the current sort order */
02849     sort = gnc_split_reg_get_sort_type(priv->gsr);
02850     name = SortTypeasString(sort);
02851     button = GTK_WIDGET(gtk_builder_get_object (builder, name));
02852     DEBUG("current sort %d, button %s(%p)", sort, name, button);
02853     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
02854     priv->sd.original_sort_type = sort;
02855 
02856     button = GTK_WIDGET(gtk_builder_get_object (builder, "sort_save"));
02857     if (priv->sd.save_order == TRUE)
02858         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
02859 
02860     /* Wire it up */
02861     gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, page);
02862 
02863     /* Show it */
02864     gtk_widget_show(dialog);
02865     g_object_unref(G_OBJECT(builder));
02866     LEAVE(" ");
02867 }
02868 
02869 static void
02870 gnc_plugin_page_register_cmd_view_filter_by (GtkAction *action,
02871         GncPluginPageRegister *page)
02872 {
02873     GncPluginPageRegisterPrivate *priv;
02874     GtkWidget *dialog, *toggle, *button, *start_date, *end_date, *table, *hbox;
02875     time_t start_time, end_time, time_val;
02876     GtkBuilder *builder;
02877     gboolean sensitive, value;
02878     Query *query;
02879     gchar *title;
02880     int i;
02881 
02882     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
02883     ENTER("(action %p, page %p)", action, page);
02884 
02885     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
02886     if (priv->fd.dialog)
02887     {
02888         gtk_window_present(GTK_WINDOW(priv->fd.dialog));
02889         LEAVE("existing dialog");
02890         return;
02891     }
02892 
02893     /* Create the dialog */
02894     builder = gtk_builder_new();
02895     gnc_builder_add_from_file (builder, "gnc-plugin-page-register.glade", "Filter By");
02896     dialog = GTK_WIDGET(gtk_builder_get_object (builder, "Filter By"));
02897     priv->fd.dialog = dialog;
02898     gtk_window_set_transient_for(GTK_WINDOW(dialog),
02899                                  gnc_window_get_gtk_window(GNC_WINDOW(GNC_PLUGIN_PAGE(page)->window)));
02900 
02901     /* Translators: The %s is the name of the plugin page */
02902     title = g_strdup_printf(_("Filter %s by..."),
02903                             gnc_plugin_page_get_page_name(GNC_PLUGIN_PAGE(page)));
02904     gtk_window_set_title(GTK_WINDOW(dialog), title);
02905     g_free(title);
02906 
02907     /* Set the check buttons for the current status */
02908     for (i = 0; status_actions[i].action_name; i++)
02909     {
02910         toggle = GTK_WIDGET(gtk_builder_get_object (builder, status_actions[i].action_name));
02911         value = priv->fd.cleared_match & status_actions[i].value;
02912         status_actions[i].widget = toggle;
02913         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), value);
02914     }
02915     priv->fd.original_cleared_match = priv->fd.cleared_match;
02916 
02917     button = GTK_WIDGET(gtk_builder_get_object (builder, "filter_save"));
02918     if (priv->fd.save_filter == TRUE)
02919         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
02920 
02921 
02922     /* Set the date info */
02923     button = GTK_WIDGET(gtk_builder_get_object (builder, "filter_show_range"));
02924     query = gnc_ledger_display_get_query (priv->ledger);
02925     xaccQueryGetDateMatchTT(query, &start_time, &end_time);
02926     priv->fd.original_start_time = start_time;
02927     priv->fd.start_time = start_time;
02928     priv->fd.original_end_time = end_time;
02929     priv->fd.end_time = end_time;
02930 
02931     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), start_time || end_time);
02932     table = GTK_WIDGET(gtk_builder_get_object (builder, "select_range_table"));
02933     priv->fd.table = table;
02934     gtk_widget_set_sensitive(GTK_WIDGET(table), start_time || end_time);
02935 
02936     priv->fd.start_date_choose = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_choose"));
02937     priv->fd.start_date_today = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_today"));
02938     priv->fd.end_date_choose = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_choose"));
02939     priv->fd.end_date_today = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_today"));
02940 
02941     {
02942         /* Start date info */
02943         if (start_time == 0)
02944         {
02945             button = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_earliest"));
02946             time_val = xaccQueryGetEarliestDateFound (query);
02947             sensitive = FALSE;
02948         }
02949         else
02950         {
02951             time_val = start_time;
02952             if ((start_time >= gnc_timet_get_today_start()) &&
02953                     (start_time <= gnc_timet_get_today_end()))
02954             {
02955                 button = priv->fd.start_date_today;
02956                 sensitive = FALSE;
02957             }
02958             else
02959             {
02960                 button = priv->fd.start_date_choose;
02961                 sensitive = TRUE;
02962             }
02963         }
02964         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
02965         priv->fd.start_date = gnc_date_edit_new (time (NULL), FALSE, FALSE);
02966         hbox = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_hbox"));
02967         gtk_box_pack_start (GTK_BOX (hbox), priv->fd.start_date, TRUE, TRUE, 0);
02968         gtk_widget_show (priv->fd.start_date);
02969         gtk_widget_set_sensitive(GTK_WIDGET(priv->fd.start_date), sensitive);
02970         gnc_date_edit_set_time(GNC_DATE_EDIT(priv->fd.start_date), time_val);
02971         g_signal_connect (G_OBJECT (priv->fd.start_date), "date-changed",
02972                           G_CALLBACK (gnc_plugin_page_register_filter_gde_changed_cb),
02973                           page);
02974     }
02975 
02976     {
02977         /* End date info */
02978         if (end_time == 0)
02979         {
02980             button = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_latest"));
02981             time_val = xaccQueryGetLatestDateFound (query);
02982             sensitive = FALSE;
02983         }
02984         else
02985         {
02986             time_val = end_time;
02987             if ((end_time >= gnc_timet_get_today_start()) &&
02988                     (end_time <= gnc_timet_get_today_end()))
02989             {
02990                 button = priv->fd.end_date_today;
02991                 sensitive = FALSE;
02992             }
02993             else
02994             {
02995                 button = priv->fd.end_date_choose;
02996                 sensitive = TRUE;
02997             }
02998         }
02999         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
03000         priv->fd.end_date = gnc_date_edit_new (time (NULL), FALSE, FALSE);
03001         hbox = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_hbox"));
03002         gtk_box_pack_start (GTK_BOX (hbox), priv->fd.end_date, TRUE, TRUE, 0);
03003         gtk_widget_show (priv->fd.end_date);
03004         gtk_widget_set_sensitive(GTK_WIDGET(priv->fd.end_date), sensitive);
03005         gnc_date_edit_set_time(GNC_DATE_EDIT(priv->fd.end_date), time_val);
03006         g_signal_connect (G_OBJECT (priv->fd.end_date), "date-changed",
03007                           G_CALLBACK (gnc_plugin_page_register_filter_gde_changed_cb),
03008                           page);
03009     }
03010 
03011     /* Wire it up */
03012     gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, page);
03013 
03014     /* Show it */
03015     gtk_widget_show_all(dialog);
03016     g_object_unref(G_OBJECT(builder));
03017     LEAVE(" ");
03018 }
03019 
03020 static void
03021 gnc_plugin_page_register_cmd_style_changed (GtkAction *action,
03022         GtkRadioAction *current,
03023         GncPluginPageRegister *plugin_page)
03024 {
03025     GncPluginPageRegisterPrivate *priv;
03026     SplitRegisterStyle value;
03027 
03028     ENTER("(action %p, radio action %p, plugin_page %p)",
03029           action, current, plugin_page);
03030 
03031     g_return_if_fail(GTK_IS_ACTION(action));
03032     g_return_if_fail(GTK_IS_RADIO_ACTION(current));
03033     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
03034 
03035     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
03036     value = gtk_radio_action_get_current_value(current);
03037     gnc_split_reg_change_style(priv->gsr, value);
03038 
03039     gnc_plugin_page_register_ui_update (NULL, plugin_page);
03040     LEAVE(" ");
03041 }
03042 
03043 static void
03044 gnc_plugin_page_register_cmd_style_double_line (GtkToggleAction *action,
03045         GncPluginPageRegister *plugin_page)
03046 {
03047     GncPluginPageRegisterPrivate *priv;
03048     SplitRegister *reg;
03049     gboolean use_double_line;
03050 
03051     ENTER("(action %p, plugin_page %p)", action, plugin_page);
03052 
03053     g_return_if_fail(GTK_IS_ACTION(action));
03054     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
03055 
03056     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
03057     reg = gnc_ledger_display_get_split_register (priv->ledger);
03058 
03059     use_double_line =  gtk_toggle_action_get_active (action);
03060     if (use_double_line != reg->use_double_line)
03061     {
03062         gnc_split_register_config(reg, reg->type, reg->style, use_double_line);
03063         gnc_ledger_display_refresh(priv->ledger);
03064     }
03065     LEAVE(" ");
03066 }
03067 
03068 static void
03069 gnc_plugin_page_register_cmd_transfer (GtkAction *action,
03070                                        GncPluginPageRegister *page)
03071 {
03072     Account *account;
03073     GncWindow *gnc_window;
03074     GtkWidget *window;
03075 
03076     ENTER("(action %p, plugin_page %p)", action, page);
03077 
03078     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
03079 
03080     account = gnc_plugin_page_register_get_account (page);
03081     gnc_window = GNC_WINDOW(GNC_PLUGIN_PAGE (page)->window);
03082     window = GTK_WIDGET(gnc_window_get_gtk_window(gnc_window));
03083     gnc_xfer_dialog (window, account);
03084     LEAVE(" ");
03085 }
03086 
03087 static void
03088 gnc_plugin_page_register_cmd_reconcile (GtkAction *action,
03089                                         GncPluginPageRegister *page)
03090 {
03091     Account *account;
03092     GtkWindow *window;
03093     RecnWindow * recnData;
03094 
03095     ENTER("(action %p, plugin_page %p)", action, page);
03096 
03097     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
03098 
03099     account = gnc_plugin_page_register_get_account (page);
03100 
03101     window = gnc_window_get_gtk_window(GNC_WINDOW(GNC_PLUGIN_PAGE (page)->window));
03102     recnData = recnWindow (GTK_WIDGET(window), account);
03103     gnc_ui_reconcile_window_raise (recnData);
03104     LEAVE(" ");
03105 }
03106 
03107 static void
03108 gnc_plugin_page_register_cmd_autoclear (GtkAction *action,
03109                                         GncPluginPageRegister *page)
03110 {
03111     Account *account;
03112     GtkWindow *window;
03113     AutoClearWindow * autoClearData;
03114 
03115     ENTER("(action %p, plugin_page %p)", action, page);
03116 
03117     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
03118 
03119     account = gnc_plugin_page_register_get_account (page);
03120 
03121     window = gnc_window_get_gtk_window(GNC_WINDOW(GNC_PLUGIN_PAGE (page)->window));
03122     autoClearData = autoClearWindow (GTK_WIDGET(window), account);
03123     gnc_ui_autoclear_window_raise (autoClearData);
03124     LEAVE(" ");
03125 }
03126 
03127 static void
03128 gnc_plugin_page_register_cmd_stock_split (GtkAction *action,
03129         GncPluginPageRegister *page)
03130 {
03131     Account *account;
03132 
03133     ENTER("(action %p, plugin_page %p)", action, page);
03134 
03135     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
03136 
03137     account = gnc_plugin_page_register_get_account (page);
03138     gnc_stock_split_dialog (NULL, account);
03139     LEAVE(" ");
03140 }
03141 
03142 static void
03143 gnc_plugin_page_register_cmd_lots (GtkAction *action,
03144                                    GncPluginPageRegister *page)
03145 {
03146     Account *account;
03147 
03148     ENTER("(action %p, plugin_page %p)", action, page);
03149 
03150     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
03151 
03152     account = gnc_plugin_page_register_get_account (page);
03153     gnc_lot_viewer_dialog (account);
03154     LEAVE(" ");
03155 }
03156 
03157 static void
03158 gnc_plugin_page_register_cmd_enter_transaction (GtkAction *action,
03159         GncPluginPageRegister *plugin_page)
03160 {
03161     GncPluginPageRegisterPrivate *priv;
03162 
03163     ENTER("(action %p, plugin_page %p)", action, plugin_page);
03164 
03165     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
03166 
03167     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
03168     gnc_split_reg_enter(priv->gsr, FALSE);
03169     LEAVE(" ");
03170 }
03171 
03172 static void
03173 gnc_plugin_page_register_cmd_cancel_transaction (GtkAction *action,
03174         GncPluginPageRegister *plugin_page)
03175 {
03176     GncPluginPageRegisterPrivate *priv;
03177 
03178     ENTER("(action %p, plugin_page %p)", action, plugin_page);
03179 
03180     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
03181 
03182     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
03183     gnc_split_register_cancel_cursor_trans_changes
03184     (gnc_ledger_display_get_split_register(priv->ledger));
03185     LEAVE(" ");
03186 }
03187 
03188 static void
03189 gnc_plugin_page_register_cmd_delete_transaction (GtkAction *action,
03190         GncPluginPageRegister *plugin_page)
03191 {
03192     GncPluginPageRegisterPrivate *priv;
03193 
03194     ENTER("(action %p, plugin_page %p)", action, plugin_page);
03195 
03196     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
03197 
03198     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
03199     gsr_default_delete_handler(priv->gsr, NULL);
03200     LEAVE(" ");
03201 
03202 }
03203 
03204 static void
03205 gnc_plugin_page_register_cmd_blank_transaction (GtkAction *action,
03206         GncPluginPageRegister *plugin_page)
03207 {
03208     GncPluginPageRegisterPrivate *priv;
03209     SplitRegister *reg;
03210 
03211     ENTER("(action %p, plugin_page %p)", action, plugin_page);
03212 
03213     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
03214 
03215     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
03216     reg = gnc_ledger_display_get_split_register (priv->ledger);
03217 
03218     if (gnc_split_register_save (reg, TRUE))
03219         gnc_split_register_redraw (reg);
03220 
03221     gnc_split_reg_jump_to_blank (priv->gsr);
03222     LEAVE(" ");
03223 }
03224 
03225 static void
03226 gnc_plugin_page_register_cmd_duplicate_transaction (GtkAction *action,
03227         GncPluginPageRegister *plugin_page)
03228 {
03229     GncPluginPageRegisterPrivate *priv;
03230 
03231     ENTER("(action %p, plugin_page %p)", action, plugin_page);
03232 
03233     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
03234 
03235     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
03236     gnc_split_register_duplicate_current
03237     (gnc_ledger_display_get_split_register(priv->ledger));
03238     LEAVE(" ");
03239 }
03240 
03241 static void
03242 gnc_plugin_page_register_cmd_reinitialize_transaction (GtkAction *action,
03243         GncPluginPageRegister *plugin_page)
03244 {
03245     GncPluginPageRegisterPrivate *priv;
03246 
03247     ENTER("(action %p, plugin_page %p)", action, plugin_page);
03248 
03249     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
03250 
03251     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
03252     gsr_default_reinit_handler(priv->gsr, NULL);
03253     LEAVE(" ");
03254 }
03255 
03256 static void
03257 gnc_plugin_page_register_cmd_expand_transaction (GtkToggleAction *action,
03258         GncPluginPageRegister *plugin_page)
03259 {
03260     GncPluginPageRegisterPrivate *priv;
03261     SplitRegister *reg;
03262     gboolean expand;
03263 
03264     ENTER("(action %p, plugin_page %p)", action, plugin_page);
03265 
03266     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
03267 
03268     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
03269     reg = gnc_ledger_display_get_split_register (priv->ledger);
03270     expand = gtk_toggle_action_get_active (action);
03271     gnc_split_register_expand_current_trans (reg, expand);
03272     LEAVE(" ");
03273 }
03274 
03275 static void
03276 gnc_plugin_page_register_cmd_exchange_rate (GtkAction *action,
03277         GncPluginPageRegister *plugin_page)
03278 {
03279     GncPluginPageRegisterPrivate *priv;
03280     SplitRegister *reg;
03281 
03282     ENTER("(action %p, plugin_page %p)", action, plugin_page);
03283 
03284     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
03285 
03286     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
03287     reg = gnc_ledger_display_get_split_register (priv->ledger);
03288 
03289     /* XXX Ignore the return value -- we don't care if this succeeds */
03290     (void)gnc_split_register_handle_exchange (reg, TRUE);
03291     LEAVE(" ");
03292 }
03293 
03294 static void
03295 gnc_plugin_page_register_cmd_jump (GtkAction *action,
03296                                    GncPluginPageRegister *plugin_page)
03297 {
03298     GncPluginPageRegisterPrivate *priv;
03299     GncPluginPage *new_page;
03300     GncPluginPageRegister *new_reg_page;
03301     GtkWidget *window;
03302     GNCSplitReg *gsr;
03303     SplitRegister *reg;
03304     Account *account;
03305     Account *leader;
03306     Split *split;
03307 
03308     ENTER("(action %p, plugin_page %p)", action, plugin_page);
03309 
03310     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
03311 
03312     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
03313     window = GNC_PLUGIN_PAGE (plugin_page)->window;
03314     if (window == NULL)
03315     {
03316         LEAVE("no window");
03317         return;
03318     }
03319 
03320     reg = gnc_ledger_display_get_split_register (priv->ledger);
03321     split = gnc_split_register_get_current_split (reg);
03322     if (split == NULL)
03323     {
03324         LEAVE("no split (1)");
03325         return;
03326     }
03327 
03328     account = xaccSplitGetAccount (split);
03329     if (account == NULL)
03330     {
03331         LEAVE("no account");
03332         return;
03333     }
03334 
03335     leader = gnc_ledger_display_leader (priv->ledger);
03336     if (account == leader)
03337     {
03338         split = xaccSplitGetOtherSplit (split);
03339         if (split == NULL)
03340         {
03341             LEAVE("no split (2)");
03342             return;
03343         }
03344 
03345         account = xaccSplitGetAccount (split);
03346         if (account == NULL)
03347         {
03348             LEAVE("no account (2)");
03349             return;
03350         }
03351 
03352         if (account == leader)
03353         {
03354             LEAVE("register open for account");
03355             return;
03356         }
03357     }
03358 
03359     new_page = gnc_plugin_page_register_new (account, FALSE);
03360     if (new_page == NULL)
03361     {
03362         LEAVE("couldn't create new page");
03363         return;
03364     }
03365     new_reg_page = GNC_PLUGIN_PAGE_REGISTER(new_page);
03366 
03367     gnc_main_window_open_page (GNC_MAIN_WINDOW(window), new_page);
03368     gsr = gnc_plugin_page_register_get_gsr (new_page);
03369     gnc_split_reg_jump_to_split(gsr, split);
03370     LEAVE(" ");
03371 }
03372 
03373 static void
03374 gnc_plugin_page_register_cmd_schedule (GtkAction *action,
03375                                        GncPluginPageRegister *plugin_page)
03376 {
03377     GncPluginPageRegisterPrivate *priv;
03378 
03379     ENTER("(action %p, plugin_page %p)", action, plugin_page);
03380 
03381     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
03382 
03383     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
03384     gsr_default_schedule_handler(priv->gsr, NULL);
03385     LEAVE(" ");
03386 }
03387 
03388 static void
03389 gnc_plugin_page_register_cmd_scrub_current (GtkAction *action,
03390         GncPluginPageRegister *plugin_page)
03391 {
03392     GncPluginPageRegisterPrivate *priv;
03393     Query *query;
03394     Account *root;
03395     Transaction *trans;
03396     SplitRegister *reg;
03397 
03398     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
03399 
03400     ENTER("(action %p, plugin_page %p)", action, plugin_page);
03401 
03402     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
03403     query = gnc_ledger_display_get_query( priv->ledger );
03404     if (query == NULL)
03405     {
03406         LEAVE("no query found");
03407         return;
03408     }
03409 
03410     reg = gnc_ledger_display_get_split_register(priv->ledger);
03411     trans = gnc_split_register_get_current_trans(reg);
03412     if (trans == NULL)
03413     {
03414         LEAVE("no trans found");
03415         return;
03416     }
03417 
03418     gnc_suspend_gui_refresh();
03419     root = gnc_get_current_root_account();
03420     xaccTransScrubOrphans(trans);
03421     xaccTransScrubImbalance(trans, root, NULL);
03422     gnc_resume_gui_refresh();
03423     LEAVE(" ");
03424 }
03425 
03426 static void
03427 gnc_plugin_page_register_cmd_scrub_all (GtkAction *action,
03428                                         GncPluginPageRegister *plugin_page)
03429 {
03430     GncPluginPageRegisterPrivate *priv;
03431     Query *query;
03432     Account *root;
03433     Transaction *trans;
03434     Split *split;
03435     GList *node;
03436 
03437     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
03438 
03439     ENTER("(action %p, plugin_page %p)", action, plugin_page);
03440 
03441     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
03442     query = gnc_ledger_display_get_query( priv->ledger );
03443     if (!query)
03444     {
03445         LEAVE("no query found");
03446         return;
03447     }
03448 
03449     gnc_suspend_gui_refresh();
03450     root = gnc_get_current_root_account();
03451 
03452     for (node = qof_query_run(query); node; node = node->next)
03453     {
03454         split = node->data;
03455         trans = xaccSplitGetParent(split);
03456 
03457         xaccTransScrubOrphans(trans);
03458         xaccTransScrubImbalance(trans, root, NULL);
03459     }
03460 
03461     gnc_resume_gui_refresh();
03462     LEAVE(" ");
03463 }
03464 
03465 static void
03466 gnc_plugin_page_register_cmd_account_report (GtkAction *action,
03467         GncPluginPageRegister *plugin_page)
03468 {
03469     GncPluginPageRegisterPrivate *priv;
03470     GncMainWindow *window;
03471     int id;
03472 
03473     ENTER("(action %p, plugin_page %p)", action, plugin_page);
03474 
03475     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
03476 
03477     window = GNC_MAIN_WINDOW(GNC_PLUGIN_PAGE(plugin_page)->window);
03478     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
03479     id = report_helper (priv->ledger, NULL, NULL);
03480     if (id >= 0)
03481         gnc_main_window_open_report(id, window);
03482     LEAVE(" ");
03483 }
03484 
03485 static void
03486 gnc_plugin_page_register_cmd_transaction_report (GtkAction *action,
03487         GncPluginPageRegister *plugin_page)
03488 {
03489     GncPluginPageRegisterPrivate *priv;
03490     GncMainWindow *window;
03491     SplitRegister *reg;
03492     Split *split;
03493     Query *query;
03494     int id;
03495 
03496 
03497     ENTER("(action %p, plugin_page %p)", action, plugin_page);
03498 
03499     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
03500 
03501     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
03502     reg = gnc_ledger_display_get_split_register (priv->ledger);
03503 
03504     split = gnc_split_register_get_current_split (reg);
03505     if (!split)
03506         return;
03507 
03508     query = qof_query_create_for(GNC_ID_SPLIT);
03509 
03510     qof_query_set_book (query, gnc_get_current_book ());
03511 
03512     xaccQueryAddGUIDMatch (query, xaccSplitGetGUID (split),
03513                            GNC_ID_SPLIT, QOF_QUERY_AND);
03514 
03515     window = GNC_MAIN_WINDOW(GNC_PLUGIN_PAGE(plugin_page)->window);
03516     id = report_helper (priv->ledger, split, query);
03517     if (id >= 0)
03518         gnc_main_window_open_report(id, window);
03519     LEAVE(" ");
03520 }
03521 
03522 /************************************************************/
03523 /*                    Auxiliary functions                   */
03524 /************************************************************/
03525 
03526 void
03527 gnc_plugin_page_register_set_options (GncPluginPage *plugin_page,
03528                                       gint lines_default,
03529                                       gboolean read_only)
03530 {
03531     GncPluginPageRegister *page;
03532     GncPluginPageRegisterPrivate *priv;
03533 
03534     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
03535 
03536     page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
03537     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
03538     priv->lines_default     = lines_default;
03539     priv->read_only         = read_only;
03540 }
03541 
03542 GNCSplitReg *
03543 gnc_plugin_page_register_get_gsr (GncPluginPage *plugin_page)
03544 {
03545     GncPluginPageRegister *page;
03546     GncPluginPageRegisterPrivate *priv;
03547 
03548     g_return_val_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page), NULL);
03549 
03550     page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
03551     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
03552 
03553     return priv->gsr;
03554 }
03555 
03556 static void
03557 gnc_plugin_page_help_changed_cb (GNCSplitReg *gsr, GncPluginPageRegister *register_page)
03558 {
03559     GncPluginPageRegisterPrivate *priv;
03560     SplitRegister *reg;
03561     GncWindow *window;
03562     char *help;
03563 
03564     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(register_page));
03565 
03566     window = GNC_WINDOW(GNC_PLUGIN_PAGE(register_page)->window);
03567     if (!window)
03568     {
03569         // This routine can be called before the page is added to a
03570         // window.
03571         return;
03572     }
03573 
03574     /* Get the text from the ledger */
03575     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(register_page);
03576     reg = gnc_ledger_display_get_split_register(priv->ledger);
03577     help = gnc_table_get_help(reg->table);
03578     gnc_window_set_status(window, GNC_PLUGIN_PAGE(register_page), help);
03579     g_free(help);
03580 }
03581 
03582 static void
03583 gnc_plugin_page_register_refresh_cb (GHashTable *changes, gpointer user_data)
03584 {
03585     GncPluginPageRegister *page = user_data;
03586     GncPluginPageRegisterPrivate *priv;
03587 
03588     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
03589     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
03590 
03591     if (changes)
03592     {
03593         const EventInfo* ei;
03594         ei = gnc_gui_get_entity_events(changes, &priv->key);
03595         if (ei)
03596         {
03597             if (ei->event_mask & QOF_EVENT_DESTROY)
03598             {
03599                 gnc_main_window_close_page(GNC_PLUGIN_PAGE(page));
03600                 return;
03601             }
03602             if (ei->event_mask & QOF_EVENT_MODIFY)
03603             {
03604             }
03605         }
03606     }
03607     else
03608     {
03609         /* forced updates */
03610         gnucash_register_refresh_from_gconf(priv->gsr->reg);
03611         gtk_widget_queue_draw(priv->widget);
03612     }
03613 
03614     gnc_plugin_page_register_ui_update(NULL, page);
03615 }
03616 
03617 static void
03618 gnc_plugin_page_register_close_cb (gpointer user_data)
03619 {
03620     GncPluginPage *plugin_page = GNC_PLUGIN_PAGE(user_data);
03621     gnc_main_window_close_page (plugin_page);
03622 }
03623 
03632 static void
03633 gppr_account_destroy_cb (Account *account)
03634 {
03635     GncPluginPageRegister *page;
03636     GncPluginPageRegisterPrivate *priv;
03637     GNCLedgerDisplayType ledger_type;
03638     const GncGUID *acct_guid;
03639     const GList *citem;
03640     GList *item, *kill = NULL;
03641 
03642     acct_guid = xaccAccountGetGUID(account);
03643 
03644     /* Find all windows that need to be killed.  Don't kill them yet, as
03645      * that would affect the list being walked.*/
03646     citem = gnc_gobject_tracking_get_list(GNC_PLUGIN_PAGE_REGISTER_NAME);
03647     for ( ; citem; citem = g_list_next(citem))
03648     {
03649         page = (GncPluginPageRegister *)citem->data;
03650         priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
03651         ledger_type = gnc_ledger_display_type (priv->ledger);
03652         if (ledger_type == LD_GL)
03653         {
03654             kill = g_list_append(kill, page);
03655             /* kill it */
03656         }
03657         else if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
03658         {
03659             if (guid_compare(acct_guid, &priv->key) == 0)
03660             {
03661                 kill = g_list_append(kill, page);
03662             }
03663         }
03664     }
03665 
03666     /* Now kill them. */
03667     for (item = kill; item; item = g_list_next(item))
03668     {
03669         page = (GncPluginPageRegister *)item->data;
03670         gnc_main_window_close_page(GNC_PLUGIN_PAGE(page));
03671     }
03672 }
03673 
03688 static void
03689 gnc_plugin_page_register_event_handler (QofInstance *entity,
03690                                         QofEventId event_type,
03691                                         GncPluginPageRegister *page,
03692                                         GncEventData *ed)
03693 {
03694     Transaction *trans;
03695     QofBook *book;
03696     GncPluginPage *visible_page;
03697     GtkWidget *window;
03698     gchar *label, *color;
03699 
03700     g_return_if_fail(page);     /* Required */
03701     if (!GNC_IS_TRANS(entity) && !GNC_IS_ACCOUNT(entity))
03702         return;
03703 
03704     ENTER("entity %p of type %d, page %p, event data %p",
03705           entity, event_type, page, ed);
03706 
03707     window = gnc_plugin_page_get_window(GNC_PLUGIN_PAGE(page));
03708 
03709     if (GNC_IS_ACCOUNT(entity))
03710     {
03711         if (GNC_IS_MAIN_WINDOW(window))
03712         {
03713             label = gnc_plugin_page_register_get_tab_name(GNC_PLUGIN_PAGE(page));
03714             main_window_update_page_name(GNC_PLUGIN_PAGE(page), label);
03715             color = gnc_plugin_page_register_get_tab_color(GNC_PLUGIN_PAGE(page));
03716             main_window_update_page_color(GNC_PLUGIN_PAGE(page), color);
03717             g_free(color);
03718             g_free(label);
03719         }
03720         LEAVE("tab name updated");
03721         return;
03722     }
03723 
03724     if (!(event_type & (QOF_EVENT_MODIFY | QOF_EVENT_DESTROY)))
03725     {
03726         LEAVE("not a modify");
03727         return;
03728     }
03729     trans = GNC_TRANS(entity);
03730     book = qof_instance_get_book(QOF_INSTANCE(trans));
03731     if (!gnc_plugin_page_has_book(GNC_PLUGIN_PAGE(page), book))
03732     {
03733         LEAVE("not in this book");
03734         return;
03735     }
03736 
03737     if (GNC_IS_MAIN_WINDOW(window))
03738     {
03739         visible_page = gnc_main_window_get_current_page(GNC_MAIN_WINDOW(window));
03740         if (visible_page != GNC_PLUGIN_PAGE(page))
03741         {
03742             LEAVE("page not visible");
03743             return;
03744         }
03745     }
03746 
03747     gnc_plugin_page_register_ui_update(NULL, page);
03748     LEAVE(" ");
03749     return;
03750 }
03751 
03752 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines