package kakuro.gui.editor;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;
import kakuro.server.ISkeletonTable;
/** Skeleton listázó dialógus. */
public class ListSkeletonDialog extends JDialog {
/** megnyitás */
private JButton openButton = null;
private final String CMD_CANCEL = "Cancel";
private final String CMD_OPEN = "Open";
/** érvényes */
private boolean valid = false;
/** címsor */
private String title = null;
/** skeleton lista */
private java.util.List<ISkeletonTable> _list = null;
/** sorok száma */
private JLabel rowCountLabel = null;
/** oszlopok száma */
private JLabel columnCountLabel = null;
/** Skeleton preview panel */
private SkeletonJPanel skeletonPanel = null;
/** lista */
private JList dataList = null;
/** A listázó dialógust rakja össze, a kapott list alapján
*
* @param parent szülő frame
* @param t címsor
* @param list skeleton-ok listája
* */
public ListSkeletonDialog(JFrame parent, String t, java.util.List<ISkeletonTable> list) {
super(parent, true);
title = t;
_list = new ArrayList<ISkeletonTable>(list);
initComponents();
setSize(480, 320);
pack();
}
/** Kiválasztott skeleton sorszámát kéri le
*
* @return skeleton sorszáma
* */
public int getSelection() {
return dataList.getSelectedIndex();
}
/** Swing komponenseket rakja össze */
private void initComponents() {
getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS));
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++) {
ISkeletonTable 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() {
int _previous = -1;
public void valueChanged(ListSelectionEvent e) {
int index = dataList.getSelectedIndex();
if (_previous==index) return;
_previous = index;
rowCountLabel.setText(_list.get(index).getRowCount()+"");
columnCountLabel.setText(_list.get(index).getColumnCount()+"");
skeletonPanel.load(_list.get(index));
pack();
}
});
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);
skeletonPanel = new SkeletonJPanel();
skeletonPanel.load(_list.get(0));
content.add(skeletonPanel);
getContentPane().add(content);
JPanel buttonPanel = createButtonPanel(); // sets global openButton
getContentPane().add(buttonPanel);
dataList.setSelectedIndex(0);
}
/** Gomb-sor összerakása
*
* @return kész gombsor
* */
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;
}
/** Egyetlen feladata, hogy a belsejében lévő preview panelt négyzet alakúra hozza. */
public class SkeletonJPanel extends JPanel {
/** skeleton modell */
ISkeletonTable _skeleton = null;
/** skeleton preview panel */
SkeletonPanel _panel = null;
/** Hátteret átlátszóvá teszi, és beállítja a speciális layout managert. */
public SkeletonJPanel() {
setOpaque(false);
setLayout(new kakuro.gui.SquareLayoutManager());
}
/** A kapott modellt betölti a preview panelbe
*
* @param s skeleton modell
* */
public void load(ISkeletonTable s) {
_skeleton = s;
if (_panel!=null) remove(_panel);
_panel = new SkeletonPanel(null, true);
_panel.load(_skeleton);
add(_panel);
}
}
}