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]

[PATCH]: awt menubars


Hi,

This patch gets menu bars working. Adding, removing, and frame inset
adjustments. MenuBar's menu "children" are notified corectly in the
addNotify of the parent bar and ditto for the menuitem's menu
"children". The addition/removal of the menu bar to the frame is handled
by two separate methods and the frame's insets are adjusted (to make
room for the bar) on a size allocate event from the menubar.

Cheers,

Kim

2004-01-15  Kim Ho  <kho@redhat.com>
                                                                        
        * gnu/java/awt/peer/gtk/GtkFramePeer.java (getMenuBarHeight):
	Added MenuBarPeer parameter.
        (removeMenuBarPeer): New native method.
        (setMenuBar): Call remove if menu bar is null. Adjust insets
        appropriately.
        (postSizeAllocateEvent): New method. Called when menu bar size
	is allocated. Adjust insets and redo layout.
        (GtkFramePeer): Set menu bar during frame creation.
        (postConfigureEvent): Adjust position and size to accomodate
        menu bar.
        * java/awt/Frame.java (setMenuBar): addNotify to create menu
	bar.
        * java/awt/Menu.java (addSeparator): Don't use static separator.
        (addNotify): Create the peer if it doesn't exist and call
	addNotify for the menu's items.
        * java/awt/MenuBar.java (addNotify): Create this menu bar's
	menus.
        * java/awt/MenuItem.java (addNotify): Create the peer if it
        doesn't exist.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c (gtkInit):
        Add class for gtkFramePeer and methodID for
	postSizeAllocateEvents.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
        (removeMenuBarPeer): New method. Remove menu bar on the current
        frame.
        (setMenuBarPeer): Add the menu bar to the current frame and the
        callback for size-allocate events on the menu bar.
        (getMenuBarHeight): Add menu bar parameter.
        (menubar_resize_cb): New callback method for postSizeAllocate
	events.        
	* jni/gtk-peer/gtkpeer.h: New jmethodID postSizeAllocateEventID.

