42 #include <glib/gi18n.h> 43 #include "swig-runtime.h" 44 #include "guile-mappings.h" 47 #include "gnc-plugin-register.h" 50 #include "gnc-plugin-business.h" 53 #include "dialog-dup-trans.h" 54 #include "dialog-find-account.h" 55 #include "dialog-find-transactions.h" 56 #include "dialog-print-check.h" 57 #include "dialog-invoice.h" 58 #include "dialog-transfer.h" 59 #include "dialog-utils.h" 60 #include "assistant-stock-split.h" 61 #include "assistant-stock-transaction.h" 62 #include "gnc-component-manager.h" 64 #include "gnc-date-edit.h" 71 #include "gnc-gui-query.h" 72 #include "gnc-icons.h" 73 #include "gnc-split-reg.h" 79 #include "gnc-session.h" 81 #include "gnc-warnings.h" 83 #include "dialog-lot-viewer.h" 87 #include "window-reconcile.h" 88 #include "window-autoclear.h" 89 #include "window-report.h" 90 #include "engine-helpers.h" 91 #include "qofbookslots.h" 98 JUMP_LARGEST_VALUE_FIRST_SPLIT = 1,
99 JUMP_SMALLEST_VALUE_FIRST_SPLIT = 2,
100 } GncPrefJumpMultSplits;
103 static QofLogModule log_module = GNC_MOD_GUI;
105 #define DEFAULT_LINES_AMOUNT 50 106 #define DEFAULT_FILTER_NUM_DAYS_GL "30" 108 static void gnc_plugin_page_register_finalize (GObject*
object);
112 static GtkWidget* gnc_plugin_page_register_create_widget (
114 static void gnc_plugin_page_register_destroy_widget (
GncPluginPage*
116 static void gnc_plugin_page_register_window_changed (
GncPluginPage*
117 plugin_page, GtkWidget* window);
118 static gboolean gnc_plugin_page_register_focus_widget (
GncPluginPage*
120 static void gnc_plugin_page_register_focus (
GncPluginPage* plugin_page,
121 gboolean current_page);
122 static void gnc_plugin_page_register_save_page (
GncPluginPage* plugin_page,
123 GKeyFile* file,
const gchar* group);
124 static GncPluginPage* gnc_plugin_page_register_recreate_page (
125 GtkWidget* window, GKeyFile* file,
const gchar* group);
126 static void gnc_plugin_page_register_update_edit_menu (
GncPluginPage* page,
128 static gboolean gnc_plugin_page_register_finish_pending (
GncPluginPage* page);
130 static gchar* gnc_plugin_page_register_get_tab_name (
GncPluginPage*
132 static gchar* gnc_plugin_page_register_get_tab_color (
GncPluginPage*
134 static gchar* gnc_plugin_page_register_get_long_name (
GncPluginPage*
137 static void gnc_plugin_page_register_summarybar_position_changed (
138 gpointer prefs, gchar* pref, gpointer user_data);
153 static gchar* gnc_plugin_page_register_get_sort_order (
GncPluginPage*
155 void gnc_plugin_page_register_set_sort_order (
GncPluginPage* plugin_page,
156 const gchar* sort_order);
157 static gboolean gnc_plugin_page_register_get_sort_reversed (
159 void gnc_plugin_page_register_set_sort_reversed (
GncPluginPage* plugin_page,
160 gboolean reverse_order);
185 static time64 gnc_plugin_page_register_filter_dmy2time (
char* date_string);
186 static gchar* gnc_plugin_page_register_filter_time2dmy (
time64 raw_time);
187 static gchar* gnc_plugin_page_register_get_filter (
GncPluginPage* plugin_page);
188 void gnc_plugin_page_register_set_filter (
GncPluginPage* plugin_page,
189 const gchar* filter);
196 static void gnc_plugin_page_register_cmd_print_check (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
197 static void gnc_plugin_page_register_cmd_cut (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
198 static void gnc_plugin_page_register_cmd_copy (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
199 static void gnc_plugin_page_register_cmd_paste (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
200 static void gnc_plugin_page_register_cmd_edit_account (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
201 static void gnc_plugin_page_register_cmd_find_account (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
202 static void gnc_plugin_page_register_cmd_find_transactions (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
203 static void gnc_plugin_page_register_cmd_edit_tax_options (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
204 static void gnc_plugin_page_register_cmd_cut_transaction (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
205 static void gnc_plugin_page_register_cmd_copy_transaction (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
206 static void gnc_plugin_page_register_cmd_paste_transaction (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
207 static void gnc_plugin_page_register_cmd_void_transaction (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
208 static void gnc_plugin_page_register_cmd_unvoid_transaction (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
209 static void gnc_plugin_page_register_cmd_reverse_transaction (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
210 static void gnc_plugin_page_register_cmd_view_sort_by (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
211 static void gnc_plugin_page_register_cmd_view_filter_by (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
213 static void gnc_plugin_page_register_cmd_style_changed (GSimpleAction *simple, GVariant *parameter, gpointer user_data);
214 static void gnc_plugin_page_register_cmd_style_double_line (GSimpleAction *simple, GVariant *parameter, gpointer user_data);
215 static void gnc_plugin_page_register_cmd_expand_transaction (GSimpleAction *simple, GVariant *parameter, gpointer user_data);
217 static void gnc_plugin_page_register_cmd_reconcile (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
218 static void gnc_plugin_page_register_cmd_stock_assistant (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
219 static void gnc_plugin_page_register_cmd_autoclear (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
220 static void gnc_plugin_page_register_cmd_transfer (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
221 static void gnc_plugin_page_register_cmd_stock_split (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
222 static void gnc_plugin_page_register_cmd_lots (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
223 static void gnc_plugin_page_register_cmd_enter_transaction (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
224 static void gnc_plugin_page_register_cmd_cancel_transaction (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
225 static void gnc_plugin_page_register_cmd_delete_transaction (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
226 static void gnc_plugin_page_register_cmd_blank_transaction (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
227 static void gnc_plugin_page_register_cmd_goto_date (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
228 static void gnc_plugin_page_register_cmd_duplicate_transaction (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
229 static void gnc_plugin_page_register_cmd_reinitialize_transaction (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
230 static void gnc_plugin_page_register_cmd_exchange_rate (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
231 static void gnc_plugin_page_register_cmd_jump (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
232 static void gnc_plugin_page_register_cmd_reload (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
233 static void gnc_plugin_page_register_cmd_schedule (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
234 static void gnc_plugin_page_register_cmd_scrub_all (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
235 static void gnc_plugin_page_register_cmd_scrub_current (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
236 static void gnc_plugin_page_register_cmd_account_report (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
237 static void gnc_plugin_page_register_cmd_transaction_report (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
238 static void gnc_plugin_page_register_cmd_linked_transaction (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
239 static void gnc_plugin_page_register_cmd_linked_transaction_open (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
240 static void gnc_plugin_page_register_cmd_jump_linked_invoice (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
242 static void gnc_plugin_page_help_changed_cb (GNCSplitReg* gsr,
244 static void gnc_plugin_page_popup_menu_cb (GNCSplitReg* gsr,
246 static void gnc_plugin_page_register_refresh_cb (GHashTable* changes,
248 static void gnc_plugin_page_register_close_cb (gpointer user_data);
250 static void gnc_plugin_page_register_ui_update (gpointer various,
252 static void gppr_account_destroy_cb (
Account* account);
253 static void gnc_plugin_page_register_event_handler (
QofInstance* entity,
258 static GncInvoice* invoice_from_split (Split* split);
264 #define CUT_TRANSACTION_LABEL N_("Cu_t Transaction") 265 #define COPY_TRANSACTION_LABEL N_("_Copy Transaction") 266 #define PASTE_TRANSACTION_LABEL N_("_Paste Transaction") 267 #define DUPLICATE_TRANSACTION_LABEL N_("Dup_licate Transaction") 268 #define DELETE_TRANSACTION_LABEL N_("_Delete Transaction") 272 #define LINK_TRANSACTION_LABEL N_("_Manage Document Link…") 276 #define LINK_TRANSACTION_OPEN_LABEL N_("_Open Linked Document") 279 #define JUMP_LINKED_INVOICE_LABEL N_("Jump to Business item") 280 #define CUT_SPLIT_LABEL N_("Cu_t Split") 281 #define COPY_SPLIT_LABEL N_("_Copy Split") 282 #define PASTE_SPLIT_LABEL N_("_Paste Split") 283 #define DUPLICATE_SPLIT_LABEL N_("Dup_licate Split") 284 #define DELETE_SPLIT_LABEL N_("_Delete Split") 285 #define CUT_TRANSACTION_TIP N_("Cut the selected transaction into clipboard") 286 #define COPY_TRANSACTION_TIP N_("Copy the selected transaction into clipboard") 287 #define PASTE_TRANSACTION_TIP N_("Paste the transaction from the clipboard") 288 #define DUPLICATE_TRANSACTION_TIP N_("Make a copy of the current transaction") 289 #define DELETE_TRANSACTION_TIP N_("Delete the current transaction") 290 #define LINK_TRANSACTION_TIP N_("Add, change, or unlink the document linked with the current transaction") 291 #define LINK_TRANSACTION_OPEN_TIP N_("Open the linked document for the current transaction") 292 #define JUMP_LINKED_INVOICE_TIP N_("Jump to the linked invoice, bill, expense or credit note") 293 #define CUT_SPLIT_TIP N_("Cut the selected split into clipboard") 294 #define COPY_SPLIT_TIP N_("Copy the selected split into clipboard") 295 #define PASTE_SPLIT_TIP N_("Paste the split from the clipboard") 296 #define DUPLICATE_SPLIT_TIP N_("Make a copy of the current split") 297 #define DELETE_SPLIT_TIP N_("Delete the current split") 299 static GActionEntry gnc_plugin_page_register_actions [] =
301 {
"FilePrintAction", gnc_plugin_page_register_cmd_print_check, NULL, NULL, NULL },
302 {
"EditCutAction", gnc_plugin_page_register_cmd_cut, NULL, NULL, NULL },
303 {
"EditCopyAction", gnc_plugin_page_register_cmd_copy, NULL, NULL, NULL },
304 {
"EditPasteAction", gnc_plugin_page_register_cmd_paste, NULL, NULL, NULL },
305 {
"EditEditAccountAction", gnc_plugin_page_register_cmd_edit_account, NULL, NULL, NULL },
306 {
"EditFindAccountAction", gnc_plugin_page_register_cmd_find_account, NULL, NULL, NULL },
307 {
"EditFindTransactionsAction", gnc_plugin_page_register_cmd_find_transactions, NULL, NULL, NULL },
308 {
"EditTaxOptionsAction", gnc_plugin_page_register_cmd_edit_tax_options, NULL, NULL, NULL },
309 {
"CutTransactionAction", gnc_plugin_page_register_cmd_cut_transaction, NULL, NULL, NULL },
310 {
"CopyTransactionAction", gnc_plugin_page_register_cmd_copy_transaction, NULL, NULL, NULL },
311 {
"PasteTransactionAction", gnc_plugin_page_register_cmd_paste_transaction, NULL, NULL, NULL },
312 {
"DuplicateTransactionAction", gnc_plugin_page_register_cmd_duplicate_transaction, NULL, NULL, NULL },
313 {
"DeleteTransactionAction", gnc_plugin_page_register_cmd_delete_transaction, NULL, NULL, NULL },
314 {
"RemoveTransactionSplitsAction", gnc_plugin_page_register_cmd_reinitialize_transaction, NULL, NULL, NULL },
315 {
"RecordTransactionAction", gnc_plugin_page_register_cmd_enter_transaction, NULL, NULL, NULL },
316 {
"CancelTransactionAction", gnc_plugin_page_register_cmd_cancel_transaction, NULL, NULL, NULL },
317 {
"VoidTransactionAction", gnc_plugin_page_register_cmd_void_transaction, NULL, NULL, NULL },
318 {
"UnvoidTransactionAction", gnc_plugin_page_register_cmd_unvoid_transaction, NULL, NULL, NULL },
319 {
"ReverseTransactionAction", gnc_plugin_page_register_cmd_reverse_transaction, NULL, NULL, NULL },
320 {
"LinkTransactionAction", gnc_plugin_page_register_cmd_linked_transaction, NULL, NULL, NULL },
321 {
"LinkedTransactionOpenAction", gnc_plugin_page_register_cmd_linked_transaction_open, NULL, NULL, NULL },
322 {
"JumpLinkedInvoiceAction", gnc_plugin_page_register_cmd_jump_linked_invoice, NULL, NULL, NULL },
323 {
"ViewSortByAction", gnc_plugin_page_register_cmd_view_sort_by, NULL, NULL, NULL },
324 {
"ViewFilterByAction", gnc_plugin_page_register_cmd_view_filter_by, NULL, NULL, NULL },
325 {
"ViewRefreshAction", gnc_plugin_page_register_cmd_reload, NULL, NULL, NULL },
326 {
"ActionsTransferAction", gnc_plugin_page_register_cmd_transfer, NULL, NULL, NULL },
327 {
"ActionsReconcileAction", gnc_plugin_page_register_cmd_reconcile, NULL, NULL, NULL },
328 {
"ActionsAutoClearAction", gnc_plugin_page_register_cmd_autoclear, NULL, NULL, NULL },
329 {
"ActionsStockAssistantAction", gnc_plugin_page_register_cmd_stock_assistant, NULL, NULL, NULL },
330 {
"ActionsStockSplitAction", gnc_plugin_page_register_cmd_stock_split, NULL, NULL, NULL },
331 {
"ActionsLotsAction", gnc_plugin_page_register_cmd_lots, NULL, NULL, NULL },
332 {
"BlankTransactionAction", gnc_plugin_page_register_cmd_blank_transaction, NULL, NULL, NULL },
333 {
"GotoDateAction", gnc_plugin_page_register_cmd_goto_date, NULL, NULL, NULL },
334 {
"EditExchangeRateAction", gnc_plugin_page_register_cmd_exchange_rate, NULL, NULL, NULL },
335 {
"JumpTransactionAction", gnc_plugin_page_register_cmd_jump, NULL, NULL, NULL },
336 {
"ScheduleTransactionAction", gnc_plugin_page_register_cmd_schedule, NULL, NULL, NULL },
337 {
"ScrubAllAction", gnc_plugin_page_register_cmd_scrub_all, NULL, NULL, NULL },
338 {
"ScrubCurrentAction", gnc_plugin_page_register_cmd_scrub_current, NULL, NULL, NULL },
339 {
"ReportsAccountReportAction", gnc_plugin_page_register_cmd_account_report, NULL, NULL, NULL },
340 {
"ReportsAcctTransReportAction", gnc_plugin_page_register_cmd_transaction_report, NULL, NULL, NULL },
342 {
"ViewStyleDoubleLineAction", gnc_plugin_page_register_cmd_style_double_line, NULL,
"false", NULL },
343 {
"SplitTransactionAction", gnc_plugin_page_register_cmd_expand_transaction, NULL,
"false", NULL },
344 {
"ViewStyleRadioAction", gnc_plugin_page_register_cmd_style_changed,
"i",
"@i 0", NULL },
346 static guint gnc_plugin_page_register_n_actions = G_N_ELEMENTS(gnc_plugin_page_register_actions);
349 static const gchar *gnc_plugin_load_ui_items [] =
365 "ActionsPlaceholder4",
366 "ActionsPlaceholder5",
367 "ActionsPlaceholder6",
368 "ReportsPlaceholder1",
374 static const gchar* actions_requiring_account[] =
376 "EditEditAccountAction",
377 "ActionsReconcileAction",
378 "ActionsAutoClearAction",
383 static const gchar* actions_requiring_priced_account[] =
385 "ActionsStockAssistantAction",
392 {
"ActionsTransferAction", N_ (
"Transfer") },
393 {
"RecordTransactionAction", N_ (
"Enter") },
394 {
"CancelTransactionAction", N_ (
"Cancel") },
395 {
"DeleteTransactionAction", N_ (
"Delete") },
396 {
"DuplicateTransactionAction", N_ (
"Duplicate") },
397 {
"SplitTransactionAction",
399 N_ (
"Show Splits") },
400 {
"JumpTransactionAction", N_ (
"Jump") },
401 {
"ScheduleTransactionAction", N_ (
"Schedule") },
402 {
"BlankTransactionAction", N_ (
"Blank") },
403 {
"ActionsReconcileAction", N_ (
"Reconcile") },
404 {
"ActionsStockAssistantAction", N_ (
"Stock Assistant") },
410 const char* action_name;
417 {
"filter_status_reconciled", CLEARED_RECONCILED, NULL },
418 {
"filter_status_cleared", CLEARED_CLEARED, NULL },
419 {
"filter_status_voided", CLEARED_VOIDED, NULL },
420 {
"filter_status_frozen", CLEARED_FROZEN, NULL },
421 {
"filter_status_unreconciled", CLEARED_NO, NULL },
425 #define CLEARED_VALUE "cleared_value" 426 #define DEFAULT_FILTER "0x001f" 427 #define DEFAULT_SORT_ORDER "BY_STANDARD" 435 GNCLedgerDisplay* ledger;
440 gint event_handler_id;
441 gint component_manager_id;
447 gboolean enable_refresh;
454 GtkWidget* num_radio;
455 GtkWidget* act_radio;
456 SortType original_sort_type;
457 gboolean original_save_order;
459 gboolean reverse_order;
460 gboolean original_reverse_order;
467 GtkWidget* start_date_choose;
468 GtkWidget* start_date_today;
469 GtkWidget* start_date;
470 GtkWidget* end_date_choose;
471 GtkWidget* end_date_today;
474 cleared_match_t original_cleared_match;
475 cleared_match_t cleared_match;
476 time64 original_start_time;
482 gboolean original_save_filter;
483 gboolean save_filter;
488 GNC_TYPE_PLUGIN_PAGE)
490 #define GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(o) \ 491 ((GncPluginPageRegisterPrivate*)gnc_plugin_page_register_get_instance_private((GncPluginPageRegister*)o)) 498 gnc_plugin_page_register_new_common (GNCLedgerDisplay* ledger)
511 if (!gnc_features_check_used (gnc_get_current_book(), GNC_FEATURE_REG_SORT_FILTER))
515 if (!gnc_using_equity_type_opening_balance_account (gnc_get_current_book()))
516 gnc_set_use_equity_type_opening_balance_account (gnc_get_current_book());
519 gsr = GNC_SPLIT_REG(gnc_ledger_display_get_user_data (ledger));
523 for (; item; item = g_list_next (item))
526 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (register_page);
527 if (priv->gsr == gsr)
528 return GNC_PLUGIN_PAGE (register_page);
532 register_page = GNC_PLUGIN_PAGE_REGISTER(g_object_new (GNC_TYPE_PLUGIN_PAGE_REGISTER,
nullptr));
533 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (register_page);
534 priv->ledger = ledger;
537 plugin_page = GNC_PLUGIN_PAGE (register_page);
538 label = gnc_plugin_page_register_get_tab_name (plugin_page);
542 label_color = gnc_plugin_page_register_get_tab_color (plugin_page);
544 g_free (label_color);
546 label = gnc_plugin_page_register_get_long_name (plugin_page);
552 for (item = book_list; item; item = g_list_next (item))
556 priv->component_manager_id = 0;
561 gnc_plug_page_register_check_commodity (
Account* account,
void* usr_data)
564 gnc_commodity* com0 = (gnc_commodity*) usr_data;
572 GNCLedgerDisplay* ledger;
578 ENTER (
"account=%p, subaccounts=%s", account,
579 subaccounts ?
"TRUE" :
"FALSE");
583 gnc_plug_page_register_check_commodity,
584 static_cast<gpointer>(com0)));
591 page = gnc_plugin_page_register_new_common (ledger);
592 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
602 GNCLedgerDisplay* ledger;
605 return gnc_plugin_page_register_new_common (ledger);
611 return gnc_plugin_page_register_new_common (ledger);
617 GObjectClass* object_class = G_OBJECT_CLASS (klass);
620 object_class->finalize = gnc_plugin_page_register_finalize;
622 gnc_plugin_class->
tab_icon = GNC_ICON_ACCOUNT;
623 gnc_plugin_class->
plugin_name = GNC_PLUGIN_PAGE_REGISTER_NAME;
624 gnc_plugin_class->
create_widget = gnc_plugin_page_register_create_widget;
625 gnc_plugin_class->
destroy_widget = gnc_plugin_page_register_destroy_widget;
626 gnc_plugin_class->
window_changed = gnc_plugin_page_register_window_changed;
627 gnc_plugin_class->
focus_page = gnc_plugin_page_register_focus;
628 gnc_plugin_class->
save_page = gnc_plugin_page_register_save_page;
629 gnc_plugin_class->
recreate_page = gnc_plugin_page_register_recreate_page;
631 gnc_plugin_page_register_update_edit_menu;
632 gnc_plugin_class->
finish_pending = gnc_plugin_page_register_finish_pending;
635 gnc_ui_register_account_destroy_callback (gppr_account_destroy_cb);
643 GSimpleActionGroup *simple_action_group;
646 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
649 parent = GNC_PLUGIN_PAGE (plugin_page);
652 g_object_set (G_OBJECT (plugin_page),
653 "page-name", _ (
"General Journal"),
654 "ui-description",
"gnc-plugin-page-register.ui",
655 "use-new-window", use_new,
660 g_action_map_add_action_entries (G_ACTION_MAP(simple_action_group),
661 gnc_plugin_page_register_actions,
662 gnc_plugin_page_register_n_actions,
665 priv->lines_default = DEFAULT_LINES_AMOUNT;
666 priv->read_only = FALSE;
667 priv->fd.cleared_match = CLEARED_ALL;
669 priv->enable_refresh = TRUE;
670 priv->search_query = NULL;
671 priv->filter_query = NULL;
675 gnc_plugin_page_register_finalize (GObject*
object)
677 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (
object));
679 ENTER (
"object %p",
object);
681 G_OBJECT_CLASS (gnc_plugin_page_register_parent_class)->finalize (
object);
689 GNCLedgerDisplayType ledger_type;
692 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
693 ledger_type = gnc_ledger_display_type (priv->ledger);
696 if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
707 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
717 gnc_plugin_page_register_focus_widget (
GncPluginPage* register_plugin_page)
719 if (GNC_IS_PLUGIN_PAGE_REGISTER (register_plugin_page))
721 GncWindow* gnc_window = GNC_WINDOW(GNC_PLUGIN_PAGE(register_plugin_page)->window);
724 if (GNC_IS_MAIN_WINDOW(GNC_PLUGIN_PAGE(register_plugin_page)->window))
728 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), TRUE);
731 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), FALSE);
734 register_plugin_page,
735 gnc_plugin_load_ui_items);
739 GtkWidget *toolbar = gnc_window_get_toolbar (gnc_window);
740 GtkWidget *menubar = gnc_window_get_menubar (gnc_window);
741 GMenuModel *menubar_model = gnc_window_get_menubar_model (gnc_window);
742 GtkWidget *statusbar = gnc_window_get_statusbar (gnc_window);
752 gnc_plugin_page_register_ui_update (NULL, GNC_PLUGIN_PAGE_REGISTER(register_plugin_page));
754 gnc_split_reg_focus_on_sheet (gsr);
760 static const char* readonly_inactive_actions[] =
764 "CutTransactionAction",
765 "PasteTransactionAction",
766 "DuplicateTransactionAction",
767 "DeleteTransactionAction",
768 "RemoveTransactionSplitsAction",
769 "RecordTransactionAction",
770 "CancelTransactionAction",
771 "UnvoidTransactionAction",
772 "VoidTransactionAction",
773 "ReverseTransactionAction",
774 "ActionsTransferAction",
775 "ActionsReconcileAction",
776 "ActionsStockSplitAction",
777 "ScheduleTransactionAction",
779 "ScrubCurrentAction",
780 "LinkTransactionAction",
786 static const char* tran_vs_split_actions[] =
788 "CutTransactionAction",
789 "CopyTransactionAction",
790 "PasteTransactionAction",
791 "DuplicateTransactionAction",
792 "DeleteTransactionAction",
797 static const char* tran_action_labels[] =
799 CUT_TRANSACTION_LABEL,
800 COPY_TRANSACTION_LABEL,
801 PASTE_TRANSACTION_LABEL,
802 DUPLICATE_TRANSACTION_LABEL,
803 DELETE_TRANSACTION_LABEL,
808 static const char* tran_action_tips[] =
811 COPY_TRANSACTION_TIP,
812 PASTE_TRANSACTION_TIP,
813 DUPLICATE_TRANSACTION_TIP,
814 DELETE_TRANSACTION_TIP,
819 static const char* split_action_labels[] =
824 DUPLICATE_SPLIT_LABEL,
830 static const char* split_action_tips[] =
840 static std::vector<GncInvoice*>
841 invoices_from_transaction (
const Transaction* trans)
843 std::vector<GncInvoice*> rv;
845 g_return_val_if_fail (GNC_IS_TRANSACTION (trans), rv);
849 auto split = GNC_SPLIT(node->data);
853 auto inv = invoice_from_split (split);
861 gnc_plugin_page_register_ui_update (gpointer various,
867 GNCLedgerDisplayType ledger_type;
868 gboolean expanded, voided, read_only = FALSE, read_only_reg = FALSE;
873 GncWindow* gnc_window = GNC_WINDOW(GNC_PLUGIN_PAGE(page)->window);
876 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
882 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), reg->style == REG_STYLE_LEDGER);
885 ledger_type = gnc_ledger_display_type (priv->ledger);
888 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), ledger_type != LD_GL);
889 g_action_change_state (G_ACTION(action), g_variant_new_int32 (reg->style));
893 g_action_change_state (G_ACTION(action), g_variant_new_boolean (reg->use_double_line));
897 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), reg->style == REG_STYLE_LEDGER);
899 g_signal_handlers_block_by_func (action, (gpointer)gnc_plugin_page_register_cmd_expand_transaction, page);
900 g_action_change_state (G_ACTION(action), g_variant_new_boolean (expanded));
901 g_signal_handlers_unblock_by_func (action, (gpointer)gnc_plugin_page_register_cmd_expand_transaction, page);
906 if (GNC_IS_MAIN_WINDOW(GNC_PLUGIN_PAGE(page)->window))
910 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), TRUE);
914 actions_requiring_priced_account,
922 gnc_split_reg_get_read_only (priv->gsr))
923 read_only_reg = TRUE;
926 actions_requiring_account,
927 !read_only_reg && account != NULL);
930 actions_requiring_priced_account,
936 if (cursor_class == CURSOR_CLASS_SPLIT)
938 if (GNC_IS_MAIN_WINDOW(GNC_PLUGIN_PAGE(page)->window))
945 if (GNC_IS_MAIN_WINDOW(GNC_PLUGIN_PAGE(page)->window))
956 for (iter = readonly_inactive_actions; *iter; ++iter)
960 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), TRUE);
970 "CutTransactionAction");
971 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), !read_only & !voided);
974 "PasteTransactionAction");
975 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), !read_only & !voided);
978 "DeleteTransactionAction");
979 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), !read_only & !voided);
981 if (cursor_class == CURSOR_CLASS_SPLIT)
984 "DuplicateTransactionAction");
985 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), !read_only & !voided);
989 "RemoveTransactionSplitsAction");
990 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), !read_only & !voided);
997 "VoidTransactionAction");
998 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), !voided);
1004 "UnvoidTransactionAction");
1005 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), voided);
1010 "LinkedTransactionOpenAction");
1014 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), (uri ? TRUE:FALSE));
1022 "JumpLinkedInvoiceAction");
1025 auto invoices = invoices_from_transaction (trans);
1026 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), !invoices.empty());
1029 gnc_plugin_business_split_reg_ui_update (GNC_PLUGIN_PAGE(page));
1033 "PasteTransactionAction");
1034 g_simple_action_set_enabled (G_SIMPLE_ACTION(action),
1041 for (iter = readonly_inactive_actions; *iter; ++iter)
1045 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), FALSE);
1052 GncMenuModelSearch *gsm = g_new0 (GncMenuModelSearch, 1);
1053 gboolean found = FALSE;
1054 const char** iter, **label_iter, **tooltip_iter;
1055 gboolean curr_label_trans = FALSE;
1056 iter = tran_vs_split_actions;
1057 label_iter = tran_action_labels;
1059 gsm->search_action_label = NULL;
1060 gsm->search_action_name = *iter;
1061 gsm->search_action_target = NULL;
1065 PINFO(
"Test for action '%s', found is %d, iter label is '%s'", *iter, found, _(*label_iter));
1073 if (g_strcmp0 (gsm->search_action_label, _(*label_iter)) == 0)
1074 curr_label_trans = TRUE;
1078 if ((cursor_class == CURSOR_CLASS_SPLIT) && curr_label_trans)
1080 gboolean found = FALSE;
1081 label_iter = split_action_labels;
1082 tooltip_iter = split_action_tips;
1083 for (iter = tran_vs_split_actions; *iter; ++iter)
1087 *iter, NULL, _(*label_iter), NULL, _(*tooltip_iter));
1089 PINFO(
"split model_item action '%s', found is %d, iter label is '%s'",
1090 *iter, found, _(*label_iter));
1096 else if ((cursor_class == CURSOR_CLASS_TRANS) && !curr_label_trans)
1098 gboolean found = FALSE;
1099 label_iter = tran_action_labels;
1100 tooltip_iter = tran_action_tips;
1101 for (iter = tran_vs_split_actions; *iter; ++iter)
1105 *iter, NULL, _(*label_iter), NULL, _(*tooltip_iter));
1107 PINFO(
"trans model_item action '%s', found is %d, iter label is '%s'",
1108 *iter, found, _(*label_iter));
1116 gnc_window_get_menubar_model (gnc_window),
1117 gnc_window_get_statusbar (gnc_window));
1121 gnc_window_get_menubar_model (gnc_window),
1122 gnc_window_get_accel_group (gnc_window));
1130 GSimpleActionGroup *simple_action_group;
1134 GNCLedgerDisplayType ledger_type;
1137 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
1142 g_return_if_fail (G_IS_SIMPLE_ACTION_GROUP(simple_action_group));
1145 is_readwrite && account != NULL);
1148 ledger_type = gnc_ledger_display_type (priv->ledger);
1150 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), ledger_type == LD_SINGLE);
1154 g_signal_handlers_block_by_func (action,
1155 (gpointer)gnc_plugin_page_register_cmd_style_changed, page);
1156 g_action_change_state (G_ACTION(action), g_variant_new_int32 (reg->style));
1157 g_signal_handlers_unblock_by_func (action,
1158 (gpointer)gnc_plugin_page_register_cmd_style_changed, page);
1162 g_signal_handlers_block_by_func (action,
1163 (gpointer)gnc_plugin_page_register_cmd_style_double_line, page);
1164 g_action_change_state (G_ACTION(action), g_variant_new_boolean (reg->use_double_line));
1165 g_signal_handlers_unblock_by_func (action,
1166 (gpointer)gnc_plugin_page_register_cmd_style_double_line, page);
1172 get_filter_default_num_of_days (GNCLedgerDisplayType ledger_type)
1174 if (ledger_type == LD_GL)
1175 return DEFAULT_FILTER_NUM_DAYS_GL;
1187 gboolean on_current_page)
1193 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page));
1195 page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
1196 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
1200 if (on_current_page)
1202 priv->page_focus = TRUE;
1206 GNC_PLUGIN_PAGE_CLASS (gnc_plugin_page_register_parent_class)->focus_page (plugin_page, TRUE);
1209 priv->page_focus = FALSE;
1212 gnc_split_reg_set_sheet_focus (gsr, priv->page_focus);
1218 gnc_plugin_page_register_create_widget (
GncPluginPage* plugin_page)
1222 GNCLedgerDisplayType ledger_type;
1223 GncWindow* gnc_window;
1229 int filter_changed = 0;
1230 gboolean create_new_page = FALSE;
1232 ENTER (
"page %p", plugin_page);
1233 page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
1234 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
1236 if (priv->widget != NULL)
1238 LEAVE (
"existing widget %p", priv->widget);
1239 return priv->widget;
1242 priv->widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1243 gtk_box_set_homogeneous (GTK_BOX (priv->widget), FALSE);
1244 gtk_widget_show (priv->widget);
1247 gtk_widget_set_name (GTK_WIDGET(priv->widget),
"gnc-id-register-page");
1249 numRows = priv->lines_default;
1250 numRows = MIN (numRows, DEFAULT_LINES_AMOUNT);
1252 gnc_window = GNC_WINDOW(GNC_PLUGIN_PAGE(page)->window);
1253 gsr = gnc_split_reg_new (priv->ledger,
1254 gnc_window_get_gtk_window (gnc_window),
1255 numRows, priv->read_only);
1256 priv->gsr = (GNCSplitReg *)gsr;
1258 gtk_widget_show (gsr);
1259 gtk_box_pack_start (GTK_BOX (priv->widget), gsr, TRUE, TRUE, 0);
1261 g_signal_connect (G_OBJECT (gsr),
"help-changed",
1262 G_CALLBACK (gnc_plugin_page_help_changed_cb),
1265 g_signal_connect (G_OBJECT (gsr),
"show-popup-menu",
1266 G_CALLBACK (gnc_plugin_page_popup_menu_cb),
1271 reg->use_double_line);
1273 gnc_plugin_page_register_ui_initial_state (page);
1274 gnc_plugin_page_register_ui_update (NULL, page);
1276 ledger_type = gnc_ledger_display_type (priv->ledger);
1281 guint filtersize = 0;
1283 priv->sd.save_order = FALSE;
1284 order = gnc_plugin_page_register_get_sort_order (plugin_page);
1286 PINFO (
"Loaded Sort order is %s", order);
1288 gnc_split_reg_set_sort_type (priv->gsr, SortTypefromString (order));
1290 if (order && (g_strcmp0 (order, DEFAULT_SORT_ORDER) != 0))
1291 priv->sd.save_order = TRUE;
1293 priv->sd.original_save_order = priv->sd.save_order;
1296 priv->sd.reverse_order = gnc_plugin_page_register_get_sort_reversed (
1298 gnc_split_reg_set_sort_reversed (priv->gsr, priv->sd.reverse_order, FALSE);
1299 if (priv->sd.reverse_order)
1300 priv->sd.save_order = TRUE;
1302 priv->sd.original_reverse_order = priv->sd.reverse_order;
1305 priv->fd.save_filter = FALSE;
1307 filter_str = gnc_plugin_page_register_get_filter (plugin_page);
1308 filter = g_strsplit (filter_str,
",", -1);
1309 filtersize = g_strv_length (filter);
1310 g_free (filter_str);
1312 PINFO (
"Loaded Filter Status is %s", filter[0]);
1314 priv->fd.cleared_match = (cleared_match_t)g_ascii_strtoll (filter[0], NULL, 16);
1316 if (filtersize > 0 && (g_strcmp0 (filter[0], DEFAULT_FILTER) != 0))
1317 filter_changed = filter_changed + 1;
1319 if (filtersize > 1 && (g_strcmp0 (filter[1],
"0") != 0))
1321 PINFO (
"Loaded Filter Start Date is %s", filter[1]);
1323 priv->fd.start_time = gnc_plugin_page_register_filter_dmy2time (filter[1]);
1325 filter_changed = filter_changed + 1;
1328 if (filtersize > 2 && (g_strcmp0 (filter[2],
"0") != 0))
1330 PINFO (
"Loaded Filter End Date is %s", filter[2]);
1332 priv->fd.end_time = gnc_plugin_page_register_filter_dmy2time (filter[2]);
1334 filter_changed = filter_changed + 1;
1338 priv->fd.days = (gint)g_ascii_strtoll (
1339 get_filter_default_num_of_days (ledger_type), NULL, 10);
1341 if (filtersize > 3 &&
1342 (g_strcmp0 (filter[3], get_filter_default_num_of_days (ledger_type)) != 0))
1344 PINFO (
"Loaded Filter Days is %s", filter[3]);
1346 priv->fd.days = (gint)g_ascii_strtoll (filter[3], NULL, 10);
1347 filter_changed = filter_changed + 1;
1350 if (filter_changed != 0)
1351 priv->fd.save_filter = TRUE;
1353 priv->fd.original_save_filter = priv->fd.save_filter;
1354 g_strfreev (filter);
1357 if (ledger_type == LD_GL)
1359 time64 start_time = 0, end_time = 0;
1361 if (reg->type == GENERAL_JOURNAL)
1363 start_time = priv->fd.start_time;
1364 end_time = priv->fd.end_time;
1369 priv->fd.cleared_match = (cleared_match_t)g_ascii_strtoll (DEFAULT_FILTER, NULL, 16);
1370 gnc_split_reg_set_sort_type (priv->gsr,
1371 SortTypefromString (DEFAULT_SORT_ORDER));
1372 priv->sd.reverse_order = FALSE;
1373 priv->fd.save_filter = FALSE;
1374 priv->sd.save_order = FALSE;
1377 priv->fd.original_days = priv->fd.days;
1379 priv->fd.original_start_time = start_time;
1380 priv->fd.start_time = start_time;
1381 priv->fd.original_end_time = end_time;
1382 priv->fd.end_time = end_time;
1387 if (priv->enable_refresh == TRUE)
1389 create_new_page = TRUE;
1390 priv->enable_refresh = FALSE;
1394 gnc_ppr_update_status_query (page);
1395 gnc_ppr_update_date_query (page);
1398 if (create_new_page)
1400 priv->enable_refresh = TRUE;
1405 gnc_plugin_page_register_set_filter_tooltip (page);
1407 plugin_page->
summarybar = gsr_create_summary_bar (priv->gsr);
1410 gtk_widget_show_all (plugin_page->
summarybar);
1411 gtk_box_pack_start (GTK_BOX (priv->widget), plugin_page->
summarybar,
1414 gnc_plugin_page_register_summarybar_position_changed (NULL, NULL, page);
1416 GNC_PREF_SUMMARYBAR_POSITION_TOP,
1417 (gpointer)gnc_plugin_page_register_summarybar_position_changed,
1420 GNC_PREF_SUMMARYBAR_POSITION_BOTTOM,
1421 (gpointer)gnc_plugin_page_register_summarybar_position_changed,
1427 priv->component_manager_id =
1428 gnc_register_gui_component (GNC_PLUGIN_PAGE_REGISTER_NAME,
1429 gnc_plugin_page_register_refresh_cb,
1430 gnc_plugin_page_register_close_cb,
1432 gnc_gui_component_set_session (priv->component_manager_id,
1433 gnc_get_current_session());
1436 gnc_gui_component_watch_entity (
1438 QOF_EVENT_DESTROY | QOF_EVENT_MODIFY);
1440 gnc_split_reg_set_moved_cb
1441 (priv->gsr, (GFunc)gnc_plugin_page_register_ui_update, page);
1443 g_signal_connect (G_OBJECT (plugin_page),
"inserted",
1449 return priv->widget;
1453 gnc_plugin_page_register_destroy_widget (
GncPluginPage* plugin_page)
1458 ENTER (
"page %p", plugin_page);
1459 page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
1460 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
1463 GNC_PREF_SUMMARYBAR_POSITION_TOP,
1464 (gpointer)gnc_plugin_page_register_summarybar_position_changed,
1467 GNC_PREF_SUMMARYBAR_POSITION_BOTTOM,
1468 (gpointer)gnc_plugin_page_register_summarybar_position_changed,
1475 g_idle_remove_by_data (GNC_PLUGIN_PAGE_REGISTER (plugin_page));
1477 if (priv->widget == NULL)
1480 if (priv->component_manager_id)
1482 gnc_unregister_gui_component (priv->component_manager_id);
1483 priv->component_manager_id = 0;
1486 if (priv->event_handler_id)
1489 priv->event_handler_id = 0;
1492 if (priv->sd.dialog)
1494 gtk_widget_destroy (priv->sd.dialog);
1495 memset (&priv->sd, 0, sizeof (priv->sd));
1498 if (priv->fd.dialog)
1500 gtk_widget_destroy (priv->fd.dialog);
1501 memset (&priv->fd, 0, sizeof (priv->fd));
1507 gtk_widget_hide (priv->widget);
1509 if (GTK_IS_WIDGET(priv->gsr))
1510 gtk_widget_destroy(GTK_WIDGET(priv->gsr));
1513 priv->ledger = NULL;
1518 gnc_plugin_page_register_window_changed (
GncPluginPage* plugin_page,
1524 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page));
1526 page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
1527 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
1529 GTK_WIDGET (gnc_window_get_gtk_window (GNC_WINDOW (window)));
1532 static const gchar* style_names[] =
1540 #define KEY_REGISTER_TYPE "RegisterType" 1541 #define KEY_ACCOUNT_NAME "AccountName" 1542 #define KEY_ACCOUNT_GUID "AccountGuid" 1543 #define KEY_REGISTER_STYLE "RegisterStyle" 1544 #define KEY_DOUBLE_LINE "DoubleLineMode" 1546 #define LABEL_ACCOUNT "Account" 1547 #define LABEL_SUBACCOUNT "SubAccount" 1548 #define LABEL_GL "GL" 1549 #define LABEL_SEARCH "Search" 1562 gnc_plugin_page_register_save_page (
GncPluginPage* plugin_page,
1564 const gchar* group_name)
1568 GNCLedgerDisplayType ledger_type;
1572 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page));
1573 g_return_if_fail (key_file != NULL);
1574 g_return_if_fail (group_name != NULL);
1576 ENTER (
"page %p, key_file %p, group_name %s", plugin_page, key_file,
1579 page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
1580 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
1583 ledger_type = gnc_ledger_display_type (priv->ledger);
1584 if (ledger_type > LD_GL)
1586 LEAVE (
"Unsupported ledger type");
1589 if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
1594 label = (ledger_type == LD_SINGLE) ? LABEL_ACCOUNT : LABEL_SUBACCOUNT;
1596 g_key_file_set_string (key_file, group_name, KEY_REGISTER_TYPE, label);
1598 g_key_file_set_string (key_file, group_name, KEY_ACCOUNT_NAME, name);
1601 g_key_file_set_string (key_file, group_name, KEY_ACCOUNT_GUID, acct_guid);
1603 else if (reg->type == GENERAL_JOURNAL)
1605 g_key_file_set_string (key_file, group_name, KEY_REGISTER_TYPE,
1608 else if (reg->type == SEARCH_LEDGER)
1610 g_key_file_set_string (key_file, group_name, KEY_REGISTER_TYPE,
1615 LEAVE (
"Unsupported register type");
1619 g_key_file_set_string (key_file, group_name, KEY_REGISTER_STYLE,
1620 style_names[reg->style]);
1621 g_key_file_set_boolean (key_file, group_name, KEY_DOUBLE_LINE,
1622 reg->use_double_line);
1641 gnc_plugin_page_register_restore_edit_menu (
GncPluginPage* page,
1643 const gchar* group_name)
1647 GError* error = NULL;
1650 gboolean use_double_line;
1655 style_name = g_key_file_get_string (key_file, group_name,
1656 KEY_REGISTER_STYLE, &error);
1657 for (i = 0 ; style_names[i]; i++)
1659 if (g_ascii_strcasecmp (style_name, style_names[i]) == 0)
1661 DEBUG (
"Found match for style name: %s", style_name);
1665 g_free (style_name);
1668 if (i <= REG_STYLE_JOURNAL)
1670 DEBUG (
"Setting style: %d", i);
1672 g_action_activate (G_ACTION(action), g_variant_new_int32 (i));
1676 use_double_line = g_key_file_get_boolean (key_file, group_name,
1677 KEY_DOUBLE_LINE, &error);
1678 DEBUG (
"Setting double_line_mode: %d", use_double_line);
1681 state = g_action_get_state (G_ACTION(action));
1683 if (use_double_line != g_variant_get_boolean (state))
1684 g_action_activate (G_ACTION(action), NULL);
1686 g_variant_unref (state);
1702 gnc_plugin_page_register_recreate_page (GtkWidget* window,
1704 const gchar* group_name)
1708 GError* error = NULL;
1709 gchar* reg_type, *acct_guid;
1713 gboolean include_subs;
1715 g_return_val_if_fail (key_file, NULL);
1716 g_return_val_if_fail (group_name, NULL);
1717 ENTER (
"key_file %p, group_name %s", key_file, group_name);
1720 reg_type = g_key_file_get_string (key_file, group_name,
1721 KEY_REGISTER_TYPE, &error);
1722 DEBUG (
"Page type: %s", reg_type);
1723 if ((g_ascii_strcasecmp (reg_type, LABEL_ACCOUNT) == 0) ||
1724 (g_ascii_strcasecmp (reg_type, LABEL_SUBACCOUNT) == 0))
1726 include_subs = (g_ascii_strcasecmp (reg_type, LABEL_SUBACCOUNT) == 0);
1727 DEBUG (
"Include subs: %d", include_subs);
1731 LEAVE(
"Session has no book");
1734 acct_guid = g_key_file_get_string (key_file, group_name,
1735 KEY_ACCOUNT_GUID, &error);
1741 if (account == NULL)
1743 gchar* acct_name = g_key_file_get_string (key_file, group_name,
1744 KEY_ACCOUNT_NAME, &error);
1749 if (account == NULL)
1751 LEAVE (
"Bad account name");
1757 else if (g_ascii_strcasecmp (reg_type, LABEL_GL) == 0)
1763 LEAVE (
"Bad ledger type");
1771 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
1772 priv->enable_refresh = FALSE;
1781 gnc_plugin_page_register_restore_edit_menu (page, key_file, group_name);
1784 priv->enable_refresh = TRUE;
1794 gnc_plugin_page_register_update_edit_menu (
GncPluginPage* page, gboolean hide)
1799 gboolean can_copy = FALSE, can_cut = FALSE, can_paste = FALSE;
1800 gboolean has_selection;
1803 reg_page = GNC_PLUGIN_PAGE_REGISTER (page);
1804 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (reg_page);
1805 has_selection = gnucash_register_has_selection (priv->gsr->reg);
1807 can_copy = has_selection;
1808 can_cut = is_readwrite && has_selection;
1809 can_paste = is_readwrite;
1812 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), can_copy);
1814 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), can_cut);
1816 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), can_paste);
1819 static gboolean is_scrubbing = FALSE;
1820 static gboolean show_abort_verify = TRUE;
1823 check_repair_abort_YN = N_(
"'Check & Repair' is currently running, do you want to abort it?");
1828 gboolean ret = FALSE;
1833 false,
"%s", _(check_repair_abort_YN));
1835 show_abort_verify = FALSE;
1844 gnc_plugin_page_register_finish_pending (
GncPluginPage* page)
1849 GtkWidget* dialog, *window;
1853 if (is_scrubbing && show_abort_verify)
1855 if (!finish_scrub (page))
1859 reg_page = GNC_PLUGIN_PAGE_REGISTER (page);
1860 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (reg_page);
1866 name = gnc_plugin_page_register_get_tab_name (page);
1868 dialog = gtk_message_dialog_new (GTK_WINDOW (window),
1869 GTK_DIALOG_DESTROY_WITH_PARENT,
1870 GTK_MESSAGE_WARNING,
1874 _ (
"Save changes to %s?"), name);
1876 gtk_message_dialog_format_secondary_text
1877 (GTK_MESSAGE_DIALOG (dialog),
1879 _ (
"This register has pending changes to a transaction. " 1880 "Would you like to save the changes to this transaction, " 1881 "discard the transaction, or cancel the operation?"));
1882 gnc_gtk_dialog_add_button (dialog, _ (
"_Discard Transaction"),
1883 "edit-delete", GTK_RESPONSE_REJECT);
1884 gtk_dialog_add_button (GTK_DIALOG (dialog),
1885 _ (
"_Cancel"), GTK_RESPONSE_CANCEL);
1886 gnc_gtk_dialog_add_button (dialog, _ (
"_Save Transaction"),
1887 "document-save", GTK_RESPONSE_ACCEPT);
1889 response = gtk_dialog_run (GTK_DIALOG (dialog));
1890 gtk_widget_destroy (dialog);
1894 case GTK_RESPONSE_ACCEPT:
1898 case GTK_RESPONSE_REJECT:
1910 gnc_plugin_page_register_get_tab_name (
GncPluginPage* plugin_page)
1913 GNCLedgerDisplayType ledger_type;
1914 GNCLedgerDisplay* ld;
1918 g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page),
1919 g_strdup (_(
"unknown")));
1921 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
1924 ledger_type = gnc_ledger_display_type (ld);
1927 switch (ledger_type)
1938 case GENERAL_JOURNAL:
1940 return g_strdup (_ (
"General Journal"));
1941 case PORTFOLIO_LEDGER:
1942 return g_strdup (_ (
"Portfolio"));
1944 return g_strdup (_ (
"Search Results"));
1954 return g_strdup (_ (
"unknown"));
1958 gnc_plugin_page_register_get_tab_color (
GncPluginPage* plugin_page)
1961 GNCLedgerDisplayType ledger_type;
1962 GNCLedgerDisplay* ld;
1966 g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page),
1967 g_strdup (_(
"unknown")));
1969 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
1971 ledger_type = gnc_ledger_display_type (ld);
1975 if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
1978 return g_strdup (color ? color :
"Not Set");
1982 gnc_plugin_page_register_check_for_empty_group (GKeyFile *state_file,
1983 const gchar *state_section)
1986 gchar **keys = g_key_file_get_keys (state_file, state_section, &num_keys, NULL);
1995 gnc_plugin_page_register_get_filter_gcm (GNCSplitReg *gsr)
1998 gchar* state_section;
1999 GError* error = NULL;
2000 char* filter = NULL;
2003 state_section = gsr_get_register_state_section (gsr);
2004 filter = g_key_file_get_string (state_file, state_section,
2005 KEY_PAGE_FILTER, &error);
2008 g_clear_error (&error);
2010 g_strdelimit (filter,
";",
',');
2012 g_free (state_section);
2017 gnc_plugin_page_register_get_filter (
GncPluginPage* plugin_page)
2020 GNCLedgerDisplayType ledger_type;
2021 char* filter = NULL;
2023 g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page),
2024 g_strdup (_(
"unknown")));
2026 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
2028 ledger_type = gnc_ledger_display_type (priv->ledger);
2031 filter = gnc_plugin_page_register_get_filter_gcm (priv->gsr);
2036 return g_strdup_printf (
"%s,%s,%s,%s", DEFAULT_FILTER,
2037 "0",
"0", get_filter_default_num_of_days (ledger_type));
2041 gnc_plugin_page_register_set_filter_gcm (GNCSplitReg *gsr,
const gchar* filter,
2042 gchar* default_filter)
2045 gchar* state_section;
2049 state_section = gsr_get_register_state_section (gsr);
2050 if (!filter || (g_strcmp0 (filter, default_filter) == 0))
2052 if (g_key_file_has_key (state_file, state_section, KEY_PAGE_FILTER, NULL))
2053 g_key_file_remove_key (state_file, state_section, KEY_PAGE_FILTER, NULL);
2055 gnc_plugin_page_register_check_for_empty_group (state_file, state_section);
2059 filter_text = g_strdup (filter);
2060 g_strdelimit (filter_text,
",",
';');
2061 g_key_file_set_string (state_file, state_section, KEY_PAGE_FILTER,
2063 g_free (filter_text);
2065 g_free (state_section);
2069 gnc_plugin_page_register_set_filter (
GncPluginPage* plugin_page,
2070 const gchar* filter)
2073 GNCLedgerDisplayType ledger_type;
2074 gchar* default_filter;
2076 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
2078 ledger_type = gnc_ledger_display_type (priv->ledger);
2080 default_filter = g_strdup_printf (
"%s,%s,%s,%s", DEFAULT_FILTER,
2081 "0",
"0", get_filter_default_num_of_days (ledger_type));
2084 gnc_plugin_page_register_set_filter_gcm (priv->gsr, filter, default_filter);
2086 g_free (default_filter);
2091 gnc_plugin_page_register_get_sort_order_gcm (GNCSplitReg *gsr)
2094 gchar* state_section;
2096 GError* error = NULL;
2097 char* sort_order = NULL;
2100 state_section = gsr_get_register_state_section (gsr);
2101 sort_text = g_key_file_get_string (state_file, state_section, KEY_PAGE_SORT,
2105 g_clear_error (&error);
2108 sort_order = g_strdup (sort_text);
2111 g_free (state_section);
2116 gnc_plugin_page_register_get_sort_order (
GncPluginPage* plugin_page)
2119 char* sort_order = NULL;
2121 g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page),
2124 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
2127 sort_order = gnc_plugin_page_register_get_sort_order_gcm (priv->gsr);
2129 return sort_order ? sort_order : g_strdup (DEFAULT_SORT_ORDER);
2133 gnc_plugin_page_register_set_sort_order_gcm (GNCSplitReg *gsr,
2134 const gchar* sort_order)
2137 gchar* state_section;
2140 state_section = gsr_get_register_state_section (gsr);
2141 if (!sort_order || (g_strcmp0 (sort_order, DEFAULT_SORT_ORDER) == 0))
2143 if (g_key_file_has_key (state_file, state_section, KEY_PAGE_SORT, NULL))
2144 g_key_file_remove_key (state_file, state_section, KEY_PAGE_SORT, NULL);
2146 gnc_plugin_page_register_check_for_empty_group (state_file, state_section);
2149 g_key_file_set_string (state_file, state_section, KEY_PAGE_SORT, sort_order);
2151 g_free (state_section);
2154 gnc_plugin_page_register_set_sort_order (
GncPluginPage* plugin_page,
2155 const gchar* sort_order)
2159 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
2162 gnc_plugin_page_register_set_sort_order_gcm (priv->gsr, sort_order);
2166 gnc_plugin_page_register_get_sort_reversed_gcm (GNCSplitReg *gsr)
2169 gchar* state_section;
2170 GError* error = NULL;
2171 gboolean sort_reversed = FALSE;
2174 state_section = gsr_get_register_state_section (gsr);
2175 sort_reversed = g_key_file_get_boolean (state_file, state_section,
2176 KEY_PAGE_SORT_REV, &error);
2179 g_clear_error (&error);
2181 g_free (state_section);
2182 return sort_reversed;
2186 gnc_plugin_page_register_get_sort_reversed (
GncPluginPage* plugin_page)
2189 gboolean sort_reversed = FALSE;
2191 g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), FALSE);
2193 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
2196 sort_reversed = gnc_plugin_page_register_get_sort_reversed_gcm (priv->gsr);
2197 return sort_reversed;
2201 gnc_plugin_page_register_set_sort_reversed_gcm (GNCSplitReg *gsr,
2202 gboolean reverse_order)
2205 gchar* state_section;
2208 state_section = gsr_get_register_state_section (gsr);
2212 if (g_key_file_has_key (state_file, state_section, KEY_PAGE_SORT_REV, NULL))
2213 g_key_file_remove_key (state_file, state_section, KEY_PAGE_SORT_REV, NULL);
2215 gnc_plugin_page_register_check_for_empty_group (state_file, state_section);
2218 g_key_file_set_boolean (state_file, state_section, KEY_PAGE_SORT_REV,
2221 g_free (state_section);
2225 gnc_plugin_page_register_set_sort_reversed (
GncPluginPage* plugin_page,
2226 gboolean reverse_order)
2230 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
2233 gnc_plugin_page_register_set_sort_reversed_gcm (priv->gsr, reverse_order);
2237 gnc_plugin_page_register_get_long_name (
GncPluginPage* plugin_page)
2240 GNCLedgerDisplayType ledger_type;
2241 GNCLedgerDisplay* ld;
2244 g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page),
2247 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
2249 ledger_type = gnc_ledger_display_type (ld);
2252 switch (ledger_type)
2260 gchar* return_string = g_strdup_printf (
"%s+", account_full_name);
2261 g_free ((gpointer*) account_full_name);
2262 return return_string;
2273 gnc_plugin_page_register_summarybar_position_changed (gpointer prefs,
2280 GtkPositionType position = GTK_POS_BOTTOM;
2282 g_return_if_fail (user_data != NULL);
2284 if (!GNC_IS_PLUGIN_PAGE (user_data))
2287 plugin_page = GNC_PLUGIN_PAGE (user_data);
2288 page = GNC_PLUGIN_PAGE_REGISTER (user_data);
2289 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2295 GNC_PREF_SUMMARYBAR_POSITION_TOP))
2296 position = GTK_POS_TOP;
2298 gtk_box_reorder_child (GTK_BOX (priv->widget),
2300 (position == GTK_POS_TOP ? 0 : -1));
2314 g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), NULL);
2316 page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
2317 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2336 gnc_plugin_page_register_sort_book_option_changed (gpointer new_val,
2340 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
2341 gboolean* new_data = (gboolean*)new_val;
2343 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
2345 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2348 gtk_button_set_label (GTK_BUTTON (priv->sd.num_radio),
2349 _ (
"Transaction Number"));
2350 gtk_button_set_label (GTK_BUTTON (priv->sd.act_radio), _ (
"Number/Action"));
2354 gtk_button_set_label (GTK_BUTTON (priv->sd.num_radio), _ (
"Number"));
2355 gtk_button_set_label (GTK_BUTTON (priv->sd.act_radio), _ (
"Action"));
2357 gnc_split_reg_set_sort_type_force (priv->gsr, (SortType)priv->gsr->sort_type, TRUE);
2381 g_return_if_fail (GTK_IS_DIALOG (dialog));
2382 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
2385 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2386 plugin_page = GNC_PLUGIN_PAGE (page);
2388 if (response != GTK_RESPONSE_OK)
2391 gnc_split_reg_set_sort_reversed (priv->gsr, priv->sd.original_reverse_order,
2393 priv->sd.reverse_order = priv->sd.original_reverse_order;
2394 gnc_split_reg_set_sort_type (priv->gsr, priv->sd.original_sort_type);
2395 priv->sd.save_order = priv->sd.original_save_order;
2400 if ((!priv->sd.save_order) && ((priv->sd.original_save_order) || (priv->sd.original_reverse_order)))
2402 gnc_plugin_page_register_set_sort_order (plugin_page, DEFAULT_SORT_ORDER);
2403 gnc_plugin_page_register_set_sort_reversed (plugin_page, FALSE);
2405 priv->sd.original_save_order = priv->sd.save_order;
2407 if (priv->sd.save_order)
2409 type = gnc_split_reg_get_sort_type (priv->gsr);
2410 order = SortTypeasString (type);
2411 gnc_plugin_page_register_set_sort_order (plugin_page, order);
2412 gnc_plugin_page_register_set_sort_reversed (plugin_page,
2413 priv->sd.reverse_order);
2416 gnc_book_option_remove_cb (OPTION_NAME_NUM_FIELD_SOURCE,
2417 gnc_plugin_page_register_sort_book_option_changed,
2419 priv->sd.dialog = NULL;
2420 priv->sd.num_radio = NULL;
2421 priv->sd.act_radio = NULL;
2422 gtk_widget_destroy (GTK_WIDGET (dialog));
2443 g_return_if_fail (GTK_IS_TOGGLE_BUTTON (button));
2444 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
2446 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2447 name = gtk_buildable_get_name (GTK_BUILDABLE (button));
2448 ENTER (
"button %s(%p), page %p", name, button, page);
2449 type = SortTypefromString (name);
2450 gnc_split_reg_set_sort_type (priv->gsr, type);
2469 g_return_if_fail (GTK_IS_CHECK_BUTTON (button));
2470 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
2472 ENTER (
"Save toggle button (%p), plugin_page %p", button, page);
2475 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2477 if (gtk_toggle_button_get_active (button))
2478 priv->sd.save_order = TRUE;
2480 priv->sd.save_order = FALSE;
2499 g_return_if_fail (GTK_IS_CHECK_BUTTON (button));
2500 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
2502 ENTER (
"Reverse toggle button (%p), plugin_page %p", button, page);
2505 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2507 priv->sd.reverse_order = gtk_toggle_button_get_active (button);
2508 gnc_split_reg_set_sort_reversed (priv->gsr, priv->sd.reverse_order, TRUE);
2522 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2525 if (reg->type == SEARCH_LEDGER)
2532 if ((priv->filter_query == NULL) ||
2563 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2566 LEAVE (
"no ledger");
2570 gnc_ppr_update_for_search_query (page);
2575 LEAVE (
"no query found");
2582 if (reg->type != SEARCH_LEDGER)
2584 GSList *param_list = qof_query_build_param_list (SPLIT_RECONCILE, NULL);
2586 g_slist_free (param_list);
2590 if (priv->fd.cleared_match != CLEARED_ALL)
2591 xaccQueryAddClearedMatch (query, priv->fd.cleared_match, QOF_QUERY_AND);
2594 gnc_plugin_page_register_set_filter_tooltip (page);
2600 if (priv->enable_refresh)
2626 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2629 LEAVE (
"no ledger");
2633 gnc_ppr_update_for_search_query (page);
2646 if (reg->type != SEARCH_LEDGER)
2648 GSList *param_list = qof_query_build_param_list (SPLIT_TRANS,
2649 TRANS_DATE_POSTED, NULL);
2651 g_slist_free (param_list);
2654 if (priv->fd.start_time || priv->fd.end_time)
2657 xaccQueryAddDateMatchTT (query,
2658 priv->fd.start_time != 0, priv->fd.start_time,
2659 priv->fd.end_time != 0, priv->fd.end_time,
2663 if (priv->fd.days > 0)
2670 tm.tm_mday = tm.tm_mday - priv->fd.days;
2672 xaccQueryAddDateMatchTT (query, TRUE, start, FALSE, 0, QOF_QUERY_AND);
2676 gnc_plugin_page_register_set_filter_tooltip (page);
2682 if (priv->enable_refresh)
2690 gnc_plugin_page_register_filter_time2dmy (
time64 raw_time)
2692 struct tm* timeinfo;
2693 gchar date_string[11];
2696 strftime (date_string, 11,
"%d-%m-%Y", timeinfo);
2697 PINFO (
"Date string is %s", date_string);
2700 return g_strdup (date_string);
2706 gnc_plugin_page_register_filter_dmy2time (
char* date_string)
2710 PINFO (
"Date string is %s", date_string);
2711 memset (&when, 0,
sizeof (when));
2713 sscanf (date_string,
"%d-%d-%d", &when.tm_mday,
2714 &when.tm_mon, &when.tm_year);
2717 when.tm_year -= 1900;
2741 g_return_if_fail (GTK_IS_CHECK_BUTTON (button));
2742 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
2744 name = gtk_buildable_get_name (GTK_BUILDABLE (button));
2745 ENTER (
"toggle button %s (%p), plugin_page %p", name, button, page);
2748 value = CLEARED_NONE;
2749 for (i = 0; status_actions[i].action_name; i++)
2751 if (g_strcmp0 (name, status_actions[i].action_name) == 0)
2753 value = status_actions[i].value;
2759 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2760 if (gtk_toggle_button_get_active (button))
2761 priv->fd.cleared_match = (cleared_match_t)(priv->fd.cleared_match | value);
2763 priv->fd.cleared_match = (cleared_match_t)(priv->fd.cleared_match & ~value);
2764 gnc_ppr_update_status_query (page);
2786 g_return_if_fail (GTK_IS_BUTTON (button));
2787 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
2789 ENTER (
"(button %p, page %p)", button, page);
2792 for (i = 0; status_actions[i].action_name; i++)
2794 widget = status_actions[i].widget;
2795 g_signal_handlers_block_by_func (widget,
2797 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
2798 g_signal_handlers_unblock_by_func (widget,
2803 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2804 priv->fd.cleared_match = CLEARED_ALL;
2805 gnc_ppr_update_status_query (page);
2828 g_return_if_fail (GTK_IS_BUTTON (button));
2829 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
2831 ENTER (
"(button %p, page %p)", button, page);
2834 for (i = 0; status_actions[i].action_name; i++)
2836 widget = status_actions[i].widget;
2837 g_signal_handlers_block_by_func (widget,
2839 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
2840 g_signal_handlers_unblock_by_func (widget,
2845 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2846 priv->fd.cleared_match = CLEARED_NONE;
2847 gnc_ppr_update_status_query (page);
2869 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2870 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
2871 priv->fd.start_date_choose)))
2873 time_val = gnc_date_edit_get_date (GNC_DATE_EDIT (priv->fd.start_date));
2875 priv->fd.start_time = time_val;
2879 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
2880 priv->fd.start_date_today)))
2886 priv->fd.start_time = 0;
2890 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
2891 priv->fd.end_date_choose)))
2893 time_val = gnc_date_edit_get_date (GNC_DATE_EDIT (priv->fd.end_date));
2895 priv->fd.end_time = time_val;
2899 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
2900 priv->fd.end_date_today)))
2906 priv->fd.end_time = 0;
2931 g_return_if_fail (GTK_IS_RADIO_BUTTON (button));
2932 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
2934 ENTER (
"(button %p, page %p)", button, page);
2935 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2936 name = gtk_buildable_get_name (GTK_BUILDABLE (button));
2937 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
2939 if (active && g_strcmp0 (name,
"filter_show_range") == 0)
2941 gtk_widget_set_sensitive (priv->fd.table, active);
2942 gtk_widget_set_sensitive (priv->fd.num_days, !active);
2943 get_filter_times (page);
2945 else if (active && g_strcmp0 (name,
"filter_show_days") == 0)
2947 gtk_widget_set_sensitive (priv->fd.table, !active);
2948 gtk_widget_set_sensitive (priv->fd.num_days, active);
2949 gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->fd.num_days), priv->fd.days);
2953 gtk_widget_set_sensitive (priv->fd.table, FALSE);
2954 gtk_widget_set_sensitive (priv->fd.num_days, FALSE);
2956 priv->fd.start_time = 0;
2957 priv->fd.end_time = 0;
2959 gnc_ppr_update_date_query (page);
2968 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page));
2970 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
2973 priv->fd.start_time = 0;
2974 priv->fd.end_time = 0;
2975 priv->fd.cleared_match = (cleared_match_t)g_ascii_strtoll (DEFAULT_FILTER, NULL, 16);
2977 gnc_ppr_update_date_query (GNC_PLUGIN_PAGE_REGISTER(plugin_page));
2996 g_return_if_fail (GTK_IS_SPIN_BUTTON (button));
2997 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
2999 ENTER (
"(button %p, page %p)", button, page);
3000 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3002 priv->fd.days = gtk_spin_button_get_value (GTK_SPIN_BUTTON (button));
3003 gnc_ppr_update_date_query (page);
3019 gnc_plugin_page_register_filter_gde_changed_cb (GtkWidget* unused,
3022 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3024 ENTER (
"(widget %s(%p), page %p)",
3025 gtk_buildable_get_name (GTK_BUILDABLE (unused)), unused, page);
3026 get_filter_times (page);
3027 gnc_ppr_update_date_query (page);
3059 g_return_if_fail (GTK_IS_RADIO_BUTTON (radio));
3060 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3062 ENTER (
"(radio %s(%p), page %p)",
3063 gtk_buildable_get_name (GTK_BUILDABLE (radio)), radio, page);
3064 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3065 if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio)))
3067 LEAVE (
"1st callback of pair. Defer to 2nd callback.");
3071 name = gtk_buildable_get_name (GTK_BUILDABLE (radio));
3072 active = !g_strcmp0 (name,
"start_date_choose");
3073 gtk_widget_set_sensitive (priv->fd.start_date, active);
3074 get_filter_times (page);
3075 gnc_ppr_update_date_query (page);
3107 g_return_if_fail (GTK_IS_RADIO_BUTTON (radio));
3108 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3110 ENTER (
"(radio %s(%p), page %p)",
3111 gtk_buildable_get_name (GTK_BUILDABLE (radio)), radio, page);
3112 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3113 if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio)))
3115 LEAVE (
"1st callback of pair. Defer to 2nd callback.");
3119 name = gtk_buildable_get_name (GTK_BUILDABLE (radio));
3120 active = !g_strcmp0 (name,
"end_date_choose");
3121 gtk_widget_set_sensitive (priv->fd.end_date, active);
3122 get_filter_times (page);
3123 gnc_ppr_update_date_query (page);
3142 g_return_if_fail (GTK_IS_CHECK_BUTTON (button));
3143 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3145 ENTER (
"Save toggle button (%p), plugin_page %p", button, page);
3148 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3149 if (gtk_toggle_button_get_active (button))
3150 priv->fd.save_filter = TRUE;
3152 priv->fd.save_filter = FALSE;
3176 g_return_if_fail (GTK_IS_DIALOG (dialog));
3177 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3180 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3181 plugin_page = GNC_PLUGIN_PAGE (page);
3183 if (response != GTK_RESPONSE_OK)
3186 priv->fd.cleared_match = priv->fd.original_cleared_match;
3187 priv->enable_refresh = FALSE;
3188 gnc_ppr_update_status_query (page);
3189 priv->enable_refresh = TRUE;
3190 priv->fd.start_time = priv->fd.original_start_time;
3191 priv->fd.end_time = priv->fd.original_end_time;
3192 priv->fd.days = priv->fd.original_days;
3193 priv->fd.save_filter = priv->fd.original_save_filter;
3194 gnc_ppr_update_date_query (page);
3199 if ((priv->fd.save_filter == FALSE) && (priv->fd.original_save_filter == TRUE))
3200 gnc_plugin_page_register_set_filter (plugin_page, NULL);
3202 priv->fd.original_save_filter = priv->fd.save_filter;
3204 if (priv->fd.save_filter)
3207 GList *flist = NULL;
3210 flist = g_list_prepend
3211 (flist, g_strdup_printf (
"0x%04x", priv->fd.cleared_match));
3214 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->fd.start_date_choose)) && priv->fd.start_time != 0)
3215 flist = g_list_prepend (flist, gnc_plugin_page_register_filter_time2dmy (priv->fd.start_time));
3217 flist = g_list_prepend (flist, g_strdup (
"0"));
3220 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->fd.end_date_choose))
3221 && priv->fd.end_time != 0)
3222 flist = g_list_prepend (flist, gnc_plugin_page_register_filter_time2dmy (priv->fd.end_time));
3224 flist = g_list_prepend (flist, g_strdup (
"0"));
3227 if (priv->fd.days > 0)
3228 flist = g_list_prepend (flist, g_strdup_printf (
"%d", priv->fd.days));
3230 flist = g_list_prepend (flist, g_strdup (
"0"));
3232 flist = g_list_reverse (flist);
3234 PINFO (
"The filter to save is %s", filter);
3235 gnc_plugin_page_register_set_filter (plugin_page, filter);
3237 g_list_free_full (flist, g_free);
3240 priv->fd.dialog = NULL;
3241 gtk_widget_destroy (GTK_WIDGET (dialog));
3246 gpp_update_match_filter_text (cleared_match_t match,
const guint mask,
3247 const gchar* filter_name, GList **show, GList **hide)
3249 if ((match & mask) == mask)
3250 *show = g_list_prepend (*show, g_strdup (filter_name));
3252 *hide = g_list_prepend (*hide, g_strdup (filter_name));
3259 GList *t_list = NULL;
3261 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3264 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3267 if (priv->fd.start_time != 0)
3270 t_list = g_list_prepend
3271 (t_list, g_strdup_printf (
"%s %s", _(
"Start Date:"), sdate));
3276 if (priv->fd.days > 0)
3277 t_list = g_list_prepend
3278 (t_list, g_strdup_printf (
"%s %d", _(
"Show previous number of days:"),
3282 if (priv->fd.end_time != 0)
3285 t_list = g_list_prepend
3286 (t_list, g_strdup_printf (
"%s %s", _(
"End Date:"), edate));
3291 if (priv->fd.cleared_match != CLEARED_ALL)
3296 gpp_update_match_filter_text (priv->fd.cleared_match, 0x01, _ (
"Unreconciled"),
3298 gpp_update_match_filter_text (priv->fd.cleared_match, 0x02, _ (
"Cleared"),
3300 gpp_update_match_filter_text (priv->fd.cleared_match, 0x04, _ (
"Reconciled"),
3302 gpp_update_match_filter_text (priv->fd.cleared_match, 0x08, _ (
"Frozen"),
3304 gpp_update_match_filter_text (priv->fd.cleared_match, 0x10, _ (
"Voided"),
3307 show = g_list_reverse (show);
3308 hide = g_list_reverse (hide);
3313 t_list = g_list_prepend
3314 (t_list, g_strdup_printf (
"%s %s", _(
"Show:"), str));
3321 t_list = g_list_prepend
3322 (t_list, g_strdup_printf (
"%s %s", _(
"Hide:"), str));
3326 g_list_free_full (show, g_free);
3327 g_list_free_full (hide, g_free);
3330 t_list = g_list_reverse (t_list);
3333 t_list = g_list_prepend (t_list, g_strdup (_(
"Filter By:")));
3336 if (priv->gsr->filter_text != NULL)
3337 g_free (priv->gsr->filter_text);
3342 g_list_free_full (t_list, g_free);
3349 gnc_plugin_page_register_update_page_icon (
GncPluginPage* plugin_page)
3354 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page));
3356 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
3359 gnc_split_reg_get_read_only (priv->gsr))
3373 gnc_reg_get_name (GNCLedgerDisplay* ledger, gboolean for_window)
3377 gchar* account_name;
3380 GNCLedgerDisplayType ledger_type;
3386 ledger_type = gnc_ledger_display_type (ledger);
3390 case GENERAL_JOURNAL:
3393 reg_name = _ (
"General Journal");
3395 reg_name = _ (
"Transaction Report");
3397 case PORTFOLIO_LEDGER:
3399 reg_name = _ (
"Portfolio");
3401 reg_name = _ (
"Portfolio Report");
3405 reg_name = _ (
"Search Results");
3407 reg_name = _ (
"Search Results Report");
3411 reg_name = _ (
"Register");
3413 reg_name = _ (
"Transaction Report");
3419 if ((leader != NULL) && (ledger_type != LD_GL))
3423 if (ledger_type == LD_SINGLE)
3425 name = g_strconcat (account_name,
" - ", reg_name, NULL);
3429 name = g_strconcat (account_name,
" ", _ (
"and subaccounts"),
" - ", reg_name,
3432 g_free (account_name);
3435 name = g_strdup (reg_name);
3441 report_helper (GNCLedgerDisplay* ledger, Split* split,
Query* query)
3447 swig_type_info* qtype;
3454 func = scm_c_eval_string (
"gnc:register-report-create");
3455 g_return_val_if_fail (scm_is_procedure (func), -1);
3458 arg = scm_from_utf8_string (tmp ? tmp : _ (
"Credit"));
3459 args = scm_cons (arg, args);
3462 arg = scm_from_utf8_string (tmp ? tmp : _ (
"Debit"));
3463 args = scm_cons (arg, args);
3465 str = gnc_reg_get_name (ledger, FALSE);
3466 arg = scm_from_utf8_string (str ? str :
"");
3467 args = scm_cons (arg, args);
3470 arg = SCM_BOOL (reg->use_double_line);
3471 args = scm_cons (arg, args);
3473 arg = SCM_BOOL (reg->type == GENERAL_JOURNAL || reg->type == INCOME_LEDGER
3474 || reg->type == SEARCH_LEDGER);
3475 args = scm_cons (arg, args);
3477 arg = SCM_BOOL (reg->style == REG_STYLE_JOURNAL);
3478 args = scm_cons (arg, args);
3483 g_return_val_if_fail (query != NULL, -1);
3486 qtype = SWIG_TypeQuery (
"_p__QofQuery");
3487 g_return_val_if_fail (qtype, -1);
3489 arg = SWIG_NewPointerObj (query, qtype, 0);
3490 args = scm_cons (arg, args);
3491 g_return_val_if_fail (arg != SCM_UNDEFINED, -1);
3496 qtype = SWIG_TypeQuery (
"_p_Split");
3497 g_return_val_if_fail (qtype, -1);
3498 arg = SWIG_NewPointerObj (split, qtype, 0);
3504 args = scm_cons (arg, args);
3505 g_return_val_if_fail (arg != SCM_UNDEFINED, -1);
3508 qtype = SWIG_TypeQuery (
"_p_Account");
3509 g_return_val_if_fail (qtype, -1);
3512 arg = SWIG_NewPointerObj (account, qtype, 0);
3513 args = scm_cons (arg, args);
3514 g_return_val_if_fail (arg != SCM_UNDEFINED, -1);
3518 arg = scm_apply (func, args, SCM_EOL);
3519 g_return_val_if_fail (scm_is_exact (arg), -1);
3521 return scm_to_int (arg);
3529 gnc_plugin_page_register_cmd_print_check (GSimpleAction *simple,
3533 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3538 GList* splits = NULL, *item;
3539 GNCLedgerDisplayType ledger_type;
3540 Account* account, *subaccount = NULL;
3543 ENTER (
"(action %p, page %p)", simple, page);
3545 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3547 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3549 ledger_type = gnc_ledger_display_type (priv->ledger);
3551 if (ledger_type == LD_SINGLE || ledger_type == LD_SUBACCOUNT)
3556 if (ledger_type == LD_SUBACCOUNT)
3560 subaccount = account;
3567 splits = g_list_prepend (splits, split);
3568 gnc_ui_print_check_dialog_create (window, splits, subaccount);
3569 g_list_free (splits);
3578 splits = g_list_prepend (splits, split);
3579 gnc_ui_print_check_dialog_create (window, splits, subaccount);
3580 g_list_free (splits);
3585 else if (ledger_type == LD_GL && reg->type == SEARCH_LEDGER)
3593 for (item = splits; item; item = g_list_next (item))
3595 split = (Split*) item->data;
3596 if (common_acct == NULL)
3606 const gchar* title = _ (
"Print checks from multiple accounts?");
3607 const gchar* message =
3608 _ (
"This search result contains splits from more than one account. " 3609 "Do you want to print the checks even though they are not all " 3610 "from the same account?");
3611 dialog = gtk_message_dialog_new (GTK_WINDOW (window),
3612 GTK_DIALOG_DESTROY_WITH_PARENT,
3613 GTK_MESSAGE_WARNING,
3616 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
3618 gtk_dialog_add_button (GTK_DIALOG (dialog), _ (
"_Print checks"),
3620 response = gnc_dialog_run (GTK_DIALOG (dialog),
3621 GNC_PREF_WARN_CHECKPRINTING_MULTI_ACCT);
3622 gtk_widget_destroy (dialog);
3623 if (response != GTK_RESPONSE_YES)
3625 LEAVE (
"Multiple accounts");
3632 gnc_ui_print_check_dialog_create (window, splits, NULL);
3636 gnc_error_dialog (GTK_WINDOW (window),
"%s",
3637 _ (
"You can only print checks from a bank account register or search results."));
3638 LEAVE (
"Unsupported ledger type");
3646 gnc_plugin_page_register_cmd_cut (GSimpleAction *simple,
3650 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3653 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3655 ENTER (
"(action %p, page %p)", simple, page);
3656 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3658 GtkWidget *widget = gtk_window_get_focus(GTK_WINDOW (priv->gsr->window));
3659 const char *name = gtk_widget_get_name(widget);
3660 if (strcmp(name,
"GnucashSheet") != 0)
3662 gtk_editable_cut_clipboard( GTK_EDITABLE(widget));
3663 LEAVE(
"Not cut from GnucashSheet");
3668 gnucash_register_cut_clipboard (priv->gsr->reg);
3674 gnc_plugin_page_register_cmd_copy (GSimpleAction *simple,
3678 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3681 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3683 ENTER (
"(action %p, page %p)", simple, page);
3684 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3686 GtkWidget *widget = gtk_window_get_focus(GTK_WINDOW (priv->gsr->window));
3687 const char *name = gtk_widget_get_name(widget);
3688 if (strcmp(name,
"GnucashSheet") != 0)
3690 gtk_editable_copy_clipboard( GTK_EDITABLE(widget));
3691 LEAVE(
"Not copied from GnucashSheet");
3696 gnucash_register_copy_clipboard (priv->gsr->reg);
3702 gnc_plugin_page_register_cmd_paste (GSimpleAction *simple,
3706 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3709 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3711 ENTER (
"(action %p, page %p)", simple, page);
3712 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3714 GtkWidget *widget = gtk_window_get_focus(GTK_WINDOW (priv->gsr->window));
3715 const char *name = gtk_widget_get_name(widget);
3716 if (strcmp(name,
"GnucashSheet") != 0)
3718 gtk_editable_paste_clipboard( GTK_EDITABLE(widget));
3719 LEAVE(
"Not pasted to GnucashSheet");
3724 gnucash_register_paste_clipboard (priv->gsr->reg);
3730 gnc_plugin_page_register_cmd_edit_account (GSimpleAction *simple,
3734 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3737 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3739 ENTER (
"(action %p, page %p)", simple, page);
3748 gnc_plugin_page_register_cmd_find_account (GSimpleAction *simple,
3752 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3755 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3758 gnc_find_account_dialog (window, NULL);
3763 gnc_plugin_page_register_cmd_find_transactions (GSimpleAction *simple,
3767 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3771 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3773 ENTER (
"(action %p, page %p)", simple, page);
3774 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3776 gnc_ui_find_transactions_dialog_create (window, priv->ledger);
3782 gnc_plugin_page_register_cmd_edit_tax_options (GSimpleAction *simple,
3786 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3790 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3792 ENTER (
"(action %p, page %p)", simple, page);
3795 gnc_tax_info_dialog (window, account);
3800 gnc_plugin_page_register_cmd_cut_transaction (GSimpleAction *simple,
3804 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3807 ENTER (
"(action %p, page %p)", simple, page);
3809 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3811 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3812 gsr_default_cut_txn_handler (priv->gsr, NULL);
3816 "PasteTransactionAction");
3817 g_simple_action_set_enabled (G_SIMPLE_ACTION(action),
3824 gnc_plugin_page_register_cmd_copy_transaction (GSimpleAction *simple,
3828 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3832 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3834 ENTER (
"(action %p, page %p)", simple, page);
3835 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3841 "PasteTransactionAction");
3842 g_simple_action_set_enabled (G_SIMPLE_ACTION(action),
3849 gnc_plugin_page_register_cmd_paste_transaction (GSimpleAction *simple,
3853 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3857 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3859 ENTER (
"(action %p, page %p)", simple, page);
3860 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3868 gnc_plugin_page_register_cmd_void_transaction (GSimpleAction *simple,
3872 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3874 GtkWidget* dialog, *entry;
3877 GtkBuilder* builder;
3882 ENTER (
"(action %p, page %p)", simple, page);
3884 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3887 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3897 gnc_error_dialog (window,
"%s",
3898 _ (
"You cannot void a transaction with reconciled or cleared splits."));
3904 gnc_error_dialog (window,
3905 _ (
"This transaction is marked read-only with the comment: '%s'"), reason);
3909 if (!gnc_plugin_page_register_finish_pending (GNC_PLUGIN_PAGE (page)))
3912 builder = gtk_builder_new();
3913 gnc_builder_add_from_file (builder,
"gnc-plugin-page-register.glade",
3914 "void_transaction_dialog");
3915 dialog = GTK_WIDGET (gtk_builder_get_object (builder,
3916 "void_transaction_dialog"));
3917 entry = GTK_WIDGET (gtk_builder_get_object (builder,
"reason"));
3919 gtk_window_set_transient_for (GTK_WINDOW (dialog), window);
3921 result = gtk_dialog_run (GTK_DIALOG (dialog));
3922 if (result == GTK_RESPONSE_OK)
3924 reason = gtk_entry_get_text (GTK_ENTRY (entry));
3931 gtk_widget_destroy (dialog);
3932 g_object_unref (G_OBJECT (builder));
3937 gnc_plugin_page_register_cmd_unvoid_transaction (GSimpleAction *simple,
3941 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3946 ENTER (
"(action %p, page %p)", simple, page);
3948 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3950 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3959 static std::optional<time64>
3960 input_date (GtkWidget * parent,
const char *window_title,
const char* title)
3963 if (!gnc_dup_time64_dialog (parent, window_title, title, &rv))
3970 gnc_plugin_page_register_cmd_reverse_transaction (GSimpleAction *simple,
3974 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3978 Transaction* trans, *new_trans;
3983 ENTER (
"(action %p, page %p)", simple, page);
3985 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3987 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3999 LEAVE (
"shouldn't try to reverse the blank transaction...");
4006 const char *rev = _(
"A reversing entry has already been created for this transaction.");
4007 const char *jump = _(
"Jump to the transaction?");
4008 if (!gnc_verify_dialog (GTK_WINDOW (window), TRUE,
"%s\n\n%s", rev, jump))
4010 LEAVE (
"reverse cancelled");
4016 auto date = input_date (window, _(
"Reverse Transaction"), _(
"New Transaction Information"));
4019 LEAVE (
"reverse cancelled");
4023 gnc_suspend_gui_refresh ();
4030 gnc_resume_gui_refresh();
4035 split = xaccTransFindSplitByAccount(new_trans, account);
4038 if (gnc_split_reg_clear_filter_for_split (gsr, split))
4041 gnc_split_reg_jump_to_split (gsr, split);
4049 GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (priv->ledger);
4052 if (ledger_type == LD_SINGLE || ledger_type == LD_SUBACCOUNT)
4058 case GENERAL_JOURNAL:
4063 case PORTFOLIO_LEDGER:
4073 gnc_plugin_page_register_cmd_view_sort_by (GSimpleAction *simple,
4077 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4080 GtkWidget* dialog, *button;
4081 GtkBuilder* builder;
4086 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4087 ENTER (
"(action %p, page %p)", simple, page);
4089 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4090 if (priv->sd.dialog)
4092 gtk_window_present (GTK_WINDOW (priv->sd.dialog));
4093 LEAVE (
"existing dialog");
4099 builder = gtk_builder_new();
4100 gnc_builder_add_from_file (builder,
"gnc-plugin-page-register.glade",
4102 dialog = GTK_WIDGET (gtk_builder_get_object (builder,
"sort_by_dialog"));
4103 priv->sd.dialog = dialog;
4104 gtk_window_set_transient_for (GTK_WINDOW (dialog),
4105 gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window)));
4107 title = g_strdup_printf (_ (
"Sort %s by…"),
4109 gtk_window_set_title (GTK_WINDOW (dialog), title);
4113 sort = gnc_split_reg_get_sort_type (priv->gsr);
4114 name = SortTypeasString (sort);
4115 button = GTK_WIDGET (gtk_builder_get_object (builder, name));
4116 DEBUG (
"current sort %d, button %s(%p)", sort, name, button);
4117 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4118 priv->sd.original_sort_type = sort;
4120 button = GTK_WIDGET (gtk_builder_get_object (builder,
"sort_save"));
4121 if (priv->sd.save_order == TRUE)
4122 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4125 gtk_widget_set_visible (GTK_WIDGET (button),
4126 gnc_plugin_page_register_show_fs_save (page));
4129 button = GTK_WIDGET (gtk_builder_get_object (builder,
"sort_reverse"));
4130 if (priv->sd.reverse_order == TRUE)
4131 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4132 priv->sd.original_reverse_order = priv->sd.reverse_order;
4134 priv->sd.num_radio = GTK_WIDGET (gtk_builder_get_object (builder,
"BY_NUM"));
4135 priv->sd.act_radio = GTK_WIDGET (gtk_builder_get_object (builder,
4139 if (reg && !reg->use_tran_num_for_num_field)
4141 gtk_button_set_label (GTK_BUTTON (priv->sd.num_radio),
4142 _ (
"Transaction Number"));
4143 gtk_button_set_label (GTK_BUTTON (priv->sd.act_radio), _ (
"Number/Action"));
4145 gnc_book_option_register_cb (OPTION_NAME_NUM_FIELD_SOURCE,
4146 (GncBOCb)gnc_plugin_page_register_sort_book_option_changed,
4150 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func,
4154 gtk_widget_show (dialog);
4155 g_object_unref (G_OBJECT (builder));
4160 gnc_plugin_page_register_cmd_view_filter_by (GSimpleAction *simple,
4164 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4166 GtkWidget* dialog, *toggle, *button, *
table, *hbox;
4167 time64 start_time, end_time, time_val;
4168 GtkBuilder* builder;
4169 gboolean sensitive, value;
4174 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4175 ENTER (
"(action %p, page %p)", simple, page);
4177 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4178 if (priv->fd.dialog)
4180 gtk_window_present (GTK_WINDOW (priv->fd.dialog));
4181 LEAVE (
"existing dialog");
4186 builder = gtk_builder_new();
4187 gnc_builder_add_from_file (builder,
"gnc-plugin-page-register.glade",
4189 gnc_builder_add_from_file (builder,
"gnc-plugin-page-register.glade",
4190 "filter_by_dialog");
4191 dialog = GTK_WIDGET (gtk_builder_get_object (builder,
"filter_by_dialog"));
4192 priv->fd.dialog = dialog;
4193 gtk_window_set_transient_for (GTK_WINDOW (dialog),
4194 gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window)));
4197 title = g_strdup_printf (_ (
"Filter %s by…"),
4199 gtk_window_set_title (GTK_WINDOW (dialog), title);
4203 for (i = 0; status_actions[i].action_name; i++)
4205 toggle = GTK_WIDGET (gtk_builder_get_object (builder,
4206 status_actions[i].action_name));
4207 value = priv->fd.cleared_match & status_actions[i].value;
4208 status_actions[i].widget = toggle;
4209 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), value);
4211 priv->fd.original_cleared_match = priv->fd.cleared_match;
4213 button = GTK_WIDGET (gtk_builder_get_object (builder,
"filter_save"));
4214 if (priv->fd.save_filter == TRUE)
4215 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4218 gtk_widget_set_visible (GTK_WIDGET (button),
4219 gnc_plugin_page_register_show_fs_save (page));
4222 priv->fd.num_days = GTK_WIDGET (gtk_builder_get_object (builder,
4223 "filter_show_num_days"));
4224 button = GTK_WIDGET (gtk_builder_get_object (builder,
"filter_show_days"));
4228 if (priv->fd.days > 0)
4230 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4231 gtk_widget_set_sensitive (GTK_WIDGET (priv->fd.num_days), TRUE);
4232 gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->fd.num_days), priv->fd.days);
4233 priv->fd.original_days = priv->fd.days;
4241 gtk_widget_set_sensitive (GTK_WIDGET (priv->fd.num_days), FALSE);
4242 priv->fd.original_days = 0;
4246 xaccQueryGetDateMatchTT (query, &start_time, &end_time);
4250 priv->fd.original_start_time = start_time;
4251 priv->fd.start_time = start_time;
4252 priv->fd.original_end_time = end_time;
4253 priv->fd.end_time = end_time;
4255 button = GTK_WIDGET (gtk_builder_get_object (builder,
"filter_show_range"));
4256 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), start_time ||
4258 table = GTK_WIDGET (gtk_builder_get_object (builder,
"select_range_table"));
4259 priv->fd.table =
table;
4260 gtk_widget_set_sensitive (GTK_WIDGET (
table), start_time || end_time);
4262 priv->fd.start_date_choose = GTK_WIDGET (gtk_builder_get_object (builder,
4263 "start_date_choose"));
4264 priv->fd.start_date_today = GTK_WIDGET (gtk_builder_get_object (builder,
4265 "start_date_today"));
4266 priv->fd.end_date_choose = GTK_WIDGET (gtk_builder_get_object (builder,
4267 "end_date_choose"));
4268 priv->fd.end_date_today = GTK_WIDGET (gtk_builder_get_object (builder,
4273 if (start_time == 0)
4275 button = GTK_WIDGET (gtk_builder_get_object (builder,
"start_date_earliest"));
4276 time_val = xaccQueryGetEarliestDateFound (query);
4281 time_val = start_time;
4285 button = priv->fd.start_date_today;
4290 button = priv->fd.start_date_choose;
4294 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4295 priv->fd.start_date = gnc_date_edit_new (
gnc_time (NULL), FALSE, FALSE);
4296 hbox = GTK_WIDGET (gtk_builder_get_object (builder,
"start_date_hbox"));
4297 gtk_box_pack_start (GTK_BOX (hbox), priv->fd.start_date, TRUE, TRUE, 0);
4298 gtk_widget_show (priv->fd.start_date);
4299 gtk_widget_set_sensitive (GTK_WIDGET (priv->fd.start_date), sensitive);
4300 gnc_date_edit_set_time (GNC_DATE_EDIT (priv->fd.start_date), time_val);
4301 g_signal_connect (G_OBJECT (priv->fd.start_date),
"date-changed",
4302 G_CALLBACK (gnc_plugin_page_register_filter_gde_changed_cb),
4310 button = GTK_WIDGET (gtk_builder_get_object (builder,
"end_date_latest"));
4311 time_val = xaccQueryGetLatestDateFound (query);
4316 time_val = end_time;
4320 button = priv->fd.end_date_today;
4325 button = priv->fd.end_date_choose;
4329 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4330 priv->fd.end_date = gnc_date_edit_new (
gnc_time (NULL), FALSE, FALSE);
4331 hbox = GTK_WIDGET (gtk_builder_get_object (builder,
"end_date_hbox"));
4332 gtk_box_pack_start (GTK_BOX (hbox), priv->fd.end_date, TRUE, TRUE, 0);
4333 gtk_widget_show (priv->fd.end_date);
4334 gtk_widget_set_sensitive (GTK_WIDGET (priv->fd.end_date), sensitive);
4335 gnc_date_edit_set_time (GNC_DATE_EDIT (priv->fd.end_date), time_val);
4336 g_signal_connect (G_OBJECT (priv->fd.end_date),
"date-changed",
4337 G_CALLBACK (gnc_plugin_page_register_filter_gde_changed_cb),
4342 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func,
4346 gtk_widget_show (dialog);
4347 g_object_unref (G_OBJECT (builder));
4352 gnc_plugin_page_register_cmd_reload (GSimpleAction *simple,
4356 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4360 ENTER (
"(action %p, page %p)", simple, page);
4362 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4364 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4370 LEAVE (
"register has pending edits");
4378 gnc_plugin_page_register_cmd_style_changed (GSimpleAction *simple,
4379 GVariant *parameter,
4382 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4386 ENTER (
"(action %p, page %p)", simple, page);
4388 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4390 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4394 g_action_change_state (G_ACTION(simple), parameter);
4396 gnc_split_reg_change_style (priv->gsr, value, priv->enable_refresh);
4398 gnc_plugin_page_register_ui_update (NULL, page);
4403 gnc_plugin_page_register_cmd_style_double_line (GSimpleAction *simple,
4404 GVariant *parameter,
4407 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4410 gboolean use_double_line;
4413 ENTER (
"(action %p, page %p)", simple, page);
4415 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
4417 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4420 state = g_action_get_state (G_ACTION(simple));
4422 g_action_change_state (G_ACTION(simple), g_variant_new_boolean (!g_variant_get_boolean (state)));
4424 use_double_line = !g_variant_get_boolean (state);
4426 if (use_double_line != reg->use_double_line)
4429 if (priv->enable_refresh)
4432 g_variant_unref (state);
4437 gnc_plugin_page_register_cmd_transfer (GSimpleAction *simple,
4441 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4443 GncWindow* gnc_window;
4446 ENTER (
"(action %p, page %p)", simple, page);
4448 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4451 gnc_window = GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window);
4452 window = GTK_WIDGET (gnc_window_get_gtk_window (gnc_window));
4453 gnc_xfer_dialog (window, account);
4458 gnc_plugin_page_register_cmd_reconcile (GSimpleAction *simple,
4462 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4465 RecnWindow* recnData;
4467 ENTER (
"(action %p, page %p)", simple, page);
4469 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4479 if (!gnc_plugin_page_register_finish_pending (GNC_PLUGIN_PAGE (page)))
4484 window = gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (
4486 recnData = recnWindow (GTK_WIDGET (window), account);
4487 gnc_ui_reconcile_window_raise (recnData);
4492 gnc_plugin_page_register_cmd_stock_assistant (GSimpleAction *simple,
4496 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4500 ENTER (
"(action %p, page %p)", simple, page);
4502 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4503 window = gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window));
4505 gnc_stock_transaction_assistant (GTK_WIDGET (window), account);
4511 gnc_plugin_page_register_cmd_autoclear (GSimpleAction *simple,
4515 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4518 AutoClearWindow* autoClearData;
4520 ENTER (
"(action %p, page %p)", simple, page);
4522 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4526 window = gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (
4528 autoClearData = autoClearWindow (GTK_WIDGET (window), account);
4529 gnc_ui_autoclear_window_raise (autoClearData);
4534 gnc_plugin_page_register_cmd_stock_split (GSimpleAction *simple,
4538 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4542 ENTER (
"(action %p, page %p)", simple, page);
4544 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4547 window = gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window));
4548 gnc_stock_split_dialog (GTK_WIDGET (window), account);
4553 gnc_plugin_page_register_cmd_lots (GSimpleAction *simple,
4557 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4561 ENTER (
"(action %p, page %p)", simple, page);
4563 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4565 window = gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (
4568 gnc_lot_viewer_dialog (window, account);
4573 gnc_plugin_page_register_cmd_enter_transaction (GSimpleAction *simple,
4577 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4580 ENTER (
"(action %p, page %p)", simple, page);
4582 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4584 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4585 gnc_split_reg_enter (priv->gsr, FALSE);
4590 gnc_plugin_page_register_cmd_cancel_transaction (GSimpleAction *simple,
4594 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4597 ENTER (
"(action %p, page %p)", simple, page);
4599 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4601 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4608 gnc_plugin_page_register_cmd_delete_transaction (GSimpleAction *simple,
4612 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4615 ENTER (
"(action %p, page %p)", simple, page);
4617 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4619 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4620 gsr_default_delete_handler (priv->gsr, NULL);
4626 gnc_plugin_page_register_cmd_linked_transaction (GSimpleAction *simple,
4630 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4633 ENTER (
"(action %p, page %p)", simple, page);
4635 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4637 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4638 gsr_default_doclink_handler (priv->gsr);
4639 gnc_plugin_page_register_ui_update (NULL, page);
4644 gnc_plugin_page_register_cmd_linked_transaction_open (GSimpleAction *simple,
4648 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4651 ENTER (
"(action %p, page %p)", simple, page);
4653 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4655 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4656 gsr_default_doclink_open_handler (priv->gsr);
4660 static GncInvoice* invoice_from_split (Split* split)
4662 GncInvoice* invoice;
4681 gnc_plugin_page_register_cmd_jump_linked_invoice (GSimpleAction *simple,
4685 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4688 GncInvoice* invoice;
4692 ENTER (
"(action %p, page %p)", simple, page);
4694 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4695 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4699 window = GNC_PLUGIN_PAGE(page)->window;
4703 auto invoices = invoices_from_transaction (txn);
4704 if (invoices.empty())
4705 PERR (
"shouldn't happen: if no invoices, function is never called");
4706 else if (invoices.size() == 1)
4707 invoice = invoices[0];
4710 GList *details = NULL;
4713 for (
const auto& inv : invoices)
4718 gnc_account_print_info (gncInvoiceGetPostedAcc (inv), TRUE));
4719 details = g_list_prepend
4724 g_strdup_printf (_(
"%s %s from %s, posted %s, amount %s"),
4725 gncInvoiceGetTypeString (inv),
4726 gncInvoiceGetID (inv),
4727 gncOwnerGetName (gncInvoiceGetOwner (inv)),
4731 details = g_list_reverse (details);
4732 choice = gnc_choose_radio_option_dialog
4733 (window, _(
"Select Business Item"),
4734 _(
"Several business items are linked with this transaction. \ 4735 Please choose one:"), _(
"Select"), 0, details);
4736 if ((choice >= 0) && ((
size_t)choice < invoices.size()))
4737 invoice = invoices[choice];
4738 g_list_free_full (details, g_free);
4744 GtkWindow *gtk_window = gnc_window_get_gtk_window (GNC_WINDOW (window));
4745 gnc_ui_invoice_edit (gtk_window, invoice);
4752 gnc_plugin_page_register_cmd_blank_transaction (GSimpleAction *simple,
4756 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4760 ENTER (
"(action %p, page %p)", simple, page);
4762 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4764 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4770 gnc_split_reg_jump_to_blank (priv->gsr);
4775 find_after_date (Split *split,
time64* find_date)
4784 gnc_plugin_page_register_cmd_goto_date (GSimpleAction *simple,
4788 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4794 ENTER (
"(action %p, page %p)", simple, page);
4795 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4797 auto date = input_date (window, _(
"Go to Date"), _(
"Go to Date"));
4801 LEAVE (
"goto_date cancelled");
4812 auto it = g_list_find_custom (splits, &date.value(), (GCompareFunc)find_after_date);
4815 gnc_split_reg_jump_to_split (gsr, GNC_SPLIT(it->data));
4817 gnc_split_reg_jump_to_blank (gsr);
4819 g_list_free (splits);
4824 gnc_plugin_page_register_cmd_duplicate_transaction (GSimpleAction *simple,
4828 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4831 ENTER (
"(action %p, page %p)", simple, page);
4833 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4835 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4842 gnc_plugin_page_register_cmd_reinitialize_transaction (GSimpleAction *simple,
4846 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4849 ENTER (
"(action %p, page %p)", simple, page);
4851 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4853 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4854 gsr_default_reinit_handler (priv->gsr, NULL);
4859 gnc_plugin_page_register_cmd_expand_transaction (GSimpleAction *simple,
4860 GVariant *parameter,
4863 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4869 ENTER (
"(action %p, page %p)", simple, page);
4871 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4873 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4876 state = g_action_get_state (G_ACTION(simple));
4878 g_action_change_state (G_ACTION(simple), g_variant_new_boolean (!g_variant_get_boolean (state)));
4880 expand = !g_variant_get_boolean (state);
4883 g_variant_unref (state);
4890 gnc_plugin_page_register_cmd_exchange_rate (GSimpleAction *simple,
4894 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4898 ENTER (
"(action %p, page %p)", simple, page);
4900 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4902 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4911 jump_multiple_splits_by_single_account (
Account *account, Split *split)
4915 Account *other_account = NULL;
4916 Split *other_split = NULL;
4924 Split *s = (Split*)splits->data;
4927 if (!xaccTransStillHasSplit(trans, s))
4935 if (other_account != a)
4947 other_split = split;
4953 jump_multiple_splits_by_value (
Account *account, Split *split, gboolean largest)
4957 Split *other_split = NULL;
4959 int cmp = largest ? 1 : -1;
4967 Split *s = (Split*)splits->data;
4970 if (!xaccTransStillHasSplit(trans, s))
4992 other_split = split;
4998 jump_multiple_splits (
Account* account, Split *split)
5000 GncPrefJumpMultSplits mode = (GncPrefJumpMultSplits)
gnc_prefs_get_enum(GNC_PREFS_GROUP_GENERAL_REGISTER, GNC_PREF_JUMP_MULT_SPLITS);
5004 case JUMP_LARGEST_VALUE_FIRST_SPLIT:
5005 return jump_multiple_splits_by_value (account, split, TRUE);
5007 case JUMP_SMALLEST_VALUE_FIRST_SPLIT:
5008 return jump_multiple_splits_by_value (account, split, FALSE);
5016 return jump_multiple_splits_by_single_account (account, split);
5020 gnc_plugin_page_register_cmd_jump (GSimpleAction *simple,
5024 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5034 gboolean multiple_splits;
5036 ENTER (
"(action %p, page %p)", simple, page);
5038 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5040 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5041 window = GNC_PLUGIN_PAGE (page)->window;
5044 LEAVE (
"no window");
5052 LEAVE (
"no split (1)");
5057 if (account == NULL)
5059 LEAVE (
"no account");
5064 multiple_splits = other_split == NULL;
5067 if (account == leader)
5070 if (cursor_class == CURSOR_CLASS_SPLIT)
5089 LEAVE (
"split for this account");
5093 if (multiple_splits)
5095 other_split = jump_multiple_splits (account, split);
5097 if (other_split == NULL)
5099 GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW(window),
5100 (GtkDialogFlags)(GTK_DIALOG_MODAL
5101 | GTK_DIALOG_DESTROY_WITH_PARENT),
5105 _(
"Unable to jump to other account"));
5107 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(dialog),
5108 "%s", _(
"This transaction involves more than one other account. Select a specific split to jump to that account."));
5109 gtk_dialog_add_button (GTK_DIALOG(dialog), _(
"_OK"), GTK_RESPONSE_OK);
5110 gnc_dialog_run (GTK_DIALOG(dialog), GNC_PREF_WARN_REG_TRANS_JUMP_MULTIPLE_SPLITS);
5111 gtk_widget_destroy (dialog);
5113 LEAVE (
"no split (2)");
5117 split = other_split;
5120 if (account == NULL)
5122 LEAVE (
"no account (2)");
5126 if (account == leader)
5128 GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW(window),
5129 (GtkDialogFlags)(GTK_DIALOG_MODAL
5130 | GTK_DIALOG_DESTROY_WITH_PARENT),
5134 _(
"Unable to jump to other account"));
5136 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(dialog),
5137 "%s", _(
"This transaction only involves the current account so there is no other account to jump to."));
5138 gtk_dialog_add_button (GTK_DIALOG(dialog), _(
"_OK"), GTK_RESPONSE_OK);
5139 gnc_dialog_run (GTK_DIALOG(dialog), GNC_PREF_WARN_REG_TRANS_JUMP_SINGLE_ACCOUNT);
5140 gtk_widget_destroy (dialog);
5142 LEAVE (
"register open for account");
5148 if (new_page == NULL)
5150 LEAVE (
"couldn't create new page");
5158 gboolean jump_twice = FALSE;
5164 if (new_page_reg->style != REG_STYLE_JOURNAL)
5168 if (gnc_split_reg_clear_filter_for_split (gsr, split))
5171 gnc_split_reg_jump_to_split (gsr, split);
5173 if (multiple_splits && jump_twice)
5179 gnc_split_reg_jump_to_split (gsr, split);
5185 gnc_plugin_page_register_cmd_schedule (GSimpleAction *simple,
5189 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5193 ENTER (
"(action %p, page %p)", simple, page);
5195 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5199 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5200 gsr_default_schedule_handler (priv->gsr, window);
5205 scrub_split (Split *split)
5211 g_return_if_fail (split);
5215 g_return_if_fail (trans);
5227 gnc_plugin_page_register_cmd_scrub_current (GSimpleAction *simple,
5231 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5236 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5238 ENTER (
"(action %p, page %p)", simple, page);
5240 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5244 LEAVE (
"no query found");
5250 gnc_suspend_gui_refresh();
5252 gnc_resume_gui_refresh();
5257 scrub_kp_handler (GtkWidget *widget, GdkEventKey *event, gpointer data)
5259 if (event->length == 0)
return FALSE;
5261 switch (event->keyval)
5263 case GDK_KEY_Escape:
5265 auto abort_scrub = gnc_verify_dialog (GTK_WINDOW(widget),
false,
5266 "%s", _(check_repair_abort_YN));
5280 gnc_plugin_page_register_cmd_scrub_all (GSimpleAction *simple,
5284 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5288 GList* node, *splits;
5289 gint split_count = 0, curr_split_no = 0;
5290 gulong scrub_kp_handler_ID;
5291 const char* message = _ (
"Checking splits in current register: %u of %u");
5293 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5295 ENTER (
"(action %p, page %p)", simple, page);
5297 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5301 LEAVE (
"no query found");
5305 gnc_suspend_gui_refresh();
5306 is_scrubbing = TRUE;
5308 window = GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window);
5309 scrub_kp_handler_ID = g_signal_connect (G_OBJECT (window),
"key-press-event",
5310 G_CALLBACK (scrub_kp_handler), NULL);
5311 gnc_window_set_progressbar_window (window);
5314 split_count = g_list_length (splits);
5315 for (node = splits; node && !gnc_get_abort_scrub (); node = node->next, curr_split_no++)
5317 auto split = GNC_SPLIT(node->data);
5319 if (!split)
continue;
5321 PINFO (
"Start processing split %d of %d",
5322 curr_split_no + 1, split_count);
5324 scrub_split (split);
5326 PINFO (
"Finished processing split %d of %d",
5327 curr_split_no + 1, split_count);
5329 if (curr_split_no % 10 == 0)
5331 char* progress_msg = g_strdup_printf (message, curr_split_no, split_count);
5332 gnc_window_show_progress (progress_msg, (100 * curr_split_no) / split_count);
5333 g_free (progress_msg);
5337 g_signal_handler_disconnect (G_OBJECT(window), scrub_kp_handler_ID);
5338 gnc_window_show_progress (NULL, -1.0);
5339 is_scrubbing = FALSE;
5340 show_abort_verify = TRUE;
5343 gnc_resume_gui_refresh();
5348 gnc_plugin_page_register_cmd_account_report (GSimpleAction *simple,
5352 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5354 GncMainWindow* window;
5357 ENTER (
"(action %p, page %p)", simple, page);
5359 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5361 window = GNC_MAIN_WINDOW (GNC_PLUGIN_PAGE (page)->window);
5362 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5363 id = report_helper (priv->ledger, NULL, NULL);
5365 gnc_main_window_open_report (
id, window);
5370 gnc_plugin_page_register_cmd_transaction_report (GSimpleAction *simple,
5374 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5376 GncMainWindow* window;
5383 ENTER (
"(action %p, page %p)", simple, page);
5385 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5387 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5394 query = qof_query_create_for (GNC_ID_SPLIT);
5399 GNC_ID_SPLIT, QOF_QUERY_AND);
5401 window = GNC_MAIN_WINDOW (GNC_PLUGIN_PAGE (page)->window);
5402 id = report_helper (priv->ledger, split, query);
5404 gnc_main_window_open_report (
id, window);
5420 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page));
5422 page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
5423 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5424 priv->lines_default = lines_default;
5425 priv->read_only = read_only;
5434 g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), NULL);
5436 page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
5437 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5443 gnc_plugin_page_help_changed_cb (GNCSplitReg* gsr,
5451 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (register_page));
5453 window = GNC_WINDOW (GNC_PLUGIN_PAGE (register_page)->window);
5463 (GNC_MAIN_WINDOW(window)) != GNC_PLUGIN_PAGE(register_page)))
5467 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (register_page);
5469 help = gnc_table_get_help (reg->table);
5470 gnc_window_set_status (window, GNC_PLUGIN_PAGE (register_page), help);
5475 gnc_plugin_page_popup_menu_cb (GNCSplitReg* gsr,
5480 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5482 window = GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window);
5490 GNC_PLUGIN_PAGE (page));
5494 gnc_plugin_page_register_refresh_cb (GHashTable* changes, gpointer user_data)
5496 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5499 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5500 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5505 ei = gnc_gui_get_entity_events (changes, &priv->key);
5508 if (ei->event_mask & QOF_EVENT_DESTROY)
5513 if (ei->event_mask & QOF_EVENT_MODIFY)
5521 gnucash_register_refresh_from_prefs (priv->gsr->reg);
5522 gtk_widget_queue_draw (priv->widget);
5525 gnc_plugin_page_register_ui_update (NULL, page);
5529 gnc_plugin_page_register_close_cb (gpointer user_data)
5544 gppr_account_destroy_cb (
Account* account)
5548 GNCLedgerDisplayType ledger_type;
5551 GList* item, *kill = NULL;
5558 for (; citem; citem = g_list_next (citem))
5561 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5562 ledger_type = gnc_ledger_display_type (priv->ledger);
5563 if (ledger_type == LD_GL)
5565 kill = g_list_prepend (kill, page);
5568 else if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
5570 if (guid_compare (acct_guid, &priv->key) == 0)
5572 kill = g_list_prepend (kill, page);
5577 kill = g_list_reverse (kill);
5579 for (item = kill; item; item = g_list_next (item))
5602 gnc_plugin_page_register_event_handler (
QofInstance* entity,
5612 g_return_if_fail (page);
5613 if (!GNC_IS_TRANS (entity) && !GNC_IS_ACCOUNT (entity))
5616 ENTER (
"entity %p of type %d, page %p, event data %p",
5617 entity, event_type, page, ed);
5621 if (GNC_IS_ACCOUNT (entity))
5623 if (GNC_IS_MAIN_WINDOW (window))
5629 LEAVE (
"account is NULL");
5633 gchar *name = gnc_plugin_page_register_get_tab_name (GNC_PLUGIN_PAGE (page));
5636 gchar *long_name = gnc_plugin_page_register_get_long_name (GNC_PLUGIN_PAGE (page));
5639 gchar *color = gnc_plugin_page_register_get_tab_color (GNC_PLUGIN_PAGE (page));
5642 gnc_plugin_page_register_update_page_icon (GNC_PLUGIN_PAGE (page));
5648 LEAVE (
"tab contents updated");
5652 if (! (event_type & (QOF_EVENT_MODIFY | QOF_EVENT_DESTROY)))
5654 LEAVE (
"not a modify");
5657 trans = GNC_TRANS (entity);
5661 LEAVE (
"not in this book");
5665 if (GNC_IS_MAIN_WINDOW (window))
5668 if (visible_page != GNC_PLUGIN_PAGE (page))
5670 LEAVE (
"page not visible");
5675 gnc_plugin_page_register_ui_update (NULL, page);
CursorClass gnc_split_register_get_current_cursor_class(SplitRegister *reg)
Returns the class of a register's current cursor.
Split * gnc_split_register_get_current_trans_split(SplitRegister *reg, VirtualCellLocation *trans_split_loc)
Gets the anchoring split of the transaction at the current cursor location, which may be on the trans...
void gnc_ledger_display_close(GNCLedgerDisplay *ld)
close the window
GncPluginPage * gnc_plugin_page_register_new(Account *account, gboolean subaccounts)
Create a new "register" plugin page, given a pointer to an account.
void gnc_ledger_display_set_focus(GNCLedgerDisplay *ld, gboolean focus)
Mark the ledger as being in focus (refresh immediately) or not.
Functions to load, save and get gui state.
gint xaccSplitOrder(const Split *sa, const Split *sb)
The xaccSplitOrder(sa,sb) method is useful for sorting.
GtkWidget * gnc_plugin_page_get_window(GncPluginPage *page)
Retrieve a pointer to the GncMainWindow (GtkWindow) containing this page.
gboolean xaccTransHasReconciledSplits(const Transaction *trans)
FIXME: document me.
void gnc_ledger_display_refresh(GNCLedgerDisplay *ld)
redisplay/redraw only the indicated window.
const gchar * tab_icon
The relative name of the icon that should be shown on the tab for this page.
const char * gnc_split_register_get_credit_string(SplitRegister *reg)
Return the credit string used in the register.
gboolean(* focus_page_function)(GncPluginPage *plugin_page)
This function performs specific actions to set the focus on a specific widget.
void xaccTransSetDatePostedSecsNormalized(Transaction *trans, time64 time)
This function sets the posted date of the transaction, specified by a time64 (see ctime(3))...
void gnc_main_window_update_menu_and_toolbar(GncMainWindow *window, GncPluginPage *page, const gchar **ui_updates)
Update the main window menu with the placeholders listed in ui_updates and load the page specific too...
void(* focus_page)(GncPluginPage *plugin_page, gboolean on_current_page)
Perform plugin specific actions to set the focus.
void gnc_plugin_page_register_filter_save_cb(GtkToggleButton *button, GncPluginPageRegister *page)
This function is called whenever the save status is checked or unchecked.
time64 xaccTransGetDate(const Transaction *trans)
Retrieve the posted date of the transaction.
The instance data structure for a content plugin.
const GList * gnc_gobject_tracking_get_list(const gchar *name)
Get a list of all known objects of a specified type.
void gnc_plugin_page_register_filter_days_changed_cb(GtkSpinButton *button, GncPluginPageRegister *page)
This function is called when the "number of days" spin button is changed which is then saved and upda...
gboolean xaccTransIsReadonlyByPostedDate(const Transaction *trans)
Returns TRUE if this Transaction is read-only because its posted-date is older than the "auto-readonl...
Date and Time handling routines.
gulong gnc_prefs_register_cb(const char *group, const gchar *pref_name, gpointer func, gpointer user_data)
Register a callback that gets triggered when the given preference changes.
gboolean gnc_split_register_save(SplitRegister *reg, gboolean do_commit)
Copy the contents of the current cursor to a split.
This file contains the functions to present a gui to the user for creating a new account or editing a...
gchar * gnc_g_list_stringjoin(GList *list_of_strings, const gchar *sep)
Return a string joining a GList whose elements are gchar* strings.
void gnc_split_register_unvoid_current_trans(SplitRegister *reg)
Unvoids the transaction associated with the current cursor, if non-NULL.
QofBook * qof_instance_get_book(gconstpointer inst)
Return the book pointer.
gboolean xaccAccountIsPriced(const Account *acc)
Returns true if the account is a stock, mutual fund or currency, otherwise false. ...
void(* QofEventHandler)(QofInstance *ent, QofEventId event_type, gpointer handler_data, gpointer event_data)
Handler invoked when an event is generated.
void gnc_split_register_expand_current_trans(SplitRegister *reg, gboolean expand)
Expand the current transaction if it is collapsed.
utility functions for the GnuCash UI
#define PINFO(format, args...)
Print an informational note.
void gnc_main_window_set_vis_of_items_by_action(GncMainWindow *window, const gchar **action_names, gboolean vis)
Show or hide menu and toolbar items based on a NULL terminated list of action names.
void qof_query_purge_terms(QofQuery *q, QofQueryParamList *param_list)
Remove query terms of a particular type from q.
GNCAccountType xaccAccountGetType(const Account *acc)
Returns the account's account type.
Transaction * gnc_split_register_get_current_trans(SplitRegister *reg)
Gets the transaction at the current cursor location, which may be on the transaction itself or on any...
GncPluginPage *(* recreate_page)(GtkWidget *window, GKeyFile *file, const gchar *group)
Create a new page based on the information saved during a previous instantiation of gnucash...
gboolean gnc_menubar_model_find_item(GMenuModel *menu_model, GncMenuModelSearch *gsm)
Find a GtkMenu item from the action name.
gint gnc_state_drop_sections_for(const gchar *partial_name)
Drop all sections from the state file whose name contains partial_name.
const char * xaccTransGetReadOnly(Transaction *trans)
Returns a non-NULL value if this Transaction was marked as read-only with some specific "reason" text...
#define DEBUG(format, args...)
Print a debugging message.
const gchar * gnc_plugin_page_get_page_name(GncPluginPage *page)
Retrieve the name of this page.
gboolean string_to_guid(const gchar *string, GncGUID *guid)
Given a string, replace the given guid with the parsed one unless the given value is null...
Functions that are supported by all types of windows.
void gnc_features_set_used(QofBook *book, const gchar *feature)
Indicate that the current book uses the given feature.
gboolean gnc_commodity_equal(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equal.
GSimpleActionGroup * gnc_plugin_page_get_action_group(GncPluginPage *page)
Retrieve the GSimpleActionGroup object associated with this page.
gpointer gnc_account_foreach_descendant_until(const Account *acc, AccountCb2 thunk, gpointer user_data)
This method will traverse all children of this accounts and their descendants, calling 'func' on each...
const char * xaccPrintAmount(gnc_numeric val, GNCPrintAmountInfo info)
Make a string representation of a gnc_numeric.
void gnc_plugin_page_register_sort_response_cb(GtkDialog *dialog, gint response, GncPluginPageRegister *plugin_page)
This function is called when the "Sort By…" dialog is closed.
QofQuery * qof_query_copy(QofQuery *q)
Make a copy of the indicated query.
gboolean qof_query_equal(const QofQuery *q1, const QofQuery *q2)
Compare two queries for equality.
GtkWidget * window
The window that contains the display widget for this plugin.
Account * gnc_ledger_display_leader(GNCLedgerDisplay *ld)
Implementations.
void gnc_plugin_page_set_page_long_name(GncPluginPage *page, const char *name)
Set the long name of this page.
Transaction * xaccSplitGetParent(const Split *split)
Returns the parent transaction of the split.
void gnc_tm_get_today_start(struct tm *tm)
The gnc_tm_get_today_start() routine takes a pointer to a struct tm and fills it in with the first se...
GSimpleActionGroup * gnc_plugin_page_create_action_group(GncPluginPage *page, const gchar *group_name)
Create the GSimpleActionGroup object associated with this page.
gchar * guid_to_string_buff(const GncGUID *guid, gchar *str)
The guid_to_string_buff() routine puts a null-terminated string encoding of the id into the memory po...
void gnc_ledger_display_set_query(GNCLedgerDisplay *ledger_display, Query *q)
Set the query used for a register.
gint gnc_numeric_compare(gnc_numeric a, gnc_numeric b)
Returns 1 if a>b, -1 if b>a, 0 if a == b.
#define PERR(format, args...)
Log a serious error.
#define ENTER(format, args...)
Print a function entry debugging message.
Cleanup functions for business objects.
gnc_numeric gncInvoiceGetTotal(GncInvoice *invoice)
Return the "total" amount of the invoice as seen on the document (and shown to the user in the report...
GKeyFile * gnc_state_get_current(void)
Returns a pointer to the most recently loaded state.
void gnc_ui_edit_account_window(GtkWindow *parent, Account *account)
Display a window for editing the attributes of an existing account.
gboolean gnc_split_register_current_trans_expanded(SplitRegister *reg)
Return TRUE if current trans is expanded and style is REG_STYLE_LEDGER.
GncPluginPage * gnc_main_window_get_current_page(GncMainWindow *window)
Retrieve a pointer to the page that is currently at the front of the specified window.
const char * xaccTransGetDocLink(const Transaction *trans)
Gets the transaction Document Link.
void gnc_main_window_open_page(GncMainWindow *window, GncPluginPage *page)
Display a data plugin page in a window.
Query * gnc_ledger_display_get_query(GNCLedgerDisplay *ld)
return the query associated with a ledger
Functions for adding content to a window.
GncPluginPage * gnc_plugin_page_register_new_ledger(GNCLedgerDisplay *ledger)
Create a new "register" plugin page, given a pointer to an already created ledger.
void(* update_edit_menu_actions)(GncPluginPage *plugin_page, gboolean hide)
This function vector allows page specific actions to override the generic code for setting the sensit...
#define VREC
split is void
void(* destroy_widget)(GncPluginPage *plugin_page)
Function called to destroy the display widget for a particular type of plugin.
gint qof_event_register_handler(QofEventHandler handler, gpointer user_data)
Register a handler for events.
void main_window_update_page_long_name(GncPluginPage *page, const gchar *long_name_in)
Update the long name of the page in the main window.
void gnc_tm_free(struct tm *time)
free a struct tm* created with gnc_localtime() or gnc_gmtime()
const char * xaccAccountGetColor(const Account *acc)
Get the account's color.
void gnc_plugin_page_register_filter_select_range_cb(GtkRadioButton *button, GncPluginPageRegister *page)
This function is called when the radio buttons changes state.
int xaccTransCountSplits(const Transaction *trans)
Returns the number of splits in this transaction.
GNCLedgerDisplay * gnc_ledger_display_subaccounts(Account *account, gboolean mismatched_commodities)
opens up a register window to display the parent account and all of its children. ...
#define xaccAccountGetGUID(X)
void gnc_set_abort_scrub(gboolean abort)
The gnc_set_abort_scrub () method causes a currently running scrub operation to stop, if abort is TRUE; gnc_set_abort_scrub(FALSE) must be called before any scrubbing operation.
void gnc_plugin_page_register_sort_button_cb(GtkToggleButton *button, GncPluginPageRegister *page)
This function is called when a radio button in the "Sort By…" dialog is clicked. ...
convert single-entry accounts to clean double-entry
char * qof_print_date(time64 secs)
Convenience; calls through to qof_print_date_dmy_buff().
GList SplitList
GList of Split.
gboolean xaccTransHasSplitsInState(const Transaction *trans, const char state)
FIXME: document me.
gboolean gnc_split_register_has_copied_item(void)
Return TRUE if copied_item holds a transaction or split.
QofBook * qof_session_get_book(const QofSession *session)
Returns the QofBook of this session.
gchar * gnc_account_get_full_name(const Account *account)
The gnc_account_get_full_name routine returns the fully qualified name of the account using the given...
void gnc_split_register_redraw(SplitRegister *reg)
Causes a redraw of the register window associated with reg.
Functions providing a register page for the GnuCash UI.
const char * gnc_split_register_get_debit_string(SplitRegister *reg)
Return the debit string used in the register.
void main_window_update_page_color(GncPluginPage *page, const gchar *color_in)
Update the color on the page tabs in the main window.
The class data structure for a content plugin.
void qof_query_destroy(QofQuery *query)
Frees the resources associate with a Query object.
gint QofEventId
Define the type of events allowed.
void gnc_plugin_page_register_filter_end_cb(GtkWidget *radio, GncPluginPageRegister *page)
This function is called when one of the end date radio buttons is selected.
void gnc_plugin_page_set_use_new_window(GncPluginPage *page, gboolean use_new)
Set the "use new window" setting associated with this page.
CursorClass
Types of cursors.
GAction * gnc_main_window_find_action(GncMainWindow *window, const gchar *action_name)
Find the GAction in the main window.
#define GUID_ENCODING_LENGTH
Number of characters needed to encode a guid as a string not including the null terminator.
Transaction * gnc_plugin_page_register_get_current_txn(GncPluginPageRegister *page)
Get the currently selected transaction in this register page.
gboolean gnc_split_register_changed(SplitRegister *reg)
Returns TRUE if the register has changed cells.
void xaccTransScrubImbalance(Transaction *trans, Account *root, Account *account)
Correct transaction imbalances.
void gnc_plugin_page_disconnect_page_changed(GncPluginPage *page)
Disconnect the page_changed_id signal callback.
gint gnc_prefs_get_enum(const gchar *group, const gchar *pref_name)
Get an enum value from the preferences backend.
gboolean gncScrubBusinessSplit(Split *split)
The gncScrubBusinessSplit() function will fix all issues found with the given split.
void gnc_plugin_page_register_filter_start_cb(GtkWidget *radio, GncPluginPageRegister *page)
This function is called when one of the start date radio buttons is selected.
void qof_query_set_book(QofQuery *query, QofBook *book)
Set the book to be searched.
gboolean gnc_plugin_page_has_book(GncPluginPage *page, QofBook *book)
Query a page to see if it has a reference to a given book.
void(* window_changed)(GncPluginPage *plugin_page, GtkWidget *window)
Perform plugin specific actions when a page is added to a window (or has been removed from one window...
gboolean gnc_main_window_popup_menu_cb(GtkWidget *widget, GncPluginPage *page)
Callback function invoked when the user requests that Gnucash popup the contextual menu via the keybo...
time64 gnc_time64_get_day_start(time64 time_val)
The gnc_time64_get_day_start() routine will take the given time in seconds and adjust it to the first...
void gnc_plugin_page_register_filter_response_cb(GtkDialog *dialog, gint response, GncPluginPageRegister *plugin_page)
This function is called when the "Filter By…" dialog is closed.
const gchar * plugin_name
The textual name of this plugin.
void gnc_split_register_config(SplitRegister *reg, SplitRegisterType newtype, SplitRegisterStyle newstyle, gboolean use_double_line)
Sets a split register's type, style or line use.
gchar * gnc_list_formatter(GList *strings)
This function takes a GList of char*, and uses locale-sensitive list formatter.
void qof_event_unregister_handler(gint handler_id)
Unregister an event handler.
GtkWidget *(* create_widget)(GncPluginPage *plugin_page)
Function called to create the display widget for a particular type of plugin.
time64 gnc_time64_get_today_start(void)
The gnc_time64_get_today_start() routine returns a time64 value corresponding to the first second of ...
Account * gnc_account_lookup_by_full_name(const Account *any_acc, const gchar *name)
The gnc_account_lookup_full_name() subroutine works like gnc_account_lookup_by_name, but uses fully-qualified names using the given separator.
void gnc_split_register_void_current_trans(SplitRegister *reg, const char *reason)
Voids the transaction associated with the current cursor, if non-NULL.
time64 gnc_mktime(struct tm *time)
calculate seconds from the epoch given a time struct
void xaccTransScrubOrphans(Transaction *trans)
The xaccTransScrubOrphans() method scrubs only the splits in the given transaction.
Gnome specific utility functions.
Public declarations of GnucashRegister class.
gboolean xaccAccountIsAPARType(GNCAccountType t)
Convenience function to check if the account is a valid business account type (meaning an Accounts Pa...
gnc_numeric gnc_numeric_abs(gnc_numeric a)
Returns a newly created gnc_numeric that is the absolute value of the given gnc_numeric value...
Additional event handling code.
#define xaccSplitGetGUID(X)
struct tm * gnc_localtime(const time64 *secs)
fill out a time struct from a 64-bit time value.
gboolean(* finish_pending)(GncPluginPage *plugin_page)
This function vector is called to finish any outstanding activities.
All type declarations for the whole Gnucash engine.
#define CREC
The Split has been cleared.
void(* save_page)(GncPluginPage *page, GKeyFile *file, const gchar *group)
Save enough information about this page so that it can be recreated next time the user starts gnucash...
gnc_commodity * gnc_account_get_currency_or_parent(const Account *account)
Returns a gnc_commodity that is a currency, suitable for being a Transaction's currency.
void gnc_plugin_page_register_filter_status_one_cb(GtkToggleButton *button, GncPluginPageRegister *page)
This function is called whenever one of the status entries is checked or unchecked.
Generic api to store and retrieve preferences.
Split * gnc_split_register_duplicate_current(SplitRegister *reg)
Duplicates either the current transaction or the current split depending on the register mode and cur...
void gnc_plugin_page_register_filter_status_clear_all_cb(GtkButton *button, GncPluginPageRegister *plugin_page)
This function is called whenever the "clear all" status button is clicked.
void gnc_add_accelerator_keys_for_menu(GtkWidget *menu, GMenuModel *model, GtkAccelGroup *accel_group)
Add accelerator keys for menu item widgets.
Query * gnc_plugin_page_register_get_query(GncPluginPage *plugin_page)
This function is called to get the query associated with this plugin page.
void gnc_split_register_cancel_cursor_trans_changes(SplitRegister *reg)
Cancels any changes made to the current pending transaction, reloads the table from the engine...
GncInvoice * gncInvoiceGetInvoiceFromLot(GNCLot *lot)
Given a LOT, find and return the Invoice attached to the lot.
void gnc_split_register_paste_current(SplitRegister *reg)
Pastes a previous copied entity onto the current entity, but only if the copied and current entity ha...
Transaction * xaccTransReverse(Transaction *orig)
xaccTransReverse creates a Transaction that reverses the given transaction by inverting all the numer...
GList * qof_query_run(QofQuery *query)
Perform the query, return the results.
void main_window_update_page_set_read_only_icon(GncPluginPage *page, gboolean read_only)
Update the icon on the page tabs in the main window.
gboolean qof_book_is_readonly(const QofBook *book)
Return whether the book is read only.
void gnc_plugin_page_set_page_color(GncPluginPage *page, const char *color)
Set the color of this page.
GncPluginPage * gnc_plugin_page_register_new_gl(void)
Create a new "register" plugin page containing a general journal.
gnc_numeric xaccSplitGetValue(const Split *split)
Returns the value of this split in the transaction's commodity.
GNCLedgerDisplay * gnc_ledger_display_simple(Account *account)
opens up a register window to display a single account
gboolean gncScrubBusinessLot(GNCLot *lot)
The gncScrubBusinessLot() function makes sure that the indicated lot has all the correct properties r...
Account * xaccSplitGetAccount(const Split *split)
Returns the account of this split, which was set through xaccAccountInsertSplit().
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
Get the account's commodity.
const GncGUID * guid_null(void)
Returns a GncGUID which is guaranteed to never reference any entity.
void gnc_plugin_page_register_filter_status_select_all_cb(GtkButton *button, GncPluginPageRegister *plugin_page)
This function is called whenever the "select all" status button is clicked.
time64 gnc_time64_get_today_end(void)
The gnc_time64_get_today_end() routine returns a time64 value corresponding to the last second of tod...
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
Get a boolean value from the preferences backend.
void gnc_plugin_page_set_menu_popup_qualifier(GncPluginPage *page, const char *menu_qualifier)
Set a qualifier string for this page.
void gnc_plugin_page_inserted_cb(GncPluginPage *page, gpointer user_data)
Set up the page_changed callback for when the current page is changed.
void gnc_main_window_close_page(GncPluginPage *page)
Remove a data plugin page from a window and display the previous page.
Transaction * xaccTransGetReversedBy(const Transaction *trans)
Returns the transaction that reversed the given transaction.
Split * xaccSplitGetOtherSplit(const Split *split)
The xaccSplitGetOtherSplit() is a convenience routine that returns the other of a pair of splits...
#define LEAVE(format, args...)
Print a function exit debugging message.
void gnc_plugin_page_set_page_name(GncPluginPage *page, const char *name)
Set the name of this page.
time64 gnc_time(time64 *tbuf)
get the current time
Account * gnc_plugin_page_register_get_account(GncPluginPageRegister *page)
Get the Account associated with this register page.
void gnc_plugin_page_add_book(GncPluginPage *page, QofBook *book)
Add a book reference to the specified page.
GNCNumericErrorCode gnc_numeric_check(gnc_numeric a)
Check for error signal in value.
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
void gnc_plugin_page_register_sort_order_save_cb(GtkToggleButton *button, GncPluginPageRegister *page)
This function is called whenever the save sort order is checked or unchecked which allows saving of t...
gboolean gnc_split_register_handle_exchange(SplitRegister *reg, gboolean force_dialog)
If needed display the transfer dialog to get a price/exchange rate and adjust the price cell accordin...
void gnc_plugin_page_register_clear_current_filter(GncPluginPage *plugin_page)
This function clears the registers current filter.
void xaccTransSetDateEnteredSecs(Transaction *trans, time64 secs)
Modify the date of when the transaction was entered.
GNCLedgerDisplay * gnc_ledger_display_gl(void)
opens up a general ledger window
time64 gnc_time64_get_day_end(time64 time_val)
The gnc_time64_get_day_end() routine will take the given time in seconds and adjust it to the last se...
SplitRegister * gnc_ledger_display_get_split_register(GNCLedgerDisplay *ld)
return the split register associated with a ledger display
const char * xaccAccountGetName(const Account *acc)
Get the account's name.
The type used to store guids in C.
GNCSplitReg * gnc_plugin_page_register_get_gsr(GncPluginPage *plugin_page)
Get the GNCSplitReg data structure associated with this register page.
void gnc_plugin_page_register_sort_order_reverse_cb(GtkToggleButton *button, GncPluginPageRegister *page)
This function is called whenever the reverse sort order is checked or unchecked which allows reversin...
void main_window_update_page_name(GncPluginPage *page, const gchar *name_in)
Update the name of the page in the main window.
gboolean gnc_menubar_model_update_item(GMenuModel *menu_model, const gchar *action_name, const gchar *target, const gchar *label, const gchar *accel_name, const gchar *tooltip)
Update the GMenuModel item based on the action name by copying existing item, removing it and inserti...
GAction * gnc_plugin_page_get_action(GncPluginPage *page, const gchar *name)
Retrieve a GAction object associated with this page.
Split * gnc_split_register_get_current_split(SplitRegister *reg)
Returns the split at which the cursor is currently located.
void gnc_plugin_page_register_set_options(GncPluginPage *plugin_page, gint lines_default, gboolean read_only)
Set various register options on a newly created "register" plugin page.
SplitList * xaccTransGetSplitList(const Transaction *trans)
The xaccTransGetSplitList() method returns a GList of the splits in a transaction.
GtkWidget * summarybar
The summary bar widget (if any) that is associated with this plugin.
SplitRegisterStyle
Register styles.
GNCLot * xaccSplitGetLot(const Split *split)
Returns the pointer to the debited/credited Lot where this split belongs to, or NULL if it doesn't be...
GList * qof_query_get_books(QofQuery *q)
Return the list of books we're using.
void gnc_prefs_remove_cb_by_func(const gchar *group, const gchar *pref_name, gpointer func, gpointer user_data)
Remove a function that was registered for a callback when the given preference changed.
void gnc_split_register_copy_current(SplitRegister *reg)
Makes a copy of the current entity, either a split or a transaction, so that it can be pasted later...
Utility functions for file access.
Account * xaccAccountLookup(const GncGUID *guid, QofBook *book)
The xaccAccountLookup() subroutine will return the account associated with the given id...