1 /* gtktextareapeer.c -- Native implementation of GtkTextAreaPeer
2 Copyright (C) 1998, 1999, 2003 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_GtkTextAreaPeer.h"
42 #define AWT_TEXTAREA_SCROLLBARS_BOTH 0
43 #define AWT_TEXTAREA_SCROLLBARS_VERTICAL_ONLY 1
44 #define AWT_TEXTAREA_SCROLLBARS_HORIZONTAL_ONLY 2
46 static GtkWidget *textarea_get_widget (GtkWidget *widget);
48 JNIEXPORT void JNICALL
49 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_create
50 (JNIEnv *env, jobject obj,
51 jint textview_width, jint textview_height, jint scroll)
59 /* Create global reference and save it for future use */
60 NSA_SET_GLOBAL_REF (env, obj);
62 text = gtk_text_view_new ();
63 gtk_widget_set_size_request (text, textview_width, textview_height);
64 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW (text), TRUE);
66 gtk_widget_show (text);
68 eventbox = gtk_event_box_new ();
69 sw = gtk_scrolled_window_new (NULL, NULL);
70 gtk_container_add (GTK_CONTAINER (sw), text);
71 gtk_container_add (GTK_CONTAINER (eventbox), sw);
74 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
75 /* horizontal scrollbar */
76 (scroll == AWT_TEXTAREA_SCROLLBARS_BOTH
77 || scroll == AWT_TEXTAREA_SCROLLBARS_HORIZONTAL_ONLY) ?
78 GTK_POLICY_ALWAYS : GTK_POLICY_NEVER,
79 /* vertical scrollbar */
80 (scroll == AWT_TEXTAREA_SCROLLBARS_BOTH
81 || scroll == AWT_TEXTAREA_SCROLLBARS_VERTICAL_ONLY) ?
82 GTK_POLICY_ALWAYS : GTK_POLICY_NEVER);
84 gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (text),
85 (scroll == AWT_TEXTAREA_SCROLLBARS_BOTH
86 || scroll == AWT_TEXTAREA_SCROLLBARS_HORIZONTAL_ONLY)
87 ? GTK_WRAP_NONE : GTK_WRAP_WORD);
89 NSA_SET_PTR (env, obj, eventbox);
94 JNIEXPORT void JNICALL
95 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_connectSignals
96 (JNIEnv *env, jobject obj)
98 GtkWidget *text = NULL;
103 gdk_threads_enter ();
105 ptr = NSA_GET_PTR (env, obj);
106 gref = NSA_GET_GLOBAL_REF (env, obj);
108 /* Unwrap the text view from the scrolled window */
109 text = textarea_get_widget (GTK_WIDGET (ptr));
111 buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
113 /* TextComponent signals */
114 cp_gtk_textcomponent_connect_signals (G_OBJECT (buf), gref);
116 /* Component signals */
117 cp_gtk_component_connect_signals (G_OBJECT (text), gref);
119 gdk_threads_leave ();
122 JNIEXPORT void JNICALL
123 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_insert
124 (JNIEnv *env, jobject obj, jstring contents, jint position)
132 gdk_threads_enter ();
134 ptr = NSA_GET_PTR (env, obj);
135 str = (*env)->GetStringUTFChars (env, contents, NULL);
137 text = textarea_get_widget (GTK_WIDGET (ptr));
139 buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
140 gtk_text_buffer_get_iter_at_offset (buf, &iter, position);
141 gtk_text_buffer_insert (buf, &iter, str, strlen (str));
143 (*env)->ReleaseStringUTFChars (env, contents, str);
145 gdk_threads_leave ();
148 JNIEXPORT void JNICALL
149 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_replaceRange
150 (JNIEnv *env, jobject obj, jstring contents, jint start, jint end)
154 GtkTextIter iter, startIter, endIter;
160 gdk_threads_enter ();
162 ptr = NSA_GET_PTR (env, obj);
163 str = (*env)->GetStringUTFChars (env, contents, NULL);
165 text = textarea_get_widget (GTK_WIDGET (ptr));
167 buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
169 gtk_text_buffer_get_iter_at_offset (buf, &startIter, mystart);
170 gtk_text_buffer_get_iter_at_offset (buf, &endIter, myend);
171 gtk_text_buffer_delete (buf, &startIter, &endIter);
173 gtk_text_buffer_get_iter_at_offset (buf, &iter, mystart);
174 gtk_text_buffer_insert(buf, &iter, str, strlen (str));
176 (*env)->ReleaseStringUTFChars (env, contents, str);
178 gdk_threads_leave ();
181 JNIEXPORT void JNICALL
182 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_gtkWidgetModifyFont
183 (JNIEnv *env, jobject obj, jstring name, jint style, jint size)
185 const char *font_name;
188 PangoFontDescription *font_desc;
192 ptr = NSA_GET_PTR (env, obj);
194 text = textarea_get_widget (GTK_WIDGET (ptr));
196 font_name = (*env)->GetStringUTFChars (env, name, NULL);
198 font_desc = pango_font_description_from_string (font_name);
199 pango_font_description_set_size (font_desc,
200 size * cp_gtk_dpi_conversion_factor);
202 if (style & AWT_STYLE_BOLD)
203 pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
205 if (style & AWT_STYLE_ITALIC)
206 pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE);
208 gtk_widget_modify_font (GTK_WIDGET (text), font_desc);
210 pango_font_description_free (font_desc);
212 (*env)->ReleaseStringUTFChars (env, name, font_name);
217 JNIEXPORT void JNICALL
218 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_gtkWidgetRequestFocus
219 (JNIEnv *env, jobject obj)
224 gdk_threads_enter ();
226 ptr = NSA_GET_PTR (env, obj);
228 text = textarea_get_widget (GTK_WIDGET (ptr));
230 gtk_widget_grab_focus (text);
232 gdk_threads_leave ();
235 JNIEXPORT jint JNICALL
236 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_getHScrollbarHeight
237 (JNIEnv *env, jobject obj)
241 GtkScrolledWindow *sw;
242 GtkRequisition requisition;
246 gdk_threads_enter ();
248 ptr = NSA_GET_PTR (env, obj);
250 bin = gtk_bin_get_child (GTK_BIN (ptr));
251 sw = GTK_SCROLLED_WINDOW (bin);
255 gtk_widget_size_request (sw->hscrollbar, &requisition);
256 gtk_widget_style_get (GTK_WIDGET (sw), "scrollbar_spacing", &spacing, NULL);
257 height = requisition.height + spacing;
260 gdk_threads_leave ();
265 JNIEXPORT jint JNICALL
266 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_getVScrollbarWidth
267 (JNIEnv *env, jobject obj)
271 GtkScrolledWindow *sw;
272 GtkRequisition requisition;
276 gdk_threads_enter ();
278 ptr = NSA_GET_PTR (env, obj);
280 bin = gtk_bin_get_child (GTK_BIN (ptr));
281 sw = GTK_SCROLLED_WINDOW (bin);
285 gtk_widget_size_request (sw->vscrollbar, &requisition);
286 gtk_widget_style_get (GTK_WIDGET (sw), "scrollbar_spacing", &spacing, NULL);
287 width = requisition.width + spacing;
290 gdk_threads_leave ();
295 JNIEXPORT jint JNICALL
296 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_getCaretPosition
297 (JNIEnv *env, jobject obj)
301 GtkWidget *text = NULL;
306 gdk_threads_enter ();
308 ptr = NSA_GET_PTR (env, obj);
310 text = textarea_get_widget (GTK_WIDGET (ptr));
312 buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
313 mark = gtk_text_buffer_get_insert (buf);
314 gtk_text_buffer_get_iter_at_mark (buf, &iter, mark);
315 pos = gtk_text_iter_get_offset (&iter);
317 gdk_threads_leave ();
322 JNIEXPORT void JNICALL
323 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_setCaretPosition
324 (JNIEnv *env, jobject obj, jint pos)
327 GtkWidget *text = NULL;
330 GtkTextMark *oldmark;
334 gdk_threads_enter ();
336 ptr = NSA_GET_PTR (env, obj);
338 text = textarea_get_widget (GTK_WIDGET (ptr));
340 buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
342 /* Save old position. */
343 oldmark = gtk_text_buffer_get_insert (buf);
344 gtk_text_buffer_get_iter_at_mark (buf, &olditer, oldmark);
345 oldpos = gtk_text_iter_get_offset (&olditer);
347 /* Move to new position. */
348 gtk_text_buffer_get_iter_at_offset (buf, &iter, pos);
349 gtk_text_buffer_place_cursor (buf, &iter);
351 /* Scroll to new position. Alignment is determined
352 comparing the new position to the old position. */
354 gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (text),
355 &iter, 0, TRUE, 0, 0);
356 else if (oldpos < pos)
357 gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (text),
358 &iter, 0, TRUE, 1, 1);
360 gdk_threads_leave ();
363 JNIEXPORT jint JNICALL
364 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_getSelectionStart
365 (JNIEnv *env, jobject obj)
369 GtkWidget *text = NULL;
376 gdk_threads_enter ();
378 ptr = NSA_GET_PTR (env, obj);
380 text = textarea_get_widget (GTK_WIDGET (ptr));
382 buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
384 if (gtk_text_buffer_get_selection_bounds (buf, &start, &end))
386 pos = gtk_text_iter_get_offset (&start);
390 mark = gtk_text_buffer_get_insert (buf);
391 gtk_text_buffer_get_iter_at_mark (buf, &iter, mark);
392 pos = gtk_text_iter_get_offset (&iter);
395 gdk_threads_leave ();
400 JNIEXPORT jint JNICALL
401 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_getSelectionEnd
402 (JNIEnv *env, jobject obj)
406 GtkWidget *text = NULL;
413 gdk_threads_enter ();
415 ptr = NSA_GET_PTR (env, obj);
417 text = textarea_get_widget (GTK_WIDGET (ptr));
419 buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
421 if (gtk_text_buffer_get_selection_bounds (buf, &start, &end))
423 pos = gtk_text_iter_get_offset (&end);
427 mark = gtk_text_buffer_get_insert (buf);
428 gtk_text_buffer_get_iter_at_mark (buf, &iter, mark);
429 pos = gtk_text_iter_get_offset (&iter);
432 gdk_threads_leave ();
437 JNIEXPORT void JNICALL
438 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_select
439 (JNIEnv *env, jobject obj, jint start, jint end)
442 GtkWidget *text = NULL;
446 gdk_threads_enter ();
448 ptr = NSA_GET_PTR (env, obj);
450 text = textarea_get_widget (GTK_WIDGET (ptr));
452 buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
453 gtk_text_buffer_get_iter_at_offset (buf, &iter, start);
454 /* quickly move both 'insert' and 'selection_bound' to the
456 gtk_text_buffer_place_cursor (buf, &iter);
457 gtk_text_buffer_get_iter_at_offset (buf, &iter, end);
458 gtk_text_buffer_move_mark_by_name (buf, "selection_bound", &iter);
460 gdk_threads_leave ();
463 JNIEXPORT void JNICALL
464 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_setEditable
465 (JNIEnv *env, jobject obj, jboolean state)
468 GtkWidget *text = NULL;
470 gdk_threads_enter ();
472 ptr = NSA_GET_PTR (env, obj);
474 text = textarea_get_widget (GTK_WIDGET (ptr));
476 gtk_text_view_set_editable (GTK_TEXT_VIEW (text), state);
478 gdk_threads_leave ();
481 JNIEXPORT jstring JNICALL
482 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_getText
483 (JNIEnv *env, jobject obj)
486 char *contents = NULL;
488 GtkWidget *text = NULL;
490 GtkTextIter start, end;
492 gdk_threads_enter ();
494 ptr = NSA_GET_PTR (env, obj);
496 text = textarea_get_widget (GTK_WIDGET (ptr));
498 buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
499 gtk_text_buffer_get_start_iter (buf, &start);
500 gtk_text_buffer_get_end_iter (buf, &end);
501 contents = gtk_text_buffer_get_text (buf, &start, &end, FALSE);
503 jcontents = (*env)->NewStringUTF (env, contents);
506 gdk_threads_leave ();
511 JNIEXPORT void JNICALL
512 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_setText
513 (JNIEnv *env, jobject obj, jstring contents)
517 GtkWidget *text = NULL;
520 gdk_threads_enter ();
522 ptr = NSA_GET_PTR (env, obj);
523 str = (*env)->GetStringUTFChars (env, contents, NULL);
525 text = textarea_get_widget (GTK_WIDGET (ptr));
527 buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
528 gtk_text_buffer_set_text (buf, str, strlen (str));
530 (*env)->ReleaseStringUTFChars (env, contents, str);
532 gdk_threads_leave ();
536 textarea_get_widget (GtkWidget *widget)
539 g_assert (GTK_IS_EVENT_BOX (widget));
541 wid = gtk_bin_get_child (GTK_BIN (widget));
542 g_assert (GTK_IS_SCROLLED_WINDOW (wid));
544 wid = gtk_bin_get_child (GTK_BIN (wid));