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] AWT menu fixes


Hi,

This patch fixes some AWT menu problems:

- menu bars weren't expanding to the full width of the window

- setting a menu item's font didn't work

- CheckboxMenuItems showed up as normal MenuItems

I committed this to java-gui-branch.

Tom

2004-09-07  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* gnu/java/awt/peer/gtk/GtkButtonPeer.java (gtkWidgetSetFont):
	Rename ...
	(gtkWidgetModifyFont): New method.
	* gnu/java/awt/peer/gtk/GtkFramePeer.java,
	jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c
	(setMenuBarWidth): New method.
	(setBounds): Set the menu bar width.
	(postConfigureEvent): Set the menu bar width if the window's
	width has changed.
	* gnu/java/awt/peer/gtk/GtkMenuBarPeer.java (GtkMenuBarPeer):
	Don't call create.
	(setFont): New method.
	* gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java (create): New
	method.
	(setFont): Likewise.
	(GtkMenuComponentPeer): Call create and setFont.
	* gnu/java/awt/peer/gtk/GtkMenuItemPeer.java,
	jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c
	(connectSignals): Make package private.
	(gtkWidgetModifyFont): New method.
	(create): Likewise.
	(GtkMenuItemPeer): Don't call create.
	(setFont): New method.
	* java/awt/CheckboxMenuItem.java (addNotify): Fix peer == null
	condition.
	* java/awt/Container.java (validateTree): Fix comment typos.
	* java/awt/MenuComponent.java (getFont): Return parent's font if
	our font is null.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c
	(create): Remove call to deprecated
	gtk_check_menu_item_set_show_toggle function.

Index: gnu/java/awt/peer/gtk/GtkButtonPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java,v
retrieving revision 1.8.2.6
diff -u -r1.8.2.6 GtkButtonPeer.java
--- gnu/java/awt/peer/gtk/GtkButtonPeer.java	2 Sep 2004 21:26:21 -0000	1.8.2.6
+++ gnu/java/awt/peer/gtk/GtkButtonPeer.java	8 Sep 2004 02:07:37 -0000
@@ -54,7 +54,7 @@
 
   public native void connectSignals ();
 
-  native void gtkWidgetSetFont (String name, int style, int size);
+  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 gtkActivate ();
Index: gnu/java/awt/peer/gtk/GtkFramePeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java,v
retrieving revision 1.17.2.7
diff -u -r1.17.2.7 GtkFramePeer.java
--- gnu/java/awt/peer/gtk/GtkFramePeer.java	7 Sep 2004 19:39:35 -0000	1.17.2.7
+++ gnu/java/awt/peer/gtk/GtkFramePeer.java	8 Sep 2004 02:07:37 -0000
@@ -58,16 +58,16 @@
   private int menuBarHeight;
   private MenuBarPeer menuBar;
   native int getMenuBarHeight (MenuBarPeer bar);
+  native void setMenuBarWidth (MenuBarPeer bar, int width);
+  native void setMenuBarPeer (MenuBarPeer bar);
+  native void removeMenuBarPeer ();
+  native void gtkFixedSetVisible (boolean visible);
 
   int getMenuBarHeight ()
   {
     return menuBar == null ? 0 : getMenuBarHeight (menuBar);
   }
 
