This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[gui] [PATCH] FYI: Setting fonts in peers
- From: David Jee <djee at redhat dot com>
- To: java-patches at gcc dot gnu dot org
- Date: 27 Feb 2004 14:47:44 -0500
- Subject: [gui] [PATCH] FYI: Setting fonts in peers
- Organization:
Hello,
I committed the following patch to the java-gui-branch. It implements
font setting in some of the peers which include text, and fixes some
bugs related to font setting and font inheritance.
-David Jee
2004-02-27 David Jee <djee@redhat.com>
* gnu/java/awt/peer/gtk/GdkGraphics.java
(GdkGraphics(Component)): Inherit font from component.
(drawString): Use font style.
* gnu/java/awt/peer/gtk/GtkCheckboxPeer.java
(gtkSetFont): New native method declaration.
(setFont): New method.
* gnu/java/awt/peer/gtk/GtkComponentPeer.java
(gtkSetFont): New native method declaration.
(setFont): Call new native method gtkSetFont.
* gnu/java/awt/peer/gtk/GtkContainerPeer.java
(setFont): For all child components who do not their fonts set,
set their peers' fonts with this container's font.
* gnu/java/awt/peer/gtk/GtkLabelPeer.java:
Move all native method declarations to the top for readability.
(gtkSetFont): New native method declaration.
(setFont): New method.
* java/awt/Component.java
(setFont): Invalidate after setting the font.
* java/awt/Container.java
(invalidateTree): New method.
(setFont): Invalidate the container tree after setting the font.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
(Java_gnu_java_awt_peer_gtk_GdkGraphics_drawString): Use font style.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
(Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkSetFont): New method.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
(Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkSetFont): New method.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c
(Java_gnu_java_awt_peer_gtk_GtkLabelPeer_gtkSetFont): New method.
Index: gnu/java/awt/peer/gtk/GdkGraphics.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GdkGraphics.java,v
retrieving revision 1.4
diff -u -r1.4 GdkGraphics.java
--- gnu/java/awt/peer/gtk/GdkGraphics.java 22 Aug 2003 20:33:49 -0000 1.4
+++ gnu/java/awt/peer/gtk/GdkGraphics.java 27 Feb 2004 19:10:36 -0000
@@ -91,7 +91,7 @@
this.component = component;
int rgb[] = initState (component);
color = new Color (rgb[0], rgb[1], rgb[2]);
- font = new Font ("Dialog", Font.PLAIN, 10);
+ font = component.awtComponent.getFont();
Dimension d = component.awtComponent.getSize ();
clip = new Rectangle (0, 0, d.width, d.height);
}
@@ -212,10 +212,10 @@
native public void drawRect(int x, int y, int width, int height);
native public void fillRect (int x, int y, int width, int height);
- native void drawString (String str, int x, int y, String fname, int size);
+ native void drawString (String str, int x, int y, String fname, int style, int size);
public void drawString (String str, int x, int y)
{
- drawString (str, x, y, font.getName(), font.getSize());
+ drawString (str, x, y, font.getName(), font.getStyle(), font.getSize());
}
public void drawString (AttributedCharacterIterator ci, int x, int y)
Index: gnu/java/awt/peer/gtk/GtkCheckboxPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java,v
retrieving revision 1.4
diff -u -r1.4 GtkCheckboxPeer.java
--- gnu/java/awt/peer/gtk/GtkCheckboxPeer.java 11 Dec 2003 13:50:50 -0000 1.4
+++ gnu/java/awt/peer/gtk/GtkCheckboxPeer.java 27 Feb 2004 19:10:36 -0000
@@ -41,6 +41,7 @@
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Component;
+import java.awt.Font;
import java.awt.peer.CheckboxPeer;
public class GtkCheckboxPeer extends GtkComponentPeer
@@ -55,6 +56,7 @@
boolean state);
public native void nativeSetCheckboxGroup (GtkCheckboxGroupPeer group);
public native void connectSignals ();
+ public native void gtkSetFont (String name, int style, int size);
public GtkCheckboxPeer (Checkbox c)
{
@@ -82,6 +84,11 @@
public void setLabel (String label)
{
set ("label", label);
+ }
+
+ public void setFont (Font f)
+ {
+ gtkSetFont(f.getName(), f.getStyle(), f.getSize());
}
public void setCheckboxGroup (CheckboxGroup group)
Index: gnu/java/awt/peer/gtk/GtkComponentPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java,v
retrieving revision 1.16
diff -u -r1.16 GtkComponentPeer.java
--- gnu/java/awt/peer/gtk/GtkComponentPeer.java 26 Jan 2004 21:55:41 -0000 1.16
+++ gnu/java/awt/peer/gtk/GtkComponentPeer.java 27 Feb 2004 19:10:36 -0000
@@ -91,6 +91,7 @@
native void gtkWidgetSetCursor (int type);
native void gtkWidgetSetBackground (int red, int green, int blue);
native void gtkWidgetSetForeground (int red, int green, int blue);
+ native void gtkSetFont (String name, int style, int size);
native void gtkWidgetQueueDrawArea(int x, int y, int width, int height);
native void addExposeFilter();
native void removeExposeFilter();
@@ -403,6 +404,7 @@
// FIXME: This should really affect the widget tree below me.
// Currently this is only handled if the call is made directly on
// a text widget, which implements setFont() itself.
+ gtkSetFont(f.getName(), f.getStyle(), f.getSize());
}
public void setForeground (Color c)
Index: gnu/java/awt/peer/gtk/GtkContainerPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java,v
retrieving revision 1.8
diff -u -r1.8 GtkContainerPeer.java
--- gnu/java/awt/peer/gtk/GtkContainerPeer.java 26 Jan 2004 21:55:41 -0000 1.8
+++ gnu/java/awt/peer/gtk/GtkContainerPeer.java 27 Feb 2004 19:10:36 -0000
@@ -42,6 +42,7 @@
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
+import java.awt.Font;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.event.PaintEvent;
@@ -90,6 +91,18 @@
{
super.setBounds (x, y, width, height);
awtComponent.validate ();
+ }
+
+ public void setFont(Font f)
+ {
+ super.setFont(f);
+ Component[] components = ((Container) awtComponent).getComponents();
+ for (int i = 0; i < components.length; i++)
+ {
+ GtkComponentPeer peer = (GtkComponentPeer) components[i].getPeer();
+ if (! peer.awtComponent.isFontSet())
+ peer.setFont(f);
+ }
}
public Graphics getGraphics ()
Index: gnu/java/awt/peer/gtk/GtkLabelPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkLabelPeer.java,v
retrieving revision 1.3
diff -u -r1.3 GtkLabelPeer.java
--- gnu/java/awt/peer/gtk/GtkLabelPeer.java 11 Nov 2003 17:04:46 -0000 1.3
+++ gnu/java/awt/peer/gtk/GtkLabelPeer.java 27 Feb 2004 19:10:36 -0000
@@ -39,28 +39,35 @@
package gnu.java.awt.peer.gtk;
import java.awt.Component;
+import java.awt.Font;
import java.awt.Label;
import java.awt.peer.LabelPeer;
public class GtkLabelPeer extends GtkComponentPeer
implements LabelPeer
{
+ native void create (String text, float alignment);
+ native void gtkSetFont(String name, int style, int size);
+ native void nativeSetAlignment (float alignment);
+
+ native public void setText (String text);
+
void create ()
{
Label label = (Label) awtComponent;
create (label.getText (), getGtkAlignment (label.getAlignment ()));
}
- native void create (String text, float alignment);
-
public GtkLabelPeer (Label l)
{
super (l);
}
- native public void setText (String text);
+ public void setFont (Font f)
+ {
+ gtkSetFont(f.getName(), f.getStyle(), f.getSize());
+ }
- native void nativeSetAlignment (float alignment);
public void setAlignment (int alignment)
{
nativeSetAlignment (getGtkAlignment (alignment));
Index: java/awt/Component.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/Component.java,v
retrieving revision 1.37.2.5
diff -u -r1.37.2.5 Component.java
--- java/awt/Component.java 26 Feb 2004 19:16:45 -0000 1.37.2.5
+++ java/awt/Component.java 27 Feb 2004 19:10:37 -0000
@@ -1037,6 +1037,7 @@
firePropertyChange("font", font, f);
if (peer != null)
peer.setFont(f);
+ invalidate();
font = f;
}
Index: java/awt/Container.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/Container.java,v
retrieving revision 1.34.2.1
diff -u -r1.34.2.1 Container.java
--- java/awt/Container.java 24 Feb 2004 16:16:52 -0000 1.34.2.1
+++ java/awt/Container.java 27 Feb 2004 19:10:37 -0000
@@ -502,6 +502,20 @@
}
/**
+ * Recursively invalidates the container tree.
+ */
+ private void invalidateTree()
+ {
+ for (int i = 0; i < ncomponents; i++)
+ {
+ Component comp = component[i];
+ comp.invalidate();
+ if (comp instanceof Container)
+ ((Container) comp).invalidateTree();
+ }
+ }
+
+ /**
* Recursively validates the container tree, recomputing any invalid
* layouts.
*/
@@ -546,7 +560,10 @@
public void setFont(Font f)
{
super.setFont(f);
- // FIXME, should invalidate all children with font == null
+ // FIXME: Although it might make more sense to invalidate only
+ // those children whose font == null, Sun invalidates all children.
+ // So we'll do the same.
+ invalidateTree();
}
/**
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c,v
retrieving revision 1.5
diff -u -r1.5 gnu_java_awt_peer_gtk_GdkGraphics.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c 12 Feb 2004 00:17:26 -0000 1.5
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c 27 Feb 2004 19:10:38 -0000
@@ -188,7 +188,7 @@
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_drawString
(JNIEnv *env, jobject obj, jstring str, jint x, jint y,
- jstring fname, jint size)
+ jstring fname, jint style, jint size)
{
struct graphics *g;
const char *cstr;
@@ -208,6 +208,12 @@
font_desc = pango_font_description_from_string (font_name);
pango_font_description_set_size (font_desc, size * PANGO_SCALE);
+
+ if (style & AWT_STYLE_BOLD)
+ pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
+
+ if (style & AWT_STYLE_ITALIC)
+ pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE);
context = gdk_pango_context_get();
pango_context_set_font_description (context, font_desc);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c,v
retrieving revision 1.4
diff -u -r1.4 gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c 13 Dec 2003 01:15:47 -0000 1.4
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c 27 Feb 2004 19:10:38 -0000
@@ -164,6 +164,46 @@
NSA_SET_PTR (env, group, native_group);
}
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkSetFont
+ (JNIEnv *env, jobject obj, jstring name, jint style, jint size)
+{
+ const char *font_name;
+ void *ptr;
+ GtkWidget *button;
+ GtkWidget *label;
+ PangoFontDescription *font_desc;
+
+ ptr = NSA_GET_PTR (env, obj);
+
+ button = GTK_WIDGET (ptr);
+ label = gtk_bin_get_child (GTK_BIN(button));
+
+ if (!label)
+ return;
+
+ font_name = (*env)->GetStringUTFChars (env, name, NULL);
+
+ gdk_threads_enter();
+
+ font_desc = pango_font_description_from_string (font_name);
+ pango_font_description_set_size (font_desc, size * PANGO_SCALE);
+
+ if (style & AWT_STYLE_BOLD)
+ pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
+
+ if (style & AWT_STYLE_ITALIC)
+ pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE);
+
+ gtk_widget_modify_font (GTK_WIDGET(label), font_desc);
+
+ pango_font_description_free (font_desc);
+
+ gdk_threads_leave();
+
+ (*env)->ReleaseStringUTFChars (env, name, font_name);
+}
+
static void
item_toggled (GtkToggleButton *item, jobject peer)
{
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c,v
retrieving revision 1.15.2.1
diff -u -r1.15.2.1 gnu_java_awt_peer_gtk_GtkComponentPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 17 Feb 2004 20:00:25 -0000 1.15.2.1
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 27 Feb 2004 19:10:38 -0000
@@ -380,6 +380,39 @@
gdk_threads_leave ();
}
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkSetFont
+ (JNIEnv *env, jobject obj, jstring name, jint style, jint size)
+{
+ const char *font_name;
+ void *ptr;
+ GtkWidget *label;
+ PangoFontDescription *font_desc;
+
+ ptr = NSA_GET_PTR (env, obj);
+
+ font_name = (*env)->GetStringUTFChars (env, name, NULL);
+
+ gdk_threads_enter();
+
+ font_desc = pango_font_description_from_string (font_name);
+ pango_font_description_set_size (font_desc, size * PANGO_SCALE);
+
+ if (style & AWT_STYLE_BOLD)
+ pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
+
+ if (style & AWT_STYLE_ITALIC)
+ pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE);
+
+ gtk_widget_modify_font (GTK_WIDGET(ptr), font_desc);
+
+ pango_font_description_free (font_desc);
+
+ gdk_threads_leave();
+
+ (*env)->ReleaseStringUTFChars (env, name, font_name);
+}
+
void
set_visible (GtkWidget *widget, jboolean visible)
{
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c,v
retrieving revision 1.6
diff -u -r1.6 gnu_java_awt_peer_gtk_GtkLabelPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c 13 Dec 2003 01:15:47 -0000 1.6
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c 27 Feb 2004 19:10:38 -0000
@@ -70,6 +70,44 @@
}
JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkLabelPeer_gtkSetFont
+ (JNIEnv *env, jobject obj, jstring name, jint style, jint size)
+{
+ const char *font_name;
+ void *ptr;
+ GtkWidget *label;
+ PangoFontDescription *font_desc;
+
+ ptr = NSA_GET_PTR (env, obj);
+
+ label = gtk_bin_get_child (GTK_BIN(ptr));
+
+ if (!label)
+ return;
+
+ font_name = (*env)->GetStringUTFChars (env, name, NULL);
+
+ gdk_threads_enter();
+
+ font_desc = pango_font_description_from_string (font_name);
+ pango_font_description_set_size (font_desc, size * PANGO_SCALE);
+
+ if (style & AWT_STYLE_BOLD)
+ pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
+
+ if (style & AWT_STYLE_ITALIC)
+ pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE);
+
+ gtk_widget_modify_font (GTK_WIDGET(label), font_desc);
+
+ pango_font_description_free (font_desc);
+
+ gdk_threads_leave();
+
+ (*env)->ReleaseStringUTFChars (env, name, font_name);
+}
+
+JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkLabelPeer_setText
(JNIEnv *env, jobject obj, jstring text)
{