Hi,

To better understand the gtk+ peers I documented GtkGenericPeer a little
to make it more clear what should be overridden and why. I also cleaned
up the setting of fonts of the Menu peers so they look better even when
the user has set a custom (font) theme. While documenting this change I
also noticed that the GtkTextFieldPeer was using a custom way to set the
widget font which was similar to what was already done by
GtkGenericPeer.

2006-02-13  Mark Wielaard  <[EMAIL PROTECTED]>

   * gnu/java/awt/peer/gtk/GtkGenericPeer.java (awtWidget): Made field
   final.
   (gtkWidgetModifyFont(Font)): New protected helper method.
   (gtkWidgetModifyFont(String,int,int)): Made protected and document.
   * gnu/java/awt/peer/gtk/GtkButtonPeer.java (gtkWidgetModifyFont):
   Made protected and document.
   * gnu/java/awt/peer/gtk/GtkCheckboxPeer.java (gtkWidgetModifyFont):
   Likewise.
   * gnu/java/awt/peer/gtk/GtkLabelPeer.java (gtkWidgetModifyFont):
   Likewise.
   * gnu/java/awt/peer/gtk/GtkListPeer.java (gtkWidgetModifyFont):
   Likewise.
   * gnu/java/awt/peer/gtk/GtkMenuBarPeer.java (create): Made protected.
   (setFont): Removed method. Done in GtkMenuComponent.
   * gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java (create): Made
   abstract and protected.
   (setFont): Made private, add implementation.
   (setFont(Font)): Implemented.
   * gnu/java/awt/peer/gtk/GtkMenuItemPeer.java (gtkWidgetModifyFont):
   Made protected and document.
   (create): Made protected.
   (setFont): Removed method. Done in GtkMenuComponent.
   * gnu/java/awt/peer/gtk/GtkTextAreaPeer.java
   (gtkWidgetModifyFont): Made protected and document.
   * gnu/java/awt/peer/gtk/GtkTextFieldPeer.java (gtkWidgetModifyFont):
   Removed, similar to GtkGenericPeer super class implementation.
   * include/gnu_java_awt_peer_gtk_GtkTextFieldPeer.h: Regenerated.
   * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
   (Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkWidgetModifyFont):
   Removed.

Comments? OK to commit?

Tested against the vte and some local test programs on both menus and
textfields to make sure fonts are handles correctly.

Thanks,

Mark
Index: include/gnu_java_awt_peer_gtk_GtkTextFieldPeer.h
===================================================================
RCS file: /cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkTextFieldPeer.h,v
retrieving revision 1.11
diff -u -r1.11 gnu_java_awt_peer_gtk_GtkTextFieldPeer.h
--- include/gnu_java_awt_peer_gtk_GtkTextFieldPeer.h	4 Jul 2005 23:56:36 -0000	1.11
+++ include/gnu_java_awt_peer_gtk_GtkTextFieldPeer.h	13 Feb 2006 15:18:59 -0000
@@ -23,7 +23,6 @@
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setEditable (JNIEnv *env, jobject, jboolean);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setText (JNIEnv *env, jobject, jstring);
 JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkEntryGetBorderWidth (JNIEnv *env, jobject);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkWidgetModifyFont (JNIEnv *env, jobject, jstring, jint, jint);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setEchoChar (JNIEnv *env, jobject, jchar);
 
 #ifdef __cplusplus
Index: gnu/java/awt/peer/gtk/GtkButtonPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkButtonPeer.java,v
retrieving revision 1.39
diff -u -r1.39 GtkButtonPeer.java
--- gnu/java/awt/peer/gtk/GtkButtonPeer.java	15 Aug 2005 04:14:29 -0000	1.39
+++ gnu/java/awt/peer/gtk/GtkButtonPeer.java	13 Feb 2006 15:18:59 -0000
@@ -1,5 +1,5 @@
 /* GtkButtonPeer.java -- Implements ButtonPeer with GTK
-   Copyright (C) 1998, 1999, 2004  Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999, 2004, 2006  Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -57,7 +57,10 @@
 
   public native void connectSignals ();
 
-  native void gtkWidgetModifyFont (String name, int style, int size);
+  /**
+   * Overridden to set Font of Label inside Button inside EventBox.
+   */
+  protected native void gtkWidgetModifyFont(String name, int style, int size);
   native void gtkSetLabel (String label);
   native void gtkWidgetSetForeground (int red, int green, int blue);
   native void gtkWidgetSetBackground (int red, int green, int blue);
