32 #include <gdk/gdkkeysyms.h>
34 #include "gnc-locale-utils.h"
35 #include "gnc-exp-parser.h"
37 #include "pricecell.h"
38 #include "pricecell-gnome.h"
41 # include <gdk/gdkwin32.h>
45 gnc_price_cell_direct_update (
BasicCell *bcell,
52 GdkEventKey *
event = gui_data;
56 if (event->type != GDK_KEY_PRESS)
59 lc = gnc_localeconv ();
65 if (event->hardware_keycode == VK_DECIMAL)
66 event->keyval = GDK_KP_Decimal;
68 switch (event->keyval)
72 (GDK_CONTROL_MASK | GDK_MOD1_MASK | GDK_SHIFT_MASK)))
76 case GDK_KEY_KP_Enter:
81 gboolean changed = FALSE;
83 if (!cell->need_to_parse)
86 parse_ok = gnc_exp_parser_parse (cell->cell.value,
90 changed = gnc_price_cell_set_value (cell, amount);
91 else if (!cell->cell.value || cell->cell.value[0] ==
'\0')
92 changed = gnc_price_cell_set_value (cell,
95 *cursor_position = error_loc - cell->cell.value;
114 case GDK_KEY_KP_Decimal:
122 gnc_basic_cell_insert_decimal(bcell,
123 cell->print_info.monetary
124 ? lc->mon_decimal_point[0]
125 : lc->decimal_point[0],
130 cell->need_to_parse = TRUE;
136 gnc_price_cell_gnome_new (
void)
140 cell = gnc_price_cell_new ();
142 cell->direct_update = gnc_price_cell_direct_update;
148 gnc_basic_cell_insert_decimal(
BasicCell *bcell,
150 int *cursor_position,
151 int *start_selection,
160 newval_gs = g_string_new(
"");
162 start = MIN(*start_selection, *end_selection);
163 end = MAX(*start_selection, *end_selection);
166 buf = g_malloc0(strlen(bcell->value) + 1);
167 g_utf8_strncpy(buf, bcell->value, start);
168 g_string_append(newval_gs, buf);
171 g_string_append_unichar(newval_gs, decimal_point);
173 buf = g_utf8_offset_to_pointer(bcell->value, end);
174 g_string_append(newval_gs, buf);
177 *cursor_position = start + 1;
179 gnc_basic_cell_set_value_internal (bcell, newval_gs->str);
181 g_string_free (newval_gs, TRUE);
utility functions for the GnuCash UI