/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2003 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.openide.windows;
import java.awt.Frame;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.net.URL;
import java.util.*;
import javax.swing.JFrame;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openide.nodes.Node;
import org.openide.util.Utilities;
/**
* Trivial window manager that just keeps track of "workspaces" and "modes"
* according to contract but does not really use them, and just opens all
* top components in their own frames.
* Useful in case core-windows.jar is not installed, e.g. in standalone usage.
* @author Jesse Glick
* @see "#29933"
*/
public final class DummyWindowManager extends WindowManager {
private final static Log log = LogFactory.getLog(DummyWindowManager.class);
private static final long serialVersionUID = 1L;
private final Map workspaces; // Map<String,Workspace>
private transient Frame mw;
private transient PropertyChangeSupport pcs;
private transient R r;
public DummyWindowManager() {
log.debug("instantiating DummyWindowManager");
workspaces = new TreeMap();
createWorkspace("default", null); // NOI18N
}
public synchronized void addPropertyChangeListener(PropertyChangeListener l) {
if (pcs == null) {
pcs = new PropertyChangeSupport(this);
}
pcs.addPropertyChangeListener(l);
}
public synchronized void removePropertyChangeListener(PropertyChangeListener l) {
if (pcs != null) {
pcs.removePropertyChangeListener(l);
}
}
protected TopComponent.Registry componentRegistry() {
TopComponent.Registry reg = super.componentRegistry();
if (reg != null) {
return reg;
} else {
return registry();
}
}
public synchronized R registry() { ////
if (r == null) {
r = new R();
}
log.debug("returning dummy TopComponent.Registry() R():" + r);
return r;
}
protected WindowManager.Component createTopComponentManager(TopComponent c) {
return new TCM(c);
}
public synchronized Workspace createWorkspace(String name, String displayName) {
Workspace w = new W(name);
workspaces.put(name, w);
if (pcs != null) {
pcs.firePropertyChange(PROP_WORKSPACES, null, null);
pcs.firePropertyChange(PROP_CURRENT_WORKSPACE, null, null);
}
return w;
}
synchronized void delete(Workspace w) {
workspaces.remove(w.getName());
if (workspaces.isEmpty()) {
createWorkspace("default", null); // NOI18N
}
if (pcs != null) {
pcs.firePropertyChange(PROP_WORKSPACES, null, null);
pcs.firePropertyChange(PROP_CURRENT_WORKSPACE, null, null);
}
}
public synchronized Workspace findWorkspace(String name) {
return (Workspace)workspaces.get(name);
}
public synchronized Workspace getCurrentWorkspace() {
return (Workspace)workspaces.values().iterator().next();
}
public synchronized Workspace[] getWorkspaces() {
return (Workspace[])workspaces.values().toArray(new Workspace[0]);
}
public synchronized void setWorkspaces(Workspace[] ws) {
if (ws.length == 0) throw new IllegalArgumentException();
workspaces.clear();
for (int i = 0; i < ws.length; i++) {
workspaces.put(ws[i].getName(), ws[i]);
}
if (pcs != null) {
pcs.firePropertyChange(PROP_WORKSPACES, null, null);
pcs.firePropertyChange(PROP_CURRENT_WORKSPACE, null, null);
}
}
public synchronized Frame getMainWindow() {
if (mw == null) {
mw = new JFrame("dummy"); // NOI18N
}
return mw;
}
public void updateUI() {}
private final class TCM implements WindowManager.Component {
private static final long serialVersionUID = 1L;
private final TopComponent tc;
private transient JFrame f;
private Image icon;
private final Set workspaces = new HashSet(); // Set<Workspace>
private transient Node[] nodes;
public TCM(TopComponent tc) {
this.tc = tc;
}
public void open() {
open(getCurrentWorkspace());
}
public synchronized void open(final Workspace workspace) {
if (f == null) {
f = new JFrame(tc.getName());
if (icon != null) {
f.setIconImage(icon);
}
f.getContentPane().add(tc);
f.pack();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent ev) {
close(workspace);
}
});
}
f.show();
workspaces.add(workspace);
registry().open(tc);
}
public synchronized void close(Workspace workspace) {
if (f != null) {
f.setVisible(false);
}
workspaces.remove(workspace);
registry().close(tc);
}
public synchronized Set whereOpened() {
return workspaces;
}
public Node[] getActivatedNodes() {
return nodes;
}
public void setActivatedNodes(Node[] nodes) {
log.debug("activated nodes: " + nodes); ////
this.nodes = nodes;
registry().setActivatedNodes(tc, nodes);
}
public synchronized void nameChanged() {
if (f != null) {
f.setTitle(tc.getName());
}
}
public void requestFocus() {
registry().setActive(tc);
}
public void requestVisible() {
if (f != null) {
f.show();
}
}
public Image getIcon() {
return icon;
}
public void setIcon(Image icon) {
this.icon = icon;
if (f != null && icon != null) {
f.setIconImage(icon);
}
}
}
private final class W implements Workspace {
private static final long serialVersionUID = 1L;
private final String name;
private final Map modes = new HashMap(); // Map<String,Mode>
private final Map modesByComponent = new WeakHashMap(); // Map<TopComponent,Mode>
private transient PropertyChangeSupport pcs;
public W(String name) {
this.name = name;
}
public void activate() {
}
public synchronized void addPropertyChangeListener(PropertyChangeListener list) {
if (pcs == null) {
pcs = new PropertyChangeSupport(this);
}
pcs.addPropertyChangeListener(list);
}
public synchronized void removePropertyChangeListener(PropertyChangeListener list) {
if (pcs != null) {
pcs.removePropertyChangeListener(list);
}
}
public void remove() {
DummyWindowManager.this.delete(this);
}
public synchronized Mode createMode(String name, String displayName, URL icon) {
Mode m = new M(name);
modes.put(name, m);
if (pcs != null) {
pcs.firePropertyChange(PROP_MODES, null, null);
}
return m;
}
public synchronized Set getModes() {
return new HashSet(modes.values());
}
public synchronized Mode findMode(String name) {
return (Mode)modes.get(name);
}
public synchronized Mode findMode(TopComponent c) {
return (Mode)modesByComponent.get(c);
}
synchronized void dock(Mode m, TopComponent c) {
modesByComponent.put(c, m);
}
public Rectangle getBounds() {
throw new UnsupportedOperationException("not yet implemented"); ////
//// return Utilities.getUsableScreenBounds();
}
public String getName() {
return name;
}
public String getDisplayName() {
return getName();
}
private final class M implements Mode {
private static final long serialVersionUID = 1L;
private final String name;
private final Set components = new HashSet(); // Set<TopComponent>
public M(String name) {
this.name = name;
}
/* Not needed:
private transient PropertyChangeSupport pcs;
public synchronized void addPropertyChangeListener(PropertyChangeListener list) {
if (pcs == null) {
pcs = new PropertyChangeSupport(this);
}
pcs.addPropertyChangeListener(list);
}
public synchronized void removePropertyChangeListener(PropertyChangeListener list) {
if (pcs != null) {
pcs.removePropertyChangeListener(list);
}
}
*/
public void addPropertyChangeListener(PropertyChangeListener l) {}
public void removePropertyChangeListener(PropertyChangeListener l) {}
public boolean canDock(TopComponent tc) {
return true;
}
public synchronized boolean dockInto(TopComponent c) {
if (components.add(c)) {
Mode old = findMode(c);
if (old != null && old != this && old instanceof M) {
synchronized (old) {
((M)old).components.remove(c);
}
}
dock(this, c);
}
return true;
}
public String getName() {
return name;
}
public String getDisplayName() {
return getName();
}
public Image getIcon() {
return null;
}
public synchronized TopComponent[] getTopComponents() {
return (TopComponent[])components.toArray(new TopComponent[0]);
}
public Workspace getWorkspace() {
return W.this;
}
public synchronized Rectangle getBounds() {
return W.this.getBounds();
}
public void setBounds(Rectangle s) {
}
}
}
private final class R implements TopComponent.Registry {
private TopComponent active;
private final Set opened; // Set<TopComponent>
private Node[] nodes;
public R() {
opened = new HashSet();
nodes = new Node[0];
}
private PropertyChangeSupport pcs;
public synchronized void addPropertyChangeListener(PropertyChangeListener l) {
if (pcs == null) {
pcs = new PropertyChangeSupport(this);
}
pcs.addPropertyChangeListener(l);
}
public synchronized void removePropertyChangeListener(PropertyChangeListener l) {
if (pcs != null) {
pcs.removePropertyChangeListener(l);
}
}
synchronized void open(TopComponent tc) {
opened.add(tc);
if (pcs != null) {
pcs.firePropertyChange(PROP_OPENED, null, null);
}
}
synchronized void close(TopComponent tc) {
opened.remove(tc);
if (pcs != null) {
pcs.firePropertyChange(PROP_OPENED, null, null);
}
}
public synchronized Set getOpened() {
return new HashSet(opened);
}
synchronized void setActive(TopComponent tc) {
active = tc;
Node[] _nodes = tc.getActivatedNodes();
if (_nodes != null) {
nodes = _nodes;
if (pcs != null) {
pcs.firePropertyChange(PROP_ACTIVATED_NODES, null, null);
}
}
if (pcs != null) {
pcs.firePropertyChange(PROP_ACTIVATED, null, null);
pcs.firePropertyChange(PROP_CURRENT_NODES, null, null);
}
}
synchronized void setActivatedNodes(TopComponent tc, Node[] _nodes) {
if (tc == active) {
if (_nodes != null) {
nodes = _nodes;
if (pcs != null) {
pcs.firePropertyChange(PROP_ACTIVATED_NODES, null, null);
}
}
if (pcs != null) {
pcs.firePropertyChange(PROP_CURRENT_NODES, null, null);
}
}
}
public TopComponent getActivated() {
return active;
}
public Node[] getActivatedNodes() {
return nodes;
}
public synchronized Node[] getCurrentNodes() {
if (active != null) {
return active.getActivatedNodes();
} else {
return null;
}
}
}
}