package org.codehaus.mojo.graphing.gui; import java.awt.Dimension; import java.awt.Point; import java.awt.Toolkit; import java.awt.Window; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; public class WindowHandler extends WindowAdapter { private static final String KEY_WIN_HEIGHT = "size.height"; private static final String KEY_WIN_WIDTH = "size.width"; private static final String KEY_WIN_X = "location.x"; private static final String KEY_WIN_Y = "location.y"; private boolean persistLocation; private boolean persistSize; private Dimension sizePreferred; private boolean systemExit; private Window win; private String winname; private Preferences prefs; public WindowHandler(Window w) { this(w, false); } public WindowHandler(Window w, boolean exit) { if (w == null) { throw new IllegalArgumentException("Window cannot be null."); } if ( (w.getName() == null) || (w.getName().trim().length() <= 0) ){ throw new IllegalArgumentException("Window.name must be defined."); } prefs = Preferences.userNodeForPackage(WindowHandler.class); this.win = w; this.winname = w.getName(); this.systemExit = exit; this.persistLocation = true; this.persistSize = true; this.sizePreferred = w.getSize(); } public void close() { locationSave(); this.win.setVisible(false); this.win.dispose(); if (this.systemExit) { System.exit(0); } } /** * @return Returns the sizePreferred. */ public Dimension getSizePreferred() { return sizePreferred; } public boolean isPersisted() { return (this.persistLocation || this.persistSize); } /** * @return Returns the persistLocation. */ public boolean isPersistLocation() { return persistLocation; } /** * @return Returns the persistSize. */ public boolean isPersistSize() { return persistSize; } private int getInt(String key, int def) { return prefs.getInt(winname + "." + key, def); } private void setInt(String key, int value) { prefs.putInt(winname + "." + key, value); } public void locationRestore() { // calculate a centered location. Dimension size = this.sizePreferred; Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); int x = (screenSize.width - size.width) / 2; int y = (screenSize.height - size.height) / 2; if (this.persistLocation) { x = getInt(KEY_WIN_X, x); y = getInt(KEY_WIN_Y, y); } this.win.setLocation(x, y); if (this.persistSize) { int width = getInt(KEY_WIN_WIDTH, this.sizePreferred.width); int height = getInt(KEY_WIN_HEIGHT, this.sizePreferred.height); this.win.setSize(width, height); } } public void locationSave() { if (!isPersisted()) { return; } if (this.persistLocation) { Point loc = this.win.getLocation(); setInt(KEY_WIN_X, loc.x); setInt(KEY_WIN_Y, loc.y); } if (this.persistSize) { Dimension size = this.win.getSize(); setInt(KEY_WIN_WIDTH, size.width); setInt(KEY_WIN_HEIGHT, size.height); } try { prefs.flush(); } catch ( BackingStoreException e ) { e.printStackTrace(); } } /** * @param persistLocation The persistLocation to set. */ public void setPersistLocation(boolean persistLocation) { this.persistLocation = persistLocation; } /** * @param persistSize The persistSize to set. */ public void setPersistSize(boolean persistSize) { this.persistSize = persistSize; } /** * @param sizePreferred The sizePreferred to set. */ public void setSizePreferred(Dimension sizePreferred) { this.sizePreferred = sizePreferred; locationRestore(); } /** * * @see java.awt.event.WindowAdapter#windowClosing(java.awt.event.WindowEvent) */ public void windowClosing(WindowEvent e) { close(); } }