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
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
;
233 PangoFontDescription
*font_desc
;
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
);
260 JNIEXPORT jint JNICALL
261 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_getCaretPosition
262 (JNIEnv
*env
, jobject obj
)
267 gdk_threads_enter ();
269 ptr
= NSA_GET_PTR (env
, obj
);
271 pos
= gtk_editable_get_position (GTK_EDITABLE (ptr
));
273 gdk_threads_leave ();
278 JNIEXPORT
void JNICALL
279 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setCaretPosition
280 (JNIEnv
*env
, jobject obj
, jint pos
)
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
)
301 gdk_threads_enter ();
303 ptr
= NSA_GET_PTR (env
, obj
);
305 if (gtk_editable_get_selection_bounds (GTK_EDITABLE (ptr
), &starti
, &endi
))
308 pos
= gtk_editable_get_position (GTK_EDITABLE (ptr
));
310 gdk_threads_leave ();
315 JNIEXPORT jint JNICALL
316 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_getSelectionEnd
317 (JNIEnv
*env
, jobject obj
)
323 gdk_threads_enter ();
325 ptr
= NSA_GET_PTR (env
, obj
);
327 if (gtk_editable_get_selection_bounds (GTK_EDITABLE (ptr
), &starti
, &endi
))
330 pos
= gtk_editable_get_position (GTK_EDITABLE (ptr
));
332 gdk_threads_leave ();
337 JNIEXPORT
void JNICALL
338 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_select
339 (JNIEnv
*env
, jobject obj
, jint start
, jint end
)
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
)
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
)
372 char *contents
= NULL
;
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
);
385 gdk_threads_leave ();
390 JNIEXPORT
void JNICALL
391 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setText
392 (JNIEnv
*env
, jobject obj
, jstring contents
)
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 ();
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
);
417 textcomponent_changed_cb (GtkEditable
*editable
__attribute__((unused
)),
420 (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer
, postTextEventID
);