Index: ChangeLog
===================================================================
RCS file: /cvs/gcc/gcc/libjava/ChangeLog,v
retrieving revision 1.2557
diff -u -r1.2557 ChangeLog
--- ChangeLog	15 Jan 2004 03:41:47 -0000	1.2557
+++ ChangeLog	15 Jan 2004 17:49:17 -0000
@@ -1,3 +1,33 @@
+2004-01-15  Kim Ho  <kho@redhat.com>
+
+	* gnu/java/awt/peer/gtk/GtkFramePeer.java (getMenuBarHeight): Added
+	MenuBarPeer parameter.
+	(removeMenuBarPeer): New native method.
+	(setMenuBar): Call remove if menu bar is null. Adjust insets
+	appropriately.
+	(postSizeAllocateEvent): New method. Called when menu bar size is
+	allocated. Adjust insets and redo layout.
+	(GtkFramePeer): Set menu bar during frame creation.
+	(postConfigureEvent): Adjust position and size to accomodate
+	menu bar.
+	* java/awt/Frame.java (setMenuBar): addNotify to create menu bar.
+	* java/awt/Menu.java (addSeparator): Don't use static separator.
+	(addNotify): Create the peer if it doesn't exist and call addNotify 
+	for the menu's items.
+	* java/awt/MenuBar.java (addNotify): Create this menu bar's menus.
+	* java/awt/MenuItem.java (addNotify): Create the peer if it
+	doesn't exist.
+	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c (gtkInit):
+	Add class for gtkFramePeer and methodID for postSizeAllocateEvents.
+	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
+	(removeMenuBarPeer): New method. Remove menu bar on the current 
+	frame.
+	(setMenuBarPeer): Add the menu bar to the current frame and the 
+	callback for size-allocate events on the menu bar.
+	(getMenuBarHeight): Add menu bar parameter.
+	(menubar_resize_cb): New callback method for postSizeAllocate events.
+	* jni/gtk-peer/gtkpeer.h: New jmethodID postSizeAllocateEventID.
+
 2004-01-14  Kelley Cook  <kcook@gcc.gnu.org>
 
 	* configure.in: Add in AC_PREREQ(2.13)
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.8
diff -u -r1.8 GtkFramePeer.java
--- gnu/java/awt/peer/gtk/GtkFramePeer.java	13 Jan 2004 20:54:46 -0000	1.8
+++ gnu/java/awt/peer/gtk/GtkFramePeer.java	15 Jan 2004 17:49:17 -0000
@@ -1,5 +1,5 @@
 /* GtkFramePeer.java -- Implements FramePeer with GTK
-   Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -53,16 +53,41 @@
     implements FramePeer
 {
   int menuBarHeight = 0;
-  native int getMenuBarHeight ();
+  private MenuBarPeer menuBar;
+  native int getMenuBarHeight (MenuBarPeer bar);
 
   native public void setMenuBarPeer (MenuBarPeer bar);
+  native public void removeMenuBarPeer (MenuBarPeer bar);
 
   public void setMenuBar (MenuBar bar)
   {
-    if (bar == null)
-      setMenuBarPeer (null);
-    else
-      setMenuBarPeer ((MenuBarPeer) bar.getPeer ());
+    if (bar == null && menuBar != null)
+    {    
+      removeMenuBarPeer(menuBar); 
+      menuBar = null;
+      insets.top -= menuBarHeight;
+      menuBarHeight = 0;      
+      awtComponent.doLayout();
+    }
+    else if (bar != null)
+    {
+      if (menuBar != null)
+        removeMenuBarPeer(menuBar);
+      menuBar = (MenuBarPeer) ((MenuBar) bar).getPeer();
+      setMenuBarPeer(menuBar);      
+    }
+  }
+
+  protected void postSizeAllocateEvent()
+  {
+    if (menuBar != null)
+    {
+      if (menuBarHeight != 0)
+        insets.top -= menuBarHeight;
+      menuBarHeight = getMenuBarHeight(menuBar);
+      insets.top += menuBarHeight;
+    }
+    awtComponent.doLayout();
   }
 
   public GtkFramePeer (Frame frame)
@@ -74,6 +99,7 @@
   {
     // Create a normal decorated window.
     create (GDK_WINDOW_TYPE_HINT_NORMAL, true);
+    setMenuBar(((Frame) awtComponent).getMenuBar());
   }
 
   public void getArgs (Component component, GtkArgList args)
@@ -102,10 +128,27 @@
     g.translate (-insets.left, -insets.top);
     return g;
   }
-
-  // FIXME: When MenuBars work, override postConfigureEvent and
-  // setBounds to account for MenuBar dimensions.
-
+  
+  protected void postConfigureEvent (int x, int y, int width, int height)
+  {
+    int frame_x = x - insets.left;
+    int frame_y = y - insets.top + menuBarHeight;
+    int frame_width = width + insets.left + insets.right;
+    int frame_height = height + insets.top + insets.bottom - menuBarHeight;
+    if (frame_x != awtComponent.getX()
+        || frame_y != awtComponent.getY()
+        || frame_width != awtComponent.getWidth()
+        || frame_height != awtComponent.getHeight())
+      {
+        setBoundsCallback ((java.awt.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: java/awt/Frame.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/Frame.java,v
retrieving revision 1.18
diff -u -r1.18 Frame.java
--- java/awt/Frame.java	19 Sep 2003 19:27:58 -0000	1.18
+++ java/awt/Frame.java	15 Jan 2004 17:49:18 -0000
@@ -1,5 +1,5 @@
 /* Frame.java -- AWT toplevel window
-   Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2000, 2002, 2004 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -342,6 +342,8 @@
 setMenuBar(MenuBar menuBar)
 {
   this.menuBar = menuBar;
+  if (menuBar != null)
+    menuBar.addNotify(); 
   if (peer != null)
     ((FramePeer) peer).setMenuBar(menuBar);
 }
Index: java/awt/Menu.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/Menu.java,v
retrieving revision 1.13
diff -u -r1.13 Menu.java
--- java/awt/Menu.java	11 Jun 2003 10:37:47 -0000	1.13
+++ java/awt/Menu.java	15 Jan 2004 17:49:18 -0000
@@ -1,5 +1,5 @@
 /* Menu.java -- A Java AWT Menu
-   Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -294,7 +294,7 @@
 public void
 addSeparator()
 {
-  add(separator);
+  add(new MenuItem("-"));
 }
 
 /*************************************************************************/
