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)
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
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_GtkComponentPeer.h"
41 #include "gnu_java_awt_peer_gtk_GtkTextComponentPeer.h"
43 static void textcomponent_commit_cb (GtkIMContext
*context
,
47 static void textcomponent_changed_cb (GtkEditable
*editable
,
50 JNIEXPORT
void JNICALL
51 Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectSignals
52 (JNIEnv
*env
, jobject obj
)
54 GtkTextView
*text
= NULL
;
56 void *ptr
= NSA_GET_PTR (env
, obj
);
57 jobject
*gref
= NSA_GET_GLOBAL_REF (env
, obj
);
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
);
72 /* Connect the superclass signals. */
73 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env
, *gref
);
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
);
88 g_signal_connect (text
->im_context
, "commit",
89 G_CALLBACK (textcomponent_commit_cb
), *gref
);
91 buf
= gtk_text_view_get_buffer (text
);
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,
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
)
115 GtkEditable
*editable
; // type of GtkEntry (TextField)
116 GtkWidget
*text
= NULL
; // type of GtkTextView (TextArea)
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
);
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
);
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 ();
155 JNIEXPORT
void JNICALL
156 Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_setCaretPosition
157 (JNIEnv
*env
, jobject obj
, jint pos
)
160 GtkEditable
*editable
; // type of GtkEntry (TextField)
161 GtkWidget
*text
= NULL
; // type of GtkTextView (TextArea)
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
);
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
);
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
)
201 GtkEditable
*editable
; // type of GtkEntry (TextField)
202 GtkWidget
*text
= NULL
; // type of GtkTextView (TextArea)
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
))
220 pos
= gtk_editable_get_position (editable
);
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
);
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
);
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 ();
252 JNIEXPORT jint JNICALL
253 Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_getSelectionEnd
254 (JNIEnv
*env
, jobject obj
)
258 GtkEditable
*editable
; // type of GtkEntry (TextField)
259 GtkWidget
*text
= NULL
; // type of GtkTextView (TextArea)
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
))
277 pos
= gtk_editable_get_position (editable
);
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
);
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
);
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 ();
309 JNIEXPORT
void JNICALL
310 Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_select
311 (JNIEnv
*env
, jobject obj
, jint start
, jint end
)
314 GtkEditable
*editable
; // type of GtkEntry (TextField)
315 GtkWidget
*text
= NULL
; // type of GtkTextView (TextArea)
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
);
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
);
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
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
)
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
);
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
);
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
)
397 char *contents
= NULL
;
399 GtkEditable
*editable
; // type of GtkEntry (TextField)
400 GtkWidget
*text
= NULL
; // type of GtkTextView (TextArea)
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);
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
);
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
);
441 JNIEXPORT
void JNICALL
442 Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_setText
443 (JNIEnv
*env
, jobject obj
, jstring contents
)
447 GtkWidget
*text
= NULL
; // type of GtkTextView (TextArea)
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
);
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
);
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
);
483 textcomponent_commit_cb (GtkIMContext
*context
__attribute__((unused
)),
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 ();
492 (*gdk_env
)->CallVoidMethod (gdk_env
, peer
,
494 (jint
) AWT_KEY_TYPED
,
495 (jlong
) event
->key
.time
,
496 keyevent_state_to_awt_mods (event
),
499 AWT_KEY_LOCATION_UNKNOWN
);
501 gdk_event_free (event
);
505 textcomponent_changed_cb (GtkEditable
*editable
__attribute__((unused
)),
508 (*gdk_env
)->CallVoidMethod (gdk_env
, peer
, postTextEventID
);