This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[gui] [PATCH] FYI: Setting fonts in peers


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)
 {

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]