java-org.hwo.ui/src/org/hwo/ui/windowstate/AbstractStatedWindowManager...

126 lines
3.0 KiB
Java

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<? extends JFrame> clazzFrame;
private Hashtable<JFrame, WindowState> windows;
protected AbstractStatedWindowManager(Class<? extends JFrame> clazzFrame)
{
this.clazzFrame = clazzFrame;
this.windows = new Hashtable<JFrame, WindowState>();
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<? extends JFrame> 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<JFrame>(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<String> states = new ArrayList<String>();
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]);
}
}