@@ -376,8 +376,14 @@
 public void
 addNotify()
 {
-  if (peer != null)
+  if (peer == null)
     peer = getToolkit().createMenu(this);
+  java.util.Enumeration e = items.elements();
+  while (e.hasMoreElements())
+  {
+    MenuItem mi = (MenuItem)e.nextElement();
+    mi.addNotify();
+  }    
   super.addNotify ();
 }
 
Index: java/awt/MenuBar.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/MenuBar.java,v
retrieving revision 1.10
diff -u -r1.10 MenuBar.java
--- java/awt/MenuBar.java	2 Jan 2003 00:14:22 -0000	1.10
+++ java/awt/MenuBar.java	15 Jan 2004 17:49:18 -0000
@@ -1,5 +1,5 @@
 /* MenuBar.java -- An AWT menu bar class
-   Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2000, 2001, 2002, 2004 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -263,6 +263,12 @@
 {
   if (getPeer() == null)
     setPeer((MenuComponentPeer)getToolkit().createMenuBar(this));
+  Enumeration e = menus.elements();
+  while (e.hasMoreElements())
+  {
+    Menu mi = (Menu)e.nextElement();
+    mi.addNotify();
+  }
 }
 
 /*************************************************************************/
Index: java/awt/MenuItem.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/MenuItem.java,v
retrieving revision 1.14
diff -u -r1.14 MenuItem.java
--- java/awt/MenuItem.java	4 Dec 2003 19:31:01 -0000	1.14
+++ java/awt/MenuItem.java	15 Jan 2004 17:49:18 -0000
@@ -1,5 +1,5 @@
 /* MenuItem.java -- An item in a menu
-   Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -361,7 +361,7 @@
 public void
 addNotify()
 {
-  if (peer != null)
+  if (peer == null)
     peer = getToolkit ().createMenuItem (this);
 }
 
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c,v
retrieving revision 1.12
diff -u -r1.12 gnu_java_awt_peer_gtk_GtkMainThread.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c	13 Jan 2004 20:54:46 -0000	1.12
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c	15 Jan 2004 17:49:19 -0000
@@ -1,5 +1,5 @@
 /* gtkmainthread.c -- Native implementation of GtkMainThread
-   Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999, 2002, 2004 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -60,6 +60,7 @@
 jmethodID postListItemEventID;
 jmethodID postTextEventID;
 jmethodID postWindowEventID;
+jmethodID postSizeAllocateEventID;
 
 JNIEnv *gdk_env;
 
@@ -82,7 +83,7 @@
   char *homedir, *rcpath = NULL;
 /*    jclass gtkgenericpeer; */
   jclass gtkcomponentpeer, gtkchoicepeer, gtkwindowpeer, gtkscrollbarpeer, gtklistpeer,
-    gtkmenuitempeer, gtktextcomponentpeer, window;
+    gtkmenuitempeer, gtktextcomponentpeer, window, gtkframepeer;
 
   NSA_INIT (env, clazz);
 
@@ -151,6 +152,8 @@
                                      "gnu/java/awt/peer/gtk/GtkMenuItemPeer");
   gtktextcomponentpeer = (*env)->FindClass (env,
                                      "gnu/java/awt/peer/gtk/GtkTextComponentPeer");
+  gtkframepeer = (*env)->FindClass (env,
+                                    "gnu/java/awt/peer/gtk/GtkFramePeer");
 /*    gdkColor = (*env)->FindClass (env, */
 /*  				"gnu/java/awt/peer/gtk/GdkColor"); */
 /*    gdkColorID = (*env)->GetMethodID (env, gdkColor, "<init>", "(III)V"); */
@@ -193,6 +196,9 @@
   postTextEventID = (*env)->GetMethodID (env, gtktextcomponentpeer,
 					     "postTextEvent",
 					     "()V");
+  postSizeAllocateEventID = (*env)->GetMethodID (env, gtkframepeer,
+                                                 "postSizeAllocateEvent",
+                                                 "()V");
   global_gtk_window_group = gtk_window_group_new ();
 }
 
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c,v
retrieving revision 1.12
diff -u -r1.12 gnu_java_awt_peer_gtk_GtkWindowPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c	13 Jan 2004 20:54:46 -0000	1.12
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c	15 Jan 2004 17:49:19 -0000
@@ -1,5 +1,5 @@
 /* gtkwindowpeer.c -- Native implementation of GtkWindowPeer
-   Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999, 2002, 2004 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -73,6 +73,8 @@
 					    GdkEventProperty *event,
 					    jobject peer);
 
+static void menubar_resize_cb (GtkWidget *widget, GtkAllocation *alloc, jobject peer);
+
 /*
  * Make a new window.
  */
