/******************************************************************************* * Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://robocode.sourceforge.net/license/epl-v10.html * * Contributors: * Mathew A. Nelson * - Initial API and implementation * Flemming N. Larsen * - Code cleanup * - Moved this class from the robocode.util package into the robocode.dialog * package * - Changed to use FileUtil.getWindowConfigFile() * - Added missing close() on FileInputStream and FileOutputStream *******************************************************************************/ package net.sf.robocode.ui.dialog; import net.sf.robocode.io.FileUtil; import net.sf.robocode.io.Logger; import java.awt.*; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; import java.util.StringTokenizer; /** * @author Mathew A. Nelson (original) * @author Flemming N. Larsen (contributor) */ public class WindowPositionManager implements ComponentListener { private Properties windowPositions; public WindowPositionManager() { super(); } public Properties getWindowPositions() { if (windowPositions == null) { windowPositions = new Properties(); FileInputStream in = null; try { in = new FileInputStream(FileUtil.getWindowConfigFile()); windowPositions.load(in); } catch (FileNotFoundException e) { Logger.logMessage("Creating " + FileUtil.getWindowConfigFile().getName() + " file"); } catch (Exception e) { Logger.logError(e); } finally { if (in != null) { try { in.close(); } catch (IOException ignored) {} } } } return windowPositions; } public void componentHidden(ComponentEvent e) {} public void componentMoved(ComponentEvent e) { // Hack, because we cannot detect maximized frame in Java 1.3 if (e.getComponent().getBounds().getWidth() >= Toolkit.getDefaultToolkit().getScreenSize().width || e.getComponent().getBounds().getHeight() >= Toolkit.getDefaultToolkit().getScreenSize().height) { return; } setWindowRect((Window) e.getComponent(), e.getComponent().getBounds()); } public void componentResized(ComponentEvent e) { // Hack, because we cannot detect maximized frame in Java 1.3 if (e.getComponent().getBounds().getWidth() >= Toolkit.getDefaultToolkit().getScreenSize().width || e.getComponent().getBounds().getHeight() >= Toolkit.getDefaultToolkit().getScreenSize().height) { return; } setWindowRect((Window) e.getComponent(), e.getComponent().getBounds()); } public void componentShown(ComponentEvent e) {} public void setWindowRect(Window w, Rectangle rect) { String rString = rect.x + "," + rect.y + "," + rect.width + "," + rect.height; getWindowPositions().put(w.getClass().getName(), rString); } public Rectangle getWindowRect(Window window) { window.addComponentListener(this); String rString = (String) getWindowPositions().get(window.getClass().getName()); if (rString == null) { return null; } StringTokenizer tokenizer = new StringTokenizer(rString, ","); int x = Integer.parseInt(tokenizer.nextToken()); int y = Integer.parseInt(tokenizer.nextToken()); int width = Integer.parseInt(tokenizer.nextToken()); int height = Integer.parseInt(tokenizer.nextToken()); return fitWindowBoundsToScreen(new Rectangle(x, y, width, height)); } public void saveWindowPositions() { FileOutputStream out = null; try { out = new FileOutputStream(FileUtil.getWindowConfigFile()); getWindowPositions().store(out, "Robocode window sizes"); } catch (IOException e) { Logger.logWarning("Unable to save window positions: " + e); } finally { if (out != null) { try { out.close(); } catch (IOException ignored) {} } } } private Rectangle fitWindowBoundsToScreen(Rectangle windowBounds) { if (windowBounds == null) { return null; } // Return the input window bounds, if we can find a screen device that contains these bounds final GraphicsEnvironment gfxEnv = GraphicsEnvironment.getLocalGraphicsEnvironment(); final GraphicsDevice[] screenDevices = gfxEnv.getScreenDevices(); for (int i = screenDevices.length - 1; i >= 0; i--) { GraphicsConfiguration[] gfxCfg = screenDevices[i].getConfigurations(); for (int j = gfxCfg.length - 1; j >= 0; j--) { if (gfxCfg[j].getBounds().contains(windowBounds.getLocation())) { return windowBounds; // Found the bounds } } } // Otherwise, return window bounds at a location within the current screen final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); int x = (screenSize.width - windowBounds.width) / 2; int y = (screenSize.height - windowBounds.height) / 2; return new Rectangle(x, y, windowBounds.width, windowBounds.height); } }