Index: gnu/java/awt/peer/gtk/GtkCheckboxPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java,v
retrieving revision 1.22
diff -u -r1.22 GtkCheckboxPeer.java
--- gnu/java/awt/peer/gtk/GtkCheckboxPeer.java	18 Aug 2005 01:22:00 -0000	1.22
+++ gnu/java/awt/peer/gtk/GtkCheckboxPeer.java	13 Feb 2006 15:18:59 -0000
@@ -1,5 +1,5 @@
 /* GtkCheckboxPeer.java -- Implements CheckboxPeer with GTK
-   Copyright (C) 1998, 1999, 2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999, 2002, 2003, 2006 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -54,7 +54,11 @@
   public native void create (GtkCheckboxGroupPeer group);
   public native void nativeSetCheckboxGroup (GtkCheckboxGroupPeer group);
   public native void connectSignals ();
-  native void gtkWidgetModifyFont (String name, int style, int size);
+
+  /**
+   * Overridden to set Font of label inside button.
+   */
+  protected native void gtkWidgetModifyFont(String name, int style, int size);
   native void gtkButtonSetLabel (String label);
   native void gtkToggleButtonSetActive (boolean is_active);
 
Index: gnu/java/awt/peer/gtk/GtkGenericPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkGenericPeer.java,v
retrieving revision 1.18
diff -u -r1.18 GtkGenericPeer.java
--- gnu/java/awt/peer/gtk/GtkGenericPeer.java	12 Feb 2006 11:40:04 -0000	1.18
+++ gnu/java/awt/peer/gtk/GtkGenericPeer.java	13 Feb 2006 15:18:59 -0000
@@ -1,5 +1,5 @@
 /* GtkGenericPeer.java - Has a hashcode.  Yuck.
-   Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999, 2002, 2006 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -39,20 +39,28 @@
 package gnu.java.awt.peer.gtk;
 
 import java.awt.EventQueue;
+import java.awt.Font;
 import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
 
 public class GtkGenericPeer
 {
+  // Used by Native State Association (NSA) functions to map
+  // gtk_widget to peer object.
   final int native_state = getUniqueInteger ();
 
   // Next native state value we will assign.
   private static int next_native_state = 0;
 
   // The widget or other java-side object we wrap.
-  protected Object awtWidget;
+  protected final Object awtWidget;
 
-  // Dispose of our native state.
+  /**
+   * Dispose of our native state.  Calls gtk_widget_destroy on the
+   * native widget and removes the awtWidget from the native state
+   * tables. Should be overridden by subclasses if this is not (all)
+   * that needs to be done.
+   */
   public native void dispose ();
 
   static EventQueue q ()
@@ -79,8 +87,20 @@
     // Let's assume this will never wrap.
     return next_native_state++;
   }
+  
+  /**
+   * Helper method to set Font for Gtk Widget.
+   */
+  protected void gtkWidgetModifyFont(Font f)
+  {
+    gtkWidgetModifyFont(f.getName(), f.getStyle(), f.getSize());
+  }
 
