package org.eclipse.jface.window; | |
/* | |
* (c) Copyright IBM Corp. 2000, 2001. | |
* All Rights Reserved. | |
*/ | |
import java.util.*; | |
import java.util.List; // to make unambiguous | |
import org.eclipse.swt.widgets.*; | |
import org.eclipse.jface.util.Assert; | |
/** | |
* A manager for a group of windows. Window managers are an optional JFace | |
* feature used in applications which create many different windows (dialogs, | |
* wizards, etc.) in addition to a main window. A window manager can be used to | |
* remember all the windows that an application has created (independent of | |
* whether they are presently open or closed). There can be several window | |
* managers, and they can be arranged into a tree. This kind of organization | |
* makes it simple to close whole subgroupings of windows. | |
* <p> | |
* Creating a window manager is as simple as creating an instance of | |
* <code>WindowManager</code>. Associating a window with a window manager is | |
* done with <code>WindowManager.add(Window)</code>. A window is automatically | |
* removed from its window manager as a side effect of closing the window. | |
* </p> | |
* | |
* @see Window | |
*/ | |
public class WindowManager { | |
/** | |
* List of windows managed by this window manager | |
* (element type: <code>Window</code>). | |
*/ | |
private ArrayList windows= new ArrayList(); | |
/** | |
* Parent window manager, or <code>null</code> if none. | |
*/ | |
private WindowManager parentManager; | |
/** | |
* List of window managers who have this window manager | |
* as their parent (element type: <code>WindowManager</code>). | |
*/ | |
private List subManagers; | |
/** | |
* Creates an empty window manager without a parent window | |
* manager (that is, a root window manager). | |
*/ | |
public WindowManager() { | |
} | |
/** | |
* Creates an empty window manager with the given | |
* window manager as parent. | |
* | |
* @param parent the parent window manager | |
*/ | |
public WindowManager(WindowManager parent) { | |
Assert.isNotNull(parent); | |
parent.addWindowManager(this); | |
} | |
/** | |
* Adds the given window to the set of windows managed by | |
* this window manager. Does nothing is this window is | |
* already managed by this window manager. | |
* | |
* @param window the window | |
*/ | |
public void add(Window window) { | |
if (!windows.contains(window)) { | |
windows.add(window); | |
window.setWindowManager(this); | |
} | |
} | |
/** | |
* Adds the given window manager to the list of | |
* window managers that have this one as a parent. | |
* </p> | |
* @param wm the child window manager | |
*/ | |
private void addWindowManager(WindowManager wm) { | |
if (subManagers == null) | |
subManagers = new ArrayList(); | |
if (!subManagers.contains(wm)) { | |
subManagers.add(wm); | |
wm.parentManager = this; | |
} | |
} | |
/** | |
* Attempts to close all windows managed by this window manager, | |
* as well as windows managed by any descendent window managers. | |
* | |
* @return <code>true</code> if all windows were sucessfully closed, | |
* and <code>false</code> if any window refused to close | |
*/ | |
public boolean close() { | |
List t= (List) windows.clone(); // make iteration robust | |
Iterator e= t.iterator(); | |
while (e.hasNext()) { | |
Window window= (Window) e.next(); | |
boolean closed = window.close(); | |
if (!closed) | |
return false; | |
} | |
if (subManagers != null) { | |
e= subManagers.iterator(); | |
while (e.hasNext()) { | |
WindowManager wm= (WindowManager)e.next(); | |
boolean closed = wm.close(); | |
if (!closed) | |
return false; | |
} | |
} | |
return true; | |
} | |
/** | |
* Returns this window manager's set of windows. | |
* | |
* @return a possibly empty list of window | |
*/ | |
public Window[] getWindows() { | |
Window bs[] = new Window[windows.size()]; | |
windows.toArray(bs); | |
return bs; | |
} | |
/** | |
* Removes the given window from the set of windows managed by | |
* this window manager. Does nothing is this window is | |
* not managed by this window manager. | |
* | |
* @param window the window | |
*/ | |
public final void remove(Window window) { | |
if (windows.contains(window)) { | |
windows.remove(window); | |
window.setWindowManager(null); | |
} | |
} | |
} |