// Class: ArchSimGUI
//
// Author: Alyce Brady
//
// Created on 18 May 2004
// Modified on 10 March 2005 to use latest version of grid.jar, including
// InitializationButton
//
// License Information:
// This class is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation.
//
// This class is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
import java.awt.Color;
import javax.swing.JMenu;
import edu.kzoo.grid.BoundedGrid;
import edu.kzoo.grid.Grid;
import edu.kzoo.grid.Location;
import edu.kzoo.grid.display.ScrollableGridDisplay;
import edu.kzoo.grid.gui.EnabledDisabledStates;
import edu.kzoo.grid.gui.GridAppFrame;
import edu.kzoo.grid.gui.nuggets.InitializationButton;
import edu.kzoo.grid.gui.nuggets.MinimalFileMenu;
/**
* Archaeological Dig:
*
* An ArchSimGUI object represents a window with
* control buttons and a display for an archaeological dig simulation.
* Most of the functionality is provided in the GridAppFrame
* superclass.
*
* @author Alyce Brady
* @version 10 March 2005
**/
public class ArchSimGUI extends GridAppFrame
implements InitializationButton.Initializer
{
private String usualTitle;
private int numRows;
private Color usualBgColor;
private Color successfulCompletionBgColor;
private Color damagedArtifactBgColor;
private ArchSimulation simulation;
/** Constructs a new ArchSimGUI object.
* @param title window title
* @param helpMenu Help menu
* @param usualBgColor grid background color during simulation
* @param successBgColor bg color if simulated dig succeeds
* @param failureBgColor bg color if simulated dig fails
* @param numRows number of rows (and columns) in the grid
* @param sim object that controls the simulation
*/
public ArchSimGUI(String title, JMenu helpMenu, Color usualBgColor,
Color successBgColor, Color failureBgColor,
int numRows, ArchSimulation sim)
{
super();
this.usualTitle = title;
this.usualBgColor = usualBgColor;
this.successfulCompletionBgColor = successBgColor;
this.damagedArtifactBgColor = failureBgColor;
this.numRows = numRows;
includeMenu(new MinimalFileMenu());
includeMenu(helpMenu);
includeControlComponent(new InitializationButton(this, "Restart",
this, true),
EnabledDisabledStates.ALWAYS_ENABLED);
constructWindowContents(title, usualBgColor, 500, 500,
numRows);
simulation = sim;
initialize();
}
// Redefines constructDisplay to create a customized graphical user
// interface that checks whether a grid object is visible before display.
protected ScrollableGridDisplay constructDisplay(
int viewingWidth, int viewingHeight, int minCellSize, Color bgColor)
{
return new ArchSimDisplay(viewingWidth, viewingHeight,
minCellSize, bgColor);
}
// Redefines setGrid to also reset the window title and
// background color of the grid.
public void setGrid(Grid grid)
{
super.setGrid(grid);
setTitle(usualTitle);
getDisplay().setBackgroundColor(usualBgColor);
getDisplay().setToolTipsEnabled(false);
}
/** Starts or restarts the application. **/
public void initialize()
{
// Create a new grid, initialize a new simulation, and
// display the grid.
setGrid(new BoundedGrid(true, numRows, numRows));
simulation.startSimulation(getGrid());
showGrid();
}
// Redefines onMousePressOverDisplay to handle mouse clicks.
protected void onMousePressOverDisplay(Location loc)
{
if ( loc != null )
{
simulation.dig(loc);
if ( simulation.simulationOver() )
{
if ( simulation.digSuccessful() )
notifyDigSuccessfullyCompleted();
else
notifyArtifactDamaged();
showGrid();
}
else
getDisplay().updateLocation(loc);
}
}
/** Notifies the user that he or she completed the simulation
* successfully.
* Alters the background color of the grid and prints a message to the
* console.
**/
public void notifyDigSuccessfullyCompleted()
{
setTitle("You successfully completed the dig!");
getDisplay().setBackgroundColor(successfulCompletionBgColor);
}
/** Notifies the user that at least one artifact was damaged.
* Alters the background color of the grid and prints a message to the
* console.
**/
public void notifyArtifactDamaged()
{
setTitle("Oops! At least one artifact was damaged...");
getDisplay().setBackgroundColor(damagedArtifactBgColor);
}
}