package vooga.rts.gui;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import util.Location;
import vooga.rts.IGameLoop;
import vooga.rts.commands.ClickCommand;
import vooga.rts.commands.Command;
import vooga.rts.commands.PositionCommand;
public abstract class Menu extends Observable implements IGameLoop, Observer {
protected List<Button> myButtons;
protected Image myImage;
protected AffineTransform myTransform;
public Menu () {
myButtons = new ArrayList<Button>();
}
@Override
public void update (double elapsedTime) {
}
public AffineTransform getTransform (Graphics2D pen) {
AffineTransform a = new AffineTransform();
double sx = Window.D_X;
sx /= myImage.getWidth(null);
double sy = Window.D_Y;
sy /= myImage.getHeight(null);
a.scale(sx, sy);
return a;
}
@Override
public void paint (Graphics2D pen) {
if (myImage != null) {
if (myTransform == null) {
myTransform = getTransform(pen);
}
pen.drawImage(myImage, myTransform, null);
}
for (Button b : myButtons) {
b.paint(pen);
}
}
public void setBGImage (Image i) {
myImage = i;
myTransform = null;
}
public void addButton (Button b) {
myButtons.add(b);
b.addObserver(this);
}
public void clearButtons () {
myButtons.clear();
}
public void receiveCommand (Command command) {
if (command instanceof ClickCommand) {
ClickCommand c = (ClickCommand) command;
handleMouseDown(c.getPosition());
}
else if (command instanceof PositionCommand) {
PositionCommand p = (PositionCommand) command;
handleMouseMovement(p.getPosition());
}
}
public void handleMouseDown (int x, int y) {
for (Button b : myButtons) {
if (b.checkWithinBounds(x, y)) {
b.processClick();
}
}
}
public void handleMouseDown (Location l) {
handleMouseDown((int) l.getX(), (int) l.getY());
}
public void handleMouseMovement (int x, int y) {
for (Button b : myButtons) {
if (b.checkWithinBounds(x, y)) {
b.setFocused(true);
}
else {
b.setFocused(false);
}
}
}
public void handleMouseMovement (Location l) {
handleMouseMovement((int) l.getX(), (int) l.getY());
}
@Override
public void update (Observable o, Object arg) {
setChanged();
notifyObservers(arg);
}
}