package magic.ui.dialog;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import magic.test.TestGameBuilder;
import magic.ui.ScreenController;
import magic.translate.MText;
import magic.ui.dialog.button.CancelButton;
import magic.utility.MagicSystem;
import net.miginfocom.swing.MigLayout;
@SuppressWarnings("serial")
public class GameStateRunner
extends MagicDialog
implements ActionListener {
private JList<String> testClasses = new JList<>();
public GameStateRunner() {
super(MText.get("Test Classes (double-click to select)"), new Dimension(500, 460));
setLookAndFeel();
refreshLayout();
this.setVisible(true);
}
private void refreshLayout() {
final JPanel panel = getDialogContentPanel();
panel.setLayout(new MigLayout("flowy, gap 0, insets 2 6 6 6"));
panel.add(getMainPanel(), "w 100%, h 100%");
panel.add(getButtonPanel(), "w 100%, h 30!, pushy, aligny bottom");
}
private void setLookAndFeel() {
}
private String[] getListOfTestClasses() throws IOException, URISyntaxException {
final List<String> classes = new ArrayList<>();
for (final String c : MText.getClassNamesInPackage(MagicSystem.getJarFile(), "magic.test")) {
final String longClassName = c.substring(0, c.length() - ".class".length());
final String shortClassName = longClassName.substring(longClassName.lastIndexOf(".") + 1);
final boolean isValid = shortClassName.startsWith("Test")
&& !shortClassName.equals("TestGameBuilder")
&& !shortClassName.equals("TestGameBuilder$1");
if (isValid) {
classes.add(shortClassName);
}
}
return classes.toArray(new String[classes.size()]);
}
private void LoadTestClassAndRun(String testClassName) {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
ScreenController.showDuelGameScreen(TestGameBuilder.buildGame(testClassName));
doCancelAndClose();
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
private JPanel getMainPanel() {
try {
testClasses = new JList<>(getListOfTestClasses());
} catch (IOException | URISyntaxException ex) {
System.err.println(ex);
}
testClasses.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
testClasses.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) {
LoadTestClassAndRun(testClasses.getSelectedValue());
}
}
});
final JScrollPane listScroller = new JScrollPane(testClasses);
listScroller.setPreferredSize(new Dimension(getWidth(), getHeight()));
final JPanel panel = new JPanel(new MigLayout("insets 0, gap 0"));
panel.add(listScroller, "w 100%, h 100%");
return panel;
}
private JButton getCancelButton() {
final JButton btn = new CancelButton();
btn.setFocusable(false);
btn.addActionListener(getCancelAction());
return btn;
}
private JPanel getButtonPanel() {
final JPanel panel = new JPanel(new MigLayout("insets 0, alignx right, aligny bottom"));
panel.add(getCancelButton());
return panel;
}
@Override
public void actionPerformed(final ActionEvent event) {
// do nothing.
}
private void doCancelAndClose() {
dispose();
}
@Override
protected AbstractAction getCancelAction() {
return new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
doCancelAndClose();
}
};
}
}