24 #include <glib/gi18n.h>
26 #include "gnc-exp-parser.h"
27 #include "gnc-locale-utils.h"
32 #include "basiccell.h"
33 #include "formulacell.h"
36 #define G_LOG_DOMAIN "gnc.register.core.formulacell"
38 static void gnc_formula_cell_init(
FormulaCell *fc );
40 static gboolean gnc_formula_cell_enter(
BasicCell *_cell,
45 static void gnc_formula_cell_leave(
BasicCell *_cell );
47 static void gnc_formula_cell_modify_verify(
BasicCell *_cell,
56 static void gnc_formula_cell_set_value_internal(
BasicCell *_cell,
62 gnc_formula_cell_new(
void)
65 gnc_formula_cell_init( fc );
73 gnc_basic_cell_init (&(fc->cell));
75 fc->
print_info = gnc_default_print_info (FALSE);
77 fc->cell.enter_cell = gnc_formula_cell_enter;
78 fc->cell.modify_verify = gnc_formula_cell_modify_verify;
79 fc->cell.set_value = gnc_formula_cell_set_value_internal;
80 fc->cell.leave_cell = gnc_formula_cell_leave;
87 g_debug(
"got value [%s]", newVal);
88 gnc_formula_cell_set_value_internal( &fc->cell, newVal );
98 g_debug(
"%d, %d, %d", *cursor_position, *start_selection, *end_selection);
99 *cursor_position = -1;
100 *start_selection = 0;
110 str = fc->cell.value;
112 char *error_location = NULL;
116 && !gnc_exp_parser_parse(str, &amount, &error_location))
118 gnc_warning_dialog(NULL, _(
"An error occurred while processing %s."),
123 gnc_basic_cell_set_value_internal( &fc->cell, str );
128 gnc_formula_cell_modify_verify(
BasicCell *_cell,
133 int *cursor_position,
134 int *start_selection,
138 struct lconv *lc = gnc_localeconv ();
139 const char *toks =
"+-*/=()_:";
140 gunichar decimal_point;
141 gunichar thousands_sep;
145 g_debug(
"%s, %d, %s, %d, %d, %d, %d",
146 change ? (gchar *)change :
"(null)", change_len,
147 newval ? (gchar *)newval :
"(null)", newval_len,
148 *cursor_position, *start_selection, *end_selection);
153 gnc_basic_cell_set_value_internal( &cell->cell, newval );
158 decimal_point = g_utf8_get_char(lc->mon_decimal_point);
160 decimal_point = g_utf8_get_char(lc->decimal_point);
163 thousands_sep = g_utf8_get_char(lc->mon_thousands_sep);
165 thousands_sep = g_utf8_get_char(lc->thousands_sep);
170 uc = g_utf8_get_char (c);
171 if (!g_unichar_isdigit (uc) &&
172 !g_unichar_isspace (uc) &&
173 !g_unichar_isalpha (uc) &&
174 (decimal_point != uc) &&
175 (thousands_sep != uc) &&
176 (g_utf8_strchr (toks, -1, uc) == NULL))
178 c = g_utf8_next_char (c);
181 gnc_basic_cell_set_value_internal( &cell->cell, newval );
186 gnc_formula_cell_set_value_internal(
BasicCell *_cell,
190 g_debug(
"internal string: [%s]", str);
191 gnc_basic_cell_set_value_internal( &fc->cell, str );
utility functions for the GnuCash UI
All type declarations for the whole Gnucash engine.