|
GnuCash 2.4.99
|
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
1.7.4