package vooga.scroller.level_editor.view;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JOptionPane;
import javax.swing.Scrollable;
import vooga.scroller.level_editor.LevelEditing;
import vooga.scroller.level_editor.commands.CommandConstants;
import vooga.scroller.level_editor.controllerSuite.GridSpinner;
import vooga.scroller.level_editor.controllerSuite.LEGrid;
import vooga.scroller.util.Renderable;
import vooga.scroller.util.Renderer;
import vooga.scroller.util.mvc.IView;
import vooga.scroller.util.mvc.vcFramework.ViewConstants;
import vooga.scroller.util.mvc.vcFramework.WindowComponent;
/**
* View for LEGrid. Contained within LEWorkspaceView
*
* @author Danny Goodman, Deo Fagnisse
*/
public class LEGridView extends WindowComponent<LevelEditing>
implements Scrollable, Renderer<LevelEditing> {
private static final long serialVersionUID = 8266835201464623542L;
private static final String GRID_RENDERING_ERROR = LevelEditing.GRID_RENDERING_ERROR;
private LEGrid myGrid;
private GridSpinner myGridSpinner;
/**
* Specify a container parent and a width and height ratio.
*
* @param parent - container for this view instance
* @param r - main renderable for this view instance
*/
public LEGridView (IView<LevelEditing> parent, Renderable<LevelEditing> r) {
super(parent, ((LEGrid) r).getPixelSize());
myGrid = (LEGrid) r;
this.addMouseListener(new GridPositionListener());
}
/**
* Internal getter for Default Height Ratio
*
* @return - height ratio
*/
private double getDefaultHeightRatio () {
return ViewConstants.DEFAULT_GRIDVIEW_HEIGHT_RATIO;
}
/**
* Internal getter for Default width Ratio
*
* @return - width ratio
*/
private double getDefaultWidthRatio () {
return ViewConstants.DEFAULT_GRIDVIEW_WIDTH_RATIO;
}
private void createSprite (int x, int y) {
String cmd = CommandConstants.CREATE_SPRITE + CommandConstants.SPACE
+ x + CommandConstants.SPACE + y;
process(cmd);
}
private void deleteSprite (int x, int y) {
String cmd = CommandConstants.DELETE_SPRITE + CommandConstants.SPACE
+ x + CommandConstants.SPACE + y;
process(cmd);
}
@Override
public Dimension getPreferredScrollableViewportSize () {
Dimension d = this.getResponsible().getSize();
Dimension res = new Dimension((int) (d.width * getDefaultWidthRatio()),
(int) (d.height * getDefaultHeightRatio()));
return res;
}
@Override
public Renderable<LevelEditing> getRenderable () {
return myGrid;
}
@Override
public int getScrollableBlockIncrement (Rectangle visibleRect, int orientation, int direction) {
return myGrid.getScrollableBlockIncrement(visibleRect, orientation, direction);
}
@Override
public boolean getScrollableTracksViewportHeight () {
return false;
}
@Override
public boolean getScrollableTracksViewportWidth () {
return false;
}
@Override
public int getScrollableUnitIncrement (Rectangle visibleRect, int orientation, int direction) {
return myGrid.getScrollableUnitIncrement(visibleRect, orientation, direction);
}
/**
* checks if grid is ready for simulation
*
* @return true if valid
*/
public boolean isValidForSimulation () {
return myGrid.isValidForSimulation();
}
/**
* Paint the contents of the canvas.
*
* Never called by you directly, instead called by Java runtime
* when area of screen covered by this container needs to be
* displayed (i.e., creation, uncovering, change in status)
*
* @param pen used to paint shape on the screen
*/
@Override
public void paintComponent (Graphics pen) {
pen.setColor(Color.WHITE);
pen.fillRect(0, 0, getSize().width, getSize().height);
if (myGrid != null) {
myGrid.paint((Graphics2D) pen);
}
}
@Override
public void render (Renderable<LevelEditing> r) {
if (r instanceof LEGrid) {
render((LEGrid) r);
}
else {
showMessageDialog(GRID_RENDERING_ERROR);
}
}
@Override
public void setRenderable (Renderable<LevelEditing> r) {
myGrid = (LEGrid) r;
setSize(myGrid.getPixelSize());
repaint();
}
/**
* Update the size of the grid in the active tab
*/
public void updateGridSize () {
myGridSpinner = new GridSpinner(myGrid.getSize().width,
myGrid.getSize().height);
int a = (int) JOptionPane.showConfirmDialog(
null, myGridSpinner,
"Update Grid Height and Width",
JOptionPane.OK_CANCEL_OPTION);
if (a == 0) {
process(CommandConstants.CHANGE_GRID_SIZE + " " +
myGridSpinner.getGridWidth() + ", " +
myGridSpinner.getGridHeight());
}
}
private class GridPositionListener implements MouseListener {
private static final int LEFT_CLICK = 3;
private static final int RIGHT_CLICK = 1;
@Override
public void mouseClicked (MouseEvent e) {
if (e.getButton() == LEFT_CLICK) {
deleteSprite(e.getX(), e.getY());
}
else if (e.getButton() == RIGHT_CLICK) {
createSprite(e.getX(), e.getY());
}
}
@Override
public void mouseEntered (MouseEvent e) {
}
@Override
public void mouseExited (MouseEvent e) {
}
@Override
public void mousePressed (MouseEvent e) {
}
@Override
public void mouseReleased (MouseEvent e) {
}
}
}