30 #include <glib/gi18n.h>
33 #include <gdk/gdkkeysyms.h>
36 #include "gnc-tree-view-split-reg.h"
37 #include "gnc-tree-model-split-reg.h"
38 #include "gnc-tree-control-split-reg.h"
39 #include "gnc-tree-util-split-reg.h"
41 #include "gnome-utils/gnc-warnings.h"
42 #include "dialog-utils.h"
45 #include "engine-helpers.h"
47 #include "gnc-exp-parser.h"
50 #include "gnc-amount-edit.h"
74 static void gnc_tree_view_split_reg_dispose (GObject *
object);
75 static void gnc_tree_view_split_reg_finalize (GObject *
object);
77 static guint gnc_tree_view_split_reg_signals[LAST_SIGNAL] = {0};
79 static void gnc_tree_view_split_reg_pref_changed (gpointer prefs, gchar *pref, gpointer user_data);
81 static void gtv_sr_cdf0 (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *s_model,
82 GtkTreeIter *s_iter, gpointer user_data);
84 static void gtv_sr_cdf1 (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *s_model,
85 GtkTreeIter *s_iter, gpointer user_data);
87 static void gtv_sr_control_cdf0 (GtkTreeViewColumn *col, GtkCellRenderer *renderer,
88 GtkTreeModel *s_model, GtkTreeIter *s_iter, gpointer user_data);
92 static void gtv_sr_edited_cb (GtkCellRendererText *cell,
const gchar *path_string,
93 const gchar *new_text, gpointer user_data);
95 static void gtv_sr_edited_normal_cb (GtkCellRendererText *cell,
const gchar *path_string,
96 const gchar *new_text, gpointer user_data);
98 static void gtv_sr_edited_template_cb (GtkCellRendererText *cell,
const gchar *path_string,
99 const gchar *new_text, gpointer user_data);
101 static void start_edit (GtkCellRenderer *cr, GtkCellEditable *editable,
102 const gchar *path, gpointer user_data);
108 static void gtv_sr_editable_start_editing_cb (GtkCellRenderer *cr, GtkCellEditable *editable,
109 const gchar *path, gpointer user_data);
111 static void gtv_sr_editing_canceled_cb (GtkCellRenderer *cr, gpointer user_data);
113 static void gtv_sr_match_selected_cb (GtkEntryCompletion *widget, GtkTreeModel *model,
114 GtkTreeIter *iter, gpointer user_data);
116 static void gtv_sr_changed_cb (GtkCellRendererCombo *widget, gchar *path_string,
117 GtkTreeIter *iter, gpointer user_data);
119 static void gtv_sr_selection_move_delete_cb (
GncTreeModelSplitReg *model, gpointer item, gpointer user_data);
121 static gboolean gtv_sr_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data);
123 static gboolean gtv_sr_ed_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data);
125 static gboolean gtv_sr_button_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data);
127 static gboolean gtv_sr_focus_out_cb (GtkWidget *widget, GdkEventFocus *event, gpointer user_data);
129 static void gtv_sr_motion_cb (GtkTreeSelection *sel, gpointer user_data);
142 int visibility_model_col;
143 int always_visible_col;
144 void (*edited_cb)(GtkCellRendererText *,
const gchar *,
145 const gchar *, gpointer);
146 void (*editing_started_cb)(GtkCellRenderer *, GtkCellEditable *,
147 const gchar *, gpointer);
148 GtkTreeIterCompareFunc sort_fn;
152 static ColDef all_tree_view_split_reg_columns[] = {
153 {COL_DATE, GNC_TREE_MODEL_SPLIT_REG_COL_DATE,
154 "Date",
"date",
"00/00/0000",
155 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 1,
156 gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb,
157 gnc_tree_model_split_reg_sort_iter_compare_func},
160 "Due Date",
"duedate",
"00/00/0000",
161 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 1,
162 gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb, NULL},
164 {COL_NUMACT, GNC_TREE_MODEL_SPLIT_REG_COL_NUMACT,
165 "Num / Act / Act",
"numact",
"0000",
166 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 0,
167 gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb,
168 gnc_tree_model_split_reg_sort_iter_compare_func},
170 {COL_DESCNOTES, GNC_TREE_MODEL_SPLIT_REG_COL_DESCNOTES,
171 "Description / Notes / Memo",
"descnotes",
"xxxxxxxxxxxxxxxxxxx",
172 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 1,
173 gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb,
174 gnc_tree_model_split_reg_sort_iter_compare_func},
176 {COL_TRANSFERVOID, -1,
177 "Transfer / Void",
"transfervoid",
"xxxxxxxxxxxxxxxxxxx",
178 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 1,
179 gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb, NULL},
181 {COL_RECN, GNC_TREE_MODEL_SPLIT_REG_COL_RECN,
183 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 0,
184 gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb,
185 gnc_tree_model_split_reg_sort_iter_compare_func},
188 "Type",
"type",
"xx",
189 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 0,
190 gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb, NULL},
193 "Value",
"value",
"00000",
194 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 0,
195 gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb, NULL},
198 "Amount",
"amount",
"00000",
199 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 0,
200 gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb, NULL},
203 "Amount / Value",
"amtval",
"00000",
204 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 1,
205 gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb, NULL},
208 "Rate",
"rate",
"00000",
209 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 0,
210 gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb, NULL},
213 "Price",
"price",
"00000",
214 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 1,
215 gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb, NULL},
217 {COL_DEBIT, GNC_TREE_MODEL_SPLIT_REG_COL_DEBIT,
218 "Debit",
"debit",
"00000",
219 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 1,
220 gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb,
221 gnc_tree_model_split_reg_sort_iter_compare_func},
223 {COL_CREDIT, GNC_TREE_MODEL_SPLIT_REG_COL_CREDIT,
224 "Credit",
"credit",
"00000",
225 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 1,
226 gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb,
227 gnc_tree_model_split_reg_sort_iter_compare_func},
230 "Balance",
"balance",
"00000",
231 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 0,
236 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 1,
240 "Commodity",
"commodity",
"xxxxxxxx",
241 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 0,
255 Split *current_split;
256 RowDepth current_depth;
257 GtkTreeRowReference *current_ref;
260 TransConfirm trans_confirm;
262 GtkCellRenderer *temp_cr;
263 gulong fo_handler_id;
265 gboolean acct_short_names;
266 gboolean double_line;
268 gboolean auto_complete;
269 gboolean negative_in_red;
270 gboolean use_horizontal_lines;
271 gboolean use_vertical_lines;
273 gboolean show_calendar_buttons;
274 gboolean show_extra_dates_on_selection;
275 gboolean selection_to_blank_on_expand;
278 gint single_button_press;
280 gchar *transfer_string;
281 gboolean stop_cell_move;
286 #define PINKCELL "#F8BEC6"
287 #define REDCELL "#F34943"
288 #define BLUECELL "#1D80DF"
289 #define BLACKCELL "#CBCBD2"
290 #define YELLOWCELL "#FFEF98"
291 #define ORANGECELL "#F39536"
294 #define GNC_PREF_SHOW_EXTRA_DATES "show-extra-dates"
295 #define GNC_PREF_SHOW_EXTRA_DATES_ON_SEL "show-extra-dates-on-selection"
296 #define GNC_PREF_SHOW_CAL_BUTTONS "show-calendar-buttons"
297 #define GNC_PREF_SEL_TO_BLANK_ON_EXPAND "selection-to-blank-on-expand"
298 #define GNC_PREF_KEY_LENGTH "key-length"
301 #define SHOW_SYMBOL FALSE
303 #define GNC_TREE_VIEW_SPLIT_REG_GET_PRIVATE(o) \
304 (G_TYPE_INSTANCE_GET_PRIVATE ((o), GNC_TYPE_TREE_VIEW_SPLIT_REG, GncTreeViewSplitRegPrivate))
306 static GObjectClass *parent_class = NULL;
309 gnc_tree_view_split_reg_get_type(
void)
311 static GType gnc_tree_view_split_reg_type = 0;
313 if (gnc_tree_view_split_reg_type == 0)
315 static const GTypeInfo our_info =
320 (GClassInitFunc) gnc_tree_view_split_reg_class_init,
325 (GInstanceInitFunc) gnc_tree_view_split_reg_init
328 gnc_tree_view_split_reg_type = g_type_register_static (GNC_TYPE_TREE_VIEW,
329 "GncTreeViewSplitReg",
332 return gnc_tree_view_split_reg_type;
339 GObjectClass *o_class;
341 parent_class = g_type_class_peek_parent (klass);
343 o_class = G_OBJECT_CLASS (klass);
345 o_class->dispose = gnc_tree_view_split_reg_dispose;
346 o_class->finalize = gnc_tree_view_split_reg_finalize;
350 gnc_tree_view_split_reg_signals[UPDATE_SIGNAL] =
351 g_signal_new(
"update_signal",
352 G_TYPE_FROM_CLASS (o_class),
356 g_cclosure_marshal_VOID__VOID,
359 gnc_tree_view_split_reg_signals[HELP_SIGNAL] =
360 g_signal_new(
"help_signal",
361 G_TYPE_FROM_CLASS (o_class),
365 g_cclosure_marshal_VOID__VOID,
368 klass->update_signal = NULL;
369 klass->help_signal = NULL;
378 GtkTreeModelSort *s_model = GTK_TREE_MODEL_SORT (gtk_tree_view_get_model (GTK_TREE_VIEW (view)));
379 return GNC_TREE_MODEL_SPLIT_REG (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (s_model)));
385 const gchar *path_string, GtkTreeIter *m_iter)
387 GtkTreeModel *s_model;
390 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
392 if (!gtk_tree_model_get_iter_from_string (s_model, &s_iter, path_string))
397 gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model), m_iter, &s_iter);
404 GtkTreeSelection *sel, GtkTreeIter *m_iter)
406 GtkTreeModel *s_model;
409 if (gtk_tree_selection_get_selected (sel, &s_model, &s_iter))
411 gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model), m_iter, &s_iter);
421 gnc_tree_view_split_reg_get_sort_path_from_model_path (
GncTreeViewSplitReg *view, GtkTreePath *mpath)
423 GtkTreeModel *s_model;
426 g_return_val_if_fail (mpath, NULL);
427 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
428 spath = gtk_tree_model_sort_convert_child_path_to_path (GTK_TREE_MODEL_SORT (s_model), mpath);
441 gnc_tree_view_split_reg_get_model_path_from_sort_path (
GncTreeViewSplitReg *view, GtkTreePath *spath)
443 GtkTreeModel *s_model;
446 g_return_val_if_fail (spath, NULL);
447 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
448 mpath = gtk_tree_model_sort_convert_path_to_child_path (GTK_TREE_MODEL_SORT (s_model), spath);
464 view->priv->current_trans = NULL;
465 view->priv->current_split = NULL;
466 view->priv->current_depth = 0;
467 view->reg_closing = FALSE;
468 view->priv->fo_handler_id = 0;
469 view->priv->auto_complete = FALSE;
470 view->priv->trans_confirm = RESET;
471 view->priv->single_button_press = 0;
473 view->priv->transfer_string = g_strdup (
"Dummy");
474 view->priv->stop_cell_move = FALSE;
476 view->priv->show_calendar_buttons =
gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL_REGISTER, GNC_PREF_SHOW_CAL_BUTTONS);
477 view->show_extra_dates =
gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL_REGISTER, GNC_PREF_SHOW_EXTRA_DATES);
478 view->priv->show_extra_dates_on_selection =
gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL_REGISTER, GNC_PREF_SHOW_EXTRA_DATES_ON_SEL);
479 view->priv->selection_to_blank_on_expand =
gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL_REGISTER, GNC_PREF_SEL_TO_BLANK_ON_EXPAND);
480 view->priv->key_length =
gnc_prefs_get_float (GNC_PREFS_GROUP_GENERAL_REGISTER, GNC_PREF_KEY_LENGTH);
482 view->priv->acct_short_names =
gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL_REGISTER, GNC_PREF_SHOW_LEAF_ACCT_NAMES);
483 view->priv->negative_in_red =
gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL, GNC_PREF_NEGATIVE_IN_RED);
484 view->priv->use_horizontal_lines =
gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL_REGISTER,
485 GNC_PREF_DRAW_HOR_LINES);
487 view->priv->use_vertical_lines =
gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL_REGISTER,
488 GNC_PREF_DRAW_VERT_LINES);
491 GNC_PREF_DRAW_HOR_LINES,
492 gnc_tree_view_split_reg_pref_changed,
495 GNC_PREF_DRAW_VERT_LINES,
496 gnc_tree_view_split_reg_pref_changed,
502 gnc_tree_view_split_reg_dispose (GObject *
object)
510 view = GNC_TREE_VIEW_SPLIT_REG (
object);
511 priv = GNC_TREE_VIEW_SPLIT_REG_GET_PRIVATE (view);
516 ENTER(
"split reg view %p",
object);
518 priv->disposed = TRUE;
520 if(view->priv->current_ref != NULL)
522 gtk_tree_row_reference_free (view->priv->current_ref);
523 view->priv->current_ref = NULL;
527 g_free (view->help_text);
529 if (view->priv->transfer_string)
530 g_free (view->priv->transfer_string);
533 GNC_PREF_DRAW_HOR_LINES,
534 gnc_tree_view_split_reg_pref_changed,
537 GNC_PREF_DRAW_VERT_LINES,
538 gnc_tree_view_split_reg_pref_changed,
541 if (G_OBJECT_CLASS (parent_class)->dispose)
542 (* G_OBJECT_CLASS (parent_class)->dispose) (
object);
549 gnc_tree_view_split_reg_finalize (GObject *
object)
556 ENTER(
"split reg view %p",
object);
558 view = GNC_TREE_VIEW_SPLIT_REG (
object);
560 if (G_OBJECT_CLASS(parent_class)->finalize)
561 (* G_OBJECT_CLASS(parent_class)->finalize) (
object);
573 model = gnc_tree_view_split_reg_get_model_from_view (view);
576 GNC_PREF_USE_THEME_COLORS);
578 GNC_PREF_ACCOUNTING_LABELS);
581 GNC_PREF_ALT_COLOR_BY_TRANS);
584 GNC_PREF_NEGATIVE_IN_RED);
589 gnc_tree_view_split_reg_pref_changed (gpointer prefs, gchar *pref, gpointer user_data)
593 g_return_if_fail (pref);
598 if (g_str_has_suffix (pref, GNC_PREF_DRAW_HOR_LINES) || g_str_has_suffix (pref, GNC_PREF_DRAW_VERT_LINES))
600 view->priv->use_horizontal_lines =
gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL_REGISTER,
601 GNC_PREF_DRAW_HOR_LINES);
603 view->priv->use_vertical_lines =
gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL_REGISTER,
604 GNC_PREF_DRAW_VERT_LINES);
606 if (view->priv->use_horizontal_lines)
608 if (view->priv->use_vertical_lines)
609 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (view), GTK_TREE_VIEW_GRID_LINES_BOTH);
611 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (view), GTK_TREE_VIEW_GRID_LINES_HORIZONTAL);
613 else if (view->priv->use_vertical_lines)
614 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (view), GTK_TREE_VIEW_GRID_LINES_VERTICAL);
616 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (view), GTK_TREE_VIEW_GRID_LINES_NONE);
620 g_warning(
"gnc_tree_view_split_reg_pref_changed: Unknown preference %s", pref);
626 static const gchar *rc_string =
628 "style \"solidTreeLines\"\n"
630 " GtkTreeView::grid-line-pattern = \"\1\"\n"
631 " GtkTreeView::grid-line-width = 1\n"
634 "class \"GtkTreeView\" style \"solidTreeLines\"\n"
648 case ASSET_REGISTER2:
649 case CREDIT_REGISTER2:
650 case LIABILITY_REGISTER2:
651 case INCOME_REGISTER2:
652 case EXPENSE_REGISTER2:
653 case EQUITY_REGISTER2:
654 case TRADING_REGISTER2:
657 static ViewCol col_list[] = {
658 COL_DATE, COL_NUMACT, COL_DESCNOTES, COL_TRANSFERVOID, COL_RECN,
659 COL_STATUS, COL_DEBIT, COL_CREDIT, COL_BALANCE, -1};
664 case GENERAL_LEDGER2:
666 static ViewCol col_list[] = {
667 COL_DATE, COL_NUMACT, COL_DESCNOTES, COL_TRANSFERVOID, COL_RECN,
668 COL_STATUS, COL_COMM, COL_VALUE, COL_RATE, COL_AMOUNT, COL_DEBIT, COL_CREDIT, -1};
673 case STOCK_REGISTER2:
674 case CURRENCY_REGISTER2:
676 static ViewCol col_list[] = {
677 COL_DATE, COL_NUMACT, COL_DESCNOTES, COL_TRANSFERVOID, COL_RECN,
678 COL_STATUS, COL_AMTVAL, COL_PRICE, COL_DEBIT, COL_CREDIT, COL_BALANCE, -1};
683 case RECEIVABLE_REGISTER2:
684 case PAYABLE_REGISTER2:
686 static ViewCol col_list[] = {
687 COL_DATE, COL_TYPE, COL_DUEDATE, COL_NUMACT, COL_DESCNOTES, COL_TRANSFERVOID,
688 COL_STATUS, COL_DEBIT, COL_CREDIT, COL_BALANCE, -1};
692 case PORTFOLIO_LEDGER2:
694 static ViewCol col_list[] = {
695 COL_DATE, COL_NUMACT, COL_DESCNOTES, COL_TRANSFERVOID, COL_RECN,
696 COL_STATUS, COL_AMOUNT, COL_PRICE, COL_DEBIT, COL_CREDIT, -1};
702 static ViewCol col_list[] = {
703 COL_DATE, COL_NUMACT, COL_DESCNOTES, COL_TRANSFERVOID, COL_RECN,
704 COL_STATUS, COL_DEBIT, COL_CREDIT, -1};
711 static ViewCol col_list[] = {
712 COL_DATE, COL_NUMACT, COL_DESCNOTES, COL_TRANSFERVOID, COL_RECN,
714 COL_VALUE, COL_AMOUNT, COL_RATE, COL_PRICE, COL_DEBIT, COL_CREDIT,
730 while (col_list && col_list[i] != -1) {
732 GtkCellRenderer *cr0;
733 GtkCellRenderer *cr1;
734 GtkTreeViewColumn *col;
737 int j, ncol = G_N_ELEMENTS (all_tree_view_split_reg_columns);
739 for (j = 0; j < ncol; j++) {
740 if (col_list[i] == all_tree_view_split_reg_columns[j].viewcol) {
741 def = all_tree_view_split_reg_columns[j];
746 PERR(
"Failed to find column definition.");
750 if (col_list[i] == COL_TRANSFERVOID) {
753 GNC_TREE_VIEW (view), def.title, def.pref_name, def.sizer,
754 def.modelcol, def.visibility_model_col,
755 GTK_TREE_MODEL (gnc_tree_model_split_reg_get_acct_list (model)), 0, def.sort_fn);
757 }
else if (col_list[i] == COL_DATE) {
759 GNC_TREE_VIEW (view), def.title, def.pref_name, NULL, def.sizer,
760 def.modelcol, def.visibility_model_col, def.sort_fn);
762 }
else if (col_list[i] == COL_NUMACT) {
764 GNC_TREE_VIEW (view), def.title, def.pref_name, def.sizer,
765 def.modelcol, def.visibility_model_col,
766 GTK_TREE_MODEL (gnc_tree_model_split_reg_get_action_list (model)), 0, def.sort_fn);
770 cr1 = gtk_cell_renderer_text_new ();
771 gtk_tree_view_column_pack_start (col, cr1, TRUE);
772 gtk_tree_view_column_add_attribute (col, cr1,
"visible", GNC_TREE_MODEL_SPLIT_REG_COL_NUM_VIS);
775 g_object_set (cr1,
"xalign", 1.0, NULL);
776 g_object_set_data (G_OBJECT(cr1),
"model_column", GINT_TO_POINTER (def.modelcol));
777 g_object_set_data (G_OBJECT(cr1),
"column_name", GINT_TO_POINTER (def.pref_name));
778 g_signal_connect (G_OBJECT(cr1),
"editing-started", (GCallback) def.editing_started_cb, view);
779 g_signal_connect (G_OBJECT(cr1),
"editing-canceled", G_CALLBACK (gtv_sr_editing_canceled_cb), view);
780 g_object_set (G_OBJECT (cr1),
"editable", TRUE, NULL);
781 g_signal_connect (G_OBJECT (cr1),
"edited", (GCallback) def.edited_cb, view);
782 g_object_set_data (G_OBJECT (cr1),
"view_column", GINT_TO_POINTER (def.viewcol));
783 gtk_tree_view_column_set_cell_data_func (col, cr1, gtv_sr_cdf1, view, NULL);
787 GNC_TREE_VIEW (view), def.title, def.pref_name, NULL, def.sizer,
788 def.modelcol, def.visibility_model_col, def.sort_fn);
791 g_object_set_data (G_OBJECT (col), DEFAULT_VISIBLE, GINT_TO_POINTER (1));
792 g_object_set_data (G_OBJECT (col), ALWAYS_VISIBLE, GINT_TO_POINTER (def.always_visible_col));
795 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (col));
796 cr0 = g_list_nth_data (renderers, 0);
797 g_list_free (renderers);
800 g_object_set (cr0,
"xalign", 1.0, NULL);
802 if (col_list[i] == COL_NUMACT)
803 gtk_tree_view_column_add_attribute (col, cr0,
"visible", GNC_TREE_MODEL_SPLIT_REG_COL_ACT_VIS);
806 if (col_list[i] == COL_STATUS)
807 g_object_set_data_full (G_OBJECT(col), REAL_TITLE, g_strdup (_(
"Status Bar")), g_free);
812 if (def.editing_started_cb)
815 g_object_set_data (G_OBJECT (cr0),
"model_column", GINT_TO_POINTER (def.modelcol));
816 g_object_set_data (G_OBJECT (cr0),
"column_name", GINT_TO_POINTER (def.pref_name));
817 g_signal_connect (G_OBJECT (cr0),
"editing-started", (GCallback) def.editing_started_cb, view);
821 g_signal_connect (G_OBJECT (cr0),
"editing-canceled", G_CALLBACK (gtv_sr_editing_canceled_cb), view);
823 gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED);
828 g_object_set (G_OBJECT (col),
"resizable", TRUE, NULL);
831 g_object_set (G_OBJECT (col),
"reorderable", TRUE, NULL);
835 g_object_set (G_OBJECT (cr0),
"editable", TRUE, NULL);
836 g_signal_connect (G_OBJECT (cr0),
"edited", (GCallback) def.edited_cb, view);
839 g_object_set_data (G_OBJECT (cr0),
"view_column", GINT_TO_POINTER (def.viewcol));
840 gtk_tree_view_column_set_cell_data_func (col, cr0, gtv_sr_cdf0, view, NULL);
844 gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (view)), GTK_SELECTION_BROWSE);
846 g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (view)),
"changed", G_CALLBACK (gtv_sr_motion_cb), view);
849 g_object_set_data (G_OBJECT (view),
"data-edited", GINT_TO_POINTER (FALSE));
852 g_signal_connect (G_OBJECT (model),
"selection_move_delete", G_CALLBACK (gtv_sr_selection_move_delete_cb), view);
855 g_signal_connect (G_OBJECT (model),
"refresh_view", G_CALLBACK (gtv_sr_refresh_view_cb), view);
858 g_signal_connect (G_OBJECT (view),
"key-press-event", G_CALLBACK (gtv_sr_key_press_cb), NULL);
861 g_signal_connect (G_OBJECT (view),
"button_press_event", G_CALLBACK (gtv_sr_button_cb), NULL);
873 GtkTreePath *mpath, *spath;
876 ENTER(
" #### Set View Format #### ");
878 model = gnc_tree_view_split_reg_get_model_from_view (view);
882 total_num = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (model), NULL);
884 mpath = gtk_tree_row_reference_get_path (view->priv->current_ref);
886 spath = gnc_tree_view_split_reg_get_sort_path_from_model_path (view, mpath);
888 priv->expanded = FALSE;
891 if (model->
style == REG2_STYLE_JOURNAL)
893 gtk_tree_view_expand_all (GTK_TREE_VIEW (view));
895 priv->expanded = TRUE;
897 gtk_tree_path_free (mpath);
898 gtk_tree_path_free (spath);
901 gnc_tree_view_split_reg_call_uiupdate_cb (view);
903 LEAVE(
"#### Journal format ####");
909 gtk_tree_view_collapse_all (GTK_TREE_VIEW (view));
911 priv->expanded = FALSE;
913 LEAVE(
"#### Single line foramt ####");
921 path = gtk_tree_path_new_first ();
922 while (index < total_num)
924 gtk_tree_view_expand_to_path (GTK_TREE_VIEW (view), path);
925 gtk_tree_path_down (path);
926 gtk_tree_view_collapse_row (GTK_TREE_VIEW (view), path);
927 gtk_tree_path_up (path);
928 gtk_tree_path_next (path);
931 gtk_tree_path_free (path);
932 LEAVE(
"#### Double line format ####");
936 if ((model->
style == REG2_STYLE_AUTO_LEDGER) || (model->
style == REG2_STYLE_JOURNAL))
938 gtk_tree_view_expand_row (GTK_TREE_VIEW (view), spath, TRUE);
940 priv->expanded = TRUE;
941 LEAVE(
"#### Auto expand line format ####");
945 gtk_tree_path_free (mpath);
946 gtk_tree_path_free (spath);
949 gnc_tree_view_split_reg_call_uiupdate_cb (view);
961 GtkTreePath *mpath, *spath;
965 model = gnc_tree_view_split_reg_get_model_from_view (view);
969 mpath = gnc_tree_model_split_reg_get_path_to_split_and_trans (model, NULL, trans);
971 spath = gnc_tree_view_split_reg_get_sort_path_from_model_path (view, mpath);
975 gtk_tree_view_collapse_row (GTK_TREE_VIEW (view), spath);
976 priv->expanded = FALSE;
977 LEAVE(
"#### Single line transaction foramt ####");
982 gtk_tree_view_expand_to_path (GTK_TREE_VIEW (view), spath);
983 gtk_tree_path_down (spath);
984 gtk_tree_view_collapse_row (GTK_TREE_VIEW (view), spath);
985 gtk_tree_path_up (spath);
986 priv->expanded = FALSE;
987 LEAVE(
"#### Double line transaction format ####");
991 if ((model->
style == REG2_STYLE_AUTO_LEDGER) || (model->
style == REG2_STYLE_JOURNAL))
993 gtk_tree_view_expand_row (GTK_TREE_VIEW (view), spath, TRUE);
994 priv->expanded = TRUE;
995 LEAVE(
"#### Auto expand line transaction format ####");
998 gtk_tree_path_free (mpath);
999 gtk_tree_path_free (spath);
1002 gnc_tree_view_split_reg_call_uiupdate_cb (view);
1014 gnc_tree_view_split_reg_set_format (view);
1022 GtkTreeModel *s_model;
1024 GtkTreeSelection *selection;
1026 view = g_object_new (gnc_tree_view_split_reg_get_type(), NULL);
1027 g_object_set (view,
"name",
"split_reg_tree", NULL);
1029 view->priv->anchor = gnc_tree_model_split_reg_get_anchor (model);
1032 g_assert (view->priv->reg_currency);
1034 view->help_text = g_strdup (
"Help Text");
1037 gtk_rc_parse_string (rc_string);
1040 if (view->priv->use_horizontal_lines)
1042 if (view->priv->use_vertical_lines)
1043 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (view), GTK_TREE_VIEW_GRID_LINES_BOTH);
1045 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (view), GTK_TREE_VIEW_GRID_LINES_HORIZONTAL);
1047 else if (view->priv->use_vertical_lines)
1048 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (view), GTK_TREE_VIEW_GRID_LINES_VERTICAL);
1050 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (view), GTK_TREE_VIEW_GRID_LINES_NONE);
1056 gtk_tree_view_set_show_expanders (GTK_TREE_VIEW (view), FALSE);
1059 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
1061 gtk_tree_selection_unselect_all (selection);
1064 s_model = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (model));
1066 PINFO(
"#### After Models are Setup ####");
1072 gnc_tree_view_split_reg_set_cols (view, model, gnc_tree_view_split_reg_get_colummn_list (model));
1074 PINFO(
"#### Before View connected to Model ####");
1077 gtk_tree_view_set_model (GTK_TREE_VIEW (view), s_model);
1078 g_object_unref (G_OBJECT (s_model));
1080 PINFO(
"#### After View connected to Model ####");
1083 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (s_model),
1084 GNC_TREE_MODEL_SPLIT_REG_COL_DATE,
1085 GTK_SORT_ASCENDING);
1087 PINFO(
"#### After Set Default Sort Column ####");
1098 g_signal_handlers_block_by_func (gtk_tree_view_get_selection (GTK_TREE_VIEW (view)), gtv_sr_motion_cb, view);
1100 g_signal_handlers_unblock_by_func (gtk_tree_view_get_selection (GTK_TREE_VIEW (view)), gtv_sr_motion_cb, view);
1109 GtkTreePath *new_mpath, *mpath, *spath;
1112 ENTER(
"#### Default Selection ####");
1114 model = gnc_tree_view_split_reg_get_model_from_view (view);
1121 if (view->priv->current_trans == NULL)
1125 btrans = gnc_tree_control_split_reg_get_blank_trans (view);
1126 mpath = gnc_tree_model_split_reg_get_path_to_split_and_trans (model, NULL, btrans);
1127 view->priv->current_trans = btrans;
1130 mpath = gnc_tree_model_split_reg_get_path_to_split_and_trans (model, view->priv->current_split, view->priv->current_trans);
1132 indices = gtk_tree_path_get_indices (mpath);
1134 if (view->priv->current_depth == 2)
1135 new_mpath = gtk_tree_path_new_from_indices (indices[0], indices[1], -1);
1137 new_mpath = gtk_tree_path_new_from_indices (indices[0], -1);
1139 spath = gnc_tree_view_split_reg_get_sort_path_from_model_path (view, new_mpath);
1142 gchar *mstring, *sstring, *tstring;
1143 mstring = gtk_tree_path_to_string (mpath);
1144 sstring = gtk_tree_path_to_string (spath);
1145 tstring = gtk_tree_path_to_string (new_mpath);
1146 DEBUG(
"default_selection mpath is %s, spath is %s, new path is %s", mstring, sstring, tstring);
1152 if (view->priv->current_ref != NULL)
1154 gtk_tree_row_reference_free (view->priv->current_ref);
1155 view->priv->current_ref = NULL;
1157 view->priv->current_ref = gtk_tree_row_reference_new (GTK_TREE_MODEL (model), new_mpath);
1160 gtv_sr_titles (view, view->priv->current_depth);
1163 gnc_tree_model_split_reg_set_blank_split_parent (model, view->priv->current_trans, FALSE);
1165 PINFO(
"#### Default Selection - After Titles ####");
1168 gnc_tree_view_split_reg_set_format (view);
1170 PINFO(
"#### Default Selection - After View Format ####");
1173 gnc_tree_view_split_reg_scroll_to_cell (view);
1176 gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), spath, NULL, FALSE);
1178 gtk_tree_path_free (mpath);
1179 gtk_tree_path_free (spath);
1180 gtk_tree_path_free (new_mpath);
1182 LEAVE(
"#### Leave Default Selection ####");
1193 model = gnc_tree_view_split_reg_get_model_from_view (view);
1203 return view->priv->reg_comm;
1213 Split *split = NULL;
1216 model = gnc_tree_view_split_reg_get_model_from_view (view);
1218 anchor = gnc_tree_model_split_reg_get_anchor (model);
1222 if (gnc_tree_model_split_reg_is_blank_split_parent (model, trans))
1223 return gnc_tree_model_split_get_blank_split (model);
1242 Account *anchor = view->priv->anchor;
1244 book = gnc_get_current_book();
1246 model = gnc_tree_view_split_reg_get_model_from_view (view);
1250 *split = gnc_tree_model_split_get_blank_split (model);
1251 xaccSplitSetAccount (*split, anchor);
1252 xaccSplitSetParent (*split, trans);
1254 xaccSplitSetParent (*osplit, trans);
1259 Split *s, *first_split;
1263 if (gnc_tree_util_split_reg_is_multi (first_split))
1280 DEBUG(
"gtv_sr_get_split_pair return - trans is %p, osplit is %p and split %p is set to anchor %p", trans, *osplit, *split, anchor);
1290 Split *split = NULL;
1291 const gchar *acc_name;
1292 const gchar *prefix = _(
"Imbalance");
1300 if (g_str_has_prefix (acc_name, prefix))
1312 gboolean gtv_sr_have_account = FALSE;
1314 DEBUG(
"gtv_sr_have_account trans %p, split %p, expanded %d, depth %d", trans, split, expanded, depth);
1316 if ((depth == TRANS1) && !expanded && !gnc_tree_util_split_reg_is_multi (split))
1319 gtv_sr_have_account = TRUE;
1323 gtv_sr_have_account = TRUE;
1325 if (depth == SPLIT3)
1333 gtv_sr_have_account = TRUE;
1335 gtv_sr_have_account = FALSE;
1340 if (gnc_tree_util_split_reg_template_get_transfer_entry (split) != NULL)
1341 gtv_sr_have_account = TRUE;
1344 return gtv_sr_have_account;
1351 gtv_sr_control_cdf0 (GtkTreeViewColumn *col, GtkCellRenderer *cell, GtkTreeModel *s_model,
1352 GtkTreeIter *s_iter, gpointer user_data)
1360 gboolean is_split, is_blank, is_trow1, is_trow2;
1361 const gchar *row_color;
1367 model = gnc_tree_view_split_reg_get_model_from_view (view);
1369 gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model), &m_iter, s_iter);
1371 g_return_if_fail (gnc_tree_model_split_reg_get_split_and_trans (
1372 GNC_TREE_MODEL_SPLIT_REG (model), &m_iter,
1373 &is_trow1, &is_trow2, &is_split, &is_blank,
1376 mpath = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &m_iter);
1378 indices = gtk_tree_path_get_indices (mpath);
1380 row_color = gnc_tree_model_split_reg_get_row_color (model, is_trow1, is_trow2, is_split, indices[0]);
1382 gtk_tree_path_free (mpath);
1385 g_object_set (cell,
"cell-background", row_color, (gchar*)NULL);
1394 gtv_sr_cdf0 (GtkTreeViewColumn *col, GtkCellRenderer *cell, GtkTreeModel *s_model,
1395 GtkTreeIter *s_iter, gpointer user_data)
1404 gboolean is_split, is_blank, is_trow1, is_trow2;
1405 gboolean editable = FALSE, expanded = FALSE;
1406 gboolean read_only = FALSE;
1407 gboolean open_edited = FALSE;
1408 gboolean is_template = FALSE;
1409 gboolean negative_in_red = FALSE;
1410 gboolean show_extra_dates = FALSE;
1412 const gchar *s =
"";
1413 const gchar *row_color;
1416 Account *anchor = view->priv->anchor;
1421 model = gnc_tree_view_split_reg_get_model_from_view (view);
1423 gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model), &m_iter, s_iter);
1425 viewcol = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell),
"view_column"));
1427 g_return_if_fail (gnc_tree_model_split_reg_get_split_and_trans (
1428 GNC_TREE_MODEL_SPLIT_REG (model), &m_iter,
1429 &is_trow1, &is_trow2, &is_split, &is_blank,
1432 spath = gtk_tree_model_get_path (GTK_TREE_MODEL (s_model), s_iter);
1434 depth = gtk_tree_path_get_depth (spath);
1436 indices = gtk_tree_path_get_indices (spath);
1438 row_color = gnc_tree_model_split_reg_get_row_color (model, is_trow1, is_trow2, is_split, indices[0]);
1441 if (is_trow1 || is_trow2)
1444 gtk_tree_path_down (spath);
1445 expanded = gtk_tree_view_row_expanded (GTK_TREE_VIEW (view), spath);
1450 gtk_tree_path_free (spath);
1453 g_object_set (cell,
"cell-background", row_color, (gchar*)NULL);
1456 gtk_tree_model_get (GTK_TREE_MODEL (model), &m_iter, GNC_TREE_MODEL_SPLIT_REG_COL_RO, &read_only, -1);
1467 if (model->
type == RECEIVABLE_REGISTER2 || model->
type == PAYABLE_REGISTER2)
1474 is_template = gnc_tree_model_split_reg_get_template (model);
1477 negative_in_red = view->priv->negative_in_red;
1483 g_object_set (cell,
"cell-background",
"white", (gchar*)NULL);
1486 if ((view->priv->current_trans == trans) && view->priv->show_extra_dates_on_selection)
1487 show_extra_dates = TRUE;
1490 if (view->show_extra_dates == TRUE)
1491 show_extra_dates = TRUE;
1507 else if (is_trow2 && show_extra_dates) {
1510 g_object_set (cell,
"cell-background", YELLOWCELL, (gchar*)NULL);
1524 else if (is_split && show_extra_dates) {
1550 if (is_template && is_trow1)
1552 s = _(
" Scheduled ");
1555 else if (is_template && is_trow2 && show_extra_dates)
1560 else if (is_template && is_split && show_extra_dates)
1566 editable = (read_only == TRUE) ? FALSE : editable;
1569 g_object_set (cell,
"use_buttons", view->priv->show_calendar_buttons, NULL );
1570 g_object_set (cell,
"text", s,
"editable", editable, NULL);
1576 g_object_set (cell,
"cell-background",
"white", (gchar*)NULL);
1593 editable = (read_only == TRUE) ? FALSE : editable;
1595 g_object_set (cell,
"text", s,
"editable", editable, NULL);
1601 g_object_set (cell,
"xalign", 0.0, NULL );
1607 s = gnc_get_num_action (trans, gtv_sr_get_this_split (view, trans));
1609 else if (is_trow2 && expanded)
1613 s = gnc_get_action_num (trans, gtv_sr_get_this_split (view, trans));
1618 else if (is_trow2 && !expanded)
1621 if (gtv_sr_get_this_split (view, trans) != NULL)
1622 s = gnc_get_action_num (trans, gtv_sr_get_this_split (view, trans));
1629 s = gnc_get_num_action (NULL, split);
1631 editable = (read_only == TRUE) ? FALSE : editable;
1633 g_object_set (cell,
"text", s,
"editable", editable, NULL);
1639 g_object_set( cell,
"xalign", 0.0, NULL );
1648 editable = (read_only == TRUE) ? FALSE : editable;
1650 g_object_set (cell,
"text", s,
"editable", editable, NULL);
1653 case COL_TRANSFERVOID:
1657 if (view->priv->acct_short_names)
1658 g_object_set (G_OBJECT (cell),
"text-column", 0, NULL );
1660 g_object_set (G_OBJECT (cell),
"text-column", 1, NULL );
1663 gchar *
string = NULL;
1669 string = g_strdup (
" ");
1675 string = g_strdup (gnc_tree_util_split_reg_get_transfer_entry (gtv_sr_get_this_split (view, trans), &is_multi));
1677 editable = anchor && !expanded && !is_multi;
1697 if (view->priv->acct_short_names)
1704 string = g_strdup (
" ");
1706 if (anchor == acct && model->
type != GENERAL_LEDGER2 && model->
type != SEARCH_LEDGER2)
1713 string = g_strdup (gnc_tree_util_split_reg_template_get_transfer_entry (split));
1717 editable = (read_only == TRUE) ? FALSE : editable;
1719 g_object_set (cell,
"text",
string,
"editable", editable, NULL);
1727 g_object_set( cell,
"xalign", 0.5, NULL );
1730 if (is_trow1 && !expanded)
1735 this_split = gtv_sr_get_this_split (view, trans);
1737 if (this_split != NULL)
1746 s = gnc_get_reconcile_str (rec);
1748 s = gnc_get_reconcile_str (
NREC);
1761 s = gnc_get_reconcile_str (rec);
1763 s = gnc_get_reconcile_str (
NREC);
1766 editable = (read_only == TRUE) ? FALSE : editable;
1768 g_object_set (cell,
"text", s,
"editable", editable, NULL);
1774 g_object_set( cell,
"xalign", 0.5, NULL );
1776 g_object_set (cell,
"cell-background",
"white", (gchar*)NULL);
1786 g_object_set (cell,
"text", ss, NULL);
1792 g_object_set (cell,
"text", s, NULL);
1795 editable = (read_only == TRUE) ? FALSE : editable;
1797 g_object_set (cell,
"editable", editable, NULL);
1805 s = xaccPrintAmount (num, gnc_commodity_print_info (
xaccTransGetCurrency (trans), SHOW_SYMBOL));
1808 if (gtv_sr_get_imbalance (trans))
1809 g_object_set (cell,
"cell-background", PINKCELL, (gchar*)NULL);
1817 editable = (read_only == TRUE) ? FALSE : editable;
1821 g_object_set (cell,
"foreground",
"red", (gchar*)NULL);
1823 g_object_set (cell,
"foreground", NULL, (gchar*)NULL);
1825 g_object_set (cell,
"text", s,
"editable", editable, NULL);
1830 if ((is_trow1)||(is_trow2))
1841 print_info = gnc_default_price_print_info();
1842 print_info.min_decimal_places = 2;
1847 s = xaccPrintAmount (num, print_info);
1853 if (gtv_sr_get_imbalance (trans))
1854 g_object_set (cell,
"cell-background", PINKCELL, (gchar*)NULL);
1857 editable = (read_only == TRUE) ? FALSE : editable;
1859 g_object_set (cell,
"text", s,
"editable", editable, NULL);
1864 if (is_split && (anchor == NULL))
1867 s = xaccPrintAmount (num, gnc_account_print_info (
xaccSplitGetAccount (split), SHOW_SYMBOL));
1870 if (gtv_sr_get_imbalance (trans))
1871 g_object_set (cell,
"cell-background", PINKCELL, (gchar*)NULL);
1873 else if (is_split && (anchor))
1881 s = xaccPrintAmount (num, gnc_account_print_info (
xaccSplitGetAccount (split), SHOW_SYMBOL));
1885 if (gtv_sr_get_imbalance (trans))
1886 g_object_set (cell,
"cell-background", PINKCELL, (gchar*)NULL);
1894 editable = (read_only == TRUE) ? FALSE : editable;
1898 g_object_set (cell,
"foreground",
"red", (gchar*)NULL);
1900 g_object_set (cell,
"foreground", NULL, (gchar*)NULL);
1902 g_object_set (cell,
"text", s,
"editable", editable, NULL);
1918 this_split = gtv_sr_get_this_split (view, trans);
1922 editable = !expanded && !gnc_tree_util_split_reg_is_multi (this_split);
1927 s = xaccPrintAmount (num, gnc_commodity_print_info (
xaccTransGetCurrency (trans), SHOW_SYMBOL));
1941 s = xaccPrintAmount (num, gnc_account_print_info (
xaccSplitGetAccount (split), SHOW_SYMBOL));
1952 s = xaccPrintAmount (num, gnc_account_print_info (
xaccSplitGetAccount (split), SHOW_SYMBOL));
1962 if (gtv_sr_get_imbalance (trans))
1963 g_object_set (cell,
"cell-background", PINKCELL, (gchar*)NULL);
1967 editable = gtv_sr_have_account (view, depth, expanded, is_template, trans, split);
1969 editable = (read_only == TRUE) ? FALSE : editable;
1973 g_object_set (cell,
"foreground",
"red", (gchar*)NULL);
1975 g_object_set (cell,
"foreground", NULL, (gchar*)NULL);
1977 g_object_set (cell,
"text", s,
"editable", editable, NULL);
2000 this_split = gtv_sr_get_this_split (view, trans);
2001 if (this_split != NULL)
2003 if (gnc_tree_util_split_reg_is_multi (this_split))
2004 num = gnc_numeric_zero();
2008 editable = !expanded && !gnc_tree_util_split_reg_is_multi (this_split);
2012 s = xaccPrintAmount (num, gnc_split_amount_print_info (split, SHOW_SYMBOL));
2040 s = xaccPrintAmount (num, gnc_split_amount_print_info (split, SHOW_SYMBOL));
2055 if (gtv_sr_get_imbalance (trans))
2056 g_object_set(cell,
"cell-background", PINKCELL, (gchar*)NULL);
2060 editable = gtv_sr_have_account (view, depth, expanded, is_template, trans, split);
2062 editable = (read_only == TRUE) ? FALSE : editable;
2064 g_object_set (cell,
"text", s,
"editable", editable, NULL);
2074 print_info = gnc_account_print_info (anchor, SHOW_SYMBOL);
2078 if (!gnc_tree_util_split_reg_get_debcred_entry (view, trans, split, is_blank, &num, &print_info))
2079 num = gnc_numeric_zero();
2082 if (gtv_sr_get_imbalance (trans))
2083 g_object_set (cell,
"cell-background", PINKCELL, (gchar*)NULL);
2089 editable = !expanded && !gnc_tree_util_split_reg_is_multi (gtv_sr_get_this_split (view, trans));
2095 num = gnc_numeric_zero();
2101 num = gnc_numeric_zero();
2113 if ((is_trow1 || is_trow2) && expanded)
2123 if (is_trow1 || is_trow2)
2128 else if (is_split && viewcol == COL_DEBIT)
2129 s = gnc_tree_util_split_reg_template_get_fdebt_entry (split);
2131 s = gnc_tree_util_split_reg_template_get_fcred_entry (split);
2135 editable = gtv_sr_have_account (view, depth, expanded, is_template, trans, split);
2138 editable = (read_only == TRUE) ? FALSE : editable;
2140 g_object_set (cell,
"text", s,
"editable", editable, NULL);
2146 g_object_set(cell,
"cell-background",
"white", (gchar*)NULL);
2148 if (is_trow1 && anchor) {
2150 if (gnc_reverse_balance (anchor))
2152 s = xaccPrintAmount (num, gnc_account_print_info(anchor, FALSE));
2156 g_object_set (cell,
"foreground",
"red", (gchar*)NULL);
2158 g_object_set (cell,
"foreground", NULL, (gchar*)NULL);
2162 g_object_set (cell,
"text", s,
"editable", FALSE, NULL);
2167 if (read_only && !open_edited)
2168 g_object_set(cell,
"cell-background", REDCELL, (gchar*)NULL);
2169 else if (read_only && open_edited)
2170 g_object_set(cell,
"cell-background", ORANGECELL, (gchar*)NULL);
2172 g_object_set(cell,
"cell-background", BLUECELL, (gchar*)NULL);
2174 g_object_set(cell,
"cell-background", BLACKCELL, (gchar*)NULL);
2180 gchar *
string = NULL;
2187 if (split_com == txn_com)
2193 string = g_strdup (
"");
2195 g_object_set (cell,
"text",
string,
"editable", FALSE, NULL);
2210 gtv_sr_cdf1 (GtkTreeViewColumn *col, GtkCellRenderer *cell, GtkTreeModel *s_model,
2211 GtkTreeIter *s_iter, gpointer user_data)
2220 gboolean is_split, is_blank, is_trow1, is_trow2;
2221 gboolean editable = FALSE, expanded = FALSE;
2222 gboolean read_only = FALSE;
2223 gboolean open_edited = FALSE;
2225 const gchar *s =
"";
2226 const gchar *row_color;
2229 Account *anchor = view->priv->anchor;
2234 model = gnc_tree_view_split_reg_get_model_from_view (view);
2236 gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model), &m_iter, s_iter);
2238 viewcol = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell),
"view_column"));
2240 g_return_if_fail (gnc_tree_model_split_reg_get_split_and_trans (
2241 GNC_TREE_MODEL_SPLIT_REG (model), &m_iter,
2242 &is_trow1, &is_trow2, &is_split, &is_blank,
2245 spath = gtk_tree_model_get_path (GTK_TREE_MODEL (s_model), s_iter);
2247 depth = gtk_tree_path_get_depth (spath);
2249 indices = gtk_tree_path_get_indices (spath);
2251 row_color = gnc_tree_model_split_reg_get_row_color (model, is_trow1, is_trow2, is_split, indices[0]);
2254 if (is_trow1 || is_trow2)
2257 gtk_tree_path_down (spath);
2258 expanded = gtk_tree_view_row_expanded (GTK_TREE_VIEW (view), spath);
2263 gtk_tree_path_free (spath);
2266 g_object_set (cell,
"cell-background", row_color, (gchar*)NULL);
2269 gtk_tree_model_get (GTK_TREE_MODEL (model), &m_iter, GNC_TREE_MODEL_SPLIT_REG_COL_RO, &read_only, -1);
2280 if (model->
type == RECEIVABLE_REGISTER2 || model->
type == PAYABLE_REGISTER2)
2298 g_object_set (cell,
"xalign", 0.0, NULL );
2305 s = gnc_get_num_action (trans, gtv_sr_get_this_split (view, trans));
2307 else if (is_trow2 && expanded)
2311 s = gnc_get_action_num (trans, gtv_sr_get_this_split (view, trans));
2316 else if (is_trow2 && !expanded)
2321 if (gtv_sr_get_this_split (view, trans) != NULL)
2322 s = gnc_get_action_num (trans, gtv_sr_get_this_split (view, trans));
2336 editable = (read_only == TRUE) ? FALSE : editable;
2338 g_object_set (cell,
"text", s,
"editable", editable, NULL);
2345 case COL_TRANSFERVOID:
2409 GtkWidget *dialog, *window;
2413 const char *title = _(
"Save the changed transaction?");
2414 const char *message = _(
2415 "The current transaction has changed. Would you like to "
2416 "record the changes, or discard the changes?");
2419 if (!view->priv->dirty_trans || view->priv->dirty_trans == new_trans)
2422 model = gnc_tree_view_split_reg_get_model_from_view (view);
2427 Account *default_account = gnc_tree_model_split_reg_get_anchor (model);
2428 if (default_account != NULL)
2432 Account *root = gnc_book_get_root_account (gnc_get_current_book());
2438 if (gnc_tree_control_split_reg_balance_trans (view, view->priv->dirty_trans))
2440 view->priv->trans_confirm = CANCEL;
2444 window = gnc_tree_view_split_reg_get_parent (view);
2445 dialog = gtk_message_dialog_new (GTK_WINDOW (window),
2446 GTK_DIALOG_DESTROY_WITH_PARENT,
2447 GTK_MESSAGE_QUESTION,
2450 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
2453 gtk_dialog_add_buttons (GTK_DIALOG(dialog),_(
"_Discard Changes"), GTK_RESPONSE_REJECT,
2454 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
2455 _(
"_Record Changes"), GTK_RESPONSE_ACCEPT, NULL);
2457 response = gnc_dialog_run (GTK_DIALOG (dialog), GNC_PREF_WARN_REG_TRANS_MOD);
2458 gtk_widget_destroy (dialog);
2462 case GTK_RESPONSE_ACCEPT:
2463 g_object_set_data (G_OBJECT (view),
"data-edited", GINT_TO_POINTER (FALSE));
2465 split = gnc_tree_model_split_get_blank_split (model);
2466 xaccSplitReinit (split);
2467 view->priv->dirty_trans = NULL;
2468 view->change_allowed = FALSE;
2469 view->priv->auto_complete = FALSE;
2470 view->priv->trans_confirm = ACCEPT;
2474 case GTK_RESPONSE_REJECT:
2475 if (view->priv->dirty_trans &&
xaccTransIsOpen (view->priv->dirty_trans))
2478 gnc_tree_control_split_reg_goto_rel_trans_row (view, 0);
2480 g_object_set_data (G_OBJECT (view),
"data-edited", GINT_TO_POINTER (FALSE));
2482 split = gnc_tree_model_split_get_blank_split (model);
2483 xaccSplitReinit (split);
2484 view->change_allowed = FALSE;
2485 view->priv->auto_complete = FALSE;
2486 view->priv->trans_confirm = DISCARD;
2491 case GTK_RESPONSE_CANCEL:
2492 view->priv->trans_confirm = CANCEL;
2507 start_edit (GtkCellRenderer *cr, GtkCellEditable *editable,
2508 const gchar *path_string, gpointer user_data)
2516 model = gnc_tree_view_split_reg_get_model_from_view (view);
2518 gtv_sr_editable_start_editing_cb (cr, editable, path_string, user_data);
2522 path = gtk_tree_path_new_from_string (path_string);
2526 gtk_tree_path_free (path);
2536 ENTER(
"gtv_sr_begin_edit trans %p", trans);
2538 if (trans != view->priv->dirty_trans)
2545 view->priv->dirty_trans = trans;
2563 gtv_sr_remove_edit_date (GtkCellEditable *ce, gpointer user_data)
2567 const gchar *new_string;
2568 const gchar *current_string;
2572 ENTER(
"remove edit date and temp cell rend %p", view->priv->temp_cr);
2574 if (view->priv->temp_cr != NULL)
2577 popup_entry = GNC_POPUP_ENTRY (g_object_get_data (G_OBJECT (view->priv->temp_cr),
"cell-editable"));
2579 new_string = gtk_entry_get_text (GTK_ENTRY (popup_entry->entry));
2581 current_string = g_object_get_data (G_OBJECT (view->priv->temp_cr),
"current-string");
2583 DEBUG(
"New string is %s and Current_string is %s", new_string, current_string);
2586 if (!GPOINTER_TO_INT (g_object_get_data (G_OBJECT (view->priv->temp_cr),
"edit-canceled"))
2587 && g_ascii_strcasecmp (new_string, current_string))
2589 g_object_set_data (G_OBJECT (view),
"data-edited", GINT_TO_POINTER (TRUE));
2593 gnc_tree_util_split_reg_parse_date (&date, new_string);
2594 date_string = gnc_tree_util_split_reg_get_date_help (&date);
2596 if (view->help_text)
2597 g_free (view->help_text);
2598 view->help_text = g_strdup (date_string);
2600 g_signal_emit_by_name (view,
"help_signal", NULL);
2601 g_free (date_string);
2603 g_object_set_data (G_OBJECT (view->priv->temp_cr),
"cell-editable", NULL);
2604 view->priv->temp_cr = NULL;
2605 view->editing_now = FALSE;
2613 gtv_sr_remove_edit_combo (GtkCellEditable *ce, gpointer user_data)
2617 const gchar *new_string;
2618 const gchar *current_string;
2620 ENTER(
"remove edit combo and temp cell rend %p", view->priv->temp_cr);
2622 if (view->priv->temp_cr != NULL)
2625 entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (g_object_get_data (G_OBJECT (view->priv->temp_cr),
"cell-editable"))));
2627 new_string = gtk_entry_get_text (GTK_ENTRY (entry));
2629 current_string = g_object_get_data (G_OBJECT (view->priv->temp_cr),
"current-string");
2631 DEBUG(
"New string is %s and Current_string is %s", new_string, current_string);
2634 if (!GPOINTER_TO_INT (g_object_get_data (G_OBJECT (view->priv->temp_cr),
"edit-canceled"))
2635 && g_ascii_strcasecmp (new_string, current_string))
2637 g_object_set_data (G_OBJECT (view),
"data-edited", GINT_TO_POINTER (TRUE));
2640 g_object_set_data (G_OBJECT (view->priv->temp_cr),
"cell-editable", NULL);
2641 view->priv->temp_cr = NULL;
2642 view->editing_now = FALSE;
2650 gtv_sr_remove_edit_entry (GtkCellEditable *ce, gpointer user_data)
2653 const gchar *new_string;
2654 const gchar *current_string;
2656 ENTER(
"remove edit entry and temp cell rend %p", view->priv->temp_cr);
2658 if (view->priv->temp_cr != NULL)
2661 new_string = gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (view->priv->temp_cr),
"cell-editable")));
2663 current_string = g_object_get_data (G_OBJECT (view->priv->temp_cr),
"current-string");
2665 DEBUG(
"New string is %s and Current_string is %s", new_string, current_string);
2668 if (!GPOINTER_TO_INT (g_object_get_data (G_OBJECT (view->priv->temp_cr),
"edit-canceled"))
2669 && g_ascii_strcasecmp (new_string, current_string))
2671 g_object_set_data (G_OBJECT (view),
"data-edited", GINT_TO_POINTER (TRUE));
2673 if (g_object_get_data (G_OBJECT (view->priv->temp_cr),
"current-flag") != NULL)
2674 g_object_set_data (G_OBJECT (view->priv->temp_cr),
"current-flag", NULL);
2676 g_object_set_data (G_OBJECT (view->priv->temp_cr),
"cell-editable", NULL);
2677 view->priv->temp_cr = NULL;
2678 view->editing_now = FALSE;
2693 GtkCellEditable *ce;
2695 if (view->priv->temp_cr == NULL)
2698 DEBUG(
"gtv_sr_finish_edit temp_cr is %p", view->priv->temp_cr);
2700 if ((ce = GTK_CELL_EDITABLE (g_object_get_data (G_OBJECT (view->priv->temp_cr),
"cell-editable"))))
2702 DEBUG(
"gtv_sr_finish_edit - editing_done");
2703 gtk_cell_editable_editing_done (ce);
2704 gtk_cell_editable_remove_widget (ce);
2713 gtv_sr_finish_edit (view);
2720 gtv_sr_idle_cancel_edit (GtkCellRenderer *cr)
2722 GtkCellEditable *ce;
2724 gtk_cell_renderer_stop_editing (cr, TRUE);
2726 ce = GTK_CELL_EDITABLE (g_object_get_data (G_OBJECT (cr),
"cell-editable"));
2727 gtk_cell_editable_editing_done (ce);
2728 gtk_cell_editable_remove_widget (ce);
2742 spath = gnc_tree_view_split_reg_get_current_path (view);
2743 columns = gtk_tree_view_get_columns (GTK_TREE_VIEW (view));
2745 for (column = columns, i = 1; column; column = g_list_next (column), i++)
2748 GtkCellRenderer *cr0;
2749 GtkTreeViewColumn *tvc;
2755 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (tvc));
2756 cr0 = g_list_nth_data (renderers, 0);
2757 g_list_free (renderers);
2759 viewcol = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cr0),
"view_column"));
2761 if (viewcol == COL_TRANSFERVOID)
2762 gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), spath, tvc, TRUE);
2764 g_list_free (columns);
2765 gtk_tree_path_free (spath);
2776 GtkCellRenderer *cr0;
2781 RowDepth temp_depth;
2782 gboolean is_template;
2784 model = gnc_tree_view_split_reg_get_model_from_view (view);
2787 columns = gtk_tree_view_get_columns (GTK_TREE_VIEW (view));
2789 is_template = gnc_tree_model_split_reg_get_template (model);
2791 for (column = columns, i = 1; column; column = g_list_next (column), i++)
2793 GtkTreeViewColumn *tvc;
2799 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (tvc));
2800 cr0 = g_list_nth_data (renderers, 0);
2801 g_list_free (renderers);
2803 viewcol = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cr0),
"view_column"));
2805 DEBUG(
"viewcol is %d", viewcol);
2810 switch (model->
type)
2815 gtk_tree_view_column_set_sort_indicator (tvc, TRUE);
2817 gtk_tree_view_column_set_sort_indicator (tvc, FALSE);
2819 if (depth == TRANS1)
2820 gtk_tree_view_column_set_title (tvc, _(
"Date Posted"));
2821 else if (depth == TRANS2)
2822 gtk_tree_view_column_set_title (tvc, _(
"Date Entered"));
2823 else if (depth == SPLIT3)
2824 gtk_tree_view_column_set_title (tvc, _(
"Date Reconciled"));
2826 gtk_tree_view_column_set_title (tvc, _(
"Date Posted / Entered / Reconciled"));
2832 switch (model->
type)
2835 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
2836 gtk_tree_view_column_set_title (tvc, _(
"Due Date"));
2842 switch (model->
type)
2844 case RECEIVABLE_REGISTER2:
2845 case PAYABLE_REGISTER2:
2846 if (depth == TRANS1)
2847 gtk_tree_view_column_set_title (tvc, _(
"Reference"));
2848 else if (depth == TRANS2)
2849 gtk_tree_view_column_set_title (tvc, _(
"Action"));
2850 else if (depth == SPLIT3)
2851 gtk_tree_view_column_set_title (tvc, _(
"Action"));
2853 gtk_tree_view_column_set_title (tvc, _(
"Reference / Action"));
2860 gtk_tree_view_column_set_sort_indicator (tvc, TRUE);
2862 gtk_tree_view_column_set_sort_indicator (tvc, FALSE);
2864 if (depth == TRANS1)
2865 gtk_tree_view_column_set_title (tvc, _(
"Number"));
2867 gtk_tree_view_column_set_title (tvc, _(
"T-Number"));
2869 gtk_tree_view_column_set_title (tvc, _(
"Action"));
2870 else if (depth == SPLIT3)
2871 gtk_tree_view_column_set_title (tvc, _(
"Action"));
2873 gtk_tree_view_column_set_title (tvc, _(
"Number / Action"));
2879 switch (model->
type)
2881 case RECEIVABLE_REGISTER2:
2882 if (depth == TRANS1)
2883 gtk_tree_view_column_set_title (tvc, _(
"Customer"));
2884 else if (depth == TRANS2)
2885 gtk_tree_view_column_set_title (tvc, _(
"Memo"));
2886 else if (depth == SPLIT3)
2887 gtk_tree_view_column_set_title (tvc, _(
"Memo"));
2889 gtk_tree_view_column_set_title (tvc, _(
"Customer / Memo"));
2892 case PAYABLE_REGISTER2:
2893 if (depth == TRANS1)
2894 gtk_tree_view_column_set_title (tvc, _(
"Vendor"));
2895 else if (depth == TRANS2)
2896 gtk_tree_view_column_set_title (tvc, _(
"Memo"));
2897 else if (depth == SPLIT3)
2898 gtk_tree_view_column_set_title (tvc, _(
"Memo"));
2900 gtk_tree_view_column_set_title (tvc, _(
"Vendor / Memo"));
2907 gtk_tree_view_column_set_sort_indicator (tvc, TRUE);
2909 gtk_tree_view_column_set_sort_indicator (tvc, FALSE);
2911 if (depth == TRANS1)
2912 gtk_tree_view_column_set_title (tvc, _(
"Description"));
2913 else if (depth == TRANS2)
2914 gtk_tree_view_column_set_title (tvc, _(
"Notes"));
2915 else if (depth == SPLIT3)
2916 gtk_tree_view_column_set_title (tvc, _(
"Memo"));
2918 gtk_tree_view_column_set_title (tvc, _(
"Description / Notes / Memo"));
2923 case COL_TRANSFERVOID:
2924 switch (model->
type)
2926 case RECEIVABLE_REGISTER2:
2927 case PAYABLE_REGISTER2:
2928 if (depth == TRANS1)
2929 gtk_tree_view_column_set_title (tvc, _(
"Accounts"));
2930 else if (depth == TRANS2)
2931 gtk_tree_view_column_set_title (tvc, _(
"Accounts"));
2932 else if (depth == SPLIT3)
2933 gtk_tree_view_column_set_title (tvc, _(
"Accounts"));
2935 gtk_tree_view_column_set_title (tvc, _(
"Accounts"));
2941 gtk_tree_view_column_set_sort_indicator (tvc, TRUE);
2943 gtk_tree_view_column_set_sort_indicator (tvc, FALSE);
2945 if (depth == TRANS1)
2946 gtk_tree_view_column_set_title (tvc, _(
"Accounts"));
2947 else if (depth == TRANS2)
2948 gtk_tree_view_column_set_title (tvc, _(
"Void Reason"));
2949 else if (depth == SPLIT3)
2950 gtk_tree_view_column_set_title (tvc, _(
"Accounts"));
2952 gtk_tree_view_column_set_title (tvc, _(
"Accounts / Void Reason"));
2958 switch (model->
type)
2961 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
2962 gtk_tree_view_column_set_title (tvc, _(
"R"));
2968 switch (model->
type)
2971 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
2972 gtk_tree_view_column_set_title (tvc, _(
"Type"));
2978 switch (model->
type)
2981 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
2982 gtk_tree_view_column_set_title (tvc, _(
"Value"));
2988 switch (model->
type)
2991 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
2992 gtk_tree_view_column_set_title (tvc, _(
"Amount"));
2998 switch (model->
type)
3001 if (depth == TRANS1 || depth == TRANS2)
3002 gtk_tree_view_column_set_title (tvc, _(
"Value"));
3003 else if (depth == SPLIT3)
3004 gtk_tree_view_column_set_title (tvc, _(
"Amount"));
3006 gtk_tree_view_column_set_title (tvc, _(
"Amount / Value"));
3012 switch (model->
type)
3015 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3016 gtk_tree_view_column_set_title (tvc, _(
"Commodity"));
3022 switch (model->
type)
3025 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3026 gtk_tree_view_column_set_title (tvc, _(
"Rate"));
3032 switch (model->
type)
3035 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3036 gtk_tree_view_column_set_title (tvc, _(
"Price"));
3044 switch (model->
type)
3046 case BANK_REGISTER2:
3047 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3048 gtk_tree_view_column_set_title (tvc, _(
"Withdrawal"));
3051 case CASH_REGISTER2:
3052 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3053 gtk_tree_view_column_set_title (tvc, _(
"Spend"));
3056 case ASSET_REGISTER2:
3057 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3058 gtk_tree_view_column_set_title (tvc, _(
"Decrease"));
3061 case LIABILITY_REGISTER2:
3062 case EQUITY_REGISTER2:
3063 case TRADING_REGISTER2:
3064 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3065 gtk_tree_view_column_set_title (tvc, _(
"Increase"));
3068 case CREDIT_REGISTER2:
3069 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3070 gtk_tree_view_column_set_title (tvc, _(
"Charge"));
3073 case INCOME_REGISTER2:
3074 case INCOME_LEDGER2:
3075 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3076 gtk_tree_view_column_set_title (tvc, _(
"Income"));
3079 case EXPENSE_REGISTER2:
3080 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3081 gtk_tree_view_column_set_title (tvc, _(
"Rebate"));
3084 case STOCK_REGISTER2:
3085 case CURRENCY_REGISTER2:
3086 case PORTFOLIO_LEDGER2:
3087 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3088 gtk_tree_view_column_set_title (tvc, _(
"Sell"));
3091 case RECEIVABLE_REGISTER2:
3092 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3093 gtk_tree_view_column_set_title (tvc, _(
"Payment"));
3096 case PAYABLE_REGISTER2:
3097 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3098 gtk_tree_view_column_set_title (tvc, _(
"Bill"));
3101 case GENERAL_LEDGER2:
3102 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3103 gtk_tree_view_column_set_title (tvc, _(
"Funds Out"));
3106 case SEARCH_LEDGER2:
3107 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3110 gtk_tree_view_column_set_title (tvc, _(
"Funds Out"));
3112 gtk_tree_view_column_set_title (tvc, _(
"Credit Formula"));
3117 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3118 gtk_tree_view_column_set_title (tvc, _(
"Credit"));
3123 gtk_tree_view_column_set_title (tvc, _(
"Credit"));
3129 switch (model->
type)
3131 case BANK_REGISTER2:
3132 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3133 gtk_tree_view_column_set_title (tvc, _(
"Deposit"));
3136 case CASH_REGISTER2:
3137 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3138 gtk_tree_view_column_set_title (tvc, _(
"Receive"));
3141 case ASSET_REGISTER2:
3142 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3143 gtk_tree_view_column_set_title (tvc, _(
"Increase"));
3146 case LIABILITY_REGISTER2:
3147 case EQUITY_REGISTER2:
3148 case TRADING_REGISTER2:
3149 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3150 gtk_tree_view_column_set_title (tvc, _(
"Decrease"));
3153 case INCOME_REGISTER2:
3154 case INCOME_LEDGER2:
3155 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3156 gtk_tree_view_column_set_title (tvc, _(
"Charge"));
3159 case EXPENSE_REGISTER2:
3160 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3161 gtk_tree_view_column_set_title (tvc, _(
"Expense"));
3164 case STOCK_REGISTER2:
3165 case CURRENCY_REGISTER2:
3166 case PORTFOLIO_LEDGER2:
3167 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3168 gtk_tree_view_column_set_title (tvc, _(
"Buy"));
3171 case RECEIVABLE_REGISTER2:
3172 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3173 gtk_tree_view_column_set_title (tvc, _(
"Invoice"));
3176 case CREDIT_REGISTER2:
3177 case PAYABLE_REGISTER2:
3178 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3179 gtk_tree_view_column_set_title (tvc, _(
"Payment"));
3182 case GENERAL_LEDGER2:
3183 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3184 gtk_tree_view_column_set_title (tvc, _(
"Funds In"));
3187 case SEARCH_LEDGER2:
3188 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3191 gtk_tree_view_column_set_title (tvc, _(
"Funds In"));
3193 gtk_tree_view_column_set_title (tvc, _(
"Debit Formula"));
3198 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3199 gtk_tree_view_column_set_title (tvc, _(
"Debit"));
3204 gtk_tree_view_column_set_title (tvc, _(
"Debit"));
3208 switch (model->
type)
3211 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3212 gtk_tree_view_column_set_title (tvc, _(
"Balance"));
3222 g_list_free (columns);
3228 gtv_sr_help (
GncTreeViewSplitReg *view, GtkCellRenderer *cr, ViewCol viewcol, RowDepth depth)
3232 const gchar *current_string;
3234 ENTER(
"Help Viewcol is %d and depth is %d", viewcol, depth);
3236 model = gnc_tree_view_split_reg_get_model_from_view (view);
3241 switch (model->
type)
3244 if (depth == TRANS1)
3248 current_string = g_object_get_data (G_OBJECT (cr),
"current-string");
3249 g_date_set_parse (&date, current_string);
3250 help = gnc_tree_util_split_reg_get_date_help (&date);
3253 help = g_strdup (
" ");
3259 switch (model->
type)
3262 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3263 help = g_strdup (_(
"Enter Due Date"));
3269 switch (model->
type)
3271 case RECEIVABLE_REGISTER2:
3272 case PAYABLE_REGISTER2:
3273 if (depth == TRANS1)
3274 help = g_strdup (_(
"Enter the transaction reference, such as the invoice or check number"));
3275 else if (depth == TRANS2 || depth == SPLIT3)
3276 help = g_strdup (_(
"Enter the type of transaction, or choose one from the list"));
3280 if (depth == TRANS1)
3281 help = g_strdup (_(
"Enter the transaction number, such as the check number"));
3282 else if (depth == TRANS2 || depth == SPLIT3)
3283 help = g_strdup (_(
"Enter the type of transaction, or choose one from the list"));
3289 switch (model->
type)
3291 case RECEIVABLE_REGISTER2:
3292 if (depth == TRANS1)
3293 help = g_strdup (_(
"Enter the name of the Customer"));
3294 else if (depth == TRANS2)
3295 help = g_strdup (_(
"Enter notes for the transaction"));
3296 else if (depth == SPLIT3)
3297 help = g_strdup (_(
"Enter a description of the split"));
3300 case PAYABLE_REGISTER2:
3301 if (depth == TRANS1)
3302 help = g_strdup (_(
"Enter the name of the Vendor"));
3303 else if (depth == TRANS2)
3304 help = g_strdup (_(
"Enter notes for the transaction"));
3305 else if (depth == SPLIT3)
3306 help = g_strdup (_(
"Enter a description of the split"));
3310 if (depth == TRANS1)
3311 help = g_strdup (_(
"Enter a description of the transaction"));
3312 else if (depth == TRANS2)
3313 help = g_strdup (_(
"Enter notes for the transaction"));
3314 else if (depth == SPLIT3)
3315 help = g_strdup (_(
"Enter a description of the split"));
3320 case COL_TRANSFERVOID:
3321 switch (model->
type)
3324 if (depth == TRANS1)
3325 help = g_strdup (_(
"Enter the account to transfer from, or choose one from the list"));
3326 else if (depth == TRANS2)
3327 help = g_strdup (_(
"Reason the transaction was voided"));
3328 else if (depth == SPLIT3)
3329 help = g_strdup (_(
"Enter the account to transfer from, or choose one from the list"));
3335 switch (model->
type)
3338 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3339 help = g_strdup (_(
"Enter the reconcile type"));
3345 switch (model->
type)
3348 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3349 help = g_strdup (_(
"Enter the type of transaction"));
3355 switch (model->
type)
3358 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3359 help = g_strdup (_(
"Enter the value of shares bought or sold"));
3365 switch (model->
type)
3368 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3369 help = g_strdup (_(
"Enter the number of shares bought or sold"));
3375 switch (model->
type)
3378 if ((depth == TRANS1) || (depth == TRANS2))
3379 help = g_strdup (_(
"Enter the value of shares bought or sold"));
3380 else if (depth == SPLIT3)
3381 help = g_strdup (_(
"Enter the number of shares bought or sold"));
3387 switch (model->
type)
3390 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3391 help = g_strdup (_(
"* Indicates the transaction Commodity."));
3397 switch (model->
type)
3400 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3401 help = g_strdup (_(
"Enter the rate"));
3407 switch (model->
type)
3410 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3411 help = g_strdup (_(
"Enter the effective share price"));
3417 switch (model->
type)
3420 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3421 help = g_strdup (_(
"Enter credit formula for real transaction"));
3427 switch (model->
type)
3430 if (depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
3431 help = g_strdup (_(
"Enter debit formula for real transaction"));
3437 help = g_strdup (
" ");
3441 LEAVE(
"Help text is - %s", help);
3442 if (view->help_text)
3443 g_free (view->help_text);
3444 view->help_text = g_strdup (help);
3446 g_signal_emit_by_name (view,
"help_signal", NULL);
3456 GtkTreePath *bpath, *spath;
3460 while (gtk_events_pending ())
3461 gtk_main_iteration ();
3464 if (view->priv->expanded == FALSE)
3467 model = gnc_tree_view_split_reg_get_model_from_view (view);
3469 bsplit = gnc_tree_model_split_get_blank_split (model);
3470 bpath = gnc_tree_model_split_reg_get_path_to_split_and_trans (model, bsplit, NULL);
3472 spath = gnc_tree_view_split_reg_get_sort_path_from_model_path (view, bpath);
3475 gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), spath, NULL, FALSE);
3477 gtk_tree_path_free (bpath);
3478 gtk_tree_path_free (spath);
3486 gtv_sr_selection_move_delete_cb (
GncTreeModelSplitReg *model, gpointer item, gpointer user_data)
3491 DEBUG(
"gtv_sr_selection_move_delete_cb view %p model %p trans %p", view, model, trans);
3493 DEBUG(
"gtv_sr_selection_move_delete_cb current_trans %p trans %p", view->priv->current_trans, trans);
3496 if (trans == view->priv->current_trans)
3497 gnc_tree_control_split_reg_goto_rel_trans_row (view, 1);
3504 gtv_sr_focus_out_cb (GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
3508 gnc_tree_view_split_reg_finish_edit (view);
3516 gtv_sr_recn_tests (
GncTreeViewSplitReg *view, GtkTreeViewColumn *column, GtkTreePath *spath)
3518 GtkCellRenderer *cr0;
3525 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
3526 cr0 = g_list_nth_data (renderers, 0);
3527 g_list_free (renderers);
3529 viewcol = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cr0),
"view_column"));
3532 if (viewcol == COL_RECN)
3535 if (!gnc_tree_control_split_reg_recn_change (view, spath))
3537 LEAVE(
"Not allowed to change reconciled transaction");
3544 if (viewcol != COL_DESCNOTES && viewcol != COL_RECN)
3546 if (!gnc_tree_control_split_reg_recn_test (view, spath))
3548 LEAVE(
"Not allowed to edit reconciled transaction");
3561 gint num_of_trans, trans_pos;
3564 indices = gtk_tree_path_get_indices (spath);
3565 num_of_trans = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (model), NULL);
3567 trans_pos = indices[0];
3569 if (trans_pos < num_of_trans*1/3)
3570 gnc_tree_model_split_reg_move (model, VIEW_UP);
3572 if (trans_pos > num_of_trans*2/3)
3573 gnc_tree_model_split_reg_move (model, VIEW_DOWN);
3580 gtv_sr_button_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
3584 GtkTreePath *mpath, *spath;
3585 GtkTreeViewColumn *col;
3588 Split *split = NULL;
3589 Split *rotate_split = NULL;
3591 gboolean is_trow1, is_trow2, is_split, is_blank;
3593 model = gnc_tree_view_split_reg_get_model_from_view (view);
3596 if (event->button == 1 && event->type == GDK_BUTTON_PRESS)
3598 GdkWindow *window = gtk_tree_view_get_bin_window (GTK_TREE_VIEW (view));
3600 if (event->window != window)
3604 gnc_tree_view_split_reg_finish_edit (view);
3607 if (view->priv->stop_cell_move == TRUE)
3611 if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (view), (gint) event->x, (gint) event->y,
3612 &spath, &col, NULL, NULL))
3614 DEBUG(
"event->x is %d and event->y is %d", (gint)event->x, (gint)event->y);
3616 mpath = gnc_tree_view_split_reg_get_model_path_from_sort_path (view, spath);
3619 if (view->priv->single_button_press > 0)
3621 view->priv->single_button_press = view->priv->single_button_press -1;
3625 if (gtk_tree_model_get_iter (GTK_TREE_MODEL (model), &m_iter, mpath))
3627 gchar *mstring, *sstring;
3628 mstring = gtk_tree_path_to_string (mpath);
3629 sstring = gtk_tree_path_to_string (spath);
3630 DEBUG(
"Mouse Button Press - mpath is %s, spath is %s", mstring, sstring);
3635 view->priv->trans_confirm = RESET;
3637 gnc_tree_model_split_reg_get_split_and_trans (
3638 GNC_TREE_MODEL_SPLIT_REG (model), &m_iter, &is_trow1, &is_trow2, &is_split, &is_blank, &split, &trans);
3641 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (view),
"data-edited")) && gtv_sr_transaction_changed_confirm (view, trans))
3643 DEBUG(
"MB - Restore position - Cancel / Discard");
3646 if (view->priv->trans_confirm == CANCEL)
3648 DEBUG(
"MB - Cancel");
3654 gnc_tree_control_split_reg_jump_to (view, NULL,
xaccTransGetSplit (view->priv->dirty_trans, 0), FALSE);
3658 gnc_tree_control_split_reg_jump_to (view, view->priv->dirty_trans, NULL, FALSE);
3660 gtk_tree_path_free (spath);
3661 gtk_tree_path_free (mpath);
3665 if (view->priv->trans_confirm == DISCARD)
3667 DEBUG(
"MB - Discard");
3668 view->priv->dirty_trans = NULL;
3674 if (view->priv->current_trans != trans)
3676 view->change_allowed = FALSE;
3679 if (gtv_sr_recn_tests (view, col, spath))
3681 gtk_tree_path_free (spath);
3682 gtk_tree_path_free (mpath);
3688 rotate_split = split;
3690 rotate_split = gtv_sr_get_this_split (view, trans);
3693 if (!gnc_tree_util_split_reg_rotate (view, col, trans, rotate_split))
3694 gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), spath, col, TRUE);
3696 gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), spath, col, FALSE);
3699 gtv_split_reg_test_for_move (model, spath);
3701 gtk_tree_path_free (spath);
3702 gtk_tree_path_free (mpath);
3705 gtk_tree_path_free (spath);
3706 gtk_tree_path_free (mpath);
3711 if (event->button == 1 && event->type == GDK_2BUTTON_PRESS)
3713 GdkWindow *window = gtk_tree_view_get_bin_window (GTK_TREE_VIEW (view));
3715 if (event->window != window)
3719 if (model->
style != REG2_STYLE_JOURNAL)
3722 view->priv->single_button_press = 1;
3724 if (view->priv->expanded)
3725 gnc_tree_view_split_reg_collapse_trans (view, NULL);
3727 gnc_tree_view_split_reg_expand_trans (view, NULL);
3730 gnc_tree_view_split_reg_call_uiupdate_cb(view);
3742 GtkTreeViewColumn *col;
3745 model = gnc_tree_view_split_reg_get_model_from_view (view);
3748 gtk_tree_view_get_cursor (GTK_TREE_VIEW (view), &spath, &col);
3753 if (gtv_sr_recn_tests (view, col, spath))
3755 gtk_tree_path_free (spath);
3758 gtk_tree_path_free (spath);
3761 view->priv->trans_confirm = RESET;
3764 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (view),
"data-edited")) && gtv_sr_transaction_changed_confirm (view, NULL))
3767 DEBUG(
"KB - Restore position - Cancel / Discard");
3769 if (view->priv->trans_confirm == CANCEL)
3771 DEBUG(
"KB - Cancel");
3777 gnc_tree_control_split_reg_jump_to (view, NULL,
xaccTransGetSplit (view->priv->dirty_trans, 0), FALSE);
3781 gnc_tree_control_split_reg_jump_to (view, view->priv->dirty_trans, NULL, FALSE);
3786 if (view->priv->trans_confirm == DISCARD)
3788 DEBUG(
"KB - Discard");
3790 gnc_tree_view_split_reg_block_selection (view, TRUE);
3793 if (gnc_tree_view_split_reg_trans_expanded (view, view->priv->dirty_trans))
3794 gnc_tree_view_split_reg_collapse_trans (view, view->priv->dirty_trans);
3796 gnc_tree_view_split_reg_block_selection (view, FALSE);
3799 gnc_tree_model_split_reg_set_blank_split_parent (model, view->priv->dirty_trans, TRUE);
3800 gnc_tree_model_split_reg_set_blank_split_parent (model, view->priv->dirty_trans, FALSE);
3803 gnc_tree_view_split_reg_format_trans (view, view->priv->dirty_trans);
3804 view->priv->dirty_trans = NULL;
3813 gtv_sr_get_editing (GtkTreeViewColumn *col)
3815 GtkCellRenderer *cr0 = NULL, *cr1 = NULL;
3817 gboolean cell_editing0 = FALSE;
3818 gboolean cell_editing1 = FALSE;
3819 gboolean editing = FALSE;
3821 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (col));
3822 cr0 = g_list_nth_data (renderers, 0);
3823 if (g_list_length (renderers) == 2)
3824 cr1 = g_list_nth_data (renderers, 1);
3825 g_list_free (renderers);
3827 if (gtk_cell_renderer_get_visible (cr0))
3828 g_object_get (G_OBJECT (cr0),
"editing", &cell_editing0, NULL);
3830 if (cr1 && gtk_cell_renderer_get_visible (cr1))
3831 g_object_get (G_OBJECT (cr1),
"editing", &cell_editing1, NULL);
3833 if (cell_editing0 || cell_editing1)
3836 DEBUG(
"editing is %d for column title %s", editing, gtk_tree_view_column_get_title (col));
3844 gtv_sr_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data)
3848 GtkTreeViewColumn *col;
3849 GtkTreePath *spath, *start_spath;
3850 GtkTreePath *start_path, *end_path;
3851 gboolean editing = FALSE;
3852 gboolean step_off = FALSE;
3853 gboolean trans_changed = FALSE;
3854 gint *start_indices;
3856 gboolean keyup = FALSE;
3858 gboolean goto_blank = FALSE;
3859 gboolean next_trans = TRUE;
3863 gtk_tree_view_get_cursor (GTK_TREE_VIEW (view), &spath, &col);
3865 if (event->type != GDK_KEY_PRESS)
3868 gtk_tree_path_free (spath);
3872 switch (event->keyval)
3876 case GDK_KEY_KP_Add:
3877 case GDK_KEY_KP_Subtract:
3882 gtk_tree_path_free (spath);
3889 model = gnc_tree_view_split_reg_get_model_from_view (view);
3891 if (event->keyval == GDK_KEY_Up)
3893 gnc_tree_model_split_reg_move (model, VIEW_UP);
3896 gnc_tree_model_split_reg_move (model, VIEW_DOWN);
3901 case GDK_KEY_Page_Up:
3902 case GDK_KEY_Page_Down:
3904 model = gnc_tree_view_split_reg_get_model_from_view (view);
3906 if (gtk_tree_view_get_visible_range (GTK_TREE_VIEW (view), &start_path, &end_path))
3908 if (event->keyval == GDK_KEY_Page_Up)
3910 GtkTreePath *new_start_path;
3911 gint *start_indices, *end_indices;
3915 start_indices = gtk_tree_path_get_indices (start_path);
3916 end_indices = gtk_tree_path_get_indices (end_path);
3917 num_of_trans = end_indices[0] - start_indices[0];
3919 new_start = start_indices[0] - num_of_trans + 2;
3924 new_start_path = gtk_tree_path_new_from_indices (new_start, -1);
3927 gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), new_start_path, NULL, TRUE, 0.0, 0.0);
3930 gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), new_start_path, col, FALSE);
3932 gtk_tree_path_free (new_start_path);
3934 gnc_tree_model_split_reg_move (model, VIEW_UP);
3938 GtkTreePath *new_end_path;
3939 gint *start_indices, *end_indices;
3941 gint num_of_trans, total_num;
3943 start_indices = gtk_tree_path_get_indices (start_path);
3944 end_indices = gtk_tree_path_get_indices (end_path);
3945 num_of_trans = end_indices[0] - start_indices[0];
3947 total_num = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (model), NULL);
3949 new_end = end_indices[0] + num_of_trans - 1;
3951 if (new_end > (total_num - 1))
3952 new_end = total_num -1;
3954 new_end_path = gtk_tree_path_new_from_indices (new_end, -1);
3959 gtk_tree_path_down (new_end_path);
3960 gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), new_end_path, NULL, TRUE, 1.0, 0.0);
3961 gtk_tree_path_up (new_end_path);
3964 gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), new_end_path, NULL, TRUE, 1.0, 0.0);
3967 gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), new_end_path, col, FALSE);
3969 gtk_tree_path_free (new_end_path);
3971 gnc_tree_model_split_reg_move (model, VIEW_DOWN);
3973 gtk_tree_path_free (start_path);
3974 gtk_tree_path_free (end_path);
3982 model = gnc_tree_view_split_reg_get_model_from_view (view);
3984 if (event->keyval == GDK_KEY_Home)
3985 hetrans = gnc_tree_model_split_reg_get_first_trans (model);
3987 hetrans = gnc_tree_model_split_get_blank_trans (model);
3991 if (!gnc_tree_model_split_reg_trans_is_in_view (model, hetrans))
3992 g_signal_emit_by_name (model,
"refresh_trans");
3994 gnc_tree_control_split_reg_jump_to (view, hetrans, NULL, FALSE);
3999 case GDK_KEY_Return:
4006 if (!gtv_sr_recn_tests (view, col, spath))
4009 gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), spath, col, TRUE);
4012 gtk_tree_path_free (spath);
4016 case GDK_KEY_KP_Enter:
4022 GNC_PREF_ENTER_MOVES_TO_END);
4024 model = gnc_tree_view_split_reg_get_model_from_view (view);
4025 btrans = gnc_tree_model_split_get_blank_trans (model);
4026 ctrans = gnc_tree_view_split_reg_get_current_trans (view);
4029 if (btrans == ctrans)
4033 if (gnc_tree_view_split_reg_enter (view))
4037 g_idle_add ((GSourceFunc)gnc_tree_control_split_reg_jump_to_blank, view);
4038 else if (next_trans)
4039 gnc_tree_control_split_reg_goto_rel_trans_row (view, 1);
4045 case GDK_KEY_ISO_Left_Tab:
4046 case GDK_KEY_KP_Tab:
4052 if (event->state & GDK_CONTROL_MASK)
4053 view->priv->auto_complete = TRUE;
4056 gnc_tree_view_split_reg_finish_edit (view);
4059 if (view->priv->stop_cell_move == TRUE)
4061 gtk_tree_path_free (spath);
4065 while (!editing && !step_off)
4068 start_spath = gtk_tree_path_copy (spath);
4069 start_indices = gtk_tree_path_get_indices (start_spath);
4072 gchar *
string = gtk_tree_path_to_string (start_spath);
4073 DEBUG(
"Column title is %s and start path is %s", gtk_tree_view_column_get_title (col),
string);
4077 model = gnc_tree_view_split_reg_get_model_from_view (view);
4080 gnc_tree_view_keynav (GNC_TREE_VIEW (view), &col, spath, event);
4083 gchar *
string = gtk_tree_path_to_string (spath);
4084 DEBUG(
"Column title is %s and spath is %s", gtk_tree_view_column_get_title (col),
string);
4089 next_indices = gtk_tree_path_get_indices (spath);
4090 if (start_indices[0] != next_indices[0])
4092 if (view->priv->dirty_trans != NULL)
4093 trans_changed = TRUE;
4096 view->change_allowed = FALSE;
4100 if (gnc_tree_view_path_is_valid (GNC_TREE_VIEW (view), spath))
4102 if (gtv_sr_recn_tests (view, col, spath))
4104 gtk_tree_path_free (start_spath);
4105 gtk_tree_path_free (spath);
4111 if (!spath || !gnc_tree_view_path_is_valid (GNC_TREE_VIEW (view), spath) || trans_changed)
4114 if (gtv_sr_transaction_changed (view))
4116 gtk_tree_path_free (spath);
4122 if (view->priv->trans_confirm != DISCARD)
4125 gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), spath, col, TRUE);
4128 editing = gtv_sr_get_editing (col);
4130 gtk_tree_path_free (start_spath);
4131 gtk_tree_path_free (spath);
4136 gtk_tree_path_free (spath);
4146 gtv_sr_motion_cb (GtkTreeSelection *sel, gpointer user_data)
4150 GtkTreeModel *s_model;
4151 GtkTreePath *mpath, *spath;
4152 Split *split = NULL;
4155 gboolean is_trow1, is_trow2, is_split, is_blank;
4160 model = gnc_tree_view_split_reg_get_model_from_view (view);
4162 ENTER(
"View is %p and Model is %p", view, model);
4164 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
4166 DEBUG(
"Current trans %p, Split %p, Depth %d and Dirty Trans %p", view->priv->current_trans, view->priv->current_split,
4167 view->priv->current_depth, view->priv->dirty_trans);
4170 if (view->help_text)
4171 g_free (view->help_text);
4172 view->help_text = g_strdup (
" ");
4173 g_signal_emit_by_name (view,
"help_signal", NULL);
4175 if (gtv_sr_get_model_iter_from_selection (view, sel, &m_iter))
4177 gchar *mstring, *sstring;
4179 mpath = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &m_iter);
4180 spath = gnc_tree_view_split_reg_get_sort_path_from_model_path (view, mpath);
4182 mstring = gtk_tree_path_to_string (mpath);
4183 sstring = gtk_tree_path_to_string (spath);
4184 DEBUG(
"Valid Selection - mpath is %s, spath is %s", mstring, sstring);
4189 gnc_tree_view_split_reg_set_current_path (view, mpath);
4192 depth = gtk_tree_path_get_depth (mpath);
4194 gtk_tree_path_free (mpath);
4196 gnc_tree_model_split_reg_get_split_and_trans (
4197 GNC_TREE_MODEL_SPLIT_REG (model), &m_iter, &is_trow1, &is_trow2, &is_split, &is_blank, &split, &trans);
4199 DEBUG(
"Get model trans %p, split %p, is_split %d, is_blank %d\n", trans, split, is_split, is_blank);
4202 if (depth != view->priv->current_depth)
4203 gtv_sr_titles (view, depth);
4206 gnc_tree_model_split_reg_set_blank_split_parent (model, trans, FALSE);
4209 old_trans = view->priv->current_trans;
4210 view->priv->current_trans = trans;
4211 view->priv->current_split = split;
4212 view->priv->current_depth = depth;
4214 DEBUG(
"Current trans %p, split %p, depth %d and old_trans %p", view->priv->current_trans, view->priv->current_split,
4215 view->priv->current_depth, old_trans);
4219 indices = gtk_tree_path_get_indices (spath);
4221 gnc_tree_model_split_reg_sync_scrollbar (model);
4224 if ((trans != old_trans) && (old_trans == view->priv->dirty_trans))
4226 if (gtv_sr_transaction_changed (view))
4228 gtk_tree_path_free (spath);
4229 LEAVE(
"Leave Transaction Changed");
4233 if (view->priv->trans_confirm == CANCEL)
4235 gtk_tree_path_free (spath);
4236 LEAVE(
"Leave Transaction Changed - Cancel");
4241 if (old_trans != trans)
4243 if (model->
style != REG2_STYLE_JOURNAL)
4245 gnc_tree_view_split_reg_block_selection (view, TRUE);
4247 if (gnc_tree_view_split_reg_trans_expanded (view, old_trans))
4248 gnc_tree_view_split_reg_collapse_trans (view, old_trans);
4250 gnc_tree_view_split_reg_block_selection (view, FALSE);
4253 gnc_tree_view_split_reg_expand_trans (view, NULL);
4255 if (model->
style == REG2_STYLE_AUTO_LEDGER)
4257 gtk_tree_view_expand_row (GTK_TREE_VIEW (view), spath, TRUE);
4259 view->priv->expanded = TRUE;
4261 if (view->priv->selection_to_blank_on_expand)
4262 gtv_sr_selection_to_blank (view);
4265 gtk_tree_path_free (spath);
4268 if (gnc_tree_view_split_reg_trans_expanded (view, trans))
4269 view->priv->expanded = TRUE;
4271 view->priv->expanded = FALSE;
4275 DEBUG(
"Not Valid Selection");
4277 gtv_sr_titles (view, 0);
4280 gnc_tree_model_split_reg_set_blank_split_parent (model, NULL, FALSE);
4283 gnc_tree_view_split_reg_default_selection (view);
4287 gnc_tree_view_split_reg_call_uiupdate_cb (view);
4297 gtv_sr_edited_cb (GtkCellRendererText *cell,
const gchar *path_string,
4298 const gchar *new_text, gpointer user_data)
4302 GtkCellEditable *editable;
4304 editable = g_object_get_data (G_OBJECT (cell),
"cell-editable");
4306 DEBUG(
"cell is %p editable pointer is %p and id %lu", cell, editable, view->priv->fo_handler_id);
4309 if (view->priv->fo_handler_id != 0)
4311 if (g_signal_handler_is_connected (G_OBJECT (editable), view->priv->fo_handler_id))
4312 g_signal_handler_disconnect (G_OBJECT (editable), view->priv->fo_handler_id);
4314 view->priv->fo_handler_id = 0;
4317 gtk_widget_grab_focus (GTK_WIDGET (view));
4319 if (g_strcmp0 (g_object_get_data (G_OBJECT (cell),
"current-string"), new_text) == 0)
4321 if (view->priv->stop_cell_move == FALSE)
4325 model = gnc_tree_view_split_reg_get_model_from_view (view);
4326 g_return_if_fail (model);
4329 if (!gnc_tree_model_split_reg_get_template (model))
4330 gtv_sr_edited_normal_cb (cell, path_string, new_text, view);
4332 gtv_sr_edited_template_cb (cell, path_string, new_text, view);
4338 gtv_sr_edited_normal_cb (GtkCellRendererText *cell,
const gchar *path_string,
4339 const gchar *new_text, gpointer user_data)
4343 GtkCellEditable *editable;
4347 gboolean is_trow1, is_trow2, is_split, is_blank;
4349 char *error_loc = NULL;
4350 Account *anchor = view->priv->anchor;
4352 editable = g_object_get_data (G_OBJECT (cell),
"cell-editable");
4354 DEBUG(
"cell is %p editable pointer is %p", cell, editable);
4356 g_return_if_fail (gtv_sr_get_model_iter_from_view_string (view, path_string, &m_iter));
4358 viewcol = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell),
"view_column"));
4360 model = gnc_tree_view_split_reg_get_model_from_view (view);
4361 g_return_if_fail (model);
4363 gnc_tree_model_split_reg_get_split_and_trans (
4364 model, &m_iter, &is_trow1, &is_trow2, &is_split, &is_blank, &split, &trans);
4372 gnc_tree_util_split_reg_parse_date (&parsed_date, new_text);
4373 if (g_date_valid (&parsed_date))
4375 gtv_sr_begin_edit (view, trans);
4376 xaccTransSetDate (trans, g_date_get_day (&parsed_date), g_date_get_month (&parsed_date), g_date_get_year (&parsed_date));
4381 PERR(
"invalid date '%s'", new_text);
4388 gtv_sr_begin_edit (view, trans);
4392 gnc_set_num_action (trans, gtv_sr_get_this_split (view, trans),
4405 gnc_set_num_action (trans, gtv_sr_get_this_split (view, trans),
4419 gnc_set_num_action (NULL, split, NULL, new_text);
4425 gtv_sr_begin_edit (view, trans);
4430 if (view->priv->auto_complete == FALSE)
4432 gnc_tree_control_auto_complete (view, trans, new_text);
4433 view->priv->auto_complete = TRUE;
4446 gtv_sr_begin_edit (view, trans);
4450 if (new_text != NULL)
4452 const gchar *cflag = gnc_get_reconcile_str (
CREC);
4453 const gchar *nflag = gnc_get_reconcile_str (
NREC);
4454 const char recn_flags[] = {
NREC,
CREC, 0};
4459 flags = g_strconcat (nflag, cflag, NULL);
4462 this_flag = strstr (flags, new_text);
4464 if (this_flag != NULL)
4466 index = this_flag - flags;
4467 rec = recn_flags[index];
4479 gtv_sr_begin_edit (view, trans);
4482 if (new_text != NULL)
4490 case COL_TRANSFERVOID:
4499 Split *osplit = NULL;
4500 gboolean valid_input = FALSE;
4501 gboolean force = FALSE;
4502 gboolean input_used = FALSE;
4504 gtv_sr_begin_edit (view, trans);
4507 if (!is_split && anchor)
4509 if (!gtv_sr_get_split_pair (view, trans, &osplit, &split))
4511 DEBUG(
"couldn't get split pair");
4517 if (viewcol == COL_TRANSFERVOID)
4519 view->priv->stop_cell_move = FALSE;
4520 acct = gnc_tree_control_split_reg_get_account_by_name (view, new_text);
4523 DEBUG(
"Account is NULL");
4524 xaccSplitReinit(split);
4528 g_free (view->priv->transfer_string);
4529 view->priv->transfer_string = g_strdup (new_text);
4530 view->priv->stop_cell_move = TRUE;
4533 g_idle_add ((GSourceFunc) gtv_sr_idle_transfer, view);
4537 if (acct != NULL && is_split)
4540 xaccSplitSetAccount (split, acct);
4547 xaccSplitSetAccount (osplit, acct);
4554 if (!gnc_exp_parser_parse (new_text, &input, &error_loc))
4566 xaccSplitSetAccount (split, anchor);
4593 input = gnc_tree_util_split_reg_get_value_for (view, trans, split, is_blank);
4596 if (viewcol == COL_CREDIT)
4600 xaccSplitSetParent (split, trans);
4603 if (viewcol == COL_AMTVAL)
4605 gnc_tree_util_set_number_for_input (view, trans, split, input, COL_AMTVAL);
4610 if (viewcol == COL_AMOUNT)
4612 gnc_tree_util_set_number_for_input (view, trans, split, input, COL_AMTVAL);
4617 if (viewcol == COL_PRICE)
4619 gnc_tree_util_set_number_for_input (view, trans, split, input, COL_PRICE);
4624 if (viewcol == COL_CREDIT || viewcol == COL_DEBIT)
4628 gnc_tree_util_set_number_for_input (view, trans, split, input, viewcol);
4634 if (input_used == FALSE)
4637 gnc_tree_util_split_reg_set_value_for (view, trans, split, input, force);
4639 gnc_tree_util_set_value_for_amount (view, trans, split, input);
4646 g_idle_add ((GSourceFunc) gnc_tree_model_split_reg_commit_blank_split, gnc_tree_view_split_reg_get_model_from_view (view));
4649 g_idle_add ((GSourceFunc) gnc_tree_view_split_reg_scroll_to_cell, view);
4655 xaccSplitSetParent (osplit, trans);
4658 gnc_tree_util_split_reg_set_value_for (view, trans, osplit,
gnc_numeric_neg (input), force);
4674 gtv_sr_edited_template_cb (GtkCellRendererText *cell,
const gchar *path_string,
4675 const gchar *new_text, gpointer user_data)
4679 GtkCellEditable *editable;
4683 gboolean is_trow1, is_trow2, is_split, is_blank;
4685 char *error_loc = NULL;
4686 Account *anchor = view->priv->anchor;
4688 editable = g_object_get_data (G_OBJECT (cell),
"cell-editable");
4690 DEBUG(
"cell is %p editable pointer is %p", cell, editable);
4692 g_return_if_fail (gtv_sr_get_model_iter_from_view_string (view, path_string, &m_iter));
4694 viewcol = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell),
"view_column"));
4696 model = gnc_tree_view_split_reg_get_model_from_view (view);
4697 g_return_if_fail (model);
4699 gnc_tree_model_split_reg_get_split_and_trans (
4700 model, &m_iter, &is_trow1, &is_trow2, &is_split, &is_blank, &split, &trans);
4705 gtv_sr_begin_edit (view, trans);
4709 gnc_set_num_action (trans, gtv_sr_get_this_split (view, trans),
4722 gnc_set_num_action (trans, gtv_sr_get_this_split (view, trans),
4736 gnc_set_num_action (NULL, split, NULL, new_text);
4742 gtv_sr_begin_edit (view, trans);
4747 if (view->priv->auto_complete == FALSE)
4749 gnc_tree_control_auto_complete (view, trans, new_text);
4750 view->priv->auto_complete = TRUE;
4763 gtv_sr_begin_edit (view, trans);
4767 if (new_text != NULL)
4769 const gchar *cflag = gnc_get_reconcile_str (
CREC);
4770 const gchar *nflag = gnc_get_reconcile_str (
NREC);
4771 const char recn_flags[] = {
NREC,
CREC, 0};
4776 flags = g_strconcat (nflag, cflag, NULL);
4779 this_flag = strstr (flags, new_text);
4781 if (this_flag != NULL)
4783 index = this_flag - flags;
4784 rec = recn_flags[index];
4794 case COL_TRANSFERVOID:
4798 gtv_sr_begin_edit (view, trans);
4801 if (viewcol == COL_TRANSFERVOID)
4808 view->priv->stop_cell_move = FALSE;
4809 acct = gnc_tree_control_split_reg_get_account_by_name (view, new_text);
4812 DEBUG(
"Template Account is NULL");
4814 g_free (view->priv->transfer_string);
4815 view->priv->transfer_string = g_strdup (new_text);
4816 view->priv->stop_cell_move = TRUE;
4819 g_idle_add ((GSourceFunc) gtv_sr_idle_transfer, view);
4825 "sx-account", acctGUID,
4828 template_acc = gnc_tree_model_split_reg_get_template_account (model);
4844 if (viewcol == COL_DEBIT)
4848 gboolean parse_result;
4854 parse_result = gnc_exp_parser_parse_separate_vars (new_text, &new_value, &error_loc, NULL);
4857 new_value = gnc_numeric_zero();
4860 "sx-debit-formula", new_text,
4861 "sx-debit-numeric", &new_value,
4862 "sx-credit-formula", NULL,
4863 "sx-credit-numeric", NULL,
4868 if (viewcol == COL_CREDIT)
4872 gboolean parse_result;
4878 parse_result = gnc_exp_parser_parse_separate_vars (new_text, &new_value, &error_loc, NULL);
4881 new_value = gnc_numeric_zero();
4884 "sx-credit-formula", new_text,
4885 "sx-credit-numeric", &new_value,
4886 "sx-debit-formula", NULL,
4887 "sx-debit-numeric", NULL,
4894 xaccSplitSetParent (split, trans);
4900 g_idle_add ((GSourceFunc) gnc_tree_model_split_reg_commit_blank_split, gnc_tree_view_split_reg_get_model_from_view (view));
4903 g_idle_add ((GSourceFunc) gnc_tree_view_split_reg_scroll_to_cell, view);
4919 gtv_sr_parse_num (
const char *
string,
long int *num)
4929 number = strtol (
string, NULL, 10);
4931 if ((number == LONG_MIN) || (number == LONG_MAX))
4942 gtv_sr_num_cb (GtkEntry *entry,
4948 GtkEditable *editable = GTK_EDITABLE (entry);
4953 gchar *entered_string;
4954 gchar *leave_string = NULL;
4956 gboolean accel = FALSE;
4958 long int number = 0;
4961 model = gnc_tree_view_split_reg_get_model_from_view (view);
4963 account = gnc_tree_model_split_reg_get_anchor (model);
4965 depth = gnc_tree_view_reg_get_selected_row_depth (view);
4968 if ((depth == TRANS2 || depth == SPLIT3))
4972 entered_string = gtk_editable_get_chars (editable, 0, -1);
4975 is_num = gtv_sr_parse_num (entered_string, &number);
4977 if (is_num && (number < 0))
4981 uc = g_utf8_get_char (text);
5013 if (accel && !is_num && (g_strcmp0 (entered_string,
"") != 0))
5017 if (accel && (g_strcmp0 (entered_string,
"") == 0))
5019 if (account != NULL)
5022 number = number + 1;
5034 leave_string = g_strconcat (entered_string, text, NULL);
5037 if (accel && is_num)
5042 snprintf (buff,
sizeof(buff),
"%ld", number);
5044 if (g_strcmp0 (buff,
"") == 0)
5047 leave_string = g_strdup (buff);
5050 g_signal_handlers_block_by_func (editable, (gpointer) gtv_sr_num_cb, user_data);
5052 gtk_editable_delete_text (editable, 0, -1);
5053 gtk_editable_set_position (editable, 0);
5055 if (leave_string != NULL)
5056 gtk_editable_insert_text (editable, leave_string, -1, position);
5058 g_signal_handlers_unblock_by_func (editable, (gpointer) gtv_sr_num_cb, user_data);
5060 g_signal_stop_emission_by_name (editable,
"insert_text");
5063 g_free (leave_string);
5065 g_free (entered_string);
5071 gtv_sr_acct_cb (GtkEntry *entry,
5077 GtkEditable *editable = GTK_EDITABLE (entry);
5079 GtkEntryCompletion *completion;
5080 GtkTreeModel *model;
5083 const gchar *sep_char;
5084 gchar *entered_string;
5085 gchar *acct_string = NULL;
5087 gint num_of_items = 0;
5089 gboolean all_the_same = TRUE;
5093 if (g_strcmp0 (text, sep_char) == 0)
5094 entered_string = g_strconcat (gtk_editable_get_chars (editable, 0, -1), NULL);
5096 entered_string = g_strconcat (gtk_editable_get_chars (editable, 0, -1), text, NULL);
5099 completion = gtk_entry_get_completion (entry);
5100 model = gtk_entry_completion_get_model (completion);
5103 valid = gtk_tree_model_get_iter_first (model, &iter);
5106 gchar *item, *item_string, *l_item, *l_entered_string, *l_acct_string;
5109 if (view->priv->acct_short_names)
5110 gtk_tree_model_get (model, &iter, 0, &item, -1);
5112 gtk_tree_model_get (model, &iter, 1, &item, -1);
5114 item_string = g_strconcat (item, sep_char, NULL);
5116 l_item = g_utf8_strdown (item_string, -1);
5117 l_entered_string = g_utf8_strdown (entered_string, -1);
5119 if (g_str_has_prefix (l_item, l_entered_string))
5121 if (num_of_items == 0)
5122 acct_string = g_strdup (item);
5125 l_acct_string = g_utf8_strdown (acct_string, -1);
5126 if (!g_str_has_prefix (g_utf8_strdown (l_item, -1), l_acct_string))
5127 all_the_same = FALSE;
5128 g_free (l_acct_string);
5130 num_of_items = num_of_items + 1;
5133 g_free (item_string);
5135 g_free (l_entered_string);
5136 valid = gtk_tree_model_iter_next (model, &iter);
5139 g_signal_handlers_block_by_func (editable, (gpointer) gtv_sr_acct_cb, user_data);
5141 gtk_editable_delete_text (editable, 0, -1);
5142 gtk_editable_set_position (editable, 0);
5144 if (num_of_items == 0)
5145 gtk_editable_insert_text (editable, entered_string, -1, position);
5148 if (num_of_items == 1)
5149 gtk_editable_insert_text (editable, acct_string, -1, position);
5154 if (g_strcmp0 (text, sep_char) == 0)
5155 gtk_editable_insert_text (editable, g_strconcat (acct_string, sep_char, NULL), -1, position);
5157 gtk_editable_insert_text (editable, entered_string, -1, position);
5160 gtk_editable_insert_text (editable, entered_string, -1, position);
5163 g_signal_handlers_unblock_by_func (editable, (gpointer) gtv_sr_acct_cb, user_data);
5165 g_signal_stop_emission_by_name (editable,
"insert_text");
5166 g_free (acct_string);
5167 g_free (entered_string);
5173 gtv_sr_recn_cb (GtkEntry *entry,
5179 GtkEditable *editable = GTK_EDITABLE (entry);
5182 const gchar *cflag = gnc_get_reconcile_str (
CREC);
5183 const gchar *nflag = gnc_get_reconcile_str (
NREC);
5191 result = g_ascii_strdown (text, length);
5193 if (g_object_get_data (G_OBJECT (view->priv->temp_cr),
"current-flag") != NULL)
5194 index = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (view->priv->temp_cr),
"current-flag"));
5197 if (g_strcmp0 (g_object_get_data (G_OBJECT (view->priv->temp_cr),
"current-string"), nflag) == 0)
5201 flags = g_strconcat (nflag, cflag, NULL);
5208 this_flag = strstr (flags, text);
5210 if (this_flag == NULL || *this_flag ==
'\0')
5212 if (g_strcmp0 (text, ss) == 0)
5217 if (flags[index + 1] !=
'\0')
5223 result = g_strdup_printf(
"%c", flags[index]);
5229 result = g_strdup (gnc_get_reconcile_str (
NREC));
5235 result = g_strdup (text);
5239 g_object_set_data (G_OBJECT (view->priv->temp_cr),
"current-flag", GINT_TO_POINTER (index));
5241 g_signal_handlers_block_by_func (editable, (gpointer) gtv_sr_recn_cb, user_data);
5243 gtk_editable_delete_text (editable, 0, -1);
5244 gtk_editable_insert_text (editable, result, length, position);
5246 g_signal_handlers_unblock_by_func (editable, (gpointer) gtv_sr_recn_cb, user_data);
5248 g_signal_stop_emission_by_name (editable,
"insert_text");
5256 gtv_sr_type_cb (GtkEntry *entry,
5262 GtkEditable *editable = GTK_EDITABLE (entry);
5273 result = g_ascii_strup (text, length);
5275 if (g_object_get_data (G_OBJECT (view->priv->temp_cr),
"current-flag") != NULL)
5276 index = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (view->priv->temp_cr),
"current-flag"));
5279 if (g_strcmp0 (g_object_get_data (G_OBJECT (view->priv->temp_cr),
"current-string"),
"I") == 0)
5288 this_flag = strstr (flags, text);
5290 if (this_flag == NULL || *this_flag ==
'\0')
5292 if (g_strcmp0 (text, ss) == 0)
5297 if (flags[index + 1] !=
'\0')
5303 result = g_strdup_printf(
"%c", flags[index]);
5315 result = g_strdup (text);
5319 g_object_set_data (G_OBJECT (view->priv->temp_cr),
"current-flag", GINT_TO_POINTER (index));
5321 g_signal_handlers_block_by_func (editable, (gpointer) gtv_sr_type_cb, user_data);
5323 gtk_editable_delete_text (editable, 0, -1);
5324 gtk_editable_insert_text (editable, result, length, position);
5326 g_signal_handlers_unblock_by_func (editable, (gpointer) gtv_sr_type_cb, user_data);
5328 g_signal_stop_emission_by_name (editable,
"insert_text");
5336 gtv_sr_ed_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data)
5340 GtkTreeViewColumn *col;
5341 GtkTreePath *spath, *start_spath;
5342 gboolean goto_blank = FALSE;
5343 gboolean next_trans = TRUE;
5346 gboolean auto_popped = FALSE;
5349 gtk_tree_view_get_cursor (GTK_TREE_VIEW (view), &spath, &col);
5351 if (event->type != GDK_KEY_PRESS)
5354 gtk_tree_path_free (spath);
5358 switch (event->keyval)
5369 GtkWidget *toplevel;
5370 GtkWindowGroup *window_group;
5373 toplevel = gtk_widget_get_toplevel (widget);
5374 if (GTK_IS_WINDOW (toplevel))
5376 window_group = gtk_window_get_group (GTK_WINDOW (toplevel));
5377 win_list = gtk_window_group_list_windows (window_group);
5378 if (g_list_length (win_list) == 1 && gtk_widget_get_visible (GTK_WIDGET (win_list->data)))
5381 g_list_free (win_list);
5386 if (auto_popped == TRUE)
5388 gtk_tree_path_free (spath);
5392 model = gnc_tree_view_split_reg_get_model_from_view (view);
5395 gnc_tree_view_split_reg_finish_edit (view);
5398 if (view->priv->stop_cell_move == TRUE)
5400 gtk_tree_path_free (spath);
5404 depth = gtk_tree_path_get_depth (spath);
5405 if (event->keyval == GDK_KEY_Up)
5409 if (gtk_tree_path_prev (spath))
5411 if (gtk_tree_view_row_expanded (GTK_TREE_VIEW (view), spath))
5413 gtk_tree_path_down (spath);
5415 if (gtk_tree_view_row_expanded (GTK_TREE_VIEW (view), spath) && model->
type == GENERAL_LEDGER2)
5417 gtk_tree_path_down (spath);
5419 while (gnc_tree_view_path_is_valid (GNC_TREE_VIEW (view), spath))
5421 gtk_tree_path_next (spath);
5423 gtk_tree_path_prev (spath);
5428 else if (!gtk_tree_path_prev (spath) && depth > 1)
5430 gtk_tree_path_up (spath);
5433 else if (gtk_tree_view_row_expanded (GTK_TREE_VIEW (view), spath))
5435 gtk_tree_path_down (spath);
5439 gtk_tree_path_next (spath);
5440 if (!gnc_tree_view_path_is_valid (GNC_TREE_VIEW (view), spath) && depth > 2)
5442 gtk_tree_path_prev (spath);
5443 gtk_tree_path_up (spath);
5444 gtk_tree_path_next (spath);
5446 if (!gnc_tree_view_path_is_valid (GNC_TREE_VIEW (view), spath) && depth > 1)
5448 gtk_tree_path_prev (spath);
5449 gtk_tree_path_up (spath);
5450 gtk_tree_path_next (spath);
5455 gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), spath, col, TRUE);
5457 if (event->keyval == GDK_KEY_Up)
5459 gnc_tree_model_split_reg_move (model, VIEW_UP);
5462 gnc_tree_model_split_reg_move (model, VIEW_DOWN);
5467 case GDK_KEY_Return:
5473 if (view->priv->stop_cell_move == TRUE)
5475 gtk_tree_path_free (spath);
5480 if (event->state & GDK_CONTROL_MASK)
5483 gnc_tree_view_split_reg_finish_edit (view);
5486 gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), spath, col, TRUE);
5487 gtk_tree_path_free (spath);
5493 case GDK_KEY_KP_Enter:
5499 if (view->priv->stop_cell_move == TRUE)
5501 gtk_tree_path_free (spath);
5506 GNC_PREF_ENTER_MOVES_TO_END);
5508 model = gnc_tree_view_split_reg_get_model_from_view (view);
5509 btrans = gnc_tree_model_split_get_blank_trans (model);
5510 ctrans = gnc_tree_view_split_reg_get_current_trans (view);
5513 if (btrans == ctrans)
5517 if (gnc_tree_view_split_reg_enter (view))
5521 g_idle_add ((GSourceFunc)gnc_tree_control_split_reg_jump_to_blank, view);
5522 else if (next_trans)
5523 gnc_tree_control_split_reg_goto_rel_trans_row (view, 1);
5529 gtk_tree_path_free (spath);
5538 gtv_sr_editable_start_editing_cb (GtkCellRenderer *cr, GtkCellEditable *editable,
5539 const gchar *path_string, gpointer user_data)
5543 GtkTreeModel *s_model;
5544 GtkTreePath *spath, *mpath, *fpath;
5545 GtkEntry *entry = NULL;
5550 GtkListStore *description_list;
5551 GtkListStore *memo_list;
5552 GtkListStore *notes_list;
5553 GtkListStore *account_list;
5555 GtkEntryCompletion *completion = gtk_entry_completion_new();
5557 ENTER(
"gtv_sr_editable_start_editing_cb Path string is '%s'", path_string);
5559 model = gnc_tree_view_split_reg_get_model_from_view (view);
5561 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
5564 description_list = gnc_tree_model_split_reg_get_description_list (model);
5565 notes_list = gnc_tree_model_split_reg_get_notes_list (model);
5566 memo_list = gnc_tree_model_split_reg_get_memo_list (model);
5567 account_list = gnc_tree_model_split_reg_get_acct_list (model);
5570 spath = gtk_tree_path_new_from_string (path_string);
5571 depth = gtk_tree_path_get_depth (spath);
5572 indices = gtk_tree_path_get_indices (spath);
5574 viewcol = GPOINTER_TO_INT (g_object_get_data (G_OBJECT(cr),
"view_column"));
5576 DEBUG(
"editable Depth is %u and ViewCol is %d", depth, viewcol);
5578 g_object_set_data (G_OBJECT (cr),
"cell-editable", editable);
5581 g_signal_connect (G_OBJECT (editable),
"key-press-event", G_CALLBACK (gtv_sr_ed_key_press_cb), view);
5584 if (viewcol == COL_DATE)
5586 entry = GTK_ENTRY (GNC_POPUP_ENTRY (editable)->entry);
5589 g_object_set_data_full (G_OBJECT (cr),
"current-string", g_strdup (gtk_entry_get_text (entry)), g_free);
5591 g_signal_connect (G_OBJECT (editable),
"remove-widget", (GCallback) gtv_sr_remove_edit_date, view);
5593 DEBUG(
"Current String date is '%s'", gtk_entry_get_text (entry));
5597 else if (viewcol == COL_TRANSFERVOID)
5599 entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (editable)));
5602 g_signal_connect (G_OBJECT (entry),
"key-press-event", G_CALLBACK (gtv_sr_ed_key_press_cb), view);
5605 GtkEditable *editable = GTK_EDITABLE (entry);
5607 if (view->priv->stop_cell_move == TRUE)
5609 gint textPosition = 0;
5610 gtk_editable_insert_text (GTK_EDITABLE (editable), view->priv->transfer_string, -1, &textPosition);
5611 gtk_editable_set_position (GTK_EDITABLE (editable), -1);
5616 gnc_tree_model_split_reg_update_account_list (model);
5618 gtk_entry_set_completion (entry, completion);
5619 gtk_entry_completion_set_model (completion, GTK_TREE_MODEL (account_list));
5622 if (view->priv->acct_short_names)
5623 gtk_entry_completion_set_text_column (completion, 0);
5625 gtk_entry_completion_set_text_column (completion, 1);
5627 gtk_entry_completion_set_popup_completion (completion, TRUE);
5628 gtk_entry_completion_set_inline_selection (completion, TRUE);
5629 gtk_entry_completion_set_popup_set_width (completion, FALSE);
5630 gtk_entry_completion_set_minimum_key_length (completion, 1);
5632 g_object_unref (completion);
5635 g_object_set_data_full (G_OBJECT (cr),
"current-string", g_strdup (gtk_entry_get_text (entry)), g_free);
5637 g_signal_connect (G_OBJECT (entry),
"insert_text", (GCallback) gtv_sr_acct_cb, view);
5640 g_signal_connect (G_OBJECT (editable),
"remove-widget", (GCallback) gtv_sr_remove_edit_combo, view);
5642 DEBUG(
"Current String tv is '%s'", gtk_entry_get_text (entry));
5646 else if (viewcol == COL_NUMACT)
5650 entry = GTK_ENTRY (editable);
5653 g_object_set_data_full (G_OBJECT (cr),
"current-string", g_strdup (gtk_entry_get_text (entry)), g_free);
5655 g_signal_connect (G_OBJECT (GTK_ENTRY (entry)),
"insert_text", (GCallback) gtv_sr_num_cb, view);
5657 view->priv->fo_handler_id = g_signal_connect (G_OBJECT (editable),
"focus-out-event", (GCallback) gtv_sr_focus_out_cb, view);
5659 g_signal_connect (G_OBJECT (editable),
"remove-widget", (GCallback) gtv_sr_remove_edit_entry, view);
5662 DEBUG(
"Current String num is '%s'", gtk_entry_get_text (entry));
5667 gnc_tree_model_split_reg_update_action_list (model);
5669 entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (editable)));
5672 g_object_set_data_full (G_OBJECT (cr),
"current-string", g_strdup (gtk_entry_get_text (entry)), g_free);
5675 g_signal_connect (G_OBJECT (editable),
"remove-widget", (GCallback) gtv_sr_remove_edit_combo, view);
5677 DEBUG(
"Current String action is '%s'", gtk_entry_get_text (entry));
5682 else if (viewcol == COL_DESCNOTES)
5684 entry = GTK_ENTRY (editable);
5687 gnc_tree_model_split_reg_update_completion (model);
5690 if (depth == TRANS1)
5692 gtk_entry_set_completion (entry, completion);
5693 gtk_entry_completion_set_model (completion, GTK_TREE_MODEL (description_list));
5694 gtk_entry_completion_set_text_column (completion, 0);
5696 else if (depth == TRANS2)
5698 gtk_entry_set_completion (entry, completion);
5699 gtk_entry_completion_set_model (completion, GTK_TREE_MODEL (notes_list));
5700 gtk_entry_completion_set_text_column (completion, 0);
5702 else if (depth == SPLIT3)
5704 gtk_entry_set_completion (entry, completion);
5705 gtk_entry_completion_set_model (completion, GTK_TREE_MODEL (memo_list));
5706 gtk_entry_completion_set_text_column (completion, 0);
5711 gtk_entry_completion_set_popup_completion (completion, TRUE);
5712 gtk_entry_completion_set_inline_selection (completion, TRUE);
5713 gtk_entry_completion_set_minimum_key_length (completion, view->priv->key_length);
5716 g_object_unref (completion);
5719 g_object_set_data_full (G_OBJECT (cr),
"current-string", g_strdup (gtk_entry_get_text (entry)), g_free);
5721 view->priv->fo_handler_id = g_signal_connect (G_OBJECT (editable),
"focus-out-event", (GCallback) gtv_sr_focus_out_cb, view);
5723 g_signal_connect (G_OBJECT (editable),
"remove-widget", (GCallback) gtv_sr_remove_edit_entry, view);
5725 DEBUG(
"Current String dnm is '%s'", gtk_entry_get_text (entry));
5729 else if (viewcol == COL_RECN)
5731 entry = GTK_ENTRY (editable);
5734 g_object_set_data_full (G_OBJECT (cr),
"current-string", g_strdup (gtk_entry_get_text (entry)), g_free);
5736 g_signal_connect (G_OBJECT (GTK_ENTRY (editable)),
"insert_text", (GCallback)gtv_sr_recn_cb, view);
5738 view->priv->fo_handler_id = g_signal_connect (G_OBJECT (editable),
"focus-out-event", (GCallback) gtv_sr_focus_out_cb, view);
5740 g_signal_connect (G_OBJECT (editable),
"remove-widget", (GCallback) gtv_sr_remove_edit_entry, view);
5743 DEBUG(
"Current String recn is '%s'", gtk_entry_get_text (entry));
5747 else if (viewcol == COL_TYPE)
5749 entry = GTK_ENTRY (editable);
5752 g_object_set_data_full (G_OBJECT (cr),
"current-string", g_strdup (gtk_entry_get_text (entry)), g_free);
5754 g_signal_connect (G_OBJECT (GTK_ENTRY (editable)),
"insert_text", (GCallback)gtv_sr_type_cb, view);
5756 view->priv->fo_handler_id = g_signal_connect (G_OBJECT (editable),
"focus-out-event", (GCallback) gtv_sr_focus_out_cb, view);
5758 g_signal_connect (G_OBJECT (editable),
"remove-widget", (GCallback) gtv_sr_remove_edit_entry, view);
5761 DEBUG(
"Current String type is '%s'", gtk_entry_get_text (entry));
5767 entry = GTK_ENTRY (editable);
5770 g_object_set_data_full (G_OBJECT (cr),
"current-string", g_strdup (gtk_entry_get_text (entry)), g_free);
5772 view->priv->fo_handler_id = g_signal_connect (G_OBJECT (editable),
"focus-out-event", (GCallback) gtv_sr_focus_out_cb, view);
5774 g_signal_connect (G_OBJECT (editable),
"remove-widget", (GCallback) gtv_sr_remove_edit_entry, view);
5777 DEBUG(
"Current String rest is '%s'", gtk_entry_get_text (entry));
5783 const gchar *row_color;
5784 gboolean is_trow1 = FALSE;
5785 gboolean is_trow2 = FALSE;
5786 gboolean is_split = FALSE;
5788 if (depth == TRANS1)
5790 if (depth == TRANS2)
5792 if (depth == SPLIT3)
5795 row_color = gnc_tree_model_split_reg_get_row_color (model, is_trow1, is_trow2, is_split, indices[0]);
5797 if (gdk_color_parse (row_color, &color))
5800 gtk_widget_modify_base (GTK_WIDGET (entry), GTK_STATE_NORMAL, &color);
5804 gtv_sr_help (view, cr, viewcol, depth);
5805 gtk_tree_path_free (spath);
5807 view->priv->temp_cr = cr;
5808 view->editing_now = TRUE;
5810 DEBUG(
"Temp Cell Rend %p", view->priv->temp_cr);
5814 g_object_set_data (G_OBJECT (cr),
"edit-canceled", GINT_TO_POINTER (FALSE));
5821 gtv_sr_match_selected_cb (GtkEntryCompletion *widget, GtkTreeModel *model,
5822 GtkTreeIter *iter, gpointer user_data)
5835 gtv_sr_changed_cb (GtkCellRendererCombo *widget, gchar *path_string,
5836 GtkTreeIter *iter, gpointer user_data)
5849 gtv_sr_editing_canceled_cb (GtkCellRenderer *cr, gpointer user_data)
5853 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (view),
"data-edited")) == FALSE)
5855 view->priv->dirty_trans = NULL;
5859 if (view->priv->stop_cell_move == TRUE)
5861 view->priv->stop_cell_move = FALSE;
5864 g_idle_add ((GSourceFunc) gtv_sr_idle_transfer, view);
5868 if (view->help_text)
5869 g_free (view->help_text);
5870 view->help_text = g_strdup (
" ");
5871 g_signal_emit_by_name (view,
"help_signal", NULL);
5874 g_object_set_data (G_OBJECT (cr),
"edit-canceled", GINT_TO_POINTER (TRUE));
5886 GtkTreePath *mpath, *spath;
5888 PINFO(
"#### Start Scroll to Cell ####");
5890 model = gnc_tree_view_split_reg_get_model_from_view (view);
5892 mpath = gnc_tree_view_split_reg_get_current_path (view);
5893 spath = gnc_tree_view_split_reg_get_sort_path_from_model_path (view, mpath);
5897 gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), spath, NULL, TRUE, 0.5, 0.0);
5903 gtk_tree_path_down (spath);
5904 gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), spath, NULL, TRUE, 1.0, 0.0);
5908 gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), spath, NULL, TRUE, 1.0, 0.0);
5912 gtk_tree_path_free (mpath);
5913 gtk_tree_path_free (spath);
5915 PINFO(
"#### End Scroll to Cell ####");
5926 GtkTreePath *bsplit_mpath, *bsplit_spath;
5929 model = gnc_tree_view_split_reg_get_model_from_view (view);
5932 bsplit = gnc_tree_model_split_get_blank_split (model);
5933 bsplit_mpath = gnc_tree_model_split_reg_get_path_to_split_and_trans (model, bsplit, NULL);
5934 bsplit_spath = gnc_tree_view_split_reg_get_sort_path_from_model_path (view, bsplit_mpath);
5936 gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), bsplit_spath, NULL, FALSE, 1.0, 0.0);
5938 gtk_tree_path_free (bsplit_mpath);
5939 gtk_tree_path_free (bsplit_spath);
5948 return view->priv->current_trans;
5956 return view->priv->current_split;
5964 return view->priv->current_depth;
5972 return view->priv->dirty_trans;
5982 model = gnc_tree_view_split_reg_get_model_from_view (view);
5986 g_object_set_data (G_OBJECT (view),
"data-edited", GINT_TO_POINTER (FALSE));
5987 view->priv->dirty_trans = NULL;
5991 g_object_set_data (G_OBJECT (view),
"data-edited", GINT_TO_POINTER (TRUE));
5992 view->priv->dirty_trans = trans;
6001 if (!view->priv->current_ref)
6003 return gtk_tree_row_reference_get_path (view->priv->current_ref);
6013 model = gnc_tree_view_split_reg_get_model_from_view (view);
6015 if (view->priv->current_ref != NULL)
6017 gtk_tree_row_reference_free (view->priv->current_ref);
6018 view->priv->current_ref = NULL;
6020 view->priv->current_ref = gtk_tree_row_reference_new (GTK_TREE_MODEL (model), mpath);
6032 gnc_tree_view_split_reg_finish_edit (view);
6034 trans = view->priv->current_trans;
6037 gnc_tree_control_split_reg_goto_rel_trans_row (view, 0);
6039 depth = view->priv->current_depth;
6041 if (trans && (depth != SPLIT3))
6049 gnc_tree_view_split_reg_set_dirty_trans (view, trans);
6053 if (xaccTransGetRateForCommodity (trans, view->priv->reg_comm, s, NULL))
6069 gnc_tree_view_split_reg_finish_edit (view);
6071 trans = view->priv->current_trans;
6072 split = view->priv->current_split;
6077 gnc_tree_view_split_reg_set_dirty_trans (view, trans);
6080 gnc_tree_control_split_reg_goto_rel_trans_row (view, 0);
6096 gnc_tree_view_split_reg_finish_edit (view);
6098 trans = view->priv->current_trans;
6101 gnc_tree_control_split_reg_goto_rel_trans_row (view, 1);
6105 gnc_tree_view_split_reg_set_dirty_trans (view, trans);
6110 gnc_tree_view_split_reg_set_dirty_trans (view, NULL);
6120 model = gnc_tree_view_split_reg_get_model_from_view (view);
6123 gnc_tree_view_split_reg_finish_edit (view);
6126 if (gtv_sr_transaction_changed (view))
6130 if (view->priv->trans_confirm == DISCARD)
6145 ENTER(
"gnc_tree_view_split_reg_cancel_edit view is %p and reg_closing is %d", view, reg_closing);
6147 model = gnc_tree_view_split_reg_get_model_from_view (view);
6152 gnc_tree_control_split_reg_goto_rel_trans_row (view, 0);
6155 gnc_tree_model_split_reg_set_blank_split_parent (model, trans, TRUE);
6157 g_object_set_data (G_OBJECT (view),
"data-edited", GINT_TO_POINTER (FALSE));
6161 gnc_tree_model_split_reg_set_blank_split_parent (model, trans, FALSE);
6164 gnc_tree_view_split_reg_format_trans (view, view->priv->dirty_trans);
6166 gnc_tree_view_split_reg_set_dirty_trans (view, NULL);
6168 split = gnc_tree_model_split_get_blank_split (model);
6169 xaccSplitReinit (split);
6172 view->change_allowed = FALSE;
6174 view->priv->auto_complete = FALSE;
6177 gnc_tree_view_split_reg_call_uiupdate_cb(view);
6187 gtv_sr_finish_edit (view);
6190 while (gtk_events_pending ())
6191 gtk_main_iteration ();
6201 GtkTreePath *mpath, *spath;
6206 expanded = view->priv->expanded;
6209 model = gnc_tree_view_split_reg_get_model_from_view (view);
6211 mpath = gnc_tree_model_split_reg_get_path_to_split_and_trans (model, NULL, trans);
6213 spath = gnc_tree_view_split_reg_get_sort_path_from_model_path (view, mpath);
6215 gtk_tree_path_down (spath);
6217 expanded = gtk_tree_view_row_expanded (GTK_TREE_VIEW (view), spath);
6219 gtk_tree_path_free (mpath);
6220 gtk_tree_path_free (spath);
6231 GtkTreePath *temp_spath, *mpath, *spath;
6236 ENTER(
"gnc_tree_view_split_reg_collapse_trans and trans is %p", trans);
6238 model = gnc_tree_view_split_reg_get_model_from_view (view);
6241 gnc_tree_view_split_reg_finish_edit (view);
6245 mpath = gtk_tree_row_reference_get_path (view->priv->current_ref);
6247 mpath = gnc_tree_model_split_reg_get_path_to_split_and_trans (model, NULL, trans);
6249 spath = gnc_tree_view_split_reg_get_sort_path_from_model_path (view, mpath);
6252 indices = gtk_tree_path_get_indices (spath);
6253 depth = gtk_tree_path_get_depth (spath);
6256 temp_spath = gtk_tree_path_new_from_indices (indices[0], 0, -1);
6258 temp_spath = gtk_tree_path_new_from_indices (indices[0], -1);
6263 GtkTreePath *temp_mpath;
6265 gnc_tree_view_split_reg_block_selection (view, TRUE);
6269 gtk_tree_selection_select_path (gtk_tree_view_get_selection (GTK_TREE_VIEW (view)), temp_spath);
6273 gtk_tree_selection_select_path (gtk_tree_view_get_selection (GTK_TREE_VIEW (view)), temp_spath);
6275 gtk_tree_view_collapse_row (GTK_TREE_VIEW (view), temp_spath);
6278 if (gtv_sr_get_model_iter_from_selection (view, gtk_tree_view_get_selection (GTK_TREE_VIEW (view)), &m_iter))
6280 temp_mpath = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &m_iter);
6283 gtv_sr_titles (view, gtk_tree_path_get_depth (temp_mpath));
6286 gnc_tree_view_split_reg_set_current_path (view, temp_mpath);
6288 gtk_tree_path_free (temp_mpath);
6290 gnc_tree_view_split_reg_block_selection (view, FALSE);
6293 gtk_tree_view_collapse_row (GTK_TREE_VIEW (view), temp_spath);
6295 gtk_tree_path_free (temp_spath);
6296 gtk_tree_path_free (mpath);
6297 gtk_tree_path_free (spath);
6299 view->priv->expanded = FALSE;
6302 gnc_tree_view_split_reg_call_uiupdate_cb(view);
6313 GtkTreePath *mpath, *spath;
6314 GtkTreePath *start_path, *end_path;
6315 gint *indices_spath;
6318 ENTER(
"gnc_tree_view_split_reg_expand_trans and trans is %p", trans);
6320 model = gnc_tree_view_split_reg_get_model_from_view (view);
6323 gnc_tree_view_split_reg_finish_edit (view);
6326 mpath = gtk_tree_row_reference_get_path (view->priv->current_ref);
6328 mpath = gnc_tree_model_split_reg_get_path_to_split_and_trans (model, NULL, trans);
6330 spath = gnc_tree_view_split_reg_get_sort_path_from_model_path (view, mpath);
6332 gtk_tree_view_expand_row (GTK_TREE_VIEW (view), spath, TRUE);
6334 view->priv->expanded = TRUE;
6336 if (view->priv->selection_to_blank_on_expand && (model->
style != REG2_STYLE_JOURNAL))
6337 gtv_sr_selection_to_blank (view);
6340 indices_spath = gtk_tree_path_get_indices (spath);
6343 if (gtk_tree_view_get_visible_range (GTK_TREE_VIEW (view), &start_path, &end_path))
6345 gint *indices_start, *indices_end;
6349 indices_start = gtk_tree_path_get_indices (start_path);
6350 indices_end = gtk_tree_path_get_indices (end_path);
6353 lines = (indices_end[0] - indices_spath[0])*2;
6355 lines = indices_end[0] - indices_spath[0];
6357 if ((num_splits + 1) > lines)
6360 g_idle_add ((GSourceFunc) gnc_tree_view_split_reg_scroll_to_bsplit, view );
6362 gtk_tree_path_free (start_path);
6363 gtk_tree_path_free (end_path);
6365 gtk_tree_path_free (mpath);
6366 gtk_tree_path_free (spath);
6369 gnc_tree_view_split_reg_call_uiupdate_cb(view);
6377 gnc_tree_view_split_reg_get_credit_debit_string (
GncTreeViewSplitReg *view, gboolean credit)
6379 GtkCellRenderer *cr0;
6384 const char *title = NULL;
6386 columns = gtk_tree_view_get_columns (GTK_TREE_VIEW (view));
6388 for ( column = columns, i = 1; column; column = g_list_next (column), i++)
6390 GtkTreeViewColumn *tvc;
6396 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (tvc));
6397 cr0 = g_list_nth_data (renderers, 0);
6398 g_list_free (renderers);
6400 viewcol = GPOINTER_TO_INT (g_object_get_data (G_OBJECT(cr0),
"view_column"));
6402 DEBUG(
"viewcol is %d", viewcol);
6404 if (viewcol == COL_CREDIT && credit)
6405 title = gtk_tree_view_column_get_title (tvc);
6407 if (viewcol == COL_DEBIT && !credit)
6408 title = gtk_tree_view_column_get_title (tvc);
6410 g_list_free (columns);
6420 model = gnc_tree_view_split_reg_get_model_from_view (view);
6421 return gnc_tree_model_split_reg_get_parent (model);
6427 gnc_tree_view_split_reg_set_uiupdate_cb (
GncTreeViewSplitReg *view, GFunc cb, gpointer cb_data)
6429 view->uiupdate_cb = cb;
6430 view->uiupdate_cb_data = cb_data;
6440 if (view->uiupdate_cb)
6441 (view->uiupdate_cb)(view, view->uiupdate_cb_data);
void xaccSplitSetValue(Split *s, gnc_numeric amt)
void gnc_tree_view_set_sort_user_data(GncTreeView *view, GtkTreeModel *s_model)
const char * xaccAccountGetLastNum(const Account *acc)
gboolean gnc_commodity_is_currency(const gnc_commodity *cm)
char xaccTransGetTxnType(const Transaction *trans)
void xaccTransGetDateDueTS(const Transaction *trans, Timespec *ts)
Split * xaccTransGetSplit(const Transaction *trans, int i)
const char * gnc_print_date(Timespec ts)
gboolean xaccTransUseTradingAccounts(const Transaction *trans)
gulong gnc_prefs_register_cb(const char *group, const gchar *pref_name, gpointer func, gpointer user_data)
GtkTreeViewColumn * gnc_tree_view_add_text_column(GncTreeView *view, const gchar *column_title, const gchar *pref_name, const gchar *stock_icon_name, const gchar *sizing_text, gint model_data_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn)
gboolean xaccTransIsOpen(const Transaction *trans)
gnc_numeric xaccTransGetAccountBalance(const Transaction *trans, const Account *account)
#define PINFO(format, args...)
GNCAccountType xaccAccountGetType(const Account *acc)
gboolean xaccSplitDestroy(Split *split)
gboolean use_theme_colors
gnc_numeric gnc_numeric_neg(gnc_numeric a)
void xaccTransSetNotes(Transaction *trans, const char *notes)
const char * xaccTransGetVoidReason(const Transaction *trans)
common utilities for manipulating a GtkTreeView within gnucash
void xaccTransGetDateEnteredTS(const Transaction *trans, Timespec *ts)
#define DEBUG(format, args...)
void qof_instance_set(QofInstance *inst, const gchar *first_param,...)
Wrapper for g_object_set Group setting multiple parameters in a single begin/commit/rollback.
gboolean qof_book_use_split_action_for_num_field(const QofBook *book)
char xaccSplitGetReconcile(const Split *split)
void xaccTransSetDescription(Transaction *trans, const char *desc)
Use a 64-bit unsigned int timespec.
GtkSortType sort_direction
gboolean gnc_numeric_zero_p(gnc_numeric a)
void xaccSplitSetReconcile(Split *split, char recn)
GtkTreeViewColumn * gnc_tree_view_add_combo_column(GncTreeView *view, const gchar *column_title, const gchar *pref_name, const gchar *sizing_text, gint model_data_column, gint model_visibility_column, GtkTreeModel *combo_tree_model, gint combo_model_text_column, GtkTreeIterCompareFunc column_sort_fn)
#define PERR(format, args...)
#define ENTER(format, args...)
gboolean gnc_strisnum(const gchar *s)
gboolean alt_colors_by_txn
void xaccAccountSetLastNum(Account *acc, const char *num)
void xaccSplitGetDateReconciledTS(const Split *split, Timespec *ts)
gboolean gnc_numeric_negative_p(gnc_numeric a)
void xaccTransSetCurrency(Transaction *trans, gnc_commodity *curr)
void xaccTransDestroy(Transaction *trans)
Transaction * current_trans
const char * xaccTransGetNotes(const Transaction *trans)
int xaccTransCountSplits(const Transaction *trans)
#define xaccAccountGetGUID(X)
void xaccTransSetTxnType(Transaction *trans, char type)
convert single-entry accounts to clean double-entry
gchar * gnc_account_get_full_name(const Account *account)
gboolean use_accounting_labels
gnc_numeric gnc_numeric_convert(gnc_numeric n, gint64 denom, gint how)
GtkTreeViewColumn * gnc_tree_view_add_date_column(GncTreeView *view, const gchar *column_title, const gchar *pref_name, const gchar *stock_icon_name, const gchar *sizing_text, gint model_data_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn)
void xaccSplitSetMemo(Split *split, const char *memo)
void xaccTransScrubImbalance(Transaction *trans, Account *root, Account *account)
void gnc_tree_view_set_control_column_background(GncTreeView *view, gint column, GtkTreeCellDataFunc func)
SplitRegisterStyle2 style
gboolean xaccTransInFutureByPostedDate(const Transaction *trans)
const char * xaccTransGetDescription(const Transaction *trans)
gnc_numeric gnc_numeric_abs(gnc_numeric a)
void xaccTransSetDate(Transaction *trans, int day, int mon, int year)
void xaccTransCommitEdit(Transaction *trans)
void xaccTransBeginEdit(Transaction *trans)
gnc_numeric xaccSplitGetSharePrice(const Split *split)
gboolean gnc_numeric_positive_p(gnc_numeric a)
Split * xaccMallocSplit(QofBook *book)
Generic api to store and retrieve preferences.
gnc_commodity * gnc_account_or_default_currency(const Account *account, gboolean *currency_from_account_found)
const char * gnc_commodity_get_printname(const gnc_commodity *cm)
void xaccTransSetDatePostedSecs(Transaction *trans, time64 secs)
gnc_numeric xaccSplitGetValue(const Split *split)
Account * xaccSplitGetAccount(const Split *s)
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
gnc_commodity * xaccTransGetCurrency(const Transaction *trans)
#define xaccAccountInsertSplit(acc, s)
#define gnc_leave_return_if_fail(test)
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
Split * xaccSplitGetOtherSplit(const Split *split)
#define LEAVE(format, args...)
time64 gnc_time(time64 *tbuf)
get the current local time
GNCNumericErrorCode gnc_numeric_check(gnc_numeric a)
const char * xaccSplitGetMemo(const Split *split)
Account * gnc_account_get_root(Account *acc)
const char * xaccAccountGetName(const Account *acc)
Scheduled Transactions public handling routines.
API for Transactions and Splits (journal entries)
void xaccTransRollbackEdit(Transaction *trans)
gboolean gnc_commodity_equiv(const gnc_commodity *a, const gnc_commodity *b)
void xaccTransGetDatePostedTS(const Transaction *trans, Timespec *ts)
gnc_numeric xaccTransGetAccountAmount(const Transaction *trans, const Account *acc)
gnc_numeric xaccTransGetAccountValue(const Transaction *trans, const Account *acc)
const gchar * QofLogModule
const gchar * gnc_get_account_separator_string(void)
void gnc_prefs_remove_cb_by_func(const gchar *group, const gchar *pref_name, gpointer func, gpointer user_data)
gdouble gnc_prefs_get_float(const gchar *group, const gchar *pref_name)
gnc_numeric xaccSplitGetAmount(const Split *split)