package org.hwo.ui.windowstate; import java.awt.Rectangle; import java.util.ArrayList; import java.util.Hashtable; import java.util.LinkedList; import java.util.List; import javax.swing.JFrame; public abstract class AbstractStatedWindowManager implements StatedWindowManager { private Class clazzFrame; private Hashtable windows; protected AbstractStatedWindowManager(Class clazzFrame) { this.clazzFrame = clazzFrame; this.windows = new Hashtable(); WindowManager.getInstance().registerWindowManager(this); } public WindowState getStateOfWindow(JFrame frame) { if (!windows.containsKey(frame)) registerNewWindow(frame); return windows.get(frame); } public void saveState(JFrame frame) { saveWindowPosition(getStateOfWindow(frame)); } public void restoreState(JFrame frame) { restoreWindowPosition(getStateOfWindow(frame)); frame.setVisible(true); } @Override public Class getManagedClass() { return clazzFrame; } private void restoreWindowPosition(WindowState state){ Rectangle bounds = new Rectangle(); bounds.x = Integer.decode(state.getProperties().getProperty("left", "0")); bounds.y = Integer.decode(state.getProperties().getProperty("top", "0")); bounds.width = Integer.decode(state.getProperties().getProperty("width", "0")); bounds.height = Integer.decode(state.getProperties().getProperty("height", "0")); state.jframe.setBounds(bounds); } private void saveWindowPosition(WindowState state) { Rectangle bounds = state.jframe.getBounds(); state.getProperties().setProperty("left", Integer.toString(bounds.x)); state.getProperties().setProperty("top", Integer.toString(bounds.y)); state.getProperties().setProperty("width", Integer.toString(bounds.width)); state.getProperties().setProperty("height", Integer.toString(bounds.height)); } @Override public void closeAllWindows(){ for (JFrame frame: new ArrayList(windows.keySet())) { frame.setVisible(false); unregisterWindow(frame); } } @Override public void registerNewWindow(JFrame window) { if (!windows.containsKey(window)) { windows.put(window, new WindowState(window)); } } @Override public void unregisterWindow(JFrame window) { windows.remove(window); } @Override public void restoreWindows(String[] states) { for (String state: states) { JFrame frame = createWindow(); WindowState ws = getStateOfWindow(frame); ws.setState(state); restoreState(frame); } } @Override public String[] saveWindows() { ArrayList states = new ArrayList(); for (JFrame frame: windows.keySet()) { if (!frame.isVisible()) continue; WindowState ws = getStateOfWindow(frame); saveState(frame); states.add(ws.getState()); } return states.toArray(new String[0]); } @Override public JFrame[] getWindows() { return windows.keySet().toArray(new JFrame[0]); } }