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)
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
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
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. */
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. */
45 #define BB_GREEN 26985
48 static jmethodID postTextEventID;
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,
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)
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);
87 JNIEXPORT void JNICALL
88 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_connectSignals
89 (JNIEnv *env, jobject obj)
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)
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)
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)
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)
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 ();
174 /* GTK hard-codes this value. It is the space between a GtkEntry's
175 frame and its text. */
176 #define INNER_BORDER 2
179 get_border_width (GtkWidget *entry)
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,
190 if (GTK_ENTRY (entry)->has_frame)
191 x_border_width += entry->style->xthickness;
194 x_border_width += focus_width;
196 return x_border_width;
201 JNIEXPORT void JNICALL
202 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setEchoChar
203 (JNIEnv *env, jobject obj, jchar c)
208 gdk_threads_enter ();
210 ptr = NSA_GET_PTR (env, obj);
212 entry = GTK_ENTRY (ptr);
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);
222 gtk_entry_set_visibility (entry, TRUE);
224 gdk_threads_leave ();
227 JNIEXPORT jint JNICALL
228 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_getCaretPosition
229 (JNIEnv *env, jobject obj)
234 gdk_threads_enter ();
236 ptr = NSA_GET_PTR (env, obj);
238 pos = gtk_editable_get_position (GTK_EDITABLE (ptr));
240 gdk_threads_leave ();
245 JNIEXPORT void JNICALL
246 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setCaretPosition
247 (JNIEnv *env, jobject obj, jint pos)
251 gdk_threads_enter ();
253 ptr = NSA_GET_PTR (env, obj);
255 gtk_editable_set_position (GTK_EDITABLE (ptr), pos);
257 gdk_threads_leave ();
260 JNIEXPORT jint JNICALL
261 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_getSelectionStart
262 (JNIEnv *env, jobject obj)
268 gdk_threads_enter ();
270 ptr = NSA_GET_PTR (env, obj);
272 if (gtk_editable_get_selection_bounds (GTK_EDITABLE (ptr), &starti, &endi))
275 pos = gtk_editable_get_position (GTK_EDITABLE (ptr));
277 gdk_threads_leave ();
282 JNIEXPORT jint JNICALL
283 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_getSelectionEnd
284 (JNIEnv *env, jobject obj)
290 gdk_threads_enter ();
292 ptr = NSA_GET_PTR (env, obj);
294 if (gtk_editable_get_selection_bounds (GTK_EDITABLE (ptr), &starti, &endi))
297 pos = gtk_editable_get_position (GTK_EDITABLE (ptr));
299 gdk_threads_leave ();
304 JNIEXPORT void JNICALL
305 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_select
306 (JNIEnv *env, jobject obj, jint start, jint end)
310 gdk_threads_enter ();
312 ptr = NSA_GET_PTR (env, obj);
314 gtk_editable_select_region (GTK_EDITABLE (ptr), start, end);
316 gdk_threads_leave ();
319 JNIEXPORT void JNICALL
320 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setEditable
321 (JNIEnv *env, jobject obj, jboolean state)
325 gdk_threads_enter ();
327 ptr = NSA_GET_PTR (env, obj);
329 gtk_editable_set_editable (GTK_EDITABLE (ptr), state);
331 gdk_threads_leave ();
334 JNIEXPORT jstring JNICALL
335 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_getText
336 (JNIEnv *env, jobject obj)
339 char *contents = NULL;
342 gdk_threads_enter ();
344 ptr = NSA_GET_PTR (env, obj);
346 contents = gtk_editable_get_chars (GTK_EDITABLE (ptr), 0, -1);
348 jcontents = (*env)->NewStringUTF (env, contents);
352 gdk_threads_leave ();
357 JNIEXPORT void JNICALL
358 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setText
359 (JNIEnv *env, jobject obj, jstring contents)
364 gdk_threads_enter ();
366 ptr = NSA_GET_PTR (env, obj);
367 str = (*env)->GetStringUTFChars (env, contents, NULL);
369 gtk_entry_set_text (GTK_ENTRY (ptr), str);
371 (*env)->ReleaseStringUTFChars (env, contents, str);
373 gdk_threads_leave ();
377 cp_gtk_textcomponent_connect_signals (GObject *ptr, jobject *gref)
379 g_signal_connect (G_OBJECT(ptr), "changed",
380 G_CALLBACK (textcomponent_changed_cb), *gref);
384 textcomponent_changed_cb (GtkEditable *editable __attribute__((unused)),
387 (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postTextEventID);