diff options
Diffstat (limited to 'libjava/java/awt/Window.java')
-rw-r--r-- | libjava/java/awt/Window.java | 119 |
1 files changed, 68 insertions, 51 deletions
diff --git a/libjava/java/awt/Window.java b/libjava/java/awt/Window.java index ad4aec7..70d452b 100644 --- a/libjava/java/awt/Window.java +++ b/libjava/java/awt/Window.java @@ -144,13 +144,12 @@ public class Window extends Container implements Accessible { this (); - if (owner == null) - throw new IllegalArgumentException ("owner must not be null"); - - parent = owner; - - synchronized (owner.ownedWindows) + synchronized (getTreeLock()) { + if (owner == null) + throw new IllegalArgumentException ("owner must not be null"); + + parent = owner; owner.ownedWindows.add(new WeakReference(this)); } @@ -220,7 +219,7 @@ public class Window extends Container implements Accessible addNotify(); // Show visible owned windows. - synchronized (ownedWindows) + synchronized (getTreeLock()) { Iterator e = ownedWindows.iterator(); while(e.hasNext()) @@ -247,7 +246,7 @@ public class Window extends Container implements Accessible public void hide() { // Hide visible owned windows. - synchronized (ownedWindows) + synchronized (getTreeLock ()) { Iterator e = ownedWindows.iterator(); while(e.hasNext()) @@ -280,7 +279,7 @@ public class Window extends Container implements Accessible { hide(); - synchronized (ownedWindows) + synchronized (getTreeLock ()) { Iterator e = ownedWindows.iterator(); while(e.hasNext()) @@ -292,11 +291,15 @@ public class Window extends Container implements Accessible // Remove null weak reference from ownedWindows. e.remove(); } - } - for (int i = 0; i < ncomponents; ++i) - component[i].removeNotify(); - this.removeNotify(); + for (int i = 0; i < ncomponents; ++i) + component[i].removeNotify(); + this.removeNotify(); + + // Post a WINDOW_CLOSED event. + WindowEvent we = new WindowEvent(this, WindowEvent.WINDOW_CLOSED); + getToolkit().getSystemEventQueue().postEvent(we); + } } /** @@ -386,7 +389,7 @@ public class Window extends Container implements Accessible public Window[] getOwnedWindows() { Window [] trimmedList; - synchronized (ownedWindows) + synchronized (getTreeLock ()) { // Windows with non-null weak references in ownedWindows. Window [] validList = new Window [ownedWindows.size()]; @@ -479,7 +482,7 @@ public class Window extends Container implements Accessible */ public void addWindowFocusListener (WindowFocusListener wfl) { - AWTEventMulticaster.add (windowFocusListener, wfl); + windowFocusListener = AWTEventMulticaster.add (windowFocusListener, wfl); } /** @@ -489,7 +492,7 @@ public class Window extends Container implements Accessible */ public void addWindowStateListener (WindowStateListener wsl) { - AWTEventMulticaster.add (windowStateListener, wsl); + windowStateListener = AWTEventMulticaster.add (windowStateListener, wsl); } /** @@ -497,7 +500,7 @@ public class Window extends Container implements Accessible */ public void removeWindowFocusListener (WindowFocusListener wfl) { - AWTEventMulticaster.remove (windowFocusListener, wfl); + windowFocusListener = AWTEventMulticaster.remove (windowFocusListener, wfl); } /** @@ -507,7 +510,7 @@ public class Window extends Container implements Accessible */ public void removeWindowStateListener (WindowStateListener wsl) { - AWTEventMulticaster.remove (windowStateListener, wsl); + windowStateListener = AWTEventMulticaster.remove (windowStateListener, wsl); } /** @@ -532,7 +535,9 @@ public class Window extends Container implements Accessible // Make use of event id's in order to avoid multiple instanceof tests. if (e.id <= WindowEvent.WINDOW_LAST && e.id >= WindowEvent.WINDOW_FIRST - && (windowListener != null + && (windowListener != null + || windowFocusListener != null + || windowStateListener != null || (eventMask & AWTEvent.WINDOW_EVENT_MASK) != 0)) processEvent(e); else @@ -565,39 +570,51 @@ public class Window extends Container implements Accessible */ protected void processWindowEvent(WindowEvent evt) { - if (windowListener != null) + int id = evt.getID(); + + if (id == WindowEvent.WINDOW_GAINED_FOCUS + || id == WindowEvent.WINDOW_LOST_FOCUS) + processWindowFocusEvent (evt); + else if (id == WindowEvent.WINDOW_STATE_CHANGED) + processWindowStateEvent (evt); + else { - switch (evt.getID()) - { - case WindowEvent.WINDOW_ACTIVATED: - windowListener.windowActivated(evt); - break; - case WindowEvent.WINDOW_CLOSED: - windowListener.windowClosed(evt); - break; - case WindowEvent.WINDOW_CLOSING: - windowListener.windowClosing(evt); - break; - case WindowEvent.WINDOW_DEACTIVATED: - windowListener.windowDeactivated(evt); - break; - case WindowEvent.WINDOW_DEICONIFIED: - windowListener.windowDeiconified(evt); - break; - case WindowEvent.WINDOW_ICONIFIED: - windowListener.windowIconified(evt); - break; - case WindowEvent.WINDOW_OPENED: - windowListener.windowOpened(evt); - break; - case WindowEvent.WINDOW_GAINED_FOCUS: - case WindowEvent.WINDOW_LOST_FOCUS: - processWindowFocusEvent (evt); - break; - case WindowEvent.WINDOW_STATE_CHANGED: - processWindowStateEvent (evt); - break; - } + if (windowListener != null) + { + switch (evt.getID()) + { + case WindowEvent.WINDOW_ACTIVATED: + windowListener.windowActivated(evt); + break; + + case WindowEvent.WINDOW_CLOSED: + windowListener.windowClosed(evt); + break; + + case WindowEvent.WINDOW_CLOSING: + windowListener.windowClosing(evt); + break; + + case WindowEvent.WINDOW_DEACTIVATED: + windowListener.windowDeactivated(evt); + break; + + case WindowEvent.WINDOW_DEICONIFIED: + windowListener.windowDeiconified(evt); + break; + + case WindowEvent.WINDOW_ICONIFIED: + windowListener.windowIconified(evt); + break; + + case WindowEvent.WINDOW_OPENED: + windowListener.windowOpened(evt); + break; + + default: + break; + } + } } } |