package magic.ui.screen.stats; import java.awt.Color; import java.awt.event.ActionEvent; import java.io.File; import java.sql.SQLException; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JSpinner; import magic.data.stats.h2.H2Database; import magic.ui.FontsAndBorders; import magic.ui.widget.M.MFileLink; import magic.ui.widget.M.MScrollPane; import magic.ui.widget.TexturedPanel; import net.miginfocom.swing.MigLayout; @SuppressWarnings("serial") class StatsContentPanel extends TexturedPanel implements IPagination { private GameStatsTableModel tm; private GameStatsJTable table; private final MScrollPane scrollpane = new MScrollPane(); private TestGameRunner runner; private final ActionPanel actionPanel; private PaginationPanel paginator; private final StatsScreen screen; StatsContentPanel(StatsScreen screen) throws SQLException { this.screen = screen; setBackground(FontsAndBorders.TRANSLUCENT_WHITE_STRONG); setLayout(new MigLayout("flowy", "[fill, grow]")); actionPanel = new ActionPanel(); add(actionPanel); refreshStatsTable(); if (tm != null) { table = new GameStatsJTable(tm); scrollpane.setViewportView(table); scrollpane.setOpaque(false); scrollpane.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY)); add(scrollpane.component(), "w 100%, h 100%"); paginator = new PaginationPanel(this); add(paginator); } } void notifyTestGameRunnerProcess(Integer games) { System.out.println("Games complete : " + games); actionPanel.runButton.setText("Games complete : " + games); } void setTableModel() { if (table != null) { table.setModel(tm); } } private int getPrevPageNum() { return tm.getPrevPageNum(); } private int getNextPageNum() { return tm.getNextPageNum(); } @Override public int getTotalPages() { return tm.getTotalPages(); } @Override public int getPageNum() { return tm.getPageNum(); } @Override public boolean hasPrevPage() { return tm.hasPrevPage(); } @Override public boolean hasNextPage() { return tm.hasNextPage(); } private final JSpinner gamesSpinner = new JSpinner(); @Override public void displayNextPage() { refreshStatsTable(getNextPageNum()); setTableModel(); } @Override public void displayLastPage() { refreshStatsTable(getTotalPages()); setTableModel(); } @Override public void displayPreviousPage() { refreshStatsTable(getPrevPageNum()); setTableModel(); } @Override public void displayFirstPage() { refreshStatsTable(1); setTableModel(); } private class ActionPanel extends JPanel { private final JButton runButton; public ActionPanel() { setOpaque(false); setLayout(new MigLayout("insets 0")); runButton = new JButton("Run test game..."); runButton.addActionListener(new AbstractAction("Run test game...") { @Override public void actionPerformed(ActionEvent e) { runButton.setEnabled(false); runButton.setText("Running test games: " + gamesSpinner.getValue()); doRunTestGame((int)gamesSpinner.getValue()); } }); gamesSpinner.setValue(10); MFileLink dbLink = new MFileLink(); dbLink.setFile(new File(H2Database.getDatabaseFile() + ".mv.db")); add(runButton, "w 200!"); add(gamesSpinner, "w 60!"); add(dbLink.component(), "w 100%"); } private void setRunButtonEnabled(boolean b) { runButton.setEnabled(b); runButton.setText("Run test game..."); } } void refreshStatsTable(int page) { tm = new GameStatsTableModel(page); } private void refreshStatsTable() { tm = new GameStatsTableModel(); screen.setTotalGames(tm.getTotalGames()); } private void doRunTestGame(int totalGames) { if (runner != null && !runner.isDone()) { runner.cancel(true); } runner = new TestGameRunner(this, totalGames); runner.execute(); } void onTestGameRunnerFinished() { System.out.println("=== done ==="); actionPanel.setRunButtonEnabled(true); refreshStatsTable(); if (table != null) { table.setModel(tm); } paginator.refresh(); } boolean isReadyToClose() { return true; } }