/* * Copyright 2011 BetaSteward_at_googlemail.com. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ /* * TournamentPanel.java * * Created on 20-Jan-2011, 9:18:30 PM */ package mage.client.tournament; import java.awt.*; import java.awt.event.ActionEvent; import java.text.DateFormat; import java.util.ArrayList; import java.util.List; import java.util.UUID; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import javax.swing.*; import javax.swing.table.AbstractTableModel; import mage.client.MageFrame; import mage.client.chat.ChatPanel; import mage.client.util.ButtonColumn; import mage.remote.Session; import mage.view.RoundView; import mage.view.TournamentGameView; import mage.view.TournamentPlayerView; import mage.view.TournamentView; import org.apache.log4j.Logger; /** * * @author BetaSteward_at_googlemail.com */ public class TournamentPanel extends javax.swing.JPanel { private static final Logger logger = Logger.getLogger(TournamentPanel.class); private UUID tournamentId; private Session session; private TournamentPlayersTableModel playersModel; private TournamentMatchesTableModel matchesModel; private UpdateTournamentTask updateTask; private boolean titleSet = false; private DateFormat df; /** Creates new form TournamentPanel */ public TournamentPanel() { playersModel = new TournamentPlayersTableModel(); matchesModel = new TournamentMatchesTableModel(); initComponents(); df = DateFormat.getDateTimeInstance(); tablePlayers.createDefaultColumnsFromModel(); tableMatches.createDefaultColumnsFromModel(); chatPanel1.useExtendedView(ChatPanel.VIEW_MODE.NONE); Action action = new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { int modelRow = Integer.valueOf( e.getActionCommand() ); UUID gameId = UUID.fromString((String)tableMatches.getValueAt(modelRow, 3)); String state = (String)tableMatches.getValueAt(modelRow, 4); if (state.equals("Finished")) { logger.info("Replaying game " + gameId); session.replayGame(gameId); } } }; // replay button, don't delete this ButtonColumn buttonColumn = new ButtonColumn(tableMatches, action, 6); } public synchronized void showTournament(UUID tournamentId) { this.tournamentId = tournamentId; session = MageFrame.getSession(); MageFrame.addTournament(tournamentId, this); UUID chatRoomId = session.getTournamentChatId(tournamentId); if (session.joinTournament(tournamentId) && chatRoomId != null) { this.chatPanel1.connect(chatRoomId); startTasks(); this.setVisible(true); this.repaint(); } else { hideTournament(); } } public void hideTournament() { stopTasks(); this.chatPanel1.disconnect(); Component c = this.getParent(); while (c != null && !(c instanceof TournamentPane)) { c = c.getParent(); } if (c != null) { ((TournamentPane)c).hideFrame(); } } public void update(TournamentView tournament) { if (!titleSet) { Component c = this.getParent(); while (c != null && !(c instanceof TournamentPane)) { c = c.getParent(); } if (c != null) { ((TournamentPane)c).setTitle("Tournament [" + tournament.getTournamentName() +"]"); } titleSet = true; } txtName.setText(tournament.getTournamentName()); txtType.setText(tournament.getTournamentType()); txtStartTime.setText(df.format(tournament.getStartTime())); if (tournament.getEndTime() != null) { txtEndTime.setText(df.format(tournament.getEndTime())); btnCloseWindow.setVisible(true); } else { txtEndTime.setText("running..."); btnCloseWindow.setVisible(false); } playersModel.loadData(tournament); matchesModel.loadData(tournament); this.tablePlayers.repaint(); this.tableMatches.repaint(); } public void startTasks() { if (session != null) { if (updateTask == null || updateTask.isDone()) { updateTask = new UpdateTournamentTask(session, tournamentId, this); updateTask.execute(); } } } public void stopTasks() { if (updateTask != null) { updateTask.cancel(true); } } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents private void initComponents() { actionPanel = new javax.swing.JPanel(); lblName = new javax.swing.JLabel(); txtName = new javax.swing.JTextField(); lblType = new javax.swing.JLabel(); txtType = new javax.swing.JTextField(); lblStartTime = new javax.swing.JLabel(); txtStartTime = new javax.swing.JTextField(); lablEndTime = new javax.swing.JLabel(); txtEndTime = new javax.swing.JTextField(); btnCloseWindow = new javax.swing.JButton(); jSplitPane2 = new javax.swing.JSplitPane(); jSplitPane1 = new javax.swing.JSplitPane(); jScrollPane1 = new javax.swing.JScrollPane(); tablePlayers = new javax.swing.JTable(); jScrollPane2 = new javax.swing.JScrollPane(); tableMatches = new javax.swing.JTable(); chatPanel1 = new mage.client.chat.ChatPanel(); setPreferredSize(new java.awt.Dimension(908, 580)); lblName.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); lblName.setText("Name:"); txtName.setEditable(false); txtName.setHorizontalAlignment(javax.swing.JTextField.LEFT); txtName.setText("tournament name"); txtName.setFocusable(false); txtName.setMaximumSize(new java.awt.Dimension(50, 22)); lblType.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); lblType.setText("Type:"); txtType.setEditable(false); txtType.setHorizontalAlignment(javax.swing.JTextField.LEFT); txtType.setText("tournament type"); txtType.setFocusable(false); lblStartTime.setText("Start time:"); txtStartTime.setEditable(false); txtStartTime.setHorizontalAlignment(javax.swing.JTextField.CENTER); txtStartTime.setText("jTextField1"); txtStartTime.setFocusable(false); lablEndTime.setText("End time:"); txtEndTime.setEditable(false); txtEndTime.setHorizontalAlignment(javax.swing.JTextField.CENTER); txtEndTime.setText("jTextField2"); txtEndTime.setFocusable(false); btnCloseWindow.setText("Close Window"); btnCloseWindow.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); btnCloseWindow.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnCloseWindowActionPerformed(evt); } }); javax.swing.GroupLayout actionPanelLayout = new javax.swing.GroupLayout(actionPanel); actionPanel.setLayout(actionPanelLayout); actionPanelLayout.setHorizontalGroup( actionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(actionPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(actionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(lblName) .addComponent(lblType)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(actionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(txtName, javax.swing.GroupLayout.DEFAULT_SIZE, 260, Short.MAX_VALUE) .addComponent(txtType)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(actionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(actionPanelLayout.createSequentialGroup() .addComponent(lablEndTime) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(txtEndTime)) .addGroup(actionPanelLayout.createSequentialGroup() .addComponent(lblStartTime) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(txtStartTime, javax.swing.GroupLayout.PREFERRED_SIZE, 203, javax.swing.GroupLayout.PREFERRED_SIZE))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(btnCloseWindow, javax.swing.GroupLayout.PREFERRED_SIZE, 129, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) ); actionPanelLayout.setVerticalGroup( actionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(actionPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(actionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblName, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblStartTime) .addComponent(txtStartTime, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(9, 9, 9) .addGroup(actionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblType) .addComponent(txtType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lablEndTime) .addComponent(txtEndTime, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnCloseWindow)) .addGap(0, 14, Short.MAX_VALUE)) ); jSplitPane2.setResizeWeight(1.0); jSplitPane2.setToolTipText(""); jSplitPane1.setDividerLocation(230); jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); jSplitPane1.setResizeWeight(0.5); jScrollPane1.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); jScrollPane1.setPreferredSize(new java.awt.Dimension(400, 100)); tablePlayers.setModel(this.playersModel); jScrollPane1.setViewportView(tablePlayers); jSplitPane1.setTopComponent(jScrollPane1); jScrollPane2.setPreferredSize(new java.awt.Dimension(400, 100)); tableMatches.setModel(matchesModel); jScrollPane2.setViewportView(tableMatches); jSplitPane1.setBottomComponent(jScrollPane2); jSplitPane2.setLeftComponent(jSplitPane1); jSplitPane2.setRightComponent(chatPanel1); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(actionPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jSplitPane2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 908, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(actionPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jSplitPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 489, Short.MAX_VALUE)) ); }// //GEN-END:initComponents private void btnCloseWindowActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCloseWindowActionPerformed hideTournament(); }//GEN-LAST:event_btnCloseWindowActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel actionPanel; private javax.swing.JButton btnCloseWindow; private mage.client.chat.ChatPanel chatPanel1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JSplitPane jSplitPane1; private javax.swing.JSplitPane jSplitPane2; private javax.swing.JLabel lablEndTime; private javax.swing.JLabel lblName; private javax.swing.JLabel lblStartTime; private javax.swing.JLabel lblType; private javax.swing.JTable tableMatches; private javax.swing.JTable tablePlayers; private javax.swing.JTextField txtEndTime; private javax.swing.JTextField txtName; private javax.swing.JTextField txtStartTime; private javax.swing.JTextField txtType; // End of variables declaration//GEN-END:variables } class TournamentPlayersTableModel extends AbstractTableModel { private String[] columnNames = new String[]{"Player Name", "Points", "Results"}; private TournamentPlayerView[] players = new TournamentPlayerView[0]; public void loadData(TournamentView tournament) { players = tournament.getPlayers().toArray(new TournamentPlayerView[0]); this.fireTableDataChanged(); } @Override public int getRowCount() { return players.length; } @Override public int getColumnCount() { return columnNames.length; } @Override public Object getValueAt(int arg0, int arg1) { switch (arg1) { case 0: return players[arg0].getName(); case 1: return Integer.toString(players[arg0].getPoints()); case 2: return players[arg0].getResults(); } return ""; } @Override public String getColumnName(int columnIndex) { String colName = ""; if (columnIndex <= getColumnCount()) { colName = columnNames[columnIndex]; } return colName; } @Override public Class getColumnClass(int columnIndex){ return String.class; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } } class TournamentMatchesTableModel extends AbstractTableModel { private String[] columnNames = new String[]{"Round Number", "Players", "Match Id", "Game Id", "State", "Result", "Action"}; private TournamentGameView[] games = new TournamentGameView[0]; public void loadData(TournamentView tournament) { List views = new ArrayList(); for (RoundView round: tournament.getRounds()) { for (TournamentGameView game: round.getGames()) { views.add(game); } } games = views.toArray(new TournamentGameView[0]); this.fireTableDataChanged(); } @Override public int getRowCount() { return games.length; } @Override public int getColumnCount() { return columnNames.length; } @Override public Object getValueAt(int arg0, int arg1) { switch (arg1) { case 0: return Integer.toString(games[arg0].getRoundNum()); case 1: return games[arg0].getPlayers(); case 2: return games[arg0].getMatchId().toString(); case 3: return games[arg0].getGameId().toString(); case 4: return games[arg0].getState(); case 5: return games[arg0].getResult(); case 6: if (games[arg0].getState().equals("Finished")) { return "Replay"; } return ""; } return ""; } @Override public String getColumnName(int columnIndex) { String colName = ""; if (columnIndex <= getColumnCount()) { colName = columnNames[columnIndex]; } return colName; } @Override public Class getColumnClass(int columnIndex){ return String.class; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { if (columnIndex != 6) { return false; } return true; } } class UpdateTournamentTask extends SwingWorker { private Session session; private UUID tournamentId; private TournamentPanel panel; private static final Logger logger = Logger.getLogger(UpdateTournamentTask.class); UpdateTournamentTask(Session session, UUID tournamentId, TournamentPanel panel) { this.session = session; this.tournamentId = tournamentId; this.panel = panel; } @Override protected Void doInBackground() throws Exception { while (!isCancelled()) { this.publish(session.getTournament(tournamentId)); Thread.sleep(1000); } return null; } @Override protected void process(List view) { panel.update(view.get(0)); } @Override protected void done() { try { get(); } catch (InterruptedException ex) { logger.fatal("Update Tournament Task error", ex); } catch (ExecutionException ex) { logger.fatal("Update Tournament Task error", ex); } catch (CancellationException ex) {} } }