/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jface.window;

import java.util.*;

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 number of windows
 * 
 * @return the number of windows
 * @since 3.0
 * @issue Why not use getWindows().length?
 */
public int getWindowCount() {
	return windows.size();
}
/**
 * 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);
	}
}
}
