diff --git a/ChangeLog b/ChangeLog index 65863e0e94..b26ed09674 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2001-10-29 Joshua Sled + + * src/gnome/dialog-sxsincelast.c: Unused pages are skipped, + initial version. + + * src/gnome/dialog-sx-from-trans.c: Added start date handling; as + well, correctly update the start date when the frequency option + changes. Added using FreqSpecs for start date calculation. Added + correctly + + * src/gnome-utils/gnc-account-tree.c (gnc_account_tree_init): Make + account-tree description column auto-resize. + + * src/engine/SchedXaction.c (xaccSchedXactionSetEndDate): Removed + end date validity check; an invalid end date is how we signal "no + end date". + 2001-10-25 Dave Peticolas * src/scm/Makefile.am: remove slib-backup.scm and startup.scm diff --git a/po/POTFILES.in b/po/POTFILES.in index 5e1c5f76de..cbfda2d099 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1,26 +1,49 @@ # List of files which containing translatable strings. # This file was generated by ../make-gnucash-potfiles.in. +src/calculation/amort_opt.c +src/calculation/amort_prt.c +src/calculation/expression_parser.c +src/calculation/fin-interactive.c +src/calculation/fin-main.c +src/calculation/fin.c +src/calculation/numeric_ops.c +src/calculation/gncmod-calculation.c +src/app-utils/test/test-exp-parser.c +src/app-utils/test/test-link-module.c +src/app-utils/test/test-print-parse-amount.c +src/app-utils/gfec.c +src/app-utils/global-options.c +src/app-utils/gnc-component-manager.c +src/app-utils/gnc-euro.c +src/app-utils/gnc-exp-parser.c +src/app-utils/gnc-gettext-util.c +src/app-utils/gnc-helpers.c +src/app-utils/gnc-ui-util.c +src/app-utils/gncmod-app-utils.c +src/app-utils/guile-util.c +src/app-utils/option-util.c +src/backend/file/test/test-date-converting.c src/backend/file/test/test-dom-converters1.c src/backend/file/test/test-dom-parser1.c -src/backend/file/test/test-kvp-frames.c -src/backend/file/test/test-load-xml2.c -src/backend/file/test/test-string-converters.c src/backend/file/test/test-file-stuff.c +src/backend/file/test/test-kvp-frames.c +src/backend/file/test/test-load-example-account.c +src/backend/file/test/test-load-xml2.c +src/backend/file/test/test-save-in-lang.c +src/backend/file/test/test-string-converters.c src/backend/file/test/test-xml-account.c src/backend/file/test/test-xml-commodity.c +src/backend/file/test/test-xml-pricedb.c src/backend/file/test/test-xml-transaction.c src/backend/file/test/test-xml2-is-file.c -src/backend/file/test/test-save-in-lang.c -src/backend/file/test/test-date-converting.c -src/backend/file/test/test-xml-pricedb.c -src/backend/file/test/test-load-example-account.c src/backend/file/gnc-account-xml-v2.c src/backend/file/gnc-backend-file.c src/backend/file/gnc-commodity-xml-v2.c src/backend/file/gnc-freqspec-xml-v2.c src/backend/file/gnc-schedxaction-xml-v2.c src/backend/file/gnc-transaction-xml-v2.c +src/backend/file/gncmod-backend-file.c src/backend/file/io-example-account.c src/backend/file/io-gncbin-r.c src/backend/file/io-gncxml-gen.c @@ -34,7 +57,6 @@ src/backend/file/sixtp-to-dom-parser.c src/backend/file/sixtp-utils.c src/backend/file/sixtp.c src/backend/file/gnc-pricedb-xml-v2.c -src/backend/file/gncmod-backend-file.c src/backend/rpc/RpcBackend.c src/backend/rpc/RpcServer.c src/backend/rpc/RpcSock.c @@ -49,6 +71,7 @@ src/backend/rpc/svc_thrd.c src/backend/rpc/xprt_thrd.c src/backend/postgres/test/test-db.c src/backend/postgres/test/test-escape.c +src/backend/postgres/PostgresBackend.c src/backend/postgres/account.c src/backend/postgres/builder.c src/backend/postgres/checkpoint.c @@ -62,109 +85,12 @@ src/backend/postgres/price.c src/backend/postgres/txn.c src/backend/postgres/txnmass.c src/backend/postgres/upgrade.c -src/backend/postgres/PostgresBackend.c src/backend/net/NetIO.c -src/app-utils/test/test-link-module.c -src/app-utils/test/test-exp-parser.c -src/app-utils/test/test-print-parse-amount.c -src/app-utils/gfec.c -src/app-utils/global-options.c -src/app-utils/gnc-component-manager.c -src/app-utils/gnc-gettext-util.c -src/app-utils/gnc-helpers.c -src/app-utils/gnc-ui-util.c -src/app-utils/guile-util.c -src/app-utils/option-util.c -src/app-utils/gnc-euro.c -src/app-utils/gncmod-app-utils.c -src/app-utils/gnc-exp-parser.c -src/tax/us/gncmod-tax-us.c -src/gnc-main.c -src/gnome-utils/dialog-utils.c -src/gnome-utils/druid-utils.c -src/gnome-utils/dialog-commodity.c -src/gnome-utils/gncmod-gnome-utils.c -src/gnome-utils/test/test-link-module.c -src/gnome-utils/gnc-amount-edit.c -src/gnome-utils/gnc-account-tree.c -src/gnome-utils/gnc-commodity-edit.c -src/gnome-utils/cursors.c -src/gnome-utils/gnc-html.c -src/gnome-utils/gnc-menu-extensions.c -src/gnome-utils/gnc-currency-edit.c -src/gnome-utils/gnc-gui-query.c -src/gnome-utils/gnc-date-edit.c -src/gnome-utils/gnc-html-history.c -src/gnome-utils/gnc-html-guppi.c -src/gnome-utils/gnc-frequency.c -src/gnome-utils/gnc-date-delta.c -src/gnome-utils/gtkselect.c -src/gnome-utils/print-session.c -src/gnome-utils/commodity.glade -src/gnome-utils/gnc-mdi-utils.c -src/gnome-utils/dialog-options.c -src/network-utils/gnc-gpg.c -src/network-utils/gnc-http.c -src/network-utils/gncmod-network-utils.c -src/network-utils/test/test-link-module.c -src/calculation/amort_opt.c -src/calculation/amort_prt.c -src/calculation/expression_parser.c -src/calculation/fin-interactive.c -src/calculation/fin-main.c -src/calculation/fin.c -src/calculation/numeric_ops.c -src/calculation/gncmod-calculation.c -src/engine/Account.c -src/engine/Backend.c -src/engine/DateUtils.c -src/engine/FreqSpec.c -src/engine/GNCId.c -src/engine/Group.c -src/engine/Query.c -src/engine/SchedXaction.c -src/engine/Scrub.c -src/engine/TransLog.c -src/engine/Transaction.c -src/engine/date.c -src/engine/engine-helpers.c -src/engine/glib-helpers.c -src/engine/gnc-associate-account.c -src/engine/gnc-book.c -src/engine/gnc-commodity.c -src/engine/gnc-engine.c -src/engine/gnc-event.c -src/engine/gnc-numeric.c -src/engine/gnc-pricedb.c -src/engine/gncmod-engine.c -src/engine/guid.c -src/engine/kvp_frame.c -src/engine/md5.c -src/engine/test/test-load-engine.c -src/engine/test/test-commodities.c -src/engine/test/test-resolve-file-path.c -src/engine/test/test-split-vs-account.c -src/engine/test/test-freq-spec.c -src/engine/test/test-scm-query.c -src/engine/test/test-group-vs-book.c -src/engine/test/test-transaction-voiding.c -src/engine/messages.c -src/engine/gnc-session.c -src/engine/SX-ttinfo.c -src/engine/kvp-scm.c -src/engine/test-core/test-engine-stuff.c -src/engine/test-core/gncmod-test-engine.c -src/engine/gnc-engine-util.c -src/app-file/gnc-file.c -src/app-file/gncmod-app-file.c +src/app-file/gnome/gnc-file-dialog.c src/app-file/gnome/gnc-file-history.c src/app-file/gnome/gncmod-app-file-gnome.c -src/app-file/gnome/gnc-file-dialog.c -src/experimental/cgi-bin/fastcgi-hello.c -src/experimental/cgi-bin/gnc-server.c -src/experimental/cgi-bin/hello.c -src/experimental/cgi-bin/hello2.c -src/experimental/cgi-bin/hello3.c +src/app-file/gnc-file.c +src/app-file/gncmod-app-file.c src/gnc-module/test/misc-mods/agedver.c src/gnc-module/test/misc-mods/futuremodsys.c src/gnc-module/test/misc-mods/incompatdep.c @@ -180,22 +106,116 @@ src/gnc-module/test/mod-baz/gnc-mod-baz.c src/gnc-module/test/mod-foo/foo.c src/gnc-module/test/mod-foo/gnc-mod-foo.c src/gnc-module/gnc-module.c +src/import-export/qif-import/dialog-account-picker.c +src/import-export/qif-import/druid-qif-import.c +src/import-export/qif-import/gncmod-qif-import.c +src/import-export/qif-import/qif.glade +src/import-export/qif-import/guile-strings.c +src/import-export/qif-io-core/gncmod-qifiocore.c +src/import-export/binary-import/test/test-link-module.c +src/import-export/binary-import/binary-import.glade +src/import-export/binary-import/druid-commodity.c +src/import-export/binary-import/gncmod-binary-import.c +src/gnome-utils/test/test-link-module.c +src/gnome-utils/cursors.c +src/gnome-utils/dialog-commodity.c +src/gnome-utils/dialog-utils.c +src/gnome-utils/druid-utils.c +src/gnome-utils/gnc-account-tree.c +src/gnome-utils/gnc-amount-edit.c +src/gnome-utils/gnc-commodity-edit.c +src/gnome-utils/gnc-currency-edit.c +src/gnome-utils/gnc-date-delta.c +src/gnome-utils/gnc-date-edit.c +src/gnome-utils/gnc-frequency.c +src/gnome-utils/gnc-gui-query.c +src/gnome-utils/gnc-html-guppi.c +src/gnome-utils/gnc-html-history.c +src/gnome-utils/gnc-html.c +src/gnome-utils/gnc-mdi-utils.c +src/gnome-utils/gnc-menu-extensions.c +src/gnome-utils/gncmod-gnome-utils.c +src/gnome-utils/gtkselect.c +src/gnome-utils/print-session.c +src/gnome-utils/commodity.glade +src/gnome-utils/dialog-options.c +src/gnc-main.c +src/report/locale-specific/us/gncmod-locale-reports-us.c +src/report/report-system/test/test-link-module.c +src/report/report-system/gncmod-report-system.c +src/report/report-system/gnc-report.c +src/report/standard-reports/gncmod-standard-reports.c +src/report/stylesheets/gncmod-stylesheets.c +src/report/utility-reports/gncmod-utility-reports.c +src/tax/us/gncmod-tax-us.c +src/engine/Account.c +src/engine/Backend.c +src/engine/DateUtils.c +src/engine/FreqSpec.c +src/engine/GNCId.c +src/engine/Group.c +src/engine/test/test-commodities.c +src/engine/test/test-freq-spec.c +src/engine/test/test-group-vs-book.c +src/engine/test/test-load-engine.c +src/engine/test/test-resolve-file-path.c +src/engine/test/test-scm-query.c +src/engine/test/test-split-vs-account.c +src/engine/test/test-transaction-voiding.c +src/engine/Query.c +src/engine/SchedXaction.c +src/engine/Scrub.c +src/engine/TransLog.c +src/engine/Transaction.c +src/engine/date.c +src/engine/gnc-associate-account.c +src/engine/gnc-book.c +src/engine/gncmod-engine.c +src/engine/gnc-commodity.c +src/engine/gnc-engine-util.c +src/engine/gnc-engine.c +src/engine/gnc-event.c +src/engine/gnc-numeric.c +src/engine/gnc-pricedb.c +src/engine/kvp-scm.c +src/engine/test-core/gncmod-test-engine.c +src/engine/test-core/test-engine-stuff.c +src/engine/guid.c +src/engine/kvp_frame.c +src/engine/md5.c +src/engine/SX-ttinfo.c +src/engine/gnc-session.c +src/engine/engine-helpers.c +src/engine/glib-helpers.c +src/engine/messages.c +src/experimental/cgi-bin/fastcgi-hello.c +src/experimental/cgi-bin/gnc-server.c +src/experimental/cgi-bin/hello.c +src/experimental/cgi-bin/hello2.c +src/experimental/cgi-bin/hello3.c +src/network-utils/test/test-link-module.c +src/network-utils/gnc-gpg.c +src/network-utils/gnc-http.c +src/network-utils/gncmod-network-utils.c src/gnome/glade/account.glade -src/gnome/glade/commodities.glade +src/gnome/glade/sched-xact.glade src/gnome/glade/fincalc.glade +src/gnome/glade/sched-xact_strings.c src/gnome/glade/find.glade src/gnome/glade/help.glade src/gnome/glade/newuser.glade -src/gnome/glade/print.glade +src/gnome/glade/commodities.glade src/gnome/glade/price.glade +src/gnome/glade/print.glade src/gnome/glade/progress.glade src/gnome/glade/register.glade src/gnome/glade/report.glade src/gnome/glade/stocks.glade -src/gnome/glade/sched-xact.glade src/gnome/glade/tax.glade src/gnome/glade/transfer.glade src/gnome/glade/userpass.glade +src/gnome/gnucash.desktop.in +src/gnome/file-utils.c src/gnome/dialog-account.c src/gnome/dialog-column-view.c src/gnome/dialog-commodities.c @@ -208,54 +228,42 @@ src/gnome/dialog-print-check.c src/gnome/dialog-progress.c src/gnome/dialog-scheduledxaction.c src/gnome/dialog-style-sheet.c -src/gnome/dialog-sxsincelast.c src/gnome/dialog-tax-info.c src/gnome/dialog-totd.c src/gnome/dialog-transfer.c src/gnome/dialog-userpass.c -src/gnome/reconcile-list.c -src/gnome/window-main.c src/gnome/druid-hierarchy.c +src/gnome/dialog-sx-from-trans.c src/gnome/druid-stock-split.c -src/gnome/top-level.c -src/gnome/window-help.c +src/gnome/old-dialog-sxsincelast.c src/gnome/gnc-network.c src/gnome/gnc-splash.c src/gnome/gnucash.keys.in src/gnome/mainwindow-account-tree.c -src/gnome/window-reconcile.c +src/gnome/reconcile-list.c +src/gnome/top-level.c src/gnome/window-acct-tree.c +src/gnome/window-help.c +src/gnome/window-main-summarybar.c +src/gnome/window-main.c +src/gnome/window-reconcile.c src/gnome/window-register.c src/gnome/window-report.c -src/gnome/dialog-sx-from-trans.c -src/gnome/gnucash.desktop.in -src/gnome/window-main-summarybar.c +src/gnome/dialog-sxsincelast.c src/gnome/argv-list-converters.c -src/gnome/file-utils.c src/guile/tip-of-the-day.c -src/import-export/qif-import/dialog-account-picker.c -src/import-export/qif-import/druid-qif-import.c -src/import-export/qif-import/gncmod-qif-import.c -src/import-export/qif-import/qif.glade -src/import-export/qif-io-core/gncmod-qifiocore.c -src/import-export/binary-import/druid-commodity.c -src/import-export/binary-import/gncmod-binary-import.c -src/import-export/binary-import/test/test-link-module.c -src/import-export/binary-import/binary-import.glade src/optional/swig/gnucash-swig-defines.c src/optional/swig/helperfuncs.c -src/test-core/test-stuff.c -src/test-core/gncmod-test.c +src/register/ledger-core/test/test-link-module.c src/register/ledger-core/gnc-ledger-display.c src/register/ledger-core/gncmod-ledger-core.c src/register/ledger-core/split-register-control.c -src/register/ledger-core/split-register-layout.c src/register/ledger-core/split-register-load.c src/register/ledger-core/split-register-model-save.c src/register/ledger-core/split-register-model.c src/register/ledger-core/split-register-util.c src/register/ledger-core/split-register.c -src/register/ledger-core/test/test-link-module.c +src/register/ledger-core/split-register-layout.c src/register/register-core/QuickFill.c src/register/register-core/basiccell.c src/register/register-core/cell-factory.c @@ -267,12 +275,12 @@ src/register/register-core/pricecell.c src/register/register-core/quickfillcell.c src/register/register-core/recncell.c src/register/register-core/register-common.c +src/register/register-core/test/test-link-module.c src/register/register-core/table-allgui.c src/register/register-core/table-control.c src/register/register-core/table-html.c src/register/register-core/table-layout.c src/register/register-core/table-model.c -src/register/register-core/test/test-link-module.c src/register/register-gnome/combocell-gnome.c src/register/register-gnome/datecell-gnome.c src/register/register-gnome/gncmod-register-gnome.c @@ -284,17 +292,17 @@ src/register/register-gnome/gnucash-header.c src/register/register-gnome/gnucash-item-edit.c src/register/register-gnome/gnucash-item-list.c src/register/register-gnome/gnucash-scrolled-window.c -src/register/register-gnome/gnucash-sheet.c src/register/register-gnome/gnucash-style.c src/register/register-gnome/pricecell-gnome.c src/register/register-gnome/quickfillcell-gnome.c src/register/register-gnome/table-gnome.c src/register/register-gnome/test/test-link-module.c -src/report/locale-specific/us/gncmod-locale-reports-us.c -src/report/report-system/test/test-link-module.c -src/report/report-system/gncmod-report-system.c -src/report/report-system/gnc-report.c -src/report/standard-reports/gncmod-standard-reports.c -src/report/stylesheets/gncmod-stylesheets.c -src/report/utility-reports/gncmod-utility-reports.c +src/register/register-gnome/gnucash-sheet.c +src/scm/gnumeric/guile-strings.c +src/scm/guile-strings.c +src/scm/printing/guile-strings.c +src/scm/qif-import/guile-strings.c +src/scm/report/guile-strings.c +src/test-core/gncmod-test.c +src/test-core/test-stuff.c intl-scm/guile-strings.c diff --git a/src/doc/TODO-schedxactions b/src/doc/TODO-schedxactions index fa2958b53d..415f09fea8 100644 --- a/src/doc/TODO-schedxactions +++ b/src/doc/TODO-schedxactions @@ -33,13 +33,57 @@ X create a template register . this is going to be: a tabbed notebook in which the tabs contain the number of transactions the GL they hold contain. +. register macro-widget + . should support + . toolbar + . Close + + . Enter + . Cancel + . Delete + . Duplicate + . Schedule + . Split + . Blank + . Jump + + . Transfer + . Find + . Report + . Print + . popup menu + . elts + . Enter + . Cancel + . Delete + . Duplicate + . Schedule + . Split + . Blank + . Jump + . extended to support previously-menu-accessible options in embedded case + + . status bar + . configurable UI elts [menu, toolbar, status] + . default callbacks + . override-able + . bitmask of supported functionality + . !"Schedule..." for the embedded-in-SX-editor case, gray-out + . shouldn't [necessarily] support + . date range [may be fixed/irrelevant by caller] + . style changes [caller may enforce] + . NOTES/ISSUES + . pass in prefix for gnc_reg_save_size(...) + ? Hook into 'book data changed' save-on-exit decision . SX list . add a big calendar [gnome-pim? evo?] to SXaction List/overview + . tab order . SX editor . 'Cancel' button should auto-cancel ledger changes + . tab order . make-from-transaction X credit/debit pull-over issues @@ -55,6 +99,7 @@ X create a template register . match existing transactions for long-time users . based off template-transaction data, some big existing-transaction scanning code. + . tab-order . need "since-last-run" UI for instanatiation. X Change from dialogs to druid @@ -71,6 +116,7 @@ X create a template register X Is it sufficient to look at the next instance of ea. transaction only? I think not... we probably want to look out until the transaction is outside the reminder range. + . tab-order . need some configuration for constantly-running GnuCash users of when to pop up the 'new scheduled transactions' dialog [option, time-of-day] . Should deal with "nothing-to-do" better [not even show up in the worst @@ -184,7 +230,7 @@ X General . Size/space issues. . Un-selecting "End Date" leaves calendar widget sensitive . 'ESC' while editing template register causes window to go away [badly]. - . why does the accounts tab go crazy when we change the FreqSpec parameters? + . why does the accounts window go crazy when we change the FreqSpec parameters? . Scheduled Transaction List @@ -196,6 +242,10 @@ X General ? credit and debit seem reversed at instantiation time... . this is fixed, but is the fix correct? +. SX-from-trans + . you can delete a freshly-from-trans'd SX from the list with the + from-trans dlg still open, then 'ok' the dlg to get a segfault. + ################################################## ### Enhancements ################################################## @@ -329,3 +379,106 @@ conrad wants to use this to remind him to pay his bills. He runs GnuCash continuously, and thus wants an option to "pop-up on day change [at time HH:MM]". He's interested in seeing future transactions as well as what's being created ATM. + +-------------------- + +window-register notes: + +. RegWindow *regWindowSimple (Account *account) +. RegWindow *regWindowAccGroup (Account *account) + . functionality should remain, probably in reg mwidget + + +. void gnc_register_raise (RegWindow *regData) + . probably should remain here; if the reg mwidget has knowledge of it's + containing window, then it can go there. + +. void gnc_register_jump_to_split(RegWindow *regData, Split *split) +. void gnc_register_jump_to_split_amount(RegWindow *regData, Split *split) + . should be part of mwidget + +. static void gnc_register_change_style (RegWindow *regData, SplitRegisterStyle style) +. static void gnc_register_style_(ledger|auto_ledger|journal|double_line_cb (GtkWidget *w, gpointer data) + . mwidget + +. static void gnc_register_sort_(standard|date|date_entered|date_reconciled|num|amount|memo|desc)_cb(GtkWidget *w, gpointer data) +. static void gnc_register_sort (RegWindow *regData, sort_type_t sort_code) + . mwidget + . some of these may not make sense in embedded applications + +. static time_t gnc_register_(min|max)_day_time(time_t time_val) + . eh? This should probably be a util function somewhere + +. static void gnc_date_range_set_sensitivities(RegWindow *regData) +. static void gnc_register_set_date_range(RegWindow *regData) +. static void gnc_register_date_cb(GtkWidget *widget, gpointer data) +. static void show_all_cb(GtkWidget *widget, gpointer data) +. static void gnc_register_today_cb(GtkWidget *widget, gpointer data) +. static void gnc_register_date_toggle_cb(GtkToggleButton *toggle, gpointer data) +. static void gnc_register_date_changed_cb(GtkWidget *widget, gpointer data) +. static void gnc_register_show_date_window(RegWindow *regData) +. static RegDateWindow *gnc_register_date_window (RegWindow *regData, gboolean show_all) + . need DateWindow policy/decision. + +. static GtkWidget *gnc_register_create_tool_bar (RegWindow *regData) + . mwidget + +. static void gnc_ui_find_transactions_cb (GtkWidget *widget, gpointer data) + . necessary for embedded applications? + +. static GtkWidget *add_summary_label (GtkWidget *summarybar, const char *label_str) + . mwidget [option] + +. static GtkWidget *gnc_register_create_summary_bar (RegWindow *regData) +. static GtkWidget *gnc_register_create_status_bar (RegWindow *regData) + . mwidget [options] + +. void gnc_register_jump_to_blank (RegWindow *regData) + . helper for various callbacks + . mwidget + +. static void expand_trans_check_cb (GtkWidget *widget, gpointer data) +. static void new_trans_cb (GtkWidget *widget, gpointer data) +. static void jump_cb(GtkWidget *widget, gpointer data) + +. static GtkWidget *gnc_register_create_menu_bar(RegWindow *regData, GtkWidget *statusbar) + . mwidget + . should take menubar as param + +. static GtkWidget *gnc_register_create_popup_menu (RegWindow *regData) + . mwidget + . should take popup as param + +. static void gnc_register_destroy_cb(GtkWidget *widget, gpointer data) + . needs to integrate more nicely + +. RegWindow *regWindowLedger (GNCLedgerDisplay *ledger) + . Creates the ledger :) + . Sets up the data struct :) + . Creates a gtk_window_new :( + . Creates a gnc_register_date_window :I + . Creates the statusbar, toolbar, popup, menubar :/ + . recalls saved window_size from prefix [param] + +. static gnc_numeric gnc_account_present_balance (Account *account) +. static GNCPrice *account_latest_price (Account *account) + . mwidget? + +. static void startRecnCB(GtkWidget * w, gpointer data) + . recn: configurable behavior + +. static gboolean gnc_register_include_date(RegWindow *regData, time_t date) + . date-range stuff. + +. static gboolean trans_has_reconciled_splits (Transaction *trans) + . util + +. static DeleteType gnc_transaction_delete_query (GtkWindow *parent, Transaction *trans) + . default is probably good; mwidget + . ideally have way to customize text + +. static void gnc_register_check_close(RegWindow *regData) + . should be mwidget util fn + +. static void report_helper (RegWindow *regData, SCM func, Query *query) + . mwidget util diff --git a/src/engine/SchedXaction.c b/src/engine/SchedXaction.c index a4b841f7e1..e72645e050 100644 --- a/src/engine/SchedXaction.c +++ b/src/engine/SchedXaction.c @@ -245,26 +245,19 @@ xaccSchedXactionGetEndDate( SchedXaction *sx ) void xaccSchedXactionSetEndDate( SchedXaction *sx, GDate *newEnd ) { - if ( g_date_valid( newEnd ) ) { - if ( g_date_compare( newEnd, &sx->start_date ) < 0 ) { - /* XXX: I reject the bad data - is this the right - * thing to do . - * This warning is only human readable - the caller - * doesn't know the call failed. This is bad - */ - PWARN( "New end date before start date" ); - } - else - { - sx->end_date = *newEnd; - sx->dirty = TRUE; - } - - } - else - { - PWARN("New end date invalid"); + if ( g_date_valid( newEnd ) + && g_date_compare( newEnd, &sx->start_date ) < 0 ) { + /* XXX: I reject the bad data - is this the right + * thing to do . + * This warning is only human readable - the caller + * doesn't know the call failed. This is bad + */ + PWARN( "New end date before start date" ); + return; } + + sx->end_date = *newEnd; + sx->dirty = TRUE; return; } @@ -314,9 +307,7 @@ xaccSchedXactionSetRemOccur( SchedXaction *sx, { /* FIXME This condition can be tightened up */ if ( numRemain > sx->num_occurances_total ) { - PWARN("The number remaining is greater than the \ -total occurrences"); - + PWARN("The number remaining is greater than the total occurrences"); } else { diff --git a/src/gnome-utils/gnc-account-tree.c b/src/gnome-utils/gnc-account-tree.c index b8f83c6e13..4d16e5ad13 100644 --- a/src/gnome-utils/gnc-account-tree.c +++ b/src/gnome-utils/gnc-account-tree.c @@ -168,6 +168,8 @@ gnc_account_tree_new_with_root (Account * root) static void gnc_account_tree_init (GNCAccountTree *tree) { + gint i; + tree->root_account = *xaccGUIDNULL (); tree->current_accounts = NULL; tree->ignore_unselect = FALSE; @@ -187,6 +189,9 @@ gnc_account_tree_init (GNCAccountTree *tree) gtk_clist_set_shadow_type(GTK_CLIST(tree), GTK_SHADOW_IN); gtk_clist_column_titles_passive(GTK_CLIST(tree)); gtk_clist_set_column_auto_resize(GTK_CLIST(tree), 0, TRUE); + gtk_clist_set_column_auto_resize(GTK_CLIST(tree), + tree->description_column, TRUE ); + gtk_clist_set_column_justification(GTK_CLIST(tree), tree->balance_column, GTK_JUSTIFY_RIGHT); @@ -942,6 +947,8 @@ gnc_account_tree_set_view_info_real(GNCAccountTree *tree) tree->column_fields[i++] = ACCOUNT_TYPE; tree->column_fields[i++] = ACCOUNT_COMMODITY; tree->column_fields[i++] = ACCOUNT_CODE; + + tree->description_column = i; tree->column_fields[i++] = ACCOUNT_DESCRIPTION; tree->balance_column = i; diff --git a/src/gnome-utils/gnc-account-tree.h b/src/gnome-utils/gnc-account-tree.h index 325935da81..fdf38533c9 100644 --- a/src/gnome-utils/gnc-account-tree.h +++ b/src/gnome-utils/gnc-account-tree.h @@ -65,6 +65,7 @@ struct GNCAccountTree_s AccountViewInfo avi; gint num_columns; + gint description_column; gint balance_column; gint total_column; AccountFieldCode column_fields[NUM_ACCOUNT_FIELDS]; diff --git a/src/gnome/dialog-scheduledxaction.c b/src/gnome/dialog-scheduledxaction.c index 52dbb03ced..83ad53195b 100644 --- a/src/gnome/dialog-scheduledxaction.c +++ b/src/gnome/dialog-scheduledxaction.c @@ -61,6 +61,7 @@ static short module = MOD_SX; #define REMIND_OPT "remind_opt" #define REMIND_DAYS_SPIN "remind_days" #define END_GNOME_NUMENTRY "end_gnome_nentry" +#define REMAIN_GNOME_NUMENTRY "remain_gnome_nentry" #define END_OPTION 0 #define NUM_OCCUR_OPTION 1 @@ -243,6 +244,11 @@ editor_ok_button_clicked( GtkButton *b, SchedXactionEditorDialog *sxed ) w = glade_xml_get_widget( sxed->gxml, END_GNOME_NUMENTRY ); num = (gint)gnome_number_entry_get_number( GNOME_NUMBER_ENTRY(w) ); xaccSchedXactionSetNumOccur( sxed->sx, num ); + + w = glade_xml_get_widget( sxed->gxml, REMAIN_GNOME_NUMENTRY ); + num = (gint)gnome_number_entry_get_number( GNOME_NUMBER_ENTRY(w) ); + xaccSchedXactionSetRemOccur( sxed->sx, num ); + g_date_clear( gdate, 1 ); xaccSchedXactionSetEndDate( sxed->sx, gdate ); } else if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(optNoEnd) ) ) { @@ -637,6 +643,8 @@ schedXact_editor_init( SchedXactionEditorDialog *sxed ) GtkWidget *w; w = glade_xml_get_widget( sxed->gxml, END_GNOME_NUMENTRY ); gtk_widget_set_sensitive( w, FALSE ); + w = glade_xml_get_widget( sxed->gxml, REMAIN_GNOME_NUMENTRY ); + gtk_widget_set_sensitive( w, FALSE ); /* Allow grow, allow shrink, auto-shrink */ gtk_window_set_policy (GTK_WINDOW(sxed->dialog), TRUE, TRUE, FALSE); @@ -998,14 +1006,25 @@ schedXact_editor_populate( SchedXactionEditorDialog *sxed ) set_endgroup_toggle_states( sxed, END_DATE ); } else if ( xaccSchedXactionHasOccurDef( sxed->sx ) ) { gint numOccur = xaccSchedXactionGetNumOccur( sxed->sx ); + gint numRemain = xaccSchedXactionGetRemOccur( sxed->sx ); + w = glade_xml_get_widget( sxed->gxml, "rb_num_occur" ); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(w), TRUE ); + w = glade_xml_get_widget( sxed->gxml, END_GNOME_NUMENTRY ); w = gnome_number_entry_gtk_entry( GNOME_NUMBER_ENTRY(w) ); tmpgStr = g_string_sized_new(5); g_string_sprintf( tmpgStr, "%d", numOccur ); gtk_entry_set_text( GTK_ENTRY(w), tmpgStr->str ); g_string_free( tmpgStr, TRUE ); + + w = glade_xml_get_widget( sxed->gxml, REMAIN_GNOME_NUMENTRY );; + w = gnome_number_entry_gtk_entry( GNOME_NUMBER_ENTRY(w) ); + tmpgStr = g_string_sized_new(5); + g_string_sprintf( tmpgStr, "%d", numRemain ); + gtk_entry_set_text( GTK_ENTRY(w), tmpgStr->str ); + g_string_free( tmpgStr, TRUE ); + set_endgroup_toggle_states( sxed, END_OCCUR ); } else { w = glade_xml_get_widget( sxed->gxml, "rb_noend" ); @@ -1098,6 +1117,9 @@ set_endgroup_toggle_states( SchedXactionEditorDialog *sxed, EndType type ) occurCtl = glade_xml_get_widget( sxed->gxml, END_GNOME_NUMENTRY ); gtk_widget_set_sensitive( GTK_WIDGET(occurCtl), (type == END_OCCUR) ); + + occurCtl = glade_xml_get_widget( sxed->gxml, REMAIN_GNOME_NUMENTRY ); + gtk_widget_set_sensitive( GTK_WIDGET(occurCtl), (type == END_OCCUR) ); } static diff --git a/src/gnome/dialog-sx-from-trans.c b/src/gnome/dialog-sx-from-trans.c index 4b76a16250..9c03517d3b 100644 --- a/src/gnome/dialog-sx-from-trans.c +++ b/src/gnome/dialog-sx-from-trans.c @@ -53,6 +53,7 @@ static short module = MOD_SX; static void sxftd_ok_clicked(GtkWidget *w, gpointer user_data); +static void sxftd_freq_option_changed( GtkWidget *w, gpointer user_data ); static void sxftd_advanced_clicked(GtkWidget *w, gpointer user_data); static void sxftd_cancel_clicked(GtkWidget *w, gpointer user_data); @@ -98,10 +99,10 @@ sxfti_attach_callbacks(SXFromTransInfo *sxfti) widgetSignalHandlerTuple callbacks[] = { - {SXFTD_OK_BUTTON, "clicked", sxftd_ok_clicked}, - {SXFTD_ADVANCED_BUTTON, "clicked", sxftd_advanced_clicked}, - {SXFTD_CANCEL_BUTTON, "clicked", sxftd_cancel_clicked}, - {NULL, NULL, NULL} + { SXFTD_OK_BUTTON, "clicked", sxftd_ok_clicked }, + { SXFTD_ADVANCED_BUTTON, "clicked", sxftd_advanced_clicked }, + { SXFTD_CANCEL_BUTTON, "clicked", sxftd_cancel_clicked }, + { NULL, NULL, NULL } }; int i; @@ -139,14 +140,14 @@ sxftd_get_end_info(SXFromTransInfo *sxfti) if(gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(w))) { - time_t end_t_jul; + time_t end_tt; retval.type = END_ON_DATE; g_date_clear( &(retval.end_date), 1 ); w = glade_xml_get_widget(sxfti->gxml, SXFTD_END_DATE_EDIT); - end_t_jul = gnome_date_edit_get_date(GNOME_DATE_EDIT(w)); + end_tt = gnome_date_edit_get_date(GNOME_DATE_EDIT(w)); - g_date_set_julian( &(retval.end_date), end_t_jul); + g_date_set_time( &(retval.end_date), end_tt); return retval; } @@ -229,12 +230,64 @@ sxftd_add_template_trans(SXFromTransInfo *sxfti) return 0; } +static void +sxftd_update_fs( SXFromTransInfo *sxfti, GDate *date, FreqSpec *fs ) +{ + gint index; + GtkWidget *w; + FreqSpec *tmpfs; + + /* Note that we make the start date the *NEXT* instance, not the + * present one. */ + w = glade_xml_get_widget(sxfti->gxml, SXFTD_FREQ_OPTION_MENU); + index = gnc_option_menu_get_active(w); + + switch(index) + { + case FREQ_DAILY: + xaccFreqSpecSetDaily(fs, date, 1); + xaccFreqSpecSetUIType(fs, UIFREQ_DAILY); + break; + + case FREQ_WEEKLY: + tmpfs = xaccFreqSpecMalloc(gnc_get_current_session ()); + xaccFreqSpecSetComposite(fs); + xaccFreqSpecSetWeekly(tmpfs, date, 1); + xaccFreqSpecSetUIType(fs, UIFREQ_WEEKLY); + xaccFreqSpecCompositeAdd(fs,tmpfs); + break; + + case FREQ_MONTHLY: + xaccFreqSpecSetMonthly(fs, date, 1); + xaccFreqSpecSetUIType(fs, UIFREQ_MONTHLY); + break; + + case FREQ_QUARTERLY: + xaccFreqSpecSetMonthly(fs, date, 3); + xaccFreqSpecSetUIType(fs, UIFREQ_QUARTERLY); + break; + + case FREQ_ANNUALLY: + xaccFreqSpecSetMonthly(fs, date, 12); + xaccFreqSpecSetUIType(fs, UIFREQ_YEARLY); + break; + + default: + PERR("Nonexistent frequency selected. This is a bug."); + break; + } +} + static gint sxftd_init( SXFromTransInfo *sxfti ) { GtkWidget *w; const char *transName; gint pos; + FreqSpec *fs; + time_t start_tt; + struct tm *tmpTm; + GDate date, nextDate; if ( ! sxfti->sx ) { return -1; @@ -249,6 +302,23 @@ sxftd_init( SXFromTransInfo *sxfti ) transName = xaccTransGetDescription( sxfti->trans ); xaccSchedXactionSetName( sxfti->sx, transName ); + /* Setup the initial start date for user display/confirmation */ + w = glade_xml_get_widget( sxfti->gxml, SXFTD_START_DATE_EDIT ); + + /* compute good initial date. */ + start_tt = xaccTransGetDate( sxfti->trans ); + g_date_set_time( &date, start_tt ); + fs = xaccFreqSpecMalloc( gnc_get_current_session() ); + sxftd_update_fs( sxfti, &date, fs ); + xaccFreqSpecGetNextInstance( fs, &date, &nextDate ); + + w = glade_xml_get_widget( sxfti->gxml, SXFTD_START_DATE_EDIT ); + tmpTm = g_new0( struct tm, 1 ); + g_date_to_struct_tm( &nextDate, tmpTm ); + start_tt = mktime( tmpTm ); + g_free( tmpTm ); + gnome_date_edit_set_time( GNOME_DATE_EDIT(w), start_tt ); + w = glade_xml_get_widget( sxfti->gxml, SXFTD_NAME_ENTRY ); pos = 0; gtk_editable_insert_text( GTK_EDITABLE(w), transName, @@ -257,6 +327,10 @@ sxftd_init( SXFromTransInfo *sxfti ) w = glade_xml_get_widget(sxfti->gxml, SXFTD_FREQ_OPTION_MENU); gnc_option_menu_init(w); + w = gtk_option_menu_get_menu( GTK_OPTION_MENU(w) ); + gtk_signal_connect( GTK_OBJECT(w), "selection-done", + GTK_SIGNAL_FUNC(sxftd_freq_option_changed), + sxfti ); return 0; } @@ -267,18 +341,14 @@ sxftd_compute_sx(SXFromTransInfo *sxfti) GtkWidget *w; gchar *name; GDate date; - time_t trans_t; int index; - + FreqSpec *fs, *tmpfs; getEndTuple end_info; guint sxftd_errno = 0; /* 0 == OK, > 0 means dialog needs to be run again */ - FreqSpec *fs, *tmpfs; - SchedXaction *sx = sxfti->sx; /* get the name */ - w = glade_xml_get_widget(sxfti->gxml, SXFTD_NAME_ENTRY); name = gtk_editable_get_chars(GTK_EDITABLE(w), 0, -1); @@ -286,72 +356,15 @@ sxftd_compute_sx(SXFromTransInfo *sxfti) xaccSchedXactionSetName(sx, name); g_free(name); - /* get the date (basis for start date) */ - trans_t = xaccTransGetDate(sxfti->trans); - - g_date_set_time(&date, trans_t); + w = glade_xml_get_widget( sxfti->gxml, SXFTD_START_DATE_EDIT ); + g_date_set_time( &date, gnome_date_edit_get_date( GNOME_DATE_EDIT(w) ) ); fs = xaccFreqSpecMalloc(gnc_get_current_session ()); - - /* get the frequency */ - - w = glade_xml_get_widget(sxfti->gxml, SXFTD_FREQ_OPTION_MENU); - index = gnc_option_menu_get_active(w); - - /* Note that we make the start date the *NEXT* instance, not the - * present one - */ - - /* Methinks this should use the FreqSpec to do the calculation... --jsled */ - switch(index) - { - case FREQ_DAILY: - - g_date_add_days(&date, 1); - xaccFreqSpecSetDaily(fs, &date, 1); - xaccFreqSpecSetUIType(fs, UIFREQ_DAILY); - break; - - case FREQ_WEEKLY: - g_date_add_days(&date, 7); - - tmpfs = xaccFreqSpecMalloc(gnc_get_current_session ()); - xaccFreqSpecSetComposite(fs); - xaccFreqSpecSetWeekly(tmpfs, &date, 1); - xaccFreqSpecSetUIType(fs, UIFREQ_WEEKLY); - xaccFreqSpecCompositeAdd(fs,tmpfs); - - break; - - case FREQ_MONTHLY: - g_date_add_months(&date, 1); - xaccFreqSpecSetMonthly(fs, &date, 1); - xaccFreqSpecSetUIType(fs, UIFREQ_MONTHLY); - break; - - case FREQ_QUARTERLY: - g_date_add_months(&date, 3); - xaccFreqSpecSetMonthly(fs, &date, 3); - xaccFreqSpecSetUIType(fs, UIFREQ_QUARTERLY); - break; - - case FREQ_ANNUALLY: - g_date_add_years(&date, 1); - xaccFreqSpecSetMonthly(fs, &date, 12); - xaccFreqSpecSetUIType(fs, UIFREQ_YEARLY); - break; - - default: - - PERR("Nonexistent frequency selected. This is a bug."); - - break; - } - + sxftd_update_fs( sxfti, &date, fs ); if (sxftd_errno == 0) { xaccSchedXactionSetFreqSpec( sx, fs); - xaccSchedXactionSetStartDate(sx, &date); + xaccSchedXactionSetStartDate( sx, &date ); } end_info = sxftd_get_end_info(sxfti); @@ -416,6 +429,35 @@ sxftd_ok_clicked(GtkWidget *w, gpointer user_data) return; } +/** + * Update start date... right now we always base this off the transaction + * start date, but ideally we want to respect what the user has in the field, + * somehow. + **/ +static void +sxftd_freq_option_changed( GtkWidget *w, gpointer user_data ) +{ + SXFromTransInfo *sxfti = (SXFromTransInfo*)user_data; + GtkWidget *start_date; + GDate date, nextDate; + time_t tmp_tt; + struct tm *tmpTm; + FreqSpec *fs; + + tmp_tt = xaccTransGetDate( sxfti->trans ); + g_date_set_time( &date, tmp_tt ); + + fs = xaccFreqSpecMalloc( gnc_get_current_session() ); + sxftd_update_fs( sxfti, &date, fs ); + xaccFreqSpecGetNextInstance( fs, &date, &nextDate ); + + start_date = glade_xml_get_widget( sxfti->gxml, SXFTD_START_DATE_EDIT ); + tmpTm = g_new0( struct tm, 1 ); + g_date_to_struct_tm( &nextDate, tmpTm ); + tmp_tt = mktime( tmpTm ); + g_free( tmpTm ); + gnome_date_edit_set_time( GNOME_DATE_EDIT(start_date), tmp_tt ); +} static void sxftd_cancel_clicked(GtkWidget *w, gpointer user_data) diff --git a/src/gnome/dialog-sxsincelast.c b/src/gnome/dialog-sxsincelast.c index e140205097..d38441c0df 100644 --- a/src/gnome/dialog-sxsincelast.c +++ b/src/gnome/dialog-sxsincelast.c @@ -68,6 +68,7 @@ #define DIALOG_SXSINCELAST_OBSOLETE_CM_CLASS "dialog-sxsincelast-obsolete" #define DIALOG_SXSINCELAST_GLADE_NAME "Since Last Run Druid" +#define SXSLD_DRUID_GLADE_NAME "sincelast_druid" #define SINCELAST_DRUID "sincelast_druid" #define REMINDERS_PG "reminders_page" @@ -94,6 +95,8 @@ #define SX_OBSOLETE_CLIST_WIDTH 3 +#define COERCE_VOID_TO_GBOOLEAN(x) ((gboolean)(*#x)) + #ifdef HAVE_LANGINFO_D_FMT # define GNC_D_FMT (nl_langinfo (D_FMT)) #else @@ -106,18 +109,31 @@ static short module = MOD_SX; /** - * There are two dialogs controled in this file: the since-last-run dialog, - * and the reminder-dialog. They cooperate and inter-relate, so they're both - * handled here. + * The since-last-run dialog is a Gnome Druid which steps through the various + * parts of scheduled transaction since-last-run processing; these parts are: + * + * 1. Display and select SX reminders for creation + * 2. Show/allow editing of auto-created + notification-request SXes + * 3. Show to-create SXes, allowing variable binding + * 4. Show created SXes, allowing editing + * 5. Allow deletion of any obsolete SXes + * + * Pages which aren't relevant are skipped; this is handled in the 'prep' + * signal handler: e.g., a since-last dialog with only obsolete SXes would go + * through the 'prep' methods of all it's pages to reach the Obsolete page. **/ + typedef struct _sxSinceLastData { - GtkWidget *druid_sincelast; + GtkWidget *sincelast_window; + GnomeDruid *sincelast_druid; GladeXML *gxml; GList /* */ *toCreateData; GList /* */ *reminderList; GList /* */ *toRemoveList; + gboolean autoCreatedSomething; + GNCLedgerDisplay *ac_ledger; GnucashRegister *reg; } sxSinceLastData; @@ -256,9 +272,12 @@ gnc_ui_sxsincelast_dialog_create(void) sxsld->gxml = gnc_glade_xml_new( SX_GLADE_FILE, DIALOG_SXSINCELAST_GLADE_NAME ); - sxsld->druid_sincelast = + sxsld->sincelast_window = glade_xml_get_widget( sxsld->gxml, DIALOG_SXSINCELAST_GLADE_NAME ); + sxsld->sincelast_druid = + GNOME_DRUID( glade_xml_get_widget( sxsld->gxml, + SXSLD_DRUID_GLADE_NAME ) ); sxsincelast_init( sxsld ); } @@ -281,8 +300,11 @@ typedef struct { typedef struct { char *pageName; - char *signal; - gboolean (*handlerFn)(); + void (*prepareHandlerFn)(); + gboolean (*backHandlerFn)(); + gboolean (*nextHandlerFn)(); + void (*finishHandlerFn)(); + gboolean (*cancelHandlerFn)(); } druidSignalHandlerTuple; static void @@ -309,14 +331,38 @@ druid_pages_attach_handlers( GladeXML *dialog_xml, { int i; GtkWidget *w; + static char *HANDLER_NAMES[] = { + "prepare", "back", "next", "finish", "cancel" + }; for(i = 0; handler_info[i].pageName != NULL; i++) { w = glade_xml_get_widget(dialog_xml, handler_info[i].pageName); - gtk_signal_connect( GTK_OBJECT(w), - handler_info[i].signal, - GTK_SIGNAL_FUNC(handler_info[i].handlerFn), - sxsld); + if ( handler_info[i].prepareHandlerFn ) { + gtk_signal_connect( GTK_OBJECT(w), "prepare", + GTK_SIGNAL_FUNC(handler_info[i].prepareHandlerFn), + sxsld); + } + if ( handler_info[i].backHandlerFn ) { + gtk_signal_connect( GTK_OBJECT(w), "back", + GTK_SIGNAL_FUNC(handler_info[i].backHandlerFn), + sxsld); + } + if ( handler_info[i].nextHandlerFn ) { + gtk_signal_connect( GTK_OBJECT(w), "next", + GTK_SIGNAL_FUNC(handler_info[i].nextHandlerFn), + sxsld); + } + if ( handler_info[i].finishHandlerFn ) { + gtk_signal_connect( GTK_OBJECT(w), "finish", + GTK_SIGNAL_FUNC(handler_info[i].finishHandlerFn), + sxsld); + } + if ( handler_info[i].cancelHandlerFn ) { + gtk_signal_connect( GTK_OBJECT(w), "cancel", + GTK_SIGNAL_FUNC(handler_info[i].cancelHandlerFn), + sxsld); + } } } @@ -337,12 +383,21 @@ theres_no_turning_back_bang( GnomeDruidPage *druid_page, return TRUE; } -static gboolean +static void reminders_prep( GnomeDruidPage *druid_page, gpointer arg1, gpointer ud ) { - DEBUG( "reminders_prep" ); - return FALSE; + sxSinceLastData *sxsld = (sxSinceLastData*)ud; + GtkWidget *w; + DEBUG( "begin" ); + if ( g_list_length( sxsld->reminderList ) == 0 ) { + DEBUG( "reminders." ); + w = glade_xml_get_widget( sxsld->gxml, + AUTO_CREATE_NOTIFY_PG ); + gnome_druid_set_page( sxsld->sincelast_druid, + GNOME_DRUID_PAGE(w) ); + } + DEBUG( "done" ); } static gboolean @@ -366,7 +421,7 @@ reminders_back( GnomeDruidPage *druid_page, return FALSE; } -static gboolean +static void reminders_finish( GnomeDruidPage *druid_page, gpointer arg1, gpointer ud ) { @@ -382,16 +437,62 @@ reminders_cancel( GnomeDruidPage *druid_page, return FALSE; } -static gboolean +static void +auto_create_prep( GnomeDruidPage *druid_page, + gpointer arg1, gpointer ud ) +{ + GtkWidget *w; + sxSinceLastData *sxsld = (sxSinceLastData*)ud; + + if ( ! sxsld->autoCreatedSomething ) { + w = glade_xml_get_widget( sxsld->gxml, TO_CREATE_PG ); + gnome_druid_set_page( sxsld->sincelast_druid, + GNOME_DRUID_PAGE(w) ); + return; + } +} + +static void +to_create_prep( GnomeDruidPage *druid_page, + gpointer arg1, gpointer ud ) +{ + GtkWidget *w; + sxSinceLastData *sxsld = (sxSinceLastData*)ud; + if ( g_list_length( sxsld->toCreateData ) == 0 ) { + w = glade_xml_get_widget( sxsld->gxml, CREATED_PG ); + gnome_druid_set_page( sxsld->sincelast_druid, + GNOME_DRUID_PAGE(w) ); + return; + } +} + +static void +created_prep( GnomeDruidPage *druid_page, + gpointer arg1, gpointer ud ) +{ + GtkWidget *w; + sxSinceLastData *sxsld = (sxSinceLastData*)ud; + + if ( /* FIXME: signal that we had to create a bunch of stuff from the + previous page. */ 1 ) { + w = glade_xml_get_widget( sxsld->gxml, OBSOLETE_PG ); + gnome_druid_set_page( sxsld->sincelast_druid, GNOME_DRUID_PAGE(w) ); + return; + } +} + +static void obsolete_prep( GnomeDruidPage *druid_page, gpointer arg1, gpointer ud ) { + GtkWidget *w; sxSinceLastData *sxsld = (sxSinceLastData*)ud; - DEBUG( "obsolete_prep" ); - if ( g_list_length( sxsld->toRemoveList ) > 0 ) { - processRemoveList( sxsld->toRemoveList, sxsld ); + if ( g_list_length( sxsld->toRemoveList ) == 0 ) { + w = glade_xml_get_widget( sxsld->gxml, FINISH_PG ); + gnome_druid_set_page( sxsld->sincelast_druid, GNOME_DRUID_PAGE(w) ); + return; } - return FALSE; + processRemoveList( sxsld->toRemoveList, sxsld ); } static gboolean @@ -509,32 +610,36 @@ sxsincelast_init( sxSinceLastData *sxsld ) }; static druidSignalHandlerTuple pages[] = { - { REMINDERS_PG, "prepare", reminders_prep }, - { REMINDERS_PG, "next", reminders_next }, - { REMINDERS_PG, "finish", reminders_finish }, - { REMINDERS_PG, "cancel", reminders_cancel }, + { REMINDERS_PG, + reminders_prep, theres_no_turning_back_bang, reminders_next, + reminders_finish, reminders_cancel }, - { TO_CREATE_PG, "next", to_create_next }, + { TO_CREATE_PG, + to_create_prep, theres_no_turning_back_bang, to_create_next, + NULL, NULL }, - { REMINDERS_PG, "back", theres_no_turning_back_bang }, - { AUTO_CREATE_NOTIFY_PG, "back", theres_no_turning_back_bang }, - { TO_CREATE_PG, "back", theres_no_turning_back_bang }, - { CREATED_PG, "back", theres_no_turning_back_bang }, - { OBSOLETE_PG, "back", theres_no_turning_back_bang }, + { AUTO_CREATE_NOTIFY_PG, + auto_create_prep, theres_no_turning_back_bang, NULL, + NULL, NULL }, - { OBSOLETE_PG, "prepare", obsolete_prep }, - { OBSOLETE_PG, "next", obsolete_next }, + { CREATED_PG, + created_prep, theres_no_turning_back_bang, NULL, + NULL, NULL }, - { NULL, NULL, NULL } + { OBSOLETE_PG, + obsolete_prep, theres_no_turning_back_bang, obsolete_next, + NULL, NULL}, + + { NULL, NULL, NULL, NULL, NULL, NULL } }; gnc_register_gui_component( DIALOG_SXSINCELAST_CM_CLASS, NULL, sxsincelast_close_handler, - sxsld->druid_sincelast ); + sxsld->sincelast_window ); - gtk_signal_connect( GTK_OBJECT(sxsld->druid_sincelast), "destroy", + gtk_signal_connect( GTK_OBJECT(sxsld->sincelast_window), "destroy", GTK_SIGNAL_FUNC( sxsincelast_destroy ), sxsld ); dialog_widgets_attach_handlers(sxsld->gxml, widgets, sxsld); @@ -557,7 +662,7 @@ sxsincelast_init( sxSinceLastData *sxsld ) sxsincelast_close_handler( sxsld ); return; } - gtk_widget_show_all( sxsld->druid_sincelast ); + gtk_widget_show_all( sxsld->sincelast_window ); } static void @@ -679,6 +784,7 @@ processAutoCreateList( GList *autoCreateList, sxSinceLastData *sxsld, SchedXacti ¬ifyState ); create_transactions_on( sx, (GDate*)autoCreateList->data, NULL, &createdGUIDs ); + sxsld->autoCreatedSomething |= TRUE; if ( notifyState ) { thisGUID = createdGUIDs; for ( ; thisGUID ; (thisGUID = thisGUID->next) ) { @@ -964,6 +1070,8 @@ clean_sincelast_dlg( sxSinceLastData *sxsld ) /* . clean out to-create clist * . free associated memories. + * + * FIXME: other dlg stuff to clean? */ clean_variable_table( sxsld ); @@ -1010,12 +1118,10 @@ sxsincelast_close_handler( gpointer ud ) sxSinceLastData *sxsld = (sxSinceLastData*)ud; DEBUG( "sxsincelast_close_handler" ); + gtk_widget_hide( sxsld->sincelast_window ); clean_sincelast_dlg( sxsld ); - gtk_widget_hide( sxsld->druid_sincelast ); - gtk_widget_destroy( sxsld->druid_sincelast ); + gtk_widget_destroy( sxsld->sincelast_window ); clean_sincelast_data( sxsld ); - - /* gtk_widget_destroy( sxsld->druid_sincelast ); */ } static void @@ -2035,7 +2141,7 @@ create_autoCreate_gen_ledger( sxSinceLastData *sxsld ) gnc_table_init_gui( regWidget, splitreg ); sxsld->reg = GNUCASH_REGISTER(regWidget); GNUCASH_SHEET(sxsld->reg->sheet)->window = - GTK_WIDGET( sxsld->druid_sincelast ); + GTK_WIDGET( sxsld->sincelast_druid ); vbox = glade_xml_get_widget( sxsld->gxml, AUTO_CREATE_VBOX ); toolbar = gtk_label_new( "foo ... toolbar...uh... fooo" ); @@ -2094,242 +2200,3 @@ clean_sincelast_data( sxSinceLastData *sxsld ) sxsld->toCreateData = NULL; } } - -#if 0 -allocation: x: 15, y: 107, w: 719, h: 195, sheet_width: 195, sheet_height: 719 -size_request: returning 719 x 195 -size_request: returning 719 x 195 - -Breakpoint 2, gnucash_sheet_size_allocate (widget=0x839b708, - allocation=0xbfffd6c4) at gnucash-sheet.c:1013 -(gdb) bt -#0 gnucash_sheet_size_allocate (widget=0x839b708, allocation=0xbfffd6c4) - at gnucash-sheet.c:1013 -#1 0x40a18ae9 in gtk_marshal_NONE__POINTER (object=0x839b708, - func=0x403b8b1c , func_data=0x0, - args=0xbfffd418) at gtkmarshal.c:193 -#2 0x40a4486b in gtk_signal_real_emit (object=0x839b708, signal_id=18, - params=0xbfffd418) at gtksignal.c:1440 -#3 0x40a42c40 in gtk_signal_emit (object=0x839b708, signal_id=18) - at gtksignal.c:552 -#4 0x40a7689b in gtk_widget_size_allocate (widget=0x839b708, - allocation=0xbfffd718) at gtkwidget.c:2496 -#5 0x40a55652 in gtk_table_size_allocate_pass2 (table=0x839b4d0) - at gtktable.c:1551 -#6 0x40a54342 in gtk_table_size_allocate (widget=0x839b4d0, - allocation=0xbfffda88) at gtktable.c:832 -#7 0x40a18ae9 in gtk_marshal_NONE__POINTER (object=0x839b4d0, - func=0x40a54288 , func_data=0x0, args=0xbfffd7dc) - at gtkmarshal.c:193 -#8 0x40a4486b in gtk_signal_real_emit (object=0x839b4d0, signal_id=18, - params=0xbfffd7dc) at gtksignal.c:1440 -#9 0x40a42c40 in gtk_signal_emit (object=0x839b4d0, signal_id=18) - at gtksignal.c:552 -#10 0x40a7689b in gtk_widget_size_allocate (widget=0x839b4d0, - allocation=0xbfffdafc) at gtkwidget.c:2496 -#11 0x40a6c668 in gtk_vbox_size_allocate (widget=0x82e8e30, - allocation=0xbfffde48) at gtkvbox.c:329 -#12 0x40a18ae9 in gtk_marshal_NONE__POINTER (object=0x82e8e30, - func=0x40a6c174 , func_data=0x0, args=0xbfffdb9c) - at gtkmarshal.c:193 -#13 0x40a4486b in gtk_signal_real_emit (object=0x82e8e30, signal_id=18, - params=0xbfffdb9c) at gtksignal.c:1440 -#14 0x40a42c40 in gtk_signal_emit (object=0x82e8e30, signal_id=18) - at gtksignal.c:552 -#15 0x40a7689b in gtk_widget_size_allocate (widget=0x82e8e30, - allocation=0xbfffdeb8) at gtkwidget.c:2496 -#16 0x40a03c3b in gtk_hbox_size_allocate (widget=0x82e8de8, - allocation=0xbfffe204) at gtkhbox.c:275 -#17 0x40a18ae9 in gtk_marshal_NONE__POINTER (object=0x82e8de8, - func=0x40a038e0 , func_data=0x0, args=0xbfffdf58) - at gtkmarshal.c:193 -#18 0x40a4486b in gtk_signal_real_emit (object=0x82e8de8, signal_id=18, - params=0xbfffdf58) at gtksignal.c:1440 -#19 0x40a42c40 in gtk_signal_emit (object=0x82e8de8, signal_id=18) - at gtksignal.c:552 -#20 0x40a7689b in gtk_widget_size_allocate (widget=0x82e8de8, - allocation=0xbfffe278) at gtkwidget.c:2496 -#21 0x40a6c4e1 in gtk_vbox_size_allocate (widget=0x82e8da0, - allocation=0xbfffe5c4) at gtkvbox.c:273 -#22 0x40a18ae9 in gtk_marshal_NONE__POINTER (object=0x82e8da0, - func=0x40a6c174 , func_data=0x0, args=0xbfffe318) - at gtkmarshal.c:193 -#23 0x40a4486b in gtk_signal_real_emit (object=0x82e8da0, signal_id=18, - params=0xbfffe318) at gtksignal.c:1440 -#24 0x40a42c40 in gtk_signal_emit (object=0x82e8da0, signal_id=18) - at gtksignal.c:552 -#25 0x40a7689b in gtk_widget_size_allocate (widget=0x82e8da0, - allocation=0xbfffe5f0) at gtkwidget.c:2496 -#26 0x408afe24 in gnome_druid_page_size_allocate (widget=0x82e8d08, - allocation=0xbfffe960) at gnome-druid-page.c:189 -#27 0x408b2148 in gnome_druid_page_standard_size_allocate (widget=0x82e8d08, - allocation=0xbfffe960) at gnome-druid-page-standard.c:237 -#28 0x40a18ae9 in gtk_marshal_NONE__POINTER (object=0x82e8d08, - func=0x408b2118 , func_data=0x0, - args=0xbfffe6b4) at gtkmarshal.c:193 -#29 0x40a4486b in gtk_signal_real_emit (object=0x82e8d08, signal_id=18, - params=0xbfffe6b4) at gtksignal.c:1440 -#30 0x40a42c40 in gtk_signal_emit (object=0x82e8d08, signal_id=18) - at gtksignal.c:552 -#31 0x40a7689b in gtk_widget_size_allocate (widget=0x82e8d08, - allocation=0xbfffe990) at gtkwidget.c:2496 -#32 0x408ae034 in gnome_druid_size_allocate (widget=0x82f2b48, - allocation=0xbfffecdc) at gnome-druid.c:334 -#33 0x40a18ae9 in gtk_marshal_NONE__POINTER (object=0x82f2b48, - func=0x408addc8 , func_data=0x0, - args=0xbfffea30) at gtkmarshal.c:193 -#34 0x40a4486b in gtk_signal_real_emit (object=0x82f2b48, signal_id=18, - params=0xbfffea30) at gtksignal.c:1440 -#35 0x40a42c40 in gtk_signal_emit (object=0x82f2b48, signal_id=18) - at gtksignal.c:552 -#36 0x40a7689b in gtk_widget_size_allocate (widget=0x82f2b48, - allocation=0xbfffed00) at gtkwidget.c:2496 -#37 0x40a7e72a in gtk_window_size_allocate (widget=0x82f1998, - allocation=0xbffff04c) at gtkwindow.c:1180 -#38 0x40a18ae9 in gtk_marshal_NONE__POINTER (object=0x82f1998, - func=0x40a7e604 , func_data=0x0, args=0xbfffeda0) - at gtkmarshal.c:193 -#39 0x40a4486b in gtk_signal_real_emit (object=0x82f1998, signal_id=18, - params=0xbfffeda0) at gtksignal.c:1440 -#40 0x40a42c40 in gtk_signal_emit (object=0x82f1998, signal_id=18) - at gtksignal.c:552 -#41 0x40a7689b in gtk_widget_size_allocate (widget=0x82f1998, - allocation=0xbffff094) at gtkwidget.c:2496 -#42 0x40a7f944 in gtk_window_move_resize (window=0x82f1998) at gtkwindow.c:1750 -#43 0x40a7f21e in gtk_window_check_resize (container=0x82f1998) - at gtkwindow.c:1523 -#44 0x40a18c3f in gtk_marshal_NONE__NONE (object=0x82f1998, - func=0x40a7f178 , func_data=0x0, args=0xbffff1c4) - at gtkmarshal.c:312 -#45 0x40a449e8 in gtk_signal_real_emit (object=0x82f1998, signal_id=63, - params=0xbffff1c4) at gtksignal.c:1492 -#46 0x40a42c40 in gtk_signal_emit (object=0x82f1998, signal_id=63) - at gtksignal.c:552 -#47 0x409d9398 in gtk_container_check_resize (container=0x82f1998) - at gtkcontainer.c:928 -#48 0x409d908f in gtk_container_idle_sizer (data=0x0) at gtkcontainer.c:847 -#49 0x40bdd948 in g_idle_dispatch (source_data=0x409d9030, - dispatch_time=0xbffff4f8, user_data=0x0) at gmain.c:1367 -#50 0x40bdc9f6 in g_main_dispatch (dispatch_time=0xbffff4f8) at gmain.c:656 -#51 0x40bdcfb1 in g_main_iterate (block=1, dispatch=1) at gmain.c:877 -#52 0x40bdd129 in g_main_run (loop=0x83903e8) at gmain.c:935 -#53 0x40a1748a in gtk_main () at gtkmain.c:524 -#54 0x403fedd8 in gnc_ui_start_event_loop () at top-level.c:676 -#55 0x4001b7c9 in gwrap_gnc_ui_start_event_loop () at gw-gnc.c:257 -#56 0x40b1bcb8 in scm_deval (x=1088180304, env=1088218144) at eval.c:2636 -#57 0x40b19df3 in scm_deval (x=1088180272, env=1088218144) at eval.c:1954 -#58 0x40b19df3 in scm_deval (x=1088180032, env=1088218144) at eval.c:1954 -#59 0x40b1d885 in scm_dapply (proc=1088179888, arg1=10612, args=1088218344) - at eval.c:3473 -#60 0x40b18585 in scm_apply (proc=1088179864, arg1=10612, args=10612) - at eval.c:3283 -#61 0x40b23cfe in gh_call0 (proc=1088179864) at gh_funcs.c:150 -#62 0x40424de1 in gnucash_main_helper (argc=1, argv=0xbffff9b4) - at gnucash.c:125 -#63 0x40b23dc3 in gh_launch_pad (closure=0x40424bb0, argc=1, argv=0xbffff9b4) - at gh_init.c:60 -#64 0x40b270a2 in invoke_main_func (body_data=0xbffff8f8) at init.c:625 -#65 0x40b4834b in scm_internal_lazy_catch (tag=9076, - body=0x40b2707c , body_data=0xbffff8f8, - handler=0x40b4866c , handler_data=0x0) - at throw.c:283 -#66 0x40b2705c in scm_boot_guile_1 (base=0xbffff8f4, closure=0xbffff8f8) - at init.c:600 -#67 0x40b26d8d in scm_boot_guile (argc=1, argv=0xbffff9b4, - main_func=0x40b23da8 , closure=0x40424bb0) at init.c:443 -#68 0x40b23df1 in gh_enter (argc=1, argv=0xbffff9b4, - c_main_prog=0x40424bb0 ) at gh_init.c:70 -#69 0x40424e94 in gnc_main (argc=1, argv=0xbffff9b4) at gnucash.c:176 -#70 0x8048c36 in main (argc=1, argv=0xbffff9b4) at gnc-main.c:30 -#71 0x40c4f9cb in __libc_start_main (main=0x8048c28
, argc=1, - argv=0xbffff9b4, init=0x8048aec <_init>, fini=0x8048c6c <_fini>, - rtld_fini=0x4000ae60 <_dl_fini>, stack_end=0xbffff9ac) - at ../sysdeps/generic/libc-start.c:92 -(gdb) c -Continuing. -allocation: x: 15, y: 107, w: 727, h: 199, sheet_width: 195, sheet_height: 719 - -Breakpoint 2, gnucash_sheet_size_allocate (widget=0x839b708, - allocation=0xbfffec64) at gnucash-sheet.c:1013 -(gdb) bt -#0 gnucash_sheet_size_allocate (widget=0x839b708, allocation=0xbfffec64) - at gnucash-sheet.c:1013 -#1 0x40a18ae9 in gtk_marshal_NONE__POINTER (object=0x839b708, - func=0x403b8b1c , func_data=0x0, - args=0xbfffe9b8) at gtkmarshal.c:193 -#2 0x40a4486b in gtk_signal_real_emit (object=0x839b708, signal_id=18, - params=0xbfffe9b8) at gtksignal.c:1440 -#3 0x40a42c40 in gtk_signal_emit (object=0x839b708, signal_id=18) - at gtksignal.c:552 -#4 0x40a7689b in gtk_widget_size_allocate (widget=0x839b708, - allocation=0xbfffecb8) at gtkwidget.c:2496 -#5 0x40a55652 in gtk_table_size_allocate_pass2 (table=0x839b4d0) - at gtktable.c:1551 -#6 0x40a54342 in gtk_table_size_allocate (widget=0x839b4d0, - allocation=0xbffff028) at gtktable.c:832 -#7 0x40a18ae9 in gtk_marshal_NONE__POINTER (object=0x839b4d0, - func=0x40a54288 , func_data=0x0, args=0xbfffed7c) - at gtkmarshal.c:193 -#8 0x40a4486b in gtk_signal_real_emit (object=0x839b4d0, signal_id=18, - params=0xbfffed7c) at gtksignal.c:1440 -#9 0x40a42c40 in gtk_signal_emit (object=0x839b4d0, signal_id=18) - at gtksignal.c:552 -#10 0x40a7689b in gtk_widget_size_allocate (widget=0x839b4d0, - allocation=0x839b4f0) at gtkwidget.c:2496 -#11 0x409d9640 in gtk_container_resize_children (container=0x82f1998) - at gtkcontainer.c:1087 -#12 0x40a7fa8c in gtk_window_move_resize (window=0x82f1998) at gtkwindow.c:1856 -#13 0x40a7f21e in gtk_window_check_resize (container=0x82f1998) - at gtkwindow.c:1523 -#14 0x40a18c3f in gtk_marshal_NONE__NONE (object=0x82f1998, - func=0x40a7f178 , func_data=0x0, args=0xbffff1c4) - at gtkmarshal.c:312 -#15 0x40a449e8 in gtk_signal_real_emit (object=0x82f1998, signal_id=63, - params=0xbffff1c4) at gtksignal.c:1492 -#16 0x40a42c40 in gtk_signal_emit (object=0x82f1998, signal_id=63) - at gtksignal.c:552 -#17 0x409d9398 in gtk_container_check_resize (container=0x82f1998) - at gtkcontainer.c:928 -#18 0x409d908f in gtk_container_idle_sizer (data=0x0) at gtkcontainer.c:847 -#19 0x40bdd948 in g_idle_dispatch (source_data=0x409d9030, - dispatch_time=0xbffff4f8, user_data=0x0) at gmain.c:1367 -#20 0x40bdc9f6 in g_main_dispatch (dispatch_time=0xbffff4f8) at gmain.c:656 -#21 0x40bdcfb1 in g_main_iterate (block=1, dispatch=1) at gmain.c:877 -#22 0x40bdd129 in g_main_run (loop=0x83903e8) at gmain.c:935 -#23 0x40a1748a in gtk_main () at gtkmain.c:524 -#24 0x403fedd8 in gnc_ui_start_event_loop () at top-level.c:676 -#25 0x4001b7c9 in gwrap_gnc_ui_start_event_loop () at gw-gnc.c:257 -#26 0x40b1bcb8 in scm_deval (x=1088180304, env=1088218144) at eval.c:2636 -#27 0x40b19df3 in scm_deval (x=1088180272, env=1088218144) at eval.c:1954 -#28 0x40b19df3 in scm_deval (x=1088180032, env=1088218144) at eval.c:1954 -#29 0x40b1d885 in scm_dapply (proc=1088179888, arg1=10612, args=1088218344) - at eval.c:3473 -#30 0x40b18585 in scm_apply (proc=1088179864, arg1=10612, args=10612) - at eval.c:3283 -#31 0x40b23cfe in gh_call0 (proc=1088179864) at gh_funcs.c:150 -#32 0x40424de1 in gnucash_main_helper (argc=1, argv=0xbffff9b4) - at gnucash.c:125 -#33 0x40b23dc3 in gh_launch_pad (closure=0x40424bb0, argc=1, argv=0xbffff9b4) - at gh_init.c:60 -#34 0x40b270a2 in invoke_main_func (body_data=0xbffff8f8) at init.c:625 -#35 0x40b4834b in scm_internal_lazy_catch (tag=9076, - body=0x40b2707c , body_data=0xbffff8f8, - handler=0x40b4866c , handler_data=0x0) - at throw.c:283 -#36 0x40b2705c in scm_boot_guile_1 (base=0xbffff8f4, closure=0xbffff8f8) - at init.c:600 -#37 0x40b26d8d in scm_boot_guile (argc=1, argv=0xbffff9b4, - main_func=0x40b23da8 , closure=0x40424bb0) at init.c:443 -#38 0x40b23df1 in gh_enter (argc=1, argv=0xbffff9b4, - c_main_prog=0x40424bb0 ) at gh_init.c:70 -#39 0x40424e94 in gnc_main (argc=1, argv=0xbffff9b4) at gnucash.c:176 -#40 0x8048c36 in main (argc=1, argv=0xbffff9b4) at gnc-main.c:30 -#41 0x40c4f9cb in __libc_start_main (main=0x8048c28
, argc=1, - argv=0xbffff9b4, init=0x8048aec <_init>, fini=0x8048c6c <_fini>, - rtld_fini=0x4000ae60 <_dl_fini>, stack_end=0xbffff9ac) - at ../sysdeps/generic/libc-start.c:92 -(gdb) quit -The program is running. Exit anyway? (y or n) y - -Debugger finished -#endif /* 0 */ diff --git a/src/gnome/glade/sched-xact.glade b/src/gnome/glade/sched-xact.glade index c508531105..b7cd8dbde4 100644 --- a/src/gnome/glade/sched-xact.glade +++ b/src/gnome/glade/sched-xact.glade @@ -125,8 +125,8 @@ 0 2 - True - True + False + False @@ -520,6 +520,8 @@ GnomeNumberEntry end_gnome_nentry + False + Number of Occurrences 10 0 @@ -538,6 +540,47 @@ + + + GtkLabel + label847876 + + GTK_JUSTIFY_LEFT + False + 0 + 0.5 + 0 + 0 + + 0 + False + False + + + + + GnomeNumberEntry + remain_gnome_nentry + False + Remaining Number of Occurrences + 10 + + 0 + False + False + + + + GtkEntry + GnomeEntry:entry + remain_nentry + True + True + True + 0 + + + @@ -4571,6 +4614,18 @@ Anually GnomeDruid sincelast_druid + + GnomeDruidPageStart + druidpagestart1 + Start page + I don't know exactly what we do here, but this is just a test, anyways... + 255,255,255 + 0,0,0 + 25,25,112 + 255,255,255 + 255,255,255 + + GnomeDruidPageStandard reminders_page