-  native void gtkWidgetModifyFont (String name, int style, int size);
+  /**
+   * Sets font for this Gtk Widget. Should be overridden by peers which
+   * are composed of different widgets or are contained in bins.
+   */
+  protected native void gtkWidgetModifyFont(String name, int style, int size);
 
   static void printCurrentThread ()
   {
Index: gnu/java/awt/peer/gtk/GtkLabelPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkLabelPeer.java,v
retrieving revision 1.24
diff -u -r1.24 GtkLabelPeer.java
--- gnu/java/awt/peer/gtk/GtkLabelPeer.java	12 Aug 2005 22:49:42 -0000	1.24
+++ gnu/java/awt/peer/gtk/GtkLabelPeer.java	13 Feb 2006 15:18:59 -0000
@@ -1,5 +1,5 @@
 /* GtkLabelPeer.java -- Implements LabelPeer with GTK
-   Copyright (C) 1998, 1999, 2005  Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999, 2005, 2006  Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -48,7 +48,12 @@
     implements LabelPeer
 {
   native void create (String text, float alignment);
-  native void gtkWidgetModifyFont (String name, int style, int size);
+
+  /**
+   * Overridden to set the Font of the label inside the gtk_event_box.
+   */
+  protected native void gtkWidgetModifyFont(String name, int style, int size);
+
   native void nativeSetAlignment (float alignment);
 
   public native void setText(String text);
Index: gnu/java/awt/peer/gtk/GtkListPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkListPeer.java,v
retrieving revision 1.21
diff -u -r1.21 GtkListPeer.java
--- gnu/java/awt/peer/gtk/GtkListPeer.java	2 Jul 2005 20:32:12 -0000	1.21
+++ gnu/java/awt/peer/gtk/GtkListPeer.java	13 Feb 2006 15:18:59 -0000
@@ -1,5 +1,5 @@
 /* GtkListPeer.java -- Implements ListPeer with GTK
-   Copyright (C) 1998, 1999 Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999, 2006 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -59,7 +59,12 @@
 
   native void create (int rows);
   native void connectSignals ();
-  native void gtkWidgetModifyFont (String name, int style, int size);
+
+  /**
+   * Overridden to set the Font of the text insode the gtk_scrolled_window.
+   */
+  protected native void gtkWidgetModifyFont (String name, int style, int size);
+
   native void gtkWidgetRequestFocus ();
 
   native void getSize (int rows, int visibleRows, int dims[]);
Index: gnu/java/awt/peer/gtk/GtkMenuBarPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkMenuBarPeer.java,v
retrieving revision 1.11
diff -u -r1.11 GtkMenuBarPeer.java
--- gnu/java/awt/peer/gtk/GtkMenuBarPeer.java	13 Aug 2005 00:34:31 -0000	1.11
+++ gnu/java/awt/peer/gtk/GtkMenuBarPeer.java	13 Feb 2006 15:18:59 -0000
@@ -1,5 +1,5 @@
 /* GtkMenuBarPeer.java -- Implements MenuBarPeer with GTK+
-   Copyright (C) 1999, 2005  Free Software Foundation, Inc.
+   Copyright (C) 1999, 2005, 2006  Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -49,7 +49,7 @@
   implements MenuBarPeer
 {
 
-  native void create ();
+  protected native void create ();
   native void addMenu (MenuPeer menu);
 
   public GtkMenuBarPeer (MenuBar target)
@@ -57,15 +57,6 @@
     super (target);
   }
 
-  void setFont ()
-  {
-    MenuComponent mc = (MenuComponent) awtWidget;
-    Font f = mc.getFont ();
-
-    if (f == null)
-      mc.setFont (new Font ("Dialog", Font.PLAIN, 12));
-  }
-
   // FIXME: remove this method or replace it with one that does
   // something useful.
   /* In Gnome, help menus are no longer right flushed. */
Index: gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java,v
retrieving revision 1.11
diff -u -r1.11 GtkMenuComponentPeer.java
--- gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java	19 Aug 2005 01:29:26 -0000	1.11
+++ gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java	13 Feb 2006 15:18:59 -0000
@@ -1,5 +1,5 @@
 /* GtkMenuComponentPeer.java -- Implements MenuComponentPeer with GTK+
-   Copyright (C) 1999 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2006 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -39,18 +39,35 @@
 package gnu.java.awt.peer.gtk;
 
 import java.awt.Font;
+import java.awt.MenuComponent;
+import java.awt.MenuContainer;
 import java.awt.peer.MenuComponentPeer;
 
-public class GtkMenuComponentPeer extends GtkGenericPeer
+public abstract class GtkMenuComponentPeer extends GtkGenericPeer
   implements MenuComponentPeer
 {
-  void create ()
-  {
-    throw new RuntimeException ();
-  }
+  protected abstract void create ();
 
-  void setFont ()
+  /**
+   * Sets font based on MenuComponent font, or containing menu(bar)
+   * parent font.
+   */
+  private void setFont()
   {
+    MenuComponent mc = ((MenuComponent) awtWidget);
+    Font f = mc.getFont ();
+    
+    if (f == null)
+      {
+        MenuContainer parent = mc.getParent ();
+	// Submenus inherit the font of their containing Menu(Bar).
+	if (parent instanceof MenuComponent)
+	  f = parent.getFont ();
+      }
+    if (f != null)
+      {
+	gtkWidgetModifyFont(f);
+      }
   }
 
   public GtkMenuComponentPeer (Object awtWidget)
@@ -60,10 +77,15 @@
     setFont ();
   }
 
+  /**
+   * Removes the awtWidget components from the native state tables.
+   * Subclasses should call <code>super.dispose()</code> if they don't
+   * remove these themselves.
+   */
   public native void dispose();
 
   public void setFont(Font font)
   {
-  // FIXME: implement  
+    gtkWidgetModifyFont(font);
   }
 }
