Mercurial > projects > dwt-addons
diff dwtx/jface/window/WindowManager.d @ 7:8a302fdb4140
Jface some window and resource classes
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Fri, 28 Mar 2008 23:32:40 +0100 |
parents | |
children | 04b47443bb01 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dwtx/jface/window/WindowManager.d Fri Mar 28 23:32:40 2008 +0100 @@ -0,0 +1,162 @@ +/******************************************************************************* + * Copyright (c) 2000, 2006 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + * Port to the D programming language: + * Frank Benoit <benoit@tionex.de> + *******************************************************************************/ +module dwtx.jface.window.WindowManager; + +import dwtx.jface.window.Window; + +import tango.util.collection.ArraySeq; +import tango.util.collection.model.Seq; + +import dwtx.core.runtime.Assert; + +import dwt.dwthelper.utils; + +/** + * 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 ArraySeq!(Window) windows; + + /** + * List of window managers who have this window manager + * as their parent (element type: <code>WindowManager</code>). + */ + private Seq!(WindowManager) subManagers; + + /** + * Creates an empty window manager without a parent window + * manager (that is, a root window manager). + */ + public this() { + windows = new ArraySeq!(Window); + } + + /** + * Creates an empty window manager with the given + * window manager as parent. + * + * @param parent the parent window manager + */ + public this(WindowManager parent) { + windows = new ArraySeq!(Window); + 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.append(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 is null) { + subManagers = new ArraySeq!(WindowManager); + } + if (!subManagers.contains(wm)) { + subManagers.append(wm); + } + } + + /** + * 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 bool close() { + auto t = windows.dup(); // make iteration robust + foreach( window; t ){ + bool closed = window.close(); + if (!closed) { + return false; + } + } + if (subManagers !is null) { + foreach( wm; subManagers ){ + bool 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 + */ + public int getWindowCount() { + return windows.size(); + } + + /** + * Returns this window manager's set of windows. + * + * @return a possibly empty list of window + */ + public Window[] getWindows() { + return windows.toArray(); + } + + /** + * 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); + } + } +}