package kakuro.gui;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;
import kakuro.table.ITable;
import kakuro.table.TableException;
/** Mentett játékok listáját feldobó dialógus ablak. */
public class ListSavedGameDialog extends JDialog {
/** megnyitás */
private JButton openButton = null;
/** mégse */
private final String CMD_CANCEL = "<html>Mégse</html>";
/** megnyitás */
private final String CMD_OPEN = "<html>Megnyitás</html>";
/** true ha megnyitás, false ha bezárták vagy mégse */
private boolean valid = false;
/** cím */
private String title = null;
/** állások listája */
private java.util.List<ITable> _list = null;
/** sorszám */
private JLabel rowCountLabel = null;
/** oszlopszám */
private JLabel columnCountLabel = null;
/** játéktábla preview */
private GameJPanel gamePanel = null;
/** jlist az állások listázásához */
private JList dataList = null;
/** Konstruktor, létrehozza a dialógust a kapott tábla állásokkal.
*
* @param parent szülő frame, ehhez képest pozicionálja magát
* @param t cím
* @param list állások listája
* */
public ListSavedGameDialog(JFrame parent, String t, java.util.List<ITable> list) {
super(parent, true);
title = t;
_list = new ArrayList<ITable>(list);
initComponents();
pack();
}
/** választott állás sorszáma
*
* @return sorszám
* */
public int getSelection() {
return dataList.getSelectedIndex();
}
/**
* Swing interfész összerakása
* */
private void initComponents() {
JPanel back = new JPanel();
back.setLayout(new BoxLayout(back, BoxLayout.PAGE_AXIS));
getContentPane().add(back);
setTitle(title);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent event) {
windowAction(CMD_CANCEL);
}
});
JPanel content = new JPanel();
content.setLayout(new BoxLayout(content, BoxLayout.LINE_AXIS));
String[] data = new String[_list.size()];
for (int i=0; i<_list.size(); i++) {
ITable s = _list.get(i);
String[] difficulties = {"Könnyű", "Közepes", "Nehéz"};
data[i] = "<html>"+(i+1)+". "+difficulties[s.getDifficulty()]+"</html>";
}
dataList = new JList(data);
dataList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
dataList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
int index = dataList.getSelectedIndex();
rowCountLabel.setText(_list.get(index).getRowCount()+"");
columnCountLabel.setText(_list.get(index).getColumnCount()+"");
gamePanel.load(_list.get(index));
pack();
repaint();
}
});
JScrollPane scrollPane = new JScrollPane(dataList);
content.add(scrollPane);
scrollPane.setMinimumSize(new Dimension(120, 240));
JPanel details = new JPanel();
details.setLayout(new GridLayout(2, 2, 5, 5));
details.add(new JLabel("<html>Sorok száma</html>"));
rowCountLabel = new JLabel("4");
details.add(rowCountLabel);
details.add(new JLabel("<html>Oszlopok száma</html>"));
columnCountLabel = new JLabel("4");
details.add(columnCountLabel);
content.add(details);
gamePanel = new GameJPanel();
content.add(gamePanel);
back.add(content);
JPanel buttonPanel = createButtonPanel();
back.add(buttonPanel);
dataList.setSelectedIndex(0);
}
/** Alsó gombsor összerakása
*
* @return gombsort tartalmazó panel
* */
private JPanel createButtonPanel() {
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, 0));
openButton = new JButton();
openButton.setText("<html>Megnyitás</html>");
openButton.setActionCommand(CMD_OPEN);
openButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
windowAction(event);
}
});
panel.add(openButton);
panel.add(Box.createRigidArea(new Dimension(5, 0)));
JButton cancelButton = new JButton();
cancelButton.setText("<html>Mégse</html>");
cancelButton.setActionCommand(CMD_CANCEL);
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
windowAction(event);
}
});
panel.add(cancelButton);
return panel;
}
/** Segédfüggvény, beállítja a kapott actionCommand alapján, hogy érvényes-e a választás, és bezárja a
* dialógust
*
* @param actionCommand action amit valamelyik gomb megnyomása vált ki
* */
private void windowAction(Object actionCommand) {
String cmd = null;
if (actionCommand != null) {
if (actionCommand instanceof ActionEvent) {
cmd = ((ActionEvent) actionCommand).getActionCommand();
} else {
cmd = actionCommand.toString();
}
}
if (cmd == null) {
} else if (cmd.equals(CMD_CANCEL)) {
valid = false;
} else if (cmd.equals(CMD_OPEN)) {
valid = true;
}
setVisible(false);
dispose();
}
/** Érvényes választás volt-e. Ha bezárták X-szel az ablakot, vagy mégse, az nem érvényes.
*
* @return true ha megnyitás volt, false minden más esetben
* */
public boolean isValid() {
return valid;
}
/** Segédpanel osztály az állás preview tárolására. Alapvetően egy feladata van:
* négyzet alakúvá alakítani a téglalap alakú preview-t. */
public class GameJPanel extends JPanel {
/** táblamodell */
ITable _table = null;
/** preview panel */
Gametable _panel = null;
/** Alap konstruktor. átlátszóvá teszi a hátteret és beállítja a {@link kakuro.gui.SquareLayoutManager}
* layoutmanagert. */
public GameJPanel() {
setOpaque(false);
setLayout(new kakuro.gui.SquareLayoutManager());
}
/** Tábla feltöltése a preview-ba.
*
* @param s táblamodell
* */
public void load(ITable s) {
try {
_table = s;
if (_panel!=null) remove(_panel);
_panel = new Gametable(null);
_panel.load(_table);
_panel.setPreferredSize(new Dimension(200, 200));
_panel.setMinimumSize(new Dimension(160, 160));
add(_panel);
} catch (TableException te) {
te.printStackTrace();
}
}
}
}