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 if (GTK_IS_WIDGET(priv->gsr))
1514 gtk_widget_destroy(GTK_WIDGET(priv->gsr));
1517 priv->ledger = NULL;
1522 gnc_plugin_page_register_window_changed (
GncPluginPage* plugin_page,
1528 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page));
1530 page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
1531 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
1533 GTK_WIDGET (gnc_window_get_gtk_window (GNC_WINDOW (window)));
1536 static const gchar* style_names[] =
1544 #define KEY_REGISTER_TYPE "RegisterType" 1545 #define KEY_ACCOUNT_NAME "AccountName" 1546 #define KEY_ACCOUNT_GUID "AccountGuid" 1547 #define KEY_REGISTER_STYLE "RegisterStyle" 1548 #define KEY_DOUBLE_LINE "DoubleLineMode" 1550 #define LABEL_ACCOUNT "Account" 1551 #define LABEL_SUBACCOUNT "SubAccount" 1552 #define LABEL_GL "GL" 1553 #define LABEL_SEARCH "Search" 1566 gnc_plugin_page_register_save_page (
GncPluginPage* plugin_page,
1568 const gchar* group_name)
1572 GNCLedgerDisplayType ledger_type;
1576 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page));
1577 g_return_if_fail (key_file != NULL);
1578 g_return_if_fail (group_name != NULL);
1580 ENTER (
"page %p, key_file %p, group_name %s", plugin_page, key_file,
1583 page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
1584 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
1587 ledger_type = gnc_ledger_display_type (priv->ledger);
1588 if (ledger_type > LD_GL)
1590 LEAVE (
"Unsupported ledger type");
1593 if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
1598 label = (ledger_type == LD_SINGLE) ? LABEL_ACCOUNT : LABEL_SUBACCOUNT;
1600 g_key_file_set_string (key_file, group_name, KEY_REGISTER_TYPE, label);
1602 g_key_file_set_string (key_file, group_name, KEY_ACCOUNT_NAME, name);
1605 g_key_file_set_string (key_file, group_name, KEY_ACCOUNT_GUID, acct_guid);
1607 else if (reg->type == GENERAL_JOURNAL)
1609 g_key_file_set_string (key_file, group_name, KEY_REGISTER_TYPE,
1612 else if (reg->type == SEARCH_LEDGER)
1614 g_key_file_set_string (key_file, group_name, KEY_REGISTER_TYPE,
1619 LEAVE (
"Unsupported register type");
1623 g_key_file_set_string (key_file, group_name, KEY_REGISTER_STYLE,
1624 style_names[reg->style]);
1625 g_key_file_set_boolean (key_file, group_name, KEY_DOUBLE_LINE,
1626 reg->use_double_line);
1645 gnc_plugin_page_register_restore_edit_menu (
GncPluginPage* page,
1647 const gchar* group_name)
1651 GError* error = NULL;
1654 gboolean use_double_line;
1659 style_name = g_key_file_get_string (key_file, group_name,
1660 KEY_REGISTER_STYLE, &error);
1661 for (i = 0 ; style_names[i]; i++)
1663 if (g_ascii_strcasecmp (style_name, style_names[i]) == 0)
1665 DEBUG (
"Found match for style name: %s", style_name);
1669 g_free (style_name);
1672 if (i <= REG_STYLE_JOURNAL)
1674 DEBUG (
"Setting style: %d", i);
1676 g_action_activate (G_ACTION(action), g_variant_new_int32 (i));
1680 use_double_line = g_key_file_get_boolean (key_file, group_name,
1681 KEY_DOUBLE_LINE, &error);
1682 DEBUG (
"Setting double_line_mode: %d", use_double_line);
1685 state = g_action_get_state (G_ACTION(action));
1687 if (use_double_line != g_variant_get_boolean (state))
1688 g_action_activate (G_ACTION(action), NULL);
1690 g_variant_unref (state);
1706 gnc_plugin_page_register_recreate_page (GtkWidget* window,
1708 const gchar* group_name)
1712 GError* error = NULL;
1713 gchar* reg_type, *acct_guid;
1717 gboolean include_subs;
1719 g_return_val_if_fail (key_file, NULL);
1720 g_return_val_if_fail (group_name, NULL);
1721 ENTER (
"key_file %p, group_name %s", key_file, group_name);
1724 reg_type = g_key_file_get_string (key_file, group_name,
1725 KEY_REGISTER_TYPE, &error);
1726 DEBUG (
"Page type: %s", reg_type);
1727 if ((g_ascii_strcasecmp (reg_type, LABEL_ACCOUNT) == 0) ||
1728 (g_ascii_strcasecmp (reg_type, LABEL_SUBACCOUNT) == 0))
1730 include_subs = (g_ascii_strcasecmp (reg_type, LABEL_SUBACCOUNT) == 0);
1731 DEBUG (
"Include subs: %d", include_subs);
1735 LEAVE(
"Session has no book");
1738 acct_guid = g_key_file_get_string (key_file, group_name,
1739 KEY_ACCOUNT_GUID, &error);
1745 if (account == NULL)
1747 gchar* acct_name = g_key_file_get_string (key_file, group_name,
1748 KEY_ACCOUNT_NAME, &error);
1753 if (account == NULL)
1755 LEAVE (
"Bad account name");
1761 else if (g_ascii_strcasecmp (reg_type, LABEL_GL) == 0)
1767 LEAVE (
"Bad ledger type");
1775 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
1776 priv->enable_refresh = FALSE;
1785 gnc_plugin_page_register_restore_edit_menu (page, key_file, group_name);
1788 priv->enable_refresh = TRUE;
1798 gnc_plugin_page_register_update_edit_menu (
GncPluginPage* page, gboolean hide)
1803 gboolean can_copy = FALSE, can_cut = FALSE, can_paste = FALSE;
1804 gboolean has_selection;
1807 reg_page = GNC_PLUGIN_PAGE_REGISTER (page);
1808 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (reg_page);
1809 has_selection = gnucash_register_has_selection (priv->gsr->reg);
1811 can_copy = has_selection;
1812 can_cut = is_readwrite && has_selection;
1813 can_paste = is_readwrite;
1816 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), can_copy);
1818 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), can_cut);
1820 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), can_paste);
1823 static gboolean is_scrubbing = FALSE;
1824 static gboolean show_abort_verify = TRUE;
1827 check_repair_abort_YN = N_(
"'Check & Repair' is currently running, do you want to abort it?");
1832 gboolean ret = FALSE;
1837 false,
"%s", _(check_repair_abort_YN));
1839 show_abort_verify = FALSE;
1848 gnc_plugin_page_register_finish_pending (
GncPluginPage* page)
1853 GtkWidget* dialog, *window;
1857 if (is_scrubbing && show_abort_verify)
1859 if (!finish_scrub (page))
1863 reg_page = GNC_PLUGIN_PAGE_REGISTER (page);
1864 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (reg_page);
1870 name = gnc_plugin_page_register_get_tab_name (page);
1872 dialog = gtk_message_dialog_new (GTK_WINDOW (window),
1873 GTK_DIALOG_DESTROY_WITH_PARENT,
1874 GTK_MESSAGE_WARNING,
1878 _ (
"Save changes to %s?"), name);
1880 gtk_message_dialog_format_secondary_text
1881 (GTK_MESSAGE_DIALOG (dialog),
1883 _ (
"This register has pending changes to a transaction. " 1884 "Would you like to save the changes to this transaction, " 1885 "discard the transaction, or cancel the operation?"));
1886 gnc_gtk_dialog_add_button (dialog, _ (
"_Discard Transaction"),
1887 "edit-delete", GTK_RESPONSE_REJECT);
1888 gtk_dialog_add_button (GTK_DIALOG (dialog),
1889 _ (
"_Cancel"), GTK_RESPONSE_CANCEL);
1890 gnc_gtk_dialog_add_button (dialog, _ (
"_Save Transaction"),
1891 "document-save", GTK_RESPONSE_ACCEPT);
1893 response = gtk_dialog_run (GTK_DIALOG (dialog));
1894 gtk_widget_destroy (dialog);
1898 case GTK_RESPONSE_ACCEPT:
1902 case GTK_RESPONSE_REJECT:
1914 gnc_plugin_page_register_get_tab_name (
GncPluginPage* plugin_page)
1917 GNCLedgerDisplayType ledger_type;
1918 GNCLedgerDisplay* ld;
1922 g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page),
1923 g_strdup (_(
"unknown")));
1925 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
1928 ledger_type = gnc_ledger_display_type (ld);
1931 switch (ledger_type)
1942 case GENERAL_JOURNAL:
1944 return g_strdup (_ (
"General Journal"));
1945 case PORTFOLIO_LEDGER:
1946 return g_strdup (_ (
"Portfolio"));
1948 return g_strdup (_ (
"Search Results"));
1958 return g_strdup (_ (
"unknown"));
1962 gnc_plugin_page_register_get_tab_color (
GncPluginPage* plugin_page)
1965 GNCLedgerDisplayType ledger_type;
1966 GNCLedgerDisplay* ld;
1970 g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page),
1971 g_strdup (_(
"unknown")));
1973 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
1975 ledger_type = gnc_ledger_display_type (ld);
1979 if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
1982 return g_strdup (color ? color :
"Not Set");
1986 gnc_plugin_page_register_check_for_empty_group (GKeyFile *state_file,
1987 const gchar *state_section)
1990 gchar **keys = g_key_file_get_keys (state_file, state_section, &num_keys, NULL);
1999 gnc_plugin_page_register_get_filter_gcm (GNCSplitReg *gsr)
2002 gchar* state_section;
2003 GError* error = NULL;
2004 char* filter = NULL;
2007 state_section = gsr_get_register_state_section (gsr);
2008 filter = g_key_file_get_string (state_file, state_section,
2009 KEY_PAGE_FILTER, &error);
2012 g_clear_error (&error);
2014 g_strdelimit (filter,
";",
',');
2016 g_free (state_section);
2021 gnc_plugin_page_register_get_filter (
GncPluginPage* plugin_page)
2024 GNCLedgerDisplayType ledger_type;
2025 char* filter = NULL;
2027 g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page),
2028 g_strdup (_(
"unknown")));
2030 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
2032 ledger_type = gnc_ledger_display_type (priv->ledger);
2035 filter = gnc_plugin_page_register_get_filter_gcm (priv->gsr);
2040 return g_strdup_printf (
"%s,%s,%s,%s", DEFAULT_FILTER,
2041 "0",
"0", get_filter_default_num_of_days (ledger_type));
2045 gnc_plugin_page_register_set_filter_gcm (GNCSplitReg *gsr,
const gchar* filter,
2046 gchar* default_filter)
2049 gchar* state_section;
2053 state_section = gsr_get_register_state_section (gsr);
2054 if (!filter || (g_strcmp0 (filter, default_filter) == 0))
2056 if (g_key_file_has_key (state_file, state_section, KEY_PAGE_FILTER, NULL))
2057 g_key_file_remove_key (state_file, state_section, KEY_PAGE_FILTER, NULL);
2059 gnc_plugin_page_register_check_for_empty_group (state_file, state_section);
2063 filter_text = g_strdup (filter);
2064 g_strdelimit (filter_text,
",",
';');
2065 g_key_file_set_string (state_file, state_section, KEY_PAGE_FILTER,
2067 g_free (filter_text);
2069 g_free (state_section);
2073 gnc_plugin_page_register_set_filter (
GncPluginPage* plugin_page,
2074 const gchar* filter)
2077 GNCLedgerDisplayType ledger_type;
2078 gchar* default_filter;
2080 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
2082 ledger_type = gnc_ledger_display_type (priv->ledger);
2084 default_filter = g_strdup_printf (
"%s,%s,%s,%s", DEFAULT_FILTER,
2085 "0",
"0", get_filter_default_num_of_days (ledger_type));
2088 gnc_plugin_page_register_set_filter_gcm (priv->gsr, filter, default_filter);
2090 g_free (default_filter);
2095 gnc_plugin_page_register_get_sort_order_gcm (GNCSplitReg *gsr)
2098 gchar* state_section;
2100 GError* error = NULL;
2101 char* sort_order = NULL;
2104 state_section = gsr_get_register_state_section (gsr);
2105 sort_text = g_key_file_get_string (state_file, state_section, KEY_PAGE_SORT,
2109 g_clear_error (&error);
2112 sort_order = g_strdup (sort_text);
2115 g_free (state_section);
2120 gnc_plugin_page_register_get_sort_order (
GncPluginPage* plugin_page)
2123 char* sort_order = NULL;
2125 g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page),
2128 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
2131 sort_order = gnc_plugin_page_register_get_sort_order_gcm (priv->gsr);
2133 return sort_order ? sort_order : g_strdup (DEFAULT_SORT_ORDER);
2137 gnc_plugin_page_register_set_sort_order_gcm (GNCSplitReg *gsr,
2138 const gchar* sort_order)
2141 gchar* state_section;
2144 state_section = gsr_get_register_state_section (gsr);
2145 if (!sort_order || (g_strcmp0 (sort_order, DEFAULT_SORT_ORDER) == 0))
2147 if (g_key_file_has_key (state_file, state_section, KEY_PAGE_SORT, NULL))
2148 g_key_file_remove_key (state_file, state_section, KEY_PAGE_SORT, NULL);
2150 gnc_plugin_page_register_check_for_empty_group (state_file, state_section);
2153 g_key_file_set_string (state_file, state_section, KEY_PAGE_SORT, sort_order);
2155 g_free (state_section);
2158 gnc_plugin_page_register_set_sort_order (
GncPluginPage* plugin_page,
2159 const gchar* sort_order)
2163 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
2166 gnc_plugin_page_register_set_sort_order_gcm (priv->gsr, sort_order);
2170 gnc_plugin_page_register_get_sort_reversed_gcm (GNCSplitReg *gsr)
2173 gchar* state_section;
2174 GError* error = NULL;
2175 gboolean sort_reversed = FALSE;
2178 state_section = gsr_get_register_state_section (gsr);
2179 sort_reversed = g_key_file_get_boolean (state_file, state_section,
2180 KEY_PAGE_SORT_REV, &error);
2183 g_clear_error (&error);
2185 g_free (state_section);
2186 return sort_reversed;
2190 gnc_plugin_page_register_get_sort_reversed (
GncPluginPage* plugin_page)
2193 gboolean sort_reversed = FALSE;
2195 g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), FALSE);
2197 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
2200 sort_reversed = gnc_plugin_page_register_get_sort_reversed_gcm (priv->gsr);
2201 return sort_reversed;
2205 gnc_plugin_page_register_set_sort_reversed_gcm (GNCSplitReg *gsr,
2206 gboolean reverse_order)
2209 gchar* state_section;
2212 state_section = gsr_get_register_state_section (gsr);
2216 if (g_key_file_has_key (state_file, state_section, KEY_PAGE_SORT_REV, NULL))
2217 g_key_file_remove_key (state_file, state_section, KEY_PAGE_SORT_REV, NULL);
2219 gnc_plugin_page_register_check_for_empty_group (state_file, state_section);
2222 g_key_file_set_boolean (state_file, state_section, KEY_PAGE_SORT_REV,
2225 g_free (state_section);
2229 gnc_plugin_page_register_set_sort_reversed (
GncPluginPage* plugin_page,
2230 gboolean reverse_order)
2234 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
2237 gnc_plugin_page_register_set_sort_reversed_gcm (priv->gsr, reverse_order);
2241 gnc_plugin_page_register_get_long_name (
GncPluginPage* plugin_page)
2244 GNCLedgerDisplayType ledger_type;
2245 GNCLedgerDisplay* ld;
2248 g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page),
2251 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
2253 ledger_type = gnc_ledger_display_type (ld);
2256 switch (ledger_type)
2264 gchar* return_string = g_strdup_printf (
"%s+", account_full_name);
2265 g_free ((gpointer*) account_full_name);
2266 return return_string;
2277 gnc_plugin_page_register_summarybar_position_changed (gpointer prefs,
2284 GtkPositionType position = GTK_POS_BOTTOM;
2286 g_return_if_fail (user_data != NULL);
2288 if (!GNC_IS_PLUGIN_PAGE (user_data))
2291 plugin_page = GNC_PLUGIN_PAGE (user_data);
2292 page = GNC_PLUGIN_PAGE_REGISTER (user_data);
2293 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2299 GNC_PREF_SUMMARYBAR_POSITION_TOP))
2300 position = GTK_POS_TOP;
2302 gtk_box_reorder_child (GTK_BOX (priv->widget),
2304 (position == GTK_POS_TOP ? 0 : -1));
2318 g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), NULL);
2320 page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
2321 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2340 gnc_plugin_page_register_sort_book_option_changed (gpointer new_val,
2344 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
2345 gboolean* new_data = (gboolean*)new_val;
2347 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
2349 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2352 gtk_button_set_label (GTK_BUTTON (priv->sd.num_radio),
2353 _ (
"Transaction Number"));
2354 gtk_button_set_label (GTK_BUTTON (priv->sd.act_radio), _ (
"Number/Action"));
2358 gtk_button_set_label (GTK_BUTTON (priv->sd.num_radio), _ (
"Number"));
2359 gtk_button_set_label (GTK_BUTTON (priv->sd.act_radio), _ (
"Action"));
2361 gnc_split_reg_set_sort_type_force (priv->gsr, (SortType)priv->gsr->sort_type, TRUE);
2385 g_return_if_fail (GTK_IS_DIALOG (dialog));
2386 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
2389 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2390 plugin_page = GNC_PLUGIN_PAGE (page);
2392 if (response != GTK_RESPONSE_OK)
2395 gnc_split_reg_set_sort_reversed (priv->gsr, priv->sd.original_reverse_order,
2397 priv->sd.reverse_order = priv->sd.original_reverse_order;
2398 gnc_split_reg_set_sort_type (priv->gsr, priv->sd.original_sort_type);
2399 priv->sd.save_order = priv->sd.original_save_order;
2404 if ((!priv->sd.save_order) && ((priv->sd.original_save_order) || (priv->sd.original_reverse_order)))
2406 gnc_plugin_page_register_set_sort_order (plugin_page, DEFAULT_SORT_ORDER);
2407 gnc_plugin_page_register_set_sort_reversed (plugin_page, FALSE);
2409 priv->sd.original_save_order = priv->sd.save_order;
2411 if (priv->sd.save_order)
2413 type = gnc_split_reg_get_sort_type (priv->gsr);
2414 order = SortTypeasString (type);
2415 gnc_plugin_page_register_set_sort_order (plugin_page, order);
2416 gnc_plugin_page_register_set_sort_reversed (plugin_page,
2417 priv->sd.reverse_order);
2420 gnc_book_option_remove_cb (OPTION_NAME_NUM_FIELD_SOURCE,
2421 gnc_plugin_page_register_sort_book_option_changed,
2423 priv->sd.dialog = NULL;
2424 priv->sd.num_radio = NULL;
2425 priv->sd.act_radio = NULL;
2426 gtk_widget_destroy (GTK_WIDGET (dialog));
2447 g_return_if_fail (GTK_IS_TOGGLE_BUTTON (button));
2448 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
2450 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2451 name = gtk_buildable_get_name (GTK_BUILDABLE (button));
2452 ENTER (
"button %s(%p), page %p", name, button, page);
2453 type = SortTypefromString (name);
2454 gnc_split_reg_set_sort_type (priv->gsr, type);
2473 g_return_if_fail (GTK_IS_CHECK_BUTTON (button));
2474 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
2476 ENTER (
"Save toggle button (%p), plugin_page %p", button, page);
2479 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2481 if (gtk_toggle_button_get_active (button))
2482 priv->sd.save_order = TRUE;
2484 priv->sd.save_order = FALSE;
2503 g_return_if_fail (GTK_IS_CHECK_BUTTON (button));
2504 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
2506 ENTER (
"Reverse toggle button (%p), plugin_page %p", button, page);
2509 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2511 priv->sd.reverse_order = gtk_toggle_button_get_active (button);
2512 gnc_split_reg_set_sort_reversed (priv->gsr, priv->sd.reverse_order, TRUE);
2526 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2529 if (reg->type == SEARCH_LEDGER)
2536 if ((priv->filter_query == NULL) ||
2567 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2570 LEAVE (
"no ledger");
2574 gnc_ppr_update_for_search_query (page);
2579 LEAVE (
"no query found");
2586 if (reg->type != SEARCH_LEDGER)
2588 GSList *param_list = qof_query_build_param_list (SPLIT_RECONCILE, NULL);
2590 g_slist_free (param_list);
2594 if (priv->fd.cleared_match != CLEARED_ALL)
2595 xaccQueryAddClearedMatch (query, priv->fd.cleared_match, QOF_QUERY_AND);
2598 gnc_plugin_page_register_set_filter_tooltip (page);
2604 if (priv->enable_refresh)
2630 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2633 LEAVE (
"no ledger");
2637 gnc_ppr_update_for_search_query (page);
2650 if (reg->type != SEARCH_LEDGER)
2652 GSList *param_list = qof_query_build_param_list (SPLIT_TRANS,
2653 TRANS_DATE_POSTED, NULL);
2655 g_slist_free (param_list);
2658 if (priv->fd.start_time || priv->fd.end_time)
2661 xaccQueryAddDateMatchTT (query,
2662 priv->fd.start_time != 0, priv->fd.start_time,
2663 priv->fd.end_time != 0, priv->fd.end_time,
2667 if (priv->fd.days > 0)
2674 tm.tm_mday = tm.tm_mday - priv->fd.days;
2676 xaccQueryAddDateMatchTT (query, TRUE, start, FALSE, 0, QOF_QUERY_AND);
2680 gnc_plugin_page_register_set_filter_tooltip (page);
2686 if (priv->enable_refresh)
2694 gnc_plugin_page_register_filter_time2dmy (
time64 raw_time)
2696 struct tm* timeinfo;
2697 gchar date_string[11];
2700 strftime (date_string, 11,
"%d-%m-%Y", timeinfo);
2701 PINFO (
"Date string is %s", date_string);
2704 return g_strdup (date_string);
2710 gnc_plugin_page_register_filter_dmy2time (
char* date_string)
2714 PINFO (
"Date string is %s", date_string);
2715 memset (&when, 0,
sizeof (when));
2717 sscanf (date_string,
"%d-%d-%d", &when.tm_mday,
2718 &when.tm_mon, &when.tm_year);
2721 when.tm_year -= 1900;
2745 g_return_if_fail (GTK_IS_CHECK_BUTTON (button));
2746 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
2748 name = gtk_buildable_get_name (GTK_BUILDABLE (button));
2749 ENTER (
"toggle button %s (%p), plugin_page %p", name, button, page);
2752 value = CLEARED_NONE;
2753 for (i = 0; status_actions[i].action_name; i++)
2755 if (g_strcmp0 (name, status_actions[i].action_name) == 0)
2757 value = status_actions[i].value;
2763 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2764 if (gtk_toggle_button_get_active (button))
2765 priv->fd.cleared_match = (cleared_match_t)(priv->fd.cleared_match | value);
2767 priv->fd.cleared_match = (cleared_match_t)(priv->fd.cleared_match & ~value);
2768 gnc_ppr_update_status_query (page);
2790 g_return_if_fail (GTK_IS_BUTTON (button));
2791 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
2793 ENTER (
"(button %p, page %p)", button, page);
2796 for (i = 0; status_actions[i].action_name; i++)
2798 widget = status_actions[i].widget;
2799 g_signal_handlers_block_by_func (widget,
2801 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
2802 g_signal_handlers_unblock_by_func (widget,
2807 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2808 priv->fd.cleared_match = CLEARED_ALL;
2809 gnc_ppr_update_status_query (page);
2832 g_return_if_fail (GTK_IS_BUTTON (button));
2833 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
2835 ENTER (
"(button %p, page %p)", button, page);
2838 for (i = 0; status_actions[i].action_name; i++)
2840 widget = status_actions[i].widget;
2841 g_signal_handlers_block_by_func (widget,
2843 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
2844 g_signal_handlers_unblock_by_func (widget,
2849 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2850 priv->fd.cleared_match = CLEARED_NONE;
2851 gnc_ppr_update_status_query (page);
2873 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2874 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
2875 priv->fd.start_date_choose)))
2877 time_val = gnc_date_edit_get_date (GNC_DATE_EDIT (priv->fd.start_date));
2879 priv->fd.start_time = time_val;
2883 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
2884 priv->fd.start_date_today)))
2890 priv->fd.start_time = 0;
2894 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
2895 priv->fd.end_date_choose)))
2897 time_val = gnc_date_edit_get_date (GNC_DATE_EDIT (priv->fd.end_date));
2899 priv->fd.end_time = time_val;
2903 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
2904 priv->fd.end_date_today)))
2910 priv->fd.end_time = 0;
2935 g_return_if_fail (GTK_IS_RADIO_BUTTON (button));
2936 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
2938 ENTER (
"(button %p, page %p)", button, page);
2939 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2940 name = gtk_buildable_get_name (GTK_BUILDABLE (button));
2941 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
2943 if (active && g_strcmp0 (name,
"filter_show_range") == 0)
2945 gtk_widget_set_sensitive (priv->fd.table, active);
2946 gtk_widget_set_sensitive (priv->fd.num_days, !active);
2947 get_filter_times (page);
2949 else if (active && g_strcmp0 (name,
"filter_show_days") == 0)
2951 gtk_widget_set_sensitive (priv->fd.table, !active);
2952 gtk_widget_set_sensitive (priv->fd.num_days, active);
2953 gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->fd.num_days), priv->fd.days);
2957 gtk_widget_set_sensitive (priv->fd.table, FALSE);
2958 gtk_widget_set_sensitive (priv->fd.num_days, FALSE);
2960 priv->fd.start_time = 0;
2961 priv->fd.end_time = 0;
2963 gnc_ppr_update_date_query (page);
2972 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page));
2974 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
2977 priv->fd.start_time = 0;
2978 priv->fd.end_time = 0;
2979 priv->fd.cleared_match = (cleared_match_t)g_ascii_strtoll (DEFAULT_FILTER, NULL, 16);
2981 gnc_ppr_update_date_query (GNC_PLUGIN_PAGE_REGISTER(plugin_page));
3000 g_return_if_fail (GTK_IS_SPIN_BUTTON (button));
3001 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3003 ENTER (
"(button %p, page %p)", button, page);
3004 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3006 priv->fd.days = gtk_spin_button_get_value (GTK_SPIN_BUTTON (button));
3007 gnc_ppr_update_date_query (page);
3023 gnc_plugin_page_register_filter_gde_changed_cb (GtkWidget* unused,
3026 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3028 ENTER (
"(widget %s(%p), page %p)",
3029 gtk_buildable_get_name (GTK_BUILDABLE (unused)), unused, page);
3030 get_filter_times (page);
3031 gnc_ppr_update_date_query (page);
3063 g_return_if_fail (GTK_IS_RADIO_BUTTON (radio));
3064 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3066 ENTER (
"(radio %s(%p), page %p)",
3067 gtk_buildable_get_name (GTK_BUILDABLE (radio)), radio, page);
3068 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3069 if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio)))
3071 LEAVE (
"1st callback of pair. Defer to 2nd callback.");
3075 name = gtk_buildable_get_name (GTK_BUILDABLE (radio));
3076 active = !g_strcmp0 (name,
"start_date_choose");
3077 gtk_widget_set_sensitive (priv->fd.start_date, active);
3078 get_filter_times (page);
3079 gnc_ppr_update_date_query (page);
3111 g_return_if_fail (GTK_IS_RADIO_BUTTON (radio));
3112 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3114 ENTER (
"(radio %s(%p), page %p)",
3115 gtk_buildable_get_name (GTK_BUILDABLE (radio)), radio, page);
3116 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3117 if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio)))
3119 LEAVE (
"1st callback of pair. Defer to 2nd callback.");
3123 name = gtk_buildable_get_name (GTK_BUILDABLE (radio));
3124 active = !g_strcmp0 (name,
"end_date_choose");
3125 gtk_widget_set_sensitive (priv->fd.end_date, active);
3126 get_filter_times (page);
3127 gnc_ppr_update_date_query (page);
3146 g_return_if_fail (GTK_IS_CHECK_BUTTON (button));
3147 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3149 ENTER (
"Save toggle button (%p), plugin_page %p", button, page);
3152 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3153 if (gtk_toggle_button_get_active (button))
3154 priv->fd.save_filter = TRUE;
3156 priv->fd.save_filter = FALSE;
3180 g_return_if_fail (GTK_IS_DIALOG (dialog));
3181 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3184 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3185 plugin_page = GNC_PLUGIN_PAGE (page);
3187 if (response != GTK_RESPONSE_OK)
3190 priv->fd.cleared_match = priv->fd.original_cleared_match;
3191 priv->enable_refresh = FALSE;
3192 gnc_ppr_update_status_query (page);
3193 priv->enable_refresh = TRUE;
3194 priv->fd.start_time = priv->fd.original_start_time;
3195 priv->fd.end_time = priv->fd.original_end_time;
3196 priv->fd.days = priv->fd.original_days;
3197 priv->fd.save_filter = priv->fd.original_save_filter;
3198 gnc_ppr_update_date_query (page);
3203 if ((priv->fd.save_filter == FALSE) && (priv->fd.original_save_filter == TRUE))
3204 gnc_plugin_page_register_set_filter (plugin_page, NULL);
3206 priv->fd.original_save_filter = priv->fd.save_filter;
3208 if (priv->fd.save_filter)
3211 GList *flist = NULL;
3214 flist = g_list_prepend
3215 (flist, g_strdup_printf (
"0x%04x", priv->fd.cleared_match));
3218 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->fd.start_date_choose)) && priv->fd.start_time != 0)
3219 flist = g_list_prepend (flist, gnc_plugin_page_register_filter_time2dmy (priv->fd.start_time));
3221 flist = g_list_prepend (flist, g_strdup (
"0"));
3224 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->fd.end_date_choose))
3225 && priv->fd.end_time != 0)
3226 flist = g_list_prepend (flist, gnc_plugin_page_register_filter_time2dmy (priv->fd.end_time));
3228 flist = g_list_prepend (flist, g_strdup (
"0"));
3231 if (priv->fd.days > 0)
3232 flist = g_list_prepend (flist, g_strdup_printf (
"%d", priv->fd.days));
3234 flist = g_list_prepend (flist, g_strdup (
"0"));
3236 flist = g_list_reverse (flist);
3238 PINFO (
"The filter to save is %s", filter);
3239 gnc_plugin_page_register_set_filter (plugin_page, filter);
3241 g_list_free_full (flist, g_free);
3244 priv->fd.dialog = NULL;
3245 gtk_widget_destroy (GTK_WIDGET (dialog));
3250 gpp_update_match_filter_text (cleared_match_t match,
const guint mask,
3251 const gchar* filter_name, GList **show, GList **hide)
3253 if ((match & mask) == mask)
3254 *show = g_list_prepend (*show, g_strdup (filter_name));
3256 *hide = g_list_prepend (*hide, g_strdup (filter_name));
3263 GList *t_list = NULL;
3265 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3268 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3271 if (priv->fd.start_time != 0)
3274 t_list = g_list_prepend
3275 (t_list, g_strdup_printf (
"%s %s", _(
"Start Date:"), sdate));
3280 if (priv->fd.days > 0)
3281 t_list = g_list_prepend
3282 (t_list, g_strdup_printf (
"%s %d", _(
"Show previous number of days:"),
3286 if (priv->fd.end_time != 0)
3289 t_list = g_list_prepend
3290 (t_list, g_strdup_printf (
"%s %s", _(
"End Date:"), edate));
3295 if (priv->fd.cleared_match != CLEARED_ALL)
3300 gpp_update_match_filter_text (priv->fd.cleared_match, 0x01, _ (
"Unreconciled"),
3302 gpp_update_match_filter_text (priv->fd.cleared_match, 0x02, _ (
"Cleared"),
3304 gpp_update_match_filter_text (priv->fd.cleared_match, 0x04, _ (
"Reconciled"),
3306 gpp_update_match_filter_text (priv->fd.cleared_match, 0x08, _ (
"Frozen"),
3308 gpp_update_match_filter_text (priv->fd.cleared_match, 0x10, _ (
"Voided"),
3311 show = g_list_reverse (show);
3312 hide = g_list_reverse (hide);
3317 t_list = g_list_prepend
3318 (t_list, g_strdup_printf (
"%s %s", _(
"Show:"), str));
3325 t_list = g_list_prepend
3326 (t_list, g_strdup_printf (
"%s %s", _(
"Hide:"), str));
3330 g_list_free_full (show, g_free);
3331 g_list_free_full (hide, g_free);
3334 t_list = g_list_reverse (t_list);
3337 t_list = g_list_prepend (t_list, g_strdup (_(
"Filter By:")));
3340 if (priv->gsr->filter_text != NULL)
3341 g_free (priv->gsr->filter_text);
3346 g_list_free_full (t_list, g_free);
3353 gnc_plugin_page_register_update_page_icon (
GncPluginPage* plugin_page)
3358 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page));
3360 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
3363 gnc_split_reg_get_read_only (priv->gsr))
3377 gnc_reg_get_name (GNCLedgerDisplay* ledger, gboolean for_window)
3381 gchar* account_name;
3384 GNCLedgerDisplayType ledger_type;
3390 ledger_type = gnc_ledger_display_type (ledger);
3394 case GENERAL_JOURNAL:
3397 reg_name = _ (
"General Journal");
3399 reg_name = _ (
"Transaction Report");
3401 case PORTFOLIO_LEDGER:
3403 reg_name = _ (
"Portfolio");
3405 reg_name = _ (
"Portfolio Report");
3409 reg_name = _ (
"Search Results");
3411 reg_name = _ (
"Search Results Report");
3415 reg_name = _ (
"Register");
3417 reg_name = _ (
"Transaction Report");
3423 if ((leader != NULL) && (ledger_type != LD_GL))
3427 if (ledger_type == LD_SINGLE)
3429 name = g_strconcat (account_name,
" - ", reg_name, NULL);
3433 name = g_strconcat (account_name,
" ", _ (
"and subaccounts"),
" - ", reg_name,
3436 g_free (account_name);
3439 name = g_strdup (reg_name);
3445 report_helper (GNCLedgerDisplay* ledger, Split* split,
Query* query)
3451 swig_type_info* qtype;
3458 func = scm_c_eval_string (
"gnc:register-report-create");
3459 g_return_val_if_fail (scm_is_procedure (func), -1);
3462 arg = scm_from_utf8_string (tmp ? tmp : _ (
"Credit"));
3463 args = scm_cons (arg, args);
3466 arg = scm_from_utf8_string (tmp ? tmp : _ (
"Debit"));
3467 args = scm_cons (arg, args);
3469 str = gnc_reg_get_name (ledger, FALSE);
3470 arg = scm_from_utf8_string (str ? str :
"");
3471 args = scm_cons (arg, args);
3474 arg = SCM_BOOL (reg->use_double_line);
3475 args = scm_cons (arg, args);
3477 arg = SCM_BOOL (reg->type == GENERAL_JOURNAL || reg->type == INCOME_LEDGER
3478 || reg->type == SEARCH_LEDGER);
3479 args = scm_cons (arg, args);
3481 arg = SCM_BOOL (reg->style == REG_STYLE_JOURNAL);
3482 args = scm_cons (arg, args);
3487 g_return_val_if_fail (query != NULL, -1);
3490 qtype = SWIG_TypeQuery (
"_p__QofQuery");
3491 g_return_val_if_fail (qtype, -1);
3493 arg = SWIG_NewPointerObj (query, qtype, 0);
3494 args = scm_cons (arg, args);
3495 g_return_val_if_fail (arg != SCM_UNDEFINED, -1);
3500 qtype = SWIG_TypeQuery (
"_p_Split");
3501 g_return_val_if_fail (qtype, -1);
3502 arg = SWIG_NewPointerObj (split, qtype, 0);
3508 args = scm_cons (arg, args);
3509 g_return_val_if_fail (arg != SCM_UNDEFINED, -1);
3512 qtype = SWIG_TypeQuery (
"_p_Account");
3513 g_return_val_if_fail (qtype, -1);
3516 arg = SWIG_NewPointerObj (account, qtype, 0);
3517 args = scm_cons (arg, args);
3518 g_return_val_if_fail (arg != SCM_UNDEFINED, -1);
3522 arg = scm_apply (func, args, SCM_EOL);
3523 g_return_val_if_fail (scm_is_exact (arg), -1);
3525 return scm_to_int (arg);
3533 gnc_plugin_page_register_cmd_print_check (GSimpleAction *simple,
3537 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3542 GList* splits = NULL, *item;
3543 GNCLedgerDisplayType ledger_type;
3544 Account* account, *subaccount = NULL;
3547 ENTER (
"(action %p, page %p)", simple, page);
3549 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3551 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3553 ledger_type = gnc_ledger_display_type (priv->ledger);
3555 if (ledger_type == LD_SINGLE || ledger_type == LD_SUBACCOUNT)
3560 if (ledger_type == LD_SUBACCOUNT)
3564 subaccount = account;
3571 splits = g_list_prepend (splits, split);
3572 gnc_ui_print_check_dialog_create (window, splits, subaccount);
3573 g_list_free (splits);
3582 splits = g_list_prepend (splits, split);
3583 gnc_ui_print_check_dialog_create (window, splits, subaccount);
3584 g_list_free (splits);
3589 else if (ledger_type == LD_GL && reg->type == SEARCH_LEDGER)
3597 for (item = splits; item; item = g_list_next (item))
3599 split = (Split*) item->data;
3600 if (common_acct == NULL)
3610 const gchar* title = _ (
"Print checks from multiple accounts?");
3611 const gchar* message =
3612 _ (
"This search result contains splits from more than one account. " 3613 "Do you want to print the checks even though they are not all " 3614 "from the same account?");
3615 dialog = gtk_message_dialog_new (GTK_WINDOW (window),
3616 GTK_DIALOG_DESTROY_WITH_PARENT,
3617 GTK_MESSAGE_WARNING,
3620 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
3622 gtk_dialog_add_button (GTK_DIALOG (dialog), _ (
"_Print checks"),
3624 response = gnc_dialog_run (GTK_DIALOG (dialog),
3625 GNC_PREF_WARN_CHECKPRINTING_MULTI_ACCT);
3626 gtk_widget_destroy (dialog);
3627 if (response != GTK_RESPONSE_YES)
3629 LEAVE (
"Multiple accounts");
3636 gnc_ui_print_check_dialog_create (window, splits, NULL);
3640 gnc_error_dialog (GTK_WINDOW (window),
"%s",
3641 _ (
"You can only print checks from a bank account register or search results."));
3642 LEAVE (
"Unsupported ledger type");
3650 gnc_plugin_page_register_cmd_cut (GSimpleAction *simple,
3654 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3657 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3659 ENTER (
"(action %p, page %p)", simple, page);
3660 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3662 GtkWidget *widget = gtk_window_get_focus(GTK_WINDOW (priv->gsr->window));
3663 const char *name = gtk_widget_get_name(widget);
3664 if (strcmp(name,
"GnucashSheet") != 0)
3666 gtk_editable_cut_clipboard( GTK_EDITABLE(widget));
3667 LEAVE(
"Not cut from GnucashSheet");
3672 gnucash_register_cut_clipboard (priv->gsr->reg);
3678 gnc_plugin_page_register_cmd_copy (GSimpleAction *simple,
3682 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3685 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3687 ENTER (
"(action %p, page %p)", simple, page);
3688 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3690 GtkWidget *widget = gtk_window_get_focus(GTK_WINDOW (priv->gsr->window));
3691 const char *name = gtk_widget_get_name(widget);
3692 if (strcmp(name,
"GnucashSheet") != 0)
3694 gtk_editable_copy_clipboard( GTK_EDITABLE(widget));
3695 LEAVE(
"Not copied from GnucashSheet");
3700 gnucash_register_copy_clipboard (priv->gsr->reg);
3706 gnc_plugin_page_register_cmd_paste (GSimpleAction *simple,
3710 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3713 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3715 ENTER (
"(action %p, page %p)", simple, page);
3716 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3718 GtkWidget *widget = gtk_window_get_focus(GTK_WINDOW (priv->gsr->window));
3719 const char *name = gtk_widget_get_name(widget);
3720 if (strcmp(name,
"GnucashSheet") != 0)
3722 gtk_editable_paste_clipboard( GTK_EDITABLE(widget));
3723 LEAVE(
"Not pasted to GnucashSheet");
3728 gnucash_register_paste_clipboard (priv->gsr->reg);
3734 gnc_plugin_page_register_cmd_edit_account (GSimpleAction *simple,
3738 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3741 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3743 ENTER (
"(action %p, page %p)", simple, page);
3752 gnc_plugin_page_register_cmd_find_account (GSimpleAction *simple,
3756 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3759 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3762 gnc_find_account_dialog (window, NULL);
3767 gnc_plugin_page_register_cmd_find_transactions (GSimpleAction *simple,
3771 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3775 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3777 ENTER (
"(action %p, page %p)", simple, page);
3778 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3780 gnc_ui_find_transactions_dialog_create (window, priv->ledger);
3786 gnc_plugin_page_register_cmd_edit_tax_options (GSimpleAction *simple,
3790 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3794 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3796 ENTER (
"(action %p, page %p)", simple, page);
3799 gnc_tax_info_dialog (window, account);
3804 gnc_plugin_page_register_cmd_cut_transaction (GSimpleAction *simple,
3808 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3811 ENTER (
"(action %p, page %p)", simple, page);
3813 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3815 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3816 gsr_default_cut_txn_handler (priv->gsr, NULL);
3822 gnc_plugin_page_register_cmd_copy_transaction (GSimpleAction *simple,
3826 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3830 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3832 ENTER (
"(action %p, page %p)", simple, page);
3833 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3841 gnc_plugin_page_register_cmd_paste_transaction (GSimpleAction *simple,
3845 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3849 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3851 ENTER (
"(action %p, page %p)", simple, page);
3852 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3860 gnc_plugin_page_register_cmd_void_transaction (GSimpleAction *simple,
3864 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3866 GtkWidget* dialog, *entry;
3869 GtkBuilder* builder;
3874 ENTER (
"(action %p, page %p)", simple, page);
3876 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3879 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3889 gnc_error_dialog (window,
"%s",
3890 _ (
"You cannot void a transaction with reconciled or cleared splits."));
3896 gnc_error_dialog (window,
3897 _ (
"This transaction is marked read-only with the comment: '%s'"), reason);
3901 if (!gnc_plugin_page_register_finish_pending (GNC_PLUGIN_PAGE (page)))
3904 builder = gtk_builder_new();
3905 gnc_builder_add_from_file (builder,
"gnc-plugin-page-register.glade",
3906 "void_transaction_dialog");
3907 dialog = GTK_WIDGET (gtk_builder_get_object (builder,
3908 "void_transaction_dialog"));
3909 entry = GTK_WIDGET (gtk_builder_get_object (builder,
"reason"));
3911 gtk_window_set_transient_for (GTK_WINDOW (dialog), window);
3913 result = gtk_dialog_run (GTK_DIALOG (dialog));
3914 if (result == GTK_RESPONSE_OK)
3916 reason = gtk_entry_get_text (GTK_ENTRY (entry));
3923 gtk_widget_destroy (dialog);
3924 g_object_unref (G_OBJECT (builder));
3929 gnc_plugin_page_register_cmd_unvoid_transaction (GSimpleAction *simple,
3933 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
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);
3951 static std::optional<time64>
3952 input_date (GtkWidget * parent,
const char *window_title,
const char* title)
3955 if (!gnc_dup_time64_dialog (parent, window_title, title, &rv))
3962 gnc_plugin_page_register_cmd_reverse_transaction (GSimpleAction *simple,
3966 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
3970 Transaction* trans, *new_trans;
3975 ENTER (
"(action %p, page %p)", simple, page);
3977 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3979 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3991 LEAVE (
"shouldn't try to reverse the blank transaction...");
3998 const char *rev = _(
"A reversing entry has already been created for this transaction.");
3999 const char *jump = _(
"Jump to the transaction?");
4000 if (!gnc_verify_dialog (GTK_WINDOW (window), TRUE,
"%s\n\n%s", rev, jump))
4002 LEAVE (
"reverse cancelled");
4008 auto date = input_date (window, _(
"Reverse Transaction"), _(
"New Transaction Information"));
4011 LEAVE (
"reverse cancelled");
4015 gnc_suspend_gui_refresh ();
4022 gnc_resume_gui_refresh();
4027 split = xaccTransFindSplitByAccount(new_trans, account);
4030 if (gnc_split_reg_clear_filter_for_split (gsr, split))
4033 gnc_split_reg_jump_to_split (gsr, split);
4041 GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (priv->ledger);
4044 if (ledger_type == LD_SINGLE || ledger_type == LD_SUBACCOUNT)
4050 case GENERAL_JOURNAL:
4055 case PORTFOLIO_LEDGER:
4065 gnc_plugin_page_register_cmd_view_sort_by (GSimpleAction *simple,
4069 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4072 GtkWidget* dialog, *button;
4073 GtkBuilder* builder;
4078 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4079 ENTER (
"(action %p, page %p)", simple, page);
4081 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4082 if (priv->sd.dialog)
4084 gtk_window_present (GTK_WINDOW (priv->sd.dialog));
4085 LEAVE (
"existing dialog");
4091 builder = gtk_builder_new();
4092 gnc_builder_add_from_file (builder,
"gnc-plugin-page-register.glade",
4094 dialog = GTK_WIDGET (gtk_builder_get_object (builder,
"sort_by_dialog"));
4095 priv->sd.dialog = dialog;
4096 gtk_window_set_transient_for (GTK_WINDOW (dialog),
4097 gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window)));
4099 title = g_strdup_printf (_ (
"Sort %s by…"),
4101 gtk_window_set_title (GTK_WINDOW (dialog), title);
4105 sort = gnc_split_reg_get_sort_type (priv->gsr);
4106 name = SortTypeasString (sort);
4107 button = GTK_WIDGET (gtk_builder_get_object (builder, name));
4108 DEBUG (
"current sort %d, button %s(%p)", sort, name, button);
4109 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4110 priv->sd.original_sort_type = sort;
4112 button = GTK_WIDGET (gtk_builder_get_object (builder,
"sort_save"));
4113 if (priv->sd.save_order == TRUE)
4114 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4117 gtk_widget_set_visible (GTK_WIDGET (button),
4118 gnc_plugin_page_register_show_fs_save (page));
4121 button = GTK_WIDGET (gtk_builder_get_object (builder,
"sort_reverse"));
4122 if (priv->sd.reverse_order == TRUE)
4123 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4124 priv->sd.original_reverse_order = priv->sd.reverse_order;
4126 priv->sd.num_radio = GTK_WIDGET (gtk_builder_get_object (builder,
"BY_NUM"));
4127 priv->sd.act_radio = GTK_WIDGET (gtk_builder_get_object (builder,
4131 if (reg && !reg->use_tran_num_for_num_field)
4133 gtk_button_set_label (GTK_BUTTON (priv->sd.num_radio),
4134 _ (
"Transaction Number"));
4135 gtk_button_set_label (GTK_BUTTON (priv->sd.act_radio), _ (
"Number/Action"));
4137 gnc_book_option_register_cb (OPTION_NAME_NUM_FIELD_SOURCE,
4138 (GncBOCb)gnc_plugin_page_register_sort_book_option_changed,
4142 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func,
4146 gtk_widget_show (dialog);
4147 g_object_unref (G_OBJECT (builder));
4152 gnc_plugin_page_register_cmd_view_filter_by (GSimpleAction *simple,
4156 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4158 GtkWidget* dialog, *toggle, *button, *
table, *hbox;
4159 time64 start_time, end_time, time_val;
4160 GtkBuilder* builder;
4161 gboolean sensitive, value;
4166 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4167 ENTER (
"(action %p, page %p)", simple, page);
4169 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4170 if (priv->fd.dialog)
4172 gtk_window_present (GTK_WINDOW (priv->fd.dialog));
4173 LEAVE (
"existing dialog");
4178 builder = gtk_builder_new();
4179 gnc_builder_add_from_file (builder,
"gnc-plugin-page-register.glade",
4181 gnc_builder_add_from_file (builder,
"gnc-plugin-page-register.glade",
4182 "filter_by_dialog");
4183 dialog = GTK_WIDGET (gtk_builder_get_object (builder,
"filter_by_dialog"));
4184 priv->fd.dialog = dialog;
4185 gtk_window_set_transient_for (GTK_WINDOW (dialog),
4186 gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window)));
4189 title = g_strdup_printf (_ (
"Filter %s by…"),
4191 gtk_window_set_title (GTK_WINDOW (dialog), title);
4195 for (i = 0; status_actions[i].action_name; i++)
4197 toggle = GTK_WIDGET (gtk_builder_get_object (builder,
4198 status_actions[i].action_name));
4199 value = priv->fd.cleared_match & status_actions[i].value;
4200 status_actions[i].widget = toggle;
4201 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), value);
4203 priv->fd.original_cleared_match = priv->fd.cleared_match;
4205 button = GTK_WIDGET (gtk_builder_get_object (builder,
"filter_save"));
4206 if (priv->fd.save_filter == TRUE)
4207 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4210 gtk_widget_set_visible (GTK_WIDGET (button),
4211 gnc_plugin_page_register_show_fs_save (page));
4214 priv->fd.num_days = GTK_WIDGET (gtk_builder_get_object (builder,
4215 "filter_show_num_days"));
4216 button = GTK_WIDGET (gtk_builder_get_object (builder,
"filter_show_days"));
4220 if (priv->fd.days > 0)
4222 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4223 gtk_widget_set_sensitive (GTK_WIDGET (priv->fd.num_days), TRUE);
4224 gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->fd.num_days), priv->fd.days);
4225 priv->fd.original_days = priv->fd.days;
4233 gtk_widget_set_sensitive (GTK_WIDGET (priv->fd.num_days), FALSE);
4234 priv->fd.original_days = 0;
4238 xaccQueryGetDateMatchTT (query, &start_time, &end_time);
4242 priv->fd.original_start_time = start_time;
4243 priv->fd.start_time = start_time;
4244 priv->fd.original_end_time = end_time;
4245 priv->fd.end_time = end_time;
4247 button = GTK_WIDGET (gtk_builder_get_object (builder,
"filter_show_range"));
4248 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), start_time ||
4250 table = GTK_WIDGET (gtk_builder_get_object (builder,
"select_range_table"));
4251 priv->fd.table =
table;
4252 gtk_widget_set_sensitive (GTK_WIDGET (
table), start_time || end_time);
4254 priv->fd.start_date_choose = GTK_WIDGET (gtk_builder_get_object (builder,
4255 "start_date_choose"));
4256 priv->fd.start_date_today = GTK_WIDGET (gtk_builder_get_object (builder,
4257 "start_date_today"));
4258 priv->fd.end_date_choose = GTK_WIDGET (gtk_builder_get_object (builder,
4259 "end_date_choose"));
4260 priv->fd.end_date_today = GTK_WIDGET (gtk_builder_get_object (builder,
4265 if (start_time == 0)
4267 button = GTK_WIDGET (gtk_builder_get_object (builder,
"start_date_earliest"));
4268 time_val = xaccQueryGetEarliestDateFound (query);
4273 time_val = start_time;
4277 button = priv->fd.start_date_today;
4282 button = priv->fd.start_date_choose;
4286 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4287 priv->fd.start_date = gnc_date_edit_new (
gnc_time (NULL), FALSE, FALSE);
4288 hbox = GTK_WIDGET (gtk_builder_get_object (builder,
"start_date_hbox"));
4289 gtk_box_pack_start (GTK_BOX (hbox), priv->fd.start_date, TRUE, TRUE, 0);
4290 gtk_widget_show (priv->fd.start_date);
4291 gtk_widget_set_sensitive (GTK_WIDGET (priv->fd.start_date), sensitive);
4292 gnc_date_edit_set_time (GNC_DATE_EDIT (priv->fd.start_date), time_val);
4293 g_signal_connect (G_OBJECT (priv->fd.start_date),
"date-changed",
4294 G_CALLBACK (gnc_plugin_page_register_filter_gde_changed_cb),
4302 button = GTK_WIDGET (gtk_builder_get_object (builder,
"end_date_latest"));
4303 time_val = xaccQueryGetLatestDateFound (query);
4308 time_val = end_time;
4312 button = priv->fd.end_date_today;
4317 button = priv->fd.end_date_choose;
4321 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4322 priv->fd.end_date = gnc_date_edit_new (
gnc_time (NULL), FALSE, FALSE);
4323 hbox = GTK_WIDGET (gtk_builder_get_object (builder,
"end_date_hbox"));
4324 gtk_box_pack_start (GTK_BOX (hbox), priv->fd.end_date, TRUE, TRUE, 0);
4325 gtk_widget_show (priv->fd.end_date);
4326 gtk_widget_set_sensitive (GTK_WIDGET (priv->fd.end_date), sensitive);
4327 gnc_date_edit_set_time (GNC_DATE_EDIT (priv->fd.end_date), time_val);
4328 g_signal_connect (G_OBJECT (priv->fd.end_date),
"date-changed",
4329 G_CALLBACK (gnc_plugin_page_register_filter_gde_changed_cb),
4334 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func,
4338 gtk_widget_show (dialog);
4339 g_object_unref (G_OBJECT (builder));
4344 gnc_plugin_page_register_cmd_reload (GSimpleAction *simple,
4348 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4352 ENTER (
"(action %p, page %p)", simple, page);
4354 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4356 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4362 LEAVE (
"register has pending edits");
4370 gnc_plugin_page_register_cmd_style_changed (GSimpleAction *simple,
4371 GVariant *parameter,
4374 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4378 ENTER (
"(action %p, page %p)", simple, page);
4380 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4382 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4386 g_action_change_state (G_ACTION(simple), parameter);
4388 gnc_split_reg_change_style (priv->gsr, value, priv->enable_refresh);
4390 gnc_plugin_page_register_ui_update (NULL, page);
4395 gnc_plugin_page_register_cmd_style_double_line (GSimpleAction *simple,
4396 GVariant *parameter,
4399 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4402 gboolean use_double_line;
4405 ENTER (
"(action %p, page %p)", simple, page);
4407 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
4409 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4412 state = g_action_get_state (G_ACTION(simple));
4414 g_action_change_state (G_ACTION(simple), g_variant_new_boolean (!g_variant_get_boolean (state)));
4416 use_double_line = !g_variant_get_boolean (state);
4418 if (use_double_line != reg->use_double_line)
4421 if (priv->enable_refresh)
4424 g_variant_unref (state);
4429 gnc_plugin_page_register_cmd_transfer (GSimpleAction *simple,
4433 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4435 GncWindow* gnc_window;
4438 ENTER (
"(action %p, page %p)", simple, page);
4440 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4443 gnc_window = GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window);
4444 window = GTK_WIDGET (gnc_window_get_gtk_window (gnc_window));
4445 gnc_xfer_dialog (window, account);
4450 gnc_plugin_page_register_cmd_reconcile (GSimpleAction *simple,
4454 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4457 RecnWindow* recnData;
4459 ENTER (
"(action %p, page %p)", simple, page);
4461 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4471 if (!gnc_plugin_page_register_finish_pending (GNC_PLUGIN_PAGE (page)))
4476 window = gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (
4478 recnData = recnWindow (GTK_WIDGET (window), account);
4479 gnc_ui_reconcile_window_raise (recnData);
4484 gnc_plugin_page_register_cmd_stock_assistant (GSimpleAction *simple,
4488 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4492 ENTER (
"(action %p, page %p)", simple, page);
4494 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4495 window = gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window));
4497 gnc_stock_transaction_assistant (GTK_WIDGET (window), account);
4503 gnc_plugin_page_register_cmd_autoclear (GSimpleAction *simple,
4507 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4510 AutoClearWindow* autoClearData;
4512 ENTER (
"(action %p, page %p)", simple, page);
4514 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4518 window = gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (
4520 autoClearData = autoClearWindow (GTK_WIDGET (window), account);
4521 gnc_ui_autoclear_window_raise (autoClearData);
4526 gnc_plugin_page_register_cmd_stock_split (GSimpleAction *simple,
4530 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4534 ENTER (
"(action %p, page %p)", simple, page);
4536 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4539 window = gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window));
4540 gnc_stock_split_dialog (GTK_WIDGET (window), account);
4545 gnc_plugin_page_register_cmd_lots (GSimpleAction *simple,
4549 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4553 ENTER (
"(action %p, page %p)", simple, page);
4555 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4557 window = gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (
4560 gnc_lot_viewer_dialog (window, account);
4565 gnc_plugin_page_register_cmd_enter_transaction (GSimpleAction *simple,
4569 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4572 ENTER (
"(action %p, page %p)", simple, page);
4574 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4576 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4577 gnc_split_reg_enter (priv->gsr, FALSE);
4582 gnc_plugin_page_register_cmd_cancel_transaction (GSimpleAction *simple,
4586 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4589 ENTER (
"(action %p, page %p)", simple, page);
4591 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4593 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4600 gnc_plugin_page_register_cmd_delete_transaction (GSimpleAction *simple,
4604 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4607 ENTER (
"(action %p, page %p)", simple, page);
4609 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4611 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4612 gsr_default_delete_handler (priv->gsr, NULL);
4618 gnc_plugin_page_register_cmd_linked_transaction (GSimpleAction *simple,
4622 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4625 ENTER (
"(action %p, page %p)", simple, page);
4627 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4629 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4630 gsr_default_doclink_handler (priv->gsr);
4631 gnc_plugin_page_register_ui_update (NULL, page);
4636 gnc_plugin_page_register_cmd_linked_transaction_open (GSimpleAction *simple,
4640 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4643 ENTER (
"(action %p, page %p)", simple, page);
4645 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4647 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4648 gsr_default_doclink_open_handler (priv->gsr);
4652 static GncInvoice* invoice_from_split (Split* split)
4654 GncInvoice* invoice;
4673 gnc_plugin_page_register_cmd_jump_linked_invoice (GSimpleAction *simple,
4677 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4680 GncInvoice* invoice;
4684 ENTER (
"(action %p, page %p)", simple, page);
4686 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4687 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4691 window = GNC_PLUGIN_PAGE(page)->window;
4695 auto invoices = invoices_from_transaction (txn);
4696 if (invoices.empty())
4697 PERR (
"shouldn't happen: if no invoices, function is never called");
4698 else if (invoices.size() == 1)
4699 invoice = invoices[0];
4702 GList *details = NULL;
4705 for (
const auto& inv : invoices)
4710 gnc_account_print_info (gncInvoiceGetPostedAcc (inv), TRUE));
4711 details = g_list_prepend
4716 g_strdup_printf (_(
"%s %s from %s, posted %s, amount %s"),
4717 gncInvoiceGetTypeString (inv),
4718 gncInvoiceGetID (inv),
4719 gncOwnerGetName (gncInvoiceGetOwner (inv)),
4723 details = g_list_reverse (details);
4724 choice = gnc_choose_radio_option_dialog
4725 (window, _(
"Select document"),
4726 _(
"Several documents are linked with this transaction. \ 4727 Please choose one:"), _(
"Select"), 0, details);
4728 if ((choice >= 0) && ((
size_t)choice < invoices.size()))
4729 invoice = invoices[choice];
4730 g_list_free_full (details, g_free);
4736 GtkWindow *gtk_window = gnc_window_get_gtk_window (GNC_WINDOW (window));
4737 gnc_ui_invoice_edit (gtk_window, invoice);
4744 gnc_plugin_page_register_cmd_blank_transaction (GSimpleAction *simple,
4748 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4752 ENTER (
"(action %p, page %p)", simple, page);
4754 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4756 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4762 gnc_split_reg_jump_to_blank (priv->gsr);
4767 find_after_date (Split *split,
time64* find_date)
4776 gnc_plugin_page_register_cmd_goto_date (GSimpleAction *simple,
4780 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4786 ENTER (
"(action %p, page %p)", simple, page);
4787 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4789 auto date = input_date (window, _(
"Go to Date"), _(
"Go to Date"));
4793 LEAVE (
"goto_date cancelled");
4804 auto it = g_list_find_custom (splits, &date.value(), (GCompareFunc)find_after_date);
4807 gnc_split_reg_jump_to_split (gsr, GNC_SPLIT(it->data));
4809 gnc_split_reg_jump_to_blank (gsr);
4811 g_list_free (splits);
4816 gnc_plugin_page_register_cmd_duplicate_transaction (GSimpleAction *simple,
4820 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4823 ENTER (
"(action %p, page %p)", simple, page);
4825 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4827 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4834 gnc_plugin_page_register_cmd_reinitialize_transaction (GSimpleAction *simple,
4838 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4841 ENTER (
"(action %p, page %p)", simple, page);
4843 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4845 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4846 gsr_default_reinit_handler (priv->gsr, NULL);
4851 gnc_plugin_page_register_cmd_expand_transaction (GSimpleAction *simple,
4852 GVariant *parameter,
4855 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4861 ENTER (
"(action %p, page %p)", simple, page);
4863 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4865 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4868 state = g_action_get_state (G_ACTION(simple));
4870 g_action_change_state (G_ACTION(simple), g_variant_new_boolean (!g_variant_get_boolean (state)));
4872 expand = !g_variant_get_boolean (state);
4875 g_variant_unref (state);
4882 gnc_plugin_page_register_cmd_exchange_rate (GSimpleAction *simple,
4886 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
4890 ENTER (
"(action %p, page %p)", simple, page);
4892 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
4894 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
4903 jump_multiple_splits_by_single_account (
Account *account, Split *split)
4907 Account *other_account = NULL;
4908 Split *other_split = NULL;
4916 Split *s = (Split*)splits->data;
4919 if (!xaccTransStillHasSplit(trans, s))
4927 if (other_account != a)
4939 other_split = split;
4945 jump_multiple_splits_by_value (
Account *account, Split *split, gboolean largest)
4949 Split *other_split = NULL;
4951 int cmp = largest ? 1 : -1;
4959 Split *s = (Split*)splits->data;
4962 if (!xaccTransStillHasSplit(trans, s))
4984 other_split = split;
4990 jump_multiple_splits (
Account* account, Split *split)
4992 GncPrefJumpMultSplits mode = (GncPrefJumpMultSplits)
gnc_prefs_get_enum(GNC_PREFS_GROUP_GENERAL_REGISTER, GNC_PREF_JUMP_MULT_SPLITS);
4996 case JUMP_LARGEST_VALUE_FIRST_SPLIT:
4997 return jump_multiple_splits_by_value (account, split, TRUE);
4999 case JUMP_SMALLEST_VALUE_FIRST_SPLIT:
5000 return jump_multiple_splits_by_value (account, split, FALSE);
5008 return jump_multiple_splits_by_single_account (account, split);
5012 gnc_plugin_page_register_cmd_jump (GSimpleAction *simple,
5016 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5026 gboolean multiple_splits;
5028 ENTER (
"(action %p, page %p)", simple, page);
5030 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5032 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5033 window = GNC_PLUGIN_PAGE (page)->window;
5036 LEAVE (
"no window");
5044 LEAVE (
"no split (1)");
5049 if (account == NULL)
5051 LEAVE (
"no account");
5056 multiple_splits = other_split == NULL;
5059 if (account == leader)
5062 if (cursor_class == CURSOR_CLASS_SPLIT)
5081 LEAVE (
"split for this account");
5085 if (multiple_splits)
5087 other_split = jump_multiple_splits (account, split);
5089 if (other_split == NULL)
5091 GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW(window),
5092 (GtkDialogFlags)(GTK_DIALOG_MODAL
5093 | GTK_DIALOG_DESTROY_WITH_PARENT),
5097 _(
"Unable to jump to other account"));
5099 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(dialog),
5100 "%s", _(
"This transaction involves more than one other account. Select a specific split to jump to that account."));
5101 gtk_dialog_add_button (GTK_DIALOG(dialog), _(
"_OK"), GTK_RESPONSE_OK);
5102 gnc_dialog_run (GTK_DIALOG(dialog), GNC_PREF_WARN_REG_TRANS_JUMP_MULTIPLE_SPLITS);
5103 gtk_widget_destroy (dialog);
5105 LEAVE (
"no split (2)");
5109 split = other_split;
5112 if (account == NULL)
5114 LEAVE (
"no account (2)");
5118 if (account == leader)
5120 GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW(window),
5121 (GtkDialogFlags)(GTK_DIALOG_MODAL
5122 | GTK_DIALOG_DESTROY_WITH_PARENT),
5126 _(
"Unable to jump to other account"));
5128 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(dialog),
5129 "%s", _(
"This transaction only involves the current account so there is no other account to jump to."));
5130 gtk_dialog_add_button (GTK_DIALOG(dialog), _(
"_OK"), GTK_RESPONSE_OK);
5131 gnc_dialog_run (GTK_DIALOG(dialog), GNC_PREF_WARN_REG_TRANS_JUMP_SINGLE_ACCOUNT);
5132 gtk_widget_destroy (dialog);
5134 LEAVE (
"register open for account");
5140 if (new_page == NULL)
5142 LEAVE (
"couldn't create new page");
5150 gboolean jump_twice = FALSE;
5156 if (new_page_reg->style != REG_STYLE_JOURNAL)
5160 if (gnc_split_reg_clear_filter_for_split (gsr, split))
5163 gnc_split_reg_jump_to_split (gsr, split);
5165 if (multiple_splits && jump_twice)
5171 gnc_split_reg_jump_to_split (gsr, split);
5177 gnc_plugin_page_register_cmd_schedule (GSimpleAction *simple,
5181 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5185 ENTER (
"(action %p, page %p)", simple, page);
5187 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5191 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5192 gsr_default_schedule_handler (priv->gsr, window);
5197 scrub_split (Split *split)
5203 g_return_if_fail (split);
5207 g_return_if_fail (trans);
5219 gnc_plugin_page_register_cmd_scrub_current (GSimpleAction *simple,
5223 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5228 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5230 ENTER (
"(action %p, page %p)", simple, page);
5232 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5236 LEAVE (
"no query found");
5242 gnc_suspend_gui_refresh();
5244 gnc_resume_gui_refresh();
5249 scrub_kp_handler (GtkWidget *widget, GdkEventKey *event, gpointer data)
5251 if (event->length == 0)
return FALSE;
5253 switch (event->keyval)
5255 case GDK_KEY_Escape:
5257 auto abort_scrub = gnc_verify_dialog (GTK_WINDOW(widget),
false,
5258 "%s", _(check_repair_abort_YN));
5272 gnc_plugin_page_register_cmd_scrub_all (GSimpleAction *simple,
5276 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5280 GList* node, *splits;
5281 gint split_count = 0, curr_split_no = 0;
5282 gulong scrub_kp_handler_ID;
5283 const char* message = _ (
"Checking splits in current register: %u of %u");
5285 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5287 ENTER (
"(action %p, page %p)", simple, page);
5289 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5293 LEAVE (
"no query found");
5297 gnc_suspend_gui_refresh();
5298 is_scrubbing = TRUE;
5300 window = GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window);
5301 scrub_kp_handler_ID = g_signal_connect (G_OBJECT (window),
"key-press-event",
5302 G_CALLBACK (scrub_kp_handler), NULL);
5303 gnc_window_set_progressbar_window (window);
5306 split_count = g_list_length (splits);
5307 for (node = splits; node && !gnc_get_abort_scrub (); node = node->next, curr_split_no++)
5309 auto split = GNC_SPLIT(node->data);
5311 if (!split)
continue;
5313 PINFO (
"Start processing split %d of %d",
5314 curr_split_no + 1, split_count);
5316 scrub_split (split);
5318 PINFO (
"Finished processing split %d of %d",
5319 curr_split_no + 1, split_count);
5321 if (curr_split_no % 10 == 0)
5323 char* progress_msg = g_strdup_printf (message, curr_split_no, split_count);
5324 gnc_window_show_progress (progress_msg, (100 * curr_split_no) / split_count);
5325 g_free (progress_msg);
5329 g_signal_handler_disconnect (G_OBJECT(window), scrub_kp_handler_ID);
5330 gnc_window_show_progress (NULL, -1.0);
5331 is_scrubbing = FALSE;
5332 show_abort_verify = TRUE;
5335 gnc_resume_gui_refresh();
5340 gnc_plugin_page_register_cmd_account_report (GSimpleAction *simple,
5344 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5346 GncMainWindow* window;
5349 ENTER (
"(action %p, page %p)", simple, page);
5351 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5353 window = GNC_MAIN_WINDOW (GNC_PLUGIN_PAGE (page)->window);
5354 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5355 id = report_helper (priv->ledger, NULL, NULL);
5357 gnc_main_window_open_report (
id, window);
5362 gnc_plugin_page_register_cmd_transaction_report (GSimpleAction *simple,
5366 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5368 GncMainWindow* window;
5375 ENTER (
"(action %p, page %p)", simple, page);
5377 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5379 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5386 query = qof_query_create_for (GNC_ID_SPLIT);
5391 GNC_ID_SPLIT, QOF_QUERY_AND);
5393 window = GNC_MAIN_WINDOW (GNC_PLUGIN_PAGE (page)->window);
5394 id = report_helper (priv->ledger, split, query);
5396 gnc_main_window_open_report (
id, window);
5412 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page));
5414 page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
5415 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5416 priv->lines_default = lines_default;
5417 priv->read_only = read_only;
5426 g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), NULL);
5428 page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
5429 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5435 gnc_plugin_page_help_changed_cb (GNCSplitReg* gsr,
5443 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (register_page));
5445 window = GNC_WINDOW (GNC_PLUGIN_PAGE (register_page)->window);
5455 (GNC_MAIN_WINDOW(window)) != GNC_PLUGIN_PAGE(register_page)))
5459 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (register_page);
5461 help = gnc_table_get_help (reg->table);
5462 gnc_window_set_status (window, GNC_PLUGIN_PAGE (register_page), help);
5467 gnc_plugin_page_popup_menu_cb (GNCSplitReg* gsr,
5472 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5474 window = GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window);
5482 GNC_PLUGIN_PAGE (page));
5486 gnc_plugin_page_register_refresh_cb (GHashTable* changes, gpointer user_data)
5488 auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
5491 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
5492 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5497 ei = gnc_gui_get_entity_events (changes, &priv->key);
5500 if (ei->event_mask & QOF_EVENT_DESTROY)
5505 if (ei->event_mask & QOF_EVENT_MODIFY)
5513 gnucash_register_refresh_from_prefs (priv->gsr->reg);
5514 gtk_widget_queue_draw (priv->widget);
5517 gnc_plugin_page_register_ui_update (NULL, page);
5521 gnc_plugin_page_register_close_cb (gpointer user_data)
5536 gppr_account_destroy_cb (
Account* account)
5540 GNCLedgerDisplayType ledger_type;
5543 GList* item, *kill = NULL;
5550 for (; citem; citem = g_list_next (citem))
5553 priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
5554 ledger_type = gnc_ledger_display_type (priv->ledger);
5555 if (ledger_type == LD_GL)
5557 kill = g_list_prepend (kill, page);
5560 else if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
5562 if (guid_compare (acct_guid, &priv->key) == 0)
5564 kill = g_list_prepend (kill, page);
5569 kill = g_list_reverse (kill);
5571 for (item = kill; item; item = g_list_next (item))
5594 gnc_plugin_page_register_event_handler (
QofInstance* entity,
5604 g_return_if_fail (page);
5605 if (!GNC_IS_TRANS (entity) && !GNC_IS_ACCOUNT (entity))
5608 ENTER (
"entity %p of type %d, page %p, event data %p",
5609 entity, event_type, page, ed);
5613 if (GNC_IS_ACCOUNT (entity))
5615 if (GNC_IS_MAIN_WINDOW (window))
5621 LEAVE (
"account is NULL");
5625 gchar *name = gnc_plugin_page_register_get_tab_name (GNC_PLUGIN_PAGE (page));
5628 gchar *long_name = gnc_plugin_page_register_get_long_name (GNC_PLUGIN_PAGE (page));
5631 gchar *color = gnc_plugin_page_register_get_tab_color (GNC_PLUGIN_PAGE (page));
5634 gnc_plugin_page_register_update_page_icon (GNC_PLUGIN_PAGE (page));
5640 LEAVE (
"tab contents updated");
5644 if (! (event_type & (QOF_EVENT_MODIFY | QOF_EVENT_DESTROY)))
5646 LEAVE (
"not a modify");
5649 trans = GNC_TRANS (entity);
5653 LEAVE (
"not in this book");
5657 if (GNC_IS_MAIN_WINDOW (window))
5660 if (visible_page != GNC_PLUGIN_PAGE (page))
5662 LEAVE (
"page not visible");
5667 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...