-  native void setMenuBarPeer (MenuBarPeer bar);
-  native void removeMenuBarPeer ();
-  native void gtkFixedSetVisible (boolean visible);
-
   public void setMenuBar (MenuBar bar)
   {
     if (bar == null && menuBar != null)
@@ -112,6 +112,9 @@
 
   public void setBounds (int x, int y, int width, int height)
   {
+    if (menuBar != null)
+      setMenuBarWidth (menuBar, width - insets.left - insets.right);
+
     nativeSetBounds (x, y,
 		     width - insets.left - insets.right,
 		     height - insets.top - insets.bottom
@@ -216,15 +219,19 @@
         || frame_width != awtComponent.getWidth()
         || frame_height != awtComponent.getHeight())
       {
+        if (frame_width != awtComponent.getWidth() && menuBar != null)
+          setMenuBarWidth (menuBar, width);
+
         setBoundsCallback ((Window) awtComponent,
                            frame_x,
                            frame_y,
                            frame_width,
                            frame_height);
       }
+
     awtComponent.validate();
   }
-  
+
   protected void postMouseEvent(int id, long when, int mods, int x, int y, 
 				int clickCount, boolean popupTrigger)
   {
Index: gnu/java/awt/peer/gtk/GtkMenuBarPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkMenuBarPeer.java,v
retrieving revision 1.2.18.1
diff -u -r1.2.18.1 GtkMenuBarPeer.java
--- gnu/java/awt/peer/gtk/GtkMenuBarPeer.java	24 Aug 2004 15:16:49 -0000	1.2.18.1
+++ gnu/java/awt/peer/gtk/GtkMenuBarPeer.java	8 Sep 2004 02:07:37 -0000
@@ -38,8 +38,10 @@
 
 package gnu.java.awt.peer.gtk;
 
+import java.awt.Font;
 import java.awt.Menu;
 import java.awt.MenuBar;
+import java.awt.MenuComponent;
 import java.awt.peer.MenuBarPeer;
 import java.awt.peer.MenuPeer;
 
@@ -53,7 +55,15 @@
   public GtkMenuBarPeer (MenuBar target)
   {
     super (target);
-    create ();
+  }
+
+  void setFont ()
+  {
+    MenuComponent mc = (MenuComponent) awtWidget;
+    Font f = mc.getFont ();
+
+    if (f == null)
+      mc.setFont (new Font ("Dialog", Font.PLAIN, 12));
   }
 
   native void nativeSetHelpMenu(MenuPeer menuPeer);
Index: gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java,v
retrieving revision 1.3.2.1
diff -u -r1.3.2.1 GtkMenuComponentPeer.java
--- gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java	2 Sep 2004 21:26:21 -0000	1.3.2.1
+++ gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java	8 Sep 2004 02:07:37 -0000
@@ -45,18 +45,20 @@
 public class GtkMenuComponentPeer extends GtkGenericPeer
   implements MenuComponentPeer
 {
+  void create ()
+  {
+    throw new RuntimeException ();
+  }
+
+  void setFont ()
+  {
+  }
+
   public GtkMenuComponentPeer (Object awtWidget)
   {
     super (awtWidget);
-    MenuComponent mc = ((MenuComponent) awtWidget);
-    Font f = mc.getFont ();
-    if (f == null)
-      {
-        mc.setFont (new Font ("Dialog", Font.PLAIN, 12));
-        gtkWidgetModifyFont("Dialog", Font.PLAIN, 12);
-      }
-    else
-      gtkWidgetModifyFont(f.getName(), f.getStyle(), f.getSize());
+    create ();
+    setFont ();
   }
 
   public native void dispose();
Index: gnu/java/awt/peer/gtk/GtkMenuItemPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java,v
retrieving revision 1.3.16.3
diff -u -r1.3.16.3 GtkMenuItemPeer.java
--- gnu/java/awt/peer/gtk/GtkMenuItemPeer.java	24 Aug 2004 17:53:59 -0000	1.3.16.3
+++ gnu/java/awt/peer/gtk/GtkMenuItemPeer.java	8 Sep 2004 02:07:37 -0000
@@ -38,9 +38,11 @@
 
 package gnu.java.awt.peer.gtk;
 
+import java.awt.Font;
 import java.awt.Menu;
 import java.awt.MenuBar;
 import java.awt.MenuItem;
+import java.awt.MenuComponent;
 import java.awt.peer.MenuItemPeer;
 import java.awt.peer.MenuComponentPeer;
 import java.awt.peer.MenuBarPeer;
@@ -50,12 +52,17 @@
   implements MenuItemPeer
 {
   native void create (String label);
-  public native void connectSignals ();
+  native void connectSignals ();
+  native void gtkWidgetModifyFont (String name, int style, int size);
+
+  void create ()
+  {
+    create (((MenuItem) awtWidget).getLabel());
+  }
 
   public GtkMenuItemPeer (MenuItem item)
   {
     super (item);
-    create (item.getLabel ());
     setEnabled (item.isEnabled ());
     setParent (item);
 
@@ -63,6 +70,21 @@
       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: java/awt/CheckboxMenuItem.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/CheckboxMenuItem.java,v
retrieving revision 1.9
diff -u -r1.9 CheckboxMenuItem.java
--- java/awt/CheckboxMenuItem.java	5 Jun 2003 19:58:39 -0000	1.9
+++ java/awt/CheckboxMenuItem.java	8 Sep 2004 02:07:38 -0000
@@ -198,12 +198,9 @@
 public synchronized void
 addNotify()
 {
-  if (peer != null)
-    {
-      // This choice of toolkit seems unsatisfying, but I'm not sure
-      // what else to do.
-      peer = getToolkit().createCheckboxMenuItem(this);
-    }
+  if (peer == null)
+    peer = getToolkit().createCheckboxMenuItem(this);
+
   super.addNotify ();
 }
 
Index: java/awt/Container.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/Container.java,v
retrieving revision 1.34.2.19
diff -u -r1.34.2.19 Container.java
--- java/awt/Container.java	2 Sep 2004 21:26:22 -0000	1.34.2.19
+++ java/awt/Container.java	8 Sep 2004 02:07:38 -0000
@@ -572,8 +572,8 @@
       }
 
     /* children will call invalidate() when they are layed out. It
-       is therefore imporant that valid is not set to true
-       before after the children has been layed out. */
+       is therefore important that valid is not set to true
+       until after the children have been layed out. */
     valid = true;
 
     if (cPeer != null)
Index: java/awt/MenuComponent.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/MenuComponent.java,v
retrieving revision 1.13
diff -u -r1.13 MenuComponent.java
--- java/awt/MenuComponent.java	16 Dec 2003 20:08:01 -0000	1.13
+++ java/awt/MenuComponent.java	8 Sep 2004 02:07:38 -0000
@@ -117,7 +117,13 @@
 public Font
 getFont()
 {
-  return(font);
+  if (font != null)
+    return font;
+
+  if (parent != null)
+    return parent.getFont ();
+
+  return null;
 }
 
 /*************************************************************************/
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c,v
retrieving revision 1.2.8.1
diff -u -r1.2.8.1 gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c	24 Jun 2004 05:31:39 -0000	1.2.8.1
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c	8 Sep 2004 02:07:38 -0000
@@ -46,7 +46,6 @@
   GtkWidget *widget;
   const char *str;
 
-  /* Create global reference and save it for future use */
   NSA_SET_GLOBAL_REF (env, obj);
 
   str = (*env)->GetStringUTFChars (env, label, NULL);
@@ -54,7 +53,6 @@
   gdk_threads_enter ();
   
   widget = gtk_check_menu_item_new_with_label (str);
-  gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (widget), 1);
   gtk_widget_show (widget);
 
   gdk_threads_leave ();
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/Attic/gnu_java_awt_peer_gtk_GtkFramePeer.c,v
retrieving revision 1.1.2.2
diff -u -r1.1.2.2 gnu_java_awt_peer_gtk_GtkFramePeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c	7 Sep 2004 19:39:35 -0000	1.1.2.2
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c	8 Sep 2004 02:07:38 -0000
@@ -113,6 +113,28 @@
 }
 
 JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkFramePeer_setMenuBarWidth
+  (JNIEnv *env, jobject obj __attribute__((unused)), jobject menubar, jint width)
+{
+  GtkWidget *ptr;
+  GtkRequisition natural_req;
+
+  ptr = NSA_GET_PTR (env, menubar);
+
+  gdk_threads_enter ();
+
+  /* Get the menubar's natural size request. */
+  gtk_widget_set_size_request (GTK_WIDGET (ptr), -1, -1);
+  gtk_widget_size_request (GTK_WIDGET (ptr), &natural_req);
+
+  /* Set the menubar's size request to width by natural_req.height. */
+  gtk_widget_set_size_request (GTK_WIDGET (ptr),
+                               width, natural_req.height);
+
+  gdk_threads_leave ();
+}
+
+JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GtkFramePeer_gtkFixedSetVisible
   (JNIEnv *env, jobject obj, jboolean visible)
 {
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c,v
retrieving revision 1.2.8.2
diff -u -r1.2.8.2 gnu_java_awt_peer_gtk_GtkMenuBarPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c	24 Aug 2004 15:16:51 -0000	1.2.8.2
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c	8 Sep 2004 02:07:38 -0000
@@ -44,7 +44,6 @@
 {
   GtkWidget *widget;
 
-  /* Create global reference and save it for future use */
   NSA_SET_GLOBAL_REF (env, obj);
 
   gdk_threads_enter ();
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c,v
retrieving revision 1.4.8.2
diff -u -r1.4.8.2 gnu_java_awt_peer_gtk_GtkMenuItemPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c	24 Aug 2004 17:54:00 -0000	1.4.8.2
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c	8 Sep 2004 02:07:38 -0000
@@ -49,7 +49,6 @@
   GtkWidget *widget;
   const char *str;
 
-  /* Create global reference and save it for future use */
   NSA_SET_GLOBAL_REF (env, obj);
 
   str = (*env)->GetStringUTFChars (env, label, NULL);
@@ -86,6 +85,41 @@
   gdk_threads_leave ();
 }
 
+JNIEXPORT void JNICALL 
+Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_gtkWidgetModifyFont
+  (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();
+
+  label = gtk_bin_get_child (GTK_BIN (ptr));
+
+  font_desc = pango_font_description_from_string (font_name);
+  pango_font_description_set_size (font_desc, size * 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(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_GtkMenuItemPeer_setEnabled
   (JNIEnv *env, jobject obj, jboolean enabled)
 {
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c,v
retrieving revision 1.4.8.6
diff -u -r1.4.8.6 gnu_java_awt_peer_gtk_GtkMenuPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c	30 Jul 2004 13:59:19 -0000	1.4.8.6
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c	8 Sep 2004 02:07:38 -0000
@@ -73,7 +73,6 @@
   GtkWidget *menu_title, *menu, *toplevel;
   const char *str;
 
-  /* Create global reference and save it for future use */
   NSA_SET_GLOBAL_REF (env, obj);
 
   str = (*env)->GetStringUTFChars (env, label, NULL);

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