From 5ec47f6049561ec52125da7f3e44ba269f9372ea Mon Sep 17 00:00:00 2001 From: Thomas Fitzsimmons Date: Fri, 19 Sep 2003 19:27:59 +0000 Subject: GtkDialogPeer.java (create()): Create a top-level GTK window. 2003-09-19 Thomas Fitzsimmons * gnu/java/awt/peer/gtk/GtkDialogPeer.java (create()): Create a top-level GTK window. (getArgs): Add "title" property. * gnu/java/awt/peer/gtk/GtkWindowPeer.java (setResizable): Use "allow_shrink" and "allow_grow" properties. * java/awt/Dialog.java: Initialize resizable to true and change comments accordingly. Initialize visible to false in constructors. * java/awt/Frame.java (dispose): Remove method. * java/awt/Window.java (ownedWindows): New field. (Window(Window,GraphicsConfiguration)): Add a weak reference to owner's ownedWindows vector. (finalize): Remove method. (hide): Hide owned windows. (dispose): Dispose of owned windows. (getOwnedWindows): Implement. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c: Remove unused GtkArg code. (set(String,boolean)): Clamp gboolean parameter to g_object_set to TRUE or FALSE. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c (create): Set window's size requisition. (connectHooks): Fix indentation. (setResizable): Remove function. (static setBounds): Likewise. (setBounds): Replace call to setBounds with GTK size requisition and resize calls. From-SVN: r71585 --- libjava/java/awt/Window.java | 98 +++++++++++++++++++++++++++++++++----------- 1 file changed, 73 insertions(+), 25 deletions(-) (limited to 'libjava/java/awt/Window.java') diff --git a/libjava/java/awt/Window.java b/libjava/java/awt/Window.java index 2f625aa..9f10275 100644 --- a/libjava/java/awt/Window.java +++ b/libjava/java/awt/Window.java @@ -43,9 +43,13 @@ import java.awt.event.WindowFocusListener; import java.awt.event.WindowListener; import java.awt.event.WindowStateListener; import java.awt.peer.WindowPeer; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; +import java.util.Iterator; import java.util.EventListener; import java.util.Locale; import java.util.ResourceBundle; +import java.util.Vector; import javax.accessibility.Accessible; import javax.accessibility.AccessibleContext; @@ -69,6 +73,9 @@ public class Window extends Container implements Accessible /** @since 1.4 */ private boolean focusableWindowState = true; + // A list of other top-level windows owned by this window. + private transient Vector ownedWindows = new Vector(); + private transient WindowListener windowListener; private transient WindowFocusListener windowFocusListener; private transient WindowStateListener windowStateListener; @@ -139,11 +146,13 @@ public class Window extends Container implements Accessible if (owner == null) throw new IllegalArgumentException ("owner must not be null"); - this.parent = owner; - - // FIXME: add to owner's "owned window" list - //owner.owned.add(this); // this should be a weak reference - + parent = owner; + + synchronized (owner.ownedWindows) + { + owner.ownedWindows.add(new WeakReference(this)); + } + // FIXME: make this text visible in the window. SecurityManager s = System.getSecurityManager(); if (s != null && ! s.checkTopLevelWindow(this)) @@ -171,18 +180,6 @@ public class Window extends Container implements Accessible } /** - * Disposes of the input methods and context, and removes the WeakReference - * which formerly pointed to this Window from the parent's owned Window list. - * - * @exception Throwable The Exception raised by this method. - */ - protected void finalize() throws Throwable - { - // FIXME: remove from owner's "owned window" list (Weak References) - super.finalize(); - } - - /** * Creates the native peer for this window. */ public void addNotify() @@ -227,7 +224,23 @@ public class Window extends Container implements Accessible public void hide() { - // FIXME: call hide() on any "owned" children here. + synchronized (ownedWindows) + { + Iterator e = ownedWindows.iterator(); + while(e.hasNext()) + { + Window w = (Window)(((Reference) e.next()).get()); + if (w != null) + w.hide(); + else + // Remove null weak reference from ownedWindows. + // Unfortunately this can't be done in the Window's + // finalize method because there is no way to guarantee + // synchronous access to ownedWindows there. + e.remove(); + } + } + super.hide(); } @@ -239,15 +252,26 @@ public class Window extends Container implements Accessible } /** - * Called to free any resource associated with this window. + * Destroys any resources associated with this window. This includes + * all components in the window and all owned top-level windows. */ public void dispose() { hide(); - Window[] list = getOwnedWindows(); - for (int i=0; i