diff options
Diffstat (limited to 'libjava/java/awt/Window.java')
-rw-r--r-- | libjava/java/awt/Window.java | 98 |
1 files changed, 73 insertions, 25 deletions
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<list.length; i++) - list[i].dispose(); + synchronized (ownedWindows) + { + Iterator e = ownedWindows.iterator(); + while(e.hasNext()) + { + Window w = (Window)(((Reference) e.next()).get()); + if (w != null) + w.dispose(); + else + // Remove null weak reference from ownedWindows. + e.remove(); + } + } for (int i = 0; i < ncomponents; ++i) component[i].removeNotify(); @@ -340,9 +364,33 @@ public class Window extends Container implements Accessible /** @since 1.2 */ public Window[] getOwnedWindows() { - // FIXME: return array containing all the windows this window currently - // owns. - return new Window[0]; + Window [] trimmedList; + synchronized (ownedWindows) + { + // Windows with non-null weak references in ownedWindows. + Window [] validList = new Window [ownedWindows.size()]; + + Iterator e = ownedWindows.iterator(); + int numValid = 0; + while (e.hasNext()) + { + Window w = (Window)(((Reference) e.next()).get()); + if (w != null) + validList[numValid++] = w; + else + // Remove null weak reference from ownedWindows. + e.remove(); + } + + if (numValid != validList.length) + { + trimmedList = new Window [numValid]; + System.arraycopy (validList, 0, trimmedList, 0, numValid); + } + else + trimmedList = validList; + } + return trimmedList; } /** |