package hexenschach.gui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JLabel;
import javax.swing.JTextField;
import hexenschach.gameplay.GameContext;
import hexenschach.gui.event.GameEvent;
import hexenschach.gui.event.GameEventType;
import hexenschach.gui.resources.Images;
/**
* Dialog zum Speichern des aktuellen Spielstandes.
* @author Tobias Marquardt
*/
public class SaveDialog extends HexenschachDialog {
private static final long serialVersionUID = 2814453676448167177L;
// Eingabefeld
private JTextField input;
// Buttons
DialogButton saveButton;
DialogButton cancelButton;
// Vorhandene Spielstände
ArrayList <String> saveGames;
// Größe des Eingabefeldes
static final int xSizeTextField = 260;
static final int ySizeTextField = 30;
SaveDialog(GUI parent) {
super(parent, 300, 180);
saveGames = parent.getPersistence().getSaveGames();
initListener();
}
@Override
public void initComponents() {
// Hintergrundbild
Background background = new Background(Images.getSaveDialogBackground(), xSize, ySize);
// Label
JLabel prompt = new JLabel(Dictionary.SaveDialogPrompt);
prompt.setForeground(new Color(236, 182, 74));
prompt.setBounds(20, 10, 260, 40);
background.add(prompt);
// Eingabefeld
input = new JTextField();
input.setBackground(new Color(170, 71, 12, 255));
input.setForeground(new Color(236, 182, 74, 255));
input.setFont(new Font("Dialog", Font.PLAIN, 20));
input.setPreferredSize(new Dimension(xSizeTextField, ySizeTextField));
input.setBounds(20, 80, xSizeTextField, ySizeTextField);
background.add(input);
// Buttons
saveButton = new DialogButton("", Images.getDialogSaveButtonDefaultImage(), Images.getDialogSaveButtonRolloverImage(), Images.getDialogSaveButtonPressedImage(), Images.getDialogSaveButtonDisabledImage());
saveButton.setEnabled(false); // Button zu Beginn ausgegraut
saveButton.setBounds(60, 130, DialogButton.xSize, DialogButton.ySize);
saveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
saveButtonClicked();
}
});
cancelButton = new DialogButton("", Images.getDialogCancelButtonDefaultImage(), Images.getDialogCancelButtonRolloverImage(), Images.getDialogCancelButtonPressedImage());
cancelButton.setBounds(180, 130, DialogButton.xSize, DialogButton.ySize);
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cancelButtonClicked();
}
});
background.add(saveButton);
background.add(cancelButton);
add(background);
}
/**
* Initialisiert die benötigten Event-Listener.
*/
private void initListener() {
// Dem Textfeld einen KeyListener hinzufügen, um die Eingabe direkt zu überprüfen.
input.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
inputChanged();
}
@Override
public void keyReleased(KeyEvent e) {
inputChanged();
}
@Override
public void keyPressed(KeyEvent e) {
inputChanged();
}
});
}
@Override
public void initLayout() {}
/**
* Enthält die Aktion, die beim Klick auf den
* Abbrechen-Button ausgeführt werden soll.
*/
protected void cancelButtonClicked() {
// Fenster schließen
setVisible(false);
}
/**
* Enthält die Aktion, die beim Klick auf den
* Speichern-Button ausgeführt werden soll.
*/
protected void saveButtonClicked() {
// Aktuellen Spielstand speichern
// Sicherstellen, ob wirklich ein Gameplay vorhanden ist,
// wird eigentlich schon dadurch gemacht, dass der SaveButton in diesem Fall ausgegraut sein sollte.
// if(parent.getGameplay() == null) {
String title = input.getText();
GameContext context = parent.getGameplay().getGameContext();
parent.getPersistence().saveGame(title, context);
// Löse ein Event aus, um andere Klassen zu benachrichtigen, dass ein Spiel gespeichert wurde
GameEvent event = new GameEvent(this, GameEventType.GAME_SAVED);
parent.gameEventHappened(event);
setVisible(false);
MessageDialog saveSuccess = new MessageDialog(parent, Dictionary.SaveDialogComfirmation);
saveSuccess.setVisible(true);
// }
// else {
// setVisible(false);
// MessageDialog saveFail = new MessageDialog(parent, Dictionary.SaveDialogFail);
// saveFail.setVisible(true);
// }
}
/**
* Wird aufgerufen, wenn sich im Textfeld etwas ändert.
* Überprüft die Eingabe.
*/
private void inputChanged() {
//
if(input.getText().equals("") || saveGames.contains(input.getText()))
saveButton.setEnabled(false);
else
saveButton.setEnabled(true);
}
}