diff --git a/ChangeLog b/ChangeLog index 0384bb404c..1af9bb7e29 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,35 @@ +2002-11-03 Joshua Sled + + * src/gnome/dialog-sxsincelast.c: Use GNCSplitReg over + GNCRegWidget. + + * src/gnome/dialog-scheduledxaction.c + (schedXact_editor_create_ledger): Use GNCSplitReg over + GNCRegWidget. + + * src/gnome/glade/register.glade: Moved a bunch of the + previously-shared widget definitions into seperate places to be + accessed by window-register.c and gnc-split-reg.c. + + * src/gnome/window-register.c: Massive code-sucking into + gnc-split-reg.c; this file now only handles the details of being + the register window: dealing with dates and the extended menus and + whatnot. + + * src/gnome/gnc-split-reg.c: Added; a better implementation of + gnc-regWidget. All the "common" register-editing code has been + moved here from window-register.c. + + * src/register/ledger-core/gnc-regwidget.c: Removed; replaced with + src/gnome/gnc-split-reg.c. + + * src/register/register-gnome/gnucash-date-picker.c + (gnc_date_picker_new): Call gtk_widget_show_all rather than + gtk_widget_realize in order to setup the calendar to a state + sufficient for subsequent calls. + + * HACKING: Added description of how to start GnuCash in GDB. + 2002-11-03 Derek Atkins * engine/gnc-be-utils.h: implement macro helpers for begin/commit functions * business/business-core/*.c: Implement BeginEdit()/CommitEdit() functions diff --git a/HACKING b/HACKING index 84622ec04f..4146be74ce 100644 --- a/HACKING +++ b/HACKING @@ -66,3 +66,11 @@ Scheme: Dave Peticolas August 22, 2000 + +-------------------------------------------------- + +Starting GnuCash in GDB -- Oct 2002 + +% gnucash-env gdb /path/to/guile +[gdb output] +% gdb> run -e main -s /path/to/devel-gnucash/libexec/overrides/gnucash --g-fatal-warnings diff --git a/src/gnome/Makefile.am b/src/gnome/Makefile.am index 8a8c19c0c6..2015b67327 100644 --- a/src/gnome/Makefile.am +++ b/src/gnome/Makefile.am @@ -44,6 +44,7 @@ libgncgnome_la_SOURCES = \ druid-loan.c \ druid-stock-split.c \ gnc-splash.c \ + gnc-split-reg.c \ mainwindow-account-tree.c \ reconcile-list.c \ tip-of-the-day.c \ @@ -80,6 +81,7 @@ noinst_HEADERS = \ druid-loan.h \ gnc-network.h \ gnc-splash.h \ + gnc-split-reg.h \ gw-gnc.h \ mainwindow-account-tree.h \ reconcile-list.h \ diff --git a/src/gnome/dialog-scheduledxaction.c b/src/gnome/dialog-scheduledxaction.c index 17f3cc27f2..90088763b1 100644 --- a/src/gnome/dialog-scheduledxaction.c +++ b/src/gnome/dialog-scheduledxaction.c @@ -48,7 +48,7 @@ #include "window-help.h" #include "window-register.h" -#include "gnc-regwidget.h" +#include "gnc-split-reg.h" /* FIXME: temp until variable-related-stuff settled. */ #include "dialog-sxsincelast.h" @@ -1333,7 +1333,7 @@ schedXact_editor_create_ledger( SchedXactionEditorDialog *sxed ) { GtkFrame *tempxaction_frame; SplitRegister *splitreg; - GtkWidget *regWidget, *vbox; + GtkWidget *gsr, *vbox; int numLedgerLines = NUM_LEDGER_LINES_DEFAULT; tempxaction_frame = @@ -1349,39 +1349,39 @@ schedXact_editor_create_ledger( SchedXactionEditorDialog *sxed ) (int)gnc_lookup_number_option( SX_OPT_STR, "Template Register Lines", NUM_LEDGER_LINES_DEFAULT ); - gnucash_register_set_initial_rows(numLedgerLines); + gsr = gnc_split_reg_new( sxed->ledger, GTK_WINDOW(sxed->dialog), + numLedgerLines, + (CREATE_TOOLBAR | CREATE_POPUP | CREATE_MENUS), + (CAP_JUMP | CAP_SCHEDULE) ); - regWidget = gnc_regWidget_new( sxed->ledger, - GTK_WINDOW(sxed->dialog), - CAP_SCHEDULE | CAP_JUMP ); gtk_box_pack_start( GTK_BOX(vbox), - gnc_regWidget_get_toolbar( GNC_REGWIDGET(regWidget) ), + gnc_split_reg_get_toolbar( GNC_SPLIT_REG(gsr) ), FALSE, TRUE, 2 ); { GtkWidget *popup, *tmpMenu, *tmpMI; /* Fixup the popup menu with the menus that would normally be in the * menu-bar of the window-register. */ - popup = gnc_regWidget_get_popup( GNC_REGWIDGET(regWidget) ); + popup = gnc_split_reg_get_popup( GNC_SPLIT_REG(gsr) ); gtk_menu_append( GTK_MENU(popup), gtk_menu_item_new() ); - tmpMenu = gnc_regWidget_get_edit_menu( GNC_REGWIDGET(regWidget) ); + tmpMenu = gnc_split_reg_get_edit_menu( GNC_SPLIT_REG(gsr) ); tmpMI = gtk_menu_item_new_with_label( N_("Edit") ); gtk_menu_item_set_submenu( GTK_MENU_ITEM(tmpMI), tmpMenu ); gtk_menu_append( GTK_MENU(popup), tmpMI ); - tmpMenu = gnc_regWidget_get_style_menu( GNC_REGWIDGET(regWidget) ); + tmpMenu = gnc_split_reg_get_style_menu( GNC_SPLIT_REG(gsr) ); tmpMI = gtk_menu_item_new_with_label( N_("Style") ); gtk_menu_item_set_submenu( GTK_MENU_ITEM(tmpMI), tmpMenu ); gtk_menu_append( GTK_MENU(popup), tmpMI ); - tmpMenu = gnc_regWidget_get_sort_menu( GNC_REGWIDGET(regWidget) ); + tmpMenu = gnc_split_reg_get_sort_menu( GNC_SPLIT_REG(gsr) ); tmpMI = gtk_menu_item_new_with_label( N_("Sort") ); gtk_menu_item_set_submenu( GTK_MENU_ITEM(tmpMI), tmpMenu ); gtk_menu_append( GTK_MENU(popup), tmpMI ); gtk_widget_show_all( popup ); } - gtk_box_pack_start( GTK_BOX(vbox), regWidget, TRUE, TRUE, 2 ); + gtk_box_pack_start( GTK_BOX(vbox), gsr, TRUE, TRUE, 2 ); /* configure... */ /* don't use double-line */ diff --git a/src/gnome/dialog-sxsincelast.c b/src/gnome/dialog-sxsincelast.c index a1cb222acf..72e141cfb0 100644 --- a/src/gnome/dialog-sxsincelast.c +++ b/src/gnome/dialog-sxsincelast.c @@ -73,7 +73,7 @@ #include "split-register.h" #include "gnc-ledger-display.h" #include "gnucash-sheet.h" -#include "gnc-regwidget.h" +#include "gnc-split-reg.h" #include "dialog-sxsincelast.h" #include "dialog-scheduledxaction.h" @@ -278,13 +278,13 @@ typedef struct _sxSinceLastData { gint autoCreatedCount; GNCLedgerDisplay *ac_ledger; - GNCRegWidget *ac_regWidget; + GNCSplitReg *ac_gsr; GNCLedgerDisplay *created_ledger; - GNCRegWidget *created_regWidget; + GNCSplitReg *created_gsr; GNCLedgerDisplay *to_create_ledger; - GNCRegWidget *to_create_regWidget; + GNCSplitReg *to_create_gsr; } sxSinceLastData; @@ -2825,7 +2825,7 @@ sxsincelast_tc_row_sel( GtkCTree *ct, sxGUIDstr = guid_to_string( xaccSchedXactionGetGUID( tci->parentTCT->sx ) ); sxsld->to_create_ledger = gnc_ledger_display_template_gl( sxGUIDstr ); - gnc_regWidget_set_ledger_display( sxsld->to_create_regWidget, + gnc_split_reg_set_ledger_display( sxsld->to_create_gsr, sxsld->to_create_ledger ); } @@ -3493,19 +3493,20 @@ create_autoCreate_ledger( sxSinceLastData *sxsld ) sxsld_ledger_get_parent ); gnc_ledger_display_set_user_data( sxsld->ac_ledger, (gpointer)sxsld ); splitreg = gnc_ledger_display_get_split_register( sxsld->ac_ledger ); - /* FIXME: make configurable? */ - gnucash_register_set_initial_rows( 4 ); - sxsld->ac_regWidget = - GNC_REGWIDGET(gnc_regWidget_new( sxsld->ac_ledger, - GTK_WINDOW( sxsld->sincelast_window ), - CAP_SCHEDULE )); + /* FIXME: Make numRows configurable. */ + sxsld->ac_gsr = + gnc_split_reg_new( sxsld->ac_ledger, + GTK_WINDOW( sxsld->sincelast_window ), + 4, + (CREATE_TOOLBAR | CREATE_POPUP), + CAP_SCHEDULE ); vbox = glade_xml_get_widget( sxsld->gxml, AUTO_CREATE_VBOX ); - toolbar = gnc_regWidget_get_toolbar( sxsld->ac_regWidget ); + toolbar = gnc_split_reg_get_toolbar( sxsld->ac_gsr ); gtk_box_pack_start( GTK_BOX(vbox), toolbar, FALSE, FALSE, 2 ); - gtk_box_pack_end( GTK_BOX(vbox), GTK_WIDGET(sxsld->ac_regWidget), TRUE, TRUE, 2 ); + gtk_box_pack_end( GTK_BOX(vbox), GTK_WIDGET(sxsld->ac_gsr), TRUE, TRUE, 2 ); /* FIXME: we should do all the happy-fun register stuff... button bar * controls ... popups ... */ @@ -3541,19 +3542,19 @@ create_created_ledger( sxSinceLastData *sxsld ) sxsld_ledger_get_parent ); gnc_ledger_display_set_user_data( sxsld->created_ledger, (gpointer)sxsld ); splitreg = gnc_ledger_display_get_split_register( sxsld->created_ledger ); - /* FIXME: make configurable? */ - gnucash_register_set_initial_rows( 4 ); - - sxsld->created_regWidget = - GNC_REGWIDGET(gnc_regWidget_new( sxsld->created_ledger, - GTK_WINDOW( sxsld->sincelast_window ), - CAP_SCHEDULE )); + /* FIXME: make numRows configurable? */ + sxsld->created_gsr = + gnc_split_reg_new( sxsld->created_ledger, + GTK_WINDOW( sxsld->sincelast_window ), + 4, + ( CREATE_TOOLBAR | CREATE_POPUP ), + CAP_SCHEDULE ); vbox = glade_xml_get_widget( sxsld->gxml, CREATED_VBOX ); - toolbar = gnc_regWidget_get_toolbar( sxsld->created_regWidget ); + toolbar = gnc_split_reg_get_toolbar( sxsld->created_gsr ); gtk_box_pack_start( GTK_BOX(vbox), toolbar, FALSE, FALSE, 2 ); - gtk_box_pack_end( GTK_BOX(vbox), GTK_WIDGET(sxsld->created_regWidget), TRUE, TRUE, 2 ); + gtk_box_pack_end( GTK_BOX(vbox), GTK_WIDGET(sxsld->created_gsr), TRUE, TRUE, 2 ); /* FIXME: we should do all the happy-fun register stuff... button bar @@ -3590,17 +3591,17 @@ create_to_create_ledger( sxSinceLastData *sxsld ) sxsld_ledger_get_parent ); gnc_ledger_display_set_user_data( sxsld->to_create_ledger, (gpointer)sxsld ); splitreg = gnc_ledger_display_get_split_register( sxsld->to_create_ledger ); - /* FIXME: make configurable? */ - gnucash_register_set_initial_rows( 4 ); - - sxsld->to_create_regWidget = - GNC_REGWIDGET(gnc_regWidget_new( sxsld->to_create_ledger, - GTK_WINDOW( sxsld->sincelast_window ), - CAP_SCHEDULE )); + /* FIXME: make numRows configurable? */ + sxsld->to_create_gsr = + gnc_split_reg_new( sxsld->to_create_ledger, + GTK_WINDOW( sxsld->sincelast_window ), + 4, + ( CREATE_TOOLBAR | CREATE_POPUP ), + ( CAP_READ_ONLY | CAP_SCHEDULE) ); txn_reg_frame = glade_xml_get_widget( sxsld->gxml, TO_CREATE_TXN_REG_FRAME ); gtk_container_add( GTK_CONTAINER( txn_reg_frame ), - GTK_WIDGET( sxsld->to_create_regWidget ) ); + GTK_WIDGET( sxsld->to_create_gsr ) ); /* configure... */ diff --git a/src/gnome/glade/register.glade b/src/gnome/glade/register.glade index 5bf64c2fc3..2489219884 100644 --- a/src/gnome/glade/register.glade +++ b/src/gnome/glade/register.glade @@ -62,7 +62,7 @@ GNOME_DOCK_TOP 0 0 - 0 + 26 False True False @@ -72,21 +72,21 @@ GtkMenuBar - menubar1 + gnc_register_menubar GTK_SHADOW_NONE GtkMenuItem - menu_file + menuitem1 GNOMEUIINFO_MENU_FILE_TREE GtkMenu - menu_file_menu + menuitem1_menu GtkMenuItem - menu_new_account + menuitem2 Create a new account activate @@ -99,13 +99,13 @@ GtkMenuItem - separator10 + menuitem3 False GtkPixmapMenuItem - menu_save + pixmapmenuitem1 activate gnc_main_window_file_save_cb @@ -116,7 +116,7 @@ GtkPixmapMenuItem - menu_saveas + pixmapmenuitem2 activate gnc_main_window_file_save_as_cb @@ -127,13 +127,13 @@ GtkMenuItem - separator12 + menuitem4 False GtkPixmapMenuItem - menu_print + pixmapmenuitem3 activate gnc_register_print_cb @@ -144,7 +144,7 @@ GtkMenuItem - menu_print_check + menuitem5 Print a check using a standard format activate @@ -157,13 +157,13 @@ GtkMenuItem - separator1 + menuitem6 False GtkPixmapMenuItem - menu_close + pixmapmenuitem4 activate gnc_register_close_cb @@ -174,7 +174,7 @@ GtkPixmapMenuItem - menu_exit + pixmapmenuitem5 activate gnc_main_window_exit_cb @@ -187,140 +187,63 @@ GtkMenuItem - menu_edit - GNOMEUIINFO_MENU_EDIT_TREE + gnc_register_edit_menu + + False GtkMenu - menu_edit_menu - - - GtkPixmapMenuItem - menu_cut - - activate - gnc_register_cut_cb - Sun, 16 Jun 2002 17:35:28 GMT - - GNOMEUIINFO_MENU_CUT_ITEM - - - - GtkPixmapMenuItem - menu_copy - - activate - gnc_register_copy_cb - Sun, 16 Jun 2002 17:35:28 GMT - - GNOMEUIINFO_MENU_COPY_ITEM - - - - GtkPixmapMenuItem - menu_paste - - activate - gnc_register_paste_cb - Sun, 16 Jun 2002 17:35:28 GMT - - GNOMEUIINFO_MENU_PASTE_ITEM - - - - GtkMenuItem - separator13 - False - + gnc_register_edit_menu_menu GtkMenuItem - menu_edit_account - Edit the main account for this register + gnc_register_edit_mi + + 0 + GDK_F6 + activate + activate gnc_register_edit_cb - Wed, 12 Jun 2002 05:42:08 GMT + Tue, 29 Oct 2002 04:51:17 GMT False - - GtkMenuItem - separator11 - False - - - - GtkMenuItem - menu_cut_trans - Cut the selected transaction - - activate - gnc_register_cut_trans_cb - Wed, 12 Jun 2002 05:28:33 GMT - - - False - - - - GtkMenuItem - menu_copy_trans - Copy the selected transaction - - activate - gnc_register_copy_trans_cb - Wed, 12 Jun 2002 05:28:33 GMT - - - False - - - - GtkMenuItem - menu_paste_trans - Paste the transaction from the clipboard - - activate - gnc_register_paste_trans_cb - Wed, 12 Jun 2002 05:28:33 GMT - - - False - - GtkPixmapMenuItem - menu_find + gnc_register_find_mi activate gnc_ui_find_transactions_cb - Wed, 12 Jun 2002 05:28:33 GMT + Tue, 29 Oct 2002 04:51:17 GMT - GNOMEUIINFO_MENU_FIND_ITEM + + False + GNOME_STOCK_MENU_SEARCH GtkMenuItem - menu_view - GNOMEUIINFO_MENU_VIEW_TREE + gnc_register_view_menu + + False GtkMenu - menu_view_menu + gnc_register_view_menu_menu GtkCheckMenuItem - menu_toolbar - Display the toolbar + gnc_register_toolbar_mi activate gnc_register_toolbar_cb - Wed, 12 Jun 2002 05:55:04 GMT + Mon, 04 Nov 2002 02:53:04 GMT True @@ -329,12 +252,11 @@ GtkCheckMenuItem - menu_summary_bar - Display the Summary Bar + gnc_register_summary_mi activate gnc_register_summarybar_cb - Wed, 12 Jun 2002 06:03:51 GMT + Mon, 04 Nov 2002 02:53:04 GMT True @@ -343,12 +265,11 @@ GtkCheckMenuItem - menu_status_bar - Display the Status Bar + gnc_register_statusbar_mi activate gnc_register_statusbar_cb - Wed, 12 Jun 2002 06:03:51 GMT + Mon, 04 Nov 2002 02:53:04 GMT True @@ -357,28 +278,27 @@ GtkMenuItem - separator4 + separator14 False GtkMenuItem - menu_date_range + gnc_register_date_range_mi False GtkMenu - menu_date_range_menu + gnc_register_date_range_mi_menu GtkMenuItem - menu_date_show_all - Show all of the transactions in the account + show_all1 activate gnc_register_date_show_all_cb - Wed, 12 Jun 2002 02:15:39 GMT + Tue, 29 Oct 2002 04:51:17 GMT False @@ -386,254 +306,37 @@ GtkMenuItem - menu_date_set_range - Set the date range of this register + set_range1 activate gnc_register_date_range_cb - Wed, 12 Jun 2002 02:15:39 GMT + Tue, 29 Oct 2002 04:51:17 GMT False - - - GtkMenuItem - menu_sort_order - - False - - - GtkMenu - menu_sort_order_menu - - - GtkRadioMenuItem - menu_sort_standard - Keep normal account order - - activate - gnc_register_sort_standard_cb - Wed, 12 Jun 2002 02:13:24 GMT - - - False - True - sort - - - - GtkMenuItem - separator5 - False - - - - GtkRadioMenuItem - menu_sort_date - Sort by Date - - activate - gnc_register_sort_date_cb - Wed, 12 Jun 2002 02:13:24 GMT - - - False - True - sort - - - - GtkRadioMenuItem - menu_sort_date_of_entry - Sort by the date of entry - - activate - gnc_register_sort_date_entered_cb - Wed, 12 Jun 2002 02:13:24 GMT - - - False - True - sort - - - - GtkRadioMenuItem - menu_sort_statement_date - Sort by the statement date (unreconciled items last) - - activate - gnc_register_sort_date_reconciled_cb - Wed, 12 Jun 2002 02:13:24 GMT - - - False - True - sort - - - - GtkRadioMenuItem - menu_sort_number - Sort by Number - - activate - gnc_register_sort_num_cb - Wed, 12 Jun 2002 02:13:24 GMT - - - False - True - sort - - - - GtkRadioMenuItem - menu_sort_amount - Sort by Amount - - activate - gnc_register_sort_amount_cb - Wed, 12 Jun 2002 02:13:24 GMT - - - False - True - sort - - - - GtkRadioMenuItem - menu_sort_memo - Sort by Memo - - activate - gnc_register_sort_memo_cb - Wed, 12 Jun 2002 02:13:24 GMT - - - False - True - sort - - - - GtkRadioMenuItem - menu_sort_description - Sort by Description - - activate - gnc_register_sort_desc_cb - Wed, 12 Jun 2002 02:13:24 GMT - - - True - True - sort - - - - - - GtkMenuItem - style - - False - - - GtkMenu - style_menu - - - GtkRadioMenuItem - menu_style_basic_ledger - Show transactions on one or two lines - - activate - gnc_register_style_ledger_cb - Wed, 12 Jun 2002 02:11:59 GMT - - - False - True - ledger - - - - GtkRadioMenuItem - menu_style_auto_split_ledger - Show transactions on one or two lines and expand the current transaction - - activate - gnc_register_style_auto_ledger_cb - Wed, 12 Jun 2002 02:11:59 GMT - - - False - True - ledger - - - - GtkRadioMenuItem - menu_style_transaction_journal - Show expanded transactions with all splits - - activate - gnc_register_style_journal_cb - Wed, 12 Jun 2002 02:11:59 GMT - - - True - True - ledger - - - - GtkMenuItem - separator6 - False - - - - GtkCheckMenuItem - menu_style_double_line - Show two lines of information for each transaction - - activate - gnc_register_double_line_cb - Wed, 12 Jun 2002 02:11:59 GMT - - - False - True - - - GtkMenuItem - menu_actions + gnc_register_actions_menu False GtkMenu - menu_actions_menu + gnc_register_actions_menu_menu GtkMenuItem - menu_transfer - Transfer funds from one account to another + gnc_register_xfer_mi activate gnc_register_xfer_cb - Wed, 12 Jun 2002 05:38:43 GMT + Tue, 29 Oct 2002 04:51:17 GMT False @@ -641,12 +344,11 @@ GtkMenuItem - menu_reconcile - Reconcile the main account for this register + gnc_register_recn_mi activate gnc_register_start_recn_cb - Wed, 12 Jun 2002 06:15:14 GMT + Tue, 29 Oct 2002 04:51:17 GMT False @@ -654,12 +356,11 @@ GtkMenuItem - menu_stock_split - Record a stock split or a stock merger + gnc_register_stock_split_mi activate gnc_register_stock_split_cb - Wed, 12 Jun 2002 06:15:14 GMT + Tue, 29 Oct 2002 04:51:17 GMT False @@ -667,157 +368,21 @@ GtkMenuItem - separator7 - False - - - - GtkMenuItem - menu_enter - Record the current transaction - - activate - gnc_register_record_cb - Wed, 12 Jun 2002 02:01:51 GMT - - - False - - - - GtkMenuItem - menu_cancel - Cancel the current transaction - - activate - gnc_register_cancel_trans_cb - Wed, 12 Jun 2002 06:10:40 GMT - - - False - - - - GtkMenuItem - menu_delete - Delete the current transaction - - activate - gnc_register_delete_trans_cb - Tue, 18 Jun 2002 07:59:59 GMT - - - False - - - - GtkMenuItem - menu_blank - Move to the blank transaction at the bottom of the register - - activate - gnc_register_new_trans_cb - Wed, 12 Jun 2002 06:13:45 GMT - - - False - - - - GtkMenuItem - separator8 - False - - - - GtkMenuItem - menu_duplicate - Make a copy of the current transaction - - activate - gnc_register_duplicate_trans_cb - Sun, 16 Jun 2002 00:14:37 GMT - - - False - - - - GtkMenuItem - menu_reinitialize - Erase all splits except the one for this account. - - activate - gnc_register_reinitialize_trans_cb - Wed, 16 Oct 2002 06:27:58 GMT - - - False - - - - GtkCheckMenuItem - menu_splits - Show all splits in the current transaction - - activate - gnc_register_expand_trans_menu_cb - Sun, 16 Jun 2002 23:02:33 GMT - - - False - True - - - - GtkMenuItem - menu_schedule - - activate - gnc_register_recur_cb - Wed, 12 Jun 2002 06:39:42 GMT - - - False - - - - GtkMenuItem - menu_jump - Jump to the corresponding transaction in the other account - - activate - gnc_register_jump_cb - Wed, 12 Jun 2002 06:13:45 GMT - - - False - - - - GtkMenuItem - separator14 - False - - - - GtkMenuItem - check_&_repair1 + gnc_register_scrub_mi False GtkMenu - check_&_repair1_menu + gnc_register_scrub_mi_menu GtkMenuItem - menu_repair_all - Check for and repair unbalanced transactions and orphan splits in all transactions of this account + all_transactions1 activate gnc_register_scrub_all_cb - Sun, 16 Jun 2002 17:19:33 GMT + Tue, 29 Oct 2002 04:51:17 GMT False @@ -825,12 +390,11 @@ GtkMenuItem - menu_repair_one - Check for and repair unbalanced transactions and orphan splits in this transaction + this_transaction1 activate gnc_register_scrub_current_cb - Sun, 16 Jun 2002 17:19:33 GMT + Tue, 29 Oct 2002 04:51:17 GMT False @@ -842,17 +406,17 @@ GtkMenuItem - menu_reports + menuitem41 False GtkMenu - menu_reports_menu + menuitem41_menu GtkMenuItem - menu_report_account + menuitem42 Open a register report window for this transaction activate @@ -865,7 +429,7 @@ GtkMenuItem - menu_report_trans + menuitem43 Open a register report window for this transaction activate @@ -880,17 +444,17 @@ GtkMenuItem - menu_tools + menuitem44 False GtkMenu - menu_tools_menu + menuitem44_menu GtkMenuItem - menu_general_ledger + menuitem45 Open a general ledger window activate @@ -903,7 +467,7 @@ GtkMenuItem - menu_price_editor + menuitem46 View and edit the prices for stocks and mutual funds activate @@ -916,7 +480,7 @@ GtkMenuItem - menu_commodity_editor + menuitem47 View and edit the commodities for stocks and mutual funds activate @@ -929,7 +493,7 @@ GtkMenuItem - menu_fincalc + menuitem48 Use the financial calculator activate @@ -944,16 +508,16 @@ GtkMenuItem - menu_help + menuitem49 GNOMEUIINFO_MENU_HELP_TREE GtkMenu - menu_help_menu + menuitem49_menu GtkMenuItem - menu_manual + menuitem50 activate gnc_main_window_help_cb @@ -965,7 +529,7 @@ GtkMenuItem - menu_totd + menuitem51 activate gnc_main_window_totd_cb @@ -977,13 +541,13 @@ GtkMenuItem - separator9 + menuitem52 False GtkPixmapMenuItem - menu_about + pixmapmenuitem10 activate gnc_main_window_about_cb @@ -1012,212 +576,7 @@ GTK_SHADOW_OUT - GtkToolbar - toolbar - 2 - GTK_ORIENTATION_HORIZONTAL - GTK_TOOLBAR_BOTH - 10 - GTK_TOOLBAR_SPACE_LINE - GTK_RELIEF_NONE - True - - - GtkButton - Toolbar:button - toolbar_close - Close this register window - - clicked - gnc_register_close_cb - Sun, 16 Jun 2002 00:11:38 GMT - - - GNOME_STOCK_PIXMAP_CLOSE - - - - GtkButton - Toolbar:button - toolbar_enter - Record the current transaction - - clicked - gnc_register_record_cb - Wed, 12 Jun 2002 02:02:11 GMT - - - GNOME_STOCK_PIXMAP_ADD - - True - - - - - GtkButton - Toolbar:button - toolbar_cancel - Cancel the current transaction - - clicked - gnc_register_cancel_trans_cb - Sun, 16 Jun 2002 00:12:49 GMT - - - GNOME_STOCK_PIXMAP_UNDELETE - - - - GtkButton - Toolbar:button - toolbar_delete - Delete the current transaction - - clicked - gnc_register_delete_trans_cb - Tue, 18 Jun 2002 07:59:46 GMT - - - GNOME_STOCK_PIXMAP_TRASH - - - - GtkButton - Toolbar:button - toolbar_duplicate - Make a copy of the current transaction - - clicked - gnc_register_duplicate_trans_cb - Sun, 16 Jun 2002 00:09:03 GMT - - - GNOME_STOCK_PIXMAP_COPY - - True - - - - - GtkButton - Toolbar:button - toolbar_schedule - Create a Scheduled Transaction with the current transaction as a template - - clicked - gnc_register_recur_cb - Sun, 16 Jun 2002 00:08:53 GMT - - - GNOME_STOCK_PIXMAP_LINE_IN - - - - GtkToggleButton - Toolbar:button - toolbar_split - - clicked - gnc_register_expand_trans_toolbar_cb - Sun, 16 Jun 2002 23:02:08 GMT - - - GNOME_STOCK_PIXMAP_BOOK_OPEN - False - - True - - - - - GtkButton - Toolbar:button - toolbar_blank - Move to the blank transaction at the bottom of the register - - clicked - gnc_register_new_trans_cb - Sun, 16 Jun 2002 00:09:31 GMT - - - GNOME_STOCK_PIXMAP_NEW - - - - GtkButton - Toolbar:button - toolbar_jump - Jump to the corresponding transaction in the other account - - clicked - gnc_register_jump_cb - Sun, 16 Jun 2002 00:09:46 GMT - - - GNOME_STOCK_PIXMAP_JUMP_TO - - - - GtkButton - Toolbar:button - toolbar_xfer - Transfer funds from one account to another - - clicked - gnc_register_xfer_cb - Sun, 16 Jun 2002 00:10:03 GMT - - - GNOME_STOCK_PIXMAP_CONVERT - - True - - - - - GtkButton - Toolbar:button - toolbar_find - Find transactions with a search - - clicked - gnc_ui_find_transactions_cb - Sun, 16 Jun 2002 00:10:19 GMT - - - GNOME_STOCK_PIXMAP_SEARCH - - True - - - - - GtkButton - Toolbar:button - toolbar_report - Open a report window for this register - - clicked - gnc_register_report_account_cb - Sun, 16 Jun 2002 00:10:38 GMT - - - GNOME_STOCK_PIXMAP_BOOK_GREEN - - - - GtkButton - Toolbar:button - toolbar_print - Print a report for this register - - clicked - gnc_register_print_cb - Sun, 16 Jun 2002 00:10:58 GMT - - - GNOME_STOCK_PIXMAP_PRINT - + Placeholder @@ -2039,4 +1398,841 @@ + + GtkWindow + register_toolbar_win + [rtw] THIS WINDOW SHOULD NOT BE CREATED + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + False + True + False + + + GtkToolbar + toolbar + 2 + GTK_ORIENTATION_HORIZONTAL + GTK_TOOLBAR_BOTH + 10 + GTK_TOOLBAR_SPACE_LINE + GTK_RELIEF_NONE + True + + + GtkButton + Toolbar:button + toolbar_enter + Record the current transaction + + clicked + gnc_split_reg_record_cb + Wed, 12 Jun 2002 02:02:11 GMT + + + GNOME_STOCK_PIXMAP_ADD + + + + GtkButton + Toolbar:button + toolbar_cancel + Cancel the current transaction + + clicked + gnc_split_reg_cancel_trans_cb + Sun, 16 Jun 2002 00:12:49 GMT + + + GNOME_STOCK_PIXMAP_UNDELETE + + + + GtkButton + Toolbar:button + toolbar_delete + Delete the current transaction + + clicked + gnc_split_reg_delete_trans_cb + Tue, 18 Jun 2002 07:59:46 GMT + + + GNOME_STOCK_PIXMAP_TRASH + + + + GtkButton + Toolbar:button + toolbar_duplicate + Make a copy of the current transaction + + clicked + gnc_split_reg_duplicate_trans_cb + Sun, 16 Jun 2002 00:09:03 GMT + + + GNOME_STOCK_PIXMAP_COPY + + True + + + + + GtkButton + Toolbar:button + toolbar_schedule + Create a Scheduled Transaction with the current transaction as a template + + clicked + gnc_split_reg_recur_cb + Sun, 16 Jun 2002 00:08:53 GMT + + + GNOME_STOCK_PIXMAP_LINE_IN + + + + GtkToggleButton + Toolbar:button + toolbar_split + + clicked + gnc_split_reg_expand_trans_toolbar_cb + Sun, 16 Jun 2002 23:02:08 GMT + + + GNOME_STOCK_PIXMAP_BOOK_OPEN + False + + True + + + + + GtkButton + Toolbar:button + toolbar_blank + Move to the blank transaction at the bottom of the register + + clicked + gnc_split_reg_new_trans_cb + Sun, 16 Jun 2002 00:09:31 GMT + + + GNOME_STOCK_PIXMAP_NEW + + + + GtkButton + Toolbar:button + toolbar_jump + Jump to the corresponding transaction in the other account + + clicked + gnc_split_reg_jump_cb + Sun, 16 Jun 2002 00:09:46 GMT + + + GNOME_STOCK_PIXMAP_JUMP_TO + + + + + + GtkWindow + register_menubar_win + [rmw] THIS WINDOW SHOULD NOT BE CREATED + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + False + True + False + + + GtkMenuBar + register_menubar + GTK_SHADOW_NONE + + + GtkMenuItem + menu_edit + GNOMEUIINFO_MENU_EDIT_TREE + + + GtkMenu + menu_edit_menu + + + GtkPixmapMenuItem + menu_cut + + activate + gnc_split_reg_cut_cb + Mon, 28 Oct 2002 01:31:01 GMT + + GNOMEUIINFO_MENU_CUT_ITEM + + + + GtkPixmapMenuItem + menu_copy + + activate + gnc_split_reg_copy_cb + Mon, 28 Oct 2002 01:31:01 GMT + + GNOMEUIINFO_MENU_COPY_ITEM + + + + GtkPixmapMenuItem + menu_paste + + activate + gnc_split_reg_paste_cb + Sun, 16 Jun 2002 17:35:28 GMT + + GNOMEUIINFO_MENU_PASTE_ITEM + + + + GtkMenuItem + separator13 + False + + + + GtkMenuItem + menu_cut_trans + Cut the selected transaction + + activate + gnc_split_reg_cut_trans_cb + Wed, 12 Jun 2002 05:28:33 GMT + + + False + + + + GtkMenuItem + menu_copy_trans + Copy the selected transaction + + activate + gnc_split_reg_copy_trans_cb + Wed, 12 Jun 2002 05:28:33 GMT + + + False + + + + GtkMenuItem + menu_paste_trans + Paste the transaction from the clipboard + + activate + gnc_split_reg_paste_trans_cb + Wed, 12 Jun 2002 05:28:33 GMT + + + False + + + + + + GtkMenuItem + menu_view + GNOMEUIINFO_MENU_VIEW_TREE + + + GtkMenu + menu_view_menu + + + GtkMenuItem + menu_sort_order + + False + + + GtkMenu + menu_sort_order_menu + + + GtkRadioMenuItem + menu_sort_standard + Keep normal account order + + activate + gnc_split_reg_sort_standard_cb + Wed, 12 Jun 2002 02:13:24 GMT + + + False + True + sort + + + + GtkMenuItem + separator5 + False + + + + GtkRadioMenuItem + menu_sort_date + Sort by Date + + activate + gnc_split_reg_sort_date_cb + Wed, 12 Jun 2002 02:13:24 GMT + + + False + True + sort + + + + GtkRadioMenuItem + menu_sort_date_of_entry + Sort by the date of entry + + activate + gnc_split_reg_sort_date_entered_cb + Wed, 12 Jun 2002 02:13:24 GMT + + + False + True + sort + + + + GtkRadioMenuItem + menu_sort_statement_date + Sort by the statement date (unreconciled items last) + + activate + gnc_split_reg_sort_date_reconciled_cb + Wed, 12 Jun 2002 02:13:24 GMT + + + False + True + sort + + + + GtkRadioMenuItem + menu_sort_number + Sort by Number + + activate + gnc_split_reg_sort_num_cb + Wed, 12 Jun 2002 02:13:24 GMT + + + False + True + sort + + + + GtkRadioMenuItem + menu_sort_amount + Sort by Amount + + activate + gnc_split_reg_sort_amount_cb + Wed, 12 Jun 2002 02:13:24 GMT + + + False + True + sort + + + + GtkRadioMenuItem + menu_sort_memo + Sort by Memo + + activate + gnc_split_reg_sort_memo_cb + Wed, 12 Jun 2002 02:13:24 GMT + + + False + True + sort + + + + GtkRadioMenuItem + menu_sort_description + Sort by Description + + activate + gnc_split_reg_sort_desc_cb + Wed, 12 Jun 2002 02:13:24 GMT + + + True + True + sort + + + + + + GtkMenuItem + menu_style + + False + + + GtkMenu + menu_style_menu + + + GtkRadioMenuItem + menu_style_basic_ledger + Show transactions on one or two lines + + activate + gnc_split_reg_style_ledger_cb + Wed, 12 Jun 2002 02:11:59 GMT + + + False + True + ledger + + + + GtkRadioMenuItem + menu_style_auto_split_ledger + Show transactions on one or two lines and expand the current transaction + + activate + gnc_split_reg_style_auto_ledger_cb + Wed, 12 Jun 2002 02:11:59 GMT + + + False + True + ledger + + + + GtkRadioMenuItem + menu_style_transaction_journal + Show expanded transactions with all splits + + activate + gnc_split_reg_style_journal_cb + Wed, 12 Jun 2002 02:11:59 GMT + + + True + True + ledger + + + + GtkMenuItem + separator6 + False + + + + GtkCheckMenuItem + menu_style_double_line + Show two lines of information for each transaction + + activate + gnc_split_reg_double_line_cb + Wed, 12 Jun 2002 02:11:59 GMT + + + False + True + + + + + + + + GtkMenuItem + menu_actions + + False + + + GtkMenu + menu_actions_menu + + + GtkMenuItem + menu_enter + Record the current transaction + + activate + gnc_split_reg_record_cb + Wed, 12 Jun 2002 02:01:51 GMT + + + False + + + + GtkMenuItem + menu_cancel + Cancel the current transaction + + activate + gnc_split_reg_cancel_trans_cb + Wed, 12 Jun 2002 06:10:40 GMT + + + False + + + + GtkMenuItem + menu_delete + Delete the current transaction + + activate + gnc_split_reg_delete_trans_cb + Tue, 18 Jun 2002 07:59:59 GMT + + + False + + + + GtkMenuItem + menu_blank + Move to the blank transaction at the bottom of the register + + activate + gnc_split_reg_new_trans_cb + Wed, 12 Jun 2002 06:13:45 GMT + + + False + + + + GtkMenuItem + separator8 + False + + + + GtkMenuItem + menu_duplicate + Make a copy of the current transaction + + activate + gnc_split_reg_duplicate_trans_cb + Sun, 16 Jun 2002 00:14:37 GMT + + + False + + + + GtkMenuItem + menu_reinitialize + Erase all splits except the one for this account. + + activate + gnc_split_reg_reinitialize_trans_cb + Wed, 16 Oct 2002 06:27:58 GMT + + + False + + + + GtkCheckMenuItem + menu_splits + Show all splits in the current transaction + + activate + gnc_split_reg_expand_trans_menu_cb + Sun, 16 Jun 2002 23:02:33 GMT + + + False + True + + + + GtkMenuItem + menu_schedule + + activate + gnc_split_reg_recur_cb + Wed, 12 Jun 2002 06:39:42 GMT + + + False + + + + GtkMenuItem + menu_jump + Jump to the corresponding transaction in the other account + + activate + gnc_split_reg_jump_cb + Wed, 12 Jun 2002 06:13:45 GMT + + + False + + + + + + + + GtkWindow + win_register_toolbar_win + [wrtw] THIS WINDOW SHOULD NOT BE CREATED + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + False + True + False + + + GtkToolbar + gnc_register_toolbar + 2 + GTK_ORIENTATION_HORIZONTAL + GTK_TOOLBAR_BOTH + 10 + GTK_TOOLBAR_SPACE_LINE + GTK_RELIEF_NONE + True + + + GtkButton + Toolbar:button + gnc_register_close_b + NOTUSED: Defined in src/gnome/window-register.c + + clicked + gnc_register_close_cb + Sun, 16 Jun 2002 00:11:38 GMT + + + GNOME_STOCK_PIXMAP_CLOSE + + + + GtkButton + Toolbar:button + gnc_register_xfer_b + NOTUSED: Defined in src/gnome/window-register.c + + clicked + gnc_register_xfer_cb + Sun, 16 Jun 2002 00:10:03 GMT + + + GNOME_STOCK_PIXMAP_CONVERT + + True + + + + + GtkButton + Toolbar:button + gnc_register_find_b + NOTUSED: Defined in src/gnome/window-register.c + + clicked + gnc_ui_find_transactions_cb + Sun, 16 Jun 2002 00:10:19 GMT + + + GNOME_STOCK_PIXMAP_SEARCH + + True + + + + + GtkButton + Toolbar:button + gnc_register_report_b + NOTUSED: Defined in src/gnome/window-register.c + + clicked + gnc_register_report_account_cb + Sun, 16 Jun 2002 00:10:38 GMT + + + GNOME_STOCK_PIXMAP_BOOK_GREEN + + + + GtkButton + Toolbar:button + gnc_register_print_b + NOTUSED: Defined in src/gnome/window-register.c + + clicked + gnc_register_print_cb + Sun, 16 Jun 2002 00:10:58 GMT + + + GNOME_STOCK_PIXMAP_PRINT + + + + + + GtkMenu + register_popup + + + GtkMenuItem + menuitem57 + Record the current transaction + + activate + gnc_split_reg_record_trans_cb + Sat, 15 Jun 2002 07:55:17 GMT + + + False + + + + GtkMenuItem + menuitem58 + Cancel the current transaction + + activate + gnc_split_reg_cancel_trans_cb + Wed, 12 Jun 2002 06:10:40 GMT + + + False + + + + GtkMenuItem + sr_popup_delete + Delete the current transaction + + activate + gnc_split_reg_delete_trans_cb + Sat, 15 Jun 2002 20:29:44 GMT + + + False + + + + GtkMenuItem + menuitem60 + Move to the blank transaction at the bottom of the register + + activate + gnc_split_reg_new_trans_cb + Wed, 12 Jun 2002 06:13:45 GMT + + + False + + + + GtkMenuItem + menuitem61 + False + + + + GtkMenuItem + sr_popup_duplicate + Make a copy of the current transaction + + activate + gnc_split_reg_duplicate_trans_cb + Sat, 15 Jun 2002 07:55:17 GMT + + + False + + + + GtkMenuItem + sr_popup_reinitialize + + activate + gnc_split_reg_reinitialize_trans_cb + Wed, 16 Oct 2002 06:27:31 GMT + + + False + + + + GtkCheckMenuItem + popup_splits + Show all splits in the current transaction + + activate + gnc_split_reg_expand_trans_menu_cb + Wed, 12 Jun 2002 06:13:45 GMT + + + False + True + + + + GtkMenuItem + sr_popup_schedule + + activate + gnc_split_reg_recur_cb + Wed, 12 Jun 2002 06:39:42 GMT + + + False + + + + GtkMenuItem + sr_popup_jump + Jump to the corresponding transaction in the other account + + activate + gnc_split_reg_jump_cb + Wed, 12 Jun 2002 06:13:45 GMT + + + False + + + diff --git a/src/gnome/gnc-split-reg.c b/src/gnome/gnc-split-reg.c new file mode 100644 index 0000000000..f51862085a --- /dev/null +++ b/src/gnome/gnc-split-reg.c @@ -0,0 +1,2240 @@ +/********************************************************************\ + * gnc-split-reg.c -- A widget for the common register look-n-feel. * + * Copyright (C) 1997 Robin D. Clark * + * Copyright (C) 1997-1998 Linas Vepstas * + * Copyright (C) 1998 Rob Browning * + * Copyright (C) 1999-2000 Dave Peticolas * + * Copyright (C) 2001 Gnumatic, Inc. * + * Copyright (C) 2002 Joshua Sled * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License as * + * published by the Free Software Foundation; either version 2 of * + * the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License* + * along with this program; if not, contact: * + * * + * Free Software Foundation Voice: +1-617-542-5942 * + * 59 Temple Place - Suite 330 Fax: +1-617-542-2652 * + * Boston, MA 02111-1307, USA gnu@gnu.org * +\********************************************************************/ + +#define _GNU_SOURCE + +#include "config.h" + +#include +#include + +#include "gnc-split-reg.h" + +#include "window-register.h" +#include "Account.h" +#include "AccWindow.h" +#include "Scrub.h" +#include "global-options.h" +#include "gnc-component-manager.h" +#include "gnc-date-edit.h" +#include "gnc-engine-util.h" +#include "gnc-euro.h" +#include "gnc-gui-query.h" +#include "gnc-ledger-display.h" +#include "gnc-pricedb.h" +#include "gnc-ui-util.h" +#include "gnc-ui.h" +#include "gnucash-sheet.h" +#include "messages.h" +#include "table-allgui.h" + +#include +#include "gnc-regwidget.h" +#include "gnc-engine-util.h" +#include "dialog-utils.h" + +static short module = MOD_SX; + +/** + * TODO/FIXME list: + * . alpha-necessary + * X fill out gnc-split-reg.h interface + * . calendar/date-picker + * . FIXMES + * . beta-necessary + * . date-inclusion on jumping + * . title-renaming in read-only case. + * . size-allocation + * . default schedule/recur handling for from-SX items. + * . pass in, use number-of-lines + * X handle destruction/cleanup more cleanly + * X conditional creation + * X handle widget-visibility callbacks + * X fix regWindow{Simple,Ledger,Account} + * X fix jumping-to-split + * X fix window-raising + **/ + + +/** PROTOTYPES ******************************************************/ +void gnc_split_reg_raise( GNCSplitReg *gsr ); + +static GtkWidget* add_summary_label( GtkWidget *summarybar, + const char *label_str ); + +static void gnc_toolbar_change_cb( void *data ); +static void gnc_split_reg_determine_read_only( GNCSplitReg *gsr ); + +static GNCPlaceholderType gnc_split_reg_get_placeholder( GNCSplitReg *gsr ); +static gnc_numeric gnc_account_present_balance( Account *account ); +static gncUIWidget gnc_split_reg_get_parent( GNCLedgerDisplay *ledger ); + +static void gsr_create_menus( GNCSplitReg *gsr ); +static void gsr_setup_menu_widgets( GNCSplitReg *gsr, GladeXML *xml ); +static void gsr_create_toolbar( GNCSplitReg *gsr ); +static void gsr_create_summary_bar( GNCSplitReg *gsr ); +static void gsr_create_table( GNCSplitReg *gsr ); +static void gsr_setup_table( GNCSplitReg *gsr ); +static void gsr_setup_status_widgets( GNCSplitReg *gsr ); +static GtkWidget* gsr_create_popup_menu( GNCSplitReg *gsr ); + + +/** + * Defines a function pointer def to get a gnc_numeric from an account. + **/ +typedef gnc_numeric (*AmountGetterFn)(Account*); + +static void gsr_update_summary_label( GtkWidget *label, + AmountGetterFn getter, + Account *leader, + GNCPrintAmountInfo print_info, + gnc_commodity *cmdty, + gboolean reverse, + gboolean euroFlag ); + +static void gsr_redraw_all_cb (GnucashRegister *g_reg, gpointer data); + +static void gnc_split_reg_refresh_toolbar( GNCSplitReg *gsr ); + +static void gnc_split_reg_ld_destroy( GNCLedgerDisplay *ledger ); +static void gnc_split_reg_contained_ld_destroy( GNCLedgerDisplay *ledger ); + +gboolean gnc_split_reg_check_close(GNCSplitReg *gsr); + +void gsr_default_enter_handler ( GNCSplitReg *w, gpointer ud ); +void gsr_default_cancel_handler ( GNCSplitReg *w, gpointer ud ); +void gsr_default_delete_handler ( GNCSplitReg *w, gpointer ud ); +void gsr_default_reinit_handler ( GNCSplitReg *w, gpointer ud ); +void gsr_default_dup_handler ( GNCSplitReg *w, gpointer ud ); +void gsr_default_schedule_handler ( GNCSplitReg *w, gpointer ud ); +void gsr_default_expand_handler ( GNCSplitReg *w, gpointer ud ); +void gsr_default_blank_handler ( GNCSplitReg *w, gpointer ud ); +void gsr_default_jump_handler ( GNCSplitReg *w, gpointer ud ); +void gsr_default_cut_handler ( GNCSplitReg *w, gpointer ud ); +void gsr_default_cut_txn_handler ( GNCSplitReg *w, gpointer ud ); +void gsr_default_copy_handler ( GNCSplitReg *w, gpointer ud ); +void gsr_default_copy_txn_handler ( GNCSplitReg *w, gpointer ud ); +void gsr_default_paste_handler ( GNCSplitReg *w, gpointer ud ); +void gsr_default_paste_txn_handler( GNCSplitReg *w, gpointer ud ); + +static void gsr_emit_signal( GNCSplitReg *gsr, const char *sigName ); +static void gsr_emit_help_changed( GnucashRegister *reg, gpointer user_data ); + + +void gnc_split_reg_cut_cb(GtkWidget *w, gpointer data); +void gnc_split_reg_copy_cb(GtkWidget *w, gpointer data); +void gnc_split_reg_paste_cb(GtkWidget *w, gpointer data); + +void gnc_split_reg_cut_trans_cb(GtkWidget *w, gpointer data); +void gnc_split_reg_copy_trans_cb(GtkWidget *w, gpointer data); +void gnc_split_reg_paste_trans_cb(GtkWidget *w, gpointer data); + +void gnc_split_reg_record_cb (GnucashRegister *reg, gpointer data); +void gnc_split_reg_reinitialize_trans_cb(GtkWidget *w, gpointer data); +void gnc_split_reg_delete_trans_cb(GtkWidget *w, gpointer data); +void gnc_split_reg_duplicate_trans_cb(GtkWidget *w, gpointer data); +void gnc_split_reg_recur_cb(GtkWidget *w, gpointer data); +void gnc_split_reg_record_trans_cb(GtkWidget *w, gpointer data); +void gnc_split_reg_cancel_trans_cb(GtkWidget *w, gpointer data); + +void gnc_split_reg_expand_trans_menu_cb(GtkWidget *widget, gpointer data); +void gnc_split_reg_expand_trans_toolbar_cb(GtkWidget *widget, gpointer data); +void gnc_split_reg_new_trans_cb(GtkWidget *widget, gpointer data); +void gnc_split_reg_jump_cb(GtkWidget *widget, gpointer data); + +void gnc_split_reg_style_ledger_cb (GtkWidget *w, gpointer data); +void gnc_split_reg_style_auto_ledger_cb (GtkWidget *w, gpointer data); +void gnc_split_reg_style_journal_cb (GtkWidget *w, gpointer data); +void gnc_split_reg_double_line_cb (GtkWidget *w, gpointer data); + +void gnc_split_reg_sort_standard_cb (GtkWidget *w, gpointer data); +void gnc_split_reg_sort_date_cb (GtkWidget *w, gpointer data); +void gnc_split_reg_sort_date_entered_cb (GtkWidget *w, gpointer data); +void gnc_split_reg_sort_date_reconciled_cb (GtkWidget *w, gpointer data); +void gnc_split_reg_sort_num_cb (GtkWidget *w, gpointer data); +void gnc_split_reg_sort_amount_cb (GtkWidget *w, gpointer data); +void gnc_split_reg_sort_memo_cb (GtkWidget *w, gpointer data); +void gnc_split_reg_sort_desc_cb (GtkWidget *w, gpointer data); + +gboolean gnc_split_reg_delete_cb( GtkWidget *widget, + GdkEvent *event, + gpointer data ); +void gnc_split_reg_destroy_cb(GtkWidget *widget, gpointer data); +void gnc_split_reg_size_allocate( GtkWidget *widget, + GtkAllocation *allocation, + gpointer user_data ); + +static void gnc_split_reg_class_init( GNCSplitRegClass *class ); +static void gnc_split_reg_init( GNCSplitReg *gsr ); +static void gnc_split_reg_init2( GNCSplitReg *gsr ); + +void gnc_split_reg_jump_to_split(GNCSplitReg *gsr, Split *split); +void gnc_split_reg_jump_to_split_amount(GNCSplitReg *gsr, Split *split); +void gnc_split_reg_jump_to_blank (GNCSplitReg *gsr); + +void gnc_split_register_size_allocate (GtkWidget *widget, + GtkAllocation *allocation, + gpointer user_data); + + +guint +gnc_split_reg_get_type( void ) +{ + static guint gnc_split_reg_type = 0; + + if (!gnc_split_reg_type) + { + GtkTypeInfo gnc_split_reg_info = + { + "GNCSplitReg", + sizeof (GNCSplitReg), + sizeof (GNCSplitRegClass), + (GtkClassInitFunc) gnc_split_reg_class_init, + (GtkObjectInitFunc) gnc_split_reg_init, + NULL, /* reserved_1 */ + NULL, /* reserved_2 */ + (GtkClassInitFunc) NULL + }; + + gnc_split_reg_type = gtk_type_unique( GTK_TYPE_VBOX, &gnc_split_reg_info ); + } + + return gnc_split_reg_type; +} + +/* SIGNALS */ +enum gnc_split_reg_signal_enum { + ENTER_ENT_SIGNAL, + CANCEL_ENT_SIGNAL, + DELETE_ENT_SIGNAL, + REINIT_ENT_SIGNAL, + DUP_ENT_SIGNAL, + SCHEDULE_ENT_SIGNAL, + EXPAND_ENT_SIGNAL, + BLANK_SIGNAL, + JUMP_SIGNAL, + CUT_SIGNAL, + CUT_TXN_SIGNAL, + COPY_SIGNAL, + COPY_TXN_SIGNAL, + PASTE_SIGNAL, + PASTE_TXN_SIGNAL, + HELP_CHANGED_SIGNAL, + LAST_SIGNAL +}; + +static gint gnc_split_reg_signals[LAST_SIGNAL] = { 0 }; + +static void +gnc_split_reg_class_init( GNCSplitRegClass *class ) +{ + int i; + GtkObjectClass *object_class; + static struct similar_signal_info { + enum gnc_split_reg_signal_enum s; + const char *signal_name; + guint defaultOffset; + } signals[] = { + { ENTER_ENT_SIGNAL, "enter_ent", GTK_SIGNAL_OFFSET( GNCSplitRegClass, enter_ent_cb ) }, + { CANCEL_ENT_SIGNAL, "cancel_ent", GTK_SIGNAL_OFFSET( GNCSplitRegClass, cancel_ent_cb ) }, + { DELETE_ENT_SIGNAL, "delete_ent", GTK_SIGNAL_OFFSET( GNCSplitRegClass, delete_ent_cb ) }, + { REINIT_ENT_SIGNAL, "reinit_ent", GTK_SIGNAL_OFFSET( GNCSplitRegClass, reinit_ent_cb ) }, + { DUP_ENT_SIGNAL, "dup_ent", GTK_SIGNAL_OFFSET( GNCSplitRegClass, dup_ent_cb ) }, + { SCHEDULE_ENT_SIGNAL, "schedule_ent", GTK_SIGNAL_OFFSET( GNCSplitRegClass, schedule_ent_cb ) }, + { EXPAND_ENT_SIGNAL, "expand_ent", GTK_SIGNAL_OFFSET( GNCSplitRegClass, expand_ent_cb ) }, + { BLANK_SIGNAL, "blank", GTK_SIGNAL_OFFSET( GNCSplitRegClass, blank_cb ) }, + { JUMP_SIGNAL, "jump", GTK_SIGNAL_OFFSET( GNCSplitRegClass, jump_cb ) }, + { CUT_SIGNAL, "cut", GTK_SIGNAL_OFFSET( GNCSplitRegClass, cut_cb ) }, + { CUT_TXN_SIGNAL, "cut_txn", GTK_SIGNAL_OFFSET( GNCSplitRegClass, cut_txn_cb ) }, + { COPY_SIGNAL, "copy", GTK_SIGNAL_OFFSET( GNCSplitRegClass, copy_cb ) }, + { COPY_TXN_SIGNAL, "copy_txn", GTK_SIGNAL_OFFSET( GNCSplitRegClass, copy_txn_cb ) }, + { PASTE_SIGNAL, "paste", GTK_SIGNAL_OFFSET( GNCSplitRegClass, paste_cb ) }, + { PASTE_TXN_SIGNAL, "paste_txn", GTK_SIGNAL_OFFSET( GNCSplitRegClass, paste_txn_cb ) }, + { HELP_CHANGED_SIGNAL, "help-changed", GTK_SIGNAL_OFFSET( GNCSplitRegClass, help_changed_cb ) }, + { LAST_SIGNAL, NULL, 0 } + }; + + object_class = (GtkObjectClass*) class; + + for ( i=0; signals[i].signal_name != NULL; i++ ) { + gnc_split_reg_signals[ signals[i].s ] = + gtk_signal_new( signals[i].signal_name, + GTK_RUN_FIRST, + object_class->type, signals[i].defaultOffset, + gtk_signal_default_marshaller, GTK_TYPE_NONE, 0 ); + } + + gtk_object_class_add_signals (object_class, gnc_split_reg_signals, LAST_SIGNAL); + + /* Setup the default handlers. */ + class->enter_ent_cb = gsr_default_enter_handler; + class->cancel_ent_cb = gsr_default_cancel_handler; + class->delete_ent_cb = gsr_default_delete_handler; + class->reinit_ent_cb = gsr_default_reinit_handler; + class->dup_ent_cb = gsr_default_dup_handler; + class->schedule_ent_cb = gsr_default_schedule_handler; + class->expand_ent_cb = gsr_default_expand_handler; + class->blank_cb = gsr_default_blank_handler; + class->jump_cb = gsr_default_jump_handler; + class->cut_cb = gsr_default_cut_handler; + class->cut_txn_cb = gsr_default_cut_txn_handler; + class->copy_cb = gsr_default_copy_handler; + class->copy_txn_cb = gsr_default_copy_txn_handler; + class->paste_cb = gsr_default_paste_handler; + class->paste_txn_cb = gsr_default_paste_txn_handler; + + class->help_changed_cb = NULL; +} + +GtkWidget* +gnc_split_reg_new( GNCLedgerDisplay *ld, + GtkWindow *parent, + gint numberOfLines, + gint createFlags, + gint disallowCaps ) +{ + GNCSplitReg *gsrToRet; + + gsrToRet = GNC_SPLIT_REG( gtk_type_new( gnc_split_reg_get_type() ) ); + + gsrToRet->disallowedCaps = disallowCaps; + gsrToRet->numRows = numberOfLines; + gsrToRet->createFlags = createFlags; + + gsrToRet->ledger = ld; + gsrToRet->window = GTK_WIDGET(parent); + + gnc_split_reg_init2( gsrToRet ); + + return GTK_WIDGET( gsrToRet ); +} + +static void +gnc_split_reg_init( GNCSplitReg *gsr ) +{ + gsr->sort_type = BY_STANDARD; + gsr->width = -1; + gsr->height = -1; + gsr->disallowedCaps = 0; + gsr->numRows = (guint) gnc_lookup_number_option ( "Register", + "Number of Rows", 20.0 ); + gsr->read_only = FALSE; + + /* IMPORTANT: If we set this to anything other than GTK_RESIZE_QUEUE, we + * enter into a very bad back-and-forth between the sheet and a containing + * GnomeDruid [in certain conditions and circumstances not detailed here], + * resulting in either a single iteration of the Druid resizing or infinite + * iterations of the Druid resizing without bound. Contact + * jsled@asynchronous.org for details. -- 2002.04.15 + */ + gtk_container_set_resize_mode( GTK_CONTAINER(gsr), GTK_RESIZE_QUEUE ); + + gtk_signal_connect( GTK_OBJECT(gsr), "destroy", + GTK_SIGNAL_FUNC (gnc_split_reg_destroy_cb), gsr ); +} + +static void +gnc_split_reg_init2( GNCSplitReg *gsr ) +{ + if ( !gsr ) return; + + gnc_split_reg_determine_read_only( gsr ); + + if ( gsr->createFlags & CREATE_MENUS ) { + gsr_create_menus( gsr ); + } + + if ( gsr->createFlags & CREATE_TOOLBAR ) { + gsr_create_toolbar( gsr ); + } + + if ( gsr->createFlags & CREATE_SUMMARYBAR ) { + gsr_create_summary_bar( gsr ); + } + + gsr_setup_status_widgets( gsr ); + + gsr_create_table( gsr ); + gsr_setup_table( gsr ); +} + +static +void +gsr_setup_table( GNCSplitReg *gsr ) +{ + SplitRegister *sr; + + if ( gsr->createFlags & CREATE_POPUP ) { + if ( !gsr->popup_menu ) { + gsr->popup_menu = gsr_create_popup_menu (gsr); + } + gnucash_register_attach_popup( gsr->reg, gsr->popup_menu, gsr ); + } + + sr = gnc_ledger_display_get_split_register( gsr->ledger ); + gnc_split_register_show_present_divider( sr, TRUE ); + gnc_ledger_display_refresh( gsr->ledger ); + gnc_split_reg_refresh_toolbar( gsr ); +} + + +static +void +gsr_create_menus( GNCSplitReg *gsr ) +{ + GladeXML *xml; + GtkWidget *mbar, *mi; + xml = gnc_glade_xml_new( "register.glade", "register_menubar" ); + glade_xml_signal_autoconnect_full( xml, + gnc_glade_autoconnect_full_func, + gsr ); + + mbar = glade_xml_get_widget( xml, "register_menubar" ); + gtk_widget_hide( mbar ); + + gsr->edit_menu = glade_xml_get_widget( xml, "menu_edit_menu" ); + gtk_object_ref( GTK_OBJECT(gsr->edit_menu) ); + mi = glade_xml_get_widget( xml, "menu_edit" ); + gtk_menu_item_remove_submenu( GTK_MENU_ITEM( mi ) ); + + gsr->view_menu = glade_xml_get_widget( xml, "menu_view_menu" ); + gtk_object_ref( GTK_OBJECT(gsr->view_menu) ); + mi = glade_xml_get_widget( xml, "menu_view" ); + gtk_menu_item_remove_submenu( GTK_MENU_ITEM(mi) ); + + gsr->style_submenu = glade_xml_get_widget( xml, "menu_style_menu" ); + gsr->sort_submenu = glade_xml_get_widget( xml, "menu_sort_order_menu" ); + + gsr->action_menu = glade_xml_get_widget( xml, "menu_actions_menu" ); + gtk_object_ref( GTK_OBJECT(gsr->action_menu) ); + mi = glade_xml_get_widget( xml, "menu_actions" ); + gtk_menu_item_remove_submenu( GTK_MENU_ITEM(mi) ); + + gsr->double_line_check = + glade_xml_get_widget (xml, "menu_style_double_line"); + gsr->split_menu_check = + glade_xml_get_widget (xml, "menu_splits"); + + gsr_setup_menu_widgets( gsr, xml ); + + /* we've ref'd the objects we need to. */ + gtk_widget_destroy( mbar ); +} + +static +void +gsr_create_toolbar( GNCSplitReg *gsr ) +{ + GladeXML *xml; + GtkWidget *widget; + SCM id; + + xml = gnc_glade_xml_new( "register.glade", "toolbar" ); + glade_xml_signal_autoconnect_full( xml, + gnc_glade_autoconnect_full_func, + gsr ); + + gsr->toolbar = glade_xml_get_widget( xml, "toolbar" ); + gsr->split_button = glade_xml_get_widget( xml, "toolbar_split" ); + + id = gnc_register_option_change_callback( gnc_toolbar_change_cb, gsr, + "General", "Toolbar Buttons" ); + gsr->toolbar_change_callback_id = id; + + + if ( gsr->disallowedCaps & CAP_DELETE ) { + widget = glade_xml_get_widget( xml, "toolbar_delete" ); + gtk_widget_set_sensitive( widget, FALSE ); + } + + if ( gsr->disallowedCaps & CAP_JUMP ) { + widget = glade_xml_get_widget( xml, "toolbar_jump" ); + gtk_widget_set_sensitive( widget, FALSE ); + } + + if ( gsr->disallowedCaps & CAP_SCHEDULE ) { + widget = glade_xml_get_widget( xml, "toolbar_schedule" ); + gtk_widget_set_sensitive( widget, FALSE ); + } + + if (gsr->read_only) { + widget = glade_xml_get_widget (xml, "toolbar_delete"); + gtk_widget_set_sensitive(widget, FALSE); + widget = glade_xml_get_widget (xml, "toolbar_duplicate"); + gtk_widget_set_sensitive(widget, FALSE); + } +} + +static +void +gsr_create_table( GNCSplitReg *gsr ) +{ + GtkWidget *register_widget; + SplitRegister *sr; + + gnc_ledger_display_set_user_data( gsr->ledger, (gpointer)gsr ); + gnc_ledger_display_set_handlers( gsr->ledger, + gnc_split_reg_ld_destroy, + gnc_split_reg_get_parent ); + + /* FIXME: We'd really rather pass this down... */ + sr = gnc_ledger_display_get_split_register( gsr->ledger ); + gnucash_register_set_initial_rows( gsr->numRows ); + register_widget = gnucash_register_new( sr->table ); + gsr->reg = GNUCASH_REGISTER( register_widget ); + gnc_table_init_gui( GTK_WIDGET(gsr->reg), sr ); + + gtk_container_add( GTK_CONTAINER(gsr), GTK_WIDGET(gsr->reg) ); + GNUCASH_SHEET(gsr->reg->sheet)->window = gsr->window; + gtk_widget_show_all( GTK_WIDGET(gsr->reg) ); + gtk_signal_connect (GTK_OBJECT(gsr->reg), "activate_cursor", + GTK_SIGNAL_FUNC(gnc_split_reg_record_cb), gsr); + gtk_signal_connect (GTK_OBJECT(gsr->reg), "redraw_all", + GTK_SIGNAL_FUNC(gsr_redraw_all_cb), gsr); + gtk_signal_connect (GTK_OBJECT(gsr->reg), "redraw_help", + GTK_SIGNAL_FUNC(gsr_emit_help_changed), gsr); +} + +static +void +gsr_setup_status_widgets( GNCSplitReg *gsr ) +{ + SplitRegister *sr; + gboolean use_double_line; + GtkCheckMenuItem *check; + + sr = gnc_ledger_display_get_split_register( gsr->ledger ); + use_double_line = gnc_ledger_display_default_double_line( gsr->ledger ); + + /* be sure to initialize the gui elements associated with the cursor */ + gnc_split_register_config( sr, sr->type, sr->style, use_double_line ); + + check = GTK_CHECK_MENU_ITEM( gsr->double_line_check ); + + gtk_signal_handler_block_by_func + ( GTK_OBJECT(check), + GTK_SIGNAL_FUNC(gnc_split_reg_double_line_cb), gsr ); + + gtk_check_menu_item_set_active(check, use_double_line); + + gtk_signal_handler_unblock_by_func + ( GTK_OBJECT(check), + GTK_SIGNAL_FUNC(gnc_split_reg_double_line_cb), gsr ); +} + +void +gnc_split_reg_destroy_cb(GtkWidget *widget, gpointer data) +{ + GNCSplitReg *gsr = data; + SCM id; + + id = gsr->toolbar_change_callback_id; + gnc_unregister_option_change_callback_id(id); +} + +/** + * Raise an existing register window to the front. + **/ +void +gnc_split_reg_raise( GNCSplitReg *gsr ) +{ + if (gsr == NULL) + return; + + if (gsr->window == NULL) + return; + + gtk_window_present( GTK_WINDOW(gsr->window) ); +} + + +/** + * Duplicate-code reduction function; retreives, formats and updates the + * GtkLabel with the given amount. + **/ +static +void +gsr_update_summary_label( GtkWidget *label, + AmountGetterFn getter, + Account *leader, + GNCPrintAmountInfo print_info, + gnc_commodity *cmdty, + gboolean reverse, + gboolean euroFlag ) +{ + gnc_numeric amount; + char string[256]; + + if ( label == NULL ) + return; + + amount = (*getter)( leader ); + + if ( reverse ) { + amount = gnc_numeric_neg( amount ); + } + + xaccSPrintAmount( string, amount, print_info ); + + if ( euroFlag ) { + strcat( string, " / " ); + xaccSPrintAmount( string + strlen( string ), + gnc_convert_to_euro( cmdty, amount ), + gnc_commodity_print_info( gnc_get_euro(), TRUE ) ); + } + + gnc_set_label_color( label, amount ); + gtk_label_set_text( GTK_LABEL(label), string ); +} + +static GNCPrice * +account_latest_price (Account *account) +{ + GNCBook *book; + GNCPriceDB *pdb; + gnc_commodity *commodity; + gnc_commodity *currency; + + commodity = xaccAccountGetCommodity (account); + currency = gnc_default_currency (); + + book = gnc_get_current_book (); + pdb = gnc_book_get_pricedb (book); + + return gnc_pricedb_lookup_latest (pdb, commodity, currency); +} + +static +void +gsr_redraw_all_cb (GnucashRegister *g_reg, gpointer data) +{ + GNCSplitReg *gsr = data; + gnc_commodity * commodity; + GNCPrintAmountInfo print_info; + gnc_numeric amount; + char string[256]; + Account *leader; + gboolean reverse; + gboolean euro; + + if ( gsr->window == NULL ) + return; + + leader = gnc_ledger_display_leader( gsr->ledger ); + euro = gnc_lookup_boolean_option( "International", + "Enable EURO support", + FALSE ); + + commodity = xaccAccountGetCommodity( leader ); + + /* no EURO converson, if account is already EURO or no EURO currency */ + if (commodity != NULL) + euro = (euro && gnc_is_euro_currency( commodity )); + else + euro = FALSE; + + print_info = gnc_account_print_info( leader, TRUE ); + reverse = gnc_reverse_balance( leader ); + + if ( gsr->createFlags & CREATE_SUMMARYBAR ) { + gsr_update_summary_label( gsr->balance_label, + (AmountGetterFn)gnc_account_present_balance, + leader, print_info, commodity, reverse, euro ); + gsr_update_summary_label( gsr->cleared_label, + (AmountGetterFn)xaccAccountGetClearedBalance, + leader, print_info, commodity, reverse, euro ); + gsr_update_summary_label( gsr->reconciled_label, + (AmountGetterFn)xaccAccountGetReconciledBalance, + leader, print_info, commodity, reverse, euro ); + gsr_update_summary_label( gsr->future_label, + (AmountGetterFn)xaccAccountGetBalance, + leader, print_info, commodity, reverse, euro ); + + if (gsr->shares_label != NULL) + { + print_info = gnc_account_print_info( leader, TRUE ); + + amount = xaccAccountGetBalance( leader ); + if (reverse) + amount = gnc_numeric_neg( amount ); + + xaccSPrintAmount( string, amount, print_info ); + + gnc_set_label_color( gsr->shares_label, amount ); + gtk_label_set_text( GTK_LABEL(gsr->shares_label), string ); + } + + if (gsr->value_label != NULL) + { + GNCPrice *price; + + price = account_latest_price (leader); + if (!price) + { + gnc_set_label_color (gsr->value_label, gnc_numeric_zero ()); + gtk_label_set_text (GTK_LABEL (gsr->value_label), + _("")); + } + else + { + gnc_commodity *currency = gnc_price_get_currency (price); + + print_info = gnc_commodity_print_info (currency, TRUE); + + amount = xaccAccountGetBalance (leader); + if (reverse) + amount = gnc_numeric_neg (amount); + + amount = gnc_numeric_mul (amount, gnc_price_get_value (price), + gnc_commodity_get_fraction (currency), + GNC_RND_ROUND); + + xaccSPrintAmount (string, amount, print_info); + + gnc_set_label_color (gsr->value_label, amount); + gtk_label_set_text (GTK_LABEL (gsr->value_label), string); + + gnc_price_unref (price); + } + } + } + + /* FIXME */ +#if 0 /* FIXME */ + gnc_reg_set_window_name( gsr ); +#endif /* 0 -- FIXME */ + + { + gboolean expand; + gboolean sensitive; + SplitRegister *reg; + + reg = gnc_ledger_display_get_split_register( gsr->ledger ); + expand = gnc_split_register_current_trans_expanded (reg); + sensitive = (reg->style == REG_STYLE_LEDGER); + + if ( gsr->createFlags & CREATE_TOOLBAR ) { + gtk_signal_handler_block_by_data + (GTK_OBJECT(gsr->split_button), gsr); + gtk_toggle_button_set_active + (GTK_TOGGLE_BUTTON (gsr->split_button), expand); + gtk_signal_handler_unblock_by_data + (GTK_OBJECT (gsr->split_button), gsr); + gtk_widget_set_sensitive( gsr->split_button, sensitive ); + } + + if ( gsr->createFlags & CREATE_MENUS ) { + gtk_signal_handler_block_by_data + (GTK_OBJECT (gsr->split_menu_check), gsr); + gtk_check_menu_item_set_active + (GTK_CHECK_MENU_ITEM (gsr->split_menu_check), expand); + gtk_signal_handler_unblock_by_data + (GTK_OBJECT (gsr->split_menu_check), gsr); + gtk_widget_set_sensitive( gsr->split_menu_check, sensitive ); + } + + if ( gsr->createFlags & CREATE_POPUP ) { + gtk_signal_handler_block_by_data + (GTK_OBJECT (gsr->split_popup_check), gsr); + gtk_check_menu_item_set_active + (GTK_CHECK_MENU_ITEM (gsr->split_popup_check), expand); + gtk_signal_handler_unblock_by_data + (GTK_OBJECT (gsr->split_popup_check), gsr); + gtk_widget_set_sensitive( gsr->split_popup_check, sensitive ); + } + } +} + +static void +gnc_split_reg_refresh_toolbar( GNCSplitReg *gsr ) +{ + GtkToolbarStyle tbstyle; + + if ((gsr == NULL) || (gsr->toolbar == NULL)) + return; + + tbstyle = gnc_get_toolbar_style (); + gtk_toolbar_set_style( GTK_TOOLBAR(gsr->toolbar), tbstyle ); +} + +static +void +gnc_split_reg_contained_ld_destroy( GNCLedgerDisplay *ledger ) +{ + GNCSplitReg *gsr = gnc_ledger_display_get_user_data( ledger ); + DEBUG( "destroying" ); + gtk_widget_destroy( GTK_WIDGET(gsr->reg) ); + DEBUG( "setting user data" ); + gnc_ledger_display_set_user_data( ledger, NULL ); +} + +static void +gnc_split_reg_ld_destroy( GNCLedgerDisplay *ledger ) +{ + GNCSplitReg *gsr = gnc_ledger_display_get_user_data( ledger ); + + if (gsr) + { + SplitRegister *reg; + + reg = gnc_ledger_display_get_split_register (ledger); + + if (reg && reg->table) + gnc_table_save_state (reg->table); + + gtk_widget_hide_all( gsr->window ); + gtk_widget_destroy( gsr->window ); + } + gnc_ledger_display_set_user_data (ledger, NULL); +} + +gboolean +gnc_split_reg_check_close( GNCSplitReg *gsr ) +{ + gboolean pending_changes; + SplitRegister *reg; + + reg = gnc_ledger_display_get_split_register( gsr->ledger ); + pending_changes = gnc_split_register_changed( reg ); + if ( !pending_changes ) + return FALSE; + + { + const char *message = _("The current transaction has been changed.\n" + "Would you like to record it?"); + if ( gnc_verify_dialog_parented( gsr->window, TRUE, message) ) { + gnc_split_reg_record_trans_cb( gsr->window, gsr ); + return TRUE; + } else { + gnc_split_register_cancel_cursor_trans_changes( reg ); + return FALSE; + } + } +} + +void +gsr_default_cut_handler( GNCSplitReg *gsr, gpointer data ) +{ + gnucash_register_cut_clipboard( gsr->reg ); +} + +/** + * Cut the selection to the clipboard. This refers to the Split. + **/ +void +gnc_split_reg_cut_cb (GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + gsr_emit_signal( gsr, "cut" ); +} + +void +gsr_default_copy_handler( GNCSplitReg *gsr, gpointer data ) +{ + gnucash_register_copy_clipboard( gsr->reg ); +} + +/** + * Copy the selection to the clipboard. This refers to the Split. + **/ +void +gnc_split_reg_copy_cb (GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + gsr_emit_signal( gsr, "copy" ); +} + +void +gsr_default_paste_handler( GNCSplitReg *gsr, gpointer data ) +{ + gnucash_register_paste_clipboard( gsr->reg ); +} + +/** + * Paste the clipboard to the selection. This refers to the Split. + **/ +void +gnc_split_reg_paste_cb (GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + gsr_emit_signal( gsr, "paste" ); +} + +void +gsr_default_cut_txn_handler( GNCSplitReg *gsr, gpointer data ) +{ + gnc_split_register_cut_current + (gnc_ledger_display_get_split_register( gsr->ledger )); +} + +/** + * Cut the current transaction to the clipboard. + **/ +void +gnc_split_reg_cut_trans_cb (GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + gsr_emit_signal( gsr, "cut_txn" ); +} + +void +gsr_default_copy_txn_handler( GNCSplitReg *gsr, gpointer data ) +{ + gnc_split_register_copy_current + (gnc_ledger_display_get_split_register( gsr->ledger )); +} + +/** + * Copy the current transaction to the clipboard. + **/ +void +gnc_split_reg_copy_trans_cb(GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + gsr_emit_signal( gsr, "copy_txn" ); +} + +void +gsr_default_paste_txn_handler( GNCSplitReg *gsr, gpointer data ) +{ + gnc_split_register_paste_current + (gnc_ledger_display_get_split_register( gsr->ledger )); +} + +/** + * Paste the transaction clipboard to the selection. + **/ +void +gnc_split_reg_paste_trans_cb (GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + gsr_emit_signal( gsr, "paste_txn" ); +} + +/* Remove when porting to gtk2.0 */ +#define GTK_STOCK_CANCEL GNOME_STOCK_BUTTON_CANCEL +#define GTK_STOCK_DELETE "Delete" + +void +gsr_default_reinit_handler( GNCSplitReg *gsr, gpointer data ) +{ + VirtualCellLocation vcell_loc; + SplitRegister *reg; + Transaction *trans; + Split *split; + char *buf = NULL; + gint result; + const char *two_choices[] = { N_(GTK_STOCK_CANCEL), + N_("Reinitialize"), + NULL }; + const char *message = _("Are you sure you want to reinitialize this " + "transaction?"); + + const char *recn_warn = _("You would be modifying a " + "transaction with reconciled splits!\n" + "This is not a good idea as it will cause your " + "reconciled balance to be off."); + + reg = gnc_ledger_display_get_split_register( gsr->ledger ); + + trans = gnc_split_register_get_current_trans (reg); + if (xaccTransHasReconciledSplits (trans)) { + buf = g_strconcat (message, "\n\n", recn_warn, NULL); + result = + gnc_generic_warning_dialog_parented(gsr->window, two_choices, buf); + } else { + buf = g_strdup (message); + result = + gnc_generic_question_dialog_parented(gsr->window, two_choices,buf); + } + g_free(buf); + if (!result) + return; + + /* + * Find the "transaction" split for the current transaction. This is + * the split that appears at the top of the transaction in the + * register. + */ + split = gnc_split_register_get_current_split (reg); + if (!gnc_split_register_get_split_virt_loc(reg, split, &vcell_loc)) + return; + split = gnc_split_register_get_current_trans_split (reg, &vcell_loc); + gnc_split_register_emtpy_current_trans_except_split (reg, split); +} + +/** + * "Reinitializes" the current transaction. + **/ +void +gnc_split_reg_reinitialize_trans_cb(GtkWidget *widget, gpointer data) +{ + GNCSplitReg *gsr = data; + gsr_emit_signal( gsr, "reinit" ); +} + +void +gsr_default_delete_handler( GNCSplitReg *gsr, gpointer data ) +{ + SplitRegisterStyle style; + CursorClass cursor_class; + SplitRegister *reg; + Transaction *trans; + char *buf = NULL; + Split *split; + gint result; + const char *two_choices[] = { N_(GTK_STOCK_CANCEL), + N_(GTK_STOCK_DELETE), + NULL }; + + reg = gnc_ledger_display_get_split_register( gsr->ledger ); + + /* get the current split based on cursor position */ + split = gnc_split_register_get_current_split(reg); + if (split == NULL) + { + gnc_split_register_cancel_cursor_split_changes (reg); + return; + } + + trans = xaccSplitGetParent(split); + style = reg->style; + cursor_class = gnc_split_register_get_current_cursor_class (reg); + + /* Deleting the blank split just cancels */ + { + Split *blank_split = gnc_split_register_get_blank_split (reg); + + if (split == blank_split) + { + gnc_split_register_cancel_cursor_trans_changes (reg); + return; + } + } + + if (cursor_class == CURSOR_CLASS_NONE) + return; + + /* On a split cursor, just delete the one split. */ + if (cursor_class == CURSOR_CLASS_SPLIT) + { + const char *format = _("Are you sure you want to delete\n %s\n" + "from the transaction\n %s ?"); + const char *recn_warn = _("You would be deleting a reconciled split!\n" + "This is not a good idea as it will cause your " + "reconciled balance to be off."); + const char *memo; + const char *desc; + char recn; + + memo = xaccSplitGetMemo (split); + memo = (memo && *memo) ? memo : _("(no memo)"); + + desc = xaccTransGetDescription (trans); + desc = (desc && *desc) ? desc : _("(no description)"); + + /* ask for user confirmation before performing permanent damage */ + buf = g_strdup_printf (format, memo, desc); + + recn = xaccSplitGetReconcile (split); + if (recn == YREC || recn == FREC) + { + char *new_buf; + + new_buf = g_strconcat (buf, "\n\n", recn_warn, NULL); + g_free (buf); + buf = new_buf; + result = + gnc_generic_warning_dialog_parented(gsr->window, two_choices, buf); + } else { + result = + gnc_generic_question_dialog_parented(gsr->window, two_choices,buf); + } + g_free(buf); + + if (!result) + return; + + gnc_split_register_delete_current_split (reg); + return; + } + + g_return_if_fail(cursor_class == CURSOR_CLASS_TRANS); + + /* On a transaction cursor with 2 or fewer splits in single or double + * mode, we just delete the whole transaction, kerblooie */ + { + const char *message = _("Are you sure you want to delete the current " + "transaction?"); + const char *recn_warn = _("You would be deleting a transaction " + "with reconciled splits!\n" + "This is not a good idea as it will cause your " + "reconciled balance to be off."); + char *buf; + + if (xaccTransHasReconciledSplits (trans)) { + buf = g_strconcat (message, "\n\n", recn_warn, NULL); + result = + gnc_generic_warning_dialog_parented(gsr->window, two_choices, buf); + } else { + buf = g_strdup (message); + result = + gnc_generic_question_dialog_parented(gsr->window, two_choices,buf); + } + + g_free (buf); + + if (!result) + return; + + gnc_split_register_delete_current_trans (reg); + return; + } +} + +/** + * Deletes the current transaction. + **/ +void +gnc_split_reg_delete_trans_cb(GtkWidget *widget, gpointer data) +{ + GNCSplitReg *gsr = data; + gsr_emit_signal( gsr, "delete_ent" ); +} + +void +gsr_default_dup_handler( GNCSplitReg *gsr, gpointer data ) +{ + gnc_split_register_duplicate_current + (gnc_ledger_display_get_split_register( gsr->ledger )); +} + +/** + * Duplicates the current transaction in the register. + **/ +void +gnc_split_reg_duplicate_trans_cb(GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + gsr_emit_signal( gsr, "dup_ent" ); +} + +/** + * Schedules the current transaction for recurring-entry. + * If the selected transaction was created from a scheduled transaction, + * opens the editor for that Scheduled Transaction. + **/ +void +gsr_default_schedule_handler( GNCSplitReg *gsr, gpointer data ) +{ + SplitRegister *reg = gnc_ledger_display_get_split_register( gsr->ledger ); + Transaction *pending_trans = gnc_split_register_get_current_trans (reg); + + /* FIXME: If the transaction has a sched-xact KVP frame, then go to the + * editor for the existing SX; otherwise, do the sx-from-trans dialog. */ + { + kvp_frame *txn_frame; + kvp_value *kvp_val; + /* set a kvp-frame element in the transaction indicating and + * pointing-to the SX this was created from. */ + txn_frame = xaccTransGetSlots( pending_trans ); + if ( txn_frame != NULL ) { + DEBUG( "Got frame, looking up key" ); + kvp_val = kvp_frame_get_slot( txn_frame, "from-sched-xaction" ); + if ( kvp_val ) { + DEBUG( "Find SX with GUID \"%s\"", + guid_to_string( kvp_value_get_guid( kvp_val ) ) ); + } + } + } + +#if 0 /* FIXME */ + gnc_sx_create_from_trans(pending_trans); +#endif /* 0 -- FIXME */ +} + +void +gnc_split_reg_recur_cb(GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + gsr_emit_signal( gsr, "schedule_ent" ); +} + +/** + * Records into the books the currently-selected transaction. + **/ +void +gnc_split_reg_record_trans_cb (GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + gsr_emit_signal( gsr, "enter_ent" ); +} + +/* typedef enum */ +/* { */ +/* DELETE_CANCEL, */ +/* DELETE_SPLITS, */ +/* DELETE_TRANS, */ +/* } DeleteType; */ + +void +gsr_default_cancel_handler( GNCSplitReg *gsr, gpointer data ) +{ + gnc_split_register_cancel_cursor_trans_changes + (gnc_ledger_display_get_split_register( gsr->ledger )); +} + +/** + * Cancels the edits of the currently-selected transaction. + **/ +void +gnc_split_reg_cancel_trans_cb(GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + gsr_emit_signal( gsr, "cancel_ent" ); +} + +void +gsr_default_expand_handler( GNCSplitReg *gsr, gpointer data ) +{ + gint activeCount; + gboolean expand; + SplitRegister *reg; + + if (!gsr) + return; + + reg = gnc_ledger_display_get_split_register (gsr->ledger); + + /* These should all be in agreement. */ + activeCount = + ( ( GTK_CHECK_MENU_ITEM(gsr->split_menu_check)->active ? 1 : -1 ) + + ( GTK_CHECK_MENU_ITEM(gsr->split_popup_check)->active ? 1 : -1 ) + + ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(gsr->split_button) ) + ? 1 : -1 ) ); + + /* If activeCount > 0, then there's more active than inactive; otherwise, + * more inactive than active. Both determine which state the user is + * attempting to get to. */ + expand = ( activeCount < 0 ); + + /* The ledger's invocation of 'redraw_all' will force the agreement in the + * other split state widgets, so we neglect doing it here. */ + gnc_split_register_expand_current_trans (reg, expand); +} + +void +gnc_split_reg_expand_trans_menu_cb (GtkWidget *widget, gpointer data) +{ + GNCSplitReg *gsr = data; + gsr_emit_signal( gsr, "expand_ent" ); +} + +void +gnc_split_reg_expand_trans_toolbar_cb (GtkWidget *widget, gpointer data) +{ + GNCSplitReg *gsr = data; + gsr_emit_signal( gsr, "expand_ent" ); +} + +/** + * move the cursor to the split, if present in register +**/ +void +gnc_split_reg_jump_to_split(GNCSplitReg *gsr, Split *split) +{ + Transaction *trans; + VirtualCellLocation vcell_loc; + SplitRegister *reg; + + if (!gsr) return; + + trans = xaccSplitGetParent(split); +#if 0 /* FIXME */ + if (trans != NULL) + if (gnc_register_include_date(gsr, xaccTransGetDate(trans))) + { + gnc_ledger_display_refresh( gsr->ledger ); + } +#endif /* 0 -- FIXME */ + + reg = gnc_ledger_display_get_split_register( gsr->ledger ); + + if (gnc_split_register_get_split_virt_loc(reg, split, &vcell_loc)) + gnucash_register_goto_virt_cell( gsr->reg, vcell_loc ); +} + + +/** + * Move the cursor to the split in the non-blank amount column. + **/ +void +gnc_split_reg_jump_to_split_amount(GNCSplitReg *gsr, Split *split) +{ + Transaction *trans; + VirtualLocation virt_loc; + SplitRegister *reg; + + if (!gsr) return; + +#if 0 /* FIXME */ + trans = xaccSplitGetParent(split); + if (trans != NULL) { + if (gnc_register_include_date(gsr, xaccTransGetDate(trans))) + { + gnc_ledger_display_refresh (gsr->ledger); + } + } +#endif /* 0 -- FIXME */ + + reg = gnc_ledger_display_get_split_register (gsr->ledger); + + if (gnc_split_register_get_split_amount_virt_loc (reg, split, &virt_loc)) + gnucash_register_goto_virt_loc (gsr->reg, virt_loc); +} + +void +gnc_split_reg_jump_to_blank (GNCSplitReg *gsr) +{ + SplitRegister *reg = gnc_ledger_display_get_split_register (gsr->ledger); + VirtualCellLocation vcell_loc; + Split *blank; + + blank = gnc_split_register_get_blank_split (reg); + if (blank == NULL) + return; + + if (gnc_split_register_get_split_virt_loc (reg, blank, &vcell_loc)) + gnucash_register_goto_virt_cell (gsr->reg, vcell_loc); +} + +void +gsr_default_blank_handler( GNCSplitReg *gsr, gpointer data ) +{ + SplitRegister *reg; + + reg = gnc_ledger_display_get_split_register (gsr->ledger); + + if (gnc_split_register_save (reg, TRUE)) + gnc_split_register_redraw (reg); + + gnc_split_reg_jump_to_blank (gsr); +} + +void +gnc_split_reg_new_trans_cb (GtkWidget *widget, gpointer data) +{ + GNCSplitReg *gsr = data; + gsr_emit_signal( gsr, "blank" ); +} + +void +gsr_default_jump_handler( GNCSplitReg *gsr, gpointer data ) +{ + RegWindow *rw; + SplitRegister *reg; + Account *account; + Account *leader; + Split *split; + + reg = gnc_ledger_display_get_split_register (gsr->ledger); + + split = gnc_split_register_get_current_split (reg); + if (split == NULL) + return; + + account = xaccSplitGetAccount(split); + if (account == NULL) + return; + + leader = gnc_ledger_display_leader( gsr->ledger ); + + if (account == leader) + { + split = xaccSplitGetOtherSplit(split); + if (split == NULL) + return; + + account = xaccSplitGetAccount(split); + if (account == NULL) + return; + if (account == leader) + return; + } + + rw = regWindowSimple(account); + if (rw == NULL) + return; + + gnc_register_raise( rw ); + gnc_register_jump_to_split( rw, split ); +} + +void +gnc_split_reg_jump_cb( GtkWidget *widget, gpointer data ) +{ + GNCSplitReg *gsr = data; + gsr_emit_signal( gsr, "jump" ); +} + +static +void +gnc_split_reg_change_style (GNCSplitReg *gsr, SplitRegisterStyle style) +{ + SplitRegister *reg = gnc_ledger_display_get_split_register (gsr->ledger); + + if (style == reg->style) + return; + + gnc_split_register_config (reg, reg->type, style, reg->use_double_line); + gnc_ledger_display_refresh (gsr->ledger); +} + +void +gnc_split_reg_style_ledger_cb (GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + + if (!GTK_CHECK_MENU_ITEM(w)->active) + return; + + gnc_split_reg_change_style (gsr, REG_STYLE_LEDGER); +} + +void +gnc_split_reg_style_auto_ledger_cb (GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + + if (!GTK_CHECK_MENU_ITEM(w)->active) + return; + + gnc_split_reg_change_style (gsr, REG_STYLE_AUTO_LEDGER); +} + +void +gnc_split_reg_style_journal_cb (GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + + if (!GTK_CHECK_MENU_ITEM(w)->active) + return; + + gnc_split_reg_change_style (gsr, REG_STYLE_JOURNAL); +} + +void +gnc_split_reg_double_line_cb (GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + SplitRegister *reg = gnc_ledger_display_get_split_register (gsr->ledger); + gboolean use_double_line; + + use_double_line = GTK_CHECK_MENU_ITEM(w)->active; + if ( use_double_line == reg->use_double_line ) + return; + + gnc_split_register_config( reg, reg->type, reg->style, use_double_line ); + gnc_ledger_display_refresh( gsr->ledger ); +} + +static void +gnc_split_reg_sort( GNCSplitReg *gsr, SortType sort_code ) +{ + Query *query = gnc_ledger_display_get_query( gsr->ledger ); + gboolean show_present_divider = FALSE; + GSList *p1 = NULL, *p2 = NULL, *p3 = NULL, *standard; + SplitRegister *reg; + + if (gsr->sort_type == sort_code) + return; + + standard = g_slist_prepend( NULL, QUERY_DEFAULT_SORT ); + + switch (sort_code) + { + case BY_STANDARD: + p1 = standard; + show_present_divider = TRUE; + break; + case BY_DATE: + p1 = g_slist_prepend (p1, TRANS_DATE_POSTED); + p1 = g_slist_prepend (p1, SPLIT_TRANS); + p2 = standard; + show_present_divider = TRUE; + break; + case BY_DATE_ENTERED: + p1 = g_slist_prepend (p1, TRANS_DATE_ENTERED); + p1 = g_slist_prepend (p1, SPLIT_TRANS); + p2 = standard; + break; + case BY_DATE_RECONCILED: + p1 = g_slist_prepend (p1, SPLIT_RECONCILE); + p2 = g_slist_prepend (p2, SPLIT_DATE_RECONCILED); + p3 = standard; + break; + case BY_NUM: + p1 = g_slist_prepend (p1, TRANS_NUM); + p1 = g_slist_prepend (p1, SPLIT_TRANS); + p2 = standard; + break; + case BY_AMOUNT: + p1 = g_slist_prepend (p1, SPLIT_VALUE); + p2 = standard; + break; + case BY_MEMO: + p1 = g_slist_prepend (p1, SPLIT_MEMO); + p2 = standard; + break; + case BY_DESC: + p1 = g_slist_prepend (p1, TRANS_DESCRIPTION); + p1 = g_slist_prepend (p1, SPLIT_TRANS); + p2 = standard; + break; + default: + g_slist_free (standard); + g_return_if_fail (FALSE); + } + + gncQuerySetSortOrder( query, p1, p2, p3 ); + reg = gnc_ledger_display_get_split_register( gsr->ledger ); + gnc_split_register_show_present_divider( reg, show_present_divider ); + gsr->sort_type = sort_code; + gnc_ledger_display_refresh( gsr->ledger ); +} + +void +gnc_split_reg_sort_standard_cb(GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + gnc_split_reg_sort(gsr, BY_STANDARD); +} + +void +gnc_split_reg_sort_date_cb(GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + gnc_split_reg_sort(gsr, BY_DATE); +} + +void +gnc_split_reg_sort_date_entered_cb(GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + gnc_split_reg_sort(gsr, BY_DATE_ENTERED); +} + +void +gnc_split_reg_sort_date_reconciled_cb(GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + gnc_split_reg_sort(gsr, BY_DATE_RECONCILED); +} + +void +gnc_split_reg_sort_num_cb(GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + gnc_split_reg_sort(gsr, BY_NUM); +} + +void +gnc_split_reg_sort_amount_cb(GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + gnc_split_reg_sort(gsr, BY_AMOUNT); +} + +void +gnc_split_reg_sort_memo_cb(GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + gnc_split_reg_sort(gsr, BY_MEMO); +} + +void +gnc_split_reg_sort_desc_cb(GtkWidget *w, gpointer data) +{ + GNCSplitReg *gsr = data; + gnc_split_reg_sort(gsr, BY_DESC); +} + +static void +gnc_split_reg_record (GNCSplitReg *gsr) +{ + SplitRegister *reg; + Transaction *trans; + + reg = gnc_ledger_display_get_split_register (gsr->ledger); + trans = gnc_split_register_get_current_trans (reg); + + if (!gnc_split_register_save (reg, TRUE)) + return; + + /* FIXME */ +#if 0 /* FIXME */ + if (trans != NULL) + gnc_split_reg_include_date( gsr, xaccTransGetDate(trans) ); +#endif /* 0 - FIXME */ + + gnc_split_register_redraw (reg); +} + +static gboolean +gnc_split_reg_match_trans_row( VirtualLocation virt_loc, + gpointer user_data ) +{ + GNCSplitReg *gsr = user_data; + CursorClass cursor_class; + SplitRegister *sr; + + sr = gnc_ledger_display_get_split_register (gsr->ledger); + cursor_class = gnc_split_register_get_cursor_class (sr, virt_loc.vcell_loc); + + return (cursor_class == CURSOR_CLASS_TRANS); +} + +static void +gnc_split_reg_goto_next_trans_row (GNCSplitReg *gsr) +{ + gnucash_register_goto_next_matching_row( gsr->reg, + gnc_split_reg_match_trans_row, + gsr ); +} + +static void +gnc_split_reg_enter( GNCSplitReg *gsr, gboolean next_transaction ) +{ + SplitRegister *sr = gnc_ledger_display_get_split_register( gsr->ledger ); + gboolean goto_blank; + + goto_blank = gnc_lookup_boolean_option( "Register", + "'Enter' moves to blank transaction", + FALSE ); + + /* If we are in single or double line mode and we hit enter + * on the blank split, go to the blank split instead of the + * next row. This prevents the cursor from jumping around + * when you are entering transactions. */ + if ( !goto_blank && !next_transaction ) + { + SplitRegisterStyle style = sr->style; + + if (style == REG_STYLE_LEDGER) + { + Split *blank_split; + + blank_split = gnc_split_register_get_blank_split(sr); + if (blank_split != NULL) + { + Split *current_split; + + current_split = gnc_split_register_get_current_split(sr); + + if (blank_split == current_split) + goto_blank = TRUE; + } + } + } + + /* First record the transaction. This will perform a refresh. */ + gnc_split_reg_record( gsr ); + + if (!goto_blank && next_transaction) + gnc_split_register_expand_current_trans (sr, FALSE); + + /* Now move. */ + if (goto_blank) + gnc_split_reg_jump_to_blank( gsr ); + else if (next_transaction) + gnc_split_reg_goto_next_trans_row( gsr ); + else + gnucash_register_goto_next_virt_row( gsr->reg ); +} + +void +gsr_default_enter_handler( GNCSplitReg *gsr, gpointer data ) +{ + gnc_split_reg_enter( gsr, FALSE ); +} + +void +gnc_split_reg_record_cb (GnucashRegister *reg, gpointer data) +{ + gsr_emit_signal( (GNCSplitReg*)data, "enter_ent" ); +} + +gboolean +gnc_split_reg_delete_cb(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + GNCSplitReg *gsr = data; + gnc_split_reg_check_close( gsr ); + gnc_ledger_display_close( gsr->ledger ); + return TRUE; /* don't close */ +} + +void +gnc_split_reg_size_allocate (GtkWidget *widget, + GtkAllocation *allocation, + gpointer user_data) +{ + GNCSplitReg *gsr = user_data; + gsr->width = allocation->width; + /* FIXME: this can't be correct... */ + gtk_window_set_default_size( GTK_WINDOW(gsr->window), gsr->width, 0 ); +} + +static +GtkWidget* +add_summary_label (GtkWidget *summarybar, const char *label_str) +{ + GtkWidget *hbox; + GtkWidget *label; + + hbox = gtk_hbox_new(FALSE, 2); + gtk_box_pack_start( GTK_BOX(summarybar), hbox, FALSE, FALSE, 5 ); + + label = gtk_label_new( label_str ); + gtk_misc_set_alignment( GTK_MISC(label), 1.0, 0.5 ); + gtk_box_pack_start( GTK_BOX(hbox), label, FALSE, FALSE, 0 ); + + label = gtk_label_new( "" ); + gtk_misc_set_alignment( GTK_MISC(label), 1.0, 0.5 ); + gtk_box_pack_start( GTK_BOX(hbox), label, FALSE, FALSE, 0 ); + + return label; +} + +static +void +gsr_create_summary_bar( GNCSplitReg *gsr ) +{ + gboolean has_shares; + GtkWidget *summarybar; + + gsr->cleared_label = NULL; + gsr->balance_label = NULL; + gsr->reconciled_label = NULL; + gsr->future_label = NULL; + gsr->shares_label = NULL; + gsr->value_label = NULL; + + if ( gnc_ledger_display_type(gsr->ledger) >= LD_SUBACCOUNT ) { + gsr->summarybar = NULL; + } + + { + Account *account; + GNCAccountType atype; + + account = gnc_ledger_display_leader( gsr->ledger ); + atype = xaccAccountGetType (account); + + switch (atype) + { + case STOCK: + case MUTUAL: + case CURRENCY: + has_shares = TRUE; + break; + + default: + has_shares = FALSE; + break; + } + } + + summarybar = gtk_hbox_new (FALSE, 4); + + if (!has_shares) + { + gsr->balance_label = add_summary_label (summarybar, _("Present:")); + gsr->future_label = add_summary_label (summarybar, _("Future:")); + gsr->cleared_label = add_summary_label (summarybar, _("Cleared:")); + gsr->reconciled_label = add_summary_label (summarybar, _("Reconciled:")); + } + else + { + gsr->shares_label = add_summary_label (summarybar, _("Shares:")); + gsr->value_label = add_summary_label (summarybar, _("Current Value:")); + } + + gsr->summarybar = summarybar; +} + +static +void +gsr_setup_menu_widgets(GNCSplitReg *gsr, GladeXML *xml) +{ + /* Make sure the right style radio item is active */ + SplitRegister *reg; + GtkWidget *widget; + char *widget_name; + + if ( gsr->disallowedCaps & CAP_DELETE ) { + widget = glade_xml_get_widget( xml, "menu_delete" ); + gtk_widget_set_sensitive( widget, FALSE ); + } + + if ( gsr->disallowedCaps & CAP_JUMP ) { + widget = glade_xml_get_widget( xml, "menu_jump" ); + gtk_widget_set_sensitive( widget, FALSE ); + } + + if ( gsr->disallowedCaps & CAP_SCHEDULE ) { + widget = glade_xml_get_widget( xml, "menu_schedule" ); + gtk_widget_set_sensitive( widget, FALSE ); + } + + + if (gsr->read_only) { + widget = glade_xml_get_widget (xml, "menu_paste"); + gtk_widget_set_sensitive(widget, FALSE); + widget = glade_xml_get_widget (xml, "menu_cut_trans"); + gtk_widget_set_sensitive(widget, FALSE); + widget = glade_xml_get_widget (xml, "menu_paste_trans"); + gtk_widget_set_sensitive(widget, FALSE); + widget = glade_xml_get_widget (xml, "menu_delete"); + gtk_widget_set_sensitive(widget, FALSE); + widget = glade_xml_get_widget (xml, "menu_duplicate"); + gtk_widget_set_sensitive(widget, FALSE); + widget = glade_xml_get_widget (xml, "menu_reinitialize"); + gtk_widget_set_sensitive(widget, FALSE); + } + + reg = gnc_ledger_display_get_split_register( gsr->ledger ); + + switch (reg->style) + { + default: + case REG_STYLE_LEDGER: + widget_name = "menu_style_basic_ledger"; + break; + case REG_STYLE_AUTO_LEDGER: + widget_name = "menu_style_auto_split_ledger"; + break; + case REG_STYLE_JOURNAL: + widget_name = "menu_style_transaction_journal"; + break; + } + + /* registers with more than one account can only use journal mode */ + if (reg->type >= NUM_SINGLE_REGISTER_TYPES) + { + widget = glade_xml_get_widget(xml, "menu_style_basic_ledger"); + gtk_widget_set_sensitive (widget, FALSE); + + widget = glade_xml_get_widget(xml, "menu_style_auto_split_ledger"); + gtk_widget_set_sensitive (widget, FALSE); + } + + widget = glade_xml_get_widget(xml, widget_name); + gtk_signal_handler_block_by_data(GTK_OBJECT(widget), gsr); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), TRUE); + gtk_signal_handler_unblock_by_data(GTK_OBJECT(widget), gsr); +} + +static +GtkWidget * +gsr_create_popup_menu( GNCSplitReg *gsr ) +{ + GtkWidget *popup, *menuitem; + GladeXML *xml; + + xml = gnc_glade_xml_new( "register.glade", "register_popup" ); + popup = glade_xml_get_widget( xml, "register_popup" ); + glade_xml_signal_autoconnect_full( xml, + gnc_glade_autoconnect_full_func, + gsr ); + + /* Glade insists on making this a tearoff menu. */ + if (gnome_preferences_get_menus_have_tearoff()) { + GtkMenuShell *ms = GTK_MENU_SHELL(popup); + GtkWidget *tearoff; + + tearoff = g_list_nth_data(ms->children, 0); + ms->children = g_list_remove(ms->children, tearoff); + gtk_widget_destroy(tearoff); + } + + gsr->split_popup_check = glade_xml_get_widget( xml, "popup_splits" ); + + if ( gsr->disallowedCaps & CAP_DELETE ) { + menuitem = glade_xml_get_widget( xml, "sr_popup_delete" ); + gtk_widget_set_sensitive( menuitem, FALSE ); + } + + if ( gsr->disallowedCaps & CAP_JUMP ) { + menuitem = glade_xml_get_widget( xml, "sr_popup_jump" ); + gtk_widget_set_sensitive( menuitem, FALSE ); + } + + if ( gsr->disallowedCaps & CAP_SCHEDULE ) { + menuitem = glade_xml_get_widget( xml, "sr_popup_schedule" ); + gtk_widget_set_sensitive( menuitem, FALSE ); + } + + if (gsr->read_only) { + menuitem = glade_xml_get_widget( xml, "sr_popup_delete" ); + gtk_widget_set_sensitive( menuitem, FALSE ); + menuitem = glade_xml_get_widget( xml, "sr_popup_duplicate" ); + gtk_widget_set_sensitive( menuitem, FALSE ); + menuitem = glade_xml_get_widget( xml, "sr_popup_reinitialize" ); + gtk_widget_set_sensitive( menuitem, FALSE ); + } + + return popup; +} + +/** + * Opens up a register window for a group of Accounts. + * @param gsr the register window instance + * @return A GNCPlaceholderType indicating presence and type of placeholder + * accounts + **/ +static +GNCPlaceholderType +gnc_split_reg_get_placeholder( GNCSplitReg *gsr ) +{ + Account *leader; + SplitRegister *reg; + gboolean single_account; + + if (gsr == NULL) + return PLACEHOLDER_NONE; + + reg = gnc_ledger_display_get_split_register( gsr->ledger ); + + switch (reg->type) + { + case GENERAL_LEDGER: + case INCOME_LEDGER: + case PORTFOLIO_LEDGER: + case SEARCH_LEDGER: + single_account = FALSE; + break; + default: + single_account = TRUE; + break; + } + + leader = gnc_ledger_display_leader( gsr->ledger ); + + if (leader == NULL) + return PLACEHOLDER_NONE; + if (single_account) { + if (xaccAccountGetPlaceholder( leader )) + return PLACEHOLDER_THIS; + return PLACEHOLDER_NONE; + } + return xaccAccountGetDescendantPlaceholder( leader ); +} + +/** + * @see gtk_callback_bug_workaround + **/ +typedef struct dialog_args { + GNCSplitReg *gsr; + gchar *string; +} dialog_args; + +/** + * Gtk has occasional problems with performing function as part of a + * callback. This routine gets called via a timer callback to get it out of + * the data path with the problem. + **/ +static +gint +gtk_callback_bug_workaround (gpointer argp) +{ + dialog_args *args = argp; + + gnc_warning_dialog_parented(args->gsr->window, args->string); + free(args); + return FALSE; +} + +/** + * Determines whether this register window should be read-only. + **/ +static +void +gnc_split_reg_determine_read_only( GNCSplitReg *gsr ) +{ + dialog_args *args = g_malloc(sizeof(dialog_args)); + gchar *old_title, *new_title; + SplitRegister *reg; + GtkArg objarg; + + gsr->read_only = FALSE; + + if ( gsr->disallowedCaps & CAP_READ_ONLY ) { + + /* FIXME: this is not ideal, as whatever window-title solution we come up + * with should be used in this case as well. */ + + gsr->read_only = TRUE; + + } else { + + switch (gnc_split_reg_get_placeholder(gsr)) { + case PLACEHOLDER_NONE: + /* stay as false. */ + return; + + case PLACEHOLDER_THIS: + args->string = _("This account may not be edited. If you want\n" + "to edit transactions in this register, please\n" + "open the account options and turn off the\n" + "placeholder checkbox."); + break; + + default: + args->string = _("One of the sub-accounts selected may not be\n" + "edited. If you want to edit transactions in\n" + "this register, please open the sub-account\n" + "options and turn off the placeholder checkbox.\n" + "You may also open an individual account instead\n" + "of a set of accounts."); + break; + } + gsr->read_only = TRUE; + /* Put up a warning dialog */ + args->gsr = gsr; + gtk_timeout_add (250, gtk_callback_bug_workaround, args); /* 0.25 seconds */ + } + + /* Make the contents immutable */ + reg = gnc_ledger_display_get_split_register( gsr->ledger ); + gnc_split_register_set_read_only( reg, TRUE ); + + /* Rename the window title */ + /* FIXME: This isn't so good ... this thing shouldn't be directing + * window-title changes ... especially for the SX-related stuff. */ + objarg.name = "GtkWindow::title"; + gtk_object_arg_get(GTK_OBJECT(gsr->window), &objarg, NULL); + old_title = GTK_VALUE_STRING(objarg); + new_title = g_strdup_printf(_("%s [Read-Only]"), old_title); + /*gtk_object_set(GTK_OBJECT(gsr->window), + * "GtkWindow::title", new_title, NULL); */ + gtk_window_set_title( GTK_WINDOW(gsr->window), new_title ); + g_free(old_title); + g_free(new_title); +} + +static +void +gnc_toolbar_change_cb (void *data) +{ + GNCSplitReg *gsr = data; + gnc_split_reg_refresh_toolbar( gsr ); +} + +/** + * A utility function which retreives the present balance from an Account. + * This should move somewhere more general? + **/ +static +gnc_numeric +gnc_account_present_balance (Account *account) +{ + GList *list; + GList *node; + time_t today; + struct tm *tm; + + if (!account) + return gnc_numeric_zero (); + + today = time (NULL); + tm = localtime (&today); + tm->tm_hour = 23; + tm->tm_min = 59; + tm->tm_sec = 59; + tm->tm_isdst = -1; + today = mktime (tm); + + list = xaccAccountGetSplitList (account); + for (node = g_list_last (list); node; node = node->prev) + { + Split *split = node->data; + + if (xaccTransGetDate (xaccSplitGetParent (split)) <= today) + return xaccSplitGetBalance (split); + } + + return gnc_numeric_zero (); +} + +static +gncUIWidget +gnc_split_reg_get_parent( GNCLedgerDisplay *ledger ) +{ + GNCSplitReg *gsr = + GNC_SPLIT_REG(gnc_ledger_display_get_user_data( ledger )); + + if (gsr == NULL) + return NULL; + + return gsr->window; +} + +static +void +gsr_emit_help_changed( GnucashRegister *reg, gpointer user_data ) +{ + gsr_emit_signal( (GNCSplitReg*)user_data, "help-changed" ); +} + +static +void +gsr_emit_signal( GNCSplitReg *gsr, const char *sigName ) +{ + DEBUG( "emitting signal \"%s\"", sigName ); + gtk_signal_emit_by_name( GTK_OBJECT(gsr), sigName, NULL ); +} + +void +gnc_split_reg_set_ledger_display( GNCSplitReg *gsr, + GNCLedgerDisplay *ld ) +{ + + PERR( "Unimplmeneted; this breaks in a nasty way, right now." ); + return; + + /* FIXME: We're going to leak the old GNCLedgerDisplay and associated + * canvas, &c, all over the place. We're bad people. */ + gtk_container_remove( GTK_CONTAINER(gsr), GTK_WIDGET( gsr->reg ) ); + gnc_ledger_display_set_handlers( gsr->ledger, + gnc_split_reg_contained_ld_destroy, + gnc_split_reg_get_parent ); + gnc_ledger_display_close( gsr->ledger ); + gsr->reg = NULL; + gsr->ledger = ld; + gsr_create_table( gsr ); + gsr_setup_table( gsr ); +} + +GnucashRegister* +gnc_split_reg_get_register( GNCSplitReg *gsr ) +{ + if ( !gsr ) + return NULL; + + return gsr->reg; +} + +SortType +gnc_split_reg_get_sort_type( GNCSplitReg *gsr ) +{ + g_assert( gsr ); + return gsr->sort_type; +} + +void +gnc_split_reg_set_sort_type( GNCSplitReg *gsr, SortType t ) +{ + PERR( "unimplemented" ); +} + +GtkWidget* +gnc_split_reg_get_edit_menu( GNCSplitReg *gsr ) +{ + if ( !gsr ) return NULL; + return gsr->edit_menu; +} + +GtkWidget* +gnc_split_reg_get_view_menu( GNCSplitReg *gsr ) +{ + if ( !gsr ) return NULL; + return gsr->view_menu; +} + +GtkWidget* +gnc_split_reg_get_style_menu( GNCSplitReg *gsr ) +{ + if ( !gsr ) return NULL; + return gsr->style_submenu; +} + +GtkWidget* +gnc_split_reg_get_sort_menu( GNCSplitReg *gsr ) +{ + if ( !gsr ) return NULL; + return gsr->sort_submenu; +} + +GtkWidget* +gnc_split_reg_get_action_menu( GNCSplitReg *gsr ) +{ + if ( !gsr ) return NULL; + return gsr->action_menu; +} + +GtkWidget* +gnc_split_reg_get_toolbar( GNCSplitReg *gsr ) +{ + if ( !gsr ) return NULL; + return gsr->toolbar; +} + +GtkWidget* +gnc_split_reg_get_summarybar( GNCSplitReg *gsr ) +{ + if ( !gsr ) return NULL; + return gsr->summarybar; +} + +GtkWidget* +gnc_split_reg_get_popup( GNCSplitReg *gsr ) +{ + if ( !gsr ) return NULL; + return gsr->popup_menu; +} + +void +gnc_split_reg_set_split_state( GNCSplitReg *gsr, gboolean split ) +{ + g_assert( gsr ); + PERR( "Unimplemented" ); +} + +void +gnc_split_reg_set_double_line( GNCSplitReg *gsr, gboolean doubleLine ) +{ + g_assert( gsr ); + PERR( "unimplemented" ); +} + +GtkWidget* +gnc_split_reg_get_popup_extended( GNCSplitReg *gsr ) +{ + g_assert( gsr ); + PERR( "unimplemented" ); + return NULL; +} diff --git a/src/gnome/gnc-split-reg.h b/src/gnome/gnc-split-reg.h new file mode 100644 index 0000000000..dad21c67cc --- /dev/null +++ b/src/gnome/gnc-split-reg.h @@ -0,0 +1,277 @@ +/********************************************************************\ + * gnc-split-reg.h -- A widget for the common register look-n-feel. * + * Copyright (C) 1997 Robin D. Clark * + * Copyright (C) 1997-1998 Linas Vepstas * + * Copyright (C) 1998 Rob Browning * + * Copyright (C) 1999-2000 Dave Peticolas * + * Copyright (C) 2001 Gnumatic, Inc. * + * Copyright (C) 2002 Joshua Sled * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License as * + * published by the Free Software Foundation; either version 2 of * + * the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License* + * along with this program; if not, contact: * + * * + * Free Software Foundation Voice: +1-617-542-5942 * + * 59 Temple Place - Suite 330 Fax: +1-617-542-2652 * + * Boston, MA 02111-1307, USA gnu@gnu.org * +\********************************************************************/ + + +/** + * Another take at the gnc-reg-widget. + * 2002.10.27 -- jsled + * + * To be explained: + * . inserting controls + * . menus, toolbar + * . gtk_{menu,toolbar}_{append,prepend,insert} is good; callers need to know indexes + * . gint gnc_reg_widget_get_toolbar_index( GNCRegWidget, GNC_REG_WIDGET_ITEM ) + * . gint gnc_reg_widget_get_menu_index ( GNCRegWidget, GNC_REG_WIDGET_ITEM ) + * . gint gnc_reg_widget_get_popup_index ( GNCRegWidget, GNC_REG_WIDGET_ITEM ) + * + * . created status-display widgets [checkboxes in menus, &c.] + * . i/f to changing? + * . gnc_reg_widget_set_split_state( GNCRegWidget, gboolean split ) + * . gnc_reg_widget_set_double_line( GNCRegWidget, gboolean doubleLine ) + * + * Questionable Features: + * . File + * . new account + * . print + * . print check + * . save (as)... + * . close + * . exit + * . view + * . date range + * . edit + * . find + * . actions + * . transfer + * . reconcile + * . stock split + * . check and repair + * . reports + * . tools + **/ + +#ifndef GNC_SPLIT_REG_H +#define GNC_SPLIT_REG_H + +#include +#include +#include "config.h" + +#include "gnc-ledger-display.h" +#include "gnucash-sheet.h" + +#define GNC_SPLIT_REG(obj) GTK_CHECK_CAST( obj, gnc_split_reg_get_type(), GNCSplitReg ) +#define GNC_SPLIT_REG_CLASS(klass) GTK_CHECK_CLASS_CAST( klass, gnc_split_reg_get_type(), GNCSplitRegClass ) +#define IS_GNC_SPLIT_REG(obj) GTK_CHECK_TYPE( obj, gnc_split_reg_get_type() ) + +typedef struct _GNCSplitReg GNCSplitReg; +typedef struct _GNCSplitRegClass GNCSplitRegClass; + +struct _GNCSplitReg { + /* The "parent" widget. */ + GtkVBox vbox; + + /* The containing window. */ + GtkWidget *window; + gint width; + gint height; + + SCM toolbar_change_callback_id; + GtkWidget *toolbar; + GtkWidget *summarybar; + + GtkWidget *popup_menu; + + GtkWidget *edit_menu; + GtkWidget *view_menu; + GtkWidget *style_submenu; + GtkWidget *sort_submenu; + GtkWidget *action_menu; + + GtkWidget * double_line_check; + + GtkWidget *split_button; + GtkWidget *split_menu_check; + GtkWidget *split_popup_check; + + GtkWidget *balance_label; + GtkWidget *cleared_label; + GtkWidget *reconciled_label; + GtkWidget *future_label; + GtkWidget *shares_label; + GtkWidget *value_label; + + /** The current ledger display. **/ + GNCLedgerDisplay *ledger; + /** The actual sheet widget. **/ + GnucashRegister *reg; + + gint numRows; + gint createFlags; + gint disallowedCaps; + + gint sort_type; + + gboolean read_only; +}; + +struct _GNCSplitRegClass { + GtkVBoxClass parent_class; + + /* Signal defaults */ + void (*enter_ent_cb) ( GNCSplitReg *w, gpointer user_data ); + void (*cancel_ent_cb) ( GNCSplitReg *w, gpointer user_data ); + void (*delete_ent_cb) ( GNCSplitReg *w, gpointer user_data ); + void (*reinit_ent_cb) ( GNCSplitReg *w, gpointer user_data ); + void (*dup_ent_cb) ( GNCSplitReg *w, gpointer user_data ); + void (*schedule_ent_cb) ( GNCSplitReg *w, gpointer user_data ); + void (*expand_ent_cb) ( GNCSplitReg *w, gpointer user_data ); + void (*blank_cb) ( GNCSplitReg *w, gpointer user_data ); + void (*jump_cb) ( GNCSplitReg *w, gpointer user_data ); + void (*cut_cb) ( GNCSplitReg *w, gpointer user_data ); + void (*cut_txn_cb) ( GNCSplitReg *w, gpointer user_data ); + void (*copy_cb) ( GNCSplitReg *w, gpointer user_data ); + void (*copy_txn_cb) ( GNCSplitReg *w, gpointer user_data ); + void (*paste_cb) ( GNCSplitReg *w, gpointer user_data ); + void (*paste_txn_cb) ( GNCSplitReg *w, gpointer user_data ); + void (*help_changed_cb) ( GNCSplitReg *w, gpointer user_data ); +}; + +typedef enum { + ENTER, + CANCEL, + DELETE, + REINIT, + DUPLICATE, + SCHEDULE, + SPLIT, + BLANK, + JUMP, + CUT, + CUT_TXN, + COPY, + COPY_TXN, + PASTE, + PASTE_TXN, + SORT_ORDER_SUBMENU, + STYLE_SUBMENU, +} GNC_SPLIT_REG_ITEM; + +/* Easy way to pass the sort-type */ +typedef enum { + BY_NONE = 0, + BY_STANDARD, + BY_DATE, + BY_DATE_ENTERED, + BY_DATE_RECONCILED, + BY_NUM, + BY_AMOUNT, + BY_MEMO, + BY_DESC +} SortType; + +/** + * Flags for creation-time selection of what subwidgets are to be created. + **/ +#define CREATE_TOOLBAR (1 << 0) +#define CREATE_MENUS (1 << 1) +#define CREATE_POPUP (1 << 2) +#define CREATE_SUMMARYBAR (1 << 3) + +/** + * Flags for various capabilities of the GNCSplitReg; these are used to + * disable specific functionality. + **/ +#define CAP_READ_ONLY (1 << 0) /**< A read-only register. **/ +#define CAP_DELETE (1 << 1) /**< Deleting items. **/ +#define CAP_JUMP (1 << 2) /**< Jumping to the related transaction. **/ +#define CAP_SCHEDULE (1 << 3) /**< Scheduling transactions. **/ + +/** + * GTK-related; gets an identifier for the class of GNCSplitRegs. + **/ +guint gnc_split_reg_get_type(void); + +/** + * Creates and returns a GNCSplitReg. + * @param ld The GNCLedgerDisplay to use for display. + * @param parent The containing window. + * @param numberOfLines The initial number of lines for the register. + * @param createFlags A set of flags for the sub-widgets to create. + * @param disallowCaps A set of flags for capabilities which should be + * disallowed. + **/ +GtkWidget* gnc_split_reg_new( GNCLedgerDisplay *ld, + GtkWindow *parent, + gint numberOfLines, + gint createFlags, + gint disallowCaps ); + +/** + * Changes the ledger display being used by the GNCSplitReg. + **/ +void gnc_split_reg_set_ledger_display( GNCSplitReg *gsr, + GNCLedgerDisplay *ld ); + +/** + * Returns the GnucashRegister in effect for this GNCSplitReg. + **/ +GnucashRegister *gnc_split_reg_get_register( GNCSplitReg *gsr ); + +/** + * Gets/sets the sort-type of the GNCSplitReg. + **/ +SortType gnc_split_reg_get_sort_type( GNCSplitReg *gsr ); +void gnc_split_reg_set_sort_type( GNCSplitReg *gsr, SortType t ); + +/** + * Retreives the various menus created by the GNCSplitReg. Callers may want + * to put these in a more traditional menu bar, for instance. + **/ +GtkWidget *gnc_split_reg_get_edit_menu ( GNCSplitReg *gsr ); +GtkWidget *gnc_split_reg_get_view_menu ( GNCSplitReg *gsr ); +GtkWidget *gnc_split_reg_get_style_menu ( GNCSplitReg *gsr ); +GtkWidget *gnc_split_reg_get_sort_menu ( GNCSplitReg *gsr ); +GtkWidget *gnc_split_reg_get_action_menu ( GNCSplitReg *gsr ); + +/** + * Can return NULL if the indicated subwidget was not created. + **/ +GtkWidget *gnc_split_reg_get_toolbar ( GNCSplitReg *gsr ); +GtkWidget *gnc_split_reg_get_summarybar( GNCSplitReg *gsr ); +GtkWidget *gnc_split_reg_get_popup ( GNCSplitReg *gsr ); + +/** + * These will manipulate the in-GNCSplitReg state-reflecting widgets as + * appropriate. + **/ +void gnc_split_reg_set_split_state( GNCSplitReg *gsr, gboolean split ); +void gnc_split_reg_set_double_line( GNCSplitReg *gsr, gboolean doubleLine ); + +/** + * Convenience function for users. Returns the popup menu containing what + * would normally be the menu-bar-placed menu items. Callers may not have a + * menu bar, but wish to provide full functionality. + * + * The menu-bar items will be at the bottom of the popup menu, seperated. + * The menu-bar items will be created if they were not originally created. + **/ +GtkWidget *gnc_split_reg_get_popup_extended( GNCSplitReg *gsr ); + +gboolean gnc_split_reg_check_close( GNCSplitReg *gsr ); + +#endif /* GNC_SPLIT_REG_H */ diff --git a/src/gnome/window-register.c b/src/gnome/window-register.c index c298c602df..bf68234ba5 100644 --- a/src/gnome/window-register.c +++ b/src/gnome/window-register.c @@ -49,6 +49,7 @@ #include "gnc-ledger-display.h" #include "gnc-menu-extensions.h" #include "gnc-pricedb.h" +#include "gnc-split-reg.h" #include "gnc-ui-util.h" #include "gnc-ui.h" #include "gnucash-sheet.h" @@ -62,17 +63,6 @@ #include "top-level.h" #include "dialog-print-check.h" -typedef enum { - BY_STANDARD = 0, - BY_DATE, - BY_DATE_ENTERED, - BY_DATE_RECONCILED, - BY_NUM, - BY_AMOUNT, - BY_MEMO, - BY_DESC -} sort_type_t; - typedef struct _RegDateWindow RegDateWindow; struct _RegDateWindow { @@ -92,47 +82,28 @@ struct _RegDateWindow * register. Any state info for the regWindow goes here. */ struct _RegWindow { - GNCLedgerDisplay * ledger; - - /* Top level window */ - GtkWidget * window; - gint width; - GtkWidget * toolbar; - GtkWidget * toolbar_dock; - SCM toolbar_change_callback_id; - - GtkWidget * summarybar_dock; - GtkWidget * statusbar; - - GtkWidget * double_line_check; - - GtkWidget * split_button; - GtkWidget * split_menu_check; - GtkWidget * split_popup_check; - - GtkWidget * balance_label; - GtkWidget * cleared_label; - GtkWidget * reconciled_label; - GtkWidget * future_label; - GtkWidget * shares_label; - GtkWidget * value_label; + GtkWidget *window; + GtkWidget *toolbar_dock; + GtkWidget *summarybar_dock; + GtkWidget *statusbar; - GnucashRegister *reg; - - sort_type_t sort_type; + GNCLedgerDisplay *ledger; + GNCSplitReg *gsr; RegDateWindow *date_window; /* pcd = "print check dialog" */ gpointer pcd; gboolean read_only; }; + GtkWidget *gnc_RegWindow_window (RegWindow *data) { g_assert(data); return data->window; } + GNCLedgerDisplay *gnc_RegWindow_ledger (RegWindow *data) { g_assert(data); @@ -153,7 +124,8 @@ gnc_RegWindow_set_pcd (RegWindow *data, gpointer pcd) /* This static indicates the debugging module that this .o belongs to. */ -static short module = MOD_GUI; +/* static short module = MOD_GUI; */ +static short module = MOD_SX; /* for the moment... */ static int last_width = 0; static int last_stock_width = 0; @@ -161,30 +133,16 @@ static int last_stock_width = 0; static GSList *date_param = NULL; /** PROTOTYPES ******************************************************/ -static void gnc_register_redraw_all_cb (GnucashRegister *g_reg, gpointer data); -static void gnc_register_redraw_help_cb (GnucashRegister *g_reg, - gpointer data); -static void gnc_reg_refresh_toolbar(RegWindow *regData); -static void regDestroy(GNCLedgerDisplay *ledger); -static void gnc_register_check_close(RegWindow *regData); -void gnc_register_cut_cb(GtkWidget *w, gpointer data); -void gnc_register_copy_cb(GtkWidget *w, gpointer data); -void gnc_register_paste_cb(GtkWidget *w, gpointer data); -void gnc_register_cut_trans_cb(GtkWidget *w, gpointer data); -void gnc_register_copy_trans_cb(GtkWidget *w, gpointer data); -void gnc_register_paste_trans_cb(GtkWidget *w, gpointer data); + +static void gnc_register_help_changed_cb( GNCSplitReg *gsr, gpointer data ); + void gnc_register_start_recn_cb(GtkWidget *w, gpointer data); void gnc_register_xfer_cb(GtkWidget *w, gpointer data); void gnc_register_stock_split_cb (GtkWidget * w, gpointer data); void gnc_register_edit_cb(GtkWidget *w, gpointer data); void gnc_register_help_cb(GtkWidget *w, gpointer data); void gnc_register_new_account_cb(GtkWidget * w, gpointer data); -void gnc_register_reinitialize_trans_cb(GtkWidget *w, gpointer data); -void gnc_register_delete_trans_cb(GtkWidget *w, gpointer data); -void gnc_register_duplicate_trans_cb(GtkWidget *w, gpointer data); -void gnc_register_recur_cb(GtkWidget *w, gpointer data); -void gnc_register_record_trans_cb(GtkWidget *w, gpointer data); -void gnc_register_cancel_trans_cb(GtkWidget *w, gpointer data); + void gnc_register_close_cb(GtkWidget *w, gpointer data); void gnc_register_exit_cb(GtkWidget *w, gpointer data); void gnc_register_report_account_cb(GtkWidget *w, gpointer data); @@ -195,39 +153,37 @@ void gnc_register_date_show_all_cb(GtkWidget *w, gpointer data); void gnc_register_today_cb(GtkWidget *w, gpointer data); void gnc_register_date_toggle_cb(GtkToggleButton *toggle, gpointer data); void gnc_register_date_range_cb(GtkWidget *w, gpointer data); -void gnc_register_expand_trans_menu_cb(GtkWidget *widget, gpointer data); -void gnc_register_expand_trans_toolbar_cb(GtkWidget *widget, gpointer data); -void gnc_register_new_trans_cb(GtkWidget *widget, gpointer data); -void gnc_register_jump_cb(GtkWidget *widget, gpointer data); + void gnc_register_print_check_cb(GtkWidget * widget, gpointer data); void gnc_ui_find_transactions_cb (GtkWidget *widget, gpointer data); + void gnc_register_toolbar_cb(GtkWidget *widget, gpointer data); void gnc_register_summarybar_cb(GtkWidget *widget, gpointer data); void gnc_register_statusbar_cb(GtkWidget *widget, gpointer data); + void gnc_register_gl_cb(GtkWidget *widget, gpointer data); void gnc_register_prices_cb(GtkWidget *widget, gpointer data); void gnc_register_commodities_cb(GtkWidget *widget, gpointer data); void gnc_register_fincalc_cb(GtkWidget *widget, gpointer data); -void gnc_register_style_ledger_cb (GtkWidget *w, gpointer data); -void gnc_register_style_auto_ledger_cb (GtkWidget *w, gpointer data); -void gnc_register_style_journal_cb (GtkWidget *w, gpointer data); -void gnc_register_double_line_cb (GtkWidget *w, gpointer data); -void gnc_register_sort_standard_cb (GtkWidget *w, gpointer data); -void gnc_register_sort_date_cb (GtkWidget *w, gpointer data); -void gnc_register_sort_date_entered_cb (GtkWidget *w, gpointer data); -void gnc_register_sort_date_reconciled_cb (GtkWidget *w, gpointer data); -void gnc_register_sort_num_cb (GtkWidget *w, gpointer data); -void gnc_register_sort_amount_cb (GtkWidget *w, gpointer data); -void gnc_register_sort_memo_cb (GtkWidget *w, gpointer data); -void gnc_register_sort_desc_cb (GtkWidget *w, gpointer data); + void gnc_register_scrub_all_cb (GtkWidget *widget, gpointer data); void gnc_register_scrub_current_cb (GtkWidget *widget, gpointer data); -void gnc_register_record_cb (GnucashRegister *reg, gpointer data); gboolean gnc_register_delete_cb(GtkWidget *widget, GdkEvent *event, gpointer data); void gnc_register_destroy_cb(GtkWidget *widget, gpointer data); void gnc_register_size_allocate (GtkWidget *widget, GtkAllocation *allocation, gpointer user_data); +static void gnc_register_setup_menu_widgets( RegWindow *regData, GladeXML *xml ); +static GtkWidget* gnc_register_setup_toolbar( RegWindow *regData ); + +static void gnc_register_insert_cloned_toolbar_elt( GtkToolbar *dstToolbar, + GtkToolbar *srcToolbar, + GtkWidget *srcWidget, + gchar *tooltip, + gpointer callback, + gpointer user_data, + gint idx ); + static gboolean gnc_register_include_date(RegWindow *regData, time_t date); @@ -241,13 +197,12 @@ static gboolean gnc_register_include_date(RegWindow *regData, time_t date); RegWindow * regWindowSimple (Account *account) { - RegWindow *result = NULL; - GNCLedgerDisplay * ledger = gnc_ledger_display_simple (account); + GNCLedgerDisplay * ledger = gnc_ledger_display_simple( account ); - if (ledger != NULL) - result = regWindowLedger (ledger); - - return result; + if (ledger == NULL) + return NULL; + + return regWindowLedger( ledger ); } @@ -261,23 +216,17 @@ regWindowSimple (Account *account) RegWindow * regWindowAccGroup (Account *account) { - RegWindow *result = NULL; GNCLedgerDisplay * ledger = gnc_ledger_display_subaccounts (account); - if (ledger != NULL) - result = regWindowLedger (ledger); - - return result; + if (ledger == NULL) + return NULL; + + return regWindowLedger (ledger); } - -/********************************************************************\ - * gnc_register_raise * - * raise an existing register window to the front * - * * - * Args: regData - the register data structure * - * Return: nothing * -\********************************************************************/ +/** + * Raise an existing register window to the front. + **/ void gnc_register_raise (RegWindow *regData) { @@ -287,266 +236,7 @@ gnc_register_raise (RegWindow *regData) if (regData->window == NULL) return; - gtk_window_present (GTK_WINDOW(regData->window)); -} - - -/********************************************************************\ - * gnc_register_jump_to_split * - * move the cursor to the split, if present in register * - * * - * Args: regData - the register data structure * - * split - the split to jump to * - * Return: nothing * -\********************************************************************/ -void -gnc_register_jump_to_split(RegWindow *regData, Split *split) -{ - Transaction *trans; - VirtualCellLocation vcell_loc; - SplitRegister *reg; - - if (!regData) return; - - trans = xaccSplitGetParent(split); - if (trans != NULL) - if (gnc_register_include_date(regData, xaccTransGetDate(trans))) - { - gnc_ledger_display_refresh (regData->ledger); - } - - reg = gnc_ledger_display_get_split_register (regData->ledger); - - if (gnc_split_register_get_split_virt_loc(reg, split, &vcell_loc)) - gnucash_register_goto_virt_cell(regData->reg, vcell_loc); -} - - -/********************************************************************\ - * gnc_register_jump_to_split_amount * - * move the cursor to the split in the non-blank amount column * - * * - * Args: regData - the register data structure * - * split - the split to jump to * - * Return: nothing * -\********************************************************************/ -void -gnc_register_jump_to_split_amount(RegWindow *regData, Split *split) -{ - Transaction *trans; - VirtualLocation virt_loc; - SplitRegister *reg; - - if (!regData) return; - - trans = xaccSplitGetParent(split); - if (trans != NULL) - if (gnc_register_include_date(regData, xaccTransGetDate(trans))) - { - gnc_ledger_display_refresh (regData->ledger); - } - - reg = gnc_ledger_display_get_split_register (regData->ledger); - - if (gnc_split_register_get_split_amount_virt_loc (reg, split, &virt_loc)) - gnucash_register_goto_virt_loc (regData->reg, virt_loc); -} - - -static void -gnc_register_change_style (RegWindow *regData, SplitRegisterStyle style) -{ - SplitRegister *reg = gnc_ledger_display_get_split_register (regData->ledger); - - if (style == reg->style) - return; - - gnc_split_register_config (reg, reg->type, style, reg->use_double_line); - - gnc_ledger_display_refresh (regData->ledger); -} - -void -gnc_register_style_ledger_cb (GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - - if (!GTK_CHECK_MENU_ITEM (w)->active) - return; - - gnc_register_change_style (regData, REG_STYLE_LEDGER); -} - -void -gnc_register_style_auto_ledger_cb (GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - - if (!GTK_CHECK_MENU_ITEM (w)->active) - return; - - gnc_register_change_style (regData, REG_STYLE_AUTO_LEDGER); -} - -void -gnc_register_style_journal_cb (GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - - if (!GTK_CHECK_MENU_ITEM (w)->active) - return; - - gnc_register_change_style (regData, REG_STYLE_JOURNAL); -} - -void -gnc_register_double_line_cb (GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - SplitRegister *reg = gnc_ledger_display_get_split_register (regData->ledger); - gboolean use_double_line; - - use_double_line = GTK_CHECK_MENU_ITEM(w)->active; - - if (use_double_line == reg->use_double_line) - return; - - gnc_split_register_config (reg, reg->type, reg->style, use_double_line); - - gnc_ledger_display_refresh (regData->ledger); -} - -static void -gnc_register_sort (RegWindow *regData, sort_type_t sort_code) -{ - Query *query = gnc_ledger_display_get_query (regData->ledger); - gboolean show_present_divider = FALSE; - GSList *p1 = NULL, *p2 = NULL, *p3 = NULL, *standard; - SplitRegister *reg; - - if (regData->sort_type == sort_code) - return; - - standard = g_slist_prepend (NULL, QUERY_DEFAULT_SORT); - - switch (sort_code) - { - case BY_STANDARD: - p1 = standard; - show_present_divider = TRUE; - break; - case BY_DATE: - p1 = g_slist_prepend (p1, TRANS_DATE_POSTED); - p1 = g_slist_prepend (p1, SPLIT_TRANS); - p2 = standard; - show_present_divider = TRUE; - break; - case BY_DATE_ENTERED: - p1 = g_slist_prepend (p1, TRANS_DATE_ENTERED); - p1 = g_slist_prepend (p1, SPLIT_TRANS); - p2 = standard; - break; - case BY_DATE_RECONCILED: - p1 = g_slist_prepend (p1, SPLIT_RECONCILE); - p2 = g_slist_prepend (p2, SPLIT_DATE_RECONCILED); - p3 = standard; - break; - case BY_NUM: - p1 = g_slist_prepend (p1, TRANS_NUM); - p1 = g_slist_prepend (p1, SPLIT_TRANS); - p2 = standard; - break; - case BY_AMOUNT: - p1 = g_slist_prepend (p1, SPLIT_VALUE); - p2 = standard; - break; - case BY_MEMO: - p1 = g_slist_prepend (p1, SPLIT_MEMO); - p2 = standard; - break; - case BY_DESC: - p1 = g_slist_prepend (p1, TRANS_DESCRIPTION); - p1 = g_slist_prepend (p1, SPLIT_TRANS); - p2 = standard; - break; - default: - g_slist_free (standard); - g_return_if_fail (FALSE); - } - - gncQuerySetSortOrder (query, p1, p2, p3); - - reg = gnc_ledger_display_get_split_register (regData->ledger); - - gnc_split_register_show_present_divider (reg, show_present_divider); - - regData->sort_type = sort_code; - - gnc_ledger_display_refresh(regData->ledger); -} - -void -gnc_register_sort_standard_cb(GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - - gnc_register_sort(regData, BY_STANDARD); -} - -void -gnc_register_sort_date_cb(GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - - gnc_register_sort(regData, BY_DATE); -} - -void -gnc_register_sort_date_entered_cb(GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - - gnc_register_sort(regData, BY_DATE_ENTERED); -} - -void -gnc_register_sort_date_reconciled_cb(GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - - gnc_register_sort(regData, BY_DATE_RECONCILED); -} - -void -gnc_register_sort_num_cb(GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - - gnc_register_sort(regData, BY_NUM); -} - -void -gnc_register_sort_amount_cb(GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - - gnc_register_sort(regData, BY_AMOUNT); -} - -void -gnc_register_sort_memo_cb(GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - - gnc_register_sort(regData, BY_MEMO); -} - -void -gnc_register_sort_desc_cb(GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - - gnc_register_sort(regData, BY_DESC); + gtk_window_present( GTK_WINDOW(regData->window) ); } static time_t @@ -634,7 +324,7 @@ gnc_register_set_date_range(RegWindow *regData) if (!regData->ledger) return; - query = gnc_ledger_display_get_query (regData->ledger); + query = gnc_ledger_display_get_query( regData->ledger ); if (!query) return; @@ -775,7 +465,6 @@ gnc_register_date_window (RegWindow *regData, gboolean show_all) regDateData = g_new0(RegDateWindow, 1); regData->date_window = regDateData; - xml = gnc_glade_xml_new ("register.glade", "Date Range"); dialog = glade_xml_get_widget (xml, "Date Range"); regDateData->window = dialog; @@ -881,238 +570,56 @@ gnc_ui_find_transactions_cb (GtkWidget *widget, gpointer data) gnc_ui_find_transactions_dialog_create (NULL); } -static GtkWidget * -add_summary_label (GtkWidget *summarybar, const char *label_str) +void +gnc_register_print_check_cb(GtkWidget * widget, gpointer data) { - GtkWidget *hbox; - GtkWidget *label; - - hbox = gtk_hbox_new(FALSE, 2); - gtk_box_pack_start (GTK_BOX(summarybar), hbox, FALSE, FALSE, 5); + RegWindow * reg_data = data; + SplitRegister * reg = + gnc_ledger_display_get_split_register (reg_data->ledger); + Split * split = gnc_split_register_get_current_split(reg); + Transaction * trans = xaccSplitGetParent(split); - label = gtk_label_new (label_str); - gtk_misc_set_alignment (GTK_MISC(label), 1.0, 0.5); - gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); + const char * payee; + const char * memo; + gnc_numeric amount; + time_t date; - label = gtk_label_new (""); - gtk_misc_set_alignment (GTK_MISC(label), 1.0, 0.5); - gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); + if(split && trans) + { + payee = xaccTransGetDescription(trans); + memo = xaccTransGetNotes(trans); + if (memo == NULL) + memo = ""; + amount = xaccSplitGetAmount(split); + amount = gnc_numeric_abs (amount); + date = xaccTransGetDate(trans); - return label; + gnc_ui_print_check_dialog_create(reg_data, payee, amount, date, memo); + } } -static GtkWidget * -gnc_register_create_summary_bar (RegWindow *regData) +void +gnc_register_scrub_all_cb (GtkWidget *widget, gpointer data) { - gboolean has_shares; - GtkWidget *summarybar; + RegWindow *regData = data; + Query *query = gnc_ledger_display_get_query (regData->ledger); + AccountGroup *root; + GList *node; - regData->cleared_label = NULL; - regData->balance_label = NULL; - regData->reconciled_label = NULL; - regData->future_label = NULL; - regData->shares_label = NULL; - regData->value_label = NULL; + if (query == NULL) + return; - if (gnc_ledger_display_type (regData->ledger) >= LD_SUBACCOUNT) - return NULL; + gnc_suspend_gui_refresh (); + root = gnc_get_current_group (); + for (node = xaccQueryGetSplits (query); node; node = node->next) { - Account *account; - GNCAccountType atype; + Split *split = node->data; + Transaction *trans = xaccSplitGetParent (split); - account = gnc_ledger_display_leader (regData->ledger); - atype = xaccAccountGetType (account); - - switch (atype) - { - case STOCK: - case MUTUAL: - case CURRENCY: - has_shares = TRUE; - break; - - default: - has_shares = FALSE; - break; - } - } - - summarybar = gtk_hbox_new (FALSE, 4); - - if (!has_shares) - { - regData->balance_label = add_summary_label (summarybar, _("Present:")); - regData->future_label = add_summary_label (summarybar, _("Future:")); - regData->cleared_label = add_summary_label (summarybar, _("Cleared:")); - regData->reconciled_label = add_summary_label (summarybar, - _("Reconciled:")); - } - else - { - regData->shares_label = add_summary_label (summarybar, _("Shares:")); - regData->value_label = add_summary_label (summarybar, - _("Current Value:")); - } - - return summarybar; -} - -void -gnc_register_jump_to_blank (RegWindow *regData) -{ - SplitRegister *reg = gnc_ledger_display_get_split_register (regData->ledger); - VirtualCellLocation vcell_loc; - Split *blank; - - blank = gnc_split_register_get_blank_split (reg); - if (blank == NULL) - return; - - if (gnc_split_register_get_split_virt_loc (reg, blank, &vcell_loc)) - gnucash_register_goto_virt_cell (regData->reg, vcell_loc); -} - - -void -gnc_register_expand_trans_menu_cb (GtkWidget *widget, gpointer data) -{ - RegWindow *regData = data; - gboolean expand; - SplitRegister *reg; - - if (!regData) - return; - - reg = gnc_ledger_display_get_split_register (regData->ledger); - - expand = GTK_CHECK_MENU_ITEM (widget)->active; - - gnc_split_register_expand_current_trans (reg, expand); -} - -void -gnc_register_expand_trans_toolbar_cb (GtkWidget *widget, gpointer data) -{ - RegWindow *regData = data; - gboolean expand; - SplitRegister *reg; - - reg = gnc_ledger_display_get_split_register (regData->ledger); - - expand = GTK_TOGGLE_BUTTON (widget)->active; - - gnc_split_register_expand_current_trans (reg, expand); -} - -void -gnc_register_new_trans_cb (GtkWidget *widget, gpointer data) -{ - RegWindow *regData = data; - SplitRegister *reg; - - reg = gnc_ledger_display_get_split_register (regData->ledger); - - if (gnc_split_register_save (reg, TRUE)) - gnc_split_register_redraw (reg); - - gnc_register_jump_to_blank (regData); -} - -void -gnc_register_jump_cb(GtkWidget *widget, gpointer data) -{ - RegWindow *regData = data; - SplitRegister *reg; - Account *account; - Account *leader; - Split *split; - - reg = gnc_ledger_display_get_split_register (regData->ledger); - - split = gnc_split_register_get_current_split (reg); - if (split == NULL) - return; - - account = xaccSplitGetAccount(split); - if (account == NULL) - return; - - leader = gnc_ledger_display_leader (regData->ledger); - - if (account == leader) - { - split = xaccSplitGetOtherSplit(split); - if (split == NULL) - return; - - account = xaccSplitGetAccount(split); - if (account == NULL) - return; - if (account == leader) - return; - } - - regData = regWindowSimple(account); - if (regData == NULL) - return; - - gnc_register_raise (regData); - gnc_register_jump_to_split (regData, split); -} - -void -gnc_register_print_check_cb(GtkWidget * widget, gpointer data) -{ - RegWindow * reg_data = data; - SplitRegister * reg = - gnc_ledger_display_get_split_register (reg_data->ledger); - Split * split = gnc_split_register_get_current_split(reg); - Transaction * trans = xaccSplitGetParent(split); - - const char * payee; - const char * memo; - gnc_numeric amount; - time_t date; - - if(split && trans) - { - payee = xaccTransGetDescription(trans); - memo = xaccTransGetNotes(trans); - if (memo == NULL) - memo = ""; - amount = xaccSplitGetAmount(split); - amount = gnc_numeric_abs (amount); - date = xaccTransGetDate(trans); - - gnc_ui_print_check_dialog_create(reg_data, payee, amount, date, memo); - } -} - - -void -gnc_register_scrub_all_cb (GtkWidget *widget, gpointer data) -{ - RegWindow *regData = data; - Query *query = gnc_ledger_display_get_query (regData->ledger); - AccountGroup *root; - GList *node; - - if (query == NULL) - return; - - gnc_suspend_gui_refresh (); - - root = gnc_get_current_group (); - - for (node = xaccQueryGetSplits (query); node; node = node->next) - { - Split *split = node->data; - Transaction *trans = xaccSplitGetParent (split); - - xaccTransScrubOrphans (trans, root, gnc_get_current_book ()); - xaccTransScrubImbalance (trans, root, NULL, gnc_get_current_book ()); - } + xaccTransScrubOrphans (trans, root, gnc_get_current_book ()); + xaccTransScrubImbalance (trans, root, NULL, gnc_get_current_book ()); + } gnc_resume_gui_refresh (); } @@ -1132,203 +639,18 @@ gnc_register_scrub_current_cb (GtkWidget *widget, gpointer data) return; gnc_suspend_gui_refresh (); - root = gnc_get_current_group (); - xaccTransScrubOrphans (trans, root, gnc_get_current_book ()); xaccTransScrubImbalance (trans, root, NULL, gnc_get_current_book ()); - gnc_resume_gui_refresh (); } -static void -gnc_register_setup_menu_widgets(RegWindow *regData, GladeXML *xml) -{ - /* Make sure the right style radio item is active */ - { - SplitRegister *reg; - GtkWidget *widget; - char *widget_name; - - reg = gnc_ledger_display_get_split_register (regData->ledger); - - switch (reg->style) - { - default: - case REG_STYLE_LEDGER: - widget_name = "menu_style_basic_ledger"; - break; - case REG_STYLE_AUTO_LEDGER: - widget_name = "menu_style_auto_split_ledger"; - break; - case REG_STYLE_JOURNAL: - widget_name = "menu_style_transaction_journal"; - break; - } - - /* registers with more than one account can only use journal mode */ - if (reg->type >= NUM_SINGLE_REGISTER_TYPES) - { - widget = glade_xml_get_widget(xml, "menu_style_basic_ledger"); - gtk_widget_set_sensitive (widget, FALSE); - - widget = glade_xml_get_widget(xml, "menu_style_auto_split_ledger"); - gtk_widget_set_sensitive (widget, FALSE); - } - - widget = glade_xml_get_widget(xml, widget_name); - - gtk_signal_handler_block_by_data(GTK_OBJECT(widget), regData); - - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), TRUE); - - gtk_signal_handler_unblock_by_data(GTK_OBJECT(widget), regData); - } -} - - -static GtkWidget * -gnc_register_create_popup_menu (RegWindow *regData) -{ - GtkWidget *popup, *menuitem; - GladeXML *xml; - - xml = gnc_glade_xml_new ("register.glade", "Check Register Popup Menu"); - - popup = glade_xml_get_widget (xml, "Check Register Popup Menu"); - - glade_xml_signal_autoconnect_full(xml, gnc_glade_autoconnect_full_func, - regData); - - /* Glade insists on making this a tearoff menu. */ - if (gnome_preferences_get_menus_have_tearoff()) { - GtkMenuShell *ms = GTK_MENU_SHELL(popup); - GtkWidget *tearoff; - - tearoff = g_list_nth_data(ms->children, 0); - ms->children = g_list_remove(ms->children, tearoff); - gtk_widget_destroy(tearoff); - } - - regData->split_popup_check = glade_xml_get_widget (xml, "popup_splits"); - - if (regData->read_only) { - menuitem = glade_xml_get_widget (xml, "popup_delete"); - gtk_widget_set_sensitive(menuitem, FALSE); - menuitem = glade_xml_get_widget (xml, "popup_duplicate"); - gtk_widget_set_sensitive(menuitem, FALSE); - menuitem = glade_xml_get_widget (xml, "popup_reinitialize"); - gtk_widget_set_sensitive(menuitem, FALSE); - } - return popup; -} - -static void -gnc_register_record (RegWindow *regData) -{ - SplitRegister *reg; - Transaction *trans; - - reg = gnc_ledger_display_get_split_register (regData->ledger); - - trans = gnc_split_register_get_current_trans (reg); - - if (!gnc_split_register_save (reg, TRUE)) - return; - - if (trans != NULL) - gnc_register_include_date (regData, xaccTransGetDate(trans)); - - gnc_split_register_redraw (reg); -} - -static gboolean -gnc_register_match_trans_row (VirtualLocation virt_loc, - gpointer user_data) -{ - RegWindow *regData = user_data; - CursorClass cursor_class; - SplitRegister *sr; - - sr = gnc_ledger_display_get_split_register (regData->ledger); - cursor_class = gnc_split_register_get_cursor_class (sr, virt_loc.vcell_loc); - - return (cursor_class == CURSOR_CLASS_TRANS); -} - -static void -gnc_register_goto_next_trans_row (RegWindow *regData) -{ - gnucash_register_goto_next_matching_row (regData->reg, - gnc_register_match_trans_row, - regData); -} - -static void -gnc_register_enter (RegWindow *regData, gboolean next_transaction) -{ - SplitRegister *sr = gnc_ledger_display_get_split_register (regData->ledger); - gboolean goto_blank; - - goto_blank = gnc_lookup_boolean_option("Register", - "'Enter' moves to blank transaction", - FALSE); - - /* If we are in single or double line mode and we hit enter - * on the blank split, go to the blank split instead of the - * next row. This prevents the cursor from jumping around - * when you are entering transactions. */ - if (!goto_blank && !next_transaction) - { - SplitRegisterStyle style = sr->style; - - if (style == REG_STYLE_LEDGER) - { - Split *blank_split; - - blank_split = gnc_split_register_get_blank_split(sr); - if (blank_split != NULL) - { - Split *current_split; - - current_split = gnc_split_register_get_current_split(sr); - - if (blank_split == current_split) - goto_blank = TRUE; - } - } - } - - /* First record the transaction. This will perform a refresh. */ - gnc_register_record (regData); - - if (!goto_blank && next_transaction) - gnc_split_register_expand_current_trans (sr, FALSE); - - /* Now move. */ - if (goto_blank) - gnc_register_jump_to_blank (regData); - else if (next_transaction) - gnc_register_goto_next_trans_row (regData); - else - gnucash_register_goto_next_virt_row (regData->reg); -} - -void -gnc_register_record_cb (GnucashRegister *reg, gpointer data) -{ - RegWindow *regData = data; - - gnc_register_enter (regData, FALSE); -} - gboolean gnc_register_delete_cb(GtkWidget *widget, GdkEvent *event, gpointer data) { RegWindow *regData = data; - gnc_register_check_close (regData); - + gnc_split_reg_check_close(regData->gsr); gnc_ledger_display_close (regData->ledger); return TRUE; /* don't close */ @@ -1338,10 +660,6 @@ void gnc_register_destroy_cb(GtkWidget *widget, gpointer data) { RegWindow *regData = data; - SCM id; - - id = regData->toolbar_change_callback_id; - gnc_unregister_option_change_callback_id(id); if (regData->date_window != NULL) { @@ -1355,19 +673,6 @@ gnc_register_destroy_cb(GtkWidget *widget, gpointer data) if (regData->pcd) gnc_ui_print_check_dialog_destroy(regData->pcd); g_free(regData); - - DEBUG ("destroyed RegWindow"); -} - -static gncUIWidget -gnc_register_get_parent(GNCLedgerDisplay *ledger) -{ - RegWindow *regData = gnc_ledger_display_get_user_data (ledger); - - if (regData == NULL) - return NULL; - - return regData->window; } static char * @@ -1443,163 +748,28 @@ gnc_reg_set_window_name (RegWindow *regData) if (regData == NULL) return; - windowname = gnc_reg_get_name (regData, TRUE); + windowname = gnc_reg_get_name( regData, TRUE ); + gtk_window_set_title( GTK_WINDOW(regData->window), windowname ); + g_free( windowname ); +} + +void +gnc_register_size_allocate (GtkWidget *widget, + GtkAllocation *allocation, + gpointer user_data) +{ + RegWindow *regData = user_data; + + /* HACK ALERT. this seems to be the only thing to get the + * freekin register window to stop freekin resizing itself + * all the freekin time. */ + + if (regData->width == allocation->width) + return; - gtk_window_set_title (GTK_WINDOW(regData->window), windowname); + regData->width = allocation->width; - g_free (windowname); -} - -/********************************************************************\ - * gnc_reg_get_placeholder * - * opens up a register window for a group of Accounts * - * * - * Args: regData - the register window instance * - * Return: GNCPlaceholderType - indicate presence and type * - * of placeholder accounts * -\********************************************************************/ -static GNCPlaceholderType -gnc_reg_get_placeholder (RegWindow *regData) -{ - Account *leader; - SplitRegister *reg; - gboolean single_account; - - if (regData == NULL) - return PLACEHOLDER_NONE; - - reg = gnc_ledger_display_get_split_register (regData->ledger); - - switch (reg->type) - { - case GENERAL_LEDGER: - case INCOME_LEDGER: - case PORTFOLIO_LEDGER: - case SEARCH_LEDGER: - single_account = FALSE; - break; - default: - single_account = TRUE; - break; - } - - leader = gnc_ledger_display_leader (regData->ledger); - if (leader == NULL) - return PLACEHOLDER_NONE; - if (single_account) { - if (xaccAccountGetPlaceholder (leader)) - return PLACEHOLDER_THIS; - return PLACEHOLDER_NONE; - } - return xaccAccountGetDescendantPlaceholder (leader); -} - -/********************************************************************\ - * gtk_callback_bug_workaround * - * Gtk has occasional problems with performing function as part * - * of a callback. This routine gets called via a timer callback * - * to get it out of the data path with the problem. * - * * - * Args: argp - a pointer to the window/string for the dialog * - * Return: none * -\********************************************************************/ -typedef struct dialog_args { - RegWindow *regData; - gchar *string; -} dialog_args; - -static gint -gtk_callback_bug_workaround (gpointer argp) -{ - dialog_args *args = argp; - - gnc_warning_dialog_parented(args->regData->window, args->string); - free(args); - return FALSE; -} - -/********************************************************************\ - * gnc_reg_determine_read_only * - * determines whether this register window should be read-only * - * * - * Args: regData - the register window instance * - * Return: none * -\********************************************************************/ -static void -gnc_reg_determine_read_only (RegWindow *regData) -{ - dialog_args *args = g_malloc(sizeof(dialog_args)); - gchar *old_title, *new_title; - SplitRegister *reg; - GtkArg objarg; - - switch (gnc_reg_get_placeholder(regData)) { - case PLACEHOLDER_NONE: - regData->read_only = FALSE; - return; - - case PLACEHOLDER_THIS: - args->string = _("This account may not be edited. If you want\n" - "to edit transactions in this register, please\n" - "open the account options and turn off the\n" - "placeholder checkbox."); - break; - - default: - args->string = _("One of the sub-accounts selected may not be\n" - "edited. If you want to edit transactions in\n" - "this register, please open the sub-account\n" - "options and turn off the placeholder checkbox.\n" - "You may also open an individual account instead\n" - "of a set of accounts."); - break; - } - regData->read_only = TRUE; - - /* Put up a warning dialog */ - args->regData = regData; - gtk_timeout_add (250, gtk_callback_bug_workaround, args); /* 0.25 seconds */ - - /* Make the contents immutable */ - reg = gnc_ledger_display_get_split_register (regData->ledger); - gnc_split_register_set_read_only (reg, TRUE); - - /* Rename the window title */ - objarg.name = "GtkWindow::title"; - gtk_object_arg_get(GTK_OBJECT(regData->window), &objarg, NULL); - old_title = GTK_VALUE_STRING(objarg); - new_title = g_strdup_printf(_("%s [Read-Only]"), old_title); - gtk_object_set(GTK_OBJECT(regData->window), - "GtkWindow::title", new_title, NULL); - g_free(old_title); - g_free(new_title); -} - -static void -gnc_toolbar_change_cb (void *data) -{ - RegWindow *regData = data; - - gnc_reg_refresh_toolbar (regData); -} - -void -gnc_register_size_allocate (GtkWidget *widget, - GtkAllocation *allocation, - gpointer user_data) -{ - RegWindow *regData = user_data; - - /* HACK ALERT. this seems to be the only thing to get the - * freekin register window to stop freekin resizing itself - * all the freekin time. */ - - if (regData->width == allocation->width) - return; - - regData->width = allocation->width; - - gtk_window_set_default_size (GTK_WINDOW(regData->window), regData->width, 0); + gtk_window_set_default_size (GTK_WINDOW(regData->window), regData->width, 0); } /********************************************************************\ @@ -1610,53 +780,57 @@ gnc_register_size_allocate (GtkWidget *widget, * Return: regData - the register window instance * \********************************************************************/ RegWindow * -regWindowLedger (GNCLedgerDisplay *ledger) +regWindowLedger( GNCLedgerDisplay *ledger ) { SplitRegister *reg; RegWindow *regData; + GtkWidget *gsr; GtkWidget *register_window; - GtkWidget *table_frame, *widget; + GtkWidget *table_frame; gboolean show_all; gboolean has_date; GladeXML *xml; + gint numRows; + /* FIXME: This no longer holds, but something like it [attaching the window + * as user_data to the split_reg] should exist. */ reg = gnc_ledger_display_get_split_register (ledger); - regData = gnc_ledger_display_get_user_data (ledger); - if (regData != NULL) - return regData; - - regData = g_new0 (RegWindow, 1); + regData = g_new0( RegWindow, 1 ); + regData->ledger = ledger; - gnc_ledger_display_set_user_data (ledger, regData); + xml = gnc_glade_xml_new( "register.glade", "Check Register" ); + register_window = glade_xml_get_widget( xml, "Check Register" ); + regData->window = register_window; - gnc_ledger_display_set_handlers (ledger, - regDestroy, - gnc_register_get_parent); + glade_xml_signal_autoconnect_full( xml, + gnc_glade_autoconnect_full_func, + regData ); - xml = gnc_glade_xml_new ("register.glade", "Check Register"); - register_window = glade_xml_get_widget (xml, "Check Register"); - glade_xml_signal_autoconnect_full(xml, gnc_glade_autoconnect_full_func, - regData); - /* libglade should do this next line */ - GNOME_APP(register_window)->menubar = glade_xml_get_widget (xml, "menubar1"); - gnc_extensions_menu_setup_with_data(GNOME_APP(register_window), - WINDOW_NAME_REGISTER, - regData); + numRows = (guint)gnc_lookup_number_option ( "Register", + "Number of Rows", 20.0 ); + gsr = gnc_split_reg_new( ledger, GTK_WINDOW(register_window), numRows, + ( CREATE_TOOLBAR + | CREATE_MENUS + | CREATE_POPUP + | CREATE_SUMMARYBAR ), + 0 ); + regData->gsr = GNC_SPLIT_REG(gsr); - regData->ledger = ledger; - regData->window = register_window; - regData->sort_type = BY_STANDARD; - regData->width = -1; + /* libglade should do this next line */ + GNOME_APP(register_window)->menubar = glade_xml_get_widget( xml, "gnc_register_menubar" ); + gnc_extensions_menu_setup_with_data( GNOME_APP(register_window), + WINDOW_NAME_REGISTER, + regData ); - gnc_reg_set_window_name(regData); - gnc_reg_determine_read_only(regData); + gnc_reg_set_window_name( regData ); - show_all = gnc_lookup_boolean_option ("Register", + show_all = gnc_lookup_boolean_option( "Register", "Show All Transactions", - TRUE); + TRUE ); + /* Where does date_param come from? A file-static? Ick. -- jsled */ if (date_param == NULL) { date_param = g_slist_prepend (NULL, TRANS_DATE_POSTED); date_param = g_slist_prepend (date_param, SPLIT_TRANS); @@ -1664,134 +838,53 @@ regWindowLedger (GNCLedgerDisplay *ledger) { Query *q = gnc_ledger_display_get_query (regData->ledger); - has_date = gncQueryHasTermType (q, date_param); } if (has_date) show_all = FALSE; - regData->date_window = gnc_register_date_window (regData, show_all); + regData->date_window = gnc_register_date_window( regData, show_all ); if (reg->type != SEARCH_LEDGER && !has_date) - gnc_register_set_date_range (regData); + gnc_register_set_date_range( regData ); /* Now that we have a date range, remove any existing * maximum on the number of splits returned. */ - xaccQuerySetMaxSplits (gnc_ledger_display_get_query (regData->ledger), -1); + xaccQuerySetMaxSplits( gnc_ledger_display_get_query(regData->ledger), -1 ); /* The status bar */ - { - regData->statusbar = glade_xml_get_widget(xml, "appbar"); - } + regData->statusbar = glade_xml_get_widget( xml, "appbar" ); + gtk_signal_connect( GTK_OBJECT(regData->gsr), "help-changed", + GTK_SIGNAL_FUNC( gnc_register_help_changed_cb ), + regData ); /* The menu bar */ - { - regData->double_line_check = - glade_xml_get_widget (xml, "menu_style_double_line"); - regData->split_menu_check = - glade_xml_get_widget (xml, "menu_splits"); - - gnc_register_setup_menu_widgets(regData, xml); - if (regData->read_only) { - widget = glade_xml_get_widget (xml, "menu_paste"); - gtk_widget_set_sensitive(widget, FALSE); - widget = glade_xml_get_widget (xml, "menu_cut_trans"); - gtk_widget_set_sensitive(widget, FALSE); - widget = glade_xml_get_widget (xml, "menu_paste_trans"); - gtk_widget_set_sensitive(widget, FALSE); - widget = glade_xml_get_widget (xml, "menu_delete"); - gtk_widget_set_sensitive(widget, FALSE); - widget = glade_xml_get_widget (xml, "menu_duplicate"); - gtk_widget_set_sensitive(widget, FALSE); - widget = glade_xml_get_widget (xml, "menu_reinitialize"); - gtk_widget_set_sensitive(widget, FALSE); - } - } + gnc_register_setup_menu_widgets( regData, xml ); /* The tool bar */ { - SCM id; - - regData->toolbar_dock = glade_xml_get_widget (xml, "toolbar_dock"); - regData->toolbar = glade_xml_get_widget (xml, "toolbar"); - regData->split_button = glade_xml_get_widget (xml, "toolbar_split"); - - id = gnc_register_option_change_callback(gnc_toolbar_change_cb, regData, - "General", "Toolbar Buttons"); - regData->toolbar_change_callback_id = id; - - if (regData->read_only) { - widget = glade_xml_get_widget (xml, "toolbar_delete"); - gtk_widget_set_sensitive(widget, FALSE); - widget = glade_xml_get_widget (xml, "toolbar_duplicate"); - gtk_widget_set_sensitive(widget, FALSE); + GtkWidget *toolbar = gnc_register_setup_toolbar( regData ); + regData->toolbar_dock = glade_xml_get_widget( xml, "toolbar_dock" ); + if ( toolbar ) { + gtk_widget_show_all( toolbar ); + gtk_container_add( GTK_CONTAINER(regData->toolbar_dock), toolbar ); } } /* The summary bar */ { - GtkWidget *summarybar = gnc_register_create_summary_bar (regData); - regData->summarybar_dock = glade_xml_get_widget (xml, "summarybar_dock"); - if (summarybar) { + GtkWidget *summarybar = gnc_split_reg_get_summarybar( GNC_SPLIT_REG(gsr) ); + regData->summarybar_dock = glade_xml_get_widget( xml, "summarybar_dock" ); + if ( summarybar ) { gtk_widget_show_all(summarybar); - gtk_container_add(GTK_CONTAINER(regData->summarybar_dock), summarybar); + gtk_container_add( GTK_CONTAINER(regData->summarybar_dock), summarybar ); } } - /* The CreateTable will do the actual gui init, returning a widget */ - { - GtkWidget *register_widget; - GtkWidget *popup; - guint num_rows; - - table_frame = glade_xml_get_widget(xml, "table_frame"); - - num_rows = (guint) gnc_lookup_number_option ("Register", - "Number of Rows", 20.0); - gnucash_register_set_initial_rows (num_rows); - - register_widget = gnucash_register_new (reg->table); - gnc_table_init_gui (register_widget, reg); - - gtk_container_add (GTK_CONTAINER(table_frame), register_widget); - - regData->reg = GNUCASH_REGISTER (register_widget); - GNUCASH_SHEET(regData->reg->sheet)->window = register_window; - - gtk_signal_connect (GTK_OBJECT(register_widget), "activate_cursor", - GTK_SIGNAL_FUNC(gnc_register_record_cb), regData); - gtk_signal_connect (GTK_OBJECT(register_widget), "redraw_all", - GTK_SIGNAL_FUNC(gnc_register_redraw_all_cb), regData); - gtk_signal_connect (GTK_OBJECT(register_widget), "redraw_help", - GTK_SIGNAL_FUNC(gnc_register_redraw_help_cb), regData); - - popup = gnc_register_create_popup_menu (regData); - gnucash_register_attach_popup (GNUCASH_REGISTER(register_widget), - popup, regData); - } - - { - gboolean use_double_line; - GtkCheckMenuItem *check; - - use_double_line = gnc_ledger_display_default_double_line (regData->ledger); - - /* be sure to initialize the gui elements associated with the cursor */ - gnc_split_register_config (reg, reg->type, reg->style, use_double_line); - - check = GTK_CHECK_MENU_ITEM (regData->double_line_check); - - gtk_signal_handler_block_by_func - (GTK_OBJECT (check), - GTK_SIGNAL_FUNC (gnc_register_double_line_cb), regData); - - gtk_check_menu_item_set_active (check, use_double_line); - - gtk_signal_handler_unblock_by_func - (GTK_OBJECT (check), - GTK_SIGNAL_FUNC (gnc_register_double_line_cb), regData); - } + /* The GNCSplitReg is a widget unto itself. */ + table_frame = glade_xml_get_widget(xml, "table_frame"); + gtk_container_add( GTK_CONTAINER(table_frame), GTK_WIDGET(regData->gsr) ); { int *width; @@ -1818,280 +911,232 @@ regWindowLedger (GNCLedgerDisplay *ledger) gtk_window_set_default_size (GTK_WINDOW(register_window), *width, 0); } - gtk_widget_show_all (register_window); - - gnc_split_register_show_present_divider (reg, TRUE); - - gnc_ledger_display_refresh (ledger); - gnc_reg_refresh_toolbar (regData); - - gnc_window_adjust_for_screen (GTK_WINDOW(register_window)); + gtk_widget_show_all( GTK_WIDGET(regData->gsr) ); + gnc_window_adjust_for_screen( GTK_WINDOW(register_window) ); return regData; } - -static void -gnc_reg_refresh_toolbar (RegWindow *regData) -{ - GtkToolbarStyle tbstyle; - - if ((regData == NULL) || (regData->toolbar == NULL)) - return; - - tbstyle = gnc_get_toolbar_style (); - - gtk_toolbar_set_style (GTK_TOOLBAR (regData->toolbar), tbstyle); -} - - -static gnc_numeric -gnc_account_present_balance (Account *account) -{ - GList *list; - GList *node; - time_t today; - struct tm *tm; - - if (!account) - return gnc_numeric_zero (); - - today = time (NULL); - - tm = localtime (&today); - - tm->tm_hour = 23; - tm->tm_min = 59; - tm->tm_sec = 59; - tm->tm_isdst = -1; - - today = mktime (tm); - - list = xaccAccountGetSplitList (account); - - for (node = g_list_last (list); node; node = node->prev) - { - Split *split = node->data; - - if (xaccTransGetDate (xaccSplitGetParent (split)) <= today) - return xaccSplitGetBalance (split); +static +void +gnc_register_setup_menu_widgets( RegWindow *regData, GladeXML *xml ) +{ + int adj = 0; + GtkWidget *mbar, *menu, *regMenu, *regMenuItem, *tmpMi; + + /* Get our menu bar from glade. */ + mbar = glade_xml_get_widget( xml, "gnc_register_menubar" ); + + /* General plan: + * . get the GNCSplitReg menu + * . get the RegWindow menu + * . get, remove the additional menu[item] from the RegWindow's menu + * . insert into the GNCSplitReg's menu. + * . remove the RegWindow menu from the menu bar, saving it's index. + * . insert the GNCSplitReg menu at the same index. + * . destroy now-unused widgets. */ + + if ( gnome_preferences_get_menus_have_tearoff() ) { + /* offset by one for the tearoff menu item. */ + adj = 1; } - return gnc_numeric_zero (); -} - -static GNCPrice * -account_latest_price (Account *account) -{ - GNCBook *book; - GNCPriceDB *pdb; - gnc_commodity *commodity; - gnc_commodity *currency; - - commodity = xaccAccountGetCommodity (account); - currency = gnc_default_currency (); - - book = gnc_get_current_book (); - pdb = gnc_book_get_pricedb (book); - - return gnc_pricedb_lookup_latest (pdb, commodity, currency); + /* Edit menu. */ + menu = gnc_split_reg_get_edit_menu( regData->gsr ); + regMenuItem = glade_xml_get_widget( xml, "gnc_register_edit_menu" ); + regMenu = glade_xml_get_widget( xml, "gnc_register_edit_menu_menu" ); + gtk_menu_shell_insert( GTK_MENU_SHELL(menu), gtk_menu_item_new(), (3 + adj)); + tmpMi = glade_xml_get_widget( xml, "gnc_register_edit_mi" ); + gtk_object_ref( GTK_OBJECT(tmpMi) ); + gtk_container_remove( GTK_CONTAINER(regMenu), tmpMi ); + gtk_menu_shell_insert( GTK_MENU_SHELL(menu), tmpMi, (4 + adj) ); + gtk_object_unref( GTK_OBJECT(tmpMi) ); + tmpMi = glade_xml_get_widget( xml, "gnc_register_find_mi" ); + gtk_object_ref( GTK_OBJECT(tmpMi) ); + gtk_container_remove( GTK_CONTAINER(regMenu), tmpMi ); + gtk_menu_shell_append( GTK_MENU_SHELL(menu), tmpMi ); + gtk_object_unref( GTK_OBJECT(tmpMi) ); + gtk_menu_item_remove_submenu( GTK_MENU_ITEM(regMenuItem) ); + gtk_menu_item_set_submenu( GTK_MENU_ITEM(regMenuItem), menu ); + + /* View menu */ + menu = gnc_split_reg_get_view_menu( regData->gsr ); + regMenuItem = glade_xml_get_widget( xml, "gnc_register_view_menu" ); + regMenu = glade_xml_get_widget( xml, "gnc_register_view_menu_menu" ); + tmpMi = glade_xml_get_widget( xml, "gnc_register_toolbar_mi" ); + gtk_object_ref( GTK_OBJECT(tmpMi) ); + gtk_container_remove( GTK_CONTAINER(regMenu), tmpMi ); + gtk_menu_insert( GTK_MENU(menu), tmpMi, (0 + adj) ); + gtk_object_unref( GTK_OBJECT(tmpMi) ); + tmpMi = glade_xml_get_widget( xml, "gnc_register_summary_mi" ); + gtk_object_ref( GTK_OBJECT(tmpMi) ); + gtk_container_remove( GTK_CONTAINER(regMenu), tmpMi ); + gtk_menu_insert( GTK_MENU(menu), tmpMi, (1 + adj) ); + gtk_object_unref( GTK_OBJECT(tmpMi) ); + tmpMi = glade_xml_get_widget( xml, "gnc_register_statusbar_mi" ); + gtk_object_ref( GTK_OBJECT(tmpMi) ); + gtk_container_remove( GTK_CONTAINER(regMenu), tmpMi ); + gtk_menu_insert( GTK_MENU(menu), tmpMi, (2 + adj) ); + gtk_object_unref( GTK_OBJECT(tmpMi) ); + gtk_menu_insert( GTK_MENU(menu), gtk_menu_item_new(), (3 + adj) ); + tmpMi = glade_xml_get_widget( xml, "gnc_register_date_range_mi" ); + gtk_object_ref( GTK_OBJECT(tmpMi) ); + gtk_container_remove( GTK_CONTAINER(regMenu), tmpMi ); + gtk_menu_insert( GTK_MENU(menu), tmpMi, (4 + adj) ); + gtk_object_unref( GTK_OBJECT(tmpMi) ); + gtk_menu_item_remove_submenu( GTK_MENU_ITEM(regMenuItem) ); + gtk_menu_item_set_submenu( GTK_MENU_ITEM(regMenuItem), menu ); + + /* Actions menu */ + menu = gnc_split_reg_get_action_menu( regData->gsr ); + regMenuItem = glade_xml_get_widget( xml, "gnc_register_actions_menu" ); + regMenu = glade_xml_get_widget( xml, "gnc_register_actions_menu_menu" ); + tmpMi = glade_xml_get_widget( xml, "gnc_register_xfer_mi" ); + gtk_object_ref( GTK_OBJECT(tmpMi) ); + gtk_container_remove( GTK_CONTAINER(regMenu), tmpMi ); + gtk_menu_insert( GTK_MENU(menu), tmpMi, (0 + adj) ); + gtk_object_unref( GTK_OBJECT(tmpMi) ); + tmpMi = glade_xml_get_widget( xml, "gnc_register_recn_mi" ); + gtk_object_ref( GTK_OBJECT(tmpMi) ); + gtk_container_remove( GTK_CONTAINER(regMenu), tmpMi ); + gtk_menu_insert( GTK_MENU(menu), tmpMi, (1 + adj) ); + gtk_object_unref( GTK_OBJECT(tmpMi) ); + tmpMi = glade_xml_get_widget( xml, "gnc_register_stock_split_mi" ); + gtk_object_ref( GTK_OBJECT(tmpMi) ); + gtk_container_remove( GTK_CONTAINER(regMenu), tmpMi ); + gtk_menu_insert( GTK_MENU(menu), tmpMi, (2 + adj) ); + gtk_object_unref( GTK_OBJECT(tmpMi) ); + gtk_menu_insert( GTK_MENU(menu), gtk_menu_item_new(), (3 + adj) ); + /* Base this off the end of the list for a bit more flexibility. */ + gtk_menu_append( GTK_MENU(menu), gtk_menu_item_new() ); + tmpMi = glade_xml_get_widget( xml, "gnc_register_scrub_mi" ); + gtk_object_ref( GTK_OBJECT(tmpMi) ); + gtk_container_remove( GTK_CONTAINER(regMenu), tmpMi ); + gtk_menu_append( GTK_MENU(menu), tmpMi ); + gtk_object_unref( GTK_OBJECT(tmpMi) ); + gtk_menu_item_remove_submenu( GTK_MENU_ITEM(regMenuItem) ); + gtk_menu_item_set_submenu( GTK_MENU_ITEM(regMenuItem), menu ); + + gtk_widget_show_all( mbar ); +} + +/** + * Custom g_list_find_custom fn; returns 0 when the match is found. + **/ +static +gint +gnc_register_find_toolbarchild( gconstpointer listEltData, gconstpointer data ) +{ + return !( ((GtkToolbarChild*)listEltData)->widget == data ); +} + +/** + * @param srcWidget A toolbar widget to clone [label, icon, button] and insert. + * @param idx The index to insert at, or -1 for 'append to end'. + **/ +static +void +gnc_register_insert_cloned_toolbar_elt( GtkToolbar *dstToolbar, + GtkToolbar *srcToolbar, + GtkWidget *srcWidget, + gchar *tooltip, + gpointer callback, + gpointer user_data, + gint idx ) +{ + GtkToolbarChild *tchild; + GList *elt; + GtkWidget *iconCopy; + gchar *label, *labelCopy; + + elt = g_list_find_custom( GTK_TOOLBAR(srcToolbar)->children, + srcWidget, + gnc_register_find_toolbarchild ); + g_assert( elt ); + tchild = (GtkToolbarChild*)(elt->data); + gtk_label_get( GTK_LABEL(tchild->label), &label ); + labelCopy = g_strdup( label ); + iconCopy = gnome_pixmap_new_from_gnome_pixmap( GNOME_PIXMAP( tchild->icon ) ); + if ( idx == -1 ) { + gtk_toolbar_append_element( dstToolbar, + tchild->type, + ( tchild->type == GTK_TOOLBAR_CHILD_RADIOBUTTON + ? tchild->widget : NULL ), + labelCopy, tooltip, NULL, iconCopy, + callback, user_data ); + } else { + gtk_toolbar_insert_element( dstToolbar, + tchild->type, + ( tchild->type == GTK_TOOLBAR_CHILD_RADIOBUTTON + ? tchild->widget : NULL ), + labelCopy, tooltip, NULL, iconCopy, + callback, user_data, idx ); + } } -static void -gnc_register_redraw_all_cb (GnucashRegister *g_reg, gpointer data) +static +GtkWidget* +gnc_register_setup_toolbar( RegWindow *regData ) { - RegWindow *regData = data; - gnc_commodity * commodity; - GNCPrintAmountInfo print_info; - gnc_numeric amount; - Account *leader; - char string[256]; - gboolean reverse; - gboolean euro; - - if (regData->window == NULL) - return; - - leader = gnc_ledger_display_leader (regData->ledger); - - euro = gnc_lookup_boolean_option ("International", - "Enable EURO support", - FALSE); - - commodity = xaccAccountGetCommodity (leader); - - /* no EURO converson, if account is already EURO or no EURO currency */ - if (commodity != NULL) - euro = (euro && gnc_is_euro_currency(commodity)); - else - euro = FALSE; - - print_info = gnc_account_print_info (leader, TRUE); - - reverse = gnc_reverse_balance(leader); - - if (regData->balance_label != NULL) - { - amount = gnc_account_present_balance (leader); - if (reverse) - amount = gnc_numeric_neg (amount); - - xaccSPrintAmount (string, amount, print_info); - if (euro) - { - strcat (string, " / "); - xaccSPrintAmount (string + strlen (string), - gnc_convert_to_euro (commodity, amount), - gnc_commodity_print_info (gnc_get_euro (), TRUE)); - } - - gnc_set_label_color (regData->balance_label, amount); - gtk_label_set_text (GTK_LABEL(regData->balance_label), string); - } - - if (regData->cleared_label != NULL) - { - amount = xaccAccountGetClearedBalance (leader); - if (reverse) - amount = gnc_numeric_neg (amount); - - xaccSPrintAmount (string, amount, print_info); - if (euro) - { - strcat (string, " / "); - xaccSPrintAmount (string + strlen (string), - gnc_convert_to_euro (commodity, amount), - gnc_commodity_print_info (gnc_get_euro (), TRUE)); - } - - gnc_set_label_color (regData->cleared_label, amount); - gtk_label_set_text (GTK_LABEL (regData->cleared_label), string); - } - - if (regData->reconciled_label != NULL) - { - amount = xaccAccountGetReconciledBalance (leader); - if (reverse) - amount = gnc_numeric_neg (amount); - - xaccSPrintAmount (string, amount, print_info); - if (euro) - { - strcat(string, " / "); - xaccSPrintAmount (string + strlen(string), - gnc_convert_to_euro(commodity, amount), - gnc_commodity_print_info (gnc_get_euro (), TRUE)); - } - - gnc_set_label_color (regData->reconciled_label, amount); - gtk_label_set_text (GTK_LABEL(regData->reconciled_label), string); - } - - if (regData->future_label != NULL) - { - amount = xaccAccountGetBalance (leader); - if (reverse) - amount = gnc_numeric_neg (amount); - - xaccSPrintAmount (string, amount, print_info); - if (euro) - { - strcat (string, " / "); - xaccSPrintAmount (string + strlen(string), - gnc_convert_to_euro(commodity, amount), - gnc_commodity_print_info (gnc_get_euro (), TRUE)); - } - - gnc_set_label_color (regData->future_label, amount); - gtk_label_set_text (GTK_LABEL (regData->future_label), string); - } - - if (regData->shares_label != NULL) - { - print_info = gnc_account_print_info (leader, TRUE); - - amount = xaccAccountGetBalance (leader); - if (reverse) - amount = gnc_numeric_neg (amount); - - xaccSPrintAmount (string, amount, print_info); - - gnc_set_label_color (regData->shares_label, amount); - gtk_label_set_text (GTK_LABEL (regData->shares_label), string); - } - - if (regData->value_label != NULL) - { - GNCPrice *price; - - price = account_latest_price (leader); - if (!price) - { - gnc_set_label_color (regData->value_label, gnc_numeric_zero ()); - gtk_label_set_text (GTK_LABEL (regData->value_label), - _("")); - } - else - { - gnc_commodity *currency = gnc_price_get_currency (price); - - print_info = gnc_commodity_print_info (currency, TRUE); - - amount = xaccAccountGetBalance (leader); - if (reverse) - amount = gnc_numeric_neg (amount); - - amount = gnc_numeric_mul (amount, gnc_price_get_value (price), - gnc_commodity_get_fraction (currency), - GNC_RND_ROUND); - - xaccSPrintAmount (string, amount, print_info); - - gnc_set_label_color (regData->value_label, amount); - gtk_label_set_text (GTK_LABEL (regData->value_label), string); - - gnc_price_unref (price); - } - } - - gnc_reg_set_window_name (regData); - - { - gboolean expand; - gboolean sensitive; - SplitRegister *reg; - - reg = gnc_ledger_display_get_split_register (regData->ledger); - - expand = gnc_split_register_current_trans_expanded (reg); - - gtk_signal_handler_block_by_data - (GTK_OBJECT (regData->split_button), regData); - gtk_toggle_button_set_active - (GTK_TOGGLE_BUTTON (regData->split_button), expand); - gtk_signal_handler_unblock_by_data - (GTK_OBJECT (regData->split_button), regData); - - gtk_signal_handler_block_by_data - (GTK_OBJECT (regData->split_menu_check), regData); - gtk_check_menu_item_set_active - (GTK_CHECK_MENU_ITEM (regData->split_menu_check), expand); - gtk_signal_handler_unblock_by_data - (GTK_OBJECT (regData->split_menu_check), regData); - - gtk_check_menu_item_set_active - (GTK_CHECK_MENU_ITEM (regData->split_popup_check), expand); - - sensitive = reg->style == REG_STYLE_LEDGER; - - gtk_widget_set_sensitive (regData->split_button, sensitive); - gtk_widget_set_sensitive (regData->split_menu_check, sensitive); - gtk_widget_set_sensitive (regData->split_popup_check, sensitive); - } + GladeXML *xml; + GtkWidget *button; + GtkToolbar *tbar, *regTbar; + +#define CLOSE_TOOLBAR_TOOLTIP "Close this register window" +#define XFER_TOOLBAR_TOOLTIP "Transfer funds from one account to another" +#define FIND_TOOLBAR_TOOLTIP "Find transactions with a search" +#define REPORT_TOOLBAR_TOOLTIP "Open a report window for this register" +#define PRINT_TOOLBAR_TOOLTIP "Print a report for this register" + + xml = gnc_glade_xml_new( "register.glade", "gnc_register_toolbar" ); + g_assert( xml ); + regTbar = GTK_TOOLBAR(glade_xml_get_widget( xml, "gnc_register_toolbar" )); + gtk_widget_hide( GTK_WIDGET(regTbar) ); + g_assert( regTbar ); + tbar = GTK_TOOLBAR(gnc_split_reg_get_toolbar( regData->gsr )); + g_assert( tbar ); + + /* General plan: + * . get the GNCSplitReg toolbar + * . get the gnc_register toolbar + * . pull buttons from the register toolbar + * . insert into GSR toolbar + * . destroy [now-]unused gnc_register_toolbar */ + + button = glade_xml_get_widget( xml, "gnc_register_close_b" ); + gnc_register_insert_cloned_toolbar_elt( tbar, regTbar, button, + _(CLOSE_TOOLBAR_TOOLTIP), + gnc_register_close_cb, regData, 0 ); + gtk_toolbar_append_space( tbar ); + button = glade_xml_get_widget( xml, "gnc_register_xfer_b" ); + gnc_register_insert_cloned_toolbar_elt( tbar, regTbar, button, + _(XFER_TOOLBAR_TOOLTIP), + gnc_register_xfer_cb, regData, -1 ); + gtk_toolbar_append_space( tbar ); + button = glade_xml_get_widget( xml, "gnc_register_find_b" ); + gnc_register_insert_cloned_toolbar_elt( tbar, regTbar, button, + _(FIND_TOOLBAR_TOOLTIP), + gnc_ui_find_transactions_cb, + regData, -1 ); + button = glade_xml_get_widget( xml, "gnc_register_report_b" ); + gnc_register_insert_cloned_toolbar_elt( tbar, regTbar, button, + _(REPORT_TOOLBAR_TOOLTIP), + gnc_register_report_account_cb, + regData, -1 ); + button = glade_xml_get_widget( xml, "gnc_register_print_b" ); + gnc_register_insert_cloned_toolbar_elt( tbar, regTbar, button, + _(PRINT_TOOLBAR_TOOLTIP), + gnc_register_print_cb, regData, -1 ); + + gtk_widget_destroy( GTK_WIDGET(regTbar) ); + + gtk_widget_show_all( GTK_WIDGET(tbar) ); + + return GTK_WIDGET(tbar); } static void -gnc_register_redraw_help_cb (GnucashRegister *g_reg, gpointer data) +gnc_register_help_changed_cb( GNCSplitReg *gsr, gpointer data ) { RegWindow *regData = data; SplitRegister *reg; @@ -2101,599 +1146,190 @@ gnc_register_redraw_help_cb (GnucashRegister *g_reg, gpointer data) if (!regData) return; - reg = gnc_ledger_display_get_split_register (regData->ledger); - - help = gnc_table_get_help (reg->table); - + /* Get the text from the ledger */ + reg = gnc_ledger_display_get_split_register( regData->ledger ); + help = gnc_table_get_help( reg->table ); status = help ? help : ""; - - gnome_appbar_set_default (GNOME_APPBAR(regData->statusbar), status); - - g_free (help); + gnome_appbar_set_default( GNOME_APPBAR(regData->statusbar), status ); + g_free( help ); } static void -gnc_reg_save_size (RegWindow *regData) -{ - SplitRegister *reg; - int *width; - char *prefix; - - reg = gnc_ledger_display_get_split_register (regData->ledger); - - switch (reg->type) - { - case STOCK_REGISTER: - case PORTFOLIO_LEDGER: - case CURRENCY_REGISTER: - prefix = "reg_stock_win"; - width = &last_stock_width; - break; - default: - prefix = "reg_win"; - width = &last_width; - break; - } - - gdk_window_get_geometry (regData->window->window, NULL, NULL, - width, NULL, NULL); - - gnc_save_window_size (prefix, *width, 0); -} - - -/********************************************************************\ - * regDestroy() -\********************************************************************/ - -static void -regDestroy (GNCLedgerDisplay *ledger) -{ - RegWindow *regData = gnc_ledger_display_get_user_data (ledger); - - if (regData) - { - SplitRegister *reg; - - gnc_reg_save_size (regData); - - reg = gnc_ledger_display_get_split_register (ledger); - - if (reg && reg->table) - gnc_table_save_state (reg->table); - - gtk_widget_destroy (regData->window); - } - - gnc_ledger_display_set_user_data (ledger, NULL); -} - - -void -gnc_register_new_account_cb (GtkWidget * w, gpointer data) -{ - gnc_ui_new_account_window (NULL); -} - - -/********************************************************************\ - * gnc_register_cut_cb -- cut the selection to the clipboard * - * * - * Args: w - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -void -gnc_register_cut_cb (GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - - gnucash_register_cut_clipboard (regData->reg); -} - - -/********************************************************************\ - * gnc_register_copy_cb -- copy the selection to the clipboard * - * * - * Args: w - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -void -gnc_register_copy_cb (GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - - gnucash_register_copy_clipboard (regData->reg); -} - - -/********************************************************************\ - * gnc_register_paste_cb -- paste the clipboard to the selection * - * * - * Args: w - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -void -gnc_register_paste_cb (GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - - gnucash_register_paste_clipboard (regData->reg); -} - - -/********************************************************************\ - * gnc_register_cut_trans_cb -- cut the current transaction * - * to the clipboard * - * * - * Args: w - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -void -gnc_register_cut_trans_cb (GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - - gnc_split_register_cut_current - (gnc_ledger_display_get_split_register (regData->ledger)); -} - - -/********************************************************************\ - * gnc_register_copy_trans_cb -- copy the current transaction * - * to the clipboard * - * * - * Args: w - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -void -gnc_register_copy_trans_cb(GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - - gnc_split_register_copy_current - (gnc_ledger_display_get_split_register (regData->ledger)); -} - - -/********************************************************************\ - * gnc_register_paste_trans_cb -- paste the transaction clipboard * - * to the selection * - * * - * Args: w - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -void -gnc_register_paste_trans_cb (GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - - gnc_split_register_paste_current - (gnc_ledger_display_get_split_register (regData->ledger)); -} - - -/********************************************************************\ - * gnc_register_xfer_cb -- open up the transfer window * - * * - * Args: w - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -void -gnc_register_xfer_cb (GtkWidget * w, gpointer data) -{ - RegWindow *regData = data; - - gnc_xfer_dialog (regData->window, - gnc_ledger_display_leader (regData->ledger)); -} - - -/********************************************************************\ - * gnc_register_stock_split_cb -- open up the stock split druid * - * * - * Args: w - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -void -gnc_register_stock_split_cb (GtkWidget * w, gpointer data) -{ - RegWindow *regData = data; - - gnc_stock_split_dialog (gnc_ledger_display_leader (regData->ledger)); -} - - -/********************************************************************\ - * gnc_register_edit_cb -- open up the account edit window * - * * - * Args: w - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -void -gnc_register_edit_cb(GtkWidget * w, gpointer data) -{ - RegWindow *regData = data; - Account *account = gnc_ledger_display_leader (regData->ledger); - - if (account == NULL) - return; - - gnc_ui_edit_account_window(account); -} - - -/********************************************************************\ - * gnc_register_start_recn_cb -- open up the reconcile window... * - * called from menubar. * - * * - * Args: w - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -void -gnc_register_start_recn_cb(GtkWidget * w, gpointer data) -{ - RegWindow *regData = data; - Account *account = gnc_ledger_display_leader (regData->ledger); - - if (account == NULL) - return; - - recnWindow(regData->window, account); -} - - -static gboolean -gnc_register_include_date(RegWindow *regData, time_t date) -{ - RegDateWindow *regDateData; - time_t start, end; - gboolean changed = FALSE; - - regDateData = regData->date_window; - - start = gnc_date_edit_get_date(GNC_DATE_EDIT(regDateData->start_date)); - end = gnc_date_edit_get_date(GNC_DATE_EDIT(regDateData->end_date)); - - if (date < start) - { - gnc_date_edit_set_time(GNC_DATE_EDIT(regDateData->start_date), date); - changed = TRUE; - } - - if (date > end) - { - gnc_date_edit_set_time(GNC_DATE_EDIT(regDateData->end_date), date); - changed = TRUE; - } - - if (changed) - gnc_register_set_date_range(regData); - - return changed; -} - - -/********************************************************************\ - * gnc_register_record_trans_cb * - * * - * Args: w - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -void -gnc_register_record_trans_cb (GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - - gnc_register_enter (regData, TRUE); -} - - -typedef enum -{ - DELETE_CANCEL, - DELETE_SPLITS, - DELETE_TRANS, -} DeleteType; - - - -/* Remove when porting to gtk2.0 */ -#define GTK_STOCK_CANCEL GNOME_STOCK_BUTTON_CANCEL -#define GTK_STOCK_DELETE "Delete" - -/********************************************************************\ - * gnc_register_reinitialize_trans_cb * - * * - * Args: widget - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -void -gnc_register_reinitialize_trans_cb(GtkWidget *widget, gpointer data) -{ - RegWindow *regData = data; - VirtualCellLocation vcell_loc; - SplitRegister *reg; - Transaction *trans; - Split *split; - char *buf = NULL; - gint result; - const char *two_choices[] = { N_(GTK_STOCK_CANCEL), - N_("Reinitialize"), - NULL }; - const char *message = _("Are you sure you want to reinitialize this " - "transaction?"); - - const char *recn_warn = _("You would be modifying a " - "transaction with reconciled splits!\n" - "This is not a good idea as it will cause your " - "reconciled balance to be off."); - - reg = gnc_ledger_display_get_split_register (regData->ledger); - - trans = gnc_split_register_get_current_trans (reg); - if (xaccTransHasReconciledSplits (trans)) { - buf = g_strconcat (message, "\n\n", recn_warn, NULL); - result = - gnc_generic_warning_dialog_parented(regData->window, two_choices, buf); - } else { - buf = g_strdup (message); - result = - gnc_generic_question_dialog_parented(regData->window, two_choices,buf); - } - g_free(buf); - if (!result) - return; - - /* - * Find the "transaction" split for the current transaction. This is - * the split that appears at the top of the transaction in the - * register. - */ - split = gnc_split_register_get_current_split (reg); - if (!gnc_split_register_get_split_virt_loc(reg, split, &vcell_loc)) - return; - split = gnc_split_register_get_current_trans_split (reg, &vcell_loc); - gnc_split_register_emtpy_current_trans_except_split (reg, split); -} - - -/********************************************************************\ - * gnc_register_delete_trans_cb * - * * - * Args: widget - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -void -gnc_register_delete_trans_cb(GtkWidget *widget, gpointer data) +gnc_reg_save_size (RegWindow *regData) { - RegWindow *regData = data; - SplitRegisterStyle style; - CursorClass cursor_class; SplitRegister *reg; - Transaction *trans; - char *buf = NULL; - Split *split; - gint result; - const char *two_choices[] = { N_(GTK_STOCK_CANCEL), - N_(GTK_STOCK_DELETE), - NULL }; + int *width; + char *prefix; reg = gnc_ledger_display_get_split_register (regData->ledger); - /* get the current split based on cursor position */ - split = gnc_split_register_get_current_split(reg); - if (split == NULL) + switch (reg->type) { - gnc_split_register_cancel_cursor_split_changes (reg); - return; + case STOCK_REGISTER: + case PORTFOLIO_LEDGER: + case CURRENCY_REGISTER: + prefix = "reg_stock_win"; + width = &last_stock_width; + break; + default: + prefix = "reg_win"; + width = &last_width; + break; } - trans = xaccSplitGetParent(split); - style = reg->style; - cursor_class = gnc_split_register_get_current_cursor_class (reg); - - /* Deleting the blank split just cancels */ - { - Split *blank_split = gnc_split_register_get_blank_split (reg); + gdk_window_get_geometry (regData->window->window, NULL, NULL, + width, NULL, NULL); - if (split == blank_split) - { - gnc_split_register_cancel_cursor_trans_changes (reg); - return; - } - } + gnc_save_window_size (prefix, *width, 0); +} - if (cursor_class == CURSOR_CLASS_NONE) - return; - /* On a split cursor, just delete the one split. */ - if (cursor_class == CURSOR_CLASS_SPLIT) - { - const char *format = _("Are you sure you want to delete\n %s\n" - "from the transaction\n %s ?"); - const char *recn_warn = _("You would be deleting a reconciled split!\n" - "This is not a good idea as it will cause your " - "reconciled balance to be off."); - const char *memo; - const char *desc; - char recn; - - memo = xaccSplitGetMemo (split); - memo = (memo && *memo) ? memo : _("(no memo)"); - - desc = xaccTransGetDescription (trans); - desc = (desc && *desc) ? desc : _("(no description)"); - - /* ask for user confirmation before performing permanent damage */ - buf = g_strdup_printf (format, memo, desc); - - recn = xaccSplitGetReconcile (split); - if (recn == YREC || recn == FREC) - { - char *new_buf; - - new_buf = g_strconcat (buf, "\n\n", recn_warn, NULL); - g_free (buf); - buf = new_buf; - result = - gnc_generic_warning_dialog_parented(regData->window, two_choices, buf); - } else { - result = - gnc_generic_question_dialog_parented(regData->window, two_choices,buf); - } - g_free(buf); +/********************************************************************\ + * regDestroy() +\********************************************************************/ - if (!result) - return; +static void +regDestroy (GNCLedgerDisplay *ledger) +{ + RegWindow *regData = gnc_ledger_display_get_user_data (ledger); - gnc_split_register_delete_current_split (reg); - return; + if ( regData ) { + gnc_reg_save_size( regData ); } - g_return_if_fail(cursor_class == CURSOR_CLASS_TRANS); + gtk_widget_destroy( regData->window ); - /* On a transaction cursor with 2 or fewer splits in single or double - * mode, we just delete the whole transaction, kerblooie */ +#if 0 /* old and busted */ + if (regData) { - const char *message = _("Are you sure you want to delete the current " - "transaction?"); - const char *recn_warn = _("You would be deleting a transaction " - "with reconciled splits!\n" - "This is not a good idea as it will cause your " - "reconciled balance to be off."); - char *buf; - - if (xaccTransHasReconciledSplits (trans)) { - buf = g_strconcat (message, "\n\n", recn_warn, NULL); - result = - gnc_generic_warning_dialog_parented(regData->window, two_choices, buf); - } else { - buf = g_strdup (message); - result = - gnc_generic_question_dialog_parented(regData->window, two_choices,buf); - } + SplitRegister *reg; - g_free (buf); + gnc_reg_save_size (regData); - if (!result) - return; + reg = gnc_ledger_display_get_split_register (ledger); - gnc_split_register_delete_current_trans (reg); - return; + if (reg && reg->table) + gnc_table_save_state (reg->table); + + gtk_widget_destroy (regData->window); } + + gnc_ledger_display_set_user_data (ledger, NULL); +#endif /* 0 -- oldd an busted */ } +void +gnc_register_new_account_cb (GtkWidget * w, gpointer data) +{ + gnc_ui_new_account_window (NULL); +} + /********************************************************************\ - * gnc_register_duplicate_trans_cb * + * gnc_register_xfer_cb -- open up the transfer window * * * - * Args: widget - the widget that called us * - * data - the data struct for this register * + * Args: w - the widget that called us * + * data - the data struct for this register * * Return: none * \********************************************************************/ -void -gnc_register_duplicate_trans_cb(GtkWidget *w, gpointer data) +void +gnc_register_xfer_cb (GtkWidget * w, gpointer data) { RegWindow *regData = data; - gnc_split_register_duplicate_current - (gnc_ledger_display_get_split_register (regData->ledger)); + gnc_xfer_dialog (regData->window, + gnc_ledger_display_leader (regData->ledger)); } /********************************************************************\ - * gnc_register_recur_cb * + * gnc_register_stock_split_cb -- open up the stock split druid * * * - * Args: widget - the widget that called us * - * data - the data struct for this register * + * Args: w - the widget that called us * + * data - the data struct for this register * * Return: none * \********************************************************************/ - void -gnc_register_recur_cb(GtkWidget *w, gpointer data) +gnc_register_stock_split_cb (GtkWidget * w, gpointer data) { RegWindow *regData = data; - SplitRegister *reg = gnc_ledger_display_get_split_register (regData->ledger); - Transaction *pending_trans = gnc_split_register_get_current_trans (reg); - - /* FIXME: If the transaction has a sched-xact KVP frame, then go to the - * editor for the existing SX; otherwise, do the sx-from-trans dialog. */ - { - kvp_frame *txn_frame; - kvp_value *kvp_val; - /* set a kvp-frame element in the transaction indicating and - * pointing-to the SX this was created from. */ - txn_frame = xaccTransGetSlots( pending_trans ); - if ( txn_frame != NULL ) { - DEBUG( "Got frame, looking up key" ); - kvp_val = kvp_frame_get_slot( txn_frame, "from-sched-xaction" ); - if ( kvp_val ) { - DEBUG( "Find SX with GUID \"%s\"", - guid_to_string( kvp_value_get_guid( kvp_val ) ) ); - } - } - } - gnc_sx_create_from_trans(pending_trans); + gnc_stock_split_dialog (gnc_ledger_display_leader (regData->ledger)); } - + /********************************************************************\ - * gnc_register_cancel_trans_cb * + * gnc_register_edit_cb -- open up the account edit window * * * * Args: w - the widget that called us * * data - the data struct for this register * * Return: none * \********************************************************************/ -void -gnc_register_cancel_trans_cb(GtkWidget *w, gpointer data) +void +gnc_register_edit_cb(GtkWidget * w, gpointer data) { RegWindow *regData = data; + Account *account = gnc_ledger_display_leader (regData->ledger); + + if (account == NULL) + return; - gnc_split_register_cancel_cursor_trans_changes - (gnc_ledger_display_get_split_register (regData->ledger)); + gnc_ui_edit_account_window(account); } /********************************************************************\ - * gnc_register_check_close * + * gnc_register_start_recn_cb -- open up the reconcile window... * + * called from menubar. * * * - * Args: regData - the data struct for this register * + * Args: w - the widget that called us * + * data - the data struct for this register * * Return: none * \********************************************************************/ -static void -gnc_register_check_close(RegWindow *regData) +void +gnc_register_start_recn_cb(GtkWidget * w, gpointer data) { - gboolean pending_changes; - SplitRegister *reg; + RegWindow *regData = data; + Account *account = gnc_ledger_display_leader (regData->ledger); - reg = gnc_ledger_display_get_split_register (regData->ledger); + if (account == NULL) + return; + + recnWindow(regData->window, account); +} + + +static gboolean +gnc_register_include_date(RegWindow *regData, time_t date) +{ + RegDateWindow *regDateData; + time_t start, end; + gboolean changed = FALSE; + + regDateData = regData->date_window; + + start = gnc_date_edit_get_date(GNC_DATE_EDIT(regDateData->start_date)); + end = gnc_date_edit_get_date(GNC_DATE_EDIT(regDateData->end_date)); + + if (date < start) + { + gnc_date_edit_set_time(GNC_DATE_EDIT(regDateData->start_date), date); + changed = TRUE; + } - pending_changes = gnc_split_register_changed (reg); - if (pending_changes) + if (date > end) { - const char *message = _("The current transaction has been changed.\n" - "Would you like to record it?"); - if (gnc_verify_dialog_parented(regData->window, TRUE, message)) - gnc_register_record_trans_cb(regData->window, regData); - else - gnc_split_register_cancel_cursor_trans_changes (reg); + gnc_date_edit_set_time(GNC_DATE_EDIT(regDateData->end_date), date); + changed = TRUE; } + + if (changed) + gnc_register_set_date_range(regData); + + return changed; } + /********************************************************************\ * gnc_register_close_cb * * * @@ -2705,10 +1341,8 @@ void gnc_register_close_cb (GtkWidget *widget, gpointer data) { RegWindow *regData = data; - - gnc_register_check_close (regData); - - gnc_ledger_display_close (regData->ledger); + gnc_split_reg_check_close( GNC_SPLIT_REG(regData->gsr) ); + gnc_ledger_display_close( regData->ledger ); } static int @@ -2875,59 +1509,15 @@ gnc_register_date_range_cb (GtkWidget *widget, gpointer data) gnc_register_show_date_window(regData); } -void -gnc_register_toolbar_cb (GtkWidget *widget, gpointer data) -{ - RegWindow *regData = data; - GtkCheckMenuItem *checkmenu = GTK_CHECK_MENU_ITEM(widget); - - if (checkmenu->active) { - gtk_widget_show(regData->toolbar_dock); - } else { - gtk_widget_hide(regData->toolbar_dock); - gtk_widget_queue_resize(regData->toolbar_dock); - } -} - -void -gnc_register_summarybar_cb (GtkWidget *widget, gpointer data) -{ - RegWindow *regData = data; - GtkCheckMenuItem *checkmenu = GTK_CHECK_MENU_ITEM(widget); - - if (checkmenu->active) { - gtk_widget_show(regData->summarybar_dock); - } else { - gtk_widget_hide(regData->summarybar_dock); - gtk_widget_queue_resize(regData->summarybar_dock); - } -} - -void -gnc_register_statusbar_cb (GtkWidget *widget, gpointer data) -{ - RegWindow *regData = data; - GtkCheckMenuItem *checkmenu = GTK_CHECK_MENU_ITEM(widget); - - if (checkmenu->active) { - gtk_widget_show(regData->statusbar); - } else { - gtk_widget_hide(regData->statusbar); - gtk_widget_queue_resize(regData->statusbar); - } -} - void gnc_register_gl_cb(GtkWidget *widget, gpointer data) { GNCLedgerDisplay *ld; RegWindow *regData; - ld = gnc_ledger_display_gl (); - - regData = regWindowLedger (ld); - - gnc_register_raise (regData); + ld = gnc_ledger_display_gl(); + regData = regWindowLedger( ld ); + gnc_register_raise( regData ); } void @@ -2961,4 +1551,112 @@ gnc_register_help_cb (GtkWidget *widget, gpointer data) helpWindow (NULL, NULL, HH_REGWIN); } +/********************************************************************\ + * gnc_register_jump_to_split * + * move the cursor to the split, if present in register * + * * + * Args: regData - the register data structure * + * split - the split to jump to * + * Return: nothing * +\********************************************************************/ +void +gnc_register_jump_to_split(RegWindow *regData, Split *split) +{ + Transaction *trans; + VirtualCellLocation vcell_loc; + SplitRegister *reg; + GnucashRegister *gncReg; + + if (!regData) return; + + trans = xaccSplitGetParent(split); + if (trans != NULL) + if (gnc_register_include_date(regData, xaccTransGetDate(trans))) + { + gnc_ledger_display_refresh (regData->ledger); + } + + reg = gnc_ledger_display_get_split_register (regData->ledger); + gncReg = gnc_split_reg_get_register( regData->gsr ); + + if (gnc_split_register_get_split_virt_loc(reg, split, &vcell_loc)) + gnucash_register_goto_virt_cell(gncReg, vcell_loc); +} + + +/********************************************************************\ + * gnc_register_jump_to_split_amount * + * move the cursor to the split in the non-blank amount column * + * * + * Args: regData - the register data structure * + * split - the split to jump to * + * Return: nothing * +\********************************************************************/ +void +gnc_register_jump_to_split_amount(RegWindow *regData, Split *split) +{ + Transaction *trans; + VirtualLocation virt_loc; + SplitRegister *reg; + GnucashRegister *gncReg; + + if (!regData) return; + + trans = xaccSplitGetParent(split); + if (trans != NULL) + if (gnc_register_include_date(regData, xaccTransGetDate(trans))) + { + gnc_ledger_display_refresh (regData->ledger); + } + + reg = gnc_ledger_display_get_split_register (regData->ledger); + gncReg = gnc_split_reg_get_register( regData->gsr ); + + if (gnc_split_register_get_split_amount_virt_loc (reg, split, &virt_loc)) + gnucash_register_goto_virt_loc (gncReg, virt_loc); +} + +void +gnc_register_toolbar_cb( GtkWidget *widget, gpointer data ) +{ + RegWindow *rw = data; + GtkCheckMenuItem *checkmenu = GTK_CHECK_MENU_ITEM(widget); + + if (checkmenu->active) { + gtk_widget_show( rw->toolbar_dock ); + } else { + gtk_widget_hide( rw->toolbar_dock ); + gtk_widget_queue_resize( rw->toolbar_dock ); + } +} + +void +gnc_register_summarybar_cb( GtkWidget *widget, gpointer data ) +{ + RegWindow *rw = data; + GtkCheckMenuItem *checkmenu = GTK_CHECK_MENU_ITEM(widget); + + if (checkmenu->active) { + gtk_widget_show( rw->summarybar_dock ); + } else { + gtk_widget_hide( rw->summarybar_dock ); + gtk_widget_queue_resize( rw->summarybar_dock ); + } +} + +void +gnc_register_statusbar_cb( GtkWidget *widget, gpointer data ) +{ + RegWindow *rw = data; + GtkCheckMenuItem *checkmenu = GTK_CHECK_MENU_ITEM(widget); + + if (checkmenu->active) { + gtk_widget_show( rw->statusbar ); + } else { + gtk_widget_hide( rw->statusbar ); + gtk_widget_queue_resize( rw->statusbar ); + } +} + + /************************** END OF FILE **************************/ diff --git a/src/register/ledger-core/Makefile.am b/src/register/ledger-core/Makefile.am index 4a806c415c..5efe859dd8 100644 --- a/src/register/ledger-core/Makefile.am +++ b/src/register/ledger-core/Makefile.am @@ -12,8 +12,7 @@ libgncmod_ledger_core_la_SOURCES = \ split-register-load.c \ split-register-model.c \ split-register-model-save.c \ - split-register-util.c \ - gnc-regwidget.c + split-register-util.c noinst_HEADERS = \ gnc-ledger-display.h \ @@ -22,8 +21,7 @@ noinst_HEADERS = \ split-register-layout.h \ split-register-model.h \ split-register-model-save.h \ - split-register-p.h \ - gnc-regwidget.h + split-register-p.h libgncmod_ledger_core_la_LDFLAGS = -module libgncmod_ledger_core_la_LIBADD = \ diff --git a/src/register/ledger-core/gnc-regwidget.c b/src/register/ledger-core/gnc-regwidget.c deleted file mode 100644 index 257821a583..0000000000 --- a/src/register/ledger-core/gnc-regwidget.c +++ /dev/null @@ -1,2015 +0,0 @@ -/********************************************************************\ - * gnc-regwidget.c -- A widget for the common register look-n-feel. * - * Copyright (C) 1997 Robin D. Clark * - * Copyright (C) 1997-1998 Linas Vepstas * - * Copyright (C) 1998 Rob Browning * - * Copyright (C) 1999-2000 Dave Peticolas * - * Copyright (C) 2001 Gnumatic, Inc. * - * Copyright (C) 2002 Joshua Sled * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License as * - * published by the Free Software Foundation; either version 2 of * - * the License, or (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License* - * along with this program; if not, contact: * - * * - * Free Software Foundation Voice: +1-617-542-5942 * - * 59 Temple Place - Suite 330 Fax: +1-617-542-2652 * - * Boston, MA 02111-1307, USA gnu@gnu.org * -\********************************************************************/ - -#define _GNU_SOURCE - -#include "config.h" - -#include -#include - -#include "AccWindow.h" -#include "Scrub.h" -#include "global-options.h" -#include "gnc-component-manager.h" -#include "gnc-date-edit.h" -#include "gnc-engine-util.h" -#include "gnc-euro.h" -#include "gnc-gui-query.h" -#include "gnc-ledger-display.h" -#include "gnc-pricedb.h" -#include "gnc-ui-util.h" -#include "gnc-ui.h" -#include "gnucash-sheet.h" -#include "messages.h" -#include "table-allgui.h" - -#include -#include "gnc-regwidget.h" -#include "gnc-engine-util.h" -#include "dialog-utils.h" - -/** PROTOTYPES ******************************************************/ -static void gnc_register_redraw_all_cb (GnucashRegister *g_reg, gpointer data); -static void gnc_register_redraw_help_cb (GnucashRegister *g_reg, - gpointer data); -static void gnc_reg_refresh_toolbar(GNCRegWidget *regData); -static void regDestroy(GNCLedgerDisplay *ledger); -static void gnc_register_check_close(GNCRegWidget *regData); - -static void cutCB(GtkWidget *w, gpointer data); -static void copyCB(GtkWidget *w, gpointer data); -static void pasteCB(GtkWidget *w, gpointer data); -static void cutTransCB(GtkWidget *w, gpointer data); -static void copyTransCB(GtkWidget *w, gpointer data); -static void pasteTransCB(GtkWidget *w, gpointer data); - -static void deleteCB(GNCRegWidget *rw, gpointer data); -static void duplicateCB(GNCRegWidget *rw, gpointer data); -static void recordCB(GNCRegWidget *rw, gpointer data); -static void cancelCB(GNCRegWidget *rw, gpointer data); -static void expand_ent_cb(GNCRegWidget *rw, gpointer data); -static void new_trans_cb(GNCRegWidget *rw, gpointer data); -static void jump_cb(GNCRegWidget *rw, gpointer data ); - -static void gnc_register_jump_to_blank (GNCRegWidget *rw); - -static void gnc_regWidget_class_init (GNCRegWidgetClass *); -static void gnc_regWidget_init (GNCRegWidget *); -static void gnc_regWidget_init2( GNCRegWidget *rw, GNCLedgerDisplay *ledger, GtkWindow *win ); -static void emit_cb( GNCRegWidget *rw, const char *signal_name, gpointer ud ); - -static void emit_enter_ent_cb( GtkWidget *widget, gpointer data ); -static void emit_cancel_ent_cb( GtkWidget *widget, gpointer data ); -static void emit_delete_ent_cb( GtkWidget *widget, gpointer data ); -static void emit_dup_ent_cb( GtkWidget *widget, gpointer data ); -static void emit_schedule_ent_cb( GtkWidget *widget, gpointer data ); -static void emit_expand_ent_cb( GtkWidget *widget, gpointer data ); -static void emit_blank_cb( GtkWidget *widget, gpointer data ); -static void emit_jump_cb( GtkWidget *widget, gpointer data ); - -/* Easy way to pass the sort-type */ -typedef enum { - BY_NONE = 0, - BY_STANDARD, - BY_DATE, - BY_DATE_ENTERED, - BY_DATE_RECONCILED, - BY_NUM, - BY_AMOUNT, - BY_MEMO, - BY_DESC -} sort_type_t; - -guint -gnc_regWidget_get_type () -{ - static guint gnc_regWidget_type = 0; - - if (!gnc_regWidget_type) - { - GtkTypeInfo gnc_regWidget_info = - { - "GNCRegWidget", - sizeof (GNCRegWidget), - sizeof (GNCRegWidgetClass), - (GtkClassInitFunc) gnc_regWidget_class_init, - (GtkObjectInitFunc) gnc_regWidget_init, - (GtkArgSetFunc) NULL, - (GtkArgGetFunc) NULL - }; - - gnc_regWidget_type = gtk_type_unique (GTK_TYPE_VBOX, &gnc_regWidget_info); - } - - return gnc_regWidget_type; -} - -/* SIGNALS */ -enum gnc_regWidget_signal_enum { - ENTER_ENT_SIGNAL, - CANCEL_ENT_SIGNAL, - DELETE_ENT_SIGNAL, - DUP_ENT_SIGNAL, - SCHEDULE_ENT_SIGNAL, - EXPAND_ENT_SIGNAL, - BLANK_SIGNAL, - JUMP_SIGNAL, -#if 0 - ACTIVATE_CURSOR_SIGNAL, - REDRAW_ALL_SIGNAL, - REDRAW_HELP_SIGNAL, -#endif /* 0 */ - LAST_SIGNAL -}; - -static gint gnc_regWidget_signals[LAST_SIGNAL] = { 0 }; - -static void -gnc_regWidget_class_init (GNCRegWidgetClass *class) -{ - int i; - GtkObjectClass *object_class; - static struct similar_signal_info { - enum gnc_regWidget_signal_enum s; - const char *signal_name; - guint offset; - } signals[] = { - { ENTER_ENT_SIGNAL, "enter_ent", GTK_SIGNAL_OFFSET( GNCRegWidgetClass, enter_ent_cb ) }, - { CANCEL_ENT_SIGNAL, "cancel_ent", GTK_SIGNAL_OFFSET( GNCRegWidgetClass, cancel_ent_cb ) }, - { DELETE_ENT_SIGNAL, "delete_ent", GTK_SIGNAL_OFFSET( GNCRegWidgetClass, delete_ent_cb ) }, - { DUP_ENT_SIGNAL, "dup_ent", GTK_SIGNAL_OFFSET( GNCRegWidgetClass, dup_ent_cb ) }, - { SCHEDULE_ENT_SIGNAL, "schedule_ent", GTK_SIGNAL_OFFSET( GNCRegWidgetClass, schedule_ent_cb ) }, - { EXPAND_ENT_SIGNAL, "expand_ent", GTK_SIGNAL_OFFSET( GNCRegWidgetClass, expand_ent_cb ) }, - { BLANK_SIGNAL, "blank", GTK_SIGNAL_OFFSET( GNCRegWidgetClass, blank_cb ) }, - { JUMP_SIGNAL, "jump", GTK_SIGNAL_OFFSET( GNCRegWidgetClass, jump_cb ) }, -#if 0 - { ACTIVATE_CURSOR_SIGNAL, "activate_cursor", GTK_SIGNAL_OFFSET( GNCRegWidgetClass, activate_cursor ) }, - { REDRAW_ALL_SIGNAL, "redraw_all", GTK_SIGNAL_OFFSET( GNCRegWidgetClass, redraw_all ) }, - { REDRAW_HELP_SIGNAL, "redraw_help", GTK_SIGNAL_OFFSET( GNCRegWidgetClass, redraw_help ) }, -#endif /* 0 */ - { LAST_SIGNAL, NULL, 0 } - }; - - object_class = (GtkObjectClass*) class; - - for ( i=0; signals[i].signal_name != NULL; i++ ) { - gnc_regWidget_signals[ signals[i].s ] = - gtk_signal_new( signals[i].signal_name, - GTK_RUN_FIRST, - object_class->type, signals[i].offset, - gtk_signal_default_marshaller, GTK_TYPE_NONE, 0 ); - } - - gtk_object_class_add_signals (object_class, gnc_regWidget_signals, LAST_SIGNAL); -} - -GtkWidget* -gnc_regWidget_new( GNCLedgerDisplay *ld, - GtkWindow *win, - int disallowCapabilities ) -{ - GNCRegWidget *rw; - rw = GNC_REGWIDGET( gtk_type_new( gnc_regWidget_get_type() ) ); - rw->disallowedCaps = disallowCapabilities; - - /* IMPORTANT: If we set this to anything other than GTK_RESIZE_QUEUE, we - * enter into a very bad back-and-forth between the sheet and a containing - * GnomeDruid [in certain conditions and circumstances not detailed here], - * resulting in either a single iteration of the Druid resizing or infinite - * iterations of the Druid resizing without bound. Contact - * jsled@asynchronous.org for details. -- 2002.04.15 - */ - gtk_container_set_resize_mode( GTK_CONTAINER( rw ), GTK_RESIZE_QUEUE ); - - gnc_regWidget_init2( rw, ld, win ); - return GTK_WIDGET( rw ); -} - -void -gnc_regWidget_set_ledger_display( GNCRegWidget *gncrw, - GNCLedgerDisplay *ld ) -{ - - - /* FIXME: - * This _shouldn't_ leak memory since we're asking for the old gnc_ledger - * [and associated table, &c.] to be closed. The other work that - * gnc_regWidget_init2 does [menu, toolbar, &c.], however, is leaked. */ - - gtk_container_remove( GTK_CONTAINER(gncrw), GTK_WIDGET( gncrw->reg ) ); - gnc_ledger_display_close( gncrw->ledger ); - gncrw->ledger = NULL; - gnc_regWidget_init2( gncrw, ld, GTK_WINDOW(gncrw->window) ); -} - -/********************************************************************\ - * gnc_register_raise * - * raise an existing register window to the front * - * * - * Args: rw - the register widget data structure * - * Return: nothing * -\********************************************************************/ -static void -gnc_register_raise (GNCRegWidget *rw) -{ - if (rw == NULL) - return; - - if (rw->window == NULL) - return; - - gtk_window_present (GTK_WINDOW(rw->window)); -} - -/********************************************************************\ - * gnc_register_jump_to_split * - * move the cursor to the split, if present in register * - * * - * Args: rw - the register widget data structure * - * split - the split to jump to * - * Return: nothing * -\********************************************************************/ -static void -gnc_register_jump_to_split(GNCRegWidget *rw, Split *split) -{ - Transaction *trans; - VirtualCellLocation vcell_loc; - SplitRegister *reg; - - if (!rw) return; - - trans = xaccSplitGetParent(split); -#if 0 /* jsled: If we don't know about dates, what do we do? */ - if (trans != NULL) - if (gnc_register_include_date(rw, xaccTransGetDate(trans))) - { - gnc_ledger_display_refresh (rw->ledger); - } -#endif /* 0 -- we don't know about dates. */ - - reg = gnc_ledger_display_get_split_register (rw->ledger); - - if (gnc_split_register_get_split_virt_loc(reg, split, &vcell_loc)) - gnucash_register_goto_virt_cell(rw->reg, vcell_loc); -} - -static void -gnc_register_change_style (GNCRegWidget *rw, SplitRegisterStyle style) -{ - SplitRegister *reg = gnc_ledger_display_get_split_register (rw->ledger); - - if (style == reg->style) - return; - - gnc_split_register_config (reg, reg->type, style, reg->use_double_line); - - gnc_ledger_display_refresh (rw->ledger); -} - -static void -gnc_register_style_ledger_cb (GtkWidget *w, gpointer data) -{ - GNCRegWidget *rw = data; - - if (!GTK_CHECK_MENU_ITEM (w)->active) - return; - - gnc_register_change_style (rw, REG_STYLE_LEDGER); -} - -static void -gnc_register_style_auto_ledger_cb (GtkWidget *w, gpointer data) -{ - GNCRegWidget *rw = data; - - if (!GTK_CHECK_MENU_ITEM (w)->active) - return; - - gnc_register_change_style (rw, REG_STYLE_AUTO_LEDGER); -} - -static void -gnc_register_style_journal_cb (GtkWidget *w, gpointer data) -{ - GNCRegWidget *rw = data; - - if (!GTK_CHECK_MENU_ITEM (w)->active) - return; - - gnc_register_change_style (rw, REG_STYLE_JOURNAL); -} - -static void -gnc_register_double_line_cb (GtkWidget *w, gpointer data) -{ - GNCRegWidget *rw = data; - SplitRegister *reg = gnc_ledger_display_get_split_register (rw->ledger); - gboolean use_double_line; - - use_double_line = GTK_CHECK_MENU_ITEM(w)->active; - - if (use_double_line == reg->use_double_line) - return; - - gnc_split_register_config (reg, reg->type, reg->style, use_double_line); - - gnc_ledger_display_refresh (rw->ledger); -} - -static void -gnc_register_sort (GNCRegWidget *rw, sort_type_t sort_code) -{ - Query *query = gnc_ledger_display_get_query (rw->ledger); - gboolean show_present_divider = FALSE; - GSList *p1 = NULL, *p2 = NULL, *p3 = NULL, *standard; - SplitRegister *reg; - - if (rw->sort_type == sort_code) - return; - - standard = g_slist_prepend (NULL, QUERY_DEFAULT_SORT); - - switch (sort_code) - { - case BY_STANDARD: - p1 = standard; - show_present_divider = TRUE; - break; - case BY_DATE: - p1 = g_slist_prepend (p1, TRANS_DATE_POSTED); - p1 = g_slist_prepend (p1, SPLIT_TRANS); - p2 = standard; - show_present_divider = TRUE; - break; - case BY_DATE_ENTERED: - p1 = g_slist_prepend (p1, TRANS_DATE_ENTERED); - p1 = g_slist_prepend (p1, SPLIT_TRANS); - p2 = standard; - break; - case BY_DATE_RECONCILED: - p1 = g_slist_prepend (p1, SPLIT_RECONCILE); - p2 = g_slist_prepend (p2, SPLIT_DATE_RECONCILED); - p3 = standard; - break; - case BY_NUM: - p1 = g_slist_prepend (p1, TRANS_NUM); - p1 = g_slist_prepend (p1, SPLIT_TRANS); - p2 = standard; - break; - case BY_AMOUNT: - p1 = g_slist_prepend (p1, SPLIT_VALUE); - p2 = standard; - break; - case BY_MEMO: - p1 = g_slist_prepend (p1, SPLIT_MEMO); - p2 = standard; - break; - case BY_DESC: - p1 = g_slist_prepend (p1, TRANS_DESCRIPTION); - p1 = g_slist_prepend (p1, SPLIT_TRANS); - p2 = standard; - break; - default: - g_slist_free (standard); - g_return_if_fail (FALSE); - } - - gncQuerySetSortOrder (query, p1, p2, p3); - - reg = gnc_ledger_display_get_split_register (rw->ledger); - - gnc_split_register_show_present_divider (reg, show_present_divider); - - rw->sort_type = sort_code; - - gnc_ledger_display_refresh(rw->ledger); -} - -static void -gnc_register_sort_standard_cb(GtkWidget *w, gpointer data) -{ - GNCRegWidget *rw = data; - - gnc_register_sort(rw, BY_STANDARD); -} - -static void -gnc_register_sort_date_cb(GtkWidget *w, gpointer data) -{ - GNCRegWidget *rw = data; - - gnc_register_sort(rw, BY_DATE); -} - -static void -gnc_register_sort_date_entered_cb(GtkWidget *w, gpointer data) -{ - GNCRegWidget *rw = data; - - gnc_register_sort(rw, BY_DATE_ENTERED); -} - -static void -gnc_register_sort_date_reconciled_cb(GtkWidget *w, gpointer data) -{ - GNCRegWidget *rw = data; - - gnc_register_sort(rw, BY_DATE_RECONCILED); -} - -static void -gnc_register_sort_num_cb(GtkWidget *w, gpointer data) -{ - GNCRegWidget *rw = data; - - gnc_register_sort(rw, BY_NUM); -} - -static void -gnc_register_sort_amount_cb(GtkWidget *w, gpointer data) -{ - GNCRegWidget *rw = data; - - gnc_register_sort(rw, BY_AMOUNT); -} - -static void -gnc_register_sort_memo_cb(GtkWidget *w, gpointer data) -{ - GNCRegWidget *rw = data; - - gnc_register_sort(rw, BY_MEMO); -} - -static void -gnc_register_sort_desc_cb(GtkWidget *w, gpointer data) -{ - GNCRegWidget *rw = data; - - gnc_register_sort(rw, BY_DESC); -} - -static GtkWidget * -gnc_register_create_tool_bar ( GNCRegWidget *rw ) -{ - GtkWidget *toolbar; - - static GnomeUIInfo toolbar_info[] = - { - { - GNOME_APP_UI_ITEM, - N_("Enter"), - N_("Record the current transaction"), - emit_enter_ent_cb, NULL, NULL, - GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_ADD, - 0, 0, NULL - }, - { - GNOME_APP_UI_ITEM, - N_("Cancel"), - N_("Cancel the current transaction"), - emit_cancel_ent_cb, NULL, NULL, - GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_UNDELETE, - 0, 0, NULL - }, - { - GNOME_APP_UI_ITEM, - N_("Delete"), - N_("Delete the current transaction"), - emit_delete_ent_cb, NULL, NULL, - GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_TRASH, - 0, 0, NULL - }, - GNOMEUIINFO_SEPARATOR, - { - GNOME_APP_UI_ITEM, - N_("Duplicate"), - N_("Make a copy of the current transaction for editing"), - emit_dup_ent_cb, NULL, NULL, - GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_COPY, - 0, 0, NULL - }, - { - GNOME_APP_UI_ITEM, - N_("Schedule..."), - N_("Create a Scheduled Transaction with the current " - "transaction as a template"), - emit_schedule_ent_cb, NULL, NULL, - GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_COPY, - 0, 0, NULL - }, - GNOMEUIINFO_SEPARATOR, - { - GNOME_APP_UI_TOGGLEITEM, - N_("Split"), - N_("Show all splits in the current transaction"), - emit_expand_ent_cb, NULL, NULL, - GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_BOOK_OPEN, - 0, 0, NULL - }, - { - GNOME_APP_UI_ITEM, - N_("Blank"), - N_("Move to the blank transaction at the " - "bottom of the register"), - emit_blank_cb, NULL, NULL, - GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_NEW, - 0, 0, NULL - }, - { - GNOME_APP_UI_ITEM, - N_("Jump"), - N_("Jump to the corresponding transaction in " - "the other account"), - emit_jump_cb, NULL, NULL, - GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_JUMP_TO, - 0, 0, NULL - }, - GNOMEUIINFO_END - }; - - toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_BOTH); - - gnome_app_fill_toolbar_with_data (GTK_TOOLBAR(toolbar), toolbar_info, - NULL, rw); - - if ( rw->disallowedCaps & CAP_DELETE ) { - gtk_widget_set_sensitive( toolbar_info[2].widget, FALSE ); - } - if ( rw->disallowedCaps & CAP_SCHEDULE ) { - gtk_widget_set_sensitive( toolbar_info[5].widget, FALSE ); - } - if ( rw->disallowedCaps & CAP_JUMP ) { - gtk_widget_set_sensitive( toolbar_info[9].widget, FALSE ); - } - - rw->split_button = toolbar_info[7].widget; - - /* Attach tooltips to the toolbar buttons */ - { - int i; - GtkTooltips *tips; - - tips = gtk_tooltips_new(); - - for ( i=0; toolbar_info[i].type != GNOME_APP_UI_ENDOFINFO; i++ ) { - if ( ! toolbar_info[i].widget ) { - continue; - } - gtk_tooltips_set_tip( tips, toolbar_info[i].widget, - toolbar_info[i].hint, NULL ); - } - - } - - return toolbar; -} - -static GtkWidget * -gnc_regWidget_create_status_bar (GNCRegWidget *rw) -{ - GtkWidget *statusbar; - - statusbar = gnome_appbar_new (FALSE, /* no progress bar */ - TRUE, /* has status area */ - GNOME_PREFERENCES_USER); - rw->statusbar = statusbar; - - return statusbar; -} - -static void -gnc_register_jump_to_blank (GNCRegWidget *rw) -{ - SplitRegister *reg = gnc_ledger_display_get_split_register (rw->ledger); - VirtualCellLocation vcell_loc; - Split *blank; - - blank = gnc_split_register_get_blank_split (reg); - if (blank == NULL) - return; - - if (gnc_split_register_get_split_virt_loc (reg, blank, &vcell_loc)) - gnucash_register_goto_virt_cell (rw->reg, vcell_loc); -} - - -static void -expand_ent_cb (GNCRegWidget *rw, gpointer data) -{ - gboolean expand; - SplitRegister *reg; - - reg = gnc_ledger_display_get_split_register (rw->ledger); - -#if 0 - /* this isn't true. --jsled */ - expand = GTK_TOGGLE_BUTTON (widget)->active; -#else - expand = TRUE; -#endif /* 0 */ - - gnc_split_register_expand_current_trans (reg, expand); -} - -/* default handler --jsled */ -static void -new_trans_cb (GNCRegWidget *rw, gpointer data) -{ - SplitRegister *reg; - - reg = gnc_ledger_display_get_split_register (rw->ledger); - - if (gnc_split_register_save (reg, TRUE)) - gnc_split_register_redraw (reg); - - gnc_register_jump_to_blank (rw); -} - -static void -emit_enter_ent_cb( GtkWidget *widget, gpointer data ) -{ - emit_cb( (GNCRegWidget*)data, "enter_ent", widget ); -} - -static void -emit_cancel_ent_cb( GtkWidget *widget, gpointer data ) -{ - emit_cb( (GNCRegWidget*)data, "cancel_ent", widget ); -} - -static void -emit_delete_ent_cb( GtkWidget *widget, gpointer data ) -{ - emit_cb( (GNCRegWidget*)data, "delete_ent", widget ); -} - -static void -emit_dup_ent_cb( GtkWidget *widget, gpointer data ) -{ - emit_cb( (GNCRegWidget*)data, "dup_ent", widget ); -} - -static -void -emit_schedule_ent_cb( GtkWidget *widget, gpointer data ) -{ - emit_cb( (GNCRegWidget*)data, "schedule_ent", widget ); -} - -static void -emit_expand_ent_cb( GtkWidget *widget, gpointer data ) -{ - emit_cb( (GNCRegWidget*)data, "expand_ent", widget ); -} - -static void -emit_blank_cb( GtkWidget *widget, gpointer data ) -{ - emit_cb( (GNCRegWidget*)data, "blank", widget ); -} - -static void -emit_jump_cb( GtkWidget *widget, gpointer data ) -{ - emit_cb( (GNCRegWidget*)data, "jump", widget ); -} - -static void -emit_cb( GNCRegWidget *rw, const char *signal_name, gpointer ud ) -{ - gtk_signal_emit_by_name( GTK_OBJECT(rw), signal_name, NULL ); -} - -static void -jump_cb(GNCRegWidget *rw, gpointer data) -{ -#if 0 - RegWindow *regData; -#endif - SplitRegister *reg; - Account *account; - Account *leader; - Split *split; - - reg = gnc_ledger_display_get_split_register (rw->ledger); - - split = gnc_split_register_get_current_split (reg); - if (split == NULL) - return; - - account = xaccSplitGetAccount(split); - if (account == NULL) - return; - - leader = gnc_ledger_display_leader (rw->ledger); - - if (account == leader) - { - split = xaccSplitGetOtherSplit(split); - if (split == NULL) - return; - - account = xaccSplitGetAccount(split); - if (account == NULL) - return; - if (account == leader) - return; - } - -#if 0 - regData = regWindowSimple(account); - if (regData == NULL) - return; -#endif - - gnc_register_raise (rw); - gnc_register_jump_to_split (rw, split); -} - -static void -gnc_register_create_menus(GNCRegWidget *rw, GtkWidget *statusbar) -{ - GtkAccelGroup *accel_group; - - static GnomeUIInfo style_list[] = - { - GNOMEUIINFO_RADIOITEM_DATA(N_("Basic Ledger"), - N_("Show transactions on one or two lines"), - gnc_register_style_ledger_cb, NULL, NULL), - GNOMEUIINFO_RADIOITEM_DATA(N_("Auto-Split Ledger"), - N_("Show transactions on one or two lines and " - "expand the current transaction"), - gnc_register_style_auto_ledger_cb, NULL, NULL), - GNOMEUIINFO_RADIOITEM_DATA(N_("Transaction Journal"), - N_("Show expanded transactions with all " - "splits"), - gnc_register_style_journal_cb, NULL, NULL), - GNOMEUIINFO_END - }; - - static GnomeUIInfo style_menu[] = - { - GNOMEUIINFO_RADIOLIST(style_list), - GNOMEUIINFO_SEPARATOR, - GNOMEUIINFO_TOGGLEITEM(N_("_Double Line"), - N_("Show two lines of information for each " - "transaction"), - gnc_register_double_line_cb, NULL), - GNOMEUIINFO_END - }; - - static GnomeUIInfo sort_list[] = - { - GNOMEUIINFO_RADIOITEM_DATA(N_("Standard order"), - N_("Keep normal account order"), - gnc_register_sort_standard_cb, NULL, NULL), - GNOMEUIINFO_RADIOITEM_DATA(N_("Sort by Date"), - N_("Sort by Date"), - gnc_register_sort_date_cb, NULL, NULL), - GNOMEUIINFO_RADIOITEM_DATA(N_("Sort by date of entry"), - N_("Sort by the date of entry"), - gnc_register_sort_date_entered_cb, - NULL, NULL), - GNOMEUIINFO_RADIOITEM_DATA(N_("Sort by statement date"), - N_("Sort by the statement date " - "(unreconciled items last)"), - gnc_register_sort_date_reconciled_cb, - NULL, NULL), - GNOMEUIINFO_RADIOITEM_DATA(N_("Sort by Num"), - N_("Sort by Num"), - gnc_register_sort_num_cb, NULL, NULL), - GNOMEUIINFO_RADIOITEM_DATA(N_("Sort by Amount"), - N_("Sort by Amount"), - gnc_register_sort_amount_cb, NULL, NULL), - GNOMEUIINFO_RADIOITEM_DATA(N_("Sort by Memo"), - N_("Sort by Memo"), - gnc_register_sort_memo_cb, NULL, NULL), - GNOMEUIINFO_RADIOITEM_DATA(N_("Sort by Description"), - N_("Sort by Description"), - gnc_register_sort_desc_cb, NULL, NULL), - GNOMEUIINFO_END - }; - - static GnomeUIInfo sort_menu[] = - { - GNOMEUIINFO_RADIOLIST(sort_list), - GNOMEUIINFO_END - }; - - static GnomeUIInfo edit_menu[] = - { - GNOMEUIINFO_MENU_CUT_ITEM(cutCB, NULL), - GNOMEUIINFO_MENU_COPY_ITEM(copyCB, NULL), - GNOMEUIINFO_MENU_PASTE_ITEM(pasteCB, NULL), - GNOMEUIINFO_SEPARATOR, - { - GNOME_APP_UI_ITEM, - N_("Cut Transaction"), - N_("Cut the selected transaction"), - cutTransCB, NULL, NULL, - GNOME_APP_PIXMAP_NONE, NULL, - 0, 0, NULL - }, - { - GNOME_APP_UI_ITEM, - N_("Copy Transaction"), - N_("Copy the selected transaction"), - copyTransCB, NULL, NULL, - GNOME_APP_PIXMAP_NONE, NULL, - 0, 0, NULL - }, - { - GNOME_APP_UI_ITEM, - N_("Paste Transaction"), - N_("Paste the transaction clipboard"), - pasteTransCB, NULL, NULL, - GNOME_APP_PIXMAP_NONE, NULL, - 0, 0, NULL - }, - GNOMEUIINFO_END - }; - - static GnomeUIInfo txn_menu[] = - { - { - GNOME_APP_UI_ITEM, - N_("_Enter"), - N_("Record the current transaction"), - emit_enter_ent_cb, NULL, NULL, - GNOME_APP_PIXMAP_NONE, NULL, - 0, 0, NULL - }, - { - GNOME_APP_UI_ITEM, - N_("_Cancel"), - N_("Cancel the current transaction"), - emit_cancel_ent_cb, NULL, NULL, - GNOME_APP_PIXMAP_NONE, NULL, - 0, 0, NULL - }, - { - GNOME_APP_UI_ITEM, - N_("_Delete"), - N_("Delete the selected transaction"), - emit_delete_ent_cb, NULL, NULL, - GNOME_APP_PIXMAP_NONE, NULL, - 0, 0, NULL - }, - GNOMEUIINFO_SEPARATOR, - { - GNOME_APP_UI_ITEM, - N_("D_uplicate"), - N_("Make a copy of the current transaction"), - emit_dup_ent_cb, NULL, NULL, - GNOME_APP_PIXMAP_NONE, NULL, - 0, 0, NULL - }, - { - GNOME_APP_UI_ITEM, - N_("Schedule..."), - N_("Create a Scheduled Transaction with the current " - "transaction as a template"), - emit_schedule_ent_cb, NULL, NULL, - GNOME_APP_PIXMAP_NONE, NULL, - 0, 0, NULL - }, - GNOMEUIINFO_SEPARATOR, - { - GNOME_APP_UI_TOGGLEITEM, - N_("_Split"), - N_("Show all splits in the current transaction"), - emit_expand_ent_cb, NULL, NULL, - GNOME_APP_PIXMAP_NONE, NULL, - 0, 0, NULL - }, - { - GNOME_APP_UI_ITEM, - N_("_Blank"), - N_("Move to the blank transaction at the " - "bottom of the register"), - emit_blank_cb, NULL, NULL, - GNOME_APP_PIXMAP_NONE, NULL, - 0, 0, NULL - }, - { - GNOME_APP_UI_ITEM, - N_("_Jump"), - N_("Jump to the corresponding transaction in " - "the other account"), - emit_jump_cb, NULL, NULL, - GNOME_APP_PIXMAP_NONE, NULL, - 0, 0, NULL - }, - GNOMEUIINFO_END - }; - - accel_group = gtk_accel_group_new(); - gtk_accel_group_attach(accel_group, GTK_OBJECT(rw->window)); - - rw->style_menu = gtk_menu_new(); - gnc_fill_menu_with_data( style_menu, rw ); - gnome_app_fill_menu( GTK_MENU_SHELL(rw->style_menu), - style_menu, - accel_group, TRUE, 0); - gnome_app_install_appbar_menu_hints( GNOME_APPBAR(rw->statusbar), - style_menu ); - - rw->sort_menu = gtk_menu_new(); - gnc_fill_menu_with_data( sort_menu, rw ); - gnome_app_fill_menu( GTK_MENU_SHELL(rw->sort_menu), sort_menu, - accel_group, TRUE, 0 ); - gnome_app_install_appbar_menu_hints( GNOME_APPBAR(rw->statusbar), - sort_menu ); - - rw->edit_menu = gtk_menu_new(); - gnc_fill_menu_with_data( edit_menu, rw ); - gnome_app_fill_menu( GTK_MENU_SHELL(rw->edit_menu), edit_menu, - accel_group, TRUE, 0 ); - gnome_app_install_appbar_menu_hints( GNOME_APPBAR(rw->statusbar), - edit_menu ); - - rw->transaction_menu = gtk_menu_new(); - gnc_fill_menu_with_data( txn_menu, rw ); - gnome_app_fill_menu( GTK_MENU_SHELL(rw->transaction_menu), txn_menu, - accel_group, TRUE, 0 ); - gnome_app_install_appbar_menu_hints( GNOME_APPBAR(rw->statusbar), - txn_menu ); - if ( rw->disallowedCaps & CAP_DELETE ) { - gtk_widget_set_sensitive( txn_menu[2].widget, FALSE ); - } - if ( rw->disallowedCaps & CAP_SCHEDULE ) { - gtk_widget_set_sensitive( txn_menu[5].widget, FALSE ); - } - if ( rw->disallowedCaps & CAP_JUMP ) { - gtk_widget_set_sensitive( txn_menu[9].widget, FALSE ); - } - - rw->double_line_check = style_menu[2].widget; - rw->split_menu_check = txn_menu[7].widget; - - /* Make sure the right style radio item is active */ - { - SplitRegister *reg; - GtkWidget *widget; - int index; - - reg = gnc_ledger_display_get_split_register (rw->ledger); - - switch (reg->style) - { - default: - printf( "default\n" ); - case REG_STYLE_LEDGER: - index = 0; - break; - case REG_STYLE_AUTO_LEDGER: - index = 1; - break; - case REG_STYLE_JOURNAL: - index = 2; - break; - } - - /* registers with more than one account can only use journal mode */ - if (reg->type >= NUM_SINGLE_REGISTER_TYPES) - { - widget = style_list[0].widget; - gtk_widget_set_sensitive (widget, FALSE); - - widget = style_list[1].widget; - gtk_widget_set_sensitive (widget, FALSE); - } - - widget = style_list[index].widget; - gtk_signal_handler_block_by_data(GTK_OBJECT(widget), rw); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), TRUE); - gtk_signal_handler_unblock_by_data(GTK_OBJECT(widget), rw); - } -} - -static GtkWidget * -gnc_register_create_popup_menu (GNCRegWidget *rw) -{ - GtkWidget *popup; - - GnomeUIInfo transaction_menu[] = - { - { - GNOME_APP_UI_ITEM, - N_("_Enter"), - N_("Record the current transaction"), - emit_enter_ent_cb, NULL, NULL, - GNOME_APP_PIXMAP_NONE, NULL, - 0, 0, NULL - }, - { - GNOME_APP_UI_ITEM, - N_("_Cancel"), - N_("Cancel the current transaction"), - emit_cancel_ent_cb, NULL, NULL, - GNOME_APP_PIXMAP_NONE, NULL, - 0, 0, NULL - }, - { - GNOME_APP_UI_ITEM, - N_("_Delete"), - N_("Delete the current transaction"), - emit_delete_ent_cb, NULL, NULL, - GNOME_APP_PIXMAP_NONE, NULL, - 0, 0, NULL - }, - GNOMEUIINFO_SEPARATOR, - { - GNOME_APP_UI_ITEM, - N_("D_uplicate"), - N_("Make a copy of the current transaction"), - emit_dup_ent_cb, NULL, NULL, - GNOME_APP_PIXMAP_NONE, NULL, - 0, 0, NULL - }, - { - GNOME_APP_UI_ITEM, - N_("_Schedule..."), - N_("Create a Scheduled Transaction with the current " - "transaction as a template"), - emit_schedule_ent_cb, NULL, NULL, - GNOME_APP_PIXMAP_NONE, NULL, - 0, 0, NULL - }, - GNOMEUIINFO_SEPARATOR, - { - GNOME_APP_UI_TOGGLEITEM, - N_("_Split"), - N_("Show all splits in the current transaction"), - emit_expand_ent_cb, NULL, NULL, - GNOME_APP_PIXMAP_NONE, NULL, - 0, 0, NULL - }, - { - GNOME_APP_UI_ITEM, - N_("_Blank"), - N_("Move to the blank transaction at the " - "bottom of the register"), - emit_blank_cb, NULL, NULL, - GNOME_APP_PIXMAP_NONE, NULL, - 0, 0, NULL - }, - { - GNOME_APP_UI_ITEM, - N_("_Jump"), - N_("Jump to the corresponding transaction in " - "the other account."), - emit_jump_cb, NULL, NULL, - GNOME_APP_PIXMAP_NONE, NULL, - 0, 0, NULL - }, - GNOMEUIINFO_END - }; - - gnc_fill_menu_with_data (transaction_menu, rw); - - popup = gnome_popup_menu_new (transaction_menu); - - if ( rw->disallowedCaps & CAP_DELETE ) { - gtk_widget_set_sensitive( transaction_menu[2].widget, FALSE ); - } - if ( rw->disallowedCaps & CAP_SCHEDULE ) { - gtk_widget_set_sensitive( transaction_menu[5].widget, FALSE ); - } - if ( rw->disallowedCaps & CAP_JUMP ) { - gtk_widget_set_sensitive( transaction_menu[9].widget, FALSE ); - } - - rw->split_popup_check = transaction_menu[7].widget; - - gnome_app_install_appbar_menu_hints( GNOME_APPBAR(rw->statusbar), - transaction_menu ); - - return popup; -} - -static void -gnc_register_record (GNCRegWidget *rw) -{ - SplitRegister *reg; - Transaction *trans; - - reg = gnc_ledger_display_get_split_register (rw->ledger); - - trans = gnc_split_register_get_current_trans (reg); - - if (!gnc_split_register_save (reg, TRUE)) - return; - - gnc_ledger_display_refresh( rw->ledger ); -} - -static gboolean -gnc_register_match_trans_row (VirtualLocation virt_loc, - gpointer user_data) -{ - GNCRegWidget *rw = user_data; - CursorClass cursor_class; - SplitRegister *sr; - - sr = gnc_ledger_display_get_split_register (rw->ledger); - cursor_class = gnc_split_register_get_cursor_class (sr, virt_loc.vcell_loc); - - return (cursor_class == CURSOR_CLASS_TRANS); -} - -static void -gnc_register_goto_next_trans_row (GNCRegWidget *rw) -{ - gnucash_register_goto_next_matching_row (rw->reg, - gnc_register_match_trans_row, - rw); -} - -static void -gnc_register_enter (GNCRegWidget *rw, gboolean next_transaction) -{ - SplitRegister *sr = gnc_ledger_display_get_split_register (rw->ledger); - gboolean goto_blank; - - goto_blank = gnc_lookup_boolean_option("Register", - "'Enter' moves to blank transaction", - FALSE); - - /* If we are in single or double line mode and we hit enter - * on the blank split, go to the blank split instead of the - * next row. This prevents the cursor from jumping around - * when you are entering transactions. */ - if (!goto_blank && !next_transaction) - { - SplitRegisterStyle style = sr->style; - - if (style == REG_STYLE_LEDGER) - { - Split *blank_split; - - blank_split = gnc_split_register_get_blank_split(sr); - if (blank_split != NULL) - { - Split *current_split; - - current_split = gnc_split_register_get_current_split(sr); - - if (blank_split == current_split) - goto_blank = TRUE; - } - } - } - - /* First record the transaction. This will perform a refresh. */ - gnc_register_record (rw); - - if (!goto_blank && next_transaction) - gnc_split_register_expand_current_trans (sr, FALSE); - - /* Now move. */ - if (goto_blank) - gnc_register_jump_to_blank (rw); - else if (next_transaction) - gnc_register_goto_next_trans_row (rw); - else - gnucash_register_goto_next_virt_row (rw->reg); -} - -static void -gnc_register_record_cb (GnucashRegister *reg, gpointer data) -{ - GNCRegWidget *rw = data; - - gnc_register_enter (rw, FALSE); -} - -static gboolean -gnc_register_delete_cb(GtkWidget *widget, GdkEvent *event, gpointer data) -{ - GNCRegWidget *rw = data; - gnc_register_check_close (rw); - gnc_ledger_display_close (rw->ledger); - return FALSE; /* let the user handle correctly. */ -} - -static void -gnc_register_destroy_cb(GtkWidget *widget, gpointer data) -{ - GNCRegWidget *rw = GNC_REGWIDGET(widget); - SCM id; - - gnc_ledger_display_close (rw->ledger); - id = rw->toolbar_change_callback_id; - gnc_unregister_option_change_callback_id(id); -} - -static gncUIWidget -gnc_register_get_parent(GNCLedgerDisplay *ledger) -{ - GNCRegWidget *rw = gnc_ledger_display_get_user_data (ledger); - - if (rw == NULL) - return NULL; - - return rw->window; -} - -static void -gnc_toolbar_change_cb (void *data) -{ - GNCRegWidget *rw = data; - - gnc_reg_refresh_toolbar (rw); -} - -/********************************************************************\ - * WAS: regWindowLedger( GNCLedgerDisplay *ledger ); * -\********************************************************************/ -static void -gnc_regWidget_init( GNCRegWidget *rw ) -{ - rw->sort_type = BY_STANDARD; - rw->width = -1; - rw->height = -1; - rw->disallowedCaps = 0; - - gtk_signal_connect (GTK_OBJECT(rw), "destroy", - GTK_SIGNAL_FUNC (gnc_register_destroy_cb), NULL); - -} - -struct foo { - char * signal_name; - void (*handler)(); -}; - -static void -gnc_regWidget_init2( GNCRegWidget *rw, GNCLedgerDisplay *ledger, GtkWindow *win ) -{ - static GSList *date_param = NULL; - static struct foo bar[] = { - { "enter_ent", recordCB }, - { "cancel_ent", cancelCB }, - { "delete_ent", deleteCB }, - { "dup_ent", duplicateCB }, - { "expand_ent", expand_ent_cb }, - { "blank", new_trans_cb }, - { "jump", jump_cb }, - { NULL, NULL } - }; - SplitRegister *reg; - gboolean show_all; - gboolean has_date; - int i; - - rw->window = GTK_WIDGET(win); - rw->ledger = ledger; - - /* attach predefined handlers */ - for ( i = 0; bar[i].signal_name != NULL; i++ ) { - gtk_signal_connect( GTK_OBJECT(rw), - bar[i].signal_name, - GTK_SIGNAL_FUNC(bar[i].handler), - NULL ); - } - - rw->statusbar = gnc_regWidget_create_status_bar(rw); - - /* The tool bar */ - { - SCM id; - - rw->toolbar = gnc_register_create_tool_bar(rw); - gtk_container_set_border_width(GTK_CONTAINER(rw->toolbar), 2); - - id = gnc_register_option_change_callback(gnc_toolbar_change_cb, rw, - "General", "Toolbar Buttons"); - rw->toolbar_change_callback_id = id; - } - - gnc_register_create_menus( rw, rw->statusbar ); - rw->popup_menu = gnc_register_create_popup_menu (rw); - - reg = gnc_ledger_display_get_split_register (rw->ledger); - gnc_ledger_display_set_user_data (rw->ledger, rw); - - gtk_signal_connect (GTK_OBJECT(rw->window), "delete-event", - GTK_SIGNAL_FUNC (gnc_register_delete_cb), rw); - - gnc_ledger_display_set_handlers (rw->ledger, - regDestroy, - gnc_register_get_parent); - - show_all = gnc_lookup_boolean_option ("Register", - "Show All Transactions", - TRUE); - - if (date_param == NULL) { - date_param = g_slist_prepend (NULL, TRANS_DATE_POSTED); - date_param = g_slist_prepend (date_param, SPLIT_TRANS); - } - - { - Query *q = gnc_ledger_display_get_query (rw->ledger); - has_date = gncQueryHasTermType (q, date_param); - } - - if (has_date) - show_all = FALSE; - - /* Now that we have a date range, remove any existing - * maximum on the number of splits returned. */ - xaccQuerySetMaxSplits (gnc_ledger_display_get_query (rw->ledger), -1); - - /* The CreateTable will do the actual gui init, returning a widget */ - { - GtkWidget *register_widget; - - /* FIXME_jsled: need to pass in caller's request for the number of - * lines. For now, we expect the caller to have called - * 'set_initial_rows' before creating us. */ - - register_widget = gnucash_register_new (reg->table); - - gtk_container_add (GTK_CONTAINER(rw), register_widget); - - rw->reg = GNUCASH_REGISTER (register_widget); - - /* do we _really_ need the window? [--jsled] - * - * Seems like we do ... some magic regarding gnucash-sheet sizing is - * going on with the window's width and height. -- 2002.04.14 - */ - GNUCASH_SHEET(rw->reg->sheet)->window = GTK_WIDGET(win); - - /* jsled: we actually want these... */ - gtk_signal_connect (GTK_OBJECT(register_widget), "activate_cursor", - GTK_SIGNAL_FUNC(gnc_register_record_cb), rw); - gtk_signal_connect (GTK_OBJECT(register_widget), "redraw_all", - GTK_SIGNAL_FUNC(gnc_register_redraw_all_cb), rw); - gtk_signal_connect (GTK_OBJECT(register_widget), "redraw_help", - GTK_SIGNAL_FUNC(gnc_register_redraw_help_cb), rw); - gnucash_register_attach_popup (GNUCASH_REGISTER(register_widget), - rw->popup_menu, rw); - - gnc_table_init_gui (register_widget, reg); - } - -#if 0 - /* jsled: something's not right ... enabling this causes segfault... - * Gtk-CRITICAL **: file gtkstyle.c: line 515 (gtk_style_attach): assertion `window != NULL' failed. - * Gdk-CRITICAL **: file gdkwindow.c: line 716 (gdk_window_ref): assertion `window != NULL' failed. - * Gtk-CRITICAL **: file gtkstyle.c: line 515 (gtk_style_attach): assertion `window != NULL' failed. - */ - { - gboolean use_double_line; - GtkCheckMenuItem *check; - - use_double_line = gnc_lookup_boolean_option ("Register", - "Double Line Mode", - FALSE); - - /* be sure to initialize the gui elements associated with the cursor */ - gnc_split_register_config (reg, reg->type, reg->style, use_double_line); - - check = GTK_CHECK_MENU_ITEM (rw->double_line_check); - - gtk_signal_handler_block_by_func - (GTK_OBJECT (check), - GTK_SIGNAL_FUNC (gnc_register_double_line_cb), rw); - - gtk_check_menu_item_set_active (check, use_double_line); - - gtk_signal_handler_unblock_by_func - (GTK_OBJECT (check), - GTK_SIGNAL_FUNC (gnc_register_double_line_cb), rw); - } -#endif /* 0 */ - - gtk_widget_show_all (GTK_WIDGET(rw)); - - gnc_split_register_show_present_divider (reg, TRUE); - - gnc_ledger_display_refresh (rw->ledger); - gnc_reg_refresh_toolbar (rw); -} - -static void -gnc_reg_refresh_toolbar (GNCRegWidget *rw) -{ - GtkToolbarStyle tbstyle; - - if ((rw == NULL) || (rw->toolbar == NULL)) - return; - - tbstyle = gnc_get_toolbar_style (); - - gtk_toolbar_set_style (GTK_TOOLBAR (rw->toolbar), tbstyle); - gtk_widget_show_all( GTK_WIDGET(rw) ); -} - -/* jsled: deps: window, summary labels, - * I think we want to re-emit this signal? - * Or just tell Users they need get at it? */ -static void -gnc_register_redraw_all_cb (GnucashRegister *g_reg, gpointer data) -{ - GNCRegWidget *rw = data; - Account *leader; - gboolean expand; - gboolean sensitive; - SplitRegister *reg; - - leader = gnc_ledger_display_leader (rw->ledger); - - reg = gnc_ledger_display_get_split_register (rw->ledger); - - expand = gnc_split_register_current_trans_expanded (reg); - - gtk_signal_handler_block_by_data - (GTK_OBJECT (rw->split_button), rw); - gtk_toggle_button_set_active - (GTK_TOGGLE_BUTTON (rw->split_button), expand); - gtk_signal_handler_unblock_by_data - (GTK_OBJECT (rw->split_button), rw); - - gtk_signal_handler_block_by_data - (GTK_OBJECT (rw->split_menu_check), rw); - gtk_check_menu_item_set_active - (GTK_CHECK_MENU_ITEM (rw->split_menu_check), expand); - gtk_signal_handler_unblock_by_data - (GTK_OBJECT (rw->split_menu_check), rw); - - gtk_check_menu_item_set_active - (GTK_CHECK_MENU_ITEM (rw->split_popup_check), expand); - - sensitive = reg->style == REG_STYLE_LEDGER; - - gtk_widget_set_sensitive (rw->split_button, sensitive); - gtk_widget_set_sensitive (rw->split_menu_check, sensitive); - gtk_widget_set_sensitive (rw->split_popup_check, sensitive); -} - -static void -gnc_register_redraw_help_cb (GnucashRegister *g_reg, gpointer data) -{ - GNCRegWidget *rw = data; - SplitRegister *reg; - const char *status; - char *help; - - if (!rw) - return; - - reg = gnc_ledger_display_get_split_register (rw->ledger); - - help = gnc_table_get_help (reg->table); - - status = help ? help : ""; - - gnome_appbar_set_default (GNOME_APPBAR(rw->statusbar), status); - - g_free (help); -} - -/********************************************************************\ - * regDestroy() -\********************************************************************/ - -static void -regDestroy (GNCLedgerDisplay *ledger) -{ - GNCRegWidget *rw = gnc_ledger_display_get_user_data (ledger); - - if (rw) - { - SplitRegister *reg; - - reg = gnc_ledger_display_get_split_register (ledger); - - if (reg && reg->table) - gnc_table_save_state (reg->table); - - } - gnc_ledger_display_set_user_data (ledger, NULL); -} - -/********************************************************************\ - * cutCB -- cut the selection to the clipboard * - * * - * Args: w - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -static void -cutCB (GtkWidget *w, gpointer data) -{ - GNCRegWidget *rw = data; - - gnucash_register_cut_clipboard (rw->reg); -} - - -/********************************************************************\ - * copyCB -- copy the selection to the clipboard * - * * - * Args: w - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -static void -copyCB (GtkWidget *w, gpointer data) -{ - GNCRegWidget *rw = data; - - gnucash_register_copy_clipboard (rw->reg); -} - - -/********************************************************************\ - * pasteCB -- paste the clipboard to the selection * - * * - * Args: w - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -static void -pasteCB (GtkWidget *w, gpointer data) -{ - GNCRegWidget *rw = data; - - gnucash_register_paste_clipboard (rw->reg); -} - - -/********************************************************************\ - * cutTransCB -- cut the current transaction to the clipboard * - * * - * Args: w - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -static void -cutTransCB (GtkWidget *w, gpointer data) -{ - GNCRegWidget *rw = data; - - gnc_split_register_cut_current - (gnc_ledger_display_get_split_register (rw->ledger)); -} - - -/********************************************************************\ - * copyTransCB -- copy the current transaction to the clipboard * - * * - * Args: w - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -static void -copyTransCB(GtkWidget *w, gpointer data) -{ - GNCRegWidget *rw = data; - - gnc_split_register_copy_current - (gnc_ledger_display_get_split_register (rw->ledger)); -} - - -/********************************************************************\ - * pasteTransCB -- paste the transaction clipboard to the selection * - * * - * Args: w - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -static void -pasteTransCB (GtkWidget *w, gpointer data) -{ - GNCRegWidget *rw = data; - - gnc_split_register_paste_current - (gnc_ledger_display_get_split_register (rw->ledger)); -} - -/********************************************************************\ - * recordCB * - * * - * Args: w - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -static void -recordCB (GNCRegWidget *rw, gpointer data) -{ - gnc_register_enter (rw, TRUE); -} - - -static void -gnc_transaction_delete_toggle_cb(GtkToggleButton *button, gpointer data) -{ - GtkWidget *text = gtk_object_get_user_data(GTK_OBJECT(button)); - gchar *s = data; - gint pos = 0; - - gtk_editable_delete_text(GTK_EDITABLE(text), 0, -1); - gtk_editable_insert_text(GTK_EDITABLE(text), s, strlen(s), &pos); -} - -typedef enum -{ - DELETE_TRANS, - DELETE_SPLITS, - DELETE_CANCEL -} DeleteType; - -/********************************************************************\ - * gnc_transaction_delete_query * - * creates and displays a dialog which asks the user wheter they * - * want to delete a whole transaction, or just a split. * - * It returns a DeleteType code indicating the user's choice. * - * * - * Args: parent - the parent window the dialog should use * - * Returns: DeleteType choice indicator * - \*******************************************************************/ -static DeleteType -gnc_transaction_delete_query (GtkWindow *parent, Transaction *trans) -{ - GtkWidget *dialog; - GtkWidget *dvbox; - GtkWidget *frame; - GtkWidget *vbox; - GtkWidget *trans_button; - GtkWidget *splits_button; - GtkWidget *text; - GSList *group; - gint pos = 0; - gint result; - gboolean reconciled; - - const char *usual = _("This selection will delete the whole " - "transaction. This is what you usually want."); - const char *usual_recn = _("This selection will delete the whole " - "transaction.\n\n" - "You would be deleting a transaction " - "with reconciled splits!"); - const char *warn = _("Warning: Just deleting all the other splits will " - "make your account unbalanced. You probably " - "shouldn't do this unless you're going to " - "immediately add another split to bring the " - "transaction back into balance."); - const char *warn_recn = _("You would be deleting reconciled splits!"); - const char *cbuf; - char *buf; - - DeleteType return_value; - - reconciled = xaccTransHasReconciledSplits (trans); - - dialog = gnome_dialog_new(_("Delete Transaction"), - GNOME_STOCK_BUTTON_OK, - GNOME_STOCK_BUTTON_CANCEL, - NULL); - - gnome_dialog_set_default(GNOME_DIALOG(dialog), 0); - gnome_dialog_close_hides(GNOME_DIALOG(dialog), TRUE); - gnome_dialog_set_parent(GNOME_DIALOG(dialog), parent); - - dvbox = GNOME_DIALOG(dialog)->vbox; - - frame = gtk_frame_new(NULL); - gtk_container_border_width(GTK_CONTAINER(frame), 5); - - vbox = gtk_vbox_new(TRUE, 3); - gtk_container_border_width(GTK_CONTAINER(vbox), 5); - gtk_container_add(GTK_CONTAINER(frame), vbox); - - text = gtk_text_new(NULL, NULL); - - trans_button = - gtk_radio_button_new_with_label(NULL, - _("Delete the whole transaction")); - gtk_object_set_user_data(GTK_OBJECT(trans_button), text); - gtk_box_pack_start(GTK_BOX(vbox), trans_button, TRUE, TRUE, 0); - - gtk_signal_connect(GTK_OBJECT(trans_button), "toggled", - GTK_SIGNAL_FUNC(gnc_transaction_delete_toggle_cb), - (gpointer) (reconciled ? usual_recn : usual)); - - group = gtk_radio_button_group(GTK_RADIO_BUTTON(trans_button)); - splits_button = - gtk_radio_button_new_with_label(group, _("Delete all the other splits")); - gtk_object_set_user_data(GTK_OBJECT(splits_button), text); - gtk_box_pack_start(GTK_BOX(vbox), splits_button, TRUE, TRUE, 0); - - if (reconciled) - buf = g_strconcat (warn, "\n\n", warn_recn, NULL); - else - buf = g_strdup (warn); - - gtk_signal_connect(GTK_OBJECT(splits_button), "toggled", - GTK_SIGNAL_FUNC(gnc_transaction_delete_toggle_cb), - (gpointer) buf); - - gtk_box_pack_start(GTK_BOX(dvbox), frame, TRUE, TRUE, 0); - - cbuf = reconciled ? usual_recn : usual; - gtk_editable_insert_text(GTK_EDITABLE(text), cbuf, strlen(cbuf), &pos); - gtk_text_set_line_wrap(GTK_TEXT(text), TRUE); - gtk_text_set_word_wrap(GTK_TEXT(text), TRUE); - gtk_text_set_editable(GTK_TEXT(text), FALSE); - gtk_box_pack_start(GTK_BOX(dvbox), text, FALSE, FALSE, 0); - - gtk_widget_show_all(dvbox); - - result = gnome_dialog_run_and_close(GNOME_DIALOG(dialog)); - - g_free (buf); - - if (result != 0) - return_value = DELETE_CANCEL; - else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(trans_button))) - return_value = DELETE_TRANS; - else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(splits_button))) - return_value = DELETE_SPLITS; - else - return_value = DELETE_CANCEL; - - gtk_widget_destroy(dialog); - - return return_value; -} - -/* This is really tied to the SplitRegister, but that's fine for now. */ - -/********************************************************************\ - * deleteCB * - * * - * Args: widget - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -static void -deleteCB(GNCRegWidget *rw, gpointer data) -{ - SplitRegisterStyle style; - CursorClass cursor_class; - SplitRegister *reg; - Transaction *trans; - char *buf = NULL; - Split *split; - gint result; - - reg = gnc_ledger_display_get_split_register (rw->ledger); - - /* get the current split based on cursor position */ - split = gnc_split_register_get_current_split(reg); - if (split == NULL) - { - gnc_split_register_cancel_cursor_split_changes (reg); - return; - } - - trans = xaccSplitGetParent(split); - style = reg->style; - cursor_class = gnc_split_register_get_current_cursor_class (reg); - - /* Deleting the blank split just cancels */ - { - Split *blank_split = gnc_split_register_get_blank_split (reg); - - if (split == blank_split) - { - gnc_split_register_cancel_cursor_trans_changes (reg); - return; - } - } - - if (cursor_class == CURSOR_CLASS_NONE) - return; - - /* On a split cursor, just delete the one split. */ - if (cursor_class == CURSOR_CLASS_SPLIT) - { - const char *format = _("Are you sure you want to delete\n %s\n" - "from the transaction\n %s ?"); - const char *recn_warn = _("You would be deleting a reconciled split!"); - const char *memo; - const char *desc; - char recn; - - memo = xaccSplitGetMemo (split); - memo = (memo && *memo) ? memo : _("(no memo)"); - - desc = xaccTransGetDescription (trans); - desc = (desc && *desc) ? desc : _("(no description)"); - - /* ask for user confirmation before performing permanent damage */ - buf = g_strdup_printf (format, memo, desc); - - recn = xaccSplitGetReconcile (split); - if (recn == YREC || recn == FREC) - { - char *new_buf; - - new_buf = g_strconcat (buf, "\n\n", recn_warn, NULL); - g_free (buf); - buf = new_buf; - } - - result = gnc_verify_dialog_parented (rw->window, FALSE, buf); - - g_free(buf); - - if (!result) - return; - - gnc_split_register_delete_current_split (reg); - return; - } - - g_return_if_fail(cursor_class == CURSOR_CLASS_TRANS); - - /* On a transaction cursor with 2 or fewer splits in single or double - * mode, we just delete the whole transaction, kerblooie */ - if ((xaccTransCountSplits(trans) <= 2) && (style == REG_STYLE_LEDGER)) - { - const char *message = _("Are you sure you want to delete the current " - "transaction?"); - const char *recn_warn = _("You would be deleting a transaction " - "with reconciled splits!"); - char *buf; - - if (xaccTransHasReconciledSplits (trans)) - buf = g_strconcat (message, "\n\n", recn_warn, NULL); - else - buf = g_strdup (message); - - result = gnc_verify_dialog_parented (rw->window, FALSE, buf); - - g_free (buf); - - if (!result) - return; - - gnc_split_register_delete_current_trans (reg); - return; - } - - /* At this point we are on a transaction cursor with more than 2 splits - * or we are on a transaction cursor in multi-line mode or an auto mode. - * We give the user two choices: delete the whole transaction or delete - * all the splits except the transaction split. */ - { - DeleteType del_type; - - del_type = gnc_transaction_delete_query (GTK_WINDOW(rw->window), - trans); - - if (del_type == DELETE_CANCEL) - return; - - if (del_type == DELETE_TRANS) - { - gnc_split_register_delete_current_trans (reg); - return; - } - - if (del_type == DELETE_SPLITS) - { - gnc_split_register_emtpy_current_trans (reg); - return; - } - } -} - -/********************************************************************\ - * duplicateCB * - * * - * Args: widget - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -static void duplicateCB(GNCRegWidget *rw, gpointer data) -{ - gnc_split_register_duplicate_current - (gnc_ledger_display_get_split_register (rw->ledger)); -} - - -/********************************************************************\ - * cancelCB * - * * - * Args: w - the widget that called us * - * data - the data struct for this register * - * Return: none * -\********************************************************************/ -static void -cancelCB(GNCRegWidget *rw, gpointer data) -{ - gnc_split_register_cancel_cursor_trans_changes - (gnc_ledger_display_get_split_register (rw->ledger)); -} - - -/********************************************************************\ - * gnc_register_check_close * - * * - * Args: regData - the data struct for this register * - * Return: none * -\********************************************************************/ -static void -gnc_register_check_close(GNCRegWidget *rw) -{ - gboolean pending_changes; - SplitRegister *reg; - - reg = gnc_ledger_display_get_split_register (rw->ledger); - - pending_changes = gnc_split_register_changed (reg); - if (pending_changes) - { - const char *message = _("The current transaction has been changed.\n" - "Would you like to record it?"); - if (gnc_verify_dialog_parented(rw->window, TRUE, message)) - gnc_register_enter(rw, TRUE); - else - gnc_split_register_cancel_cursor_trans_changes (reg); - } -} - -GtkWidget* -gnc_regWidget_get_style_menu( GNCRegWidget *rw ) -{ - return rw->style_menu; -} - -GtkWidget* -gnc_regWidget_get_sort_menu( GNCRegWidget *rw ) -{ - return rw->sort_menu; -} - -GtkWidget* -gnc_regWidget_get_edit_menu( GNCRegWidget *rw ) -{ - return rw->edit_menu; -} - -GtkWidget* -gnc_regWidget_get_transaction_menu( GNCRegWidget *rw ) -{ - return rw->transaction_menu; -} - -GtkWidget* -gnc_regWidget_get_toolbar( GNCRegWidget *rw ) -{ - return rw->toolbar; -} - -GtkWidget* -gnc_regWidget_get_statusbar( GNCRegWidget *rw ) -{ - return rw->statusbar; -} - -GtkWidget* -gnc_regWidget_get_popup( GNCRegWidget *rw ) -{ - return rw->popup_menu; -} - -GnucashRegister* -gnc_regWidget_get_register( GNCRegWidget *rw ) -{ - return rw->reg; -} diff --git a/src/register/ledger-core/gnc-regwidget.h b/src/register/ledger-core/gnc-regwidget.h deleted file mode 100644 index e25dd7874a..0000000000 --- a/src/register/ledger-core/gnc-regwidget.h +++ /dev/null @@ -1,124 +0,0 @@ -/********************************************************************\ - * gnc-regwidget.h -- A widget for the common register look-n-feel. * - * Copyright (C) 2001 Joshua Sled * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License as * - * published by the Free Software Foundation; either version 2 of * - * the License, or (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License* - * along with this program; if not, contact: * - * * - * Free Software Foundation Voice: +1-617-542-5942 * - * 59 Temple Place - Suite 330 Fax: +1-617-542-2652 * - * Boston, MA 02111-1307, USA gnu@gnu.org * -\********************************************************************/ - -#ifndef GNC_REGWIDGET_H -#define GNC_REGWIDGET_H - -#include -#include -#include "config.h" - -#include "gnc-ledger-display.h" -#include "gnucash-sheet.h" - -#define GNC_REGWIDGET(obj) GTK_CHECK_CAST( obj, gnc_regWidget_get_type(), GNCRegWidget ) -#define GNC_REGWIDGET_CLASS(klass) GTK_CHECK_CLASS_CAST( klass, gnc_regWidget_get_type(), GNCRegWidgetClass ) -#define IS_GNC_REGWIDGET(obj) GTK_CHECK_TYPE( obj, gnc_regWidget_get_type() ) - -typedef struct _GNCRegWidget GNCRegWidget; -typedef struct _GNCRegWidgetClass GNCRegWidgetClass; - -struct _GNCRegWidget { - /* The "parent" widget */ - GtkVBox vbox; - - /* Top level/containing window */ - /* jsled: used by the jump cbs; can we get by w/o knowing this? investigate - * layering */ - GtkWidget * window; - gint width; - gint height; - - SCM toolbar_change_callback_id; - GtkWidget * toolbar; - GtkWidget * statusbar; - - GtkWidget * popup_menu; - - GtkWidget * style_menu; - GtkWidget * sort_menu; - GtkWidget * edit_menu; - GtkWidget * transaction_menu; - GtkWidget * help_menu; - - GtkWidget * double_line_check; - - GtkWidget * split_button; - GtkWidget * split_menu_check; - GtkWidget * split_popup_check; - - GNCLedgerDisplay * ledger; - /* The actual sheet widget */ - GnucashRegister *reg; - - gint disallowedCaps; - - gint sort_type; -}; - -struct _GNCRegWidgetClass { - GtkVBoxClass parent_class; - - /* Signal prototype holders */ - void (*enter_ent_cb)( GNCRegWidget *w, gpointer user_data ); - void (*cancel_ent_cb)( GNCRegWidget *w, gpointer user_data ); - void (*delete_ent_cb)( GNCRegWidget *w, gpointer user_data ); - void (*dup_ent_cb)( GNCRegWidget *w, gpointer user_data ); - void (*schedule_ent_cb)( GNCRegWidget *w, gpointer user_data ); - void (*expand_ent_cb)( GNCRegWidget *w, gpointer user_data ); - void (*blank_cb)( GNCRegWidget *w, gpointer user_data ); - void (*jump_cb)( GNCRegWidget *w, gpointer user_data ); -}; - -#define CAP_DELETE (1 << 0) -#define CAP_JUMP (1 << 1) -#define CAP_SCHEDULE (1 << 2) - -guint gnc_regWidget_get_type( void ); - -/** - * Create a new GNCRegWidget for the given ledger display, parent window and - * disallowing the given capabilities. Disallowed capabilities result in - * inactive widgets. - * - * @param disallowCapabilities A bit-mask of 'CAP_' values to disallow access - * to; use 0 to allow everything. - **/ -GtkWidget *gnc_regWidget_new( GNCLedgerDisplay *ld, - GtkWindow *parent, - int disallowCapabilities ); - -void gnc_regWidget_set_ledger_display( GNCRegWidget *gncrw, GNCLedgerDisplay *ld ); - -GnucashRegister *gnc_regWidget_get_register( GNCRegWidget *rw ); - -GtkWidget *gnc_regWidget_get_style_menu( GNCRegWidget *rw ); -GtkWidget *gnc_regWidget_get_sort_menu( GNCRegWidget *rw ); -GtkWidget *gnc_regWidget_get_edit_menu( GNCRegWidget *rw ); -GtkWidget *gnc_regWidget_get_transaction_menu( GNCRegWidget *rw ); -GtkWidget *gnc_regWidget_get_help_menu( GNCRegWidget *rw ); - -GtkWidget *gnc_regWidget_get_toolbar( GNCRegWidget *rw ); -GtkWidget *gnc_regWidget_get_statusbar( GNCRegWidget *rw ); -GtkWidget *gnc_regWidget_get_popup( GNCRegWidget *rw ); - -#endif /* !defined(GNC_REGWIDGET_H) */ diff --git a/src/register/register-gnome/gnucash-date-picker.c b/src/register/register-gnome/gnucash-date-picker.c index 77313e9773..03e88dcd55 100644 --- a/src/register/register-gnome/gnucash-date-picker.c +++ b/src/register/register-gnome/gnucash-date-picker.c @@ -119,7 +119,6 @@ gnc_date_picker_key_event(GtkWidget *widget, GdkEventKey *event, gpointer data) return TRUE; } - static void gnc_date_picker_class_init (GNCDatePickerClass *date_picker_class) { @@ -167,7 +166,6 @@ gnc_date_picker_class_init (GNCDatePickerClass *date_picker_class) date_picker_class->key_press_event = NULL; } - GtkType gnc_date_picker_get_type (void) { @@ -233,8 +231,8 @@ gnc_date_picker_new (GnomeCanvasGroup *parent) "x", -10000.0, "y", -10000.0, NULL); - - gtk_widget_realize (calendar); + gtk_widget_realize( hbox ); + gtk_widget_show_all( hbox ); gtk_widget_size_request (calendar, &requisition);