@@ -358,45 +360,61 @@
 }
 
 JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkFramePeer_setMenuBarPeer
+Java_gnu_java_awt_peer_gtk_GtkFramePeer_removeMenuBarPeer
   (JNIEnv *env, jobject obj, jobject menubar)
 {
-  void *wptr, *mptr;
-  GtkBox *box;
+  void *wptr;
+  GtkWidget *box;
+  GtkWidget *mptr;
 
-  if (!menubar) return;
+  wptr = NSA_GET_PTR (env, obj);
+  mptr = NSA_GET_PTR (env, menubar);
+  
+  gdk_threads_enter ();
 
+  box = GTK_BIN (wptr)->child;
+  gtk_container_remove (GTK_CONTAINER (box), GTK_WIDGET (mptr));  
+  
+  gdk_threads_leave();
+}  
+  
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkFramePeer_setMenuBarPeer
+  (JNIEnv *env, jobject obj, jobject menubar)
+{
+  void *wptr;
+  GtkWidget *mptr;
+  GtkWidget *box;
+  jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
+  
   wptr = NSA_GET_PTR (env, obj);
   mptr = NSA_GET_PTR (env, menubar);
+  
+  gdk_threads_enter ();
 
-  if (!mptr) return; /* this case should remove a menu */
+  g_signal_connect (G_OBJECT (mptr), "size-allocate", 
+                    G_CALLBACK (menubar_resize_cb), *gref);    
+  box = GTK_BIN (wptr)->child;		    
+  gtk_box_pack_start (GTK_BOX (box), mptr, 0, 0, 0);
+ 
+  gtk_widget_show (mptr);
 
-  gdk_threads_enter ();
-  box = GTK_BOX (GTK_BIN (wptr)->child);
-  gtk_box_pack_start (box, GTK_WIDGET (mptr), 0, 0, 0);
+ 
   gdk_threads_leave ();
 }
 
 JNIEXPORT jint JNICALL
 Java_gnu_java_awt_peer_gtk_GtkFramePeer_getMenuBarHeight
-  (JNIEnv *env, jobject obj)
+  (JNIEnv *env, jobject obj, jobject menubar)
 {
-  void *ptr;
-  GList *children;
-  jint height = 0;
-
-  ptr = NSA_GET_PTR (env, obj);
+  GtkWidget *ptr;
+  jint height;
+  
+  ptr = NSA_GET_PTR (env, menubar);
 
   gdk_threads_enter ();
-  children = gtk_container_children (GTK_CONTAINER (GTK_BIN (ptr)->child));
-  if (g_list_length (children) == 2)
-    {
-      GtkWidget *menubar = GTK_WIDGET (children->data);
-      height = menubar->allocation.height;
-
-    }
+  height = ptr->allocation.height;
   gdk_threads_leave ();
-
   return height;
 }
 
@@ -696,4 +714,12 @@
 				(jint) extents[1]); /* right */
 
   return FALSE;
+}
+
+static void menubar_resize_cb (GtkWidget *widget, GtkAllocation *alloc, jobject peer)
+{
+  gdk_threads_leave();
+  (*gdk_env)->CallVoidMethod (gdk_env, peer,
+                              postSizeAllocateEventID);
+  gdk_threads_enter();
 }
Index: jni/gtk-peer/gtkpeer.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gtkpeer.h,v
retrieving revision 1.12
diff -u -r1.12 gtkpeer.h
--- jni/gtk-peer/gtkpeer.h	23 Dec 2003 19:24:00 -0000	1.12
+++ jni/gtk-peer/gtkpeer.h	15 Jan 2004 17:49:19 -0000
@@ -1,5 +1,5 @@
 /* gtkpeer.h -- Some global variables and #defines
-   Copyright (C) 1998, 1999 Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999, 2004 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -400,6 +400,7 @@
 extern jmethodID postListItemEventID;
 extern jmethodID postTextEventID;
 extern jmethodID postWindowEventID;
+extern jmethodID postSizeAllocateEventID;
 
 extern jmethodID syncAttrsID;
 extern jclass gdkColor;

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