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 Invoice") 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 bill, invoice, or voucher") 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 {
"ActionsAutoClearAction", N_ (
"Auto-clear") },
405 {
"LinkTransactionAction", N_ (
"Manage Document Link") },
406 {
"LinkedTransactionOpenAction", N_ (
"Open Linked Document") },
407 {
"JumpLinkedInvoiceAction", N_ (
"Invoice") },
408 {
"ActionsStockAssistantAction", N_ (
"Stock Assistant") },
414 const char* action_name;
421 {
"filter_status_reconciled", CLEARED_RECONCILED, NULL },
422 {
"filter_status_cleared", CLEARED_CLEARED, NULL },
423 {
"filter_status_voided", CLEARED_VOIDED, NULL },
424 {
"filter_status_frozen", CLEARED_FROZEN, NULL },
425 {
"filter_status_unreconciled", CLEARED_NO, NULL },
429 #define CLEARED_VALUE "cleared_value" 430 #define DEFAULT_FILTER "0x001f" 431 #define DEFAULT_SORT_ORDER "BY_STANDARD" 439 GNCLedgerDisplay* ledger;
444 gint event_handler_id;
445 gint component_manager_id;
451 gboolean enable_refresh;
458 GtkWidget* num_radio;
459 GtkWidget* act_radio;
460 SortType original_sort_type;
461 gboolean original_save_order;
463 gboolean reverse_order;
464 gboolean original_reverse_order;
471 GtkWidget* start_date_choose;
472 GtkWidget* start_date_today;
473 GtkWidget* start_date;
474 GtkWidget* end_date_choose;
475 GtkWidget* end_date_today;
478 cleared_match_t original_cleared_match;
479 cleared_match_t cleared_match;
480 time64 original_start_time;
486 gboolean original_save_filter;
487 gboolean save_filter;
492 GNC_TYPE_PLUGIN_PAGE)
494 #define GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(o) \ 495 ((GncPluginPageRegisterPrivate*)gnc_plugin_page_register_get_instance_private((GncPluginPageRegister*)o)) 502 gnc_plugin_page_register_new_common (GNCLedgerDisplay* ledger)
515 if (!gnc_features_check_used (gnc_get_current_book(), GNC_FEATURE_REG_SORT_FILTER))
519 if (!gnc_using_equity_type_opening_balance_account (gnc_get_current_book()))
520 gnc_set_use_equity_type_opening_balance_account (gnc_get_current_book());
523 gsr = GNC_SPLIT_REG(gnc_ledger_display_get_user_data (ledger));
527 for (; item; item = g_list_next (item))
530 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (register_page);
531 if (priv->gsr == gsr)
532 return GNC_PLUGIN_PAGE (register_page);
536 register_page = GNC_PLUGIN_PAGE_REGISTER(g_object_new (GNC_TYPE_PLUGIN_PAGE_REGISTER,
nullptr));
537 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (register_page);
538 priv->ledger = ledger;
541 plugin_page = GNC_PLUGIN_PAGE (register_page);
542 label = gnc_plugin_page_register_get_tab_name (plugin_page);
546 label_color = gnc_plugin_page_register_get_tab_color (plugin_page);
548 g_free (label_color);
550 label = gnc_plugin_page_register_get_long_name (plugin_page);
556 for (item = book_list; item; item = g_list_next (item))
560 priv->component_manager_id = 0;
565 gnc_plug_page_register_check_commodity (
Account* account,
void* usr_data)
568 gnc_commodity* com0 = (gnc_commodity*) usr_data;
576 GNCLedgerDisplay* ledger;
582 ENTER (
"account=%p, subaccounts=%s", account,
583 subaccounts ?
"TRUE" :
"FALSE");
587 gnc_plug_page_register_check_commodity,
588 static_cast<gpointer>(com0)));
595 page = gnc_plugin_page_register_new_common (ledger);
596 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
606 GNCLedgerDisplay* ledger;
609 return gnc_plugin_page_register_new_common (ledger);
615 return gnc_plugin_page_register_new_common (ledger);
621 GObjectClass* object_class = G_OBJECT_CLASS (klass);
624 object_class->finalize = gnc_plugin_page_register_finalize;
626 gnc_plugin_class->
tab_icon = GNC_ICON_ACCOUNT;
627 gnc_plugin_class->
plugin_name = GNC_PLUGIN_PAGE_REGISTER_NAME;
628 gnc_plugin_class->
create_widget = gnc_plugin_page_register_create_widget;
629 gnc_plugin_class->
destroy_widget = gnc_plugin_page_register_destroy_widget;
630 gnc_plugin_class->
window_changed = gnc_plugin_page_register_window_changed;
631 gnc_plugin_class->
focus_page = gnc_plugin_page_register_focus;
632 gnc_plugin_class->
save_page = gnc_plugin_page_register_save_page;
633 gnc_plugin_class->
recreate_page = gnc_plugin_page_register_recreate_page;
635 gnc_plugin_page_register_update_edit_menu;
636 gnc_plugin_class->
finish_pending = gnc_plugin_page_register_finish_pending;
639 gnc_ui_register_account_destroy_callback (gppr_account_destroy_cb);
647 GSimpleActionGroup *simple_action_group;
650 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
653 parent = GNC_PLUGIN_PAGE (plugin_page);
656 g_object_set (G_OBJECT (plugin_page),
657 "page-name", _ (
"General Journal"),
658 "ui-description",
"gnc-plugin-page-register.ui",
659 "use-new-window", use_new,
664 g_action_map_add_action_entries (G_ACTION_MAP(simple_action_group),
665 gnc_plugin_page_register_actions,
666 gnc_plugin_page_register_n_actions,
669 priv->lines_default = DEFAULT_LINES_AMOUNT;
670 priv->read_only = FALSE;
671 priv->fd.cleared_match = CLEARED_ALL;
673 priv->enable_refresh = TRUE;
674 priv->search_query = NULL;
675 priv->filter_query = NULL;
679 gnc_plugin_page_register_finalize (GObject*
object)
681 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (
object));
683 ENTER (
"object %p",
object);
685 G_OBJECT_CLASS (gnc_plugin_page_register_parent_class)->finalize (
object);
693 GNCLedgerDisplayType ledger_type;
696 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
697 ledger_type = gnc_ledger_display_type (priv->ledger);
700 if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
711 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
721 gnc_plugin_page_register_focus_widget (
GncPluginPage* register_plugin_page)
723 if (GNC_IS_PLUGIN_PAGE_REGISTER (register_plugin_page))
725 GncWindow* gnc_window = GNC_WINDOW(GNC_PLUGIN_PAGE(register_plugin_page)->window);
728 if (GNC_IS_MAIN_WINDOW(GNC_PLUGIN_PAGE(register_plugin_page)->window))
732 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), TRUE);
735 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), FALSE);
738 register_plugin_page,
739 gnc_plugin_load_ui_items);
743 GtkWidget *toolbar = gnc_window_get_toolbar (gnc_window);
744 GtkWidget *menubar = gnc_window_get_menubar (gnc_window);
745 GMenuModel *menubar_model = gnc_window_get_menubar_model (gnc_window);
746 GtkWidget *statusbar = gnc_window_get_statusbar (gnc_window);
756 gnc_plugin_page_register_ui_update (NULL, GNC_PLUGIN_PAGE_REGISTER(register_plugin_page));
758 gnc_split_reg_focus_on_sheet (gsr);
764 static const char* readonly_inactive_actions[] =
768 "CutTransactionAction",
769 "PasteTransactionAction",
770 "DuplicateTransactionAction",
771 "DeleteTransactionAction",
772 "RemoveTransactionSplitsAction",
773 "RecordTransactionAction",
774 "CancelTransactionAction",
775 "UnvoidTransactionAction",
776 "VoidTransactionAction",
777 "ReverseTransactionAction",
778 "ActionsTransferAction",
779 "ActionsReconcileAction",
780 "ActionsStockSplitAction",
781 "ScheduleTransactionAction",
783 "ScrubCurrentAction",
784 "LinkTransactionAction",
790 static const char* tran_vs_split_actions[] =
792 "CutTransactionAction",
793 "CopyTransactionAction",
794 "PasteTransactionAction",
795 "DuplicateTransactionAction",
796 "DeleteTransactionAction",
801 static const char* tran_action_labels[] =
803 CUT_TRANSACTION_LABEL,
804 COPY_TRANSACTION_LABEL,
805 PASTE_TRANSACTION_LABEL,
806 DUPLICATE_TRANSACTION_LABEL,
807 DELETE_TRANSACTION_LABEL,
808 LINK_TRANSACTION_LABEL,
809 LINK_TRANSACTION_OPEN_LABEL,
810 JUMP_LINKED_INVOICE_LABEL,
815 static const char* tran_action_tips[] =
818 COPY_TRANSACTION_TIP,
819 PASTE_TRANSACTION_TIP,
820 DUPLICATE_TRANSACTION_TIP,
821 DELETE_TRANSACTION_TIP,
822 LINK_TRANSACTION_TIP,
823 LINK_TRANSACTION_OPEN_TIP,
824 JUMP_LINKED_INVOICE_TIP,
829 static const char* split_action_labels[] =
834 DUPLICATE_SPLIT_LABEL,
840 static const char* split_action_tips[] =
850 static std::vector<GncInvoice*>
851 invoices_from_transaction (
const Transaction* trans)
853 std::vector<GncInvoice*> rv;
855 g_return_val_if_fail (GNC_IS_TRANSACTION (trans), rv);
859 auto split = GNC_SPLIT(node->data);
863 auto inv = invoice_from_split (split);
871 gnc_plugin_page_register_ui_update (gpointer various,
877 GNCLedgerDisplayType ledger_type;
878 gboolean expanded, voided, read_only = FALSE, read_only_reg = FALSE;
883 GncWindow* gnc_window = GNC_WINDOW(GNC_PLUGIN_PAGE(page)->window);
886 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
892 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), reg->style == REG_STYLE_LEDGER);
895 ledger_type = gnc_ledger_display_type (priv->ledger);
898 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), ledger_type != LD_GL);
899 g_action_change_state (G_ACTION(action), g_variant_new_int32 (reg->style));
903 g_action_change_state (G_ACTION(action), g_variant_new_boolean (reg->use_double_line));
907 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), reg->style == REG_STYLE_LEDGER);
909 g_signal_handlers_block_by_func (action, (gpointer)gnc_plugin_page_register_cmd_expand_transaction, page);
910 g_action_change_state (G_ACTION(action), g_variant_new_boolean (expanded));
911 g_signal_handlers_unblock_by_func (action, (gpointer)gnc_plugin_page_register_cmd_expand_transaction, page);
916 if (GNC_IS_MAIN_WINDOW(GNC_PLUGIN_PAGE(page)->window))
920 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), TRUE);
924 actions_requiring_priced_account,
932 gnc_split_reg_get_read_only (priv->gsr))
933 read_only_reg = TRUE;
936 actions_requiring_account,
937 !read_only_reg && account != NULL);
940 actions_requiring_priced_account,
946 if (cursor_class == CURSOR_CLASS_SPLIT)
948 if (GNC_IS_MAIN_WINDOW(GNC_PLUGIN_PAGE(page)->window))
955 if (GNC_IS_MAIN_WINDOW(GNC_PLUGIN_PAGE(page)->window))
966 for (iter = readonly_inactive_actions; *iter; ++iter)
970 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), TRUE);
980 "CutTransactionAction");
981 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), !read_only & !voided);
984 "PasteTransactionAction");
985 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), !read_only & !voided);
988 "DeleteTransactionAction");
989 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), !read_only & !voided);
991 if (cursor_class == CURSOR_CLASS_SPLIT)
994 "DuplicateTransactionAction");
995 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), !read_only & !voided);
999 "RemoveTransactionSplitsAction");
1000 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), !read_only & !voided);
1007 "VoidTransactionAction");
1008 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), !voided);
1014 "UnvoidTransactionAction");
1015 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), voided);
1020 "LinkedTransactionOpenAction");
1024 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), (uri ? TRUE:FALSE));
1032 "JumpLinkedInvoiceAction");
1035 auto invoices = invoices_from_transaction (trans);
1036 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), !invoices.empty());
1039 gnc_plugin_business_split_reg_ui_update (GNC_PLUGIN_PAGE(page));
1045 for (iter = readonly_inactive_actions; *iter; ++iter)
1049 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), FALSE);
1056 GncMenuModelSearch *gsm = g_new0 (GncMenuModelSearch, 1);
1057 gboolean found = FALSE;
1058 const char** iter, **label_iter, **tooltip_iter;
1059 gboolean curr_label_trans = FALSE;
1060 iter = tran_vs_split_actions;
1061 label_iter = tran_action_labels;
1063 gsm->search_action_label = NULL;
1064 gsm->search_action_name = *iter;
1065 gsm->search_action_target = NULL;
1069 PINFO(
"Test for action '%s', found is %d, iter label is '%s'", *iter, found, _(*label_iter));
1077 if (g_strcmp0 (gsm->search_action_label, _(*label_iter)) == 0)
1078 curr_label_trans = TRUE;
1082 if ((cursor_class == CURSOR_CLASS_SPLIT) && curr_label_trans)
1084 gboolean found = FALSE;
1085 label_iter = split_action_labels;
1086 tooltip_iter = split_action_tips;
1087 for (iter = tran_vs_split_actions; *iter; ++iter)
1091 *iter, NULL, _(*label_iter), NULL, _(*tooltip_iter));
1093 PINFO(
"split model_item action '%s', found is %d, iter label is '%s'",
1094 *iter, found, _(*label_iter));
1100 else if ((cursor_class == CURSOR_CLASS_TRANS) && !curr_label_trans)
1102 gboolean found = FALSE;
1103 label_iter = tran_action_labels;
1104 tooltip_iter = tran_action_tips;
1105 for (iter = tran_vs_split_actions; *iter; ++iter)
1109 *iter, NULL, _(*label_iter), NULL, _(*tooltip_iter));
1111 PINFO(
"trans model_item action '%s', found is %d, iter label is '%s'",
1112 *iter, found, _(*label_iter));
1120 gnc_window_get_menubar_model (gnc_window),
1121 gnc_window_get_statusbar (gnc_window));
1125 gnc_window_get_menubar_model (gnc_window),
1126 gnc_window_get_accel_group (gnc_window));
1134 GSimpleActionGroup *simple_action_group;
1138 GNCLedgerDisplayType ledger_type;
1141 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
1146 g_return_if_fail (G_IS_SIMPLE_ACTION_GROUP(simple_action_group));
1149 is_readwrite && account != NULL);
1152 ledger_type = gnc_ledger_display_type (priv->ledger);
1154 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), ledger_type == LD_SINGLE);
1158 g_signal_handlers_block_by_func (action,
1159 (gpointer)gnc_plugin_page_register_cmd_style_changed, page);
1160 g_action_change_state (G_ACTION(action), g_variant_new_int32 (reg->style));
1161 g_signal_handlers_unblock_by_func (action,
1162 (gpointer)gnc_plugin_page_register_cmd_style_changed, page);
1166 g_signal_handlers_block_by_func (action,
1167 (gpointer)gnc_plugin_page_register_cmd_style_double_line, page);
1168 g_action_change_state (G_ACTION(action), g_variant_new_boolean (reg->use_double_line));
1169 g_signal_handlers_unblock_by_func (action,
1170 (gpointer)gnc_plugin_page_register_cmd_style_double_line, page);
1176 get_filter_default_num_of_days (GNCLedgerDisplayType ledger_type)
1178 if (ledger_type == LD_GL)
1179 return DEFAULT_FILTER_NUM_DAYS_GL;
1191 gboolean on_current_page)
1197 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page));
1199 page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
1200 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
1204 if (on_current_page)
1206 priv->page_focus = TRUE;
1210 GNC_PLUGIN_PAGE_CLASS (gnc_plugin_page_register_parent_class)->focus_page (plugin_page, TRUE);
1213 priv->page_focus = FALSE;
1216 gnc_split_reg_set_sheet_focus (gsr, priv->page_focus);
1222 gnc_plugin_page_register_create_widget (
GncPluginPage* plugin_page)
1226 GNCLedgerDisplayType ledger_type;
1227 GncWindow* gnc_window;
1233 int filter_changed = 0;
1234 gboolean create_new_page = FALSE;
1236 ENTER (
"page %p", plugin_page);
1237 page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
1238 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
1240 if (priv->widget != NULL)
1242 LEAVE (
"existing widget %p", priv->widget);
1243 return priv->widget;
1246 priv->widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1247 gtk_box_set_homogeneous (GTK_BOX (priv->widget), FALSE);
1248 gtk_widget_show (priv->widget);
1251 gtk_widget_set_name (GTK_WIDGET(priv->widget),
"gnc-id-register-page");
1253 numRows = priv->lines_default;
1254 numRows = MIN (numRows, DEFAULT_LINES_AMOUNT);
1256 gnc_window = GNC_WINDOW(GNC_PLUGIN_PAGE(page)->window);
1257 gsr = gnc_split_reg_new (priv->ledger,
1258 gnc_window_get_gtk_window (gnc_window),
1259 numRows, priv->read_only);
1260 priv->gsr = (GNCSplitReg *)gsr;
1262 gtk_widget_show (gsr);
1263 gtk_box_pack_start (GTK_BOX (priv->widget), gsr, TRUE, TRUE, 0);
1265 g_signal_connect (G_OBJECT (gsr),
"help-changed",
1266 G_CALLBACK (gnc_plugin_page_help_changed_cb),
1269 g_signal_connect (G_OBJECT (gsr),
"show-popup-menu",
1270 G_CALLBACK (gnc_plugin_page_popup_menu_cb),
1275 reg->use_double_line);
1277 gnc_plugin_page_register_ui_initial_state (page);
1278 gnc_plugin_page_register_ui_update (NULL, page);
1280 ledger_type = gnc_ledger_display_type (priv->ledger);
1285 guint filtersize = 0;
1287 priv->sd.save_order = FALSE;
1288 order = gnc_plugin_page_register_get_sort_order (plugin_page);
1290 PINFO (
"Loaded Sort order is %s", order);
1292 gnc_split_reg_set_sort_type (priv->gsr, SortTypefromString (order));
1294 if (order && (g_strcmp0 (order, DEFAULT_SORT_ORDER) != 0))
1295 priv->sd.save_order = TRUE;
1297 priv->sd.original_save_order = priv->sd.save_order;
1300 priv->sd.reverse_order = gnc_plugin_page_register_get_sort_reversed (
1302 gnc_split_reg_set_sort_reversed (priv->gsr, priv->sd.reverse_order, FALSE);
1303 if (priv->sd.reverse_order)
1304 priv->sd.save_order = TRUE;
1306 priv->sd.original_reverse_order = priv->sd.reverse_order;
1309 priv->fd.save_filter = FALSE;
1311 filter_str = gnc_plugin_page_register_get_filter (plugin_page);
1312 filter = g_strsplit (filter_str,
",", -1);
1313 filtersize = g_strv_length (filter);
1314 g_free (filter_str);
1316 PINFO (
"Loaded Filter Status is %s", filter[0]);
1318 priv->fd.cleared_match = (cleared_match_t)g_ascii_strtoll (filter[0], NULL, 16);
1320 if (filtersize > 0 && (g_strcmp0 (filter[0], DEFAULT_FILTER) != 0))
1321 filter_changed = filter_changed + 1;
1323 if (filtersize > 1 && (g_strcmp0 (filter[1],
"0") != 0))
1325 PINFO (
"Loaded Filter Start Date is %s", filter[1]);
1327 priv->fd.start_time = gnc_plugin_page_register_filter_dmy2time (filter[1]);
1329 filter_changed = filter_changed + 1;
1332 if (filtersize > 2 && (g_strcmp0 (filter[2],
"0") != 0))
1334 PINFO (
"Loaded Filter End Date is %s", filter[2]);
1336 priv->fd.end_time = gnc_plugin_page_register_filter_dmy2time (filter[2]);
1338 filter_changed = filter_changed + 1;
1342 priv->fd.days = (gint)g_ascii_strtoll (
1343 get_filter_default_num_of_days (ledger_type), NULL, 10);
1345 if (filtersize > 3 &&
1346 (g_strcmp0 (filter[3], get_filter_default_num_of_days (ledger_type)) != 0))
1348 PINFO (
"Loaded Filter Days is %s", filter[3]);
1350 priv->fd.days = (gint)g_ascii_strtoll (filter[3], NULL, 10);
1351 filter_changed = filter_changed + 1;
1354 if (filter_changed != 0)
1355 priv->fd.save_filter = TRUE;
1357 priv->fd.original_save_filter = priv->fd.save_filter;
1358 g_strfreev (filter);
1361 if (ledger_type == LD_GL)
1363 time64 start_time = 0, end_time = 0;
1365 if (reg->type == GENERAL_JOURNAL)
1367 start_time = priv->fd.start_time;
1368 end_time = priv->fd.end_time;
1373 priv->fd.cleared_match = (cleared_match_t)g_ascii_strtoll (DEFAULT_FILTER, NULL, 16);
1374 gnc_split_reg_set_sort_type (priv->gsr,
1375 SortTypefromString (DEFAULT_SORT_ORDER));
1376 priv->sd.reverse_order = FALSE;
1377 priv->fd.save_filter = FALSE;
1378 priv->sd.save_order = FALSE;
1381 priv->fd.original_days = priv->fd.days;
1383 priv->fd.original_start_time = start_time;
1384 priv->fd.start_time = start_time;
1385 priv->fd.original_end_time = end_time;
1386 priv->fd.end_time = end_time;
1391 if (priv->enable_refresh == TRUE)
1393 create_new_page = TRUE;
1394 priv->enable_refresh = FALSE;
1398 gnc_ppr_update_status_query (page);
1399 gnc_ppr_update_date_query (page);
1402 if (create_new_page)
1404 priv->enable_refresh = TRUE;
1409 gnc_plugin_page_register_set_filter_tooltip (page);
1411 plugin_page->
summarybar = gsr_create_summary_bar (priv->gsr);
1414 gtk_widget_show_all (plugin_page->
summarybar);
1415 gtk_box_pack_start (GTK_BOX (priv->widget), plugin_page->
summarybar,
1418 gnc_plugin_page_register_summarybar_position_changed (NULL, NULL, page);
1420 GNC_PREF_SUMMARYBAR_POSITION_TOP,
1421 (gpointer)gnc_plugin_page_register_summarybar_position_changed,
1424 GNC_PREF_SUMMARYBAR_POSITION_BOTTOM,
1425 (gpointer)gnc_plugin_page_register_summarybar_position_changed,
1431 priv->component_manager_id =
1432 gnc_register_gui_component (GNC_PLUGIN_PAGE_REGISTER_NAME,
1433 gnc_plugin_page_register_refresh_cb,
1434 gnc_plugin_page_register_close_cb,
1436 gnc_gui_component_set_session (priv->component_manager_id,
1437 gnc_get_current_session());
1440 gnc_gui_component_watch_entity (
1442 QOF_EVENT_DESTROY | QOF_EVENT_MODIFY);
1444 gnc_split_reg_set_moved_cb
1445 (priv->gsr, (GFunc)gnc_plugin_page_register_ui_update, page);
1447 g_signal_connect (G_OBJECT (plugin_page),
"inserted",
1453 return priv->widget;
1457 gnc_plugin_page_register_destroy_widget (
GncPluginPage* plugin_page)
1462 ENTER (
"page %p", plugin_page);
1463 page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
1464 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
1467 GNC_PREF_SUMMARYBAR_POSITION_TOP,
1468 (gpointer)gnc_plugin_page_register_summarybar_position_changed,
1471 GNC_PREF_SUMMARYBAR_POSITION_BOTTOM,
1472 (gpointer)gnc_plugin_page_register_summarybar_position_changed,
1479 g_idle_remove_by_data (GNC_PLUGIN_PAGE_REGISTER (plugin_page));
1481 if (priv->widget == NULL)
1484 if (priv->component_manager_id)
1486 gnc_unregister_gui_component (priv->component_manager_id);
1487 priv->component_manager_id = 0;
1490 if (priv->event_handler_id)
1493 priv->event_handler_id = 0;
1496 if (priv->sd.dialog)
1498 gtk_widget_destroy (priv->sd.dialog);
1499 memset (&priv->sd, 0, sizeof (priv->sd));
1502 if (priv->fd.dialog)
1504 gtk_widget_destroy (priv->fd.dialog);
1505 memset (&priv->fd, 0, sizeof (priv->fd));
1511 gtk_widget_hide (priv->widget);
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);
3657 gnucash_register_cut_clipboard (priv->gsr->reg);
3663 gnc_plugin_page_register_cmd_copy (GSimpleAction *simple,
3667 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3670 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3672 ENTER (
"(action %p, page %p)", simple, page);
3673 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3674 gnucash_register_copy_clipboard (priv->gsr->reg);
3680 gnc_plugin_page_register_cmd_paste (GSimpleAction *simple,
3684 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3687 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3689 ENTER (
"(action %p, page %p)", simple, page);
3690 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3691 gnucash_register_paste_clipboard (priv->gsr->reg);
3697 gnc_plugin_page_register_cmd_edit_account (GSimpleAction *simple,
3701 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3704 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3706 ENTER (
"(action %p, page %p)", simple, page);
3715 gnc_plugin_page_register_cmd_find_account (GSimpleAction *simple,
3719 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3722 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3725 gnc_find_account_dialog (window, NULL);
3730 gnc_plugin_page_register_cmd_find_transactions (GSimpleAction *simple,
3734 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3738 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3740 ENTER (
"(action %p, page %p)", simple, page);
3741 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3743 gnc_ui_find_transactions_dialog_create (window, priv->ledger);
3749 gnc_plugin_page_register_cmd_edit_tax_options (GSimpleAction *simple,
3753 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3757 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3759 ENTER (
"(action %p, page %p)", simple, page);
3762 gnc_tax_info_dialog (window, account);
3767 gnc_plugin_page_register_cmd_cut_transaction (GSimpleAction *simple,
3771 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3774 ENTER (
"(action %p, page %p)", simple, page);
3776 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3778 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3779 gsr_default_cut_txn_handler (priv->gsr, NULL);
3785 gnc_plugin_page_register_cmd_copy_transaction (GSimpleAction *simple,
3789 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3793 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3795 ENTER (
"(action %p, page %p)", simple, page);
3796 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3804 gnc_plugin_page_register_cmd_paste_transaction (GSimpleAction *simple,
3808 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3812 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3814 ENTER (
"(action %p, page %p)", simple, page);
3815 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3823 gnc_plugin_page_register_cmd_void_transaction (GSimpleAction *simple,
3827 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3829 GtkWidget* dialog, *entry;
3832 GtkBuilder* builder;
3837 ENTER (
"(action %p, page %p)", simple, page);
3839 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3842 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3852 gnc_error_dialog (window,
"%s",
3853 _ (
"You cannot void a transaction with reconciled or cleared splits."));
3859 gnc_error_dialog (window,
3860 _ (
"This transaction is marked read-only with the comment: '%s'"), reason);
3864 if (!gnc_plugin_page_register_finish_pending (GNC_PLUGIN_PAGE (page)))
3867 builder = gtk_builder_new();
3868 gnc_builder_add_from_file (builder,
"gnc-plugin-page-register.glade",
3869 "void_transaction_dialog");
3870 dialog = GTK_WIDGET (gtk_builder_get_object (builder,
3871 "void_transaction_dialog"));
3872 entry = GTK_WIDGET (gtk_builder_get_object (builder,
"reason"));
3874 gtk_window_set_transient_for (GTK_WINDOW (dialog), window);
3876 result = gtk_dialog_run (GTK_DIALOG (dialog));
3877 if (result == GTK_RESPONSE_OK)
3879 reason = gtk_entry_get_text (GTK_ENTRY (entry));
3886 gtk_widget_destroy (dialog);
3887 g_object_unref (G_OBJECT (builder));
3892 gnc_plugin_page_register_cmd_unvoid_transaction (GSimpleAction *simple,
3896 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3901 ENTER (
"(action %p, page %p)", simple, page);
3903 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3905 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3914 static std::optional<time64>
3915 input_date (GtkWidget * parent,
const char *window_title,
const char* title)
3918 if (!gnc_dup_time64_dialog (parent, window_title, title, &rv))
3925 gnc_plugin_page_register_cmd_reverse_transaction (GSimpleAction *simple,
3929 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3933 Transaction* trans, *new_trans;
3938 ENTER (
"(action %p, page %p)", simple, page);
3940 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3942 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3954 LEAVE (
"shouldn't try to reverse the blank transaction...");
3961 const char *rev = _(
"A reversing entry has already been created for this transaction.");
3962 const char *jump = _(
"Jump to the transaction?");
3963 if (!gnc_verify_dialog (GTK_WINDOW (window), TRUE,
"%s\n\n%s", rev, jump))
3965 LEAVE (
"reverse cancelled");
3971 auto date = input_date (window, _(
"Reverse Transaction"), _(
"New Transaction Information"));
3974 LEAVE (
"reverse cancelled");
3978 gnc_suspend_gui_refresh ();
3985 gnc_resume_gui_refresh();
3990 split = xaccTransFindSplitByAccount(new_trans, account);
3993 if (gnc_split_reg_clear_filter_for_split (gsr, split))
3996 gnc_split_reg_jump_to_split (gsr, split);
4004 GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (priv->ledger);
4007 if (ledger_type == LD_SINGLE || ledger_type == LD_SUBACCOUNT)
4013 case GENERAL_JOURNAL:
4018 case PORTFOLIO_LEDGER:
4028 gnc_plugin_page_register_cmd_view_sort_by (GSimpleAction *simple,
4032 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4035 GtkWidget* dialog, *button;
4036 GtkBuilder* builder;
4041 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4042 ENTER (
"(action %p, page %p)", simple, page);
4044 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4045 if (priv->sd.dialog)
4047 gtk_window_present (GTK_WINDOW (priv->sd.dialog));
4048 LEAVE (
"existing dialog");
4054 builder = gtk_builder_new();
4055 gnc_builder_add_from_file (builder,
"gnc-plugin-page-register.glade",
4057 dialog = GTK_WIDGET (gtk_builder_get_object (builder,
"sort_by_dialog"));
4058 priv->sd.dialog = dialog;
4059 gtk_window_set_transient_for (GTK_WINDOW (dialog),
4060 gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window)));
4062 title = g_strdup_printf (_ (
"Sort %s by…"),
4064 gtk_window_set_title (GTK_WINDOW (dialog), title);
4068 sort = gnc_split_reg_get_sort_type (priv->gsr);
4069 name = SortTypeasString (sort);
4070 button = GTK_WIDGET (gtk_builder_get_object (builder, name));
4071 DEBUG (
"current sort %d, button %s(%p)", sort, name, button);
4072 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4073 priv->sd.original_sort_type = sort;
4075 button = GTK_WIDGET (gtk_builder_get_object (builder,
"sort_save"));
4076 if (priv->sd.save_order == TRUE)
4077 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4080 gtk_widget_set_visible (GTK_WIDGET (button),
4081 gnc_plugin_page_register_show_fs_save (page));
4084 button = GTK_WIDGET (gtk_builder_get_object (builder,
"sort_reverse"));
4085 if (priv->sd.reverse_order == TRUE)
4086 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4087 priv->sd.original_reverse_order = priv->sd.reverse_order;
4089 priv->sd.num_radio = GTK_WIDGET (gtk_builder_get_object (builder,
"BY_NUM"));
4090 priv->sd.act_radio = GTK_WIDGET (gtk_builder_get_object (builder,
4094 if (reg && !reg->use_tran_num_for_num_field)
4096 gtk_button_set_label (GTK_BUTTON (priv->sd.num_radio),
4097 _ (
"Transaction Number"));
4098 gtk_button_set_label (GTK_BUTTON (priv->sd.act_radio), _ (
"Number/Action"));
4100 gnc_book_option_register_cb (OPTION_NAME_NUM_FIELD_SOURCE,
4101 (GncBOCb)gnc_plugin_page_register_sort_book_option_changed,
4105 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func,
4109 gtk_widget_show (dialog);
4110 g_object_unref (G_OBJECT (builder));
4115 gnc_plugin_page_register_cmd_view_filter_by (GSimpleAction *simple,
4119 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4121 GtkWidget* dialog, *toggle, *button, *
table, *hbox;
4122 time64 start_time, end_time, time_val;
4123 GtkBuilder* builder;
4124 gboolean sensitive, value;
4129 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4130 ENTER (
"(action %p, page %p)", simple, page);
4132 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4133 if (priv->fd.dialog)
4135 gtk_window_present (GTK_WINDOW (priv->fd.dialog));
4136 LEAVE (
"existing dialog");
4141 builder = gtk_builder_new();
4142 gnc_builder_add_from_file (builder,
"gnc-plugin-page-register.glade",
4144 gnc_builder_add_from_file (builder,
"gnc-plugin-page-register.glade",
4145 "filter_by_dialog");
4146 dialog = GTK_WIDGET (gtk_builder_get_object (builder,
"filter_by_dialog"));
4147 priv->fd.dialog = dialog;
4148 gtk_window_set_transient_for (GTK_WINDOW (dialog),
4149 gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window)));
4152 title = g_strdup_printf (_ (
"Filter %s by…"),
4154 gtk_window_set_title (GTK_WINDOW (dialog), title);
4158 for (i = 0; status_actions[i].action_name; i++)
4160 toggle = GTK_WIDGET (gtk_builder_get_object (builder,
4161 status_actions[i].action_name));
4162 value = priv->fd.cleared_match & status_actions[i].value;
4163 status_actions[i].widget = toggle;
4164 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), value);
4166 priv->fd.original_cleared_match = priv->fd.cleared_match;
4168 button = GTK_WIDGET (gtk_builder_get_object (builder,
"filter_save"));
4169 if (priv->fd.save_filter == TRUE)
4170 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4173 gtk_widget_set_visible (GTK_WIDGET (button),
4174 gnc_plugin_page_register_show_fs_save (page));
4177 priv->fd.num_days = GTK_WIDGET (gtk_builder_get_object (builder,
4178 "filter_show_num_days"));
4179 button = GTK_WIDGET (gtk_builder_get_object (builder,
"filter_show_days"));
4183 if (priv->fd.days > 0)
4185 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4186 gtk_widget_set_sensitive (GTK_WIDGET (priv->fd.num_days), TRUE);
4187 gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->fd.num_days), priv->fd.days);
4188 priv->fd.original_days = priv->fd.days;
4196 gtk_widget_set_sensitive (GTK_WIDGET (priv->fd.num_days), FALSE);
4197 priv->fd.original_days = 0;
4201 xaccQueryGetDateMatchTT (query, &start_time, &end_time);
4205 priv->fd.original_start_time = start_time;
4206 priv->fd.start_time = start_time;
4207 priv->fd.original_end_time = end_time;
4208 priv->fd.end_time = end_time;
4210 button = GTK_WIDGET (gtk_builder_get_object (builder,
"filter_show_range"));
4211 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), start_time ||
4213 table = GTK_WIDGET (gtk_builder_get_object (builder,
"select_range_table"));
4214 priv->fd.table =
table;
4215 gtk_widget_set_sensitive (GTK_WIDGET (
table), start_time || end_time);
4217 priv->fd.start_date_choose = GTK_WIDGET (gtk_builder_get_object (builder,
4218 "start_date_choose"));
4219 priv->fd.start_date_today = GTK_WIDGET (gtk_builder_get_object (builder,
4220 "start_date_today"));
4221 priv->fd.end_date_choose = GTK_WIDGET (gtk_builder_get_object (builder,
4222 "end_date_choose"));
4223 priv->fd.end_date_today = GTK_WIDGET (gtk_builder_get_object (builder,
4228 if (start_time == 0)
4230 button = GTK_WIDGET (gtk_builder_get_object (builder,
"start_date_earliest"));
4231 time_val = xaccQueryGetEarliestDateFound (query);
4236 time_val = start_time;
4240 button = priv->fd.start_date_today;
4245 button = priv->fd.start_date_choose;
4249 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4250 priv->fd.start_date = gnc_date_edit_new (
gnc_time (NULL), FALSE, FALSE);
4251 hbox = GTK_WIDGET (gtk_builder_get_object (builder,
"start_date_hbox"));
4252 gtk_box_pack_start (GTK_BOX (hbox), priv->fd.start_date, TRUE, TRUE, 0);
4253 gtk_widget_show (priv->fd.start_date);
4254 gtk_widget_set_sensitive (GTK_WIDGET (priv->fd.start_date), sensitive);
4255 gnc_date_edit_set_time (GNC_DATE_EDIT (priv->fd.start_date), time_val);
4256 g_signal_connect (G_OBJECT (priv->fd.start_date),
"date-changed",
4257 G_CALLBACK (gnc_plugin_page_register_filter_gde_changed_cb),
4265 button = GTK_WIDGET (gtk_builder_get_object (builder,
"end_date_latest"));
4266 time_val = xaccQueryGetLatestDateFound (query);
4271 time_val = end_time;
4275 button = priv->fd.end_date_today;
4280 button = priv->fd.end_date_choose;
4284 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4285 priv->fd.end_date = gnc_date_edit_new (
gnc_time (NULL), FALSE, FALSE);
4286 hbox = GTK_WIDGET (gtk_builder_get_object (builder,
"end_date_hbox"));
4287 gtk_box_pack_start (GTK_BOX (hbox), priv->fd.end_date, TRUE, TRUE, 0);
4288 gtk_widget_show (priv->fd.end_date);
4289 gtk_widget_set_sensitive (GTK_WIDGET (priv->fd.end_date), sensitive);
4290 gnc_date_edit_set_time (GNC_DATE_EDIT (priv->fd.end_date), time_val);
4291 g_signal_connect (G_OBJECT (priv->fd.end_date),
"date-changed",
4292 G_CALLBACK (gnc_plugin_page_register_filter_gde_changed_cb),
4297 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func,
4301 gtk_widget_show (dialog);
4302 g_object_unref (G_OBJECT (builder));
4307 gnc_plugin_page_register_cmd_reload (GSimpleAction *simple,
4311 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4315 ENTER (
"(action %p, page %p)", simple, page);
4317 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4319 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4325 LEAVE (
"register has pending edits");
4333 gnc_plugin_page_register_cmd_style_changed (GSimpleAction *simple,
4334 GVariant *parameter,
4337 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4341 ENTER (
"(action %p, page %p)", simple, page);
4343 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4345 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4349 g_action_change_state (G_ACTION(simple), parameter);
4351 gnc_split_reg_change_style (priv->gsr, value, priv->enable_refresh);
4353 gnc_plugin_page_register_ui_update (NULL, page);
4358 gnc_plugin_page_register_cmd_style_double_line (GSimpleAction *simple,
4359 GVariant *parameter,
4362 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4365 gboolean use_double_line;
4368 ENTER (
"(action %p, page %p)", simple, page);
4370 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
4372 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4375 state = g_action_get_state (G_ACTION(simple));
4377 g_action_change_state (G_ACTION(simple), g_variant_new_boolean (!g_variant_get_boolean (state)));
4379 use_double_line = !g_variant_get_boolean (state);
4381 if (use_double_line != reg->use_double_line)
4384 if (priv->enable_refresh)
4387 g_variant_unref (state);
4392 gnc_plugin_page_register_cmd_transfer (GSimpleAction *simple,
4396 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4398 GncWindow* gnc_window;
4401 ENTER (
"(action %p, page %p)", simple, page);
4403 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4406 gnc_window = GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window);
4407 window = GTK_WIDGET (gnc_window_get_gtk_window (gnc_window));
4408 gnc_xfer_dialog (window, account);
4413 gnc_plugin_page_register_cmd_reconcile (GSimpleAction *simple,
4417 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4420 RecnWindow* recnData;
4422 ENTER (
"(action %p, page %p)", simple, page);
4424 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4434 if (!gnc_plugin_page_register_finish_pending (GNC_PLUGIN_PAGE (page)))
4439 window = gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (
4441 recnData = recnWindow (GTK_WIDGET (window), account);
4442 gnc_ui_reconcile_window_raise (recnData);
4447 gnc_plugin_page_register_cmd_stock_assistant (GSimpleAction *simple,
4451 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4455 ENTER (
"(action %p, page %p)", simple, page);
4457 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4458 window = gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window));
4460 gnc_stock_transaction_assistant (GTK_WIDGET (window), account);
4466 gnc_plugin_page_register_cmd_autoclear (GSimpleAction *simple,
4470 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4473 AutoClearWindow* autoClearData;
4475 ENTER (
"(action %p, page %p)", simple, page);
4477 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4481 window = gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (
4483 autoClearData = autoClearWindow (GTK_WIDGET (window), account);
4484 gnc_ui_autoclear_window_raise (autoClearData);
4489 gnc_plugin_page_register_cmd_stock_split (GSimpleAction *simple,
4493 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4497 ENTER (
"(action %p, page %p)", simple, page);
4499 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4502 window = gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window));
4503 gnc_stock_split_dialog (GTK_WIDGET (window), account);
4508 gnc_plugin_page_register_cmd_lots (GSimpleAction *simple,
4512 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4516 ENTER (
"(action %p, page %p)", simple, page);
4518 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4520 window = gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (
4523 gnc_lot_viewer_dialog (window, account);
4528 gnc_plugin_page_register_cmd_enter_transaction (GSimpleAction *simple,
4532 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4535 ENTER (
"(action %p, page %p)", simple, page);
4537 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4539 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4540 gnc_split_reg_enter (priv->gsr, FALSE);
4545 gnc_plugin_page_register_cmd_cancel_transaction (GSimpleAction *simple,
4549 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4552 ENTER (
"(action %p, page %p)", simple, page);
4554 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4556 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4563 gnc_plugin_page_register_cmd_delete_transaction (GSimpleAction *simple,
4567 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4570 ENTER (
"(action %p, page %p)", simple, page);
4572 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4574 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4575 gsr_default_delete_handler (priv->gsr, NULL);
4581 gnc_plugin_page_register_cmd_linked_transaction (GSimpleAction *simple,
4585 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4588 ENTER (
"(action %p, page %p)", simple, page);
4590 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4592 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4593 gsr_default_doclink_handler (priv->gsr);
4594 gnc_plugin_page_register_ui_update (NULL, page);
4599 gnc_plugin_page_register_cmd_linked_transaction_open (GSimpleAction *simple,
4603 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4606 ENTER (
"(action %p, page %p)", simple, page);
4608 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4610 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4611 gsr_default_doclink_open_handler (priv->gsr);
4615 static GncInvoice* invoice_from_split (Split* split)
4617 GncInvoice* invoice;
4636 gnc_plugin_page_register_cmd_jump_linked_invoice (GSimpleAction *simple,
4640 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4643 GncInvoice* invoice;
4647 ENTER (
"(action %p, page %p)", simple, page);
4649 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4650 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4654 window = GNC_PLUGIN_PAGE(page)->window;
4658 auto invoices = invoices_from_transaction (txn);
4659 if (invoices.empty())
4660 PERR (
"shouldn't happen: if no invoices, function is never called");
4661 else if (invoices.size() == 1)
4662 invoice = invoices[0];
4665 GList *details = NULL;
4668 for (
const auto& inv : invoices)
4673 gnc_account_print_info (gncInvoiceGetPostedAcc (inv), TRUE));
4674 details = g_list_prepend
4679 g_strdup_printf (_(
"%s %s from %s, posted %s, amount %s"),
4680 gncInvoiceGetTypeString (inv),
4681 gncInvoiceGetID (inv),
4682 gncOwnerGetName (gncInvoiceGetOwner (inv)),
4686 details = g_list_reverse (details);
4687 choice = gnc_choose_radio_option_dialog
4688 (window, _(
"Select document"),
4689 _(
"Several documents are linked with this transaction. \ 4690 Please choose one:"), _(
"Select"), 0, details);
4691 if ((choice >= 0) && ((
size_t)choice < invoices.size()))
4692 invoice = invoices[choice];
4693 g_list_free_full (details, g_free);
4699 GtkWindow *gtk_window = gnc_window_get_gtk_window (GNC_WINDOW (window));
4700 gnc_ui_invoice_edit (gtk_window, invoice);
4707 gnc_plugin_page_register_cmd_blank_transaction (GSimpleAction *simple,
4711 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4715 ENTER (
"(action %p, page %p)", simple, page);
4717 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4719 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4725 gnc_split_reg_jump_to_blank (priv->gsr);
4730 find_after_date (Split *split,
time64* find_date)
4739 gnc_plugin_page_register_cmd_goto_date (GSimpleAction *simple,
4743 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4749 ENTER (
"(action %p, page %p)", simple, page);
4750 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4752 auto date = input_date (window, _(
"Go to Date"), _(
"Go to Date"));
4756 LEAVE (
"goto_date cancelled");
4767 auto it = g_list_find_custom (splits, &date.value(), (GCompareFunc)find_after_date);
4770 gnc_split_reg_jump_to_split (gsr, GNC_SPLIT(it->data));
4772 gnc_split_reg_jump_to_blank (gsr);
4774 g_list_free (splits);
4779 gnc_plugin_page_register_cmd_duplicate_transaction (GSimpleAction *simple,
4783 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4786 ENTER (
"(action %p, page %p)", simple, page);
4788 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4790 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4797 gnc_plugin_page_register_cmd_reinitialize_transaction (GSimpleAction *simple,
4801 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4804 ENTER (
"(action %p, page %p)", simple, page);
4806 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4808 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4809 gsr_default_reinit_handler (priv->gsr, NULL);
4814 gnc_plugin_page_register_cmd_expand_transaction (GSimpleAction *simple,
4815 GVariant *parameter,
4818 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4824 ENTER (
"(action %p, page %p)", simple, page);
4826 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4828 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4831 state = g_action_get_state (G_ACTION(simple));
4833 g_action_change_state (G_ACTION(simple), g_variant_new_boolean (!g_variant_get_boolean (state)));
4835 expand = !g_variant_get_boolean (state);
4838 g_variant_unref (state);
4845 gnc_plugin_page_register_cmd_exchange_rate (GSimpleAction *simple,
4849 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4853 ENTER (
"(action %p, page %p)", simple, page);
4855 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4857 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4866 jump_multiple_splits_by_single_account (
Account *account, Split *split)
4870 Account *other_account = NULL;
4871 Split *other_split = NULL;
4879 Split *s = (Split*)splits->data;
4882 if (!xaccTransStillHasSplit(trans, s))
4890 if (other_account != a)
4902 other_split = split;
4908 jump_multiple_splits_by_value (
Account *account, Split *split, gboolean largest)
4912 Split *other_split = NULL;
4914 int cmp = largest ? 1 : -1;
4922 Split *s = (Split*)splits->data;
4925 if (!xaccTransStillHasSplit(trans, s))
4947 other_split = split;
4953 jump_multiple_splits (
Account* account, Split *split)
4955 GncPrefJumpMultSplits mode = (GncPrefJumpMultSplits)
gnc_prefs_get_enum(GNC_PREFS_GROUP_GENERAL_REGISTER, GNC_PREF_JUMP_MULT_SPLITS);
4959 case JUMP_LARGEST_VALUE_FIRST_SPLIT:
4960 return jump_multiple_splits_by_value (account, split, TRUE);
4962 case JUMP_SMALLEST_VALUE_FIRST_SPLIT:
4963 return jump_multiple_splits_by_value (account, split, FALSE);
4971 return jump_multiple_splits_by_single_account (account, split);
4975 gnc_plugin_page_register_cmd_jump (GSimpleAction *simple,
4979 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4989 gboolean multiple_splits;
4991 ENTER (
"(action %p, page %p)", simple, page);
4993 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4995 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4996 window = GNC_PLUGIN_PAGE (page)->window;
4999 LEAVE (
"no window");
5007 LEAVE (
"no split (1)");
5012 if (account == NULL)
5014 LEAVE (
"no account");
5019 multiple_splits = other_split == NULL;
5022 if (account == leader)
5025 if (cursor_class == CURSOR_CLASS_SPLIT)
5044 LEAVE (
"split for this account");
5048 if (multiple_splits)
5050 other_split = jump_multiple_splits (account, split);
5052 if (other_split == NULL)
5054 GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW(window),
5055 (GtkDialogFlags)(GTK_DIALOG_MODAL
5056 | GTK_DIALOG_DESTROY_WITH_PARENT),
5060 _(
"Unable to jump to other account"));
5062 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(dialog),
5063 "%s", _(
"This transaction involves more than one other account. Select a specific split to jump to that account."));
5064 gtk_dialog_add_button (GTK_DIALOG(dialog), _(
"_OK"), GTK_RESPONSE_OK);
5065 gnc_dialog_run (GTK_DIALOG(dialog), GNC_PREF_WARN_REG_TRANS_JUMP_MULTIPLE_SPLITS);
5066 gtk_widget_destroy (dialog);
5068 LEAVE (
"no split (2)");
5072 split = other_split;
5075 if (account == NULL)
5077 LEAVE (
"no account (2)");
5081 if (account == leader)
5083 GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW(window),
5084 (GtkDialogFlags)(GTK_DIALOG_MODAL
5085 | GTK_DIALOG_DESTROY_WITH_PARENT),
5089 _(
"Unable to jump to other account"));
5091 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(dialog),
5092 "%s", _(
"This transaction only involves the current account so there is no other account to jump to."));
5093 gtk_dialog_add_button (GTK_DIALOG(dialog), _(
"_OK"), GTK_RESPONSE_OK);
5094 gnc_dialog_run (GTK_DIALOG(dialog), GNC_PREF_WARN_REG_TRANS_JUMP_SINGLE_ACCOUNT);
5095 gtk_widget_destroy (dialog);
5097 LEAVE (
"register open for account");
5103 if (new_page == NULL)
5105 LEAVE (
"couldn't create new page");
5113 gboolean jump_twice = FALSE;
5119 if (new_page_reg->style != REG_STYLE_JOURNAL)
5123 if (gnc_split_reg_clear_filter_for_split (gsr, split))
5126 gnc_split_reg_jump_to_split (gsr, split);
5128 if (multiple_splits && jump_twice)
5134 gnc_split_reg_jump_to_split (gsr, split);
5140 gnc_plugin_page_register_cmd_schedule (GSimpleAction *simple,
5144 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5148 ENTER (
"(action %p, page %p)", simple, page);
5150 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5154 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5155 gsr_default_schedule_handler (priv->gsr, window);
5160 scrub_split (Split *split)
5166 g_return_if_fail (split);
5170 g_return_if_fail (trans);
5182 gnc_plugin_page_register_cmd_scrub_current (GSimpleAction *simple,
5186 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5191 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5193 ENTER (
"(action %p, page %p)", simple, page);
5195 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5199 LEAVE (
"no query found");
5205 gnc_suspend_gui_refresh();
5207 gnc_resume_gui_refresh();
5212 scrub_kp_handler (GtkWidget *widget, GdkEventKey *event, gpointer data)
5214 if (event->length == 0)
return FALSE;
5216 switch (event->keyval)
5218 case GDK_KEY_Escape:
5220 auto abort_scrub = gnc_verify_dialog (GTK_WINDOW(widget),
false,
5221 "%s", _(check_repair_abort_YN));
5235 gnc_plugin_page_register_cmd_scrub_all (GSimpleAction *simple,
5239 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5243 GList* node, *splits;
5244 gint split_count = 0, curr_split_no = 0;
5245 gulong scrub_kp_handler_ID;
5246 const char* message = _ (
"Checking splits in current register: %u of %u");
5248 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5250 ENTER (
"(action %p, page %p)", simple, page);
5252 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5256 LEAVE (
"no query found");
5260 gnc_suspend_gui_refresh();
5261 is_scrubbing = TRUE;
5263 window = GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window);
5264 scrub_kp_handler_ID = g_signal_connect (G_OBJECT (window),
"key-press-event",
5265 G_CALLBACK (scrub_kp_handler), NULL);
5266 gnc_window_set_progressbar_window (window);
5269 split_count = g_list_length (splits);
5270 for (node = splits; node && !gnc_get_abort_scrub (); node = node->next, curr_split_no++)
5272 auto split = GNC_SPLIT(node->data);
5274 if (!split)
continue;
5276 PINFO (
"Start processing split %d of %d",
5277 curr_split_no + 1, split_count);
5279 scrub_split (split);
5281 PINFO (
"Finished processing split %d of %d",
5282 curr_split_no + 1, split_count);
5284 if (curr_split_no % 10 == 0)
5286 char* progress_msg = g_strdup_printf (message, curr_split_no, split_count);
5287 gnc_window_show_progress (progress_msg, (100 * curr_split_no) / split_count);
5288 g_free (progress_msg);
5292 g_signal_handler_disconnect (G_OBJECT(window), scrub_kp_handler_ID);
5293 gnc_window_show_progress (NULL, -1.0);
5294 is_scrubbing = FALSE;
5295 show_abort_verify = TRUE;
5298 gnc_resume_gui_refresh();
5303 gnc_plugin_page_register_cmd_account_report (GSimpleAction *simple,
5307 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5309 GncMainWindow* window;
5312 ENTER (
"(action %p, page %p)", simple, page);
5314 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5316 window = GNC_MAIN_WINDOW (GNC_PLUGIN_PAGE (page)->window);
5317 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5318 id = report_helper (priv->ledger, NULL, NULL);
5320 gnc_main_window_open_report (
id, window);
5325 gnc_plugin_page_register_cmd_transaction_report (GSimpleAction *simple,
5329 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5331 GncMainWindow* window;
5338 ENTER (
"(action %p, page %p)", simple, page);
5340 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5342 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5349 query = qof_query_create_for (GNC_ID_SPLIT);
5354 GNC_ID_SPLIT, QOF_QUERY_AND);
5356 window = GNC_MAIN_WINDOW (GNC_PLUGIN_PAGE (page)->window);
5357 id = report_helper (priv->ledger, split, query);
5359 gnc_main_window_open_report (
id, window);
5375 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page));
5377 page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
5378 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5379 priv->lines_default = lines_default;
5380 priv->read_only = read_only;
5389 g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), NULL);
5391 page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
5392 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5398 gnc_plugin_page_help_changed_cb (GNCSplitReg* gsr,
5406 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (register_page));
5408 window = GNC_WINDOW (GNC_PLUGIN_PAGE (register_page)->window);
5418 (GNC_MAIN_WINDOW(window)) != GNC_PLUGIN_PAGE(register_page)))
5422 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (register_page);
5424 help = gnc_table_get_help (reg->table);
5425 gnc_window_set_status (window, GNC_PLUGIN_PAGE (register_page), help);
5430 gnc_plugin_page_popup_menu_cb (GNCSplitReg* gsr,
5435 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5437 window = GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window);
5445 GNC_PLUGIN_PAGE (page));
5449 gnc_plugin_page_register_refresh_cb (GHashTable* changes, gpointer user_data)
5451 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5454 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5455 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5460 ei = gnc_gui_get_entity_events (changes, &priv->key);
5463 if (ei->event_mask & QOF_EVENT_DESTROY)
5468 if (ei->event_mask & QOF_EVENT_MODIFY)
5476 gnucash_register_refresh_from_prefs (priv->gsr->reg);
5477 gtk_widget_queue_draw (priv->widget);
5480 gnc_plugin_page_register_ui_update (NULL, page);
5484 gnc_plugin_page_register_close_cb (gpointer user_data)
5499 gppr_account_destroy_cb (
Account* account)
5503 GNCLedgerDisplayType ledger_type;
5506 GList* item, *kill = NULL;
5513 for (; citem; citem = g_list_next (citem))
5516 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5517 ledger_type = gnc_ledger_display_type (priv->ledger);
5518 if (ledger_type == LD_GL)
5520 kill = g_list_prepend (kill, page);
5523 else if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
5525 if (guid_compare (acct_guid, &priv->key) == 0)
5527 kill = g_list_prepend (kill, page);
5532 kill = g_list_reverse (kill);
5534 for (item = kill; item; item = g_list_next (item))
5557 gnc_plugin_page_register_event_handler (
QofInstance* entity,
5567 g_return_if_fail (page);
5568 if (!GNC_IS_TRANS (entity) && !GNC_IS_ACCOUNT (entity))
5571 ENTER (
"entity %p of type %d, page %p, event data %p",
5572 entity, event_type, page, ed);
5576 if (GNC_IS_ACCOUNT (entity))
5578 if (GNC_IS_MAIN_WINDOW (window))
5584 LEAVE (
"account is NULL");
5588 gchar *name = gnc_plugin_page_register_get_tab_name (GNC_PLUGIN_PAGE (page));
5591 gchar *long_name = gnc_plugin_page_register_get_long_name (GNC_PLUGIN_PAGE (page));
5594 gchar *color = gnc_plugin_page_register_get_tab_color (GNC_PLUGIN_PAGE (page));
5597 gnc_plugin_page_register_update_page_icon (GNC_PLUGIN_PAGE (page));
5603 LEAVE (
"tab contents updated");
5607 if (! (event_type & (QOF_EVENT_MODIFY | QOF_EVENT_DESTROY)))
5609 LEAVE (
"not a modify");
5612 trans = GNC_TRANS (entity);
5616 LEAVE (
"not in this book");
5620 if (GNC_IS_MAIN_WINDOW (window))
5623 if (visible_page != GNC_PLUGIN_PAGE (page))
5625 LEAVE (
"page not visible");
5630 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.
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...