package hexenschach.gui;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import hexenschach.gameplay.Gameplay;
import hexenschach.gui.event.GameEvent;
import hexenschach.gui.event.GameListener;
import hexenschach.gui.resources.Images;
import hexenschach.player.Human;
import hexenschach.player.Player;
/**
* Panel, welches die Buttons zur Steuerung
* des Spielablaufs enhaelt.
* @author Tobias Marquardt
*
*/
public class GameMenu extends JPanel implements GUIContainer, GameListener{
private static final long serialVersionUID = 7076444149264653552L;
private GUI gui;
//Buttons
GameMenuButton undoButton;
GameMenuButton redoButton;
GameMenuButton autoButton;
// Größe des Panels
static final int xSize = 352;
static final int ySize = 150;
GameMenu(GUI gui) {
this.gui = gui;
initLayout();
initComponents();
initListener();
initContainerProperties();
}
public void initLayout() {
// Es wird ein Null-Layout verwendet, daher müssen alle Komponenten manuell platziert werden.
setLayout(null);
}
public void initComponents() {
// Buttons erzeugen
undoButton = new GameMenuButton(Dictionary.UndoToolTipp, Images.getUndoButtonDefaultImage(), Images.getUndoButtonRolloverImage(), Images.getUndoButtonPressedImage(), Images.getUndoButtonDisabledImage());
redoButton = new GameMenuButton(Dictionary.RedoToolTipp, Images.getRedoButtonDefaultImage(), Images.getRedoButtonRolloverImage(), Images.getRedoButtonPressedImage(), Images.getRedoButtonDisabledImage());
autoButton = new GameMenuButton(Dictionary.AutoToolTipp, Images.getAutoButtonDefaultImage(), Images.getAutoButtonRolloverImage(), Images.getAutoButtonPressedImage(), Images.getAutoButtonDisabledImage());
// Beim Positionieren der Buttons im null-Layout muss auch
// deren Größe angegeben werden. Daher wird diese hier aus der Klasse
// GameMenuButton ermittelt:
int xSizeButton = GameMenuButton.xSize;
int ySizeButton = GameMenuButton.ySize;
// Buttons positionieren
undoButton.setBounds(75, 33, xSizeButton, ySizeButton);
redoButton.setBounds(75, 72, xSizeButton, ySizeButton);
autoButton.setBounds(75, 111, xSizeButton, ySizeButton);
// Buttons zu Beginn deaktivieren
undoButton.setEnabled(false);
redoButton.setEnabled(false);
autoButton.setEnabled(false);
// Buttons hinzufuegen
add(undoButton);
add(redoButton);
add(autoButton);
}
public void initContainerProperties() {
setOpaque(false); //Paneltransparenz
setBorder(null);
setPreferredSize(new Dimension(xSize, ySize));
}
/**
* Fügt sicht selbst als dem GUI als GameListener hinzu
* und fügt den Buttons ActionListener in Form
* innerer anonymer Klassen hinzu.
*/
private void initListener() {
gui.addGameListener(this);
undoButton.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
undoButtonClicked();
}
}
);
redoButton.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
redoButtonClicked();
}
}
);
autoButton.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
autoButtonClicked();
}
}
);
}
// Für jeden Button gibt es hier eine Clicked-Methode, die vom jeweiligen ActionListener aufgerufen wird.
// Dient vorallem der Übersichtlichkeit.
/**
* Aktion beim Klick auf den Rückgängig-Button.
*/
private void undoButtonClicked() {
if(gui.getGameplay() != null)
gui.getGameplay().undo();
}
/**
* Aktion beim Klick auf den Wiederholen-Button.
*/
private void redoButtonClicked() {
if(gui.getGameplay() != null)
gui.getGameplay().redo();
}
/**
* Aktion beim Klick auf den Automatisch-Button.
*/
private void autoButtonClicked() {
if(gui.getGameplay() != null)
gui.getGameplay().autoMove();
//Wenn noch kein Spiel läuft, soll einfach ein neues Spiel mit 3 menschlichen Spielern
//automatisch erstellt und gestartet werden.
else
startNewGame();
}
/**
* Erzeugt ein Neues Gameplay,
*/
private void startNewGame() {
// 3 menschliche Spieler erstellen
Player player1 = new Human(true, "white");
Player player2 = new Human(true, "brown");
Player player3 = new Human(true, "black");
// Gameplay erzeugen
Gameplay gameplay = new Gameplay(player1, player2, player3, gui);
gui.setGameplay(gameplay);
}
@Override
public void gameStarted(GameEvent e) {
// Buttons nach Start eines neuen Spiel aktivieren
undoButton.setEnabled(true);
redoButton.setEnabled(true);
autoButton.setEnabled(true);
}
@Override
public void gameFinished(GameEvent e) {
undoButton.setEnabled(false);
redoButton.setEnabled(false);
autoButton.setEnabled(false);
}
@Override
public void gameSaved(GameEvent e) {
}
}