1 /********************************************************************\
2  * This program is free software; you can redistribute it and/or    *
3  * modify it under the terms of the GNU General Public License as   *
4  * published by the Free Software Foundation; either version 2 of   *
5  * the License, or (at your option) any later version.              *
6  *                                                                  *
7  * This program is distributed in the hope that it will be useful,  *
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
10  * GNU General Public License for more details.                     *
11  *                                                                  *
12  * You should have received a copy of the GNU General Public License*
13  * along with this program; if not, contact:                        *
14  *                                                                  *
15  * Free Software Foundation           Voice:  +1-617-542-5942       *
16  * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
17  * Boston, MA  02110-1301,  USA       gnu@gnu.org                   *
18  *                                                                  *
19 \********************************************************************/
20 
21 /* formulacell-gnome.c
22  *
23  * Implements Gnome-dependent formula-cell functions :
24  *
25  * Often the decimal key in the keypad is not mapped to the correct locale
26  * decimal point, the function PriceDirect handle this case.
27  */
28 
29 #include <config.h>
30 
31 #include <locale.h>
32 #include <gdk/gdkkeysyms.h>
33 
34 #include "gnc-engine.h"
35 
36 #include "gnc-locale-utils.h"
37 #include "gnc-ui-util.h"
38 
39 #include "formulacell.h"
40 #include "formulacell-gnome.h"
41 #include "pricecell-gnome.h"
42 
43 #ifdef G_OS_WIN32
44 # include <gdk/gdkwin32.h>
45 #endif
46 
47 //static QofLogModule log_module = GNC_MOD_REGISTER;
48 
49 static
50 gboolean
gnc_formula_cell_direct_update(BasicCell * bcell,int * cursor_position,int * start_selection,int * end_selection,void * gui_data)51 gnc_formula_cell_direct_update( BasicCell *bcell,
52                                 int *cursor_position,
53                                 int *start_selection,
54                                 int *end_selection,
55                                 void *gui_data )
56 {
57     FormulaCell *cell = (FormulaCell *)bcell;
58     GdkEventKey *event = gui_data;
59     struct lconv *lc;
60     gboolean is_return;
61 
62     if (event->type != GDK_KEY_PRESS)
63         return FALSE;
64 
65     lc = gnc_localeconv ();
66 
67     is_return = FALSE;
68 
69     /* FIXME!! This code is almost identical (except for GDK_KEY_KP_Enter
70      * handling) to pricecell-gnome.c:gnc_price_cell_direct_update.  I write
71      * this after fixing a bug where one copy was kept up to date, and the
72      * other not.  So, fix this.
73      */
74 #ifdef G_OS_WIN32
75     /* gdk never sends GDK_KEY_KP_Decimal on win32. See #486658 */
76     if (event->hardware_keycode == VK_DECIMAL)
77         event->keyval = GDK_KEY_KP_Decimal;
78 #endif
79     switch (event->keyval)
80     {
81     case GDK_KEY_Return:
82         if (!(event->state &
83                 (GDK_MODIFIER_INTENT_DEFAULT_MOD_MASK)))
84             is_return = TRUE;
85         /* FALL THROUGH */
86 
87     case GDK_KEY_KP_Enter:
88     {
89         gnc_formula_cell_set_value( cell, cell->cell.value );
90 
91         /* If it's not a plain return, stay put. This
92          * allows a 'calculator' style operation using
93          * keypad enter where you can keep entering more
94          * items to add, say. */
95         return !is_return;
96     }
97 
98     case GDK_KEY_KP_Decimal:
99         break;
100 
101     default:
102         return FALSE;
103     }
104 
105     gnc_basic_cell_insert_decimal(bcell,
106                                   cell->print_info.monetary
107                                   ? lc->mon_decimal_point[0]
108                                   : lc->decimal_point[0],
109                                   cursor_position,
110                                   start_selection,
111                                   end_selection);
112 
113     return TRUE;
114 }
115 
116 BasicCell *
gnc_formula_cell_gnome_new(void)117 gnc_formula_cell_gnome_new (void)
118 {
119     BasicCell *cell;
120 
121     cell = gnc_formula_cell_new ();
122     cell->direct_update = gnc_formula_cell_direct_update;
123     return cell;
124 }
125