From e300e74f17fecbb6c2e81857e76ad73b90c4e0eb Mon Sep 17 00:00:00 2001 From: Kim Ho Date: Tue, 27 Jan 2004 19:29:57 +0000 Subject: [PATCH] 2004-01-27 Kim Ho * gnu/java/awt/peer/gtk/GtkFramePeer.java (removeMenuBarPeer): Remove MenuBarPeer argument. * gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java (dispose): Call native method. * java/awt/Frame.java (setMenuBar): Create and remove MenuBar peers only if the Frame has a peer. (addNotify): Create the MenuBar peer if one exists. (removeNotify): Remove MenuBar peer if one exists. * java/awt/Menu.java: Fix imports. (addNotify): Don't use full class name. (removeNotify): Call removeNotify on all children. * java/awt/MenuBar.java (removeNotify): Call removeNotify on all children. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c (removeMenuBarPeer): Remove MenuBarPeer argument. Iterate through children to find the Frame's MenuBar. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.c New file. (dispose): Remove references to the MenuComponent. From-SVN: r76740 --- libjava/ChangeLog | 22 ++++++++ libjava/Makefile.am | 1 + libjava/Makefile.in | 4 ++ .../gnu/java/awt/peer/gtk/GtkFramePeer.java | 6 +- .../awt/peer/gtk/GtkMenuComponentPeer.java | 6 +- libjava/java/awt/Frame.java | 19 ++++++- libjava/java/awt/Menu.java | 9 ++- libjava/java/awt/MenuBar.java | 6 ++ ...u_java_awt_peer_gtk_GtkMenuComponentPeer.c | 56 +++++++++++++++++++ .../gnu_java_awt_peer_gtk_GtkWindowPeer.c | 23 +++++++- 10 files changed, 139 insertions(+), 13 deletions(-) create mode 100644 libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.c diff --git a/libjava/ChangeLog b/libjava/ChangeLog index f0ce8982342..7d16e2266a5 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,25 @@ +2004-01-27 Kim Ho + + * gnu/java/awt/peer/gtk/GtkFramePeer.java + (removeMenuBarPeer): Remove MenuBarPeer argument. + * gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java + (dispose): Call native method. + * java/awt/Frame.java (setMenuBar): Create and remove + MenuBar peers only if the Frame has a peer. + (addNotify): Create the MenuBar peer if one exists. + (removeNotify): Remove MenuBar peer if one exists. + * java/awt/Menu.java: Fix imports. + (addNotify): Don't use full class name. + (removeNotify): Call removeNotify on all children. + * java/awt/MenuBar.java (removeNotify): Call + removeNotify on all children. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c + (removeMenuBarPeer): Remove MenuBarPeer argument. + Iterate through children to find the Frame's MenuBar. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.c + New file. + (dispose): Remove references to the MenuComponent. + 2004-01-27 Michael Koch * javax/swing/AbstractCellEditor.java: Reformated. diff --git a/libjava/Makefile.am b/libjava/Makefile.am index 43cb2bcdadc..365fe9ec84f 100644 --- a/libjava/Makefile.am +++ b/libjava/Makefile.am @@ -200,6 +200,7 @@ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c \ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c \ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c \ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c \ +jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.c \ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c \ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c \ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c \ diff --git a/libjava/Makefile.in b/libjava/Makefile.in index 2b2c3a0befb..ff53a32c2e9 100644 --- a/libjava/Makefile.in +++ b/libjava/Makefile.in @@ -292,6 +292,7 @@ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c \ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c \ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c \ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c \ +jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.c \ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c \ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c \ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c \ @@ -2794,6 +2795,7 @@ lib_gnu_java_awt_peer_gtk_la_DEPENDENCIES = @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.lo \ @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.lo \ @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.lo \ +@GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.lo \ @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.lo \ @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.lo \ @GTK_CAIRO_FALSE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.lo \ @@ -2874,6 +2876,7 @@ lib_gnu_java_awt_peer_gtk_la_DEPENDENCIES = @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.lo \ @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.lo \ @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.lo \ +@GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.lo \ @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.lo \ @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.lo \ @GTK_CAIRO_TRUE@jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.lo \ @@ -4581,6 +4584,7 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \ .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.P \ .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.P \ .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.P \ +.deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.P \ .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.P \ .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.P \ .deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.P \ diff --git a/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java b/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java index 6bc1ca94d29..8fd96b45a57 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java @@ -58,7 +58,7 @@ public class GtkFramePeer extends GtkWindowPeer native int getMenuBarHeight (MenuBarPeer bar); native void setMenuBarPeer (MenuBarPeer bar); - native void removeMenuBarPeer (MenuBarPeer bar); + native void removeMenuBarPeer (); native void moveLayout (int offset); public void setMenuBar (MenuBar bar) @@ -67,7 +67,7 @@ public class GtkFramePeer extends GtkWindowPeer { if (menuBar != null) { - removeMenuBarPeer(menuBar); + removeMenuBarPeer(); menuBar = null; moveLayout(menuBarHeight); insets.top -= menuBarHeight; @@ -80,7 +80,7 @@ public class GtkFramePeer extends GtkWindowPeer int oldHeight = 0; if (menuBar != null) { - removeMenuBarPeer(menuBar); + removeMenuBarPeer(); oldHeight = menuBarHeight; insets.top -= menuBarHeight; } diff --git a/libjava/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java index eeef383ebd3..92f02230621 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java @@ -47,8 +47,6 @@ public class GtkMenuComponentPeer extends GtkGenericPeer { super (awtWidget); } - - public void dispose () - { - } + + public native void dispose(); } diff --git a/libjava/java/awt/Frame.java b/libjava/java/awt/Frame.java index 7a5c9d98f8e..c92585a6f6b 100644 --- a/libjava/java/awt/Frame.java +++ b/libjava/java/awt/Frame.java @@ -341,11 +341,15 @@ getMenuBar() public synchronized void setMenuBar(MenuBar menuBar) { - this.menuBar = menuBar; - if (menuBar != null) - menuBar.addNotify(); if (peer != null) + { + if (this.menuBar != null) + this.menuBar.removeNotify(); + if (menuBar != null) + menuBar.addNotify(); ((FramePeer) peer).setMenuBar(menuBar); + } + this.menuBar = menuBar; } /*************************************************************************/ @@ -432,11 +436,20 @@ remove(MenuComponent menu) public void addNotify() { + if (menuBar != null) + menuBar.addNotify(); if (peer == null) peer = getToolkit ().createFrame (this); super.addNotify(); } +public void removeNotify() +{ + if (menuBar != null) + menuBar.removeNotify(); + super.removeNotify(); +} + /*************************************************************************/ /** diff --git a/libjava/java/awt/Menu.java b/libjava/java/awt/Menu.java index 6fdc22c8ccd..7fb2931184e 100644 --- a/libjava/java/awt/Menu.java +++ b/libjava/java/awt/Menu.java @@ -41,6 +41,7 @@ package java.awt; import java.awt.peer.MenuPeer; import java.io.Serializable; import java.util.Vector; +import java.util.Enumeration; /** * This class represents a pull down or tear off menu in Java's AWT. @@ -379,7 +380,7 @@ addNotify() { if (peer == null) peer = getToolkit().createMenu(this); - java.util.Enumeration e = items.elements(); + Enumeration e = items.elements(); while (e.hasMoreElements()) { MenuItem mi = (MenuItem)e.nextElement(); @@ -396,6 +397,12 @@ addNotify() public void removeNotify() { + Enumeration e = items.elements(); + while (e.hasMoreElements()) + { + MenuItem mi = (MenuItem) e.nextElement(); + mi.removeNotify(); + } super.removeNotify(); } diff --git a/libjava/java/awt/MenuBar.java b/libjava/java/awt/MenuBar.java index af5c9121b21..9c278dfde0d 100644 --- a/libjava/java/awt/MenuBar.java +++ b/libjava/java/awt/MenuBar.java @@ -279,6 +279,12 @@ addNotify() public void removeNotify() { + Enumeration e = menus.elements(); + while (e.hasMoreElements()) + { + Menu mi = (Menu) e.nextElement(); + mi.removeNotify(); + } super.removeNotify(); } diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.c new file mode 100644 index 00000000000..c30ac29c9c0 --- /dev/null +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.c @@ -0,0 +1,56 @@ +/* gtkmenucomponentpeer.c -- Native implementation of GtkMenuComponentPeer + Copyright (C) 2004 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + + +#include "gtkpeer.h" +#include "gnu_java_awt_peer_gtk_GtkMenuComponentPeer.h" + +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuComponentPeer_dispose + (JNIEnv *env, jobject obj) +{ + /* For MenuComponents and its subclasses, the widgets are + automatically destroyed by Gtk when the parent MenuBar + is removed from the Frame. So we avoid the widget + destruction in GtkGenericPeer dispose() by overriding + it here. */ + + /* However, references to the Java objects still exist in the + state tables, so we still have to remove those. */ + + NSA_DEL_GLOBAL_REF (env, obj); + NSA_DEL_PTR (env, obj); +} diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c index 970380683ba..fb82aed82f5 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c @@ -376,18 +376,37 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetBounds JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkFramePeer_removeMenuBarPeer - (JNIEnv *env, jobject obj, jobject menubar) + (JNIEnv *env, jobject obj) { void *wptr; GtkWidget *box; GtkWidget *mptr; + GList* children; wptr = NSA_GET_PTR (env, obj); - mptr = NSA_GET_PTR (env, menubar); gdk_threads_enter (); box = GTK_BIN (wptr)->child; + + children = gtk_container_get_children (GTK_CONTAINER (box)); + + while (children != NULL && !GTK_IS_MENU_SHELL (children->data)) + { + children = children->next; + } + + /* If there isn't a MenuBar in this Frame's list of children + then we can just return. */ + if (!GTK_IS_MENU_SHELL (children->data)) + return; + else + mptr = children->data; + + /* This will actually destroy the MenuBar. By removing it from + its parent, the reference count for the MenuBar widget will + decrement to 0. The widget will be automatically destroyed + by Gtk. */ gtk_container_remove (GTK_CONTAINER (box), GTK_WIDGET (mptr)); gdk_threads_leave(); -- 2.30.2