package org.hwo.ui.windowstate; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.Hashtable; import java.util.LinkedList; import java.util.List; import javax.swing.JFrame; import org.hwo.ByteArrayHexlifier; public class WindowManager { private static WindowManager instance; public static WindowManager getInstance() { return instance; } Hashtable, StatedWindowManager> windowManagers; protected WindowManager() { windowManagers = new Hashtable, StatedWindowManager>(); } public void registerWindowManager(StatedWindowManager manager) { windowManagers.put(manager.getManagedClass(), manager); } public StatedWindowManager getStatedWindowManager(Class clazz) { return windowManagers.get(clazz); } public StatedWindowManager getStatedWindowManager(String clazz) { for (StatedWindowManager manager: windowManagers.values()) { if (manager.getManagedClass().getName().equals(clazz)) return manager; } return null; } public void restoreWindows(String states) { Hashtable> htstates; try { ByteArrayInputStream bis = new ByteArrayInputStream(ByteArrayHexlifier.stringToByteArray(states)); ObjectInputStream ois = new ObjectInputStream(bis); htstates = (Hashtable>)ois.readObject(); ois.close(); bis.close(); for (String fclazz: htstates.keySet()) { System.err.println("Restoring Windows of Class: " + fclazz); StatedWindowManager manager = getStatedWindowManager(fclazz); if (manager != null) { manager.restoreWindows(htstates.get(fclazz).toArray(new String[]{})); } } } catch (Exception e) { e.printStackTrace(); } } List> getKnownWindowClasses() { return new ArrayList>(windowManagers.keySet()); } public String saveWindows() { Hashtable> states = new Hashtable>(); for (Class wc: getKnownWindowClasses()) { ArrayList wcstates = new ArrayList(); for (String ws: windowManagers.get(wc).saveWindows()) wcstates.add(ws); states.put(wc.getName(), wcstates); } try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(states); oos.close(); bos.close(); return ByteArrayHexlifier.byteArrayToString(bos.toByteArray()); } catch (Exception e) { e.printStackTrace(); } return ""; } public void closeAllWindows() { for (StatedWindowManager manager: windowManagers.values()) { manager.closeAllWindows(); } } static { instance = new WindowManager(); } }