forked from LupusNobilis/java-org.hwo.ui
126 lines
3.0 KiB
Java
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]);
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|