31 #include <glib/gi18n.h> 34 #include "gnc-split-reg.h" 40 #include "dialog-doclink.h" 41 #include "dialog-doclink-utils.h" 42 #include "dialog-sx-editor.h" 43 #include "dialog-sx-from-trans.h" 44 #include "gnc-component-manager.h" 45 #include "gnc-date-edit.h" 49 #include "gnc-gui-query.h" 57 #include "gnc-warnings.h" 59 #include "gnucash-register.h" 63 #include "dialog-utils.h" 66 static QofLogModule log_module = GNC_MOD_GUI;
69 void gnc_split_reg_raise( GNCSplitReg *gsr );
71 static GtkWidget* add_summary_label( GtkWidget *summarybar, gboolean pack_start,
72 const char *label_str, GtkWidget *extra );
74 static void gsr_summarybar_set_arrow_draw (GNCSplitReg *gsr);
76 static void gnc_split_reg_determine_read_only( GNCSplitReg *gsr, gboolean show_dialog );
77 static gboolean is_trans_readonly_and_warn (GtkWindow *parent, Transaction *trans);
80 static GtkWidget *gnc_split_reg_get_parent( GNCLedgerDisplay *ledger );
82 static void gsr_create_table( GNCSplitReg *gsr );
83 static void gsr_setup_table( GNCSplitReg *gsr );
84 static void gsr_setup_status_widgets( GNCSplitReg *gsr );
86 static void gsr_update_summary_label( GtkWidget *label,
87 xaccGetBalanceFn getter,
94 static void gsr_redraw_all_cb (GnucashRegister *g_reg, gpointer data);
96 static void gnc_split_reg_ld_destroy( GNCLedgerDisplay *ledger );
98 static Transaction* create_balancing_transaction(QofBook *book,
Account *account,
99 time64 statement_date, gnc_numeric balancing_amount);
101 void gsr_default_enter_handler ( GNCSplitReg *w, gpointer ud );
102 void gsr_default_cancel_handler ( GNCSplitReg *w, gpointer ud );
103 void gsr_default_delete_handler ( GNCSplitReg *w, gpointer ud );
104 void gsr_default_reinit_handler ( GNCSplitReg *w, gpointer ud );
105 void gsr_default_dup_handler ( GNCSplitReg *w, gpointer ud );
106 void gsr_default_schedule_handler ( GNCSplitReg *w, gpointer ud );
107 void gsr_default_expand_handler ( GNCSplitReg *w, gpointer ud );
108 void gsr_default_blank_handler ( GNCSplitReg *w, gpointer ud );
109 void gsr_default_jump_handler ( GNCSplitReg *w, gpointer ud );
110 void gsr_default_cut_handler ( GNCSplitReg *w, gpointer ud );
111 void gsr_default_cut_txn_handler ( GNCSplitReg *w, gpointer ud );
112 void gsr_default_copy_handler ( GNCSplitReg *w, gpointer ud );
113 void gsr_default_copy_txn_handler ( GNCSplitReg *w, gpointer ud );
114 void gsr_default_paste_handler ( GNCSplitReg *w, gpointer ud );
115 void gsr_default_paste_txn_handler( GNCSplitReg *w, gpointer ud );
116 void gsr_default_void_txn_handler ( GNCSplitReg *w, gpointer ud );
117 void gsr_default_unvoid_txn_handler ( GNCSplitReg *w, gpointer ud );
118 void gsr_default_reverse_txn_handler ( GNCSplitReg *w, gpointer ud );
119 void gsr_default_doclink_handler ( GNCSplitReg *w );
120 void gsr_default_doclink_open_handler ( GNCSplitReg *w );
121 void gsr_default_doclink_remove_handler ( GNCSplitReg *w );
122 static void gsr_default_doclink_from_sheet_handler ( GNCSplitReg *w );
124 static void gsr_emit_simple_signal ( GNCSplitReg *gsr,
const char *sigName );
125 static void gsr_emit_help_changed ( GnucashRegister *reg, gpointer user_data );
126 static void gsr_emit_show_popup_menu ( GnucashRegister *reg, gpointer user_data );
128 void gnc_split_reg_cut_cb(GtkWidget *w, gpointer data);
129 void gnc_split_reg_copy_cb(GtkWidget *w, gpointer data);
130 void gnc_split_reg_paste_cb(GtkWidget *w, gpointer data);
132 void gnc_split_reg_cut_trans_cb(GtkWidget *w, gpointer data);
133 void gnc_split_reg_copy_trans_cb(GtkWidget *w, gpointer data);
134 void gnc_split_reg_paste_trans_cb(GtkWidget *w, gpointer data);
135 void gnc_split_reg_void_trans_cb(GtkWidget *w, gpointer data);
136 void gnc_split_reg_unvoid_trans_cb(GtkWidget *w, gpointer data);
137 void gnc_split_reg_reverse_trans_cb(GtkWidget *w, gpointer data);
139 void gnc_split_reg_record_cb (GnucashRegister *reg, gpointer data);
140 void gnc_split_reg_reinitialize_trans_cb(GtkWidget *w, gpointer data);
141 void gnc_split_reg_delete_trans_cb(GtkWidget *w, gpointer data);
142 void gnc_split_reg_duplicate_trans_cb(GtkWidget *w, gpointer data);
143 void gnc_split_reg_recur_cb(GtkWidget *w, gpointer data);
144 void gnc_split_reg_record_trans_cb(GtkWidget *w, gpointer data);
145 void gnc_split_reg_cancel_trans_cb(GtkWidget *w, gpointer data);
147 void gnc_split_reg_expand_trans_menu_cb(GtkWidget *widget, gpointer data);
148 void gnc_split_reg_expand_trans_toolbar_cb(GtkWidget *widget, gpointer data);
149 void gnc_split_reg_new_trans_cb(GtkWidget *widget, gpointer data);
150 void gnc_split_reg_jump_cb(GtkWidget *widget, gpointer data);
152 void gnc_split_reg_style_ledger_cb (GtkWidget *w, gpointer data);
153 void gnc_split_reg_style_auto_ledger_cb (GtkWidget *w, gpointer data);
154 void gnc_split_reg_style_journal_cb (GtkWidget *w, gpointer data);
155 void gnc_split_reg_double_line_cb (GtkWidget *w, gpointer data);
157 void gnc_split_reg_sort_standard_cb (GtkWidget *w, gpointer data);
158 void gnc_split_reg_sort_date_cb (GtkWidget *w, gpointer data);
159 void gnc_split_reg_sort_date_entered_cb (GtkWidget *w, gpointer data);
160 void gnc_split_reg_sort_date_reconciled_cb (GtkWidget *w, gpointer data);
161 void gnc_split_reg_sort_num_cb (GtkWidget *w, gpointer data);
162 void gnc_split_reg_sort_amount_cb (GtkWidget *w, gpointer data);
163 void gnc_split_reg_sort_memo_cb (GtkWidget *w, gpointer data);
164 void gnc_split_reg_sort_desc_cb (GtkWidget *w, gpointer data);
165 void gnc_split_reg_sort_action_cb (GtkWidget *w, gpointer data);
166 void gnc_split_reg_sort_notes_cb (GtkWidget *w, gpointer data);
169 void gnc_split_reg_size_allocate( GtkWidget *widget,
170 GtkAllocation *allocation,
171 gpointer user_data );
174 static void gnc_split_reg_init2( GNCSplitReg *gsr );
175 void gnc_split_reg_dispose(GObject *obj);
177 FROM_STRING_FUNC(SortType, ENUM_LIST_SORTTYPE)
178 AS_STRING_FUNC(SortType, ENUM_LIST_SORTTYPE)
180 G_DEFINE_TYPE (GNCSplitReg, gnc_split_reg, GTK_TYPE_BOX)
183 enum gnc_split_reg_signal_enum
204 SHOW_POPUP_MENU_SIGNAL,
209 static guint gnc_split_reg_signals[LAST_SIGNAL] = { 0 };
212 gnc_split_reg_class_init( GNCSplitRegClass *klass )
215 GObjectClass *object_class;
216 static struct similar_signal_info
218 enum gnc_split_reg_signal_enum s;
219 const char *signal_name;
223 { ENTER_ENT_SIGNAL,
"enter_ent", G_STRUCT_OFFSET( GNCSplitRegClass, enter_ent_cb ) },
224 { CANCEL_ENT_SIGNAL,
"cancel_ent", G_STRUCT_OFFSET( GNCSplitRegClass, cancel_ent_cb ) },
225 { DELETE_ENT_SIGNAL,
"delete_ent", G_STRUCT_OFFSET( GNCSplitRegClass, delete_ent_cb ) },
226 { REINIT_ENT_SIGNAL,
"reinit_ent", G_STRUCT_OFFSET( GNCSplitRegClass, reinit_ent_cb ) },
227 { DUP_ENT_SIGNAL,
"dup_ent", G_STRUCT_OFFSET( GNCSplitRegClass, dup_ent_cb ) },
228 { SCHEDULE_ENT_SIGNAL,
"schedule_ent", G_STRUCT_OFFSET( GNCSplitRegClass, schedule_ent_cb ) },
229 { EXPAND_ENT_SIGNAL,
"expand_ent", G_STRUCT_OFFSET( GNCSplitRegClass, expand_ent_cb ) },
230 { BLANK_SIGNAL,
"blank", G_STRUCT_OFFSET( GNCSplitRegClass, blank_cb ) },
231 { JUMP_SIGNAL,
"jump", G_STRUCT_OFFSET( GNCSplitRegClass, jump_cb ) },
232 { CUT_SIGNAL,
"cut", G_STRUCT_OFFSET( GNCSplitRegClass, cut_cb ) },
233 { CUT_TXN_SIGNAL,
"cut_txn", G_STRUCT_OFFSET( GNCSplitRegClass, cut_txn_cb ) },
234 { COPY_SIGNAL,
"copy", G_STRUCT_OFFSET( GNCSplitRegClass, copy_cb ) },
235 { COPY_TXN_SIGNAL,
"copy_txn", G_STRUCT_OFFSET( GNCSplitRegClass, copy_txn_cb ) },
236 { PASTE_SIGNAL,
"paste", G_STRUCT_OFFSET( GNCSplitRegClass, paste_cb ) },
237 { PASTE_TXN_SIGNAL,
"paste_txn", G_STRUCT_OFFSET( GNCSplitRegClass, paste_txn_cb ) },
238 { VOID_TXN_SIGNAL,
"void_txn", G_STRUCT_OFFSET( GNCSplitRegClass, void_txn_cb ) },
239 { UNVOID_TXN_SIGNAL,
"unvoid_txn", G_STRUCT_OFFSET( GNCSplitRegClass, unvoid_txn_cb ) },
240 { REVERSE_TXN_SIGNAL,
"reverse_txn", G_STRUCT_OFFSET( GNCSplitRegClass, reverse_txn_cb ) },
241 { HELP_CHANGED_SIGNAL,
"help-changed", G_STRUCT_OFFSET( GNCSplitRegClass, help_changed_cb ) },
242 { SHOW_POPUP_MENU_SIGNAL,
"show-popup-menu", G_STRUCT_OFFSET( GNCSplitRegClass, show_popup_menu_cb ) },
243 { LAST_SIGNAL, NULL, 0 }
246 object_class = (GObjectClass*) klass;
248 for ( i = 0; signals[i].s != LAST_SIGNAL; i++ )
250 gnc_split_reg_signals[ signals[i].s ] =
251 g_signal_new( signals[i].signal_name,
252 G_TYPE_FROM_CLASS(object_class),
254 signals[i].defaultOffset,
256 g_cclosure_marshal_VOID__VOID,
261 klass->enter_ent_cb = gsr_default_enter_handler;
262 klass->cancel_ent_cb = gsr_default_cancel_handler;
263 klass->delete_ent_cb = gsr_default_delete_handler;
264 klass->reinit_ent_cb = gsr_default_reinit_handler;
265 klass->dup_ent_cb = gsr_default_dup_handler;
266 klass->schedule_ent_cb = gsr_default_schedule_handler;
267 klass->expand_ent_cb = gsr_default_expand_handler;
268 klass->blank_cb = gsr_default_blank_handler;
269 klass->jump_cb = gsr_default_jump_handler;
270 klass->cut_cb = gsr_default_cut_handler;
271 klass->cut_txn_cb = gsr_default_cut_txn_handler;
272 klass->copy_cb = gsr_default_copy_handler;
273 klass->copy_txn_cb = gsr_default_copy_txn_handler;
274 klass->paste_cb = gsr_default_paste_handler;
275 klass->paste_txn_cb = gsr_default_paste_txn_handler;
276 klass->void_txn_cb = gsr_default_void_txn_handler;
277 klass->unvoid_txn_cb = gsr_default_unvoid_txn_handler;
278 klass->reverse_txn_cb = gsr_default_reverse_txn_handler;
280 klass->help_changed_cb = NULL;
281 klass->show_popup_menu_cb = NULL;
283 object_class->dispose = gnc_split_reg_dispose;
287 gnc_split_reg_new( GNCLedgerDisplay *ld,
292 GNCSplitReg *gsrToRet;
294 ENTER(
"ld=%p, parent=%p, numberOfLines=%d, read_only=%s",
295 ld, parent, numberOfLines, read_only ?
"TRUE" :
"FALSE");
297 gsrToRet = g_object_new( gnc_split_reg_get_type(), NULL );
299 gsrToRet->numRows = numberOfLines;
300 gsrToRet->read_only = read_only;
302 gsrToRet->ledger = ld;
303 gsrToRet->window = GTK_WIDGET(parent);
305 gnc_split_reg_init2( gsrToRet );
307 LEAVE(
"%p", gsrToRet);
308 return GTK_WIDGET( gsrToRet );
312 gnc_split_reg_init( GNCSplitReg *gsr )
314 gtk_orientable_set_orientation (GTK_ORIENTABLE(gsr), GTK_ORIENTATION_VERTICAL);
316 gsr->sort_type = BY_STANDARD;
317 gsr->sort_rev = FALSE;
318 gsr->sort_arrow_handler_id = 0;
319 gsr->filter_text = NULL;
323 gsr->read_only = FALSE;
327 gnc_split_reg_pref_acc_labels (gpointer prefs, gchar *pref, gpointer user_data)
329 GNCSplitReg *gsr = user_data;
330 gnucash_register_refresh_from_prefs (gsr->reg);
334 gnc_split_reg_init2( GNCSplitReg *gsr )
338 gnc_split_reg_determine_read_only( gsr, TRUE );
340 gsr_setup_status_widgets( gsr );
342 gsr_create_table( gsr );
343 gsr_setup_table( gsr );
346 GNC_PREF_ACCOUNTING_LABELS,
347 gnc_split_reg_pref_acc_labels,
353 gsr_setup_table( GNCSplitReg *gsr )
357 ENTER(
"gsr=%p", gsr);
368 gsr_move_sort_and_filter_to_state_file (GNCSplitReg *gsr, GKeyFile* state_file,
const gchar *state_section)
370 GNCLedgerDisplayType ledger_type;
373 ledger_type = gnc_ledger_display_type (gsr->ledger);
376 if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
379 const char* kvp_filter = NULL;
380 const char* kvp_sort_order = NULL;
381 gboolean kvp_sort_reversed = FALSE;
386 gchar *temp_filter_text = g_strdup (kvp_filter);
388 g_strdelimit (temp_filter_text,
",",
';');
389 g_key_file_set_string (state_file, state_section, KEY_PAGE_FILTER,
391 g_free (temp_filter_text);
398 g_key_file_set_string (state_file, state_section,
399 KEY_PAGE_SORT, kvp_sort_order);
404 if (kvp_sort_reversed)
406 g_key_file_set_boolean (state_file, state_section,
407 KEY_PAGE_SORT_REV, kvp_sort_reversed);
414 gsr_get_register_state_section (GNCSplitReg *gsr)
416 GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (gsr->ledger);
420 gchar *register_state_section;
424 if (ledger_type == LD_SUBACCOUNT)
425 register_state_section = g_strconcat (STATE_SECTION_REG_PREFIX,
" ", guidstr,
"+", NULL);
427 register_state_section = g_strconcat (STATE_SECTION_REG_PREFIX,
" ", guidstr, NULL);
429 return register_state_section;
434 gsr_create_table( GNCSplitReg *gsr )
436 GtkWidget *register_widget = NULL;
437 SplitRegister *sr = NULL;
439 gchar *register_state_section;
442 register_state_section = gsr_get_register_state_section (gsr);
444 ENTER(
"gsr=%p", gsr);
450 gnc_split_reg_ld_destroy,
451 gnc_split_reg_get_parent );
456 gsr->reg = GNUCASH_REGISTER( register_widget );
458 gtk_box_pack_start (GTK_BOX (gsr), GTK_WIDGET(gsr->reg), TRUE, TRUE, 0);
459 gnucash_sheet_set_window (gnucash_register_get_sheet (gsr->reg), gsr->window);
462 gnucash_register_set_open_doclink_cb (gsr->reg,
463 (GFunc)gsr_default_doclink_from_sheet_handler, gsr);
465 gtk_widget_show ( GTK_WIDGET(gsr->reg) );
466 g_signal_connect (gsr->reg,
"activate_cursor",
467 G_CALLBACK(gnc_split_reg_record_cb), gsr);
468 g_signal_connect (gsr->reg,
"redraw_all",
469 G_CALLBACK(gsr_redraw_all_cb), gsr);
470 g_signal_connect (gsr->reg,
"redraw_help",
471 G_CALLBACK(gsr_emit_help_changed), gsr);
472 g_signal_connect (gsr->reg,
"show_popup_menu",
473 G_CALLBACK(gsr_emit_show_popup_menu), gsr);
475 gsr_move_sort_and_filter_to_state_file (gsr, state_file, register_state_section);
477 g_free (register_state_section);
483 gsr_setup_status_widgets( GNCSplitReg *gsr )
486 gboolean use_double_line;
496 gnc_split_reg_dispose(GObject *obj)
498 GNCSplitReg *gsr = GNC_SPLIT_REG(obj);
500 if (gsr->filter_text)
501 g_free (gsr->filter_text);
502 gsr->filter_text = NULL;
505 GNC_PREF_ACCOUNTING_LABELS,
506 gnc_split_reg_pref_acc_labels,
511 g_signal_handlers_disconnect_by_data (gsr->reg, gsr);
512 gtk_widget_destroy (GTK_WIDGET (gsr->reg));
521 gnc_split_reg_raise( GNCSplitReg *gsr )
526 if (gsr->window == NULL)
529 gtk_window_present( GTK_WINDOW(gsr->window) );
539 gsr_update_summary_label( GtkWidget *label,
540 xaccGetBalanceFn getter,
543 gnc_commodity *cmdty,
549 const gchar *label_str = NULL;
550 GtkWidget *text_label, *hbox;
556 hbox = g_object_get_data (G_OBJECT(label),
"text_box");
557 text_label = g_object_get_data (G_OBJECT(label),
"text_label");
558 label_str = gtk_label_get_text (GTK_LABEL(text_label));
560 amount = (*getter)( leader );
571 strcat(
string,
" / " );
573 gnc_convert_to_euro( cmdty, amount ),
574 gnc_commodity_print_info( gnc_get_euro(), TRUE ) );
577 gnc_set_label_color( label, amount );
579 gtk_label_set_text( GTK_LABEL(label), bidi_string );
580 g_free (bidi_string);
584 gchar *tooltip = g_strdup_printf (
"%s %s", label_str,
string);
585 gtk_widget_set_tooltip_text (GTK_WIDGET(hbox), tooltip);
592 gsr_redraw_all_cb (GnucashRegister *g_reg, gpointer data)
594 GNCSplitReg *gsr = data;
595 gnc_commodity * commodity;
602 if ( gsr->summarybar == NULL )
610 if (commodity != NULL)
611 euro = (gnc_is_euro_currency( commodity ) &&
616 print_info = gnc_account_print_info( leader, TRUE );
617 reverse = gnc_reverse_balance( leader );
619 if (gsr->balance_label != NULL)
621 gsr_update_summary_label( gsr->balance_label,
622 xaccAccountGetPresentBalance,
623 leader, print_info, commodity, reverse, euro );
624 gsr_update_summary_label( gsr->cleared_label,
626 leader, print_info, commodity, reverse, euro );
627 gsr_update_summary_label( gsr->reconciled_label,
629 leader, print_info, commodity, reverse, euro );
630 gsr_update_summary_label( gsr->future_label,
632 leader, print_info, commodity, reverse, euro );
633 gsr_update_summary_label( gsr->projectedminimum_label,
634 xaccAccountGetProjectedMinimumBalance,
635 leader, print_info, commodity, reverse, euro );
639 if (gsr->sort_label != NULL)
641 gchar *old_tt_text = gtk_widget_get_tooltip_text (GTK_WIDGET(gsr->sort_label));
645 switch (gsr->sort_type)
651 text = _(
"Standard Order");
657 text = _(
"Date of Entry");
660 text = _(
"Statement Date");
672 text = _(
"Description");
683 gtk_widget_set_tooltip_text (GTK_WIDGET(gsr->sort_label), _(
"Descending"));
685 gtk_widget_set_tooltip_text (GTK_WIDGET(gsr->sort_label), _(
"Ascending"));
687 new_tt_text = gtk_widget_get_tooltip_text (GTK_WIDGET(gsr->sort_label));
690 if (g_strcmp0 (old_tt_text, new_tt_text) != 0)
691 gsr_summarybar_set_arrow_draw (gsr);
694 g_free (old_tt_text);
697 g_free (new_tt_text);
699 gtk_label_set_text (GTK_LABEL(gsr->sort_label), text);
703 if (gsr->filter_label != NULL)
705 gchar *old_tt_text = gtk_widget_get_tooltip_text (GTK_WIDGET(gsr->filter_label));
708 if (g_strcmp0 (old_tt_text, gsr->filter_text) != 0)
710 if (gsr->filter_text != NULL)
711 gtk_label_set_text (GTK_LABEL(gsr->filter_label), _(
"Filtered"));
713 gtk_label_set_text (GTK_LABEL(gsr->filter_label),
"");
715 gtk_widget_set_tooltip_text (GTK_WIDGET(gsr->filter_label), gsr->filter_text);
718 g_free (old_tt_text);
721 if (gsr->shares_label == NULL && gsr->value_label == NULL)
728 if (gsr->shares_label != NULL)
731 print_info = gnc_account_print_info( leader, TRUE );
733 gnc_set_label_color( gsr->shares_label, amount );
734 gtk_label_set_text( GTK_LABEL(gsr->shares_label),
string );
738 if (gsr->value_label != NULL)
741 QofBook *book = gnc_account_get_book (leader);
746 commodity, currency);
747 print_info = gnc_commodity_print_info (currency, TRUE);
749 gnc_set_label_color (gsr->value_label, amount);
750 gtk_label_set_text (GTK_LABEL (gsr->value_label),
string);
756 gnc_split_reg_ld_destroy( GNCLedgerDisplay *ledger )
758 GNCSplitReg *gsr = gnc_ledger_display_get_user_data( ledger );
763 gchar *register_state_section = gsr_get_register_state_section (gsr);
766 if (reg && reg->table)
773 g_free (register_state_section);
777 g_object_unref (gsr);
781 gsr_default_cut_handler( GNCSplitReg *gsr, gpointer data )
783 gnucash_register_cut_clipboard( gsr->reg );
790 gnc_split_reg_cut_cb (GtkWidget *w, gpointer data)
792 GNCSplitReg *gsr = data;
793 gsr_emit_simple_signal( gsr,
"cut" );
797 gsr_default_copy_handler( GNCSplitReg *gsr, gpointer data )
799 gnucash_register_copy_clipboard( gsr->reg );
806 gnc_split_reg_copy_cb (GtkWidget *w, gpointer data)
808 GNCSplitReg *gsr = data;
809 gsr_emit_simple_signal( gsr,
"copy" );
813 gsr_default_paste_handler( GNCSplitReg *gsr, gpointer data )
815 gnucash_register_paste_clipboard( gsr->reg );
822 gnc_split_reg_paste_cb (GtkWidget *w, gpointer data)
824 GNCSplitReg *gsr = data;
825 gsr_emit_simple_signal( gsr,
"paste" );
829 gsr_default_cut_txn_handler (GNCSplitReg *gsr, gpointer data)
837 const gchar *warning;
860 if (split == blank_split)
867 if (cursor_class == CURSOR_CLASS_NONE)
871 if (is_trans_readonly_and_warn (GTK_WINDOW(gsr->window), trans))
875 if (cursor_class == CURSOR_CLASS_SPLIT)
877 const char *format = _(
"Cut the split '%s' from the transaction '%s'?");
878 const char *recn_warn = _(
"You would be removing a reconciled split! " 879 "This is not a good idea as it will cause your " 880 "reconciled balance to be off.");
881 const char *anchor_error = _(
"You cannot cut this split.");
882 const char *anchor_split = _(
"This is the split anchoring this transaction " 883 "to the register. You may not remove it from " 884 "this register window. You may remove the " 885 "entire transaction from this window, or you " 886 "may navigate to a register that shows " 887 "another side of this same transaction and " 888 "remove the split from that register.");
894 if (reg->type != GENERAL_JOURNAL)
898 dialog = gtk_message_dialog_new (GTK_WINDOW(gsr->window),
900 | GTK_DIALOG_DESTROY_WITH_PARENT,
904 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(dialog),
906 gtk_dialog_run (GTK_DIALOG(dialog));
907 gtk_widget_destroy (dialog);
912 memo = (memo && *memo) ? memo : _(
"(no memo)");
915 desc = (desc && *desc) ? desc : _(
"(no description)");
918 buf = g_strdup_printf (format, memo, desc);
919 dialog = gtk_message_dialog_new (GTK_WINDOW(gsr->window),
921 | GTK_DIALOG_DESTROY_WITH_PARENT,
922 GTK_MESSAGE_QUESTION,
929 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(dialog),
931 warning = GNC_PREF_WARN_REG_SPLIT_CUT_RECD;
935 warning = GNC_PREF_WARN_REG_SPLIT_CUT;
938 gtk_dialog_add_button (GTK_DIALOG(dialog),
939 _(
"_Cancel"), GTK_RESPONSE_CANCEL);
940 gnc_gtk_dialog_add_button (dialog, _(
"_Cut Split"),
941 "edit-delete", GTK_RESPONSE_ACCEPT);
942 response = gnc_dialog_run (GTK_DIALOG(dialog), warning);
943 gtk_widget_destroy (dialog);
944 if (response != GTK_RESPONSE_ACCEPT)
954 const char *title = _(
"Cut the current transaction?");
955 const char *recn_warn = _(
"You would be removing a transaction " 956 "with reconciled splits! " 957 "This is not a good idea as it will cause your " 958 "reconciled balance to be off.");
960 dialog = gtk_message_dialog_new (GTK_WINDOW(gsr->window),
962 | GTK_DIALOG_DESTROY_WITH_PARENT,
968 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(dialog),
970 warning = GNC_PREF_WARN_REG_TRANS_CUT_RECD;
974 warning = GNC_PREF_WARN_REG_TRANS_CUT;
976 gtk_dialog_add_button (GTK_DIALOG(dialog),
977 _(
"_Cancel"), GTK_RESPONSE_CANCEL);
978 gnc_gtk_dialog_add_button (dialog, _(
"_Cut Transaction"),
979 "edit-delete", GTK_RESPONSE_ACCEPT);
980 response = gnc_dialog_run (GTK_DIALOG(dialog), warning);
981 gtk_widget_destroy (dialog);
982 if (response != GTK_RESPONSE_ACCEPT)
994 gnc_split_reg_cut_trans_cb (GtkWidget *w, gpointer data)
996 GNCSplitReg *gsr = data;
997 gsr_emit_simple_signal( gsr,
"cut_txn" );
1001 gsr_default_copy_txn_handler( GNCSplitReg *gsr, gpointer data )
1011 gnc_split_reg_copy_trans_cb(GtkWidget *w, gpointer data)
1013 GNCSplitReg *gsr = data;
1014 gsr_emit_simple_signal( gsr,
"copy_txn" );
1018 gsr_default_paste_txn_handler( GNCSplitReg *gsr, gpointer data )
1028 gnc_split_reg_paste_trans_cb (GtkWidget *w, gpointer data)
1030 GNCSplitReg *gsr = data;
1031 gsr_emit_simple_signal( gsr,
"paste_txn" );
1042 gsr_default_void_txn_handler (GNCSplitReg *gsr, gpointer data)
1048 gnc_split_reg_void_trans_cb (GtkWidget *w, gpointer data)
1050 GNCSplitReg *gsr = data;
1051 gsr_emit_simple_signal( gsr,
"void_txn" );
1062 gsr_default_unvoid_txn_handler (GNCSplitReg *gsr, gpointer data)
1068 gnc_split_reg_unvoid_trans_cb (GtkWidget *w, gpointer data)
1070 GNCSplitReg *gsr = data;
1071 gsr_emit_simple_signal( gsr,
"unvoid_txn" );
1082 gsr_default_reverse_txn_handler (GNCSplitReg *gsr, gpointer data)
1085 Transaction *trans, *new_trans;
1094 gnc_error_dialog (GTK_WINDOW (gsr->window),
"%s",
1095 _(
"A reversing entry has already been created for this transaction."));
1110 gnc_split_reg_reverse_trans_cb (GtkWidget *w, gpointer data)
1112 GNCSplitReg *gsr = data;
1113 gsr_emit_simple_signal( gsr,
"reverse_txn" );
1118 is_trans_readonly_and_warn (GtkWindow *parent, Transaction *trans)
1121 const gchar *reason;
1122 const gchar *title = _(
"Cannot modify or delete this transaction.");
1123 const gchar *message =
1124 _(
"This transaction is marked read-only with the comment: '%s'");
1126 if (!trans)
return FALSE;
1130 dialog = gtk_message_dialog_new(parent,
1135 gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
1136 "%s", _(
"The date of this transaction is older than the \"Read-Only Threshold\" set for this book. " 1137 "This setting can be changed in File->Properties->Accounts."));
1138 gtk_dialog_run(GTK_DIALOG(dialog));
1139 gtk_widget_destroy(dialog);
1146 dialog = gtk_message_dialog_new(parent,
1151 gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
1153 gtk_dialog_run(GTK_DIALOG(dialog));
1154 gtk_widget_destroy(dialog);
1162 gsr_default_reinit_handler( GNCSplitReg *gsr, gpointer data )
1164 VirtualCellLocation vcell_loc;
1170 const gchar *warning;
1172 const char *title = _(
"Remove the splits from this transaction?");
1173 const char *recn_warn = _(
"This transaction contains reconciled splits. " 1174 "Modifying it is not a good idea because that will " 1175 "cause your reconciled balance to be off.");
1180 if (is_trans_readonly_and_warn(GTK_WINDOW(gsr->window), trans))
1182 dialog = gtk_message_dialog_new(GTK_WINDOW(gsr->window),
1183 GTK_DIALOG_DESTROY_WITH_PARENT,
1184 GTK_MESSAGE_WARNING,
1189 gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
1191 warning = GNC_PREF_WARN_REG_SPLIT_DEL_ALL_RECD;
1195 warning = GNC_PREF_WARN_REG_SPLIT_DEL_ALL;
1198 gtk_dialog_add_button(GTK_DIALOG(dialog),
1199 _(
"_Cancel"), GTK_RESPONSE_CANCEL);
1200 gnc_gtk_dialog_add_button(dialog,
1202 _(
"_Remove Splits"),
1203 "edit-delete", GTK_RESPONSE_ACCEPT);
1204 response = gnc_dialog_run(GTK_DIALOG(dialog), warning);
1205 gtk_widget_destroy (dialog);
1206 if (response != GTK_RESPONSE_ACCEPT)
1225 gnc_split_reg_reinitialize_trans_cb(GtkWidget *widget, gpointer data)
1227 GNCSplitReg *gsr = data;
1228 gsr_emit_simple_signal( gsr,
"reinit_ent" );
1233 gsr_default_doclink_handler (GNCSplitReg *gsr)
1252 if (cursor_class == CURSOR_CLASS_NONE)
1255 if (is_trans_readonly_and_warn (GTK_WINDOW(gsr->window), trans))
1259 uri = gnc_doclink_convert_trans_link_uri (trans, gsr->read_only);
1262 gnc_doclink_get_uri_dialog (GTK_WINDOW (gsr->window),
1263 _(
"Change a Transaction Linked Document"),
1266 if (ret_uri && g_strcmp0 (uri, ret_uri) != 0)
1275 gsr_default_doclink_open_handler (GNCSplitReg *gsr)
1293 if (cursor_class == CURSOR_CLASS_NONE)
1297 uri = gnc_doclink_convert_trans_link_uri (trans, gsr->read_only);
1299 gnc_doclink_open_uri (GTK_WINDOW (gsr->window), uri);
1305 gsr_default_doclink_remove_handler (GNCSplitReg *gsr)
1322 if (cursor_class == CURSOR_CLASS_NONE)
1325 if (is_trans_readonly_and_warn (GTK_WINDOW(gsr->window), trans))
1332 gsr_default_doclink_from_sheet_handler (GNCSplitReg *gsr)
1347 uri = gnc_doclink_convert_trans_link_uri (trans, gsr->read_only);
1350 gnc_doclink_open_uri (GTK_WINDOW (gsr->window), uri);
1356 gsr_default_delete_handler( GNCSplitReg *gsr, gpointer data )
1364 const gchar *warning;
1387 if (split == blank_split)
1394 if (cursor_class == CURSOR_CLASS_NONE)
1397 if (is_trans_readonly_and_warn(GTK_WINDOW(gsr->window), trans))
1401 if (cursor_class == CURSOR_CLASS_SPLIT)
1403 const char *format = _(
"Delete the split '%s' from the transaction '%s'?");
1404 const char *recn_warn = _(
"You would be deleting a reconciled split! " 1405 "This is not a good idea as it will cause your " 1406 "reconciled balance to be off.");
1407 const char *anchor_error = _(
"You cannot delete this split.");
1408 const char *anchor_split = _(
"This is the split anchoring this transaction " 1409 "to the register. You may not delete it from " 1410 "this register window. You may delete the " 1411 "entire transaction from this window, or you " 1412 "may navigate to a register that shows " 1413 "another side of this same transaction and " 1414 "delete the split from that register.");
1420 if (reg->type != GENERAL_JOURNAL)
1424 dialog = gtk_message_dialog_new(GTK_WINDOW(gsr->window),
1426 | GTK_DIALOG_DESTROY_WITH_PARENT,
1429 "%s", anchor_error);
1430 gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
1431 "%s", anchor_split);
1432 gtk_dialog_run(GTK_DIALOG(dialog));
1433 gtk_widget_destroy (dialog);
1439 memo = (memo && *memo) ? memo : _(
"(no memo)");
1442 desc = (desc && *desc) ? desc : _(
"(no description)");
1445 buf = g_strdup_printf (format, memo, desc);
1446 dialog = gtk_message_dialog_new(GTK_WINDOW(gsr->window),
1448 | GTK_DIALOG_DESTROY_WITH_PARENT,
1449 GTK_MESSAGE_QUESTION,
1456 gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
1458 warning = GNC_PREF_WARN_REG_SPLIT_DEL_RECD;
1462 warning = GNC_PREF_WARN_REG_SPLIT_DEL;
1465 gtk_dialog_add_button(GTK_DIALOG(dialog),
1466 _(
"_Cancel"), GTK_RESPONSE_CANCEL);
1467 gnc_gtk_dialog_add_button(dialog, _(
"_Delete Split"),
1468 "edit-delete", GTK_RESPONSE_ACCEPT);
1469 response = gnc_dialog_run(GTK_DIALOG(dialog), warning);
1470 gtk_widget_destroy (dialog);
1471 if (response != GTK_RESPONSE_ACCEPT)
1478 g_return_if_fail(cursor_class == CURSOR_CLASS_TRANS);
1483 const char *title = _(
"Delete the current transaction?");
1484 const char *recn_warn = _(
"You would be deleting a transaction " 1485 "with reconciled splits! " 1486 "This is not a good idea as it will cause your " 1487 "reconciled balance to be off.");
1489 dialog = gtk_message_dialog_new(GTK_WINDOW(gsr->window),
1491 | GTK_DIALOG_DESTROY_WITH_PARENT,
1492 GTK_MESSAGE_WARNING,
1497 gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
1499 warning = GNC_PREF_WARN_REG_TRANS_DEL_RECD;
1503 warning = GNC_PREF_WARN_REG_TRANS_DEL;
1505 gtk_dialog_add_button(GTK_DIALOG(dialog),
1506 _(
"_Cancel"), GTK_RESPONSE_CANCEL);
1507 gnc_gtk_dialog_add_button(dialog, _(
"_Delete Transaction"),
1508 "edit-delete", GTK_RESPONSE_ACCEPT);
1509 response = gnc_dialog_run(GTK_DIALOG(dialog), warning);
1510 gtk_widget_destroy (dialog);
1511 if (response != GTK_RESPONSE_ACCEPT)
1523 gnc_split_reg_delete_trans_cb(GtkWidget *widget, gpointer data)
1525 GNCSplitReg *gsr = data;
1526 gsr_emit_simple_signal( gsr,
"delete_ent" );
1530 gsr_default_dup_handler( GNCSplitReg *gsr, gpointer data )
1540 gnc_split_reg_duplicate_trans_cb(GtkWidget *w, gpointer data)
1542 GNCSplitReg *gsr = data;
1543 gsr_emit_simple_signal( gsr,
"dup_ent" );
1552 gsr_default_schedule_handler( GNCSplitReg *gsr, gpointer data )
1555 SchedXaction *theSX = NULL;
1564 "from-sched-xaction", &fromSXId,
1568 for ( sxElts = gnc_book_get_schedxactions (gnc_get_current_book())->sx_list;
1570 sxElts = sxElts->next )
1572 SchedXaction *sx = (SchedXaction*)sxElts->data;
1577 guid_free (fromSXId);
1581 gnc_ui_scheduled_xaction_editor_dialog_create(GTK_WINDOW(data), theSX, FALSE);
1584 gnc_sx_create_from_trans(GTK_WINDOW(data), pending_trans);
1588 gnc_split_reg_recur_cb(GtkWidget *w, gpointer data)
1590 GNCSplitReg *gsr = data;
1591 gsr_emit_simple_signal( gsr,
"schedule_ent" );
1598 gnc_split_reg_record_trans_cb (GtkWidget *w, gpointer data)
1600 GNCSplitReg *gsr = data;
1601 gsr_emit_simple_signal( gsr,
"enter_ent" );
1605 gsr_default_cancel_handler( GNCSplitReg *gsr, gpointer data )
1615 gnc_split_reg_cancel_trans_cb(GtkWidget *w, gpointer data)
1617 GNCSplitReg *gsr = data;
1618 gsr_emit_simple_signal( gsr,
"cancel_ent" );
1622 gsr_default_expand_handler( GNCSplitReg *gsr, gpointer data )
1635 ( ( gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM(gsr->split_menu_check)) ? 1 : -1 )
1636 + ( gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM(gsr->split_popup_check)) ? 1 : -1 )
1637 + ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(gsr->split_button) )
1643 expand = ( activeCount < 0 );
1651 gnc_split_reg_expand_trans_menu_cb (GtkWidget *widget, gpointer data)
1653 GNCSplitReg *gsr = data;
1654 gsr_emit_simple_signal( gsr,
"expand_ent" );
1658 gnc_split_reg_expand_trans_toolbar_cb (GtkWidget *widget, gpointer data)
1660 GNCSplitReg *gsr = data;
1661 gsr_emit_simple_signal( gsr,
"expand_ent" );
1665 gnc_split_reg_clear_filter_for_split (GNCSplitReg *gsr, Split *split)
1667 VirtualCellLocation vcell_loc;
1677 gint response = gnc_ok_cancel_dialog (GTK_WINDOW(gsr->window),
1678 GTK_RESPONSE_CANCEL,
1679 (_(
"Target split is currently hidden in this register.\n\n%s\n\n" 1680 "Select OK to temporarily clear filter and proceed,\n" 1681 "otherwise the last active cell will be selected.")),
1684 if (response == GTK_RESPONSE_OK)
1694 gnc_split_reg_jump_to_split(GNCSplitReg *gsr, Split *split)
1700 VirtualCellLocation vcell_loc;
1702 gnucash_register_goto_virt_cell( gsr->reg, vcell_loc );
1711 gnc_split_reg_jump_to_split_amount(GNCSplitReg *gsr, Split *split)
1717 VirtualLocation virt_loc;
1719 gnucash_register_goto_virt_loc (gsr->reg, virt_loc);
1725 gnc_split_reg_jump_to_blank (GNCSplitReg *gsr)
1728 VirtualCellLocation vcell_loc;
1731 ENTER(
"gsr=%p", gsr);
1736 LEAVE(
"no blank split");
1742 if ((vcell_loc.virt_row > 1) && (reg->style == REG_STYLE_JOURNAL))
1743 vcell_loc.virt_row--;
1745 gnucash_register_goto_virt_cell (gsr->reg, vcell_loc);
1752 gnc_split_reg_focus_on_sheet (GNCSplitReg *gsr)
1754 GnucashRegister *reg = gsr->reg;
1755 GnucashSheet *sheet = gnucash_register_get_sheet (reg);
1758 if (!gtk_widget_has_focus(GTK_WIDGET(sheet)) && gtk_widget_get_realized (GTK_WIDGET(sheet)))
1759 gtk_widget_grab_focus (GTK_WIDGET(sheet));
1763 gnc_split_reg_set_sheet_focus (GNCSplitReg *gsr, gboolean has_focus)
1765 GnucashRegister *reg = gsr->reg;
1766 GnucashSheet *sheet = gnucash_register_get_sheet (reg);
1767 gnucash_sheet_set_has_focus (sheet, has_focus);
1771 gnc_split_reg_balancing_entry(GNCSplitReg *gsr,
Account *account,
1772 time64 statement_date, gnc_numeric balancing_amount)
1775 Transaction *transaction;
1779 transaction = create_balancing_transaction(gnc_get_current_book(),
1780 account, statement_date, balancing_amount);
1783 split = xaccTransFindSplitByAccount(transaction, account);
1787 g_warning(
"create_balancing_transaction failed");
1788 gnc_split_reg_jump_to_blank(gsr);
1793 gnc_split_reg_jump_to_split(gsr, split );
1798 create_balancing_transaction(QofBook *book,
Account *account,
1799 time64 statement_date, gnc_numeric balancing_amount)
1845 gsr_default_blank_handler( GNCSplitReg *gsr, gpointer data )
1849 ENTER(
"gsr=%p, gpointer=%p", gsr, data);
1856 gnc_split_reg_jump_to_blank (gsr);
1861 gnc_split_reg_new_trans_cb (GtkWidget *widget, gpointer data)
1863 GNCSplitReg *gsr = data;
1864 gsr_emit_simple_signal( gsr,
"blank" );
1868 gsr_default_jump_handler( GNCSplitReg *gsr, gpointer data )
1870 g_assert_not_reached();
1874 gnc_split_reg_jump_cb( GtkWidget *widget, gpointer data )
1876 GNCSplitReg *gsr = data;
1877 gsr_emit_simple_signal( gsr,
"jump" );
1881 gnc_split_reg_change_style (GNCSplitReg *gsr,
SplitRegisterStyle style, gboolean refresh)
1885 if (style == reg->style)
1894 gnc_split_reg_style_ledger_cb (GtkWidget *w, gpointer data)
1896 GNCSplitReg *gsr = data;
1898 if (!gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM(w)))
1901 gnc_split_reg_change_style (gsr, REG_STYLE_LEDGER, TRUE);
1905 gnc_split_reg_style_auto_ledger_cb (GtkWidget *w, gpointer data)
1907 GNCSplitReg *gsr = data;
1909 if (!gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM(w)))
1912 gnc_split_reg_change_style (gsr, REG_STYLE_AUTO_LEDGER, TRUE);
1916 gnc_split_reg_style_journal_cb (GtkWidget *w, gpointer data)
1918 GNCSplitReg *gsr = data;
1920 if (!gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM(w)))
1923 gnc_split_reg_change_style (gsr, REG_STYLE_JOURNAL, TRUE);
1927 gnc_split_reg_double_line_cb (GtkWidget *w, gpointer data)
1929 GNCSplitReg *gsr = data;
1931 gboolean use_double_line;
1933 use_double_line = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM(w));
1934 if ( use_double_line == reg->use_double_line )
1942 gnc_split_reg_sort_force( GNCSplitReg *gsr, SortType sort_code, gboolean force )
1945 gboolean show_present_divider = FALSE;
1946 GSList *p1 = NULL, *p2 = NULL, *p3 = NULL, *standard;
1949 if ((gsr->sort_type == sort_code) && !force)
1958 show_present_divider = TRUE;
1961 p1 = g_slist_prepend (p1, TRANS_DATE_POSTED);
1962 p1 = g_slist_prepend (p1, SPLIT_TRANS);
1964 show_present_divider = TRUE;
1966 case BY_DATE_ENTERED:
1967 p1 = g_slist_prepend (p1, TRANS_DATE_ENTERED);
1968 p1 = g_slist_prepend (p1, SPLIT_TRANS);
1971 case BY_DATE_RECONCILED:
1972 p1 = g_slist_prepend (p1, SPLIT_RECONCILE);
1973 p2 = g_slist_prepend (p2, SPLIT_DATE_RECONCILED);
1977 p1 = g_slist_prepend (p1, TRANS_NUM);
1978 p1 = g_slist_prepend (p1, SPLIT_TRANS);
1982 p1 = g_slist_prepend (p1, SPLIT_VALUE);
1986 p1 = g_slist_prepend (p1, SPLIT_MEMO);
1990 p1 = g_slist_prepend (p1, TRANS_DESCRIPTION);
1991 p1 = g_slist_prepend (p1, SPLIT_TRANS);
1995 p1 = g_slist_prepend (p1, SPLIT_ACTION);
1999 p1 = g_slist_prepend (p1, TRANS_NOTES);
2000 p1 = g_slist_prepend (p1, SPLIT_TRANS);
2004 g_slist_free (standard);
2005 g_return_if_fail (FALSE);
2012 gsr->sort_type = sort_code;
2017 gnc_split_reg_sort( GNCSplitReg *gsr, SortType sort_code )
2019 gnc_split_reg_sort_force( gsr, sort_code, FALSE );
2023 gnc_split_reg_sort_standard_cb(GtkWidget *w, gpointer data)
2025 GNCSplitReg *gsr = data;
2026 gnc_split_reg_sort(gsr, BY_STANDARD);
2030 gnc_split_reg_sort_date_cb(GtkWidget *w, gpointer data)
2032 GNCSplitReg *gsr = data;
2033 gnc_split_reg_sort(gsr, BY_DATE);
2037 gnc_split_reg_sort_date_entered_cb(GtkWidget *w, gpointer data)
2039 GNCSplitReg *gsr = data;
2040 gnc_split_reg_sort(gsr, BY_DATE_ENTERED);
2044 gnc_split_reg_sort_date_reconciled_cb(GtkWidget *w, gpointer data)
2046 GNCSplitReg *gsr = data;
2047 gnc_split_reg_sort(gsr, BY_DATE_RECONCILED);
2051 gnc_split_reg_sort_num_cb(GtkWidget *w, gpointer data)
2053 GNCSplitReg *gsr = data;
2054 gnc_split_reg_sort(gsr, BY_NUM);
2058 gnc_split_reg_sort_amount_cb(GtkWidget *w, gpointer data)
2060 GNCSplitReg *gsr = data;
2061 gnc_split_reg_sort(gsr, BY_AMOUNT);
2065 gnc_split_reg_sort_memo_cb(GtkWidget *w, gpointer data)
2067 GNCSplitReg *gsr = data;
2068 gnc_split_reg_sort(gsr, BY_MEMO);
2072 gnc_split_reg_sort_desc_cb(GtkWidget *w, gpointer data)
2074 GNCSplitReg *gsr = data;
2075 gnc_split_reg_sort(gsr, BY_DESC);
2079 gnc_split_reg_sort_action_cb(GtkWidget *w, gpointer data)
2081 GNCSplitReg *gsr = data;
2082 gnc_split_reg_sort(gsr, BY_ACTION);
2086 gnc_split_reg_sort_notes_cb(GtkWidget *w, gpointer data)
2088 GNCSplitReg *gsr = data;
2089 gnc_split_reg_sort(gsr, BY_NOTES);
2094 gnc_split_reg_set_sort_reversed(GNCSplitReg *gsr, gboolean rev, gboolean refresh)
2107 gsr->sort_rev = rev;
2114 gnc_split_reg_record (GNCSplitReg *gsr)
2116 ENTER(
"gsr=%p", gsr);
2134 gnc_split_reg_match_trans_row( VirtualLocation virt_loc,
2135 gpointer user_data )
2137 GNCSplitReg *gsr = user_data;
2144 return (cursor_class == CURSOR_CLASS_TRANS);
2148 gnc_split_reg_goto_next_trans_row (GNCSplitReg *gsr)
2150 ENTER(
"gsr=%p", gsr);
2151 gnucash_register_goto_next_matching_row( gsr->reg,
2152 gnc_split_reg_match_trans_row,
2158 gnc_split_reg_enter( GNCSplitReg *gsr, gboolean next_transaction )
2161 gboolean goto_blank;
2163 ENTER(
"gsr=%p, next_transaction=%s", gsr, next_transaction ?
"TRUE" :
"FALSE");
2166 GNC_PREF_ENTER_MOVES_TO_END);
2172 if ( !goto_blank && !next_transaction )
2176 if (style == REG_STYLE_LEDGER)
2181 if (blank_split != NULL)
2183 Split *current_split;
2187 if (blank_split == current_split)
2193 if (!gnc_split_reg_record (gsr))
2198 gnc_split_reg_focus_on_sheet (gsr);
2202 if (gnc_table_current_cursor_changed (sr->table, FALSE))
2209 if (!goto_blank && next_transaction)
2214 gnc_split_reg_jump_to_blank( gsr );
2215 else if (next_transaction)
2216 gnc_split_reg_goto_next_trans_row( gsr );
2218 gnucash_register_goto_next_virt_row( gsr->reg );
2223 gsr_default_enter_handler( GNCSplitReg *gsr, gpointer data )
2225 gnc_split_reg_enter( gsr, FALSE );
2229 gnc_split_reg_record_cb (GnucashRegister *reg, gpointer data)
2231 gsr_emit_simple_signal( (GNCSplitReg*)data,
"enter_ent" );
2235 gnc_split_reg_size_allocate (GtkWidget *widget,
2236 GtkAllocation *allocation,
2239 GNCSplitReg *gsr = user_data;
2240 gsr->width = allocation->width;
2241 gtk_window_set_default_size( GTK_WINDOW(gsr->window), gsr->width, 0 );
2246 add_summary_label (GtkWidget *summarybar, gboolean pack_start,
const char *label_str, GtkWidget *extra)
2249 GtkWidget *text_label, *secondary_label;
2251 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
2252 gtk_box_set_homogeneous (GTK_BOX (hbox), FALSE);
2254 gtk_box_pack_start( GTK_BOX(summarybar), hbox, FALSE, FALSE, 5 );
2256 gtk_box_pack_end( GTK_BOX(summarybar), hbox, FALSE, FALSE, 5 );
2258 text_label = gtk_label_new (label_str);
2259 gnc_label_set_alignment (text_label, 1.0, 0.5 );
2260 gtk_label_set_ellipsize (GTK_LABEL(text_label), PANGO_ELLIPSIZE_END);
2261 gtk_box_pack_start (GTK_BOX(hbox), text_label, FALSE, FALSE, 0);
2263 secondary_label = gtk_label_new (
"" );
2264 g_object_set_data (G_OBJECT(secondary_label),
"text_label", text_label);
2265 g_object_set_data (G_OBJECT(secondary_label),
"text_box", hbox);
2266 gnc_label_set_alignment (secondary_label, 1.0, 0.5 );
2267 gtk_box_pack_start (GTK_BOX(hbox), secondary_label, FALSE, FALSE, 0);
2270 gtk_box_pack_start( GTK_BOX(hbox), extra, FALSE, FALSE, 0 );
2272 return secondary_label;
2276 gsr_summarybar_set_arrow_draw (GNCSplitReg *gsr)
2278 if (gsr->sort_arrow_handler_id > 0)
2279 g_signal_handler_disconnect (G_OBJECT(gsr->sort_arrow), gsr->sort_arrow_handler_id);
2281 gsr->sort_arrow_handler_id = g_signal_connect (G_OBJECT (gsr->sort_arrow),
"draw",
2282 G_CALLBACK (gnc_draw_arrow_cb), GINT_TO_POINTER(gsr->sort_rev));
2284 gtk_widget_queue_draw (gsr->sort_arrow);
2288 gsr_create_summary_bar( GNCSplitReg *gsr )
2290 GtkWidget *summarybar = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
2291 gtk_box_set_homogeneous (GTK_BOX (summarybar), FALSE);
2292 gtk_widget_set_name (summarybar,
"gnc-id-summarybar");
2294 gsr->cleared_label = NULL;
2295 gsr->balance_label = NULL;
2296 gsr->reconciled_label = NULL;
2297 gsr->future_label = NULL;
2298 gsr->projectedminimum_label = NULL;
2299 gsr->sort_label = NULL;
2300 gsr->sort_arrow = NULL;
2301 gsr->filter_label = NULL;
2302 gsr->shares_label = NULL;
2303 gsr->value_label = NULL;
2305 if (gnc_ledger_display_type(gsr->ledger) == LD_SINGLE)
2309 gsr->balance_label = add_summary_label (summarybar, TRUE, _(
"Present:"), NULL);
2310 gsr->future_label = add_summary_label (summarybar, TRUE, _(
"Future:"), NULL);
2311 gsr->cleared_label = add_summary_label (summarybar, TRUE, _(
"Cleared:"), NULL);
2312 gsr->reconciled_label = add_summary_label (summarybar, TRUE, _(
"Reconciled:"), NULL);
2313 gsr->projectedminimum_label = add_summary_label (summarybar, TRUE, _(
"Projected Minimum:"), NULL);
2317 gsr->shares_label = add_summary_label (summarybar, TRUE, _(
"Shares:"), NULL);
2318 gsr->value_label = add_summary_label (summarybar, TRUE, _(
"Current Value:"), NULL);
2322 gsr->filter_label = add_summary_label (summarybar, FALSE,
"", NULL);
2323 gsr->sort_arrow = gtk_image_new_from_icon_name (
"image-missing", GTK_ICON_SIZE_SMALL_TOOLBAR);
2324 gsr->sort_label = add_summary_label (summarybar, FALSE, _(
"Sort By:"), gsr->sort_arrow);
2326 gnc_widget_style_context_add_class (GTK_WIDGET(gsr->filter_label),
"gnc-class-highlight");
2327 gnc_widget_style_context_add_class (GTK_WIDGET(gsr->sort_arrow),
"gnc-class-highlight");
2329 gsr->summarybar = summarybar;
2332 gsr_redraw_all_cb(NULL, gsr);
2333 return gsr->summarybar;
2344 gnc_split_reg_get_placeholder( GNCSplitReg *gsr )
2348 gboolean single_account;
2351 return PLACEHOLDER_NONE;
2357 case GENERAL_JOURNAL:
2359 case PORTFOLIO_LEDGER:
2361 single_account = FALSE;
2364 single_account = TRUE;
2371 return PLACEHOLDER_NONE;
2375 return PLACEHOLDER_THIS;
2376 return PLACEHOLDER_NONE;
2397 gtk_callback_bug_workaround (gpointer argp)
2400 const gchar *read_only_this = _(
"This account register is read-only.");
2401 const gchar *read_only_acc = _(
"The '%s' account register is read-only.");
2402 gchar *read_only = NULL;
2404 GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (args->gsr->ledger);
2406 const gchar *acc_name = NULL;
2412 if (ledger_type == LD_SINGLE)
2413 read_only = g_strdup_printf (read_only_acc, acc_name);
2416 gchar *tmp = g_strconcat (acc_name,
"+", NULL);
2417 read_only = g_strdup_printf (read_only_acc, tmp);
2422 read_only = g_strdup (read_only_this);
2424 dialog = gtk_message_dialog_new(GTK_WINDOW(args->gsr->window),
2425 GTK_DIALOG_DESTROY_WITH_PARENT,
2426 GTK_MESSAGE_WARNING,
2429 gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
2430 "%s", args->string);
2431 gnc_dialog_run(GTK_DIALOG(dialog), GNC_PREF_WARN_REG_IS_READ_ONLY);
2432 gtk_widget_destroy(dialog);
2443 gnc_split_reg_determine_read_only( GNCSplitReg *gsr, gboolean show_dialog )
2451 gsr->read_only = TRUE;
2454 if ( !gsr->read_only )
2456 char *
string = NULL;
2458 if(reg->mismatched_commodities)
2460 string = _(
"The transactions of this account may not be edited " 2461 "because its subaccounts have mismatched commodities " 2463 "You need to open each account individually to edit " 2468 switch (gnc_split_reg_get_placeholder(gsr))
2470 case PLACEHOLDER_NONE:
2474 case PLACEHOLDER_THIS:
2475 string = _(
"The transactions of this account may not be edited.\n" 2476 "If you want to edit transactions in this register, " 2477 "please open the account options and turn off the " 2478 "placeholder checkbox.");
2482 string = _(
"The transactions in one of the selected " 2483 "sub-accounts may not be edited.\n" 2484 "If you want to edit transactions in this register, please open " 2485 "the sub-account options and turn off the placeholder checkbox.\n" 2486 "You may also open an individual account instead " 2487 "of a set of accounts.");
2491 gsr->read_only = TRUE;
2496 args->string = string;
2499 g_timeout_add (250, gtk_callback_bug_workaround, args);
2511 gnc_split_reg_get_parent( GNCLedgerDisplay *ledger )
2514 GNC_SPLIT_REG(gnc_ledger_display_get_user_data( ledger ));
2524 gsr_emit_help_changed( GnucashRegister *reg, gpointer user_data )
2526 gsr_emit_simple_signal( (GNCSplitReg*)user_data,
"help-changed" );
2531 gsr_emit_show_popup_menu( GnucashRegister *reg, gpointer user_data )
2533 gsr_emit_simple_signal( (GNCSplitReg*)user_data,
"show-popup-menu" );
2538 gsr_emit_simple_signal( GNCSplitReg *gsr,
const char *sigName )
2540 g_signal_emit_by_name( gsr, sigName, NULL );
2544 gnc_split_reg_get_register( GNCSplitReg *gsr )
2553 gnc_split_reg_get_sort_type( GNCSplitReg *gsr )
2556 return gsr->sort_type;
2560 gnc_split_reg_set_sort_type( GNCSplitReg *gsr, SortType t )
2562 gnc_split_reg_sort( gsr, t );
2566 gnc_split_reg_set_sort_type_force( GNCSplitReg *gsr, SortType t, gboolean force )
2568 gnc_split_reg_sort_force( gsr, t, force );
2573 gnc_split_reg_get_summarybar( GNCSplitReg *gsr )
2575 if ( !gsr )
return NULL;
2576 return gsr->summarybar;
2580 gnc_split_reg_get_read_only( GNCSplitReg *gsr )
2587 gsr->read_only = FALSE;
2588 gnc_split_reg_determine_read_only (gsr, FALSE);
2592 return gsr->read_only;
2596 gnc_split_reg_set_moved_cb( GNCSplitReg *gsr, GFunc cb, gpointer cb_data )
2598 gnucash_register_set_moved_cb (gsr->reg, cb, cb_data);
void xaccSplitSetValue(Split *split, gnc_numeric val)
The xaccSplitSetValue() method sets the value of this split in the transaction's commodity.
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 xaccAccountSetFilter(Account *acc, const char *str)
Set the account's Filter.
void xaccAccountSetSortOrder(Account *acc, const char *str)
Set the account's Sort Order.
Public declarations for GncLedgerDisplay class.
Functions to load, save and get gui state.
gboolean xaccTransHasReconciledSplits(const Transaction *trans)
FIXME: document me.
#define xaccTransAppendSplit(t, s)
Add a split to the transaction.
Transaction * xaccMallocTransaction(QofBook *book)
The xaccMallocTransaction() will malloc memory and initialize it.
void gnc_ledger_display_refresh(GNCLedgerDisplay *ld)
redisplay/redraw only the indicated window.
gboolean gnc_ledger_display_default_double_line(GNCLedgerDisplay *gld)
Returns a boolean of whether this display should be single or double lined mode by default...
void xaccTransSetDatePostedSecsNormalized(Transaction *trans, time64 time)
This function sets the posted date of the transaction, specified by a time64 (see ctime(3))...
void gnc_split_register_set_reverse_sort(SplitRegister *reg, gboolean reverse_sort)
Sets a split register's reverse sort order based on register.
gboolean xaccAccountGetSortReversed(const Account *acc)
Get the account's Sort Order direction.
void qof_instance_get(const QofInstance *inst, const gchar *first_prop,...)
Wrapper for g_object_get.
Split * xaccTransGetSplit(const Transaction *trans, int i)
Return a pointer to the indexed split in this transaction's split list.
gboolean xaccTransIsReadonlyByPostedDate(const Transaction *trans)
Returns TRUE if this Transaction is read-only because its posted-date is older than the "auto-readonl...
const char * gnc_commodity_get_mnemonic(const gnc_commodity *cm)
Retrieve the mnemonic for the specified commodity.
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...
gboolean xaccAccountIsPriced(const Account *acc)
Returns true if the account is a stock, mutual fund or currency, otherwise false. ...
a simple price database for gnucash
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
const char * xaccAccountGetFilter(const Account *acc)
Get the account's filter.
void qof_query_set_sort_order(QofQuery *q, QofQueryParamList *params1, QofQueryParamList *params2, QofQueryParamList *params3)
When a query is run, the results are sorted before being returned.
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...
gnc_numeric gnc_numeric_neg(gnc_numeric a)
Returns a newly created gnc_numeric that is the negative of the given gnc_numeric value...
void gnc_split_register_delete_current_split(SplitRegister *reg)
Deletes the split associated with the current cursor, if both are non-NULL.
const char * xaccTransGetReadOnly(Transaction *trans)
Returns a non-NULL value if this Transaction was marked as read-only with some specific "reason" text...
char * gnc_wrap_text_with_bidi_ltr_isolate(const char *text)
This function helps with GTK's use of 'Unicode Bidirectional Text Algorithm'.
char xaccSplitGetReconcile(const Split *split)
Returns the value of the reconcile flag.
void xaccTransSetDescription(Transaction *trans, const char *desc)
Sets the transaction Description.
CursorClass gnc_split_register_get_cursor_class(SplitRegister *reg, VirtualCellLocation vcell_loc)
Returns the class of the cursor at the given virtual cell location.
Account * gnc_ledger_display_leader(GNCLedgerDisplay *ld)
Implementations.
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
Transaction * xaccSplitGetParent(const Split *split)
Returns the parent transaction of the split.
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_split_register_delete_current_trans(SplitRegister *reg)
Deletes the transaction associated with the current cursor, if both are non-NULL. ...
void qof_query_set_sort_increasing(QofQuery *q, gboolean prim_inc, gboolean sec_inc, gboolean tert_inc)
When a query is run, the results are sorted before being returned.
void gnc_split_register_set_read_only(SplitRegister *reg, gboolean read_only)
Sets whether a register window is "read only".
GtkWidget * gnucash_register_new(Table *table, const gchar *state_section)
this already has scrollbars attached
#define ENTER(format, args...)
Print a function entry debugging message.
GKeyFile * gnc_state_get_current(void)
Returns a pointer to the most recently loaded state.
gnc_numeric xaccAccountGetClearedBalance(const Account *acc)
Get the current balance of the account, only including cleared transactions.
GNCPriceDB * gnc_pricedb_get_db(QofBook *book)
Return the pricedb associated with the book.
Query * gnc_ledger_display_get_query(GNCLedgerDisplay *ld)
return the query associated with a ledger
gnc_numeric gnc_pricedb_convert_balance_latest_price(GNCPriceDB *pdb, gnc_numeric balance, const gnc_commodity *balance_currency, const gnc_commodity *new_currency)
Convert a balance from one currency to another using the most recent price between the two...
void xaccTransSetCurrency(Transaction *trans, gnc_commodity *curr)
Set a new currency on a transaction.
gnc_commodity * gnc_default_currency(void)
Return the default currency set by the user.
#define xaccAccountGetGUID(X)
void xaccSplitSetAmount(Split *split, gnc_numeric amt)
The xaccSplitSetAmount() method sets the amount in the account's commodity that the split should have...
void gnc_split_register_redraw(SplitRegister *reg)
Causes a redraw of the register window associated with reg.
Account handling public routines.
void gnc_ledger_display_set_handlers(GNCLedgerDisplay *ld, GNCLedgerDisplayDestroy destroy, GNCLedgerDisplayGetParent get_parent)
set the handlers used by the ledger display
CursorClass
Types of cursors.
#define YREC
The Split has been reconciled.
gboolean guid_equal(const GncGUID *guid_1, const GncGUID *guid_2)
Given two GUIDs, return TRUE if they are non-NULL and equal.
void gnc_split_register_cut_current(SplitRegister *reg)
Equivalent to copying the current entity and the deleting it with the appropriate delete method...
#define GUID_ENCODING_LENGTH
Number of characters needed to encode a guid as a string not including the null terminator.
#define FREC
frozen into accounting period
Split * gnc_split_register_get_blank_split(SplitRegister *reg)
Gets the blank split for a register.
GNCPlaceholderType xaccAccountGetDescendantPlaceholder(const Account *acc)
Returns PLACEHOLDER_NONE if account is NULL or neither account nor any descendant of account is a pla...
Anchor Scheduled Transaction info in a book.
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.
void gnc_split_register_cancel_cursor_split_changes(SplitRegister *reg)
Cancels any changes made to the current cursor, reloads the cursor from the engine, reloads the table from the cursor, and updates the GUI.
const char * xaccTransGetDescription(const Transaction *trans)
Gets the transaction Description.
Gnome specific utility functions.
Public declarations of GnucashRegister class.
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
gboolean gnc_split_register_get_split_amount_virt_loc(SplitRegister *reg, Split *split, VirtualLocation *virt_loc)
Searches the split register for the given split and determines the location of either its credit (if ...
#define xaccSchedXactionGetGUID(X)
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
gnc_numeric xaccAccountGetReconciledBalance(const Account *acc)
Get the current balance of the account, only including reconciled transactions.
All type declarations for the whole Gnucash engine.
gnc_numeric xaccAccountGetBalance(const Account *acc)
Get the current balance of the account, which may include future splits.
int xaccSPrintAmount(char *bufp, gnc_numeric val, GNCPrintAmountInfo info)
Make a string representation of a gnc_numeric.
Split * xaccMallocSplit(QofBook *book)
Constructor.
gboolean gnc_split_register_is_blank_split(SplitRegister *reg, Split *split)
Return TRUE if split is the blank_split.
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_split_register_cancel_cursor_trans_changes(SplitRegister *reg)
Cancels any changes made to the current pending transaction, reloads the table from the engine...
GNCPlaceholderType
DOCUMENT ME!
gnc_commodity * gnc_account_or_default_currency(const Account *account, gboolean *currency_from_account_found)
Returns a gnc_commodity that is a currency, suitable for being a Transaction's currency.
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...
gboolean qof_book_is_readonly(const QofBook *book)
Return whether the book is read only.
gboolean gnc_split_register_get_split_virt_loc(SplitRegister *reg, Split *split, VirtualCellLocation *vcell_loc)
Searches the split register for a given split.
void xaccAccountBeginEdit(Account *acc)
The xaccAccountBeginEdit() subroutine is the first phase of a two-phase-commit wrapper for account up...
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
Get the account's commodity.
void gnc_split_register_empty_current_trans_except_split(SplitRegister *reg, Split *split)
Deletes the non-transaction splits associated with the current cursor, if both are non-NULL...
#define xaccAccountInsertSplit(acc, s)
The xaccAccountInsertSplit() method will insert the indicated split into the indicated account...
gboolean xaccAccountGetPlaceholder(const Account *acc)
Get the "placeholder" flag for an account.
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
Get a boolean value from the preferences backend.
void xaccTransSetDocLink(Transaction *trans, const char *doclink)
Sets the transaction Document Link.
Declarations for the Table object.
Transaction * xaccTransGetReversedBy(const Transaction *trans)
Returns the transaction that reversed the given transaction.
void xaccAccountSetSortReversed(Account *acc, gboolean sortreversed)
Set the account's Sort Order direction.
#define LEAVE(format, args...)
Print a function exit debugging message.
#define QUERY_DEFAULT_SORT
Default sort object type.
time64 gnc_time(time64 *tbuf)
get the current time
Utility functions for convert uri in separate components and back.
const char * xaccSplitGetMemo(const Split *split)
Returns the memo string.
void gnc_table_save_state(Table *table, const gchar *state_section)
Implementation.
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
void gnc_split_register_change_blank_split_ref(SplitRegister *reg, Split *split)
Change the blank_split reference from pointing to split to another split of the transaction.
void xaccTransSetDateEnteredSecs(Transaction *trans, time64 secs)
Modify the date of when the transaction was entered.
File path resolution utility functions.
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.
void gnc_split_register_show_present_divider(SplitRegister *reg, gboolean show_present)
If TRUE, visually indicate the demarcation between splits with post dates prior to the present...
const char * xaccAccountGetSortOrder(const Account *acc)
Get the account's Sort Order.
The type used to store guids in C.
void xaccAccountCommitEdit(Account *acc)
ThexaccAccountCommitEdit() subroutine is the second phase of a two-phase-commit wrapper for account u...
void gnc_ledger_display_set_user_data(GNCLedgerDisplay *ld, gpointer user_data)
get and set the user data associated with the ledger
Split * gnc_split_register_get_current_split(SplitRegister *reg)
Returns the split at which the cursor is currently located.
SplitRegisterStyle
Register styles.
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...