content: package aima.gui.swing.framework.util;
  
  import java.awt.BorderLayout;
  import java.awt.Color;
  import java.awt.Component;
  import java.awt.Dimension;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  import java.text.DecimalFormat;
  
  import javax.swing.BorderFactory;
  import javax.swing.Box;
  import javax.swing.JButton;
  import javax.swing.JDialog;
  import javax.swing.JFrame;
  import javax.swing.JLabel;
  import javax.swing.JOptionPane;
  import javax.swing.JPanel;
  import javax.swing.UIManager;
  import javax.swing.border.Border;
  
  /**
   * This class manages the look and feel for the whole application.<br/>
   * {@code activateSystemStyle()} and {@code setUIColors()} should be called as soon as possible
   * to prevent different looks in any part of the GUI which's construction may be missed otherwise.
   * These functions only have to be called once. 
   * 
   * @author Arno von Borries
   * @author Jan Phillip Kretzschmar
   * @author Andreas Walscheid
   * 
   */
  public class GuiBase {
  	
  	private static final DecimalFormat FORMAT = new DecimalFormat("#0.00000"); 
  	private static final Color TEXT_COLOR = Color.WHITE;
  	private static final Color BACKGROUND_COLOR = new Color(119,136,153);
  	private static final Color AREA_COLOR = new Color(147,221,255);
  	private static final int CLEARANCE = 5;
  	
  	private static JDialog MESSAGE_BOX = null;
  	private static JLabel MESSAGE_LABEL;
  	private static JButton MESSAGE_OK_BUTTON;
  	
  	/**
  	 * This class does not need to be instantiated.
  	 */
  	private GuiBase() { }
  	
  	/**
  	 * Tries to activate the system default look and feel.
  	 */
  	public static void activateSystemStyle() {
  		try {
  			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
  		} catch (Exception e) {
  			e.printStackTrace();
  		}
  		JFrame.setDefaultLookAndFeelDecorated(true);
  	}
  	
  	/**
  	 * Sets the default background and foreground colors for all elements of the application to provide a uniform look and feel.
  	 */
  	public static void setUIColors() {
  		 UIManager.put("OptionPane.background",BACKGROUND_COLOR);
  		 UIManager.put("ScrollPane.background",BACKGROUND_COLOR);
  		 UIManager.put("Panel.background",BACKGROUND_COLOR);
  		 UIManager.put("Slider.background",BACKGROUND_COLOR);
  		 UIManager.put("OptionPane.messageForeground",TEXT_COLOR);
  		 UIManager.put("Label.foreground", TEXT_COLOR);
  	}
  	
  	/**
  	 * Returns the {@link DecimalFormat} that should be used to format all numbers that will be displayed to the user.
  	 * @return a {@link DecimalFormat}.
  	 */
  	public static DecimalFormat getFormat() {
  		return FORMAT;
  	}
  	
  	/**
  	 * Returns the {@link Color} that should be used as a foreground color on the provided background color.
  	 * @return a {@link Color}.
  	 */
  	public static Color getTextColor() {
  		return TEXT_COLOR;
  	}
  	
  	/**
  	 * Returns the {@link Color} that should be used as a background color.
  	 * @return a {@link Color}.
  	 */
  	public static Color getBackgroundColor() {
  		return BACKGROUND_COLOR;
  	}
  	
  	/**
  	 * Returns the {@link Color} that can be used as a secondary color in connection with the background color.
  	 * @return a {@link Color}.
  	 */
  	public static Color getAreaColor() {
  		return AREA_COLOR;
  	}
  	
  	/**
  	 * Returns the clearance that has to be used between any graphical elements to maintain a uniform look and feel.
  	 * @return the clearance that has to be used.
  	 */
  	public static int getClearance() {
  		return CLEARANCE;
  	}
  	
  	/**
  	 * Returns a invisible {@link Component} that can be used to maintain a uniform clearance between any graphical elements.
  	 * @return a invisible clearance {@link Component}.
  	 */
  	public static Component getClearanceComp() {
  		return Box.createRigidArea(new Dimension(CLEARANCE,CLEARANCE));
  	}
  	
  	/**
  	 * Returns a {@link Border} that can be used to maintain a uniform clearance between any graphical elements.
  	 * @return a invisible clearance {@link Border}.
  	 */
  	public static Border getClearanceBorder() {
  		return BorderFactory.createEmptyBorder(CLEARANCE,CLEARANCE,CLEARANCE,CLEARANCE);
  	}
  	
  	/**
  	 * Initializes the dialog for the message box.
  	 */
  	public static void initMessageBox() {
  		MESSAGE_BOX = new JOptionPane().createDialog("MCL");
  		final JPanel panel = new JPanel();
  		panel.setBounds(5, 5, 345, 95);
  		MESSAGE_LABEL = new JLabel("", JLabel.CENTER);
  		Dimension dimension = new Dimension(350,100);
  		panel.setLayout(new BorderLayout());
  		panel.add(MESSAGE_LABEL, BorderLayout.CENTER);
  		MESSAGE_OK_BUTTON = new JButton("OK");
  		MESSAGE_OK_BUTTON.addActionListener(new ActionListener() {
  			@Override
  			public void actionPerformed(ActionEvent e) {
  				MESSAGE_BOX.setVisible(false);
  			}
  		});
  		panel.add(MESSAGE_OK_BUTTON, BorderLayout.SOUTH);
  		MESSAGE_BOX.add(panel);
  		MESSAGE_BOX.setContentPane(panel);
  		MESSAGE_BOX.setMinimumSize(dimension);
  		MESSAGE_BOX.setResizable(false);
  		MESSAGE_BOX.setAlwaysOnTop(true);
  		MESSAGE_BOX.pack();
  		MESSAGE_BOX.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
  		MESSAGE_BOX.setModalityType(JDialog.ModalityType.MODELESS);
  	}
  	
  	/**
  	 * Shows a message box with a OK button without blocking.
  	 * @param message the string to be displayed.
  	 */
  	public static void showMessageBox(final String message) {
  		showMessageBox(message,true);
  	}
  	
  	/**
  	 * Show a message box without blocking.
  	 * @param message the message to be shown.
  	 * @param buttonVisible true if the OK button should be visible.
  	 */
  	public static void showMessageBox(final String message, boolean buttonVisible) {
  		if(MESSAGE_BOX == null) initMessageBox();
  		MESSAGE_BOX.setVisible(false);
  		MESSAGE_LABEL.setText(message);
  		MESSAGE_OK_BUTTON.setVisible(buttonVisible);
  		MESSAGE_BOX.setVisible(true);
  	}
  	
  	/**
  	 * Enables the OK button of the message box.
  	 */
  	public static void showOKButtonMessageBox() {
  		MESSAGE_OK_BUTTON.setVisible(true);
  	}
  	
  	/**
  	 * Hides the message box.
  	 */
  	public static void hideMessageBox() {
  		MESSAGE_BOX.setVisible(false);
  	}
  }