2003-12-26 Guilhem Lavaux <guilhem@kaffe.org>
[official-gcc.git] / libjava / jni / gtk-peer / gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
blob2ec87f012ea49a4ba79e01b6719f9eebf82614f7
1 /* gtktextcomponentpeer.c -- Native implementation of GtkTextComponentPeer
2 Copyright (C) 1998, 1999 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., 59 Temple Place, Suite 330, Boston, MA
19 02111-1307 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_GtkComponentPeer.h"
41 #include "gnu_java_awt_peer_gtk_GtkTextComponentPeer.h"
43 static void textcomponent_commit_cb (GtkIMContext *context,
44 const gchar *str,
45 jobject peer);
47 static void textcomponent_changed_cb (GtkEditable *editable,
48 jobject peer);
50 JNIEXPORT void JNICALL
51 Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectSignals
52 (JNIEnv *env, jobject obj)
54 GtkTextView *text = NULL;
55 GtkTextBuffer *buf;
56 void *ptr = NSA_GET_PTR (env, obj);
57 jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
58 g_assert (gref);
60 gdk_threads_enter ();
62 if (GTK_IS_ENTRY(ptr))
64 g_signal_connect (GTK_ENTRY (ptr)->im_context, "commit",
65 G_CALLBACK (textcomponent_commit_cb), *gref);
67 g_signal_connect (GTK_EDITABLE (ptr), "changed",
68 G_CALLBACK (textcomponent_changed_cb), *gref);
70 gdk_threads_leave ();
72 /* Connect the superclass signals. */
73 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, *gref);
75 else
77 if (GTK_IS_SCROLLED_WINDOW (ptr))
79 text = GTK_TEXT_VIEW (GTK_SCROLLED_WINDOW (ptr)->container.child);
81 else if (GTK_IS_TEXT_VIEW (ptr))
83 text = GTK_TEXT_VIEW (ptr);
86 if (text)
88 g_signal_connect (text->im_context, "commit",
89 G_CALLBACK (textcomponent_commit_cb), *gref);
91 buf = gtk_text_view_get_buffer (text);
92 if (buf)
93 g_signal_connect (buf, "changed",
94 G_CALLBACK (textcomponent_changed_cb), *gref);
96 /* Connect the superclass signals. */
97 /* FIXME: Cannot do that here or it will get the sw and not the list.
98 We must a generic way of doing this. */
99 /* Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env,
100 obj); */
101 g_signal_connect (GTK_OBJECT (text), "event",
102 G_CALLBACK (pre_event_handler), *gref);
104 gdk_threads_leave ();
109 JNIEXPORT jint JNICALL
110 Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_getCaretPosition
111 (JNIEnv *env, jobject obj)
113 void *ptr;
114 int pos = 0;
115 GtkEditable *editable; // type of GtkEntry (TextField)
116 GtkWidget *text = NULL; // type of GtkTextView (TextArea)
117 GtkTextBuffer *buf;
118 GtkTextMark *mark;
119 GtkTextIter iter;
121 ptr = NSA_GET_PTR (env, obj);
123 gdk_threads_enter ();
125 if (GTK_IS_EDITABLE (ptr))
127 editable = GTK_EDITABLE (ptr);
128 pos = gtk_editable_get_position (editable);
130 else
132 if (GTK_IS_SCROLLED_WINDOW (ptr))
134 text = GTK_WIDGET (GTK_TEXT_VIEW (GTK_SCROLLED_WINDOW (ptr)->container.child));
136 else if (GTK_IS_TEXT_VIEW (ptr))
138 text = GTK_WIDGET (ptr);
141 if (text)
143 buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
144 mark = gtk_text_buffer_get_insert (buf);
145 gtk_text_buffer_get_iter_at_mark (buf, &iter, mark);
146 pos = gtk_text_iter_get_offset (&iter);
150 gdk_threads_leave ();
152 return pos;
155 JNIEXPORT void JNICALL
156 Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_setCaretPosition
157 (JNIEnv *env, jobject obj, jint pos)
159 void *ptr;
160 GtkEditable *editable; // type of GtkEntry (TextField)
161 GtkWidget *text = NULL; // type of GtkTextView (TextArea)
162 GtkTextBuffer *buf;
163 GtkTextIter iter;
165 ptr = NSA_GET_PTR (env, obj);
167 gdk_threads_enter ();
168 if (GTK_IS_EDITABLE (ptr))
170 editable = GTK_EDITABLE (ptr);
171 gtk_editable_set_position (editable, pos);
173 else
175 if (GTK_IS_SCROLLED_WINDOW (ptr))
177 text = GTK_WIDGET (GTK_TEXT_VIEW (GTK_SCROLLED_WINDOW (ptr)->container.child));
179 else if (GTK_IS_TEXT_VIEW (ptr))
181 text = GTK_WIDGET (ptr);
184 if (text)
186 buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
187 gtk_text_buffer_get_iter_at_offset (buf, &iter, pos);
188 gtk_text_buffer_place_cursor (buf, &iter);
192 gdk_threads_leave ();
195 JNIEXPORT jint JNICALL
196 Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_getSelectionStart
197 (JNIEnv *env, jobject obj)
199 void *ptr;
200 int pos = 0;
201 GtkEditable *editable; // type of GtkEntry (TextField)
202 GtkWidget *text = NULL; // type of GtkTextView (TextArea)
203 GtkTextBuffer *buf;
204 GtkTextIter start;
205 GtkTextIter end;
206 int starti, endi;
207 GtkTextMark *mark;
208 GtkTextIter iter;
210 ptr = NSA_GET_PTR (env, obj);
212 gdk_threads_enter ();
214 if (GTK_IS_EDITABLE (ptr))
216 editable = GTK_EDITABLE (ptr);
217 if (gtk_editable_get_selection_bounds (editable, &starti, &endi))
218 pos = starti;
219 else
220 pos = gtk_editable_get_position (editable);
222 else
224 if (GTK_IS_SCROLLED_WINDOW (ptr))
226 text = GTK_WIDGET (GTK_TEXT_VIEW (GTK_SCROLLED_WINDOW (ptr)->container.child));
228 else if (GTK_IS_TEXT_VIEW (ptr))
230 text = GTK_WIDGET (ptr);
233 if (text)
235 buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
236 if (gtk_text_buffer_get_selection_bounds(buf, &start, &end))
237 pos = gtk_text_iter_get_offset (&start);
238 else
240 mark = gtk_text_buffer_get_insert (buf);
241 gtk_text_buffer_get_iter_at_mark (buf, &iter, mark);
242 pos = gtk_text_iter_get_offset (&iter);
247 gdk_threads_leave ();
249 return pos;
252 JNIEXPORT jint JNICALL
253 Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_getSelectionEnd
254 (JNIEnv *env, jobject obj)
256 void *ptr;
257 int pos = 0;
258 GtkEditable *editable; // type of GtkEntry (TextField)
259 GtkWidget *text = NULL; // type of GtkTextView (TextArea)
260 GtkTextBuffer *buf;
261 GtkTextIter start;
262 GtkTextIter end;
263 int starti, endi;
264 GtkTextMark *mark;
265 GtkTextIter iter;
267 ptr = NSA_GET_PTR (env, obj);
269 gdk_threads_enter ();
271 if (GTK_IS_EDITABLE (ptr))
273 editable = GTK_EDITABLE (ptr);
274 if (gtk_editable_get_selection_bounds (editable, &starti, &endi))
275 pos = endi;
276 else
277 pos = gtk_editable_get_position (editable);
279 else
281 if (GTK_IS_SCROLLED_WINDOW (ptr))
283 text = GTK_WIDGET (GTK_TEXT_VIEW (GTK_SCROLLED_WINDOW (ptr)->container.child));
285 else if (GTK_IS_TEXT_VIEW (ptr))
287 text = GTK_WIDGET (ptr);
290 if (text)
292 buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
293 if (gtk_text_buffer_get_selection_bounds(buf, &start, &end))
294 pos = gtk_text_iter_get_offset (&end);
295 else
297 mark = gtk_text_buffer_get_insert (buf);
298 gtk_text_buffer_get_iter_at_mark (buf, &iter, mark);
299 pos = gtk_text_iter_get_offset (&iter);
304 gdk_threads_leave ();
306 return pos;
309 JNIEXPORT void JNICALL
310 Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_select
311 (JNIEnv *env, jobject obj, jint start, jint end)
313 void *ptr;
314 GtkEditable *editable; // type of GtkEntry (TextField)
315 GtkWidget *text = NULL; // type of GtkTextView (TextArea)
316 GtkTextBuffer *buf;
317 GtkTextIter iter;
319 ptr = NSA_GET_PTR (env, obj);
321 gdk_threads_enter ();
324 if (GTK_IS_EDITABLE (ptr))
326 editable = GTK_EDITABLE (ptr);
327 gtk_editable_select_region (editable, start, end);
329 else
331 if (GTK_IS_SCROLLED_WINDOW (ptr))
333 text = GTK_WIDGET (GTK_TEXT_VIEW (GTK_SCROLLED_WINDOW (ptr)->container.child));
335 else if (GTK_IS_TEXT_VIEW (ptr))
337 text = GTK_WIDGET (ptr);
340 if (text)
342 buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
343 gtk_text_buffer_get_iter_at_offset (buf, &iter, start);
344 /* quickly move both 'insert' and 'selection_bound' to the
345 same position */
346 gtk_text_buffer_place_cursor (buf, &iter);
347 gtk_text_buffer_get_iter_at_offset (buf, &iter, end);
348 gtk_text_buffer_move_mark_by_name (buf, "selection_bound", &iter);
352 gdk_threads_leave ();
355 JNIEXPORT void JNICALL
356 Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_setEditable
357 (JNIEnv *env, jobject obj, jboolean state)
359 void *ptr;
360 GtkEditable *editable; // type of GtkEntry (TextField)
361 GtkWidget *text = NULL; // type of GtkTextView (TextArea)
363 ptr = NSA_GET_PTR (env, obj);
365 gdk_threads_enter ();
367 if (GTK_IS_EDITABLE (ptr))
369 editable = GTK_EDITABLE (ptr);
370 gtk_editable_set_editable (editable, state);
372 else
374 if (GTK_IS_SCROLLED_WINDOW (ptr))
376 text = GTK_WIDGET (GTK_TEXT_VIEW (GTK_SCROLLED_WINDOW (ptr)->container.child));
378 else if (GTK_IS_TEXT_VIEW (ptr))
380 text = GTK_WIDGET (ptr);
383 if (text)
385 gtk_text_view_set_editable (GTK_TEXT_VIEW (text), state);
389 gdk_threads_leave ();
392 JNIEXPORT jstring JNICALL
393 Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_getText
394 (JNIEnv *env, jobject obj)
396 void *ptr;
397 char *contents = NULL;
398 jstring jcontents;
399 GtkEditable *editable; // type of GtkEntry (TextField)
400 GtkWidget *text = NULL; // type of GtkTextView (TextArea)
401 GtkTextBuffer *buf;
402 GtkTextIter start, end;
404 ptr = NSA_GET_PTR (env, obj);
406 gdk_threads_enter ();
408 if (GTK_IS_EDITABLE (ptr))
410 editable = GTK_EDITABLE (ptr);
411 contents = gtk_editable_get_chars (editable, 0, -1);
413 else
415 if (GTK_IS_SCROLLED_WINDOW (ptr))
417 text = GTK_WIDGET (GTK_TEXT_VIEW (GTK_SCROLLED_WINDOW (ptr)->container.child));
419 else if (GTK_IS_TEXT_VIEW (ptr))
421 text = GTK_WIDGET (ptr);
424 if (text)
426 buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
427 gtk_text_buffer_get_start_iter (buf, &start);
428 gtk_text_buffer_get_end_iter (buf, &end);
429 contents = gtk_text_buffer_get_text (buf, &start, &end, FALSE);
433 gdk_threads_leave ();
435 jcontents = (*env)->NewStringUTF (env, contents);
436 g_free (contents);
438 return jcontents;
441 JNIEXPORT void JNICALL
442 Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_setText
443 (JNIEnv *env, jobject obj, jstring contents)
445 void *ptr;
446 const char *str;
447 GtkWidget *text = NULL; // type of GtkTextView (TextArea)
448 GtkTextBuffer *buf;
450 ptr = NSA_GET_PTR (env, obj);
451 str = (*env)->GetStringUTFChars (env, contents, NULL);
453 gdk_threads_enter ();
455 if (GTK_IS_EDITABLE (ptr))
457 gtk_entry_set_text (GTK_ENTRY (ptr), str);
459 else
461 if (GTK_IS_SCROLLED_WINDOW (ptr))
463 text = GTK_WIDGET (GTK_TEXT_VIEW (GTK_SCROLLED_WINDOW (ptr)->container.child));
465 else if (GTK_IS_TEXT_VIEW (ptr))
467 text = GTK_WIDGET (ptr);
470 if (text)
472 buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
473 gtk_text_buffer_set_text (buf, str, strlen (str));
477 gdk_threads_leave ();
479 (*env)->ReleaseStringUTFChars (env, contents, str);
482 static void
483 textcomponent_commit_cb (GtkIMContext *context __attribute__((unused)),
484 const gchar *str,
485 jobject peer)
487 /* str is a \0-terminated UTF-8 encoded character. */
488 gunichar2 *jc = g_utf8_to_utf16 (str, -1, NULL, NULL, NULL);
489 GdkEvent *event = gtk_get_current_event ();
491 if (jc)
492 (*gdk_env)->CallVoidMethod (gdk_env, peer,
493 postKeyEventID,
494 (jint) AWT_KEY_TYPED,
495 (jlong) event->key.time,
496 keyevent_state_to_awt_mods (event),
497 VK_UNDEFINED,
498 (jchar) jc[0],
499 AWT_KEY_LOCATION_UNKNOWN);
500 g_free (jc);
501 gdk_event_free (event);
504 static void
505 textcomponent_changed_cb (GtkEditable *editable __attribute__((unused)),
506 jobject peer)
508 (*gdk_env)->CallVoidMethod (gdk_env, peer, postTextEventID);