/*******************************************************************************
* 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
* - Moved window related methods from robocode.util.Utils into this class
* - Removed packCenterShow(Window main, Window window, boolean pack)
*******************************************************************************/
package net.sf.robocode.ui.dialog;
import javax.swing.*;
import java.awt.*;
import java.io.PrintWriter;
/**
* This is a class for window utilization.
*
* @author Mathew A. Nelson (original)
* @author Flemming N. Larsen (contributor)
*/
public class WindowUtil {
private static final Point origin = new Point(0, 0);
private static final WindowPositionManager windowPositionManager = new WindowPositionManager();
private static JLabel statusLabel;
private static PrintWriter statusWriter;
private static JLabel defaultStatusLabel;
public static void center(Window w) {
WindowUtil.center(null, w);
}
public static void center(Window main, Window w) {
WindowUtil.center(main, w, true);
}
public static void center(Window main, Window w, boolean move) {
Point location = null;
Dimension size = null;
Rectangle windowRect = windowPositionManager.getWindowRect(w);
if (windowRect != null) {
location = new Point(windowRect.x, windowRect.y);
size = new Dimension(windowRect.width, windowRect.height);
}
if (!move) {
size = null;
}
if (location == null || size == null) {
// Center a window
Dimension screenSize;
if (main != null) {
screenSize = main.getSize();
} else {
screenSize = Toolkit.getDefaultToolkit().getScreenSize();
}
size = w.getSize();
if (size.height > screenSize.height - 20 || size.width > screenSize.width - 20) {
// Keep aspect ratio for the robocode frame.
if (w.getName().equals("RobocodeFrame")) {
int shrink = size.width - screenSize.width + 20;
if (size.height - screenSize.height + 20 > shrink) {
shrink = size.height - screenSize.height + 20;
}
size.width -= shrink;
size.height -= shrink;
} else {
if (size.height > screenSize.height - 20) {
size.height = screenSize.height - 20;
}
if (size.width > screenSize.width - 20) {
size.width = screenSize.width - 20;
}
}
}
if (main != null) {
location = main.getLocation();
location.x += (screenSize.width - size.width) / 2;
location.y += (screenSize.height - size.height) / 2;
} else {
location = new Point((screenSize.width - size.width) / 2, (screenSize.height - size.height) / 2);
}
}
w.setSize(size);
if (move) {
w.setLocation(location);
}
}
public static void centerShow(Window main, Window window) {
center(main, window);
window.setVisible(true);
}
public static void setFixedSize(JComponent component, Dimension size) {
component.setPreferredSize(size);
component.setMinimumSize(size);
component.setMaximumSize(size);
}
public static void error(JFrame frame, String msg) {
Object[] options = { "OK"};
JOptionPane.showOptionDialog(frame, msg, "Error", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE, null,
options, options[0]);
}
public static void fitWindow(Window w) {
// We don't want to receive the resize event for this pack!
// ... yes we do!
// w.removeComponentListener(windowPositionManager);
w.pack();
center(null, w, false);
}
public static void packCenterShow(Window window) {
// We don't want to receive the resize event for this pack!
window.removeComponentListener(windowPositionManager);
window.pack();
center(window);
window.setVisible(true);
}
public static void packCenterShow(Window main, Window window) {
// We don't want to receive the resize event for this pack!
window.removeComponentListener(windowPositionManager);
window.pack();
center(main, window);
window.setVisible(true);
}
public static void packPlaceShow(Window window) {
window.pack();
WindowUtil.place(window);
window.setVisible(true);
}
public static void place(Window w) {
// Center a window
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension size = w.getSize();
if (size.height > screenSize.height) {
size.height = screenSize.height;
}
if (size.width > screenSize.width) {
size.width = screenSize.width;
}
w.setLocation(origin);
origin.y += 150;
if (origin.y + size.height > screenSize.height) {
origin.y = 0;
origin.x += 40;
}
if (origin.x + size.width > screenSize.width) {
origin.x = 0;
}
}
public static void saveWindowPositions() {
windowPositionManager.saveWindowPositions();
}
public static void message(String s) {
JOptionPane.showMessageDialog(null, s, "Message", JOptionPane.INFORMATION_MESSAGE);
}
public static void messageWarning(String s) {
JOptionPane.showMessageDialog(null, s, "Warning", JOptionPane.WARNING_MESSAGE);
}
public static void messageError(String s) {
JOptionPane.showMessageDialog(null, s, "Message", JOptionPane.ERROR_MESSAGE);
}
public static void setStatus(String s) {
if (statusWriter != null) {
statusWriter.println(s);
}
if (statusLabel != null) {
statusLabel.setText(s);
} else if (defaultStatusLabel != null) {
defaultStatusLabel.setText(s);
}
}
public static void setStatusLabel(JLabel label) {
statusLabel = label;
}
public static void setDefaultStatusLabel(JLabel label) {
defaultStatusLabel = label;
}
public static void setStatusWriter(PrintWriter out) {
statusWriter = out;
}
}