38 #include <gdk/gdkkeysyms.h>
40 #include "gnc-amount-edit.h"
41 #include "gnc-exp-parser.h"
42 #include "gnc-locale-utils.h"
47 # include <gdk/gdkwin32.h>
58 static guint amount_edit_signals [LAST_SIGNAL] = { 0 };
63 static void gnc_amount_edit_changed (GtkEditable *gae, gpointer data);
64 static gint gnc_amount_edit_key_press (GtkWidget *widget,
68 static GtkEntryClass *parent_class;
76 gnc_amount_edit_get_type (
void)
78 static GType amount_edit_type = 0;
80 if (amount_edit_type == 0)
82 GTypeInfo amount_edit_info =
87 (GClassInitFunc) gnc_amount_edit_class_init,
92 (GInstanceInitFunc) gnc_amount_edit_init
95 amount_edit_type = g_type_register_static (GTK_TYPE_ENTRY,
101 return amount_edit_type;
107 GObjectClass *object_class;
108 GtkWidgetClass *widget_class;
111 object_class = G_OBJECT_CLASS (klass);
112 widget_class = GTK_WIDGET_CLASS (klass);
115 parent_class = g_type_class_peek_parent (klass);
117 amount_edit_signals [AMOUNT_CHANGED] =
118 g_signal_new (
"amount_changed",
119 G_OBJECT_CLASS_TYPE (object_class),
124 g_cclosure_marshal_VOID__VOID,
128 widget_class->key_press_event = gnc_amount_edit_key_press;
136 gae->need_to_parse = FALSE;
137 gae->amount = gnc_numeric_zero ();
138 gae->print_info = gnc_default_print_info (FALSE);
140 gae->evaluate_on_enter = FALSE;
142 g_signal_connect (G_OBJECT (gae),
"changed",
143 G_CALLBACK (gnc_amount_edit_changed), NULL);
147 gnc_amount_edit_changed (GtkEditable *editable, gpointer data)
151 GNC_AMOUNT_EDIT(editable)->need_to_parse = TRUE;
155 gnc_amount_edit_key_press(GtkWidget *widget, GdkEventKey *event)
162 if (event->hardware_keycode == VK_DECIMAL)
163 event->keyval = GDK_KP_Decimal;
165 if (event->keyval == GDK_KP_Decimal)
167 if (gae->print_info.monetary)
169 struct lconv *lc = gnc_localeconv ();
170 event->keyval = lc->mon_decimal_point[0];
171 event->string[0] = lc->mon_decimal_point[0];
175 result = (* GTK_WIDGET_CLASS (parent_class)->key_press_event)(widget, event);
177 switch (event->keyval)
180 if (gae->evaluate_on_enter)
182 if (event->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK | GDK_SHIFT_MASK))
191 gnc_amount_edit_evaluate (gae);
206 gnc_amount_edit_new (
void)
210 gae = g_object_new (GNC_TYPE_AMOUNT_EDIT, NULL);
211 gtk_widget_show (GTK_WIDGET(gae));
213 return GTK_WIDGET (gae);
240 g_return_val_if_fail(gae != NULL, -1);
241 g_return_val_if_fail(GNC_IS_AMOUNT_EDIT(gae), -1);
243 string = gtk_entry_get_text(GTK_ENTRY(gae));
244 if (!
string || *
string ==
'\0')
246 *amount = gnc_numeric_zero();
254 ok = gnc_exp_parser_parse (
string, amount, &error_loc);
260 if (error_loc != NULL)
261 return error_loc - string;
284 g_return_val_if_fail(gae != NULL, FALSE);
285 g_return_val_if_fail(GNC_IS_AMOUNT_EDIT(gae), FALSE);
288 if (!gae->need_to_parse)
291 result = gnc_amount_edit_expr_is_valid (gae, &amount, FALSE);
300 if (gae->fraction > 0)
303 gnc_amount_edit_set_amount (gae, amount);
306 g_signal_emit (gae, amount_edit_signals [AMOUNT_CHANGED], 0);
312 gtk_editable_set_position (GTK_EDITABLE(gae), result);
328 g_return_val_if_fail(gae != NULL, gnc_numeric_zero ());
329 g_return_val_if_fail(GNC_IS_AMOUNT_EDIT(gae), gnc_numeric_zero ());
331 gnc_amount_edit_evaluate (gae);
348 g_return_val_if_fail(gae != NULL, 0.0);
349 g_return_val_if_fail(GNC_IS_AMOUNT_EDIT(gae), 0.0);
351 gnc_amount_edit_evaluate (gae);
367 const char * amount_string;
369 g_return_if_fail(gae != NULL);
370 g_return_if_fail(GNC_IS_AMOUNT_EDIT(gae));
374 amount_string = xaccPrintAmount (amount, gae->print_info);
375 gtk_entry_set_text (GTK_ENTRY(gae), amount_string);
377 gae->amount = amount;
378 gae->need_to_parse = FALSE;
389 gnc_amount_edit_set_damount (
GNCAmountEdit *gae,
double damount)
394 g_return_if_fail(gae != NULL);
395 g_return_if_fail(GNC_IS_AMOUNT_EDIT(gae));
397 if (gae->fraction > 0)
398 fraction = gae->fraction;
404 gnc_amount_edit_set_amount (gae, amount);
418 g_return_if_fail(gae != NULL);
419 g_return_if_fail(GNC_IS_AMOUNT_EDIT(gae));
421 gae->print_info = print_info;
422 gae->print_info.use_symbol = 0;
434 gnc_amount_edit_set_fraction (
GNCAmountEdit *gae,
int fraction)
436 g_return_if_fail(gae != NULL);
437 g_return_if_fail(GNC_IS_AMOUNT_EDIT(gae));
439 fraction = MAX (0, fraction);
441 gae->fraction = fraction;
454 g_return_val_if_fail(gae != NULL, NULL);
455 g_return_val_if_fail(GNC_IS_AMOUNT_EDIT(gae), NULL);
457 return (GtkWidget *)gae;
470 gboolean evaluate_on_enter)
472 g_return_if_fail(gae != NULL);
473 g_return_if_fail(GNC_IS_AMOUNT_EDIT(gae));
475 gae->evaluate_on_enter = evaluate_on_enter;
gboolean gnc_numeric_equal(gnc_numeric a, gnc_numeric b)
gnc_numeric double_to_gnc_numeric(double n, gint64 denom, gint how)
utility functions for the GnuCash UI
gdouble gnc_numeric_to_double(gnc_numeric n)
gnc_numeric gnc_numeric_convert(gnc_numeric n, gint64 denom, gint how)
GNCNumericErrorCode gnc_numeric_check(gnc_numeric a)