package org.openflexo.utils; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Rectangle; import java.awt.Window; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import org.openflexo.GeneralPreferences; import org.openflexo.prefs.FlexoPreferences; public class WindowBoundsSaver implements ComponentListener { private final Window window; private final String id; private Thread boundsSaver; public WindowBoundsSaver(Window window, String id, Rectangle defaultBounds) { super(); this.window = window; this.id = id; Rectangle bounds = GeneralPreferences.getBoundForFrameWithID(id); if (bounds == null) { bounds = defaultBounds; } else { boolean ok = false; for (GraphicsDevice device : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()) { if (device.getDefaultConfiguration().getBounds().contains(bounds.getLocation())) { ok = true; break; } } if (!ok) { bounds.setLocation(defaultBounds.getLocation()); } } window.setBounds(bounds); window.addComponentListener(this); } protected synchronized void saveBoundsInPreferenceWhenPossible() { if (!window.isVisible()) { return; } if (boundsSaver != null) { boundsSaver.interrupt();// Resets thread sleep return; } boundsSaver = new Thread(new Runnable() { /** * Overrides run * * @see java.lang.Runnable#run() */ @Override public void run() { boolean go = true; while (go) { try { go = false; Thread.sleep(800); } catch (InterruptedException e) { go = true;// interruption is used to reset sleep. } } saveBoundsInPreference(); } }); boundsSaver.start(); } protected void saveBoundsInPreference() { try { if (window.getBounds().x + window.getBounds().width < 0) { return; } if (window.getBounds().y + window.getHeight() < 0) { return; } GeneralPreferences.setBoundForFrameWithID(id, window.getBounds()); FlexoPreferences.savePreferences(true); } finally { boundsSaver = null; } } @Override public void componentResized(ComponentEvent e) { saveBoundsInPreferenceWhenPossible(); } @Override public void componentMoved(ComponentEvent e) { saveBoundsInPreferenceWhenPossible(); } @Override public void componentShown(ComponentEvent e) { } @Override public void componentHidden(ComponentEvent e) { } }