Remove old autovect-branch by moving to "dead" directory.
[official-gcc.git] / old-autovect-branch / libjava / classpath / native / jni / gtk-peer / gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
blob0ddab05c388589ffd8b4731eb87da4dcf57ab824
1 /* gtktextfieldpeer.c -- Native implementation of GtkTextFieldPeer
2 Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301 USA.
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
39 #include "gtkpeer.h"
40 #include "gnu_java_awt_peer_gtk_GtkTextFieldPeer.h"
42 /* the color used for highlighting when the foreground is black,
43 since black highlights aren't a Good Idea. */
44 #define BB_RED 16962
45 #define BB_GREEN 26985
46 #define BB_BLUE 31611
48 static jmethodID postTextEventID;
50 void
51 cp_gtk_textcomponent_init_jni (void)
53 jclass gtkcomponentpeer;
55 gtkcomponentpeer = (*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(),
56 "gnu/java/awt/peer/gtk/GtkComponentPeer");
58 postTextEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkcomponentpeer,
59 "postTextEvent",
60 "()V");
63 static void textcomponent_changed_cb (GtkEditable *editable, jobject peer);
65 static jint get_border_width (GtkWidget *entry);
67 JNIEXPORT void JNICALL
68 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_create
69 (JNIEnv *env, jobject obj, jint text_width)
71 GtkWidget *entry;
73 gdk_threads_enter ();
75 /* Create global reference and save it for future use */
76 NSA_SET_GLOBAL_REF (env, obj);
78 entry = gtk_entry_new ();
79 gtk_widget_set_size_request (entry,
80 text_width + 2 * get_border_width (entry), -1);
82 NSA_SET_PTR (env, obj, entry);
84 gdk_threads_leave ();
87 JNIEXPORT void JNICALL
88 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_connectSignals
89 (JNIEnv *env, jobject obj)
91 void *ptr;
92 jobject *gref;
94 gdk_threads_enter ();
96 ptr = NSA_GET_PTR (env, obj);
97 gref = NSA_GET_GLOBAL_REF (env, obj);
99 /* TextComponent signals */
100 cp_gtk_textcomponent_connect_signals (G_OBJECT (ptr), gref);
102 /* Component signals */
103 cp_gtk_component_connect_signals (G_OBJECT (ptr), gref);
105 gdk_threads_leave ();
108 JNIEXPORT void JNICALL
109 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkWidgetSetBackground
110 (JNIEnv *env, jobject obj, jint red, jint green, jint blue)
112 GdkColor color;
113 void *ptr;
115 gdk_threads_enter ();
117 ptr = NSA_GET_PTR (env, obj);
119 color.red = (red / 255.0) * 65535;
120 color.green = (green / 255.0) * 65535;
121 color.blue = (blue / 255.0) * 65535;
123 gtk_widget_modify_base (GTK_WIDGET (ptr), GTK_STATE_NORMAL, &color);
125 gdk_threads_leave ();
128 JNIEXPORT void JNICALL
129 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkWidgetSetForeground
130 (JNIEnv *env, jobject obj, jint red, jint green, jint blue)
132 GdkColor color;
133 void *ptr;
135 gdk_threads_enter ();
137 ptr = NSA_GET_PTR (env, obj);
139 color.red = (red / 255.0) * 65535;
140 color.green = (green / 255.0) * 65535;
141 color.blue = (blue / 255.0) * 65535;
143 gtk_widget_modify_text (GTK_WIDGET (ptr), GTK_STATE_NORMAL, &color);
145 if ( red == 0 && green == 0 && blue == 0)
147 color.red = BB_RED;
148 color.green = BB_GREEN;
149 color.blue = BB_BLUE;
151 gtk_widget_modify_base (GTK_WIDGET (ptr), GTK_STATE_SELECTED, &color);
153 gdk_threads_leave ();
156 JNIEXPORT jint JNICALL
157 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkEntryGetBorderWidth
158 (JNIEnv *env, jobject obj)
160 void *ptr;
161 int border_width = 0;
163 gdk_threads_enter ();
165 ptr = NSA_GET_PTR (env, obj);
167 border_width = get_border_width (GTK_WIDGET (ptr));
169 gdk_threads_leave ();
171 return border_width;
174 /* GTK hard-codes this value. It is the space between a GtkEntry's
175 frame and its text. */
176 #define INNER_BORDER 2
178 static jint
179 get_border_width (GtkWidget *entry)
181 gint focus_width;
182 gboolean interior_focus;
183 int x_border_width = INNER_BORDER;
185 gtk_widget_style_get (entry,
186 "interior-focus", &interior_focus,
187 "focus-line-width", &focus_width,
188 NULL);
190 if (GTK_ENTRY (entry)->has_frame)
191 x_border_width += entry->style->xthickness;
193 if (!interior_focus)
194 x_border_width += focus_width;
196 return x_border_width;
199 #undef INNER_BORDER
201 JNIEXPORT void JNICALL
202 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setEchoChar
203 (JNIEnv *env, jobject obj, jchar c)
205 void *ptr;
206 GtkEntry *entry;
208 gdk_threads_enter ();
210 ptr = NSA_GET_PTR (env, obj);
212 entry = GTK_ENTRY (ptr);
214 if (c != 0)
216 /* FIXME: use gtk_entry_set_invisible_char (GtkEntry *entry,
217 gunichar ch) here. That means we must convert from jchar
218 (utf16) to gunichar (ucs4). */
219 gtk_entry_set_visibility (entry, FALSE);
221 else
222 gtk_entry_set_visibility (entry, TRUE);
224 gdk_threads_leave ();
227 JNIEXPORT void JNICALL
228 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkWidgetModifyFont
229 (JNIEnv *env, jobject obj, jstring name, jint style, jint size)
231 const char *font_name;
232 void *ptr;
233 PangoFontDescription *font_desc;
235 gdk_threads_enter();
237 ptr = NSA_GET_PTR (env, obj);
239 font_name = (*env)->GetStringUTFChars (env, name, NULL);
241 font_desc = pango_font_description_from_string (font_name);
242 pango_font_description_set_size (font_desc,
243 size * cp_gtk_dpi_conversion_factor);
245 if (style & AWT_STYLE_BOLD)
246 pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
248 if (style & AWT_STYLE_ITALIC)
249 pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE);
251 gtk_widget_modify_font (GTK_WIDGET (ptr), font_desc);
253 pango_font_description_free (font_desc);
255 (*env)->ReleaseStringUTFChars (env, name, font_name);
257 gdk_threads_leave();
260 JNIEXPORT jint JNICALL
261 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_getCaretPosition
262 (JNIEnv *env, jobject obj)
264 void *ptr;
265 int pos = 0;
267 gdk_threads_enter ();
269 ptr = NSA_GET_PTR (env, obj);
271 pos = gtk_editable_get_position (GTK_EDITABLE (ptr));
273 gdk_threads_leave ();
275 return pos;
278 JNIEXPORT void JNICALL
279 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setCaretPosition
280 (JNIEnv *env, jobject obj, jint pos)
282 void *ptr;
284 gdk_threads_enter ();
286 ptr = NSA_GET_PTR (env, obj);
288 gtk_editable_set_position (GTK_EDITABLE (ptr), pos);
290 gdk_threads_leave ();
293 JNIEXPORT jint JNICALL
294 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_getSelectionStart
295 (JNIEnv *env, jobject obj)
297 void *ptr;
298 int pos = 0;
299 int starti, endi;
301 gdk_threads_enter ();
303 ptr = NSA_GET_PTR (env, obj);
305 if (gtk_editable_get_selection_bounds (GTK_EDITABLE (ptr), &starti, &endi))
306 pos = starti;
307 else
308 pos = gtk_editable_get_position (GTK_EDITABLE (ptr));
310 gdk_threads_leave ();
312 return pos;
315 JNIEXPORT jint JNICALL
316 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_getSelectionEnd
317 (JNIEnv *env, jobject obj)
319 void *ptr;
320 int pos = 0;
321 int starti, endi;
323 gdk_threads_enter ();
325 ptr = NSA_GET_PTR (env, obj);
327 if (gtk_editable_get_selection_bounds (GTK_EDITABLE (ptr), &starti, &endi))
328 pos = endi;
329 else
330 pos = gtk_editable_get_position (GTK_EDITABLE (ptr));
332 gdk_threads_leave ();
334 return pos;
337 JNIEXPORT void JNICALL
338 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_select
339 (JNIEnv *env, jobject obj, jint start, jint end)
341 void *ptr;
343 gdk_threads_enter ();
345 ptr = NSA_GET_PTR (env, obj);
347 gtk_editable_select_region (GTK_EDITABLE (ptr), start, end);
349 gdk_threads_leave ();
352 JNIEXPORT void JNICALL
353 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setEditable
354 (JNIEnv *env, jobject obj, jboolean state)
356 void *ptr;
358 gdk_threads_enter ();
360 ptr = NSA_GET_PTR (env, obj);
362 gtk_editable_set_editable (GTK_EDITABLE (ptr), state);
364 gdk_threads_leave ();
367 JNIEXPORT jstring JNICALL
368 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_getText
369 (JNIEnv *env, jobject obj)
371 void *ptr;
372 char *contents = NULL;
373 jstring jcontents;
375 gdk_threads_enter ();
377 ptr = NSA_GET_PTR (env, obj);
379 contents = gtk_editable_get_chars (GTK_EDITABLE (ptr), 0, -1);
381 jcontents = (*env)->NewStringUTF (env, contents);
383 g_free (contents);
385 gdk_threads_leave ();
387 return jcontents;
390 JNIEXPORT void JNICALL
391 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setText
392 (JNIEnv *env, jobject obj, jstring contents)
394 void *ptr;
395 const char *str;
397 gdk_threads_enter ();
399 ptr = NSA_GET_PTR (env, obj);
400 str = (*env)->GetStringUTFChars (env, contents, NULL);
402 gtk_entry_set_text (GTK_ENTRY (ptr), str);
404 (*env)->ReleaseStringUTFChars (env, contents, str);
406 gdk_threads_leave ();
409 void
410 cp_gtk_textcomponent_connect_signals (GObject *ptr, jobject *gref)
412 g_signal_connect (G_OBJECT(ptr), "changed",
413 G_CALLBACK (textcomponent_changed_cb), *gref);
416 static void
417 textcomponent_changed_cb (GtkEditable *editable __attribute__((unused)),
418 jobject peer)
420 (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postTextEventID);