38 #include <glib/gi18n.h>
42 #include "gnc-exp-parser.h"
43 #include "gnc-locale-utils.h"
48 #include "basiccell.h"
49 #include "pricecell.h"
52 static void gnc_price_cell_init (
PriceCell *cell);
53 static void gnc_price_cell_set_value_internal (
BasicCell *bcell,
55 static const char * gnc_price_cell_print_value (
PriceCell *cell);
64 *cursor_position = -1;
72 gnc_price_cell_modify_verify (
BasicCell *_cell,
82 struct lconv *lc = gnc_localeconv ();
83 const char *toks =
"+-*/=()_";
84 gunichar decimal_point;
85 gunichar thousands_sep;
92 gnc_basic_cell_set_value_internal (_cell, newval);
93 cell->need_to_parse = TRUE;
97 if (cell->print_info.monetary)
98 decimal_point = g_utf8_get_char(lc->mon_decimal_point);
100 decimal_point = g_utf8_get_char(lc->decimal_point);
102 if (cell->print_info.monetary)
103 thousands_sep = g_utf8_get_char(lc->mon_thousands_sep);
105 thousands_sep = g_utf8_get_char(lc->thousands_sep);
110 uc = g_utf8_get_char (c);
111 if (!g_unichar_isdigit (uc) &&
112 !g_unichar_isspace (uc) &&
113 !g_unichar_isalpha (uc) &&
114 (decimal_point != uc) &&
115 (thousands_sep != uc) &&
116 (g_utf8_strchr (toks, -1, uc) == NULL))
118 c = g_utf8_next_char (c);
121 gnc_basic_cell_set_value_internal (_cell, newval);
122 cell->need_to_parse = TRUE;
126 gnc_price_cell_parse (
PriceCell *cell, gboolean update_value)
132 if (!cell->need_to_parse)
135 oldval = cell->cell.value;
140 char *err_location = NULL;
141 if (strlen(g_strstrip(cell->cell.value)) == 0)
143 cell->amount = gnc_numeric_zero ();
145 else if (gnc_exp_parser_parse (cell->cell.value, &amount, &err_location))
147 if (cell->fraction > 0)
150 cell->amount = amount;
154 return (err_location - cell->cell.value);
161 newval = gnc_price_cell_print_value (cell);
164 if (strcmp(newval, oldval) == 0)
168 gnc_basic_cell_set_value_internal (&cell->cell, newval);
175 gint error_position = -1;
178 error_position = gnc_price_cell_parse (cell, TRUE);
179 if (error_position != -1)
181 gnc_warning_dialog(NULL, _(
"An error occurred while processing %s."),
188 gnc_price_cell_new (
void)
194 gnc_price_cell_init (cell);
202 gnc_basic_cell_init (&(cell->cell));
204 cell->amount = gnc_numeric_zero ();
206 cell->blank_zero = TRUE;
208 cell->print_info = gnc_default_print_info (FALSE);
210 cell->need_to_parse = FALSE;
212 cell->cell.enter_cell = gnc_price_cell_enter;
213 cell->cell.modify_verify = gnc_price_cell_modify_verify;
214 cell->cell.leave_cell = gnc_price_cell_leave;
215 cell->cell.set_value = gnc_price_cell_set_value_internal;
219 gnc_price_cell_print_value (
PriceCell *cell)
224 return xaccPrintAmount (cell->amount, cell->print_info);
228 gnc_price_cell_get_value (
PriceCell *cell)
231 return gnc_numeric_zero ();
233 gnc_price_cell_parse (cell, FALSE);
246 if (cell->fraction > 0)
249 cell->amount = amount;
250 buff = gnc_price_cell_print_value (cell);
251 cell->need_to_parse = FALSE;
253 if (g_strcmp0 (buff, cell->cell.value) == 0)
256 gnc_basic_cell_set_value_internal (&cell->cell, buff);
262 gnc_price_cell_set_fraction (
PriceCell *cell,
int fraction)
267 cell->fraction = ABS (fraction);
276 cell->amount = gnc_numeric_zero ();
277 cell->need_to_parse = FALSE;
279 gnc_basic_cell_set_value_internal (&cell->cell,
"");
283 gnc_price_cell_set_blank_zero (
PriceCell *cell, gboolean blank_zero)
288 cell->blank_zero = blank_zero;
297 cell->print_info = print_info;
301 gnc_price_cell_set_debt_credit_value (
PriceCell * debit,
308 gnc_price_cell_set_value (debit, amount);
309 gnc_price_cell_set_value (credit, gnc_numeric_zero ());
313 gnc_price_cell_set_value (debit, gnc_numeric_zero ());
319 gnc_price_cell_set_value_internal (
BasicCell *_cell,
const char *str)
328 gnc_price_cell_set_value (cell, gnc_numeric_zero ());
329 else if (gnc_exp_parser_parse (str, &amount, NULL))
330 gnc_price_cell_set_value (cell, amount);
utility functions for the GnuCash UI
gnc_numeric gnc_numeric_neg(gnc_numeric a)
gboolean gnc_numeric_zero_p(gnc_numeric a)
gnc_numeric gnc_numeric_convert(gnc_numeric n, gint64 denom, gint how)
All type declarations for the whole Gnucash engine.
gboolean gnc_numeric_positive_p(gnc_numeric a)