From 56bba8cf57d0aa75d0266486595efe0d070af0b7 Mon Sep 17 00:00:00 2001 From: Hans Boehm Date: Wed, 19 Feb 2003 00:35:35 +0000 Subject: XToolkit.java (getFontMetrics): initialize if necessary. 2003-02-18 Hans Boehm * gnu/awt/xlib/XToolkit.java (getFontMetrics): initialize if necessary. * gnu/java/awt/peer/gtk/GtkButtonPeer.java, gnu/java/awt/peer/gtk/GtkTextAreaPeer.java, gnu/java/awt/peer/gtk/GtkTextFieldPeer.java, jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c, jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c, jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c (setFont, gtkSetFont): add. gnu/java/awt/peer/gtk/GtkComponentPeer.java (GtkComponentPeer): Propagate font to peer. (setFont): add FIXME comment. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c (gtkTextGetSize): fix height, width computation. * gnu/java/awt/peer/gtk/GtkFontPeer.java (GtkFontPeer): Make X font name a bit less bogus. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c (post_adjustment_event): Pass on GTK_SCROLL_NONE. * java/awt/Scrollbar.java (setValues): Fix visibleAmount range check. (processAdjustmentEvent): Adjust value. * java/awt/FlowLayout.java (layoutContainer) Fix 2 indexing and one logic errors. * java/awt/Component.java (setVisible, show, hide): Call show and hide methods in subclasses. (getPreferredSize): don't set prefSize before we have peer. * java/awt/TextArea.java, java/awt/TextField.java (getPreferredSize): Guess (0,0) if we don't have peer. From-SVN: r63077 --- .../gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c | 36 +++++++++++++++++ .../gnu_java_awt_peer_gtk_GtkScrollBarPeer.c | 3 +- .../gnu_java_awt_peer_gtk_GtkTextAreaPeer.c | 45 ++++++++++++++++++++-- .../gnu_java_awt_peer_gtk_GtkTextFieldPeer.c | 33 ++++++++++++++++ 4 files changed, 112 insertions(+), 5 deletions(-) (limited to 'libjava/jni') diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c index ebebc43..e33aff0 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c @@ -50,3 +50,39 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create NSA_SET_PTR (env, obj, widget); } + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkSetFont + (JNIEnv *env, jobject obj, jstring jname, jint size) +{ + const char *xlfd; +# define FBUFSZ 200 + char buf[FBUFSZ]; + void *ptr; + GdkFont * new_font; + GtkStyle * style; + GtkWidget * button; + GtkWidget * label; + + ptr = NSA_GET_PTR (env, obj); + button = GTK_WIDGET (ptr); + label = GTK_BIN(button)->child; + + if (label == NULL) return; + xlfd = (*env)->GetStringUTFChars (env, jname, NULL); + snprintf(buf, FBUFSZ, xlfd, size); + (*env)->ReleaseStringUTFChars (env, jname, xlfd); + gdk_threads_enter(); + new_font = gdk_font_load (buf); /* FIXME: deprecated. Replacement? */ + if (new_font == NULL) + { + /* Fail quietly for now. */ + gdk_threads_leave(); + return; + } + style = gtk_style_copy (gtk_widget_get_style (label)); + style -> font = new_font; + gtk_widget_set_style (label, style); + /* FIXME: Documentation varies as to whether we should unref style. */ + gdk_threads_leave(); +} diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c index 4b8787e..9237a01 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c @@ -65,9 +65,10 @@ post_adjustment_event (GtkAdjustment *adj, struct range_scrollbar *rs) type = AWT_ADJUSTMENT_BLOCK_DECREMENT; break; case GTK_SCROLL_JUMP: + case GTK_SCROLL_NONE: /* Apparently generated when slider is dragged. */ type = AWT_ADJUSTMENT_TRACK; break; - default: /* GTK_SCROLL_NONE */ + default: /* Can this happen? If so, is this right? */ return; } diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c index 8f58623..27f2746 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c @@ -135,27 +135,32 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_gtkTextGetSize text = GTK_WIDGET (TEXT_FROM_SW (ptr)); sw = GTK_SCROLLED_WINDOW (ptr); - gtk_signal_emit_by_name (GTK_OBJECT (GTK_SCROLLED_WINDOW(sw)->hscrollbar), + gtk_signal_emit_by_name (GTK_OBJECT (GTK_SCROLLED_WINDOW(sw)->vscrollbar), "size_request", &myreq); //gtk_widget_size_request(GTK_WIDGET (GTK_SCROLLED_WINDOW(sw)->hscrollbar), // &myreq); dims[0]=myreq.width+GTK_SCROLLED_WINDOW_CLASS (GTK_OBJECT (sw)->klass)->scrollbar_spacing; - gtk_signal_emit_by_name (GTK_OBJECT (GTK_SCROLLED_WINDOW(sw)->vscrollbar), + gtk_signal_emit_by_name (GTK_OBJECT (GTK_SCROLLED_WINDOW(sw)->hscrollbar), "size_request", &myreq); //gtk_widget_size_request(GTK_WIDGET (GTK_SCROLLED_WINDOW(sw)->vscrollbar), // &myreq); - dims[1]=myreq.width+GTK_SCROLLED_WINDOW_CLASS + dims[1]=myreq.height+GTK_SCROLLED_WINDOW_CLASS (GTK_OBJECT (sw)->klass)->scrollbar_spacing; /* The '1' in the following assignments is from #define TEXT_BORDER_ROOM 1 in gtktext.c */ + /* Gtk text seems to wrap slightly prematurely. Compensate. */ + ++cols; + ++dims[0]; + dims[0] += ((cols * gdk_char_width (text->style->font, 'W')) + (2 * (text->style->klass->xthickness + 1))); - dims[1] += ((rows * gdk_char_height (text->style->font, 'W')) + /* Guess at the height. Is there a better way? */ + dims[1] += ((rows * gdk_string_height (text->style->font, "Wg")) + (2 * (text->style->klass->ythickness + 1))); gdk_threads_leave (); @@ -207,3 +212,35 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_replaceRange (*env)->ReleaseStringUTFChars (env, contents, str); } +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_gtkSetFont + (JNIEnv *env, jobject obj, jstring jname, jint size) +{ + const char *xlfd; +# define FBUFSZ 200 + char buf[FBUFSZ]; + void *ptr; + GdkFont * new_font; + GtkStyle * style; + GtkWidget * text; + + ptr = NSA_GET_PTR (env, obj); + text = GTK_WIDGET (TEXT_FROM_SW (ptr)); + + xlfd = (*env)->GetStringUTFChars (env, jname, NULL); + snprintf(buf, FBUFSZ, xlfd, size); + (*env)->ReleaseStringUTFChars (env, jname, xlfd); + gdk_threads_enter(); + new_font = gdk_font_load (buf); /* FIXME: deprecated. Replacement? */ + if (new_font == NULL) + { + /* Fail quietly for now. */ + gdk_threads_leave(); + return; + } + style = gtk_style_copy (gtk_widget_get_style (text)); + style -> font = new_font; + gtk_widget_set_style (text , style); + /* FIXME: Documentation varies as to whether we should unref style. */ + gdk_threads_leave(); +} diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c index 9085a579..658c863 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c @@ -148,3 +148,36 @@ Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setEchoChar gdk_threads_leave (); } + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkSetFont + (JNIEnv *env, jobject obj, jstring jname, jint size) +{ + const char *xlfd; +# define FBUFSZ 200 + char buf[FBUFSZ]; + void *ptr; + GdkFont * new_font; + GtkStyle * style; + GtkWidget * text; + + ptr = NSA_GET_PTR (env, obj); + text = GTK_WIDGET (ptr); + + xlfd = (*env)->GetStringUTFChars (env, jname, NULL); + snprintf(buf, FBUFSZ, xlfd, size); + (*env)->ReleaseStringUTFChars (env, jname, xlfd); + gdk_threads_enter(); + new_font = gdk_font_load(buf); /* FIXME: deprecated. Replacement? */ + if (new_font == NULL) + { + /* Fail quietly for now. */ + gdk_threads_leave(); + return; + } + style = gtk_style_copy (gtk_widget_get_style (text)); + style -> font = new_font; + gtk_widget_set_style (text , style); + /* FIXME: Documentation varies as to whether we should unref style. */ + gdk_threads_leave(); +} -- cgit v1.1