This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[gui][PATCH] AWT menu fixes
- From: Thomas Fitzsimmons <fitzsim at redhat dot com>
- To: java-patches at gcc dot gnu dot org
- Date: Tue, 07 Sep 2004 22:15:50 -0400
- Subject: [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);