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"
66static QofLogModule log_module = GNC_MOD_GUI;
69void gnc_split_reg_raise( GNCSplitReg *gsr );
71static GtkWidget* add_summary_label( GtkWidget *summarybar, gboolean pack_start,
72 const char *label_str, GtkWidget *extra );
74static void gsr_summarybar_set_arrow_draw (GNCSplitReg *gsr);
76static void gnc_split_reg_determine_read_only( GNCSplitReg *gsr, gboolean show_dialog );
77static gboolean is_trans_readonly_and_warn (GtkWindow *parent, Transaction *trans);
80static GtkWidget *gnc_split_reg_get_parent( GNCLedgerDisplay *ledger );
82static void gsr_create_table( GNCSplitReg *gsr );
83static void gsr_setup_table( GNCSplitReg *gsr );
84static void gsr_setup_status_widgets( GNCSplitReg *gsr );
86static void gsr_update_summary_label( GtkWidget *label,
87 xaccGetBalanceFn getter,
94static void gsr_redraw_all_cb (GnucashRegister *g_reg, gpointer data);
96static void gnc_split_reg_ld_destroy( GNCLedgerDisplay *ledger );
98static Transaction* create_balancing_transaction(
QofBook *book,
Account *account,
99 time64 statement_date, gnc_numeric balancing_amount);
101void gsr_default_enter_handler ( GNCSplitReg *w, gpointer ud );
102void gsr_default_cancel_handler ( GNCSplitReg *w, gpointer ud );
103void gsr_default_delete_handler ( GNCSplitReg *w, gpointer ud );
104void gsr_default_reinit_handler ( GNCSplitReg *w, gpointer ud );
105void gsr_default_dup_handler ( GNCSplitReg *w, gpointer ud );
106void gsr_default_schedule_handler ( GNCSplitReg *w, gpointer ud );
107void gsr_default_expand_handler ( GNCSplitReg *w, gpointer ud );
108void gsr_default_blank_handler ( GNCSplitReg *w, gpointer ud );
109void gsr_default_jump_handler ( GNCSplitReg *w, gpointer ud );
110void gsr_default_cut_handler ( GNCSplitReg *w, gpointer ud );
111void gsr_default_cut_txn_handler ( GNCSplitReg *w, gpointer ud );
112void gsr_default_copy_handler ( GNCSplitReg *w, gpointer ud );
113void gsr_default_copy_txn_handler ( GNCSplitReg *w, gpointer ud );
114void gsr_default_paste_handler ( GNCSplitReg *w, gpointer ud );
115void gsr_default_paste_txn_handler( GNCSplitReg *w, gpointer ud );
116void gsr_default_void_txn_handler ( GNCSplitReg *w, gpointer ud );
117void gsr_default_unvoid_txn_handler ( GNCSplitReg *w, gpointer ud );
118void gsr_default_reverse_txn_handler ( GNCSplitReg *w, gpointer ud );
119void gsr_default_doclink_handler ( GNCSplitReg *w );
120void gsr_default_doclink_open_handler ( GNCSplitReg *w );
121void gsr_default_doclink_remove_handler ( GNCSplitReg *w );
122static void gsr_default_doclink_from_sheet_handler ( GNCSplitReg *w );
124static void gsr_emit_simple_signal ( GNCSplitReg *gsr,
const char *sigName );
125static void gsr_emit_help_changed ( GnucashRegister *reg, gpointer user_data );
126static void gsr_emit_show_popup_menu ( GnucashRegister *reg, gpointer user_data );
128void gnc_split_reg_cut_cb(GtkWidget *w, gpointer data);
129void gnc_split_reg_copy_cb(GtkWidget *w, gpointer data);
130void gnc_split_reg_paste_cb(GtkWidget *w, gpointer data);
132void gnc_split_reg_cut_trans_cb(GtkWidget *w, gpointer data);
133void gnc_split_reg_copy_trans_cb(GtkWidget *w, gpointer data);
134void gnc_split_reg_paste_trans_cb(GtkWidget *w, gpointer data);
135void gnc_split_reg_void_trans_cb(GtkWidget *w, gpointer data);
136void gnc_split_reg_unvoid_trans_cb(GtkWidget *w, gpointer data);
137void gnc_split_reg_reverse_trans_cb(GtkWidget *w, gpointer data);
139void gnc_split_reg_record_cb (GnucashRegister *reg, gpointer data);
140void gnc_split_reg_reinitialize_trans_cb(GtkWidget *w, gpointer data);
141void gnc_split_reg_delete_trans_cb(GtkWidget *w, gpointer data);
142void gnc_split_reg_duplicate_trans_cb(GtkWidget *w, gpointer data);
143void gnc_split_reg_recur_cb(GtkWidget *w, gpointer data);
144void gnc_split_reg_record_trans_cb(GtkWidget *w, gpointer data);
145void gnc_split_reg_cancel_trans_cb(GtkWidget *w, gpointer data);
147void gnc_split_reg_expand_trans_menu_cb(GtkWidget *widget, gpointer data);
148void gnc_split_reg_expand_trans_toolbar_cb(GtkWidget *widget, gpointer data);
149void gnc_split_reg_new_trans_cb(GtkWidget *widget, gpointer data);
150void gnc_split_reg_jump_cb(GtkWidget *widget, gpointer data);
152void gnc_split_reg_style_ledger_cb (GtkWidget *w, gpointer data);
153void gnc_split_reg_style_auto_ledger_cb (GtkWidget *w, gpointer data);
154void gnc_split_reg_style_journal_cb (GtkWidget *w, gpointer data);
155void gnc_split_reg_double_line_cb (GtkWidget *w, gpointer data);
157void gnc_split_reg_sort_standard_cb (GtkWidget *w, gpointer data);
158void gnc_split_reg_sort_date_cb (GtkWidget *w, gpointer data);
159void gnc_split_reg_sort_date_entered_cb (GtkWidget *w, gpointer data);
160void gnc_split_reg_sort_date_reconciled_cb (GtkWidget *w, gpointer data);
161void gnc_split_reg_sort_num_cb (GtkWidget *w, gpointer data);
162void gnc_split_reg_sort_amount_cb (GtkWidget *w, gpointer data);
163void gnc_split_reg_sort_memo_cb (GtkWidget *w, gpointer data);
164void gnc_split_reg_sort_desc_cb (GtkWidget *w, gpointer data);
165void gnc_split_reg_sort_action_cb (GtkWidget *w, gpointer data);
166void gnc_split_reg_sort_notes_cb (GtkWidget *w, gpointer data);
169void gnc_split_reg_size_allocate( GtkWidget *widget,
170 GtkAllocation *allocation,
171 gpointer user_data );
174static void gnc_split_reg_init2( GNCSplitReg *gsr );
175void gnc_split_reg_dispose(GObject *obj);
177FROM_STRING_FUNC(SortType, ENUM_LIST_SORTTYPE)
178AS_STRING_FUNC(SortType, ENUM_LIST_SORTTYPE)
180G_DEFINE_TYPE (GNCSplitReg, gnc_split_reg, GTK_TYPE_BOX)
183enum gnc_split_reg_signal_enum
204 SHOW_POPUP_MENU_SIGNAL,
209static guint gnc_split_reg_signals[LAST_SIGNAL] = { 0 };
212gnc_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;
287gnc_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 );
312gnc_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;
327gnc_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);
334gnc_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,
353gsr_setup_table( GNCSplitReg *gsr )
357 ENTER(
"gsr=%p", gsr);
368gsr_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);
414gsr_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;
434gsr_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);
483gsr_setup_status_widgets( GNCSplitReg *gsr )
486 gboolean use_double_line;
496gnc_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));
521gnc_split_reg_raise( GNCSplitReg *gsr )
526 if (gsr->window == NULL)
529 gtk_window_present( GTK_WINDOW(gsr->window) );
539gsr_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);
592gsr_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);
756gnc_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);
781gsr_default_cut_handler( GNCSplitReg *gsr, gpointer data )
783 gnucash_register_cut_clipboard( gsr->reg );
790gnc_split_reg_cut_cb (GtkWidget *w, gpointer data)
792 GNCSplitReg *gsr = data;
793 gsr_emit_simple_signal( gsr,
"cut" );
797gsr_default_copy_handler( GNCSplitReg *gsr, gpointer data )
799 gnucash_register_copy_clipboard( gsr->reg );
806gnc_split_reg_copy_cb (GtkWidget *w, gpointer data)
808 GNCSplitReg *gsr = data;
809 gsr_emit_simple_signal( gsr,
"copy" );
813gsr_default_paste_handler( GNCSplitReg *gsr, gpointer data )
815 gnucash_register_paste_clipboard( gsr->reg );
822gnc_split_reg_paste_cb (GtkWidget *w, gpointer data)
824 GNCSplitReg *gsr = data;
825 gsr_emit_simple_signal( gsr,
"paste" );
829gsr_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)
994gnc_split_reg_cut_trans_cb (GtkWidget *w, gpointer data)
996 GNCSplitReg *gsr = data;
997 gsr_emit_simple_signal( gsr,
"cut_txn" );
1001gsr_default_copy_txn_handler( GNCSplitReg *gsr, gpointer data )
1011gnc_split_reg_copy_trans_cb(GtkWidget *w, gpointer data)
1013 GNCSplitReg *gsr = data;
1014 gsr_emit_simple_signal( gsr,
"copy_txn" );
1018gsr_default_paste_txn_handler( GNCSplitReg *gsr, gpointer data )
1028gnc_split_reg_paste_trans_cb (GtkWidget *w, gpointer data)
1030 GNCSplitReg *gsr = data;
1031 gsr_emit_simple_signal( gsr,
"paste_txn" );
1042gsr_default_void_txn_handler (GNCSplitReg *gsr, gpointer data)
1048gnc_split_reg_void_trans_cb (GtkWidget *w, gpointer data)
1050 GNCSplitReg *gsr = data;
1051 gsr_emit_simple_signal( gsr,
"void_txn" );
1062gsr_default_unvoid_txn_handler (GNCSplitReg *gsr, gpointer data)
1068gnc_split_reg_unvoid_trans_cb (GtkWidget *w, gpointer data)
1070 GNCSplitReg *gsr = data;
1071 gsr_emit_simple_signal( gsr,
"unvoid_txn" );
1082gsr_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."));
1110gnc_split_reg_reverse_trans_cb (GtkWidget *w, gpointer data)
1112 GNCSplitReg *gsr = data;
1113 gsr_emit_simple_signal( gsr,
"reverse_txn" );
1118is_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);
1162gsr_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)
1225gnc_split_reg_reinitialize_trans_cb(GtkWidget *widget, gpointer data)
1227 GNCSplitReg *gsr = data;
1228 gsr_emit_simple_signal( gsr,
"reinit_ent" );
1233gsr_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)
1275gsr_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);
1305gsr_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))
1332gsr_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);
1356gsr_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)
1523gnc_split_reg_delete_trans_cb(GtkWidget *widget, gpointer data)
1525 GNCSplitReg *gsr = data;
1526 gsr_emit_simple_signal( gsr,
"delete_ent" );
1530gsr_default_dup_handler( GNCSplitReg *gsr, gpointer data )
1540gnc_split_reg_duplicate_trans_cb(GtkWidget *w, gpointer data)
1542 GNCSplitReg *gsr = data;
1543 gsr_emit_simple_signal( gsr,
"dup_ent" );
1552gsr_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);
1588gnc_split_reg_recur_cb(GtkWidget *w, gpointer data)
1590 GNCSplitReg *gsr = data;
1591 gsr_emit_simple_signal( gsr,
"schedule_ent" );
1598gnc_split_reg_record_trans_cb (GtkWidget *w, gpointer data)
1600 GNCSplitReg *gsr = data;
1601 gsr_emit_simple_signal( gsr,
"enter_ent" );
1605gsr_default_cancel_handler( GNCSplitReg *gsr, gpointer data )
1615gnc_split_reg_cancel_trans_cb(GtkWidget *w, gpointer data)
1617 GNCSplitReg *gsr = data;
1618 gsr_emit_simple_signal( gsr,
"cancel_ent" );
1622gsr_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 );
1651gnc_split_reg_expand_trans_menu_cb (GtkWidget *widget, gpointer data)
1653 GNCSplitReg *gsr = data;
1654 gsr_emit_simple_signal( gsr,
"expand_ent" );
1658gnc_split_reg_expand_trans_toolbar_cb (GtkWidget *widget, gpointer data)
1660 GNCSplitReg *gsr = data;
1661 gsr_emit_simple_signal( gsr,
"expand_ent" );
1665gnc_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)
1694gnc_split_reg_jump_to_split(GNCSplitReg *gsr, Split *split)
1700 VirtualCellLocation vcell_loc;
1702 gnucash_register_goto_virt_cell( gsr->reg, vcell_loc );
1711gnc_split_reg_jump_to_split_amount(GNCSplitReg *gsr, Split *split)
1717 VirtualLocation virt_loc;
1719 gnucash_register_goto_virt_loc (gsr->reg, virt_loc);
1725gnc_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);
1752gnc_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));
1763gnc_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);
1771gnc_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 );
1799 time64 statement_date, gnc_numeric balancing_amount)
1845gsr_default_blank_handler( GNCSplitReg *gsr, gpointer data )
1849 ENTER(
"gsr=%p, gpointer=%p", gsr, data);
1856 gnc_split_reg_jump_to_blank (gsr);
1861gnc_split_reg_new_trans_cb (GtkWidget *widget, gpointer data)
1863 GNCSplitReg *gsr = data;
1864 gsr_emit_simple_signal( gsr,
"blank" );
1868gsr_default_jump_handler( GNCSplitReg *gsr, gpointer data )
1870 g_assert_not_reached();
1874gnc_split_reg_jump_cb( GtkWidget *widget, gpointer data )
1876 GNCSplitReg *gsr = data;
1877 gsr_emit_simple_signal( gsr,
"jump" );
1881gnc_split_reg_change_style (GNCSplitReg *gsr,
SplitRegisterStyle style, gboolean refresh)
1885 if (style == reg->style)
1894gnc_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);
1905gnc_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);
1916gnc_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);
1927gnc_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 )
1942gnc_split_reg_sort (GNCSplitReg *gsr, SortType sort_code, ForceSort fs, Refresh ref)
1945 gboolean show_present_divider = FALSE;
1946 GSList *p1 = NULL, *p2 = NULL, *p3 = NULL, *standard;
1949 if ((gsr->sort_type == sort_code) && !fs)
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;
2018gnc_split_reg_sort_standard_cb(GtkWidget *w, gpointer data)
2020 GNCSplitReg *gsr = data;
2021 gnc_split_reg_sort(gsr, BY_STANDARD, no_force, refresh);
2025gnc_split_reg_sort_date_cb(GtkWidget *w, gpointer data)
2027 GNCSplitReg *gsr = data;
2028 gnc_split_reg_sort(gsr, BY_DATE, no_force, refresh);
2032gnc_split_reg_sort_date_entered_cb(GtkWidget *w, gpointer data)
2034 GNCSplitReg *gsr = data;
2035 gnc_split_reg_sort(gsr, BY_DATE_ENTERED, no_force, refresh);
2039gnc_split_reg_sort_date_reconciled_cb(GtkWidget *w, gpointer data)
2041 GNCSplitReg *gsr = data;
2042 gnc_split_reg_sort(gsr, BY_DATE_RECONCILED, no_force, refresh);
2046gnc_split_reg_sort_num_cb(GtkWidget *w, gpointer data)
2048 GNCSplitReg *gsr = data;
2049 gnc_split_reg_sort(gsr, BY_NUM, no_force, refresh);
2053gnc_split_reg_sort_amount_cb(GtkWidget *w, gpointer data)
2055 GNCSplitReg *gsr = data;
2056 gnc_split_reg_sort(gsr, BY_AMOUNT, no_force, refresh);
2060gnc_split_reg_sort_memo_cb(GtkWidget *w, gpointer data)
2062 GNCSplitReg *gsr = data;
2063 gnc_split_reg_sort(gsr, BY_MEMO, no_force, refresh);
2067gnc_split_reg_sort_desc_cb(GtkWidget *w, gpointer data)
2069 GNCSplitReg *gsr = data;
2070 gnc_split_reg_sort(gsr, BY_DESC, no_force, refresh);
2074gnc_split_reg_sort_action_cb(GtkWidget *w, gpointer data)
2076 GNCSplitReg *gsr = data;
2077 gnc_split_reg_sort(gsr, BY_ACTION, no_force, refresh);
2081gnc_split_reg_sort_notes_cb(GtkWidget *w, gpointer data)
2083 GNCSplitReg *gsr = data;
2084 gnc_split_reg_sort(gsr, BY_NOTES, no_force, refresh);
2088gnc_split_reg_set_sort_reversed(GNCSplitReg *gsr, gboolean rev, Refresh ref)
2101 gsr->sort_rev = rev;
2108gnc_split_reg_record (GNCSplitReg *gsr)
2110 ENTER(
"gsr=%p", gsr);
2128gnc_split_reg_match_trans_row( VirtualLocation virt_loc,
2129 gpointer user_data )
2131 GNCSplitReg *gsr = user_data;
2138 return (cursor_class == CURSOR_CLASS_TRANS);
2142gnc_split_reg_goto_next_trans_row (GNCSplitReg *gsr)
2144 ENTER(
"gsr=%p", gsr);
2145 gnucash_register_goto_next_matching_row( gsr->reg,
2146 gnc_split_reg_match_trans_row,
2152gnc_split_reg_enter( GNCSplitReg *gsr, gboolean next_transaction )
2155 gboolean goto_blank;
2157 ENTER(
"gsr=%p, next_transaction=%s", gsr, next_transaction ?
"TRUE" :
"FALSE");
2160 GNC_PREF_ENTER_MOVES_TO_END);
2166 if ( !goto_blank && !next_transaction )
2170 if (style == REG_STYLE_LEDGER)
2175 if (blank_split != NULL)
2177 Split *current_split;
2181 if (blank_split == current_split)
2187 if (!gnc_split_reg_record (gsr))
2192 gnc_split_reg_focus_on_sheet (gsr);
2196 if (gnc_table_current_cursor_changed (sr->table, FALSE))
2203 if (!goto_blank && next_transaction)
2208 gnc_split_reg_jump_to_blank( gsr );
2209 else if (next_transaction)
2210 gnc_split_reg_goto_next_trans_row( gsr );
2212 gnucash_register_goto_next_virt_row( gsr->reg );
2217gsr_default_enter_handler( GNCSplitReg *gsr, gpointer data )
2219 gnc_split_reg_enter( gsr, FALSE );
2223gnc_split_reg_record_cb (GnucashRegister *reg, gpointer data)
2225 gsr_emit_simple_signal( (GNCSplitReg*)data,
"enter_ent" );
2229gnc_split_reg_size_allocate (GtkWidget *widget,
2230 GtkAllocation *allocation,
2233 GNCSplitReg *gsr = user_data;
2234 gsr->width = allocation->width;
2235 gtk_window_set_default_size( GTK_WINDOW(gsr->window), gsr->width, 0 );
2240add_summary_label (GtkWidget *summarybar, gboolean pack_start,
const char *label_str, GtkWidget *extra)
2243 GtkWidget *text_label, *secondary_label;
2245 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
2246 gtk_box_set_homogeneous (GTK_BOX (hbox), FALSE);
2248 gtk_box_pack_start( GTK_BOX(summarybar), hbox, FALSE, FALSE, 5 );
2250 gtk_box_pack_end( GTK_BOX(summarybar), hbox, FALSE, FALSE, 5 );
2252 text_label = gtk_label_new (label_str);
2253 gnc_label_set_alignment (text_label, 1.0, 0.5 );
2254 gtk_label_set_ellipsize (GTK_LABEL(text_label), PANGO_ELLIPSIZE_END);
2255 gtk_box_pack_start (GTK_BOX(hbox), text_label, FALSE, FALSE, 0);
2257 secondary_label = gtk_label_new (
"" );
2258 g_object_set_data (G_OBJECT(secondary_label),
"text_label", text_label);
2259 g_object_set_data (G_OBJECT(secondary_label),
"text_box", hbox);
2260 gnc_label_set_alignment (secondary_label, 1.0, 0.5 );
2261 gtk_box_pack_start (GTK_BOX(hbox), secondary_label, FALSE, FALSE, 0);
2264 gtk_box_pack_start( GTK_BOX(hbox), extra, FALSE, FALSE, 0 );
2266 return secondary_label;
2270gsr_summarybar_set_arrow_draw (GNCSplitReg *gsr)
2272 if (gsr->sort_arrow_handler_id > 0)
2273 g_signal_handler_disconnect (G_OBJECT(gsr->sort_arrow), gsr->sort_arrow_handler_id);
2275 gsr->sort_arrow_handler_id = g_signal_connect (G_OBJECT (gsr->sort_arrow),
"draw",
2276 G_CALLBACK (gnc_draw_arrow_cb), GINT_TO_POINTER(gsr->sort_rev));
2278 gtk_widget_queue_draw (gsr->sort_arrow);
2282gsr_create_summary_bar( GNCSplitReg *gsr )
2284 GtkWidget *summarybar = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
2285 gtk_box_set_homogeneous (GTK_BOX (summarybar), FALSE);
2286 gtk_widget_set_name (summarybar,
"gnc-id-summarybar");
2288 gsr->cleared_label = NULL;
2289 gsr->balance_label = NULL;
2290 gsr->reconciled_label = NULL;
2291 gsr->future_label = NULL;
2292 gsr->projectedminimum_label = NULL;
2293 gsr->sort_label = NULL;
2294 gsr->sort_arrow = NULL;
2295 gsr->filter_label = NULL;
2296 gsr->shares_label = NULL;
2297 gsr->value_label = NULL;
2299 if (gnc_ledger_display_type(gsr->ledger) == LD_SINGLE)
2303 gsr->balance_label = add_summary_label (summarybar, TRUE,
_(
"Present:"), NULL);
2304 gsr->future_label = add_summary_label (summarybar, TRUE,
_(
"Future:"), NULL);
2305 gsr->cleared_label = add_summary_label (summarybar, TRUE,
_(
"Cleared:"), NULL);
2306 gsr->reconciled_label = add_summary_label (summarybar, TRUE,
_(
"Reconciled:"), NULL);
2307 gsr->projectedminimum_label = add_summary_label (summarybar, TRUE,
_(
"Projected Minimum:"), NULL);
2311 gsr->shares_label = add_summary_label (summarybar, TRUE,
_(
"Shares:"), NULL);
2312 gsr->value_label = add_summary_label (summarybar, TRUE,
_(
"Current Value:"), NULL);
2316 gsr->filter_label = add_summary_label (summarybar, FALSE,
"", NULL);
2317 gsr->sort_arrow = gtk_image_new_from_icon_name (
"image-missing", GTK_ICON_SIZE_SMALL_TOOLBAR);
2318 gsr->sort_label = add_summary_label (summarybar, FALSE,
_(
"Sort By:"), gsr->sort_arrow);
2320 gnc_widget_style_context_add_class (GTK_WIDGET(gsr->filter_label),
"gnc-class-highlight");
2321 gnc_widget_style_context_add_class (GTK_WIDGET(gsr->sort_arrow),
"gnc-class-highlight");
2323 gsr->summarybar = summarybar;
2326 gsr_redraw_all_cb(NULL, gsr);
2327 return gsr->summarybar;
2338gnc_split_reg_get_placeholder( GNCSplitReg *gsr )
2342 gboolean single_account;
2345 return PLACEHOLDER_NONE;
2351 case GENERAL_JOURNAL:
2353 case PORTFOLIO_LEDGER:
2355 single_account = FALSE;
2358 single_account = TRUE;
2365 return PLACEHOLDER_NONE;
2369 return PLACEHOLDER_THIS;
2370 return PLACEHOLDER_NONE;
2391gtk_callback_bug_workaround (gpointer argp)
2394 const gchar *read_only_this =
_(
"This account register is read-only.");
2395 const gchar *read_only_acc =
_(
"The '%s' account register is read-only.");
2396 gchar *read_only = NULL;
2398 GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (args->gsr->ledger);
2400 const gchar *acc_name = NULL;
2406 if (ledger_type == LD_SINGLE)
2407 read_only = g_strdup_printf (read_only_acc, acc_name);
2410 gchar *tmp = g_strconcat (acc_name,
"+", NULL);
2411 read_only = g_strdup_printf (read_only_acc, tmp);
2416 read_only = g_strdup (read_only_this);
2418 dialog = gtk_message_dialog_new(GTK_WINDOW(args->gsr->window),
2419 GTK_DIALOG_DESTROY_WITH_PARENT,
2420 GTK_MESSAGE_WARNING,
2423 gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
2424 "%s", args->string);
2425 gnc_dialog_run(GTK_DIALOG(dialog), GNC_PREF_WARN_REG_IS_READ_ONLY);
2426 gtk_widget_destroy(dialog);
2437gnc_split_reg_determine_read_only( GNCSplitReg *gsr, gboolean show_dialog )
2445 gsr->read_only = TRUE;
2448 if ( !gsr->read_only )
2450 char *
string = NULL;
2452 if(reg->mismatched_commodities)
2454 string =
_(
"The transactions of this account may not be edited "
2455 "because its subaccounts have mismatched commodities "
2457 "You need to open each account individually to edit "
2462 switch (gnc_split_reg_get_placeholder(gsr))
2464 case PLACEHOLDER_NONE:
2468 case PLACEHOLDER_THIS:
2469 string =
_(
"The transactions of this account may not be edited.\n"
2470 "If you want to edit transactions in this register, "
2471 "please open the account options and turn off the "
2472 "placeholder checkbox.");
2476 string =
_(
"The transactions in one of the selected "
2477 "sub-accounts may not be edited.\n"
2478 "If you want to edit transactions in this register, please open "
2479 "the sub-account options and turn off the placeholder checkbox.\n"
2480 "You may also open an individual account instead "
2481 "of a set of accounts.");
2485 gsr->read_only = TRUE;
2490 args->string = string;
2493 g_timeout_add (250, gtk_callback_bug_workaround, args);
2505gnc_split_reg_get_parent( GNCLedgerDisplay *ledger )
2508 GNC_SPLIT_REG(gnc_ledger_display_get_user_data( ledger ));
2518gsr_emit_help_changed( GnucashRegister *reg, gpointer user_data )
2520 gsr_emit_simple_signal( (GNCSplitReg*)user_data,
"help-changed" );
2525gsr_emit_show_popup_menu( GnucashRegister *reg, gpointer user_data )
2527 gsr_emit_simple_signal( (GNCSplitReg*)user_data,
"show-popup-menu" );
2532gsr_emit_simple_signal( GNCSplitReg *gsr,
const char *sigName )
2534 g_signal_emit_by_name( gsr, sigName, NULL );
2538gnc_split_reg_get_register( GNCSplitReg *gsr )
2547gnc_split_reg_get_sort_type( GNCSplitReg *gsr )
2550 return gsr->sort_type;
2554gnc_split_reg_get_summarybar( GNCSplitReg *gsr )
2556 if ( !gsr )
return NULL;
2557 return gsr->summarybar;
2561gnc_split_reg_get_read_only( GNCSplitReg *gsr )
2568 gsr->read_only = FALSE;
2569 gnc_split_reg_determine_read_only (gsr, FALSE);
2573 return gsr->read_only;
2577gnc_split_reg_set_moved_cb( GNCSplitReg *gsr, GFunc cb, gpointer cb_data )
2579 gnucash_register_set_moved_cb (gsr->reg, cb, cb_data);
Account handling public routines.
Anchor Scheduled Transaction info in a book.
This file contains the functions to present a gui to the user for creating a new account or editing a...
All type declarations for the whole Gnucash engine.
File path resolution utility functions.
Gnome specific utility functions.
Public declarations for GncLedgerDisplay class.
Generic api to store and retrieve preferences.
a simple price database for gnucash
Functions to load, save and get gui state.
utility functions for the GnuCash UI
Utility functions for convert uri in separate components and back.
Public declarations of GnucashRegister class.
const char * xaccAccountGetName(const Account *acc)
Get the account's name.
void xaccAccountCommitEdit(Account *acc)
ThexaccAccountCommitEdit() subroutine is the second phase of a two-phase-commit wrapper for account u...
void xaccAccountBeginEdit(Account *acc)
The xaccAccountBeginEdit() subroutine is the first phase of a two-phase-commit wrapper for account up...
void xaccAccountSetFilter(Account *acc, const char *str)
Set the account's Filter.
const char * xaccAccountGetSortOrder(const Account *acc)
Get the account's Sort Order.
#define xaccAccountGetGUID(X)
gboolean xaccAccountIsPriced(const Account *acc)
Returns true if the account is a stock, mutual fund or currency, otherwise false.
void xaccAccountSetSortReversed(Account *acc, gboolean sortreversed)
Set the account's Sort Order direction.
gnc_numeric xaccAccountGetBalance(const Account *acc)
Get the current balance of the account, which may include future splits.
const char * xaccAccountGetFilter(const Account *acc)
Get the account's filter.
void xaccAccountSetSortOrder(Account *acc, const char *str)
Set the account's Sort Order.
gnc_numeric xaccAccountGetClearedBalance(const Account *acc)
Get the current balance of the account, only including cleared transactions.
gnc_numeric xaccAccountGetReconciledBalance(const Account *acc)
Get the current balance of the account, only including reconciled transactions.
gboolean xaccAccountGetSortReversed(const Account *acc)
Get the account's Sort Order direction.
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
Get the account's commodity
gboolean qof_book_is_readonly(const QofBook *book)
Return whether the book is read only.
const char * gnc_commodity_get_mnemonic(const gnc_commodity *cm)
Retrieve the mnemonic for the specified commodity.
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
time64 gnc_time(time64 *tbuf)
get the current time
Transaction * xaccTransReverse(Transaction *orig)
xaccTransReverse creates a Transaction that reverses the given transaction by inverting all the numer...
gboolean xaccAccountGetPlaceholder(const Account *acc)
Get the "placeholder" flag for an account.
GNCPlaceholderType xaccAccountGetDescendantPlaceholder(const Account *acc)
Returns PLACEHOLDER_NONE if account is NULL or neither account nor any descendant of account is a pla...
void xaccTransSetDescription(Transaction *trans, const char *desc)
Sets the transaction Description.
Transaction * xaccTransGetReversedBy(const Transaction *trans)
Returns the transaction that reversed the given transaction.
#define xaccTransAppendSplit(t, s)
Add a split to the transaction.
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
const char * xaccTransGetDescription(const Transaction *trans)
Gets the transaction Description.
GNCPlaceholderType
DOCUMENT ME!
gboolean xaccTransHasReconciledSplits(const Transaction *trans)
FIXME: document me.
Split * xaccTransGetSplit(const Transaction *trans, int i)
Return a pointer to the indexed split in this transaction's split list.
void xaccTransSetDateEnteredSecs(Transaction *trans, time64 secs)
Modify the date of when the transaction was entered.
void xaccTransSetDocLink(Transaction *trans, const char *doclink)
Sets the transaction Document Link.
Transaction * xaccMallocTransaction(QofBook *book)
The xaccMallocTransaction() will malloc memory and initialize it.
void xaccTransSetDatePostedSecsNormalized(Transaction *trans, time64 time)
This function sets the posted date of the transaction, specified by a time64 (see ctime(3)).
void xaccTransSetCurrency(Transaction *trans, gnc_commodity *curr)
Set a new currency on a transaction.
#define xaccAccountInsertSplit(acc, s)
The xaccAccountInsertSplit() method will insert the indicated split into the indicated account.
gboolean xaccTransIsReadonlyByPostedDate(const Transaction *trans)
Returns TRUE if this Transaction is read-only because its posted-date is older than the "auto-readonl...
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
const char * xaccTransGetReadOnly(Transaction *trans)
Returns a non-NULL value if this Transaction was marked as read-only with some specific "reason" text...
#define GUID_ENCODING_LENGTH
Number of characters needed to encode a guid as a string not including the null terminator.
gboolean guid_equal(const GncGUID *guid_1, const GncGUID *guid_2)
Given two GUIDs, return TRUE if they are non-NULL and equal.
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...
GKeyFile * gnc_state_get_current(void)
Returns a pointer to the most recently loaded state.
void gnc_ledger_display_set_handlers(GNCLedgerDisplay *ld, GNCLedgerDisplayDestroy destroy, GNCLedgerDisplayGetParent get_parent)
set the handlers used by the ledger display
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.
Query * gnc_ledger_display_get_query(GNCLedgerDisplay *ld)
return the query associated with a ledger
void gnc_ledger_display_refresh(GNCLedgerDisplay *ld)
redisplay/redraw only the indicated window.
Account * gnc_ledger_display_leader(GNCLedgerDisplay *ld)
Implementations.
void gnc_ledger_display_set_user_data(GNCLedgerDisplay *ld, gpointer user_data)
get and set the user data associated with the ledger
GtkWidget * gnucash_register_new(Table *table, const gchar *state_section)
this already has scrollbars attached
SplitRegister * gnc_ledger_display_get_split_register(GNCLedgerDisplay *ld)
return the split register associated with a ledger display
int xaccSPrintAmount(char *bufp, gnc_numeric val, GNCPrintAmountInfo info)
Make a string representation of a gnc_numeric.
char * gnc_wrap_text_with_bidi_ltr_isolate(const char *text)
This function helps with GTK's use of 'Unicode Bidirectional Text Algorithm'.
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.
gnc_commodity * gnc_default_currency(void)
Return the default currency set by the user.
void qof_instance_get(const QofInstance *inst, const gchar *first_prop,...)
Wrapper for g_object_get.
#define LEAVE(format, args...)
Print a function exit debugging message.
#define ENTER(format, args...)
Print a function entry debugging message.
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
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_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.
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_prefs_get_bool(const gchar *group, const gchar *pref_name)
Get a boolean value from the preferences backend.
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.
GNCPriceDB * gnc_pricedb_get_db(QofBook *book)
Return the pricedb associated with the book.
#define QUERY_DEFAULT_SORT
Default sort object type.
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 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.
#define xaccSchedXactionGetGUID(X)
CursorClass gnc_split_register_get_cursor_class(SplitRegister *reg, VirtualCellLocation vcell_loc)
Returns the class of the cursor at the given virtual cell location.
SplitRegisterStyle
Register styles.
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 ...
void gnc_split_register_set_read_only(SplitRegister *reg, gboolean read_only)
Sets whether a register window is "read only".
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 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,...
gboolean gnc_split_register_save(SplitRegister *reg, gboolean do_commit)
Copy the contents of the current cursor to a split.
Split * gnc_split_register_get_current_split(SplitRegister *reg)
Returns the split at which the cursor is currently located.
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...
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...
void gnc_split_register_delete_current_split(SplitRegister *reg)
Deletes the split associated with the current cursor, if both are non-NULL.
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,...
gboolean gnc_split_register_get_split_virt_loc(SplitRegister *reg, Split *split, VirtualCellLocation *vcell_loc)
Searches the split register for a given split.
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...
void gnc_split_register_cut_current(SplitRegister *reg)
Equivalent to copying the current entity and the deleting it with the appropriate delete method.
void gnc_split_register_redraw(SplitRegister *reg)
Causes a redraw of the register window associated with reg.
void gnc_split_register_expand_current_trans(SplitRegister *reg, gboolean expand)
Expand the current transaction if it is collapsed.
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.
void gnc_split_register_cancel_cursor_split_changes(SplitRegister *reg)
Cancels any changes made to the current cursor, reloads the cursor from the engine,...
Split * gnc_split_register_get_blank_split(SplitRegister *reg)
Gets the blank split for a register.
void gnc_split_register_set_reverse_sort(SplitRegister *reg, gboolean reverse_sort)
Sets a split register's reverse sort order based on register.
gboolean gnc_split_register_is_blank_split(SplitRegister *reg, Split *split)
Return TRUE if split is the blank_split.
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.
CursorClass
Types of cursors.
CursorClass gnc_split_register_get_current_cursor_class(SplitRegister *reg)
Returns the class of a register's current cursor.
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.
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_delete_current_trans(SplitRegister *reg)
Deletes the transaction associated with the current cursor, if both are non-NULL.
void gnc_table_save_state(Table *table, const gchar *state_section)
Implementation.
Transaction * xaccSplitGetParent(const Split *split)
Returns the parent transaction of the split.
char xaccSplitGetReconcile(const Split *split)
Returns the value of the reconcile flag.
void xaccSplitSetValue(Split *split, gnc_numeric val)
The xaccSplitSetValue() method sets the value of this split in the transaction's commodity.
Split * xaccMallocSplit(QofBook *book)
Constructor.
void xaccSplitSetAmount(Split *split, gnc_numeric amt)
The xaccSplitSetAmount() method sets the amount in the account's commodity that the split should have...
const char * xaccSplitGetMemo(const Split *split)
Returns the memo string.
#define FREC
frozen into accounting period
#define YREC
The Split has been reconciled.
The type used to store guids in C.
Declarations for the Table object.