Index: gnu/java/awt/peer/gtk/GtkMenuItemPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java,v
retrieving revision 1.16
diff -u -r1.16 GtkMenuItemPeer.java
--- gnu/java/awt/peer/gtk/GtkMenuItemPeer.java	2 Jul 2005 20:32:12 -0000	1.16
+++ gnu/java/awt/peer/gtk/GtkMenuItemPeer.java	13 Feb 2006 15:18:59 -0000
@@ -1,5 +1,5 @@
 /* GtkMenuItemPeer.java -- Implements MenuItemPeer with GTK+
-   Copyright (C) 1999, 2005  Free Software Foundation, Inc.
+   Copyright (C) 1999, 2005, 2006  Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -51,9 +51,13 @@
 {
   native void create (String label);
   native void connectSignals ();
-  native void gtkWidgetModifyFont (String name, int style, int size);
 
-  void create ()
+  /**
+   * Overridden to set font on menu item label.
+   */
+  protected native void gtkWidgetModifyFont(String name, int style, int size);
+
+  protected void create()
   {
     create (((MenuItem) awtWidget).getLabel());
   }
@@ -68,21 +72,6 @@
       connectSignals();
   }
 
-  void setFont ()
-  {
-    MenuComponent mc = ((MenuComponent) awtWidget);
-    Font f = mc.getFont ();
-
-    if (f == null)
-      {
-        MenuComponent parent = (MenuComponent) mc.getParent ();
-        Font pf = parent.getFont ();
-        gtkWidgetModifyFont (pf.getName (), pf.getStyle (), pf.getSize ());
-      }
-    else
-      gtkWidgetModifyFont(f.getName(), f.getStyle(), f.getSize());
-  }
-
   void setParent (MenuItem item)
   {
     // add ourself differently, based on what type of parent we have
Index: gnu/java/awt/peer/gtk/GtkTextAreaPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkTextAreaPeer.java,v
retrieving revision 1.26
diff -u -r1.26 GtkTextAreaPeer.java
--- gnu/java/awt/peer/gtk/GtkTextAreaPeer.java	19 Aug 2005 01:29:26 -0000	1.26
+++ gnu/java/awt/peer/gtk/GtkTextAreaPeer.java	13 Feb 2006 15:18:59 -0000
@@ -55,7 +55,11 @@
 
   native void create (int width, int height, int scrollbarVisibility);
 
-  native void gtkWidgetModifyFont (String name, int style, int size);
+  /**
+   * Overridden to set Font for text widget inside scrolled window.
+   */
+  protected native void gtkWidgetModifyFont(String name, int style, int size);
+
   native void gtkWidgetRequestFocus ();
 
   public native void connectSignals ();
Index: gnu/java/awt/peer/gtk/GtkTextFieldPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java,v
retrieving revision 1.31
diff -u -r1.31 GtkTextFieldPeer.java
--- gnu/java/awt/peer/gtk/GtkTextFieldPeer.java	19 Aug 2005 01:29:26 -0000	1.31
+++ gnu/java/awt/peer/gtk/GtkTextFieldPeer.java	13 Feb 2006 15:18:59 -0000
@@ -112,8 +112,6 @@
 
   native int gtkEntryGetBorderWidth ();
 
-  native void gtkWidgetModifyFont (String name, int style, int size);
-
   public GtkTextFieldPeer (TextField tf)
   {
     super (tf);
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c,v
retrieving revision 1.23
diff -u -r1.23 gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c	18 Aug 2005 01:22:00 -0000	1.23
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c	13 Feb 2006 15:18:59 -0000
@@ -224,39 +224,6 @@
   gdk_threads_leave ();
 }
 
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkWidgetModifyFont
-  (JNIEnv *env, jobject obj, jstring name, jint style, jint size)
-{
-  const char *font_name;
-  void *ptr;
-  PangoFontDescription *font_desc;
-
-  gdk_threads_enter();
-
-  ptr = NSA_GET_PTR (env, obj);
-
-  font_name = (*env)->GetStringUTFChars (env, name, NULL);
-
-  font_desc = pango_font_description_from_string (font_name);
-  pango_font_description_set_size (font_desc,
-                                   size * cp_gtk_dpi_conversion_factor);
-
-  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);
-
-  (*env)->ReleaseStringUTFChars (env, name, font_name);
-
-  gdk_threads_leave();
-}
-
 JNIEXPORT jint JNICALL 
 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_getCaretPosition
   (JNIEnv *env, jobject obj)

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to