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.util.ArrayList;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.border.LineBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import hexenschach.gameplay.Gameplay;
import hexenschach.gui.resources.Images;
/**
* Dialog zum Speichern des aktuellen Spielstandes.
* @author Tobias Marquardt
*/
public class LoadDialog extends HexenschachDialog {
private static final long serialVersionUID = 2814453676448167177L;
// Liste für die Spielstände
private JList list;
// Buttons
DialogButton loadButton;
DialogButton deleteButton;
DialogButton cancelButton;
// Größe des Eingabefeldes
static final int xSizeList = 320;
static final int ySizeList = 270;
private Background background;
/**
* Erzeugt einen neuen LadenDialog
* @param parent Das GUI zu dem der Dialog gehört
*/
LoadDialog(GUI parent) {
super(parent, 400, 420);
initListener();
}
@Override
public void initComponents() {
// Hintergrundbild
background = new Background(Images.getLoadDialogBackground(), xSize, ySize);
// Label
JLabel prompt = new JLabel(Dictionary.LoadDialogPrompt);
prompt.setForeground(new Color(236, 182, 74));
prompt.setBounds(40, 10, 320, 60);
background.add(prompt);
// Liste
list = getSavegameList();
list.setBackground(new Color(170, 71, 12, 255));
list.setForeground(new Color(236, 182, 74, 255));
list.setFont(new Font("Dialog", Font.PLAIN, 15));
list.setBorder(new LineBorder(new Color(236, 182, 74, 255)));
list.setPreferredSize(new Dimension(xSizeList, ySizeList));
list.setBounds(40, 70, xSizeList, ySizeList);
background.add(list);
// Buttons
loadButton = new DialogButton("", Images.getDialogLoadButtonDefaultImage(), Images.getDialogLoadButtonRolloverImage(), Images.getDialogLoadButtonPressedImage(), Images.getDialogLoadButtonDisabledImage());
loadButton.setBounds(40, 360, DialogButton.xSize, DialogButton.ySize);
loadButton.setEnabled(false);
deleteButton = new DialogButton("", Images.getDialogDeleteButtonDefaultImage(), Images.getDialogDeleteButtonRolloverImage(), Images.getDialogDeleteButtonPressedImage(), Images.getDialogDeleteButtonDisabledImage());
deleteButton.setBounds(160, 360, DialogButton.xSize, DialogButton.ySize);
deleteButton.setEnabled(false);
cancelButton = new DialogButton("", Images.getDialogCancelButtonDefaultImage(), Images.getDialogCancelButtonRolloverImage(), Images.getDialogCancelButtonPressedImage());
cancelButton.setBounds(280, 360, DialogButton.xSize, DialogButton.ySize);
background.add(loadButton);
background.add(deleteButton);
background.add(cancelButton);
add(background);
}
/**
* Gibt eine Liste mit allen Spielständen zurück..
* @return JList mit Namen aller gespeicherten Spielstände
*/
private JList getSavegameList() {
ArrayList<String> savegamesList = parent.getPersistence().getSaveGames();
String[] savegames = new String[savegamesList.size()];
savegamesList.toArray(savegames);
JList l = new JList(savegames);
return l;
}
/**
* Refreshed die angezeigte Liste der Spielstände
*/
private void refreshSavegameList() {
list.setVisible(false);
list = getSavegameList();
list.setBackground(new Color(170, 71, 12, 255));
list.setForeground(new Color(236, 182, 74, 255));
list.setFont(new Font("Dialog", Font.PLAIN, 15));
list.setBorder(new LineBorder(new Color(236, 182, 74, 255)));
list.setPreferredSize(new Dimension(xSizeList, ySizeList));
list.setBounds(40, 70, xSizeList, ySizeList);
background.add(list);
}
@Override
public void initLayout() {}
private void initListener() {
loadButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
loadButtonClicked();
}
});
deleteButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
deleteButtonClicked();
}
});
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cancelButtonClicked();
}
});
list.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
// Nur wenn ein Eintrag in der Liste ausgewählt ist,
// kann der Laden-Button geklickt werden.
if(list.getSelectedValue() != null) {
loadButton.setEnabled(true);
deleteButton.setEnabled(true);
}
else {
loadButton.setEnabled(false);
deleteButton.setEnabled(false);
}
}
});
}
/**
* Enthält die Aktion, die beim Klick auf den
* Löschen-Button ausgeführt werden soll.
*/
protected void deleteButtonClicked() {
QuestionDialog reallyDelete = new QuestionDialog(parent, Dictionary.loadDialogDeleteQuestion) {
private static final long serialVersionUID = 4119349047659189682L;
@Override
public void yesButtonClicked() {
parent.getPersistence().deleteSaveGame(list.getSelectedValue().toString());
setVisible(false);
refreshSavegameList();
}
@Override
public void noButtonClicked() {
setVisible(false);
}
@Override
public void cancelButtonClicked() {
setVisible(false);
}
};
reallyDelete.setVisible(true);
}
/**
* 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
* Laden-Button ausgeführt werden soll.
*/
protected void loadButtonClicked() {
Gameplay loadedGame = parent.getPersistence().loadGame(list.getSelectedValue().toString(), parent);
parent.setGameplay(loadedGame);
setVisible(false);
}
}