OSDN Git Service

2004-11-30 Thomas Fitzsimmons <fitzsim@redhat.com>
[pf3gnuchains/gcc-fork.git] / libjava / jni / gtk-peer / gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
1 /* gtktextareapeer.c -- Native implementation of GtkTextAreaPeer
2    Copyright (C) 1998, 1999, 2003 Free Software Foundation, Inc.
3
4 This file is part of GNU Classpath.
5
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.
10
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.
15
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.
20
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.
25
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. */
37
38
39 #include "gtkpeer.h"
40 #include "gnu_java_awt_peer_gtk_GtkTextAreaPeer.h"
41
42 #define TEXT_FROM_SW(obj) (GTK_TEXT_VIEW(GTK_SCROLLED_WINDOW (obj)->container.child))
43 JNIEXPORT void JNICALL 
44 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_create
45   (JNIEnv *env, jobject obj,
46    jint textview_width, jint textview_height,  jint scroll)
47 {
48   GtkWidget *text, *sw;
49
50   /* Create global reference and save it for future use */
51   NSA_SET_GLOBAL_REF (env, obj);
52
53   gdk_threads_enter ();
54
55   text = gtk_text_view_new ();
56   gtk_widget_set_size_request (text, textview_width, textview_height);
57   gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW (text), TRUE);
58
59   gtk_widget_show (text);
60
61   sw = gtk_scrolled_window_new (NULL, NULL);
62   gtk_container_add (GTK_CONTAINER (sw), text);
63
64   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
65      /* horizontal scrollbar */
66      (scroll == AWT_TEXTAREA_SCROLLBARS_BOTH
67       || scroll == AWT_TEXTAREA_SCROLLBARS_HORIZONTAL_ONLY) ? 
68        GTK_POLICY_ALWAYS : GTK_POLICY_NEVER,
69      /* vertical scrollbar */
70      (scroll == AWT_TEXTAREA_SCROLLBARS_BOTH
71       || scroll == AWT_TEXTAREA_SCROLLBARS_VERTICAL_ONLY) ? 
72        GTK_POLICY_ALWAYS : GTK_POLICY_NEVER);
73
74   gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (text),
75                                (scroll == AWT_TEXTAREA_SCROLLBARS_BOTH
76                                 || scroll == AWT_TEXTAREA_SCROLLBARS_HORIZONTAL_ONLY)
77                                ? GTK_WRAP_NONE : GTK_WRAP_WORD);
78
79   gdk_threads_leave ();
80
81   NSA_SET_PTR (env, obj, sw);
82 }
83
84 JNIEXPORT void JNICALL 
85 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_insert
86   (JNIEnv *env, jobject obj, jstring contents, jint position)
87 {
88   GtkTextBuffer *buf;
89   GtkTextIter iter;
90   GtkWidget *text;
91   void *ptr;
92   const char *str;
93   int pos=position;
94
95   ptr = NSA_GET_PTR (env, obj);
96   str = (*env)->GetStringUTFChars (env, contents, NULL);
97   
98   gdk_threads_enter ();
99
100   text = GTK_WIDGET (TEXT_FROM_SW (ptr));
101
102   buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
103   gtk_text_buffer_get_iter_at_offset (buf, &iter, pos);
104   gtk_text_buffer_insert (buf, &iter, str, strlen (str));
105
106   gdk_threads_leave ();
107
108   (*env)->ReleaseStringUTFChars (env, contents, str);
109 }
110
111 JNIEXPORT void JNICALL 
112 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_replaceRange
113   (JNIEnv *env, jobject obj, jstring contents, jint start, jint end)
114 {
115   GtkWidget *text;
116   GtkTextBuffer *buf;
117   GtkTextIter iter, startIter, endIter;
118   void *ptr;
119   const char *str;
120   int mystart = start;
121   int myend = end;
122
123   ptr = NSA_GET_PTR (env, obj);
124   str = (*env)->GetStringUTFChars (env, contents, NULL);
125   
126   gdk_threads_enter ();
127   
128   text = GTK_WIDGET (TEXT_FROM_SW (ptr));
129
130   buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
131
132   gtk_text_buffer_get_iter_at_offset (buf, &startIter, mystart);
133   gtk_text_buffer_get_iter_at_offset (buf, &endIter, myend);
134   gtk_text_buffer_delete (buf, &startIter, &endIter);
135
136   gtk_text_buffer_get_iter_at_offset (buf, &iter, mystart);
137   gtk_text_buffer_insert(buf, &iter, str, strlen (str));
138
139   gdk_threads_leave ();
140   (*env)->ReleaseStringUTFChars (env, contents, str);
141 }
142
143 JNIEXPORT void JNICALL
144 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_gtkWidgetModifyFont
145   (JNIEnv *env, jobject obj, jstring name, jint style, jint size)
146 {
147   const char *font_name;
148   void *ptr;
149   GtkWidget *text;
150   PangoFontDescription *font_desc;
151
152   ptr = NSA_GET_PTR (env, obj);
153
154   text = GTK_WIDGET (TEXT_FROM_SW (ptr));
155
156   font_name = (*env)->GetStringUTFChars (env, name, NULL);
157
158   gdk_threads_enter();
159
160   font_desc = pango_font_description_from_string (font_name);
161   pango_font_description_set_size (font_desc, size * dpi_conversion_factor);
162
163   if (style & AWT_STYLE_BOLD)
164     pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
165
166   if (style & AWT_STYLE_ITALIC)
167     pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE);
168
169   gtk_widget_modify_font (GTK_WIDGET (text), font_desc);
170
171   pango_font_description_free (font_desc);
172
173   gdk_threads_leave();
174
175   (*env)->ReleaseStringUTFChars (env, name, font_name);
176 }
177
178 JNIEXPORT void JNICALL 
179 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_gtkWidgetRequestFocus
180   (JNIEnv *env, jobject obj)
181 {
182   void *ptr;
183   GtkWidget *text;
184
185   ptr = NSA_GET_PTR (env, obj);
186   
187   gdk_threads_enter ();
188
189   text = GTK_WIDGET (TEXT_FROM_SW (ptr));
190
191   gtk_widget_grab_focus (text);
192
193   gdk_threads_leave ();
194 }
195
196 JNIEXPORT jint JNICALL
197 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_getHScrollbarHeight
198   (JNIEnv *env, jobject obj)
199 {
200   void *ptr;
201   GtkScrolledWindow *sw;
202   GtkRequisition requisition;
203   jint height = 0;
204   jint spacing = 0;
205
206   ptr = NSA_GET_PTR (env, obj);
207
208   gdk_threads_enter ();
209   sw = GTK_SCROLLED_WINDOW (ptr);
210
211   if (sw)
212     {
213       gtk_widget_size_request (sw->hscrollbar, &requisition);
214       gtk_widget_style_get (GTK_WIDGET (sw), "scrollbar_spacing", &spacing, NULL);
215       height = requisition.height + spacing;
216     }
217
218   gdk_threads_leave ();
219
220   return height;
221 }
222
223 JNIEXPORT jint JNICALL 
224 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_getVScrollbarWidth
225   (JNIEnv *env, jobject obj)
226 {
227   void *ptr;
228   GtkScrolledWindow *sw;
229   GtkRequisition requisition;
230   jint width = 0;
231   jint spacing = 0;
232
233   ptr = NSA_GET_PTR (env, obj);
234
235   gdk_threads_enter ();
236   sw = GTK_SCROLLED_WINDOW (ptr);
237
238   if (sw)
239     {
240       gtk_widget_size_request (sw->vscrollbar, &requisition);
241       gtk_widget_style_get (GTK_WIDGET (sw), "scrollbar_spacing", &spacing, NULL);
242       width = requisition.width + spacing;
243     }
244
245   gdk_threads_leave ();
246
247   return width;
248 }