diff --git a/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java b/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java index 0e3121f61d..c47059ed79 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java @@ -51,6 +51,7 @@ public class NewTableDialog extends MageDialog { this.spnNumWins.setModel(new SpinnerNumberModel(1, 1, 5, 1)); this.spnFreeMulligans.setModel(new SpinnerNumberModel(0, 0, 5, 1)); this.spnQuitRatio.setModel(new SpinnerNumberModel(100, 0, 100, 5)); + this.spnMinimumRating.setModel(new SpinnerNumberModel(0, 0, 3000, 10)); this.spnEdhPowerLevel.setModel(new SpinnerNumberModel(100, 0, 100, 5)); MageFrame.getUI().addButton(MageComponents.NEW_TABLE_OK_BUTTON, btnOK); } @@ -102,8 +103,10 @@ public class NewTableDialog extends MageDialog { btnPreviousConfiguration2 = new javax.swing.JButton(); btnCancel = new javax.swing.JButton(); lblQuitRatio = new javax.swing.JLabel(); + lblMinimumRating = new javax.swing.JLabel(); lblEdhPowerLevel = new javax.swing.JLabel(); spnQuitRatio = new javax.swing.JSpinner(); + spnMinimumRating = new javax.swing.JSpinner(); spnEdhPowerLevel = new javax.swing.JSpinner(); setTitle("New Table"); @@ -186,9 +189,11 @@ public class NewTableDialog extends MageDialog { btnCancel.addActionListener(evt -> btnCancelActionPerformed(evt)); lblQuitRatio.setText("Allowed quit %"); + lblMinimumRating.setText("Minimum rating"); lblEdhPowerLevel.setText("EDH power level"); spnQuitRatio.setToolTipText("Players with quit % more than this value can't join this table"); + spnMinimumRating.setToolTipText("Players with rating less than this value can't join this table"); spnEdhPowerLevel.setToolTipText("Players with decks with a higher power level can't join this table"); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); @@ -239,9 +244,10 @@ public class NewTableDialog extends MageDialog { .addComponent(lblQuitRatio) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(spnQuitRatio, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lblEdhPowerLevel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(lblMinimumRating) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(spnEdhPowerLevel, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE)))) + .addComponent(spnMinimumRating, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addComponent(jLabel1, javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() @@ -270,7 +276,11 @@ public class NewTableDialog extends MageDialog { .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblNumWins) - .addComponent(spnNumWins, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addComponent(spnNumWins, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lblEdhPowerLevel) + .addComponent(spnEdhPowerLevel, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE))) .addComponent(jSeparator2) .addComponent(player1Panel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(pnlOtherPlayers, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) @@ -297,14 +307,13 @@ public class NewTableDialog extends MageDialog { .addComponent(cbTimeLimit, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(cbDeckType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lbDeckType) + .addComponent(cbDeckType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(chkRated) .addComponent(lblQuitRatio) - .addComponent(chkRated) .addComponent(spnQuitRatio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lblEdhPowerLevel) - .addComponent(chkRated) - .addComponent(spnEdhPowerLevel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(lblMinimumRating) + .addComponent(spnMinimumRating, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) @@ -326,6 +335,7 @@ public class NewTableDialog extends MageDialog { .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblSkillLevel) .addComponent(lblNumWins) + .addComponent(lblEdhPowerLevel) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblRange) .addComponent(lblAttack))) @@ -334,7 +344,8 @@ public class NewTableDialog extends MageDialog { .addComponent(cbRange, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(cbAttackOption, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(cbSkillLevel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(spnNumWins, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) + .addComponent(spnNumWins, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(spnEdhPowerLevel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) @@ -394,6 +405,7 @@ public class NewTableDialog extends MageDialog { options.setFreeMulligans((Integer) this.spnFreeMulligans.getValue()); options.setPassword(this.txtPassword.getText()); options.setQuitRatio((Integer) this.spnQuitRatio.getValue()); + options.setMinimumRating((Integer) this.spnMinimumRating.getValue()); options.setEdhPowerLevel((Integer) this.spnEdhPowerLevel.getValue()); String serverAddress = SessionHandler.getSession().getServerHostname().orElseGet(() -> ""); options.setBannedUsers(IgnoreList.ignoreList(serverAddress)); @@ -695,6 +707,7 @@ public class NewTableDialog extends MageDialog { } this.spnQuitRatio.setValue(Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TABLE_QUIT_RATIO, "100"))); + this.spnMinimumRating.setValue(Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TABLE_MINIMUM_RATING + versionStr, "0"))); this.spnEdhPowerLevel.setValue(0); } @@ -729,6 +742,7 @@ public class NewTableDialog extends MageDialog { PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TABLE_SPECTATORS_ALLOWED + versionStr, options.isSpectatorsAllowed() ? "Yes" : "No"); PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TABLE_PLANECHASE + versionStr, options.isPlaneChase() ? "Yes" : "No"); PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TABLE_QUIT_RATIO + versionStr, Integer.toString(options.getQuitRatio())); + PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TABLE_MINIMUM_RATING + versionStr, Integer.toString(options.getMinimumRating())); StringBuilder playerTypesString = new StringBuilder(); for (Object player : players) { if (playerTypesString.length() > 0) { @@ -770,6 +784,7 @@ public class NewTableDialog extends MageDialog { private javax.swing.JLabel lblNumWins; private javax.swing.JLabel lblPassword; private javax.swing.JLabel lblQuitRatio; + private javax.swing.JLabel lblMinimumRating; private javax.swing.JLabel lblEdhPowerLevel; private javax.swing.JLabel lblRange; private javax.swing.JLabel lblSkillLevel; @@ -779,6 +794,7 @@ public class NewTableDialog extends MageDialog { private javax.swing.JSpinner spnNumPlayers; private javax.swing.JSpinner spnNumWins; private javax.swing.JSpinner spnQuitRatio; + private javax.swing.JSpinner spnMinimumRating; private javax.swing.JSpinner spnEdhPowerLevel; private javax.swing.JTextField txtName; private javax.swing.JTextField txtPassword; diff --git a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java index ee0d5aded5..fef9bdab40 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java @@ -75,6 +75,7 @@ public class NewTournamentDialog extends MageDialog { this.spnConstructTime.setModel(new SpinnerNumberModel(10, CONSTRUCTION_TIME_MIN, CONSTRUCTION_TIME_MAX, 2)); this.spnNumRounds.setModel(new SpinnerNumberModel(2, 2, 10, 1)); this.spnQuitRatio.setModel(new SpinnerNumberModel(100, 0, 100, 5)); + this.spnMinimumRating.setModel(new SpinnerNumberModel(0, 0, 3000, 10)); } public void showDialog(UUID roomId) { @@ -165,6 +166,8 @@ public class NewTournamentDialog extends MageDialog { pnlRandomPacks = new javax.swing.JPanel(); lblQuitRatio = new javax.swing.JLabel(); spnQuitRatio = new javax.swing.JSpinner(); + lblMinimumRating = new javax.swing.JLabel(); + spnMinimumRating = new javax.swing.JSpinner(); setTitle("New Tournament"); @@ -315,8 +318,10 @@ public class NewTournamentDialog extends MageDialog { pnlRandomPacks.setLayout(new javax.swing.BoxLayout(pnlRandomPacks, javax.swing.BoxLayout.Y_AXIS)); lblQuitRatio.setText("Allowed quit %:"); + lblMinimumRating.setText("Minimum rating:"); spnQuitRatio.setToolTipText("Players with quit % more than this value can't join this table"); + spnMinimumRating.setToolTipText("Players with rating less than this value can't join this table"); spnNumSeats.setToolTipText("The number of seats for each duel. If more than 2, will set number of wins to 1"); spnNumPlayers.setToolTipText("The total number of players who will draft"); @@ -386,11 +391,15 @@ public class NewTournamentDialog extends MageDialog { .addComponent(lblNumWins) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(spnNumWins, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(lblQuitRatio) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(spnQuitRatio, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(lblMinimumRating) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(spnMinimumRating, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(chkRated)) .addComponent(cbTournamentType, javax.swing.GroupLayout.PREFERRED_SIZE, 290, javax.swing.GroupLayout.PREFERRED_SIZE))) .addGroup(layout.createSequentialGroup() @@ -444,6 +453,8 @@ public class NewTournamentDialog extends MageDialog { .addComponent(spnNumWins, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblQuitRatio) .addComponent(spnQuitRatio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lblMinimumRating) + .addComponent(spnMinimumRating, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(chkRated)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) @@ -522,6 +533,7 @@ public class NewTournamentDialog extends MageDialog { tOptions.setWatchingAllowed(cbAllowSpectators.isSelected()); tOptions.setPlaneChase(cbPlaneChase.isSelected()); tOptions.setQuitRatio((Integer) spnQuitRatio.getValue()); + tOptions.setMinimumRating((Integer) spnMinimumRating.getValue()); for (TournamentPlayerPanel player : players) { tOptions.getPlayerTypes().add((PlayerType) player.getPlayerType().getSelectedItem()); } @@ -1065,6 +1077,7 @@ public class NewTournamentDialog extends MageDialog { this.spnFreeMulligans.setValue(Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_NUMBER_OF_FREE_MULLIGANS + versionStr, "0"))); this.spnNumWins.setValue(Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_NUMBER_OF_WINS + versionStr, "2"))); this.spnQuitRatio.setValue(Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_QUIT_RATIO + versionStr, "100"))); + this.spnMinimumRating.setValue(Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_MINIMUM_RATING + versionStr, "0"))); TournamentTypeView tournamentType = (TournamentTypeView) cbTournamentType.getSelectedItem(); activatePanelElements(tournamentType); @@ -1150,6 +1163,7 @@ public class NewTournamentDialog extends MageDialog { PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_NUMBER_OF_FREE_MULLIGANS + versionStr, Integer.toString(tOptions.getMatchOptions().getFreeMulligans())); PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_NUMBER_OF_WINS + versionStr, Integer.toString(tOptions.getMatchOptions().getWinsNeeded())); PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_QUIT_RATIO + versionStr, Integer.toString(tOptions.getQuitRatio())); + PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_MINIMUM_RATING + versionStr, Integer.toString(tOptions.getMinimumRating())); if (tOptions.getTournamentType().startsWith("Sealed")) { PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PACKS_SEALED + versionStr, tOptions.getLimitedOptions().getSetCodes().toString()); @@ -1221,6 +1235,7 @@ public class NewTournamentDialog extends MageDialog { private javax.swing.JLabel lblPassword; private javax.swing.JLabel lblPlayer1; private javax.swing.JLabel lblQuitRatio; + private javax.swing.JLabel lblMinimumRating; private javax.swing.JLabel lblTournamentType; private mage.client.table.NewPlayerPanel player1Panel; private javax.swing.JPanel pnlDraftOptions; @@ -1235,6 +1250,7 @@ public class NewTournamentDialog extends MageDialog { private javax.swing.JSpinner spnNumRounds; private javax.swing.JSpinner spnNumWins; private javax.swing.JSpinner spnQuitRatio; + private javax.swing.JSpinner spnMinimumRating; private javax.swing.JTextField txtName; private javax.swing.JTextField txtPassword; private org.jdesktop.beansbinding.BindingGroup bindingGroup; diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java index 4d595a005a..5826d2c85b 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java @@ -222,6 +222,7 @@ public class PreferencesDialog extends javax.swing.JDialog { public static final String KEY_NEW_TABLE_NUMBER_PLAYERS = "newTableNumberPlayers"; public static final String KEY_NEW_TABLE_PLAYER_TYPES = "newTablePlayerTypes"; public static final String KEY_NEW_TABLE_QUIT_RATIO = "newTableQuitRatio"; + public static final String KEY_NEW_TABLE_MINIMUM_RATING = "newTableMinimumRating"; public static final String KEY_NEW_TABLE_RATED = "newTableRated"; // pref setting for new tournament dialog @@ -243,6 +244,7 @@ public class PreferencesDialog extends javax.swing.JDialog { public static final String KEY_NEW_TOURNAMENT_ALLOW_ROLLBACKS = "newTournamentAllowRollbacks"; public static final String KEY_NEW_TOURNAMENT_DECK_FILE = "newTournamentDeckFile"; public static final String KEY_NEW_TOURNAMENT_QUIT_RATIO = "newTournamentQuitRatio"; + public static final String KEY_NEW_TOURNAMENT_MINIMUM_RATING = "newTournamentMinimumRating"; public static final String KEY_NEW_TOURNAMENT_RATED = "newTournamentRated"; // pref setting for deck generator diff --git a/Mage.Client/src/main/java/mage/client/table/TablesPanel.java b/Mage.Client/src/main/java/mage/client/table/TablesPanel.java index 30c5d8e4ac..59963ff299 100644 --- a/Mage.Client/src/main/java/mage/client/table/TablesPanel.java +++ b/Mage.Client/src/main/java/mage/client/table/TablesPanel.java @@ -196,161 +196,162 @@ } });*/ - // default sort by created date (last games from above) - ArrayList list = new ArrayList(); - list.add(new RowSorter.SortKey(TableTableModel.COLUMN_CREATED, SortOrder.DESCENDING)); - activeTablesSorter.setSortKeys(list); - TableUtil.setColumnWidthAndOrder(tableTables, DEFAULT_COLUMNS_WIDTH, KEY_TABLES_COLUMNS_WIDTH, KEY_TABLES_COLUMNS_ORDER); + // default sort by created date (last games from above) + ArrayList list = new ArrayList(); + list.add(new RowSorter.SortKey(TableTableModel.COLUMN_CREATED, SortOrder.DESCENDING)); + activeTablesSorter.setSortKeys(list); - // 2. TABLE COMPLETED - completedTablesSorter = new MageTableRowSorter(matchesModel); - tableCompleted.setRowSorter(completedTablesSorter); + TableUtil.setColumnWidthAndOrder(tableTables, DEFAULT_COLUMNS_WIDTH, KEY_TABLES_COLUMNS_WIDTH, KEY_TABLES_COLUMNS_ORDER); - // duration - tableCompleted.getColumnModel().getColumn(MatchesTableModel.COLUMN_DURATION).setCellRenderer(durationCellRenderer); - // start-end - tableCompleted.getColumnModel().getColumn(MatchesTableModel.COLUMN_START).setCellRenderer(datetimeCellRenderer); - tableCompleted.getColumnModel().getColumn(MatchesTableModel.COLUMN_END).setCellRenderer(datetimeCellRenderer); - // default sort by ended date (last games from above) - ArrayList list2 = new ArrayList(); - list2.add(new RowSorter.SortKey(MatchesTableModel.COLUMN_END, SortOrder.DESCENDING)); - completedTablesSorter.setSortKeys(list2); + // 2. TABLE COMPLETED + completedTablesSorter = new MageTableRowSorter(matchesModel); + tableCompleted.setRowSorter(completedTablesSorter); - // 3. CHAT - chatPanelMain.getUserChatPanel().useExtendedView(ChatPanelBasic.VIEW_MODE.NONE); - chatPanelMain.getUserChatPanel().setBorder(null); - chatPanelMain.getUserChatPanel().setChatType(ChatPanelBasic.ChatType.TABLES); + // duration + tableCompleted.getColumnModel().getColumn(MatchesTableModel.COLUMN_DURATION).setCellRenderer(durationCellRenderer); + // start-end + tableCompleted.getColumnModel().getColumn(MatchesTableModel.COLUMN_START).setCellRenderer(datetimeCellRenderer); + tableCompleted.getColumnModel().getColumn(MatchesTableModel.COLUMN_END).setCellRenderer(datetimeCellRenderer); + // default sort by ended date (last games from above) + ArrayList list2 = new ArrayList(); + list2.add(new RowSorter.SortKey(MatchesTableModel.COLUMN_END, SortOrder.DESCENDING)); + completedTablesSorter.setSortKeys(list2); - // 4. BUTTONS - filterButtons = new JToggleButton[]{btnStateWaiting, btnStateActive, btnStateFinished, - btnTypeMatch, btnTypeTourneyConstructed, btnTypeTourneyLimited, - btnFormatBlock, btnFormatStandard, btnFormatModern, btnFormatLegacy, btnFormatVintage, btnFormatCommander, btnFormatTinyLeader, btnFormatLimited, btnFormatOther, - btnSkillBeginner, btnSkillCasual, btnSkillSerious, btnRated, btnUnrated, btnOpen, btnPassword}; + // 3. CHAT + chatPanelMain.getUserChatPanel().useExtendedView(ChatPanelBasic.VIEW_MODE.NONE); + chatPanelMain.getUserChatPanel().setBorder(null); + chatPanelMain.getUserChatPanel().setChatType(ChatPanelBasic.ChatType.TABLES); - JComponent[] components = new JComponent[]{chatPanelMain, jSplitPane1, jScrollPaneTablesActive, jScrollPaneTablesFinished, jPanelTop, jPanelTables}; - for (JComponent component : components) { - component.setOpaque(false); - } + // 4. BUTTONS + filterButtons = new JToggleButton[]{btnStateWaiting, btnStateActive, btnStateFinished, + btnTypeMatch, btnTypeTourneyConstructed, btnTypeTourneyLimited, + btnFormatBlock, btnFormatStandard, btnFormatModern, btnFormatLegacy, btnFormatVintage, btnFormatCommander, btnFormatTinyLeader, btnFormatLimited, btnFormatOther, + btnSkillBeginner, btnSkillCasual, btnSkillSerious, btnRated, btnUnrated, btnOpen, btnPassword}; - jScrollPaneTablesActive.getViewport().setBackground(new Color(255, 255, 255, 50)); - jScrollPaneTablesFinished.getViewport().setBackground(new Color(255, 255, 255, 50)); + JComponent[] components = new JComponent[]{chatPanelMain, jSplitPane1, jScrollPaneTablesActive, jScrollPaneTablesFinished, jPanelTop, jPanelTables}; + for (JComponent component : components) { + component.setOpaque(false); + } - restoreFilters(); - setGUISize(); + jScrollPaneTablesActive.getViewport().setBackground(new Color(255, 255, 255, 50)); + jScrollPaneTablesFinished.getViewport().setBackground(new Color(255, 255, 255, 50)); - Action openTableAction; - openTableAction = new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - int modelRow = Integer.valueOf(e.getActionCommand()); - UUID tableId = (UUID) tableModel.getValueAt(modelRow, TableTableModel.ACTION_COLUMN + 3); - UUID gameId = (UUID) tableModel.getValueAt(modelRow, TableTableModel.ACTION_COLUMN + 2); - String action = (String) tableModel.getValueAt(modelRow, TableTableModel.ACTION_COLUMN); - String deckType = (String) tableModel.getValueAt(modelRow, TableTableModel.COLUMN_DECK_TYPE); - boolean isTournament = (Boolean) tableModel.getValueAt(modelRow, TableTableModel.ACTION_COLUMN + 1); - String owner = (String) tableModel.getValueAt(modelRow, TableTableModel.COLUMN_OWNER); - String pwdColumn = (String) tableModel.getValueAt(modelRow, TableTableModel.COLUMN_PASSWORD); - switch (action) { - case "Join": - if (owner.equals(SessionHandler.getUserName()) || owner.startsWith(SessionHandler.getUserName() + ',')) { - try { - JDesktopPane desktopPane = (JDesktopPane) MageFrame.getUI().getComponent(MageComponents.DESKTOP_PANE); - JInternalFrame[] windows = desktopPane.getAllFramesInLayer(javax.swing.JLayeredPane.DEFAULT_LAYER); - for (JInternalFrame frame : windows) { - if (frame.getTitle().equals("Waiting for players")) { - frame.toFront(); - frame.setVisible(true); - try { - frame.setSelected(true); - } catch (PropertyVetoException ve) { - LOGGER.error(ve); - } - } + restoreFilters(); + setGUISize(); - } - } catch (InterruptedException ex) { - LOGGER.error(ex); - } - return; - } - if (isTournament) { - LOGGER.info("Joining tournament " + tableId); - if (deckType.startsWith("Limited")) { - if (TableTableModel.PASSWORD_VALUE_YES.equals(pwdColumn)) { - joinTableDialog.showDialog(roomId, tableId, true, deckType.startsWith("Limited")); - } else { - SessionHandler.joinTournamentTable(roomId, tableId, SessionHandler.getUserName(), PlayerType.HUMAN, 1, null, ""); - } - } else { - joinTableDialog.showDialog(roomId, tableId, true, deckType.startsWith("Limited")); - } - } else { - LOGGER.info("Joining table " + tableId); - joinTableDialog.showDialog(roomId, tableId, false, false); - } - break; - case "Remove": - UserRequestMessage message = new UserRequestMessage("Removing table", "Are you sure you want to remove table?"); - message.setButton1("No", null); - message.setButton2("Yes", PlayerAction.CLIENT_REMOVE_TABLE); - MageFrame.getInstance().showUserRequestDialog(message); - break; - case "Show": - if (isTournament) { - LOGGER.info("Showing tournament table " + tableId); - SessionHandler.watchTable(roomId, tableId); - } - break; - case "Watch": - if (!isTournament) { - LOGGER.info("Watching table " + tableId); - SessionHandler.watchTable(roomId, tableId); - } - break; - case "Replay": - LOGGER.info("Replaying game " + gameId); - SessionHandler.replayGame(gameId); - break; - } - } - }; + Action openTableAction; + openTableAction = new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + int modelRow = Integer.valueOf(e.getActionCommand()); + UUID tableId = (UUID) tableModel.getValueAt(modelRow, TableTableModel.ACTION_COLUMN + 3); + UUID gameId = (UUID) tableModel.getValueAt(modelRow, TableTableModel.ACTION_COLUMN + 2); + String action = (String) tableModel.getValueAt(modelRow, TableTableModel.ACTION_COLUMN); + String deckType = (String) tableModel.getValueAt(modelRow, TableTableModel.COLUMN_DECK_TYPE); + boolean isTournament = (Boolean) tableModel.getValueAt(modelRow, TableTableModel.ACTION_COLUMN + 1); + String owner = (String) tableModel.getValueAt(modelRow, TableTableModel.COLUMN_OWNER); + String pwdColumn = (String) tableModel.getValueAt(modelRow, TableTableModel.COLUMN_PASSWORD); + switch (action) { + case "Join": + if (owner.equals(SessionHandler.getUserName()) || owner.startsWith(SessionHandler.getUserName() + ',')) { + try { + JDesktopPane desktopPane = (JDesktopPane) MageFrame.getUI().getComponent(MageComponents.DESKTOP_PANE); + JInternalFrame[] windows = desktopPane.getAllFramesInLayer(javax.swing.JLayeredPane.DEFAULT_LAYER); + for (JInternalFrame frame : windows) { + if (frame.getTitle().equals("Waiting for players")) { + frame.toFront(); + frame.setVisible(true); + try { + frame.setSelected(true); + } catch (PropertyVetoException ve) { + LOGGER.error(ve); + } + } - Action closedTableAction; - closedTableAction = new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - int modelRow = Integer.valueOf(e.getActionCommand()); - String action = (String) matchesModel.getValueAt(modelRow, MatchesTableModel.COLUMN_ACTION); - switch (action) { - case "Replay": - java.util.List<UUID> gameList = matchesModel.getListofGames(modelRow); - if (gameList != null && !gameList.isEmpty()) { - if (gameList.size() == 1) { - SessionHandler.replayGame(gameList.get(0)); - } else { - gameChooser.show(gameList, MageFrame.getDesktop().getMousePosition()); - } - } - // MageFrame.getDesktop().showTournament(tournamentId); - break; - case "Show": - if (matchesModel.isTournament(modelRow)) { - LOGGER.info("Showing tournament table " + matchesModel.getTableId(modelRow)); - SessionHandler.watchTable(roomId, matchesModel.getTableId(modelRow)); - } - break; - } - } - }; + } + } catch (InterruptedException ex) { + LOGGER.error(ex); + } + return; + } + if (isTournament) { + LOGGER.info("Joining tournament " + tableId); + if (deckType.startsWith("Limited")) { + if (TableTableModel.PASSWORD_VALUE_YES.equals(pwdColumn)) { + joinTableDialog.showDialog(roomId, tableId, true, deckType.startsWith("Limited")); + } else { + SessionHandler.joinTournamentTable(roomId, tableId, SessionHandler.getUserName(), PlayerType.HUMAN, 1, null, ""); + } + } else { + joinTableDialog.showDialog(roomId, tableId, true, deckType.startsWith("Limited")); + } + } else { + LOGGER.info("Joining table " + tableId); + joinTableDialog.showDialog(roomId, tableId, false, false); + } + break; + case "Remove": + UserRequestMessage message = new UserRequestMessage("Removing table", "Are you sure you want to remove table?"); + message.setButton1("No", null); + message.setButton2("Yes", PlayerAction.CLIENT_REMOVE_TABLE); + MageFrame.getInstance().showUserRequestDialog(message); + break; + case "Show": + if (isTournament) { + LOGGER.info("Showing tournament table " + tableId); + SessionHandler.watchTable(roomId, tableId); + } + break; + case "Watch": + if (!isTournament) { + LOGGER.info("Watching table " + tableId); + SessionHandler.watchTable(roomId, tableId); + } + break; + case "Replay": + LOGGER.info("Replaying game " + gameId); + SessionHandler.replayGame(gameId); + break; + } + } + }; - // !!!! adds action buttons to the table panel (don't delete this) - actionButton1 = new ButtonColumn(tableTables, openTableAction, tableTables.convertColumnIndexToView(TableTableModel.ACTION_COLUMN)); - actionButton2 = new ButtonColumn(tableCompleted, closedTableAction, tableCompleted.convertColumnIndexToView(MatchesTableModel.COLUMN_ACTION)); - // !!!! - addTableDoubleClickListener(tableTables, openTableAction); - addTableDoubleClickListener(tableCompleted, closedTableAction); - } + Action closedTableAction; + closedTableAction = new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + int modelRow = Integer.valueOf(e.getActionCommand()); + String action = (String) matchesModel.getValueAt(modelRow, MatchesTableModel.COLUMN_ACTION); + switch (action) { + case "Replay": + java.util.List<UUID> gameList = matchesModel.getListofGames(modelRow); + if (gameList != null && !gameList.isEmpty()) { + if (gameList.size() == 1) { + SessionHandler.replayGame(gameList.get(0)); + } else { + gameChooser.show(gameList, MageFrame.getDesktop().getMousePosition()); + } + } + // MageFrame.getDesktop().showTournament(tournamentId); + break; + case "Show": + if (matchesModel.isTournament(modelRow)) { + LOGGER.info("Showing tournament table " + matchesModel.getTableId(modelRow)); + SessionHandler.watchTable(roomId, matchesModel.getTableId(modelRow)); + } + break; + } + } + }; + + // !!!! adds action buttons to the table panel (don't delete this) + actionButton1 = new ButtonColumn(tableTables, openTableAction, tableTables.convertColumnIndexToView(TableTableModel.ACTION_COLUMN)); + actionButton2 = new ButtonColumn(tableCompleted, closedTableAction, tableCompleted.convertColumnIndexToView(MatchesTableModel.COLUMN_ACTION)); + // !!!! + addTableDoubleClickListener(tableTables, openTableAction); + addTableDoubleClickListener(tableCompleted, closedTableAction); + } private void addTableDoubleClickListener(JTable table, Action action) { table.addMouseListener(new MouseAdapter() { @@ -369,1437 +370,1441 @@ }); } - public void cleanUp() { - saveGuiSettings(); - chatPanelMain.cleanUp(); - } + public void cleanUp() { + saveGuiSettings(); + chatPanelMain.cleanUp(); + } - public void changeGUISize() { - chatPanelMain.changeGUISize(); - actionButton1.changeGUISize(); - actionButton2.changeGUISize(); - setGUISize(); - } + public void changeGUISize() { + chatPanelMain.changeGUISize(); + actionButton1.changeGUISize(); + actionButton2.changeGUISize(); + setGUISize(); + } - private void setGUISize() { - tableTables.getTableHeader().setFont(GUISizeHelper.tableFont); - tableTables.setFont(GUISizeHelper.tableFont); - tableTables.setRowHeight(GUISizeHelper.getTableRowHeight()); + private void setGUISize() { + tableTables.getTableHeader().setFont(GUISizeHelper.tableFont); + tableTables.setFont(GUISizeHelper.tableFont); + tableTables.setRowHeight(GUISizeHelper.getTableRowHeight()); - tableCompleted.getTableHeader().setFont(GUISizeHelper.tableFont); - tableCompleted.setFont(GUISizeHelper.tableFont); - tableCompleted.setRowHeight(GUISizeHelper.getTableRowHeight()); + tableCompleted.getTableHeader().setFont(GUISizeHelper.tableFont); + tableCompleted.setFont(GUISizeHelper.tableFont); + tableCompleted.setRowHeight(GUISizeHelper.getTableRowHeight()); - jSplitPane1.setDividerSize(GUISizeHelper.dividerBarSize); - jSplitPaneTables.setDividerSize(GUISizeHelper.dividerBarSize); - jScrollPaneTablesActive.getVerticalScrollBar().setPreferredSize(new Dimension(GUISizeHelper.scrollBarSize, 0)); - jScrollPaneTablesActive.getHorizontalScrollBar().setPreferredSize(new Dimension(0, GUISizeHelper.scrollBarSize)); + jSplitPane1.setDividerSize(GUISizeHelper.dividerBarSize); + jSplitPaneTables.setDividerSize(GUISizeHelper.dividerBarSize); + jScrollPaneTablesActive.getVerticalScrollBar().setPreferredSize(new Dimension(GUISizeHelper.scrollBarSize, 0)); + jScrollPaneTablesActive.getHorizontalScrollBar().setPreferredSize(new Dimension(0, GUISizeHelper.scrollBarSize)); - ImageIcon icon = new javax.swing.ImageIcon(getClass().getResource("/buttons/state_waiting.png")); - Image img = icon.getImage(); - Image newimg = img.getScaledInstance(GUISizeHelper.menuFont.getSize(), GUISizeHelper.menuFont.getSize(), java.awt.Image.SCALE_SMOOTH); - btnStateWaiting.setIcon(new ImageIcon(newimg)); + ImageIcon icon = new javax.swing.ImageIcon(getClass().getResource("/buttons/state_waiting.png")); + Image img = icon.getImage(); + Image newimg = img.getScaledInstance(GUISizeHelper.menuFont.getSize(), GUISizeHelper.menuFont.getSize(), java.awt.Image.SCALE_SMOOTH); + btnStateWaiting.setIcon(new ImageIcon(newimg)); - icon = new javax.swing.ImageIcon(getClass().getResource("/buttons/state_active.png")); - img = icon.getImage(); - newimg = img.getScaledInstance(GUISizeHelper.menuFont.getSize(), GUISizeHelper.menuFont.getSize(), java.awt.Image.SCALE_SMOOTH); - btnStateActive.setIcon(new ImageIcon(newimg)); + icon = new javax.swing.ImageIcon(getClass().getResource("/buttons/state_active.png")); + img = icon.getImage(); + newimg = img.getScaledInstance(GUISizeHelper.menuFont.getSize(), GUISizeHelper.menuFont.getSize(), java.awt.Image.SCALE_SMOOTH); + btnStateActive.setIcon(new ImageIcon(newimg)); - icon = new javax.swing.ImageIcon(getClass().getResource("/buttons/state_finished.png")); - img = icon.getImage(); - newimg = img.getScaledInstance(GUISizeHelper.menuFont.getSize(), GUISizeHelper.menuFont.getSize(), java.awt.Image.SCALE_SMOOTH); - btnStateFinished.setIcon(new ImageIcon(newimg)); + icon = new javax.swing.ImageIcon(getClass().getResource("/buttons/state_finished.png")); + img = icon.getImage(); + newimg = img.getScaledInstance(GUISizeHelper.menuFont.getSize(), GUISizeHelper.menuFont.getSize(), java.awt.Image.SCALE_SMOOTH); + btnStateFinished.setIcon(new ImageIcon(newimg)); - int iconSize = 48 + GUISizeHelper.menuFont.getSize() * 2 - 15; - icon = new javax.swing.ImageIcon(getClass().getResource("/buttons/match_new.png")); - img = icon.getImage(); - newimg = img.getScaledInstance(iconSize, iconSize, java.awt.Image.SCALE_SMOOTH); - btnNewTable.setIcon(new ImageIcon(newimg)); + int iconSize = 48 + GUISizeHelper.menuFont.getSize() * 2 - 15; + icon = new javax.swing.ImageIcon(getClass().getResource("/buttons/match_new.png")); + img = icon.getImage(); + newimg = img.getScaledInstance(iconSize, iconSize, java.awt.Image.SCALE_SMOOTH); + btnNewTable.setIcon(new ImageIcon(newimg)); - icon = new javax.swing.ImageIcon(getClass().getResource("/buttons/tourney_new.png")); - img = icon.getImage(); - newimg = img.getScaledInstance(iconSize, iconSize, java.awt.Image.SCALE_SMOOTH); - btnNewTournament.setIcon(new ImageIcon(newimg)); + icon = new javax.swing.ImageIcon(getClass().getResource("/buttons/tourney_new.png")); + img = icon.getImage(); + newimg = img.getScaledInstance(iconSize, iconSize, java.awt.Image.SCALE_SMOOTH); + btnNewTournament.setIcon(new ImageIcon(newimg)); - for (JToggleButton component : filterButtons) { - component.setFont(GUISizeHelper.menuFont); - } - Dimension newDimension = new Dimension((int) jPanelBottom.getPreferredSize().getWidth(), GUISizeHelper.menuFont.getSize() + 28); - jPanelBottom.setMinimumSize(newDimension); - jPanelBottom.setPreferredSize(newDimension); - jButtonFooterNext.setFont(GUISizeHelper.menuFont); - jLabelFooterLabel.setFont(new Font(GUISizeHelper.menuFont.getName(), Font.BOLD, GUISizeHelper.menuFont.getSize())); - jLabelFooterText.setFont(GUISizeHelper.menuFont); - } + for (JToggleButton component : filterButtons) { + component.setFont(GUISizeHelper.menuFont); + } + Dimension newDimension = new Dimension((int) jPanelBottom.getPreferredSize().getWidth(), GUISizeHelper.menuFont.getSize() + 28); + jPanelBottom.setMinimumSize(newDimension); + jPanelBottom.setPreferredSize(newDimension); + jButtonFooterNext.setFont(GUISizeHelper.menuFont); + jLabelFooterLabel.setFont(new Font(GUISizeHelper.menuFont.getName(), Font.BOLD, GUISizeHelper.menuFont.getSize())); + jLabelFooterText.setFont(GUISizeHelper.menuFont); + } - private void saveDividerLocations() { - // save divider locations and divider saveDividerLocations - GuiDisplayUtil.saveCurrentBoundsToPrefs(); - GuiDisplayUtil.saveDividerLocationToPrefs(KEY_TABLES_DIVIDER_LOCATION_1, this.jSplitPane1.getDividerLocation()); - GuiDisplayUtil.saveDividerLocationToPrefs(KEY_TABLES_DIVIDER_LOCATION_2, this.jSplitPaneTables.getDividerLocation()); - GuiDisplayUtil.saveDividerLocationToPrefs(KEY_TABLES_DIVIDER_LOCATION_3, chatPanelMain.getSplitDividerLocation()); - } + private void saveDividerLocations() { + // save divider locations and divider saveDividerLocations + GuiDisplayUtil.saveCurrentBoundsToPrefs(); + GuiDisplayUtil.saveDividerLocationToPrefs(KEY_TABLES_DIVIDER_LOCATION_1, this.jSplitPane1.getDividerLocation()); + GuiDisplayUtil.saveDividerLocationToPrefs(KEY_TABLES_DIVIDER_LOCATION_2, this.jSplitPaneTables.getDividerLocation()); + GuiDisplayUtil.saveDividerLocationToPrefs(KEY_TABLES_DIVIDER_LOCATION_3, chatPanelMain.getSplitDividerLocation()); + } - private void restoreFilters() { - TableUtil.setActiveFilters(KEY_TABLES_FILTER_SETTINGS, filterButtons); - setTableFilter(); - } + private void restoreFilters() { + TableUtil.setActiveFilters(KEY_TABLES_FILTER_SETTINGS, filterButtons); + setTableFilter(); + } - private void saveGuiSettings() { - TableUtil.saveActiveFiltersToPrefs(KEY_TABLES_FILTER_SETTINGS, filterButtons); - TableUtil.saveColumnWidthAndOrderToPrefs(tableTables, KEY_TABLES_COLUMNS_WIDTH, KEY_TABLES_COLUMNS_ORDER); - } + private void saveGuiSettings() { + TableUtil.saveActiveFiltersToPrefs(KEY_TABLES_FILTER_SETTINGS, filterButtons); + TableUtil.saveColumnWidthAndOrderToPrefs(tableTables, KEY_TABLES_COLUMNS_WIDTH, KEY_TABLES_COLUMNS_ORDER); + } - private void restoreDividers() { - Rectangle currentBounds = MageFrame.getDesktop().getBounds(); - if (currentBounds != null) { - String firstDivider = PreferencesDialog.getCachedValue(KEY_TABLES_DIVIDER_LOCATION_1, null); - String tableDivider = PreferencesDialog.getCachedValue(KEY_TABLES_DIVIDER_LOCATION_2, null); - String chatDivider = PreferencesDialog.getCachedValue(KEY_TABLES_DIVIDER_LOCATION_3, null); - GuiDisplayUtil.restoreDividerLocations(currentBounds, firstDivider, jSplitPane1); - GuiDisplayUtil.restoreDividerLocations(currentBounds, tableDivider, jSplitPaneTables); - GuiDisplayUtil.restoreDividerLocations(currentBounds, chatDivider, chatPanelMain); - } - } + private void restoreDividers() { + Rectangle currentBounds = MageFrame.getDesktop().getBounds(); + if (currentBounds != null) { + String firstDivider = PreferencesDialog.getCachedValue(KEY_TABLES_DIVIDER_LOCATION_1, null); + String tableDivider = PreferencesDialog.getCachedValue(KEY_TABLES_DIVIDER_LOCATION_2, null); + String chatDivider = PreferencesDialog.getCachedValue(KEY_TABLES_DIVIDER_LOCATION_3, null); + GuiDisplayUtil.restoreDividerLocations(currentBounds, firstDivider, jSplitPane1); + GuiDisplayUtil.restoreDividerLocations(currentBounds, tableDivider, jSplitPaneTables); + GuiDisplayUtil.restoreDividerLocations(currentBounds, chatDivider, chatPanelMain); + } + } - public Map<String, JComponent> getUIComponents() { - Map<String, JComponent> components = new HashMap<>(); + public Map<String, JComponent> getUIComponents() { + Map<String, JComponent> components = new HashMap<>(); - components.put("jScrollPane1", jScrollPaneTablesActive); - components.put("jScrollPane1ViewPort", jScrollPaneTablesActive.getViewport()); - components.put("jPanel1", jPanelTop); - components.put("tablesPanel", this); + components.put("jScrollPane1", jScrollPaneTablesActive); + components.put("jScrollPane1ViewPort", jScrollPaneTablesActive.getViewport()); + components.put("jPanel1", jPanelTop); + components.put("tablesPanel", this); - return components; - } + return components; + } - public void updateTables(Collection<TableView> tables) { - try { - tableModel.loadData(tables); - this.tableTables.repaint(); - } catch (MageRemoteException ex) { - hideTables(); - } - } + public void updateTables(Collection<TableView> tables) { + try { + tableModel.loadData(tables); + this.tableTables.repaint(); + } catch (MageRemoteException ex) { + hideTables(); + } + } - public void updateMatches(Collection<MatchView> matches) { - try { - matchesModel.loadData(matches); - this.tableCompleted.repaint(); - } catch (MageRemoteException ex) { - hideTables(); - } - } + public void updateMatches(Collection<MatchView> matches) { + try { + matchesModel.loadData(matches); + this.tableCompleted.repaint(); + } catch (MageRemoteException ex) { + hideTables(); + } + } - public void startTasks() { - if (SessionHandler.getSession() != null) { - if (updateTablesTask == null || updateTablesTask.isDone()) { - updateTablesTask = new UpdateTablesTask(roomId, this); - updateTablesTask.execute(); - } - if (updatePlayersTask == null || updatePlayersTask.isDone()) { - updatePlayersTask = new UpdatePlayersTask(roomId, this.chatPanelMain); - updatePlayersTask.execute(); - } - if (this.btnStateFinished.isSelected()) { - if (updateMatchesTask == null || updateMatchesTask.isDone()) { - updateMatchesTask = new UpdateMatchesTask(roomId, this); - updateMatchesTask.execute(); - } - } else if (updateMatchesTask != null) { - updateMatchesTask.cancel(true); - } - } - } + public void startTasks() { + if (SessionHandler.getSession() != null) { + if (updateTablesTask == null || updateTablesTask.isDone()) { + updateTablesTask = new UpdateTablesTask(roomId, this); + updateTablesTask.execute(); + } + if (updatePlayersTask == null || updatePlayersTask.isDone()) { + updatePlayersTask = new UpdatePlayersTask(roomId, this.chatPanelMain); + updatePlayersTask.execute(); + } + if (this.btnStateFinished.isSelected()) { + if (updateMatchesTask == null || updateMatchesTask.isDone()) { + updateMatchesTask = new UpdateMatchesTask(roomId, this); + updateMatchesTask.execute(); + } + } else if (updateMatchesTask != null) { + updateMatchesTask.cancel(true); + } + } + } - public void stopTasks() { - if (updateTablesTask != null) { - updateTablesTask.cancel(true); - } - if (updatePlayersTask != null) { - updatePlayersTask.cancel(true); - } - if (updateMatchesTask != null) { - updateMatchesTask.cancel(true); - } - } + public void stopTasks() { + if (updateTablesTask != null) { + updateTablesTask.cancel(true); + } + if (updatePlayersTask != null) { + updatePlayersTask.cancel(true); + } + if (updateMatchesTask != null) { + updateMatchesTask.cancel(true); + } + } - public void showTables(UUID roomId) { - this.roomId = roomId; - UUID chatRoomId = null; - if (SessionHandler.getSession() != null) { - btnQuickStart.setVisible(SessionHandler.isTestMode()); - gameChooser.init(); - chatRoomId = SessionHandler.getRoomChatId(roomId).orElse(null); - } - if (newTableDialog == null) { - newTableDialog = new NewTableDialog(); - MageFrame.getDesktop().add(newTableDialog, JLayeredPane.MODAL_LAYER); - } - if (newTournamentDialog == null) { - newTournamentDialog = new NewTournamentDialog(); - MageFrame.getDesktop().add(newTournamentDialog, JLayeredPane.MODAL_LAYER); - } - if (joinTableDialog == null) { - joinTableDialog = new JoinTableDialog(); - MageFrame.getDesktop().add(joinTableDialog, JLayeredPane.MODAL_LAYER); - } - if (chatRoomId != null) { - this.chatPanelMain.getUserChatPanel().connect(chatRoomId); - startTasks(); - this.setVisible(true); - this.repaint(); - } else { - hideTables(); - } - //tableModel.setSession(session); + public void showTables(UUID roomId) { + this.roomId = roomId; + UUID chatRoomId = null; + if (SessionHandler.getSession() != null) { + btnQuickStart.setVisible(SessionHandler.isTestMode()); + gameChooser.init(); + chatRoomId = SessionHandler.getRoomChatId(roomId).orElse(null); + } + if (newTableDialog == null) { + newTableDialog = new NewTableDialog(); + MageFrame.getDesktop().add(newTableDialog, JLayeredPane.MODAL_LAYER); + } + if (newTournamentDialog == null) { + newTournamentDialog = new NewTournamentDialog(); + MageFrame.getDesktop().add(newTournamentDialog, JLayeredPane.MODAL_LAYER); + } + if (joinTableDialog == null) { + joinTableDialog = new JoinTableDialog(); + MageFrame.getDesktop().add(joinTableDialog, JLayeredPane.MODAL_LAYER); + } + if (chatRoomId != null) { + this.chatPanelMain.getUserChatPanel().connect(chatRoomId); + startTasks(); + this.setVisible(true); + this.repaint(); + } else { + hideTables(); + } + //tableModel.setSession(session); - reloadMessages(); + reloadMessages(); - MageFrame.getUI().addButton(MageComponents.NEW_GAME_BUTTON, btnNewTable); + MageFrame.getUI().addButton(MageComponents.NEW_GAME_BUTTON, btnNewTable); - // divider locations have to be set with delay else values set are overwritten with system defaults - Executors.newSingleThreadScheduledExecutor().schedule(() -> restoreDividers(), 300, TimeUnit.MILLISECONDS); + // divider locations have to be set with delay else values set are overwritten with system defaults + Executors.newSingleThreadScheduledExecutor().schedule(() -> restoreDividers(), 300, TimeUnit.MILLISECONDS); - } + } - protected void reloadMessages() { - // reload server messages - java.util.List<String> serverMessages = SessionHandler.getServerMessages(); - synchronized (this) { - this.messages = serverMessages; - this.currentMessage = 0; - } - if (serverMessages.isEmpty()) { - this.jPanelBottom.setVisible(false); - } else { - this.jPanelBottom.setVisible(true); - URLHandler.RemoveMouseAdapter(jLabelFooterText); - URLHandler.handleMessage(serverMessages.get(0), this.jLabelFooterText); - this.jButtonFooterNext.setVisible(serverMessages.size() > 1); - } - } + protected void reloadMessages() { + // reload server messages + java.util.List<String> serverMessages = SessionHandler.getServerMessages(); + synchronized (this) { + this.messages = serverMessages; + this.currentMessage = 0; + } + if (serverMessages.isEmpty()) { + this.jPanelBottom.setVisible(false); + } else { + this.jPanelBottom.setVisible(true); + URLHandler.RemoveMouseAdapter(jLabelFooterText); + URLHandler.handleMessage(serverMessages.get(0), this.jLabelFooterText); + this.jButtonFooterNext.setVisible(serverMessages.size() > 1); + } + } - public void hideTables() { - this.saveDividerLocations(); - for (Component component : MageFrame.getDesktop().getComponents()) { - if (component instanceof TableWaitingDialog) { - ((TableWaitingDialog) component).closeDialog(); - } - } - stopTasks(); - this.chatPanelMain.getUserChatPanel().disconnect(); + public void hideTables() { + this.saveDividerLocations(); + for (Component component : MageFrame.getDesktop().getComponents()) { + if (component instanceof TableWaitingDialog) { + ((TableWaitingDialog) component).closeDialog(); + } + } + stopTasks(); + this.chatPanelMain.getUserChatPanel().disconnect(); - Component c = this.getParent(); - while (c != null && !(c instanceof TablesPane)) { - c = c.getParent(); - } - if (c != null) { - ((TablesPane) c).hideFrame(); - } - } + Component c = this.getParent(); + while (c != null && !(c instanceof TablesPane)) { + c = c.getParent(); + } + if (c != null) { + ((TablesPane) c).hideFrame(); + } + } - public ChatPanelBasic getChatPanel() { - return chatPanelMain.getUserChatPanel(); - } + public ChatPanelBasic getChatPanel() { + return chatPanelMain.getUserChatPanel(); + } - public void setTableFilter() { - // state - java.util.List<RowFilter<Object, Object>> stateFilterList = new ArrayList<>(); - if (btnStateWaiting.isSelected()) { - stateFilterList.add(RowFilter.regexFilter("Waiting", TableTableModel.COLUMN_STATUS)); - } - if (btnStateActive.isSelected()) { - stateFilterList.add(RowFilter.regexFilter("Dueling|Constructing|Drafting|Sideboard", TableTableModel.COLUMN_STATUS)); - } + public void setTableFilter() { + // state + java.util.List<RowFilter<Object, Object>> stateFilterList = new ArrayList<>(); + if (btnStateWaiting.isSelected()) { + stateFilterList.add(RowFilter.regexFilter("Waiting", TableTableModel.COLUMN_STATUS)); + } + if (btnStateActive.isSelected()) { + stateFilterList.add(RowFilter.regexFilter("Dueling|Constructing|Drafting|Sideboard", TableTableModel.COLUMN_STATUS)); + } - // type - java.util.List<RowFilter<Object, Object>> typeFilterList = new ArrayList<>(); - if (btnTypeMatch.isSelected()) { - typeFilterList.add(RowFilter.regexFilter("Two|Commander|Free|Tiny|Momir", TableTableModel.COLUMN_GAME_TYPE)); - } - if (btnTypeTourneyConstructed.isSelected()) { - typeFilterList.add(RowFilter.regexFilter("Constructed", TableTableModel.COLUMN_GAME_TYPE)); - } - if (btnTypeTourneyLimited.isSelected()) { - typeFilterList.add(RowFilter.regexFilter("Booster|Sealed", TableTableModel.COLUMN_GAME_TYPE)); - } + // type + java.util.List<RowFilter<Object, Object>> typeFilterList = new ArrayList<>(); + if (btnTypeMatch.isSelected()) { + typeFilterList.add(RowFilter.regexFilter("Two|Commander|Free|Tiny|Momir", TableTableModel.COLUMN_GAME_TYPE)); + } + if (btnTypeTourneyConstructed.isSelected()) { + typeFilterList.add(RowFilter.regexFilter("Constructed", TableTableModel.COLUMN_GAME_TYPE)); + } + if (btnTypeTourneyLimited.isSelected()) { + typeFilterList.add(RowFilter.regexFilter("Booster|Sealed", TableTableModel.COLUMN_GAME_TYPE)); + } - // format - java.util.List<RowFilter<Object, Object>> formatFilterList = new ArrayList<>(); - if (btnFormatBlock.isSelected()) { - formatFilterList.add(RowFilter.regexFilter("^Constructed.*Block", TableTableModel.COLUMN_DECK_TYPE)); - } - if (btnFormatStandard.isSelected()) { - formatFilterList.add(RowFilter.regexFilter("^Constructed - Standard", TableTableModel.COLUMN_DECK_TYPE)); - } - if (btnFormatModern.isSelected()) { - formatFilterList.add(RowFilter.regexFilter("^Constructed - Modern", TableTableModel.COLUMN_DECK_TYPE)); - } - if (btnFormatLegacy.isSelected()) { - formatFilterList.add(RowFilter.regexFilter("^Constructed - Legacy", TableTableModel.COLUMN_DECK_TYPE)); - } - if (btnFormatVintage.isSelected()) { - formatFilterList.add(RowFilter.regexFilter("^Constructed - Vintage", TableTableModel.COLUMN_DECK_TYPE)); - } - if (btnFormatCommander.isSelected()) { - formatFilterList.add(RowFilter.regexFilter("^Commander|^Duel Commander|^Penny Dreadful Commander|^Freeform Commander|^MTGO 1v1 Commander|^Duel Brawl|^Brawl", TableTableModel.COLUMN_DECK_TYPE)); - } - if (btnFormatTinyLeader.isSelected()) { - formatFilterList.add(RowFilter.regexFilter("^Tiny", TableTableModel.COLUMN_DECK_TYPE)); - } - if (btnFormatLimited.isSelected()) { - formatFilterList.add(RowFilter.regexFilter("^Limited", TableTableModel.COLUMN_DECK_TYPE)); - } - if (btnFormatOther.isSelected()) { - formatFilterList.add(RowFilter.regexFilter("^Momir Basic|^Constructed - Pauper|^Constructed - Frontier|^Constructed - Extended|^Constructed - Eternal|^Constructed - Historical|^Constructed - Super|^Constructed - Freeform|^Australian Highlander|^Canadian Highlander|^Constructed - Old", TableTableModel.COLUMN_DECK_TYPE)); - } + // format + java.util.List<RowFilter<Object, Object>> formatFilterList = new ArrayList<>(); + if (btnFormatBlock.isSelected()) { + formatFilterList.add(RowFilter.regexFilter("^Constructed.*Block", TableTableModel.COLUMN_DECK_TYPE)); + } + if (btnFormatStandard.isSelected()) { + formatFilterList.add(RowFilter.regexFilter("^Constructed - Standard", TableTableModel.COLUMN_DECK_TYPE)); + } + if (btnFormatModern.isSelected()) { + formatFilterList.add(RowFilter.regexFilter("^Constructed - Modern", TableTableModel.COLUMN_DECK_TYPE)); + } + if (btnFormatLegacy.isSelected()) { + formatFilterList.add(RowFilter.regexFilter("^Constructed - Legacy", TableTableModel.COLUMN_DECK_TYPE)); + } + if (btnFormatVintage.isSelected()) { + formatFilterList.add(RowFilter.regexFilter("^Constructed - Vintage", TableTableModel.COLUMN_DECK_TYPE)); + } + if (btnFormatCommander.isSelected()) { + formatFilterList.add(RowFilter.regexFilter("^Commander|^Duel Commander|^Penny Dreadful Commander|^Freeform Commander|^MTGO 1v1 Commander|^Duel Brawl|^Brawl", TableTableModel.COLUMN_DECK_TYPE)); + } + if (btnFormatTinyLeader.isSelected()) { + formatFilterList.add(RowFilter.regexFilter("^Tiny", TableTableModel.COLUMN_DECK_TYPE)); + } + if (btnFormatLimited.isSelected()) { + formatFilterList.add(RowFilter.regexFilter("^Limited", TableTableModel.COLUMN_DECK_TYPE)); + } + if (btnFormatOther.isSelected()) { + formatFilterList.add(RowFilter.regexFilter("^Momir Basic|^Constructed - Pauper|^Constructed - Frontier|^Constructed - Extended|^Constructed - Eternal|^Constructed - Historical|^Constructed - Super|^Constructed - Freeform|^Australian Highlander|^Canadian Highlander|^Constructed - Old", TableTableModel.COLUMN_DECK_TYPE)); + } - // skill - java.util.List<RowFilter<Object, Object>> skillFilterList = new ArrayList<>(); - if (btnSkillBeginner.isSelected()) { - skillFilterList.add(RowFilter.regexFilter(this.tableModel.getSkillLevelAsCode(SkillLevel.BEGINNER, true), TableTableModel.COLUMN_SKILL)); - } + // skill + java.util.List<RowFilter<Object, Object>> skillFilterList = new ArrayList<>(); + if (btnSkillBeginner.isSelected()) { + skillFilterList.add(RowFilter.regexFilter(this.tableModel.getSkillLevelAsCode(SkillLevel.BEGINNER, true), TableTableModel.COLUMN_SKILL)); + } if (btnSkillCasual.isSelected()) { - skillFilterList.add(RowFilter.regexFilter(this.tableModel.getSkillLevelAsCode(SkillLevel.CASUAL, true), TableTableModel.COLUMN_SKILL)); - } - if (btnSkillSerious.isSelected()) { - skillFilterList.add(RowFilter.regexFilter(this.tableModel.getSkillLevelAsCode(SkillLevel.SERIOUS, true), TableTableModel.COLUMN_SKILL)); - } - - String ratedMark = TableTableModel.RATED_VALUE_YES; - java.util.List<RowFilter<Object, Object>> ratingFilterList = new ArrayList<>(); - if (btnRated.isSelected()) { - // yes word - ratingFilterList.add(RowFilter.regexFilter("^" + ratedMark, TableTableModel.COLUMN_RATING)); - } - if (btnUnrated.isSelected()) { - // not yes word, see https://stackoverflow.com/a/406408/1276632 - ratingFilterList.add(RowFilter.regexFilter("^((?!" + ratedMark + ").)*$", TableTableModel.COLUMN_RATING)); - } - - // Password - String passwordMark = TableTableModel.PASSWORD_VALUE_YES; - java.util.List<RowFilter<Object, Object>> passwordFilterList = new ArrayList<>(); - if (btnPassword.isSelected()) { - // yes - passwordFilterList.add(RowFilter.regexFilter("^" + passwordMark, TableTableModel.COLUMN_PASSWORD)); - } - if (btnOpen.isSelected()) { - // no - passwordFilterList.add(RowFilter.regexFilter("^((?!" + passwordMark + ").)*$", TableTableModel.COLUMN_PASSWORD)); - } - - // Hide games of ignored players - java.util.List<RowFilter<Object, Object>> ignoreListFilterList = new ArrayList<>(); - String serverAddress = SessionHandler.getSession().getServerHostname().orElseGet(() -> ""); - final Set<String> ignoreListCopy = IgnoreList.ignoreList(serverAddress); - if (!ignoreListCopy.isEmpty()) { - ignoreListFilterList.add(new RowFilter<Object, Object>() { - @Override - public boolean include(Entry<? extends Object, ? extends Object> entry) { - final String owner = entry.getStringValue(TableTableModel.COLUMN_OWNER); - return !ignoreListCopy.contains(owner); - } - }); - } - - if (stateFilterList.isEmpty() || typeFilterList.isEmpty() || formatFilterList.isEmpty() - || skillFilterList.isEmpty() || ratingFilterList.isEmpty() - || passwordFilterList.isEmpty()) { // no selection - activeTablesSorter.setRowFilter(RowFilter.regexFilter("Nothing", TableTableModel.COLUMN_SKILL)); - } else { - java.util.List<RowFilter<Object, Object>> filterList = new ArrayList<>(); - - if (stateFilterList.size() > 1) { - filterList.add(RowFilter.orFilter(stateFilterList)); - } else if (stateFilterList.size() == 1) { - filterList.addAll(stateFilterList); - } - - if (typeFilterList.size() > 1) { - filterList.add(RowFilter.orFilter(typeFilterList)); - } else if (typeFilterList.size() == 1) { - filterList.addAll(typeFilterList); - } - - if (formatFilterList.size() > 1) { - filterList.add(RowFilter.orFilter(formatFilterList)); - } else if (formatFilterList.size() == 1) { - filterList.addAll(formatFilterList); - } - - if (skillFilterList.size() > 1) { - filterList.add(RowFilter.orFilter(skillFilterList)); - } else if (skillFilterList.size() == 1) { - filterList.addAll(skillFilterList); - } - - if (ratingFilterList.size() > 1) { - filterList.add(RowFilter.orFilter(ratingFilterList)); - } else if (ratingFilterList.size() == 1) { - filterList.addAll(ratingFilterList); - } - - if (passwordFilterList.size() > 1) { - filterList.add(RowFilter.orFilter(passwordFilterList)); - } else if (passwordFilterList.size() == 1) { - filterList.addAll(passwordFilterList); - } - - if (ignoreListFilterList.size() > 1) { - filterList.add(RowFilter.orFilter(ignoreListFilterList)); - } else if (ignoreListFilterList.size() == 1) { - filterList.addAll(ignoreListFilterList); - } - - if (filterList.size() == 1) { - activeTablesSorter.setRowFilter(filterList.get(0)); - } else { - activeTablesSorter.setRowFilter(RowFilter.andFilter(filterList)); - } - } - } - - /** - * 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") - // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents - private void initComponents() { - java.awt.GridBagConstraints gridBagConstraints; - - jPanelTop = new javax.swing.JPanel(); - btnNewTable = new javax.swing.JButton(); - btnNewTournament = new javax.swing.JButton(); - filterBar1 = new javax.swing.JToolBar(); - btnStateWaiting = new javax.swing.JToggleButton(); - btnStateActive = new javax.swing.JToggleButton(); - btnStateFinished = new javax.swing.JToggleButton(); - jSeparator1 = new javax.swing.JToolBar.Separator(); - btnTypeMatch = new javax.swing.JToggleButton(); - btnTypeTourneyConstructed = new javax.swing.JToggleButton(); - btnTypeTourneyLimited = new javax.swing.JToggleButton(); - jSeparator4 = new javax.swing.JToolBar.Separator(); - btnSkillBeginner = new javax.swing.JToggleButton(); - btnSkillCasual = new javax.swing.JToggleButton(); - btnSkillSerious = new javax.swing.JToggleButton(); - jSeparator5 = new javax.swing.JToolBar.Separator(); - btnRated = new javax.swing.JToggleButton(); - btnUnrated = new javax.swing.JToggleButton(); - filterBar2 = new javax.swing.JToolBar(); - btnFormatBlock = new javax.swing.JToggleButton(); - btnFormatStandard = new javax.swing.JToggleButton(); - btnFormatModern = new javax.swing.JToggleButton(); - btnFormatLegacy = new javax.swing.JToggleButton(); - btnFormatVintage = new javax.swing.JToggleButton(); - jSeparator3 = new javax.swing.JToolBar.Separator(); - btnFormatCommander = new javax.swing.JToggleButton(); - btnFormatTinyLeader = new javax.swing.JToggleButton(); - jSeparator2 = new javax.swing.JToolBar.Separator(); - btnFormatLimited = new javax.swing.JToggleButton(); - btnFormatOther = new javax.swing.JToggleButton(); - jSeparator5 = new javax.swing.JToolBar.Separator(); - btnOpen = new javax.swing.JToggleButton(); - btnPassword = new javax.swing.JToggleButton(); - btnQuickStart = new javax.swing.JButton(); - jSplitPane1 = new javax.swing.JSplitPane(); - jPanelTables = new javax.swing.JPanel(); - jSplitPaneTables = new javax.swing.JSplitPane(); - jScrollPaneTablesActive = new javax.swing.JScrollPane(); - tableTables = new javax.swing.JTable(); - jScrollPaneTablesFinished = new javax.swing.JScrollPane(); - tableCompleted = new javax.swing.JTable(); - chatPanelMain = new mage.client.table.PlayersChatPanel(); - jPanelBottom = new javax.swing.JPanel(); - jButtonFooterNext = new javax.swing.JButton(); - jLabelFooterLabel = new javax.swing.JLabel(); - jLabelFooterText = new javax.swing.JLabel(); - - setLayout(new java.awt.GridBagLayout()); - - jPanelTop.setBackground(java.awt.Color.white); - jPanelTop.setOpaque(false); - - btnNewTable.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/match_new.png"))); // NOI18N - btnNewTable.setToolTipText("Creates a new match table."); - btnNewTable.setMargin(new java.awt.Insets(2, 2, 2, 2)); - btnNewTable.addActionListener(evt -> btnNewTableActionPerformed(evt)); - - btnNewTournament.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/tourney_new.png"))); // NOI18N - btnNewTournament.setToolTipText("Creates a new tourney table."); - btnNewTournament.setMargin(new java.awt.Insets(2, 2, 2, 2)); - btnNewTournament.addActionListener(evt -> btnNewTournamentActionPerformed(evt)); - - filterBar1.setFloatable(false); - filterBar1.setForeground(new java.awt.Color(102, 102, 255)); - filterBar1.setFocusable(false); - filterBar1.setOpaque(false); - - btnStateWaiting.setSelected(true); - btnStateWaiting.setToolTipText("Shows all tables waiting for players."); - btnStateWaiting.setActionCommand("stateWait"); - btnStateWaiting.setFocusPainted(false); - btnStateWaiting.setFocusable(false); - btnStateWaiting.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnStateWaiting.setRequestFocusEnabled(false); - btnStateWaiting.setVerifyInputWhenFocusTarget(false); - btnStateWaiting.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnStateWaiting.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar1.add(btnStateWaiting); - - btnStateActive.setSelected(true); - btnStateActive.setToolTipText("Shows all tables with active matches."); - btnStateActive.setActionCommand("stateActive"); - btnStateActive.setFocusPainted(false); - btnStateActive.setFocusable(false); - btnStateActive.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnStateActive.setRequestFocusEnabled(false); - btnStateActive.setVerifyInputWhenFocusTarget(false); - btnStateActive.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnStateActive.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar1.add(btnStateActive); - - btnStateFinished.setSelected(true); - btnStateFinished.setToolTipText("<HTML>Toggles the visibility of the table of completed <br>matches and tournaments in the lower area.\n<br>Showing the last 50 finished matches."); - btnStateFinished.setActionCommand("stateFinished"); - btnStateFinished.setFocusPainted(false); - btnStateFinished.setFocusable(false); - btnStateFinished.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnStateFinished.setRequestFocusEnabled(false); - btnStateFinished.setVerifyInputWhenFocusTarget(false); - btnStateFinished.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnStateFinished.addActionListener(evt -> btnStateFinishedActionPerformed(evt)); - filterBar1.add(btnStateFinished); - filterBar1.add(jSeparator1); - - btnTypeMatch.setSelected(true); - btnTypeMatch.setText("Matches"); - btnTypeMatch.setToolTipText("Shows all non tournament tables."); - btnTypeMatch.setActionCommand("typeMatch"); - btnTypeMatch.setFocusPainted(false); - btnTypeMatch.setFocusable(false); - btnTypeMatch.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnTypeMatch.setRequestFocusEnabled(false); - btnTypeMatch.setVerifyInputWhenFocusTarget(false); - btnTypeMatch.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnTypeMatch.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar1.add(btnTypeMatch); - - btnTypeTourneyConstructed.setSelected(true); - btnTypeTourneyConstructed.setText("Constructed tourn."); - btnTypeTourneyConstructed.setToolTipText("Shows all constructed tournament tables."); - btnTypeTourneyConstructed.setActionCommand("typeTourneyConstructed"); - btnTypeTourneyConstructed.setFocusPainted(false); - btnTypeTourneyConstructed.setFocusable(false); - btnTypeTourneyConstructed.setRequestFocusEnabled(false); - btnTypeTourneyConstructed.setVerifyInputWhenFocusTarget(false); - btnTypeTourneyConstructed.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar1.add(btnTypeTourneyConstructed); - - btnTypeTourneyLimited.setSelected(true); - btnTypeTourneyLimited.setText("Limited tourn."); - btnTypeTourneyLimited.setToolTipText("Shows all limited tournament tables."); - btnTypeTourneyLimited.setActionCommand("typeTourneyLimited"); - btnTypeTourneyLimited.setFocusPainted(false); - btnTypeTourneyLimited.setFocusable(false); - btnTypeTourneyLimited.setMaximumSize(new java.awt.Dimension(72, 20)); - btnTypeTourneyLimited.setRequestFocusEnabled(false); - btnTypeTourneyLimited.setVerifyInputWhenFocusTarget(false); - btnTypeTourneyLimited.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar1.add(btnTypeTourneyLimited); - filterBar1.add(jSeparator4); - - btnSkillBeginner.setSelected(true); - btnSkillBeginner.setText("Beginner"); - btnSkillBeginner.setToolTipText("Shows all tables with skill level beginner."); - btnSkillBeginner.setActionCommand("typeMatch"); - btnSkillBeginner.setFocusPainted(false); - btnSkillBeginner.setFocusable(false); - btnSkillBeginner.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnSkillBeginner.setRequestFocusEnabled(false); - btnSkillBeginner.setVerifyInputWhenFocusTarget(false); - btnSkillBeginner.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnSkillBeginner.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar1.add(btnSkillBeginner); - - btnSkillCasual.setSelected(true); - btnSkillCasual.setText("Casual"); - btnSkillCasual.setToolTipText("Shows all tables with skill level casual."); - btnSkillCasual.setActionCommand("typeMatch"); - btnSkillCasual.setFocusPainted(false); - btnSkillCasual.setFocusable(false); - btnSkillCasual.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnSkillCasual.setRequestFocusEnabled(false); - btnSkillCasual.setVerifyInputWhenFocusTarget(false); - btnSkillCasual.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnSkillCasual.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar1.add(btnSkillCasual); - - btnSkillSerious.setSelected(true); - btnSkillSerious.setText("Serious"); - btnSkillSerious.setToolTipText("Shows all tables with skill level serious."); - btnSkillSerious.setActionCommand("typeMatch"); - btnSkillSerious.setFocusPainted(false); - btnSkillSerious.setFocusable(false); - btnSkillSerious.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnSkillSerious.setRequestFocusEnabled(false); - btnSkillSerious.setVerifyInputWhenFocusTarget(false); - btnSkillSerious.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnSkillSerious.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar1.add(btnSkillSerious); - - filterBar1.add(jSeparator4); - - btnRated.setSelected(true); - btnRated.setText("Rated"); - btnRated.setToolTipText("Shows all rated tables."); - btnRated.setFocusPainted(false); - btnRated.setFocusable(false); - btnRated.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnRated.setRequestFocusEnabled(false); - btnRated.setVerifyInputWhenFocusTarget(false); - btnRated.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnRated.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar1.add(btnRated); - - btnUnrated.setSelected(true); - btnUnrated.setText("Unrated"); - btnUnrated.setToolTipText("Shows all unrated tables."); - btnUnrated.setFocusPainted(false); - btnUnrated.setFocusable(false); - btnUnrated.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnUnrated.setRequestFocusEnabled(false); - btnUnrated.setVerifyInputWhenFocusTarget(false); - btnUnrated.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnUnrated.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar1.add(btnUnrated); - - // second filter line - filterBar2.setFloatable(false); - filterBar2.setFocusable(false); - filterBar2.setOpaque(false); - - btnFormatBlock.setSelected(true); - btnFormatBlock.setText("Block"); - btnFormatBlock.setToolTipText("Block constructed formats."); - btnFormatBlock.setFocusPainted(false); - btnFormatBlock.setFocusable(false); - btnFormatBlock.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnFormatBlock.setRequestFocusEnabled(false); - btnFormatBlock.setVerifyInputWhenFocusTarget(false); - btnFormatBlock.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnFormatBlock.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar2.add(btnFormatBlock); - - btnFormatStandard.setSelected(true); - btnFormatStandard.setText("Standard"); - btnFormatStandard.setToolTipText("Standard format."); - btnFormatStandard.setFocusPainted(false); - btnFormatStandard.setFocusable(false); - btnFormatStandard.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnFormatStandard.setRequestFocusEnabled(false); - btnFormatStandard.setVerifyInputWhenFocusTarget(false); - btnFormatStandard.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnFormatStandard.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar2.add(btnFormatStandard); - - btnFormatModern.setSelected(true); - btnFormatModern.setText("Modern"); - btnFormatModern.setToolTipText("Modern format."); - btnFormatModern.setFocusPainted(false); - btnFormatModern.setFocusable(false); - btnFormatModern.setRequestFocusEnabled(false); - btnFormatModern.setVerifyInputWhenFocusTarget(false); - btnFormatModern.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar2.add(btnFormatModern); - - btnFormatLegacy.setSelected(true); - btnFormatLegacy.setText("Legacy"); - btnFormatLegacy.setToolTipText("Legacy format."); - btnFormatLegacy.setFocusPainted(false); - btnFormatLegacy.setFocusable(false); - btnFormatLegacy.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnFormatLegacy.setRequestFocusEnabled(false); - btnFormatLegacy.setVerifyInputWhenFocusTarget(false); - btnFormatLegacy.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnFormatLegacy.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar2.add(btnFormatLegacy); - - btnFormatVintage.setSelected(true); - btnFormatVintage.setText("Vintage"); - btnFormatVintage.setToolTipText("Vintage format."); - btnFormatVintage.setFocusPainted(false); - btnFormatVintage.setFocusable(false); - btnFormatVintage.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnFormatVintage.setRequestFocusEnabled(false); - btnFormatVintage.setVerifyInputWhenFocusTarget(false); - btnFormatVintage.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnFormatVintage.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar2.add(btnFormatVintage); - filterBar2.add(jSeparator3); - - btnFormatCommander.setSelected(true); - btnFormatCommander.setText("Commander"); - btnFormatCommander.setToolTipText("Commander format."); - btnFormatCommander.setFocusPainted(false); - btnFormatCommander.setFocusable(false); - btnFormatCommander.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnFormatCommander.setRequestFocusEnabled(false); - btnFormatCommander.setVerifyInputWhenFocusTarget(false); - btnFormatCommander.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnFormatCommander.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar2.add(btnFormatCommander); - - btnFormatTinyLeader.setSelected(true); - btnFormatTinyLeader.setText("Tiny Leader"); - btnFormatTinyLeader.setToolTipText("Tiny Leader format."); - btnFormatTinyLeader.setFocusPainted(false); - btnFormatTinyLeader.setFocusable(false); - btnFormatTinyLeader.setRequestFocusEnabled(false); - btnFormatTinyLeader.setVerifyInputWhenFocusTarget(false); - btnFormatTinyLeader.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar2.add(btnFormatTinyLeader); - filterBar2.add(jSeparator2); - - btnFormatLimited.setSelected(true); - btnFormatLimited.setText("Limited"); - btnFormatLimited.setToolTipText("Limited format."); - btnFormatLimited.setFocusPainted(false); - btnFormatLimited.setFocusable(false); - btnFormatLimited.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnFormatLimited.setRequestFocusEnabled(false); - btnFormatLimited.setVerifyInputWhenFocusTarget(false); - btnFormatLimited.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnFormatLimited.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar2.add(btnFormatLimited); - - btnFormatOther.setSelected(true); - btnFormatOther.setText("Other"); - btnFormatOther.setToolTipText("Other formats (Freeform, Pauper, Extended, etc.)"); - btnFormatOther.setFocusPainted(false); - btnFormatOther.setFocusable(false); - btnFormatOther.setRequestFocusEnabled(false); - btnFormatOther.setVerifyInputWhenFocusTarget(false); - btnFormatOther.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar2.add(btnFormatOther); - filterBar2.add(jSeparator5); - - btnOpen.setSelected(true); - btnOpen.setText("Open"); - btnOpen.setToolTipText("Show open games"); - btnOpen.setFocusPainted(false); - btnOpen.setFocusable(false); - btnOpen.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnOpen.setRequestFocusEnabled(false); - btnOpen.setVerifyInputWhenFocusTarget(false); - btnOpen.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnOpen.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar2.add(btnOpen); - - btnPassword.setSelected(true); - btnPassword.setText("PW"); - btnPassword.setToolTipText("Show passworded games"); - btnPassword.setFocusPainted(false); - btnPassword.setFocusable(false); - btnPassword.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnPassword.setRequestFocusEnabled(false); - btnPassword.setVerifyInputWhenFocusTarget(false); - btnPassword.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnPassword.addActionListener(evt -> btnFilterActionPerformed(evt)); - filterBar2.add(btnPassword); - - btnQuickStart.setText("Quick Start"); - btnQuickStart.setFocusable(false); - btnQuickStart.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnQuickStart.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnQuickStart.addActionListener(evt -> btnQuickStartActionPerformed(evt)); - - javax.swing.GroupLayout jPanelTopLayout = new javax.swing.GroupLayout(jPanelTop); - jPanelTop.setLayout(jPanelTopLayout); - jPanelTopLayout.setHorizontalGroup( - jPanelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanelTopLayout.createSequentialGroup() - .addContainerGap() - .addComponent(btnNewTable) - .addGap(6, 6, 6) - .addComponent(btnNewTournament) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(filterBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 491, Short.MAX_VALUE) - .addComponent(filterBar2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(btnQuickStart) - .addContainerGap(835, Short.MAX_VALUE)) - ); - jPanelTopLayout.setVerticalGroup( - jPanelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanelTopLayout.createSequentialGroup() - .addContainerGap() - .addGroup(jPanelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(btnNewTable) - .addComponent(btnNewTournament)) - .addGroup(jPanelTopLayout.createSequentialGroup() - .addGroup(jPanelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(filterBar1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(btnQuickStart)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(filterBar2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) - .addContainerGap()) - ); - - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; - gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; - add(jPanelTop, gridBagConstraints); - - jSplitPane1.setBorder(null); - jSplitPane1.setDividerSize(10); - jSplitPane1.setResizeWeight(1.0); - - jSplitPaneTables.setBorder(null); - jSplitPaneTables.setDividerSize(10); - jSplitPaneTables.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); - jSplitPaneTables.setResizeWeight(0.5); - - jScrollPaneTablesActive.setBorder(null); - jScrollPaneTablesActive.setViewportBorder(null); - - tableTables.setModel(this.tableModel); - jScrollPaneTablesActive.setViewportView(tableTables); - - jSplitPaneTables.setLeftComponent(jScrollPaneTablesActive); - - jScrollPaneTablesFinished.setBorder(null); - jScrollPaneTablesFinished.setViewportBorder(null); - jScrollPaneTablesFinished.setMinimumSize(new java.awt.Dimension(23, 0)); - - tableCompleted.setModel(this.matchesModel); - jScrollPaneTablesFinished.setViewportView(tableCompleted); - - jSplitPaneTables.setRightComponent(jScrollPaneTablesFinished); - - javax.swing.GroupLayout jPanelTablesLayout = new javax.swing.GroupLayout(jPanelTables); - jPanelTables.setLayout(jPanelTablesLayout); - jPanelTablesLayout.setHorizontalGroup( - jPanelTablesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jSplitPaneTables, javax.swing.GroupLayout.PREFERRED_SIZE, 23, Short.MAX_VALUE) - ); - jPanelTablesLayout.setVerticalGroup( - jPanelTablesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jSplitPaneTables, javax.swing.GroupLayout.DEFAULT_SIZE, 672, Short.MAX_VALUE) - ); - - jSplitPane1.setLeftComponent(jPanelTables); - jSplitPane1.setRightComponent(chatPanelMain); - - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridy = 1; - gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; - gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; - gridBagConstraints.weightx = 1.0; - gridBagConstraints.weighty = 1.0; - add(jSplitPane1, gridBagConstraints); - - jPanelBottom.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED)); - jPanelBottom.setPreferredSize(new java.awt.Dimension(516, 37)); - jPanelBottom.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT)); - - jButtonFooterNext.setText("Next"); - jButtonFooterNext.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); - jButtonFooterNext.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - jButtonFooterNext.setOpaque(false); - jButtonFooterNext.addActionListener(evt -> jButtonFooterNextActionPerformed(evt)); - jPanelBottom.add(jButtonFooterNext); - - jLabelFooterLabel.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N - jLabelFooterLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); - jLabelFooterLabel.setText("Message of the Day:"); - jLabelFooterLabel.setAlignmentY(0.3F); - jPanelBottom.add(jLabelFooterLabel); - - jLabelFooterText.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); - jLabelFooterText.setText("You are playing Mage version 0.7.5. Welcome! -- Mage dev team --"); - jPanelBottom.add(jLabelFooterText); - - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridy = 2; - gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; - gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; - add(jPanelBottom, gridBagConstraints); - }// </editor-fold>//GEN-END:initComponents - - private void btnNewTournamentActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNewTournamentActionPerformed - newTournamentDialog.showDialog(roomId); - }//GEN-LAST:event_btnNewTournamentActionPerformed - - private void btnQuickStartActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnQuickStartActionPerformed - TableView table; - try { - File f = new File("test.dck"); - if (!f.exists()) { - JOptionPane.showMessageDialog(null, "Couldn't find test.dck file for quick game start", "Error", JOptionPane.ERROR_MESSAGE); - return; - } - - MatchOptions options = new MatchOptions("1", "Two Player Duel", false, 2); - options.getPlayerTypes().add(PlayerType.HUMAN); - options.getPlayerTypes().add(PlayerType.COMPUTER_MAD); - options.setDeckType("Limited"); - options.setAttackOption(MultiplayerAttackOption.LEFT); - options.setRange(RangeOfInfluence.ALL); - options.setWinsNeeded(1); - options.setMatchTimeLimit(MatchTimeLimit.NONE); - options.setFreeMulligans(2); - options.setSkillLevel(SkillLevel.CASUAL); - options.setRollbackTurnsAllowed(true); - options.setQuitRatio(100); - String serverAddress = SessionHandler.getSession().getServerHostname().orElseGet(() -> ""); - options.setBannedUsers(IgnoreList.ignoreList(serverAddress)); - table = SessionHandler.createTable(roomId, options); - - SessionHandler.joinTable(roomId, table.getTableId(), "Human", PlayerType.HUMAN, 1, DeckImporterUtil.importDeck("test.dck"), ""); - SessionHandler.joinTable(roomId, table.getTableId(), "Computer", PlayerType.COMPUTER_MAD, 5, DeckImporterUtil.importDeck("test.dck"), ""); - SessionHandler.startMatch(roomId, table.getTableId()); - } catch (HeadlessException ex) { - handleError(ex); - } - }//GEN-LAST:event_btnQuickStartActionPerformed - - private void btnNewTableActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNewTableActionPerformed - newTableDialog.showDialog(roomId); - }//GEN-LAST:event_btnNewTableActionPerformed - - private void jButtonFooterNextActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonFooterNextActionPerformed - synchronized (this) { - if (messages != null && !messages.isEmpty()) { - currentMessage++; - if (currentMessage >= messages.size()) { - currentMessage = 0; - } - - URLHandler.RemoveMouseAdapter(jLabelFooterText); - URLHandler.handleMessage(messages.get(currentMessage), this.jLabelFooterText); - } - } - }//GEN-LAST:event_jButtonFooterNextActionPerformed - - private void btnFilterActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnFilterActionPerformed - setTableFilter(); - }//GEN-LAST:event_btnFilterActionPerformed - - private void btnStateFinishedActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnStateFinishedActionPerformed - if (this.btnStateFinished.isSelected()) { - this.jSplitPaneTables.setDividerLocation(-1); - } else { - this.jSplitPaneTables.setDividerLocation(this.jPanelTables.getHeight()); - } - this.startTasks(); - }//GEN-LAST:event_btnStateFinishedActionPerformed - - private void handleError(Exception ex) { - LOGGER.fatal("Error loading deck: ", ex); - JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Error loading deck.", "Error", JOptionPane.ERROR_MESSAGE); - } - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JToggleButton btnFormatBlock; - private javax.swing.JToggleButton btnFormatCommander; - private javax.swing.JToggleButton btnFormatLegacy; - private javax.swing.JToggleButton btnFormatLimited; - private javax.swing.JToggleButton btnFormatModern; - private javax.swing.JToggleButton btnFormatOther; - private javax.swing.JToggleButton btnFormatStandard; - private javax.swing.JToggleButton btnFormatTinyLeader; - private javax.swing.JToggleButton btnFormatVintage; - private javax.swing.JButton btnNewTable; - private javax.swing.JButton btnNewTournament; - private javax.swing.JToggleButton btnOpen; - private javax.swing.JToggleButton btnPassword; - private javax.swing.JButton btnQuickStart; - private javax.swing.JToggleButton btnSkillBeginner; - private javax.swing.JToggleButton btnSkillCasual; - private javax.swing.JToggleButton btnSkillSerious; - private javax.swing.JToggleButton btnRated; - private javax.swing.JToggleButton btnUnrated; - private javax.swing.JToggleButton btnStateActive; - private javax.swing.JToggleButton btnStateFinished; - private javax.swing.JToggleButton btnStateWaiting; - private javax.swing.JToggleButton btnTypeMatch; - private javax.swing.JToggleButton btnTypeTourneyConstructed; - private javax.swing.JToggleButton btnTypeTourneyLimited; - private mage.client.table.PlayersChatPanel chatPanelMain; - private javax.swing.JToolBar filterBar1; - private javax.swing.JToolBar filterBar2; - private javax.swing.JButton jButtonFooterNext; - private javax.swing.JLabel jLabelFooterLabel; - private javax.swing.JLabel jLabelFooterText; - private javax.swing.JPanel jPanelBottom; - private javax.swing.JPanel jPanelTables; - private javax.swing.JPanel jPanelTop; - private javax.swing.JScrollPane jScrollPaneTablesActive; - private javax.swing.JScrollPane jScrollPaneTablesFinished; - private javax.swing.JToolBar.Separator jSeparator1; - private javax.swing.JToolBar.Separator jSeparator2; - private javax.swing.JToolBar.Separator jSeparator3; - private javax.swing.JToolBar.Separator jSeparator4; - private javax.swing.JToolBar.Separator jSeparator5; - private javax.swing.JSplitPane jSplitPane1; - private javax.swing.JSplitPane jSplitPaneTables; - private javax.swing.JTable tableCompleted; - private javax.swing.JTable tableTables; - // End of variables declaration//GEN-END:variables - - } - - class TableTableModel extends AbstractTableModel { - - final ImageIcon tourneyIcon = new javax.swing.ImageIcon(getClass().getResource("/tables/tourney_icon.png")); - final ImageIcon matchIcon = new javax.swing.ImageIcon(getClass().getResource("/tables/match_icon.png")); - - public static final int COLUMN_ICON = 0; - public static final int COLUMN_DECK_TYPE = 1; // column the deck type is located (starting with 0) Start string is used to check for Limited - public static final int COLUMN_OWNER = 2; - public static final int COLUMN_GAME_TYPE = 3; - public static final int COLUMN_INFO = 4; - public static final int COLUMN_STATUS = 5; - public static final int COLUMN_PASSWORD = 6; - public static final int COLUMN_CREATED = 7; - public static final int COLUMN_SKILL = 8; - public static final int COLUMN_RATING = 9; - public static final int COLUMN_QUIT_RATIO = 10; - public static final int ACTION_COLUMN = 11; // column the action is located (starting with 0) - - public static final String RATED_VALUE_YES = "YES"; - public static final String RATED_VALUE_NO = ""; - - public static final String PASSWORD_VALUE_YES = "YES"; - - private final String[] columnNames = new String[]{"M/T", "Deck Type", "Owner / Players", "Game Type", "Info", "Status", "Password", "Created / Started", "Skill Level", "Rating", "Quit %", "Action"}; - - private TableView[] tables = new TableView[0]; - - TableTableModel() { - } - - public void loadData(Collection<TableView> tables) throws MageRemoteException { - this.tables = tables.toArray(new TableView[0]); - this.fireTableDataChanged(); - } - - public String getSkillLevelAsCode(SkillLevel skill, boolean asRegExp) { - String res; - switch (skill) { - case BEGINNER: - res = "*"; - break; - case CASUAL: - res = "**"; - break; - case SERIOUS: - res = "***"; - break; - default: - res = ""; - break; - } - - // regexp format for search table rows - if (asRegExp) { - res = String.format("^%s$", res.replace("*", "\\*")); - } - - return res; - } - - @Override - public int getRowCount() { - return tables.length; - } - - @Override - public int getColumnCount() { - return columnNames.length; - } - - @Override - public Object getValueAt(int arg0, int arg1) { - switch (arg1) { - case 0: - return tables[arg0].isTournament() ? tourneyIcon : matchIcon; - case 1: - return tables[arg0].getDeckType(); - case 2: - return tables[arg0].getControllerName(); - case 3: - return tables[arg0].getGameType(); - case 4: - return tables[arg0].getAdditionalInfo(); - case 5: - return tables[arg0].getTableStateText(); - case 6: - return tables[arg0].isPassworded() ? PASSWORD_VALUE_YES : ""; - case 7: - return tables[arg0].getCreateTime(); // use cell render, not format here - case 8: + skillFilterList.add(RowFilter.regexFilter(this.tableModel.getSkillLevelAsCode(SkillLevel.CASUAL, true), TableTableModel.COLUMN_SKILL)); + } + if (btnSkillSerious.isSelected()) { + skillFilterList.add(RowFilter.regexFilter(this.tableModel.getSkillLevelAsCode(SkillLevel.SERIOUS, true), TableTableModel.COLUMN_SKILL)); + } + + String ratedMark = TableTableModel.RATED_VALUE_YES; + java.util.List<RowFilter<Object, Object>> ratingFilterList = new ArrayList<>(); + if (btnRated.isSelected()) { + // yes word + ratingFilterList.add(RowFilter.regexFilter("^" + ratedMark, TableTableModel.COLUMN_RATING)); + } + if (btnUnrated.isSelected()) { + // not yes word, see https://stackoverflow.com/a/406408/1276632 + ratingFilterList.add(RowFilter.regexFilter("^((?!" + ratedMark + ").)*$", TableTableModel.COLUMN_RATING)); + } + + // Password + String passwordMark = TableTableModel.PASSWORD_VALUE_YES; + java.util.List<RowFilter<Object, Object>> passwordFilterList = new ArrayList<>(); + if (btnPassword.isSelected()) { + // yes + passwordFilterList.add(RowFilter.regexFilter("^" + passwordMark, TableTableModel.COLUMN_PASSWORD)); + } + if (btnOpen.isSelected()) { + // no + passwordFilterList.add(RowFilter.regexFilter("^((?!" + passwordMark + ").)*$", TableTableModel.COLUMN_PASSWORD)); + } + + // Hide games of ignored players + java.util.List<RowFilter<Object, Object>> ignoreListFilterList = new ArrayList<>(); + String serverAddress = SessionHandler.getSession().getServerHostname().orElseGet(() -> ""); + final Set<String> ignoreListCopy = IgnoreList.ignoreList(serverAddress); + if (!ignoreListCopy.isEmpty()) { + ignoreListFilterList.add(new RowFilter<Object, Object>() { + @Override + public boolean include(Entry<? extends Object, ? extends Object> entry) { + final String owner = entry.getStringValue(TableTableModel.COLUMN_OWNER); + return !ignoreListCopy.contains(owner); + } + }); + } + + if (stateFilterList.isEmpty() || typeFilterList.isEmpty() || formatFilterList.isEmpty() + || skillFilterList.isEmpty() || ratingFilterList.isEmpty() + || passwordFilterList.isEmpty()) { // no selection + activeTablesSorter.setRowFilter(RowFilter.regexFilter("Nothing", TableTableModel.COLUMN_SKILL)); + } else { + java.util.List<RowFilter<Object, Object>> filterList = new ArrayList<>(); + + if (stateFilterList.size() > 1) { + filterList.add(RowFilter.orFilter(stateFilterList)); + } else if (stateFilterList.size() == 1) { + filterList.addAll(stateFilterList); + } + + if (typeFilterList.size() > 1) { + filterList.add(RowFilter.orFilter(typeFilterList)); + } else if (typeFilterList.size() == 1) { + filterList.addAll(typeFilterList); + } + + if (formatFilterList.size() > 1) { + filterList.add(RowFilter.orFilter(formatFilterList)); + } else if (formatFilterList.size() == 1) { + filterList.addAll(formatFilterList); + } + + if (skillFilterList.size() > 1) { + filterList.add(RowFilter.orFilter(skillFilterList)); + } else if (skillFilterList.size() == 1) { + filterList.addAll(skillFilterList); + } + + if (ratingFilterList.size() > 1) { + filterList.add(RowFilter.orFilter(ratingFilterList)); + } else if (ratingFilterList.size() == 1) { + filterList.addAll(ratingFilterList); + } + + if (passwordFilterList.size() > 1) { + filterList.add(RowFilter.orFilter(passwordFilterList)); + } else if (passwordFilterList.size() == 1) { + filterList.addAll(passwordFilterList); + } + + if (ignoreListFilterList.size() > 1) { + filterList.add(RowFilter.orFilter(ignoreListFilterList)); + } else if (ignoreListFilterList.size() == 1) { + filterList.addAll(ignoreListFilterList); + } + + if (filterList.size() == 1) { + activeTablesSorter.setRowFilter(filterList.get(0)); + } else { + activeTablesSorter.setRowFilter(RowFilter.andFilter(filterList)); + } + } + } + + /** + * 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") + // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents + private void initComponents() { + java.awt.GridBagConstraints gridBagConstraints; + + jPanelTop = new javax.swing.JPanel(); + btnNewTable = new javax.swing.JButton(); + btnNewTournament = new javax.swing.JButton(); + filterBar1 = new javax.swing.JToolBar(); + btnStateWaiting = new javax.swing.JToggleButton(); + btnStateActive = new javax.swing.JToggleButton(); + btnStateFinished = new javax.swing.JToggleButton(); + jSeparator1 = new javax.swing.JToolBar.Separator(); + btnTypeMatch = new javax.swing.JToggleButton(); + btnTypeTourneyConstructed = new javax.swing.JToggleButton(); + btnTypeTourneyLimited = new javax.swing.JToggleButton(); + jSeparator4 = new javax.swing.JToolBar.Separator(); + btnSkillBeginner = new javax.swing.JToggleButton(); + btnSkillCasual = new javax.swing.JToggleButton(); + btnSkillSerious = new javax.swing.JToggleButton(); + jSeparator5 = new javax.swing.JToolBar.Separator(); + btnRated = new javax.swing.JToggleButton(); + btnUnrated = new javax.swing.JToggleButton(); + filterBar2 = new javax.swing.JToolBar(); + btnFormatBlock = new javax.swing.JToggleButton(); + btnFormatStandard = new javax.swing.JToggleButton(); + btnFormatModern = new javax.swing.JToggleButton(); + btnFormatLegacy = new javax.swing.JToggleButton(); + btnFormatVintage = new javax.swing.JToggleButton(); + jSeparator3 = new javax.swing.JToolBar.Separator(); + btnFormatCommander = new javax.swing.JToggleButton(); + btnFormatTinyLeader = new javax.swing.JToggleButton(); + jSeparator2 = new javax.swing.JToolBar.Separator(); + btnFormatLimited = new javax.swing.JToggleButton(); + btnFormatOther = new javax.swing.JToggleButton(); + jSeparator5 = new javax.swing.JToolBar.Separator(); + btnOpen = new javax.swing.JToggleButton(); + btnPassword = new javax.swing.JToggleButton(); + btnQuickStart = new javax.swing.JButton(); + jSplitPane1 = new javax.swing.JSplitPane(); + jPanelTables = new javax.swing.JPanel(); + jSplitPaneTables = new javax.swing.JSplitPane(); + jScrollPaneTablesActive = new javax.swing.JScrollPane(); + tableTables = new javax.swing.JTable(); + jScrollPaneTablesFinished = new javax.swing.JScrollPane(); + tableCompleted = new javax.swing.JTable(); + chatPanelMain = new mage.client.table.PlayersChatPanel(); + jPanelBottom = new javax.swing.JPanel(); + jButtonFooterNext = new javax.swing.JButton(); + jLabelFooterLabel = new javax.swing.JLabel(); + jLabelFooterText = new javax.swing.JLabel(); + + setLayout(new java.awt.GridBagLayout()); + + jPanelTop.setBackground(java.awt.Color.white); + jPanelTop.setOpaque(false); + + btnNewTable.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/match_new.png"))); // NOI18N + btnNewTable.setToolTipText("Creates a new match table."); + btnNewTable.setMargin(new java.awt.Insets(2, 2, 2, 2)); + btnNewTable.addActionListener(evt -> btnNewTableActionPerformed(evt)); + + btnNewTournament.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/tourney_new.png"))); // NOI18N + btnNewTournament.setToolTipText("Creates a new tourney table."); + btnNewTournament.setMargin(new java.awt.Insets(2, 2, 2, 2)); + btnNewTournament.addActionListener(evt -> btnNewTournamentActionPerformed(evt)); + + filterBar1.setFloatable(false); + filterBar1.setForeground(new java.awt.Color(102, 102, 255)); + filterBar1.setFocusable(false); + filterBar1.setOpaque(false); + + btnStateWaiting.setSelected(true); + btnStateWaiting.setToolTipText("Shows all tables waiting for players."); + btnStateWaiting.setActionCommand("stateWait"); + btnStateWaiting.setFocusPainted(false); + btnStateWaiting.setFocusable(false); + btnStateWaiting.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnStateWaiting.setRequestFocusEnabled(false); + btnStateWaiting.setVerifyInputWhenFocusTarget(false); + btnStateWaiting.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnStateWaiting.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar1.add(btnStateWaiting); + + btnStateActive.setSelected(true); + btnStateActive.setToolTipText("Shows all tables with active matches."); + btnStateActive.setActionCommand("stateActive"); + btnStateActive.setFocusPainted(false); + btnStateActive.setFocusable(false); + btnStateActive.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnStateActive.setRequestFocusEnabled(false); + btnStateActive.setVerifyInputWhenFocusTarget(false); + btnStateActive.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnStateActive.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar1.add(btnStateActive); + + btnStateFinished.setSelected(true); + btnStateFinished.setToolTipText("<HTML>Toggles the visibility of the table of completed <br>matches and tournaments in the lower area.\n<br>Showing the last 50 finished matches."); + btnStateFinished.setActionCommand("stateFinished"); + btnStateFinished.setFocusPainted(false); + btnStateFinished.setFocusable(false); + btnStateFinished.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnStateFinished.setRequestFocusEnabled(false); + btnStateFinished.setVerifyInputWhenFocusTarget(false); + btnStateFinished.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnStateFinished.addActionListener(evt -> btnStateFinishedActionPerformed(evt)); + filterBar1.add(btnStateFinished); + filterBar1.add(jSeparator1); + + btnTypeMatch.setSelected(true); + btnTypeMatch.setText("Matches"); + btnTypeMatch.setToolTipText("Shows all non tournament tables."); + btnTypeMatch.setActionCommand("typeMatch"); + btnTypeMatch.setFocusPainted(false); + btnTypeMatch.setFocusable(false); + btnTypeMatch.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnTypeMatch.setRequestFocusEnabled(false); + btnTypeMatch.setVerifyInputWhenFocusTarget(false); + btnTypeMatch.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnTypeMatch.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar1.add(btnTypeMatch); + + btnTypeTourneyConstructed.setSelected(true); + btnTypeTourneyConstructed.setText("Constructed tourn."); + btnTypeTourneyConstructed.setToolTipText("Shows all constructed tournament tables."); + btnTypeTourneyConstructed.setActionCommand("typeTourneyConstructed"); + btnTypeTourneyConstructed.setFocusPainted(false); + btnTypeTourneyConstructed.setFocusable(false); + btnTypeTourneyConstructed.setRequestFocusEnabled(false); + btnTypeTourneyConstructed.setVerifyInputWhenFocusTarget(false); + btnTypeTourneyConstructed.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar1.add(btnTypeTourneyConstructed); + + btnTypeTourneyLimited.setSelected(true); + btnTypeTourneyLimited.setText("Limited tourn."); + btnTypeTourneyLimited.setToolTipText("Shows all limited tournament tables."); + btnTypeTourneyLimited.setActionCommand("typeTourneyLimited"); + btnTypeTourneyLimited.setFocusPainted(false); + btnTypeTourneyLimited.setFocusable(false); + btnTypeTourneyLimited.setMaximumSize(new java.awt.Dimension(72, 20)); + btnTypeTourneyLimited.setRequestFocusEnabled(false); + btnTypeTourneyLimited.setVerifyInputWhenFocusTarget(false); + btnTypeTourneyLimited.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar1.add(btnTypeTourneyLimited); + filterBar1.add(jSeparator4); + + btnSkillBeginner.setSelected(true); + btnSkillBeginner.setText("Beginner"); + btnSkillBeginner.setToolTipText("Shows all tables with skill level beginner."); + btnSkillBeginner.setActionCommand("typeMatch"); + btnSkillBeginner.setFocusPainted(false); + btnSkillBeginner.setFocusable(false); + btnSkillBeginner.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnSkillBeginner.setRequestFocusEnabled(false); + btnSkillBeginner.setVerifyInputWhenFocusTarget(false); + btnSkillBeginner.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnSkillBeginner.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar1.add(btnSkillBeginner); + + btnSkillCasual.setSelected(true); + btnSkillCasual.setText("Casual"); + btnSkillCasual.setToolTipText("Shows all tables with skill level casual."); + btnSkillCasual.setActionCommand("typeMatch"); + btnSkillCasual.setFocusPainted(false); + btnSkillCasual.setFocusable(false); + btnSkillCasual.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnSkillCasual.setRequestFocusEnabled(false); + btnSkillCasual.setVerifyInputWhenFocusTarget(false); + btnSkillCasual.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnSkillCasual.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar1.add(btnSkillCasual); + + btnSkillSerious.setSelected(true); + btnSkillSerious.setText("Serious"); + btnSkillSerious.setToolTipText("Shows all tables with skill level serious."); + btnSkillSerious.setActionCommand("typeMatch"); + btnSkillSerious.setFocusPainted(false); + btnSkillSerious.setFocusable(false); + btnSkillSerious.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnSkillSerious.setRequestFocusEnabled(false); + btnSkillSerious.setVerifyInputWhenFocusTarget(false); + btnSkillSerious.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnSkillSerious.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar1.add(btnSkillSerious); + + filterBar1.add(jSeparator4); + + btnRated.setSelected(true); + btnRated.setText("Rated"); + btnRated.setToolTipText("Shows all rated tables."); + btnRated.setFocusPainted(false); + btnRated.setFocusable(false); + btnRated.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnRated.setRequestFocusEnabled(false); + btnRated.setVerifyInputWhenFocusTarget(false); + btnRated.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnRated.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar1.add(btnRated); + + btnUnrated.setSelected(true); + btnUnrated.setText("Unrated"); + btnUnrated.setToolTipText("Shows all unrated tables."); + btnUnrated.setFocusPainted(false); + btnUnrated.setFocusable(false); + btnUnrated.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnUnrated.setRequestFocusEnabled(false); + btnUnrated.setVerifyInputWhenFocusTarget(false); + btnUnrated.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnUnrated.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar1.add(btnUnrated); + + // second filter line + filterBar2.setFloatable(false); + filterBar2.setFocusable(false); + filterBar2.setOpaque(false); + + btnFormatBlock.setSelected(true); + btnFormatBlock.setText("Block"); + btnFormatBlock.setToolTipText("Block constructed formats."); + btnFormatBlock.setFocusPainted(false); + btnFormatBlock.setFocusable(false); + btnFormatBlock.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnFormatBlock.setRequestFocusEnabled(false); + btnFormatBlock.setVerifyInputWhenFocusTarget(false); + btnFormatBlock.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnFormatBlock.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar2.add(btnFormatBlock); + + btnFormatStandard.setSelected(true); + btnFormatStandard.setText("Standard"); + btnFormatStandard.setToolTipText("Standard format."); + btnFormatStandard.setFocusPainted(false); + btnFormatStandard.setFocusable(false); + btnFormatStandard.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnFormatStandard.setRequestFocusEnabled(false); + btnFormatStandard.setVerifyInputWhenFocusTarget(false); + btnFormatStandard.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnFormatStandard.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar2.add(btnFormatStandard); + + btnFormatModern.setSelected(true); + btnFormatModern.setText("Modern"); + btnFormatModern.setToolTipText("Modern format."); + btnFormatModern.setFocusPainted(false); + btnFormatModern.setFocusable(false); + btnFormatModern.setRequestFocusEnabled(false); + btnFormatModern.setVerifyInputWhenFocusTarget(false); + btnFormatModern.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar2.add(btnFormatModern); + + btnFormatLegacy.setSelected(true); + btnFormatLegacy.setText("Legacy"); + btnFormatLegacy.setToolTipText("Legacy format."); + btnFormatLegacy.setFocusPainted(false); + btnFormatLegacy.setFocusable(false); + btnFormatLegacy.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnFormatLegacy.setRequestFocusEnabled(false); + btnFormatLegacy.setVerifyInputWhenFocusTarget(false); + btnFormatLegacy.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnFormatLegacy.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar2.add(btnFormatLegacy); + + btnFormatVintage.setSelected(true); + btnFormatVintage.setText("Vintage"); + btnFormatVintage.setToolTipText("Vintage format."); + btnFormatVintage.setFocusPainted(false); + btnFormatVintage.setFocusable(false); + btnFormatVintage.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnFormatVintage.setRequestFocusEnabled(false); + btnFormatVintage.setVerifyInputWhenFocusTarget(false); + btnFormatVintage.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnFormatVintage.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar2.add(btnFormatVintage); + filterBar2.add(jSeparator3); + + btnFormatCommander.setSelected(true); + btnFormatCommander.setText("Commander"); + btnFormatCommander.setToolTipText("Commander format."); + btnFormatCommander.setFocusPainted(false); + btnFormatCommander.setFocusable(false); + btnFormatCommander.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnFormatCommander.setRequestFocusEnabled(false); + btnFormatCommander.setVerifyInputWhenFocusTarget(false); + btnFormatCommander.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnFormatCommander.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar2.add(btnFormatCommander); + + btnFormatTinyLeader.setSelected(true); + btnFormatTinyLeader.setText("Tiny Leader"); + btnFormatTinyLeader.setToolTipText("Tiny Leader format."); + btnFormatTinyLeader.setFocusPainted(false); + btnFormatTinyLeader.setFocusable(false); + btnFormatTinyLeader.setRequestFocusEnabled(false); + btnFormatTinyLeader.setVerifyInputWhenFocusTarget(false); + btnFormatTinyLeader.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar2.add(btnFormatTinyLeader); + filterBar2.add(jSeparator2); + + btnFormatLimited.setSelected(true); + btnFormatLimited.setText("Limited"); + btnFormatLimited.setToolTipText("Limited format."); + btnFormatLimited.setFocusPainted(false); + btnFormatLimited.setFocusable(false); + btnFormatLimited.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnFormatLimited.setRequestFocusEnabled(false); + btnFormatLimited.setVerifyInputWhenFocusTarget(false); + btnFormatLimited.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnFormatLimited.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar2.add(btnFormatLimited); + + btnFormatOther.setSelected(true); + btnFormatOther.setText("Other"); + btnFormatOther.setToolTipText("Other formats (Freeform, Pauper, Extended, etc.)"); + btnFormatOther.setFocusPainted(false); + btnFormatOther.setFocusable(false); + btnFormatOther.setRequestFocusEnabled(false); + btnFormatOther.setVerifyInputWhenFocusTarget(false); + btnFormatOther.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar2.add(btnFormatOther); + filterBar2.add(jSeparator5); + + btnOpen.setSelected(true); + btnOpen.setText("Open"); + btnOpen.setToolTipText("Show open games"); + btnOpen.setFocusPainted(false); + btnOpen.setFocusable(false); + btnOpen.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnOpen.setRequestFocusEnabled(false); + btnOpen.setVerifyInputWhenFocusTarget(false); + btnOpen.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnOpen.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar2.add(btnOpen); + + btnPassword.setSelected(true); + btnPassword.setText("PW"); + btnPassword.setToolTipText("Show passworded games"); + btnPassword.setFocusPainted(false); + btnPassword.setFocusable(false); + btnPassword.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnPassword.setRequestFocusEnabled(false); + btnPassword.setVerifyInputWhenFocusTarget(false); + btnPassword.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnPassword.addActionListener(evt -> btnFilterActionPerformed(evt)); + filterBar2.add(btnPassword); + + btnQuickStart.setText("Quick Start"); + btnQuickStart.setFocusable(false); + btnQuickStart.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnQuickStart.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnQuickStart.addActionListener(evt -> btnQuickStartActionPerformed(evt)); + + javax.swing.GroupLayout jPanelTopLayout = new javax.swing.GroupLayout(jPanelTop); + jPanelTop.setLayout(jPanelTopLayout); + jPanelTopLayout.setHorizontalGroup( + jPanelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanelTopLayout.createSequentialGroup() + .addContainerGap() + .addComponent(btnNewTable) + .addGap(6, 6, 6) + .addComponent(btnNewTournament) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(filterBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 491, Short.MAX_VALUE) + .addComponent(filterBar2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(btnQuickStart) + .addContainerGap(835, Short.MAX_VALUE)) + ); + jPanelTopLayout.setVerticalGroup( + jPanelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanelTopLayout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(btnNewTable) + .addComponent(btnNewTournament)) + .addGroup(jPanelTopLayout.createSequentialGroup() + .addGroup(jPanelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(filterBar1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(btnQuickStart)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(filterBar2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addContainerGap()) + ); + + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; + gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; + add(jPanelTop, gridBagConstraints); + + jSplitPane1.setBorder(null); + jSplitPane1.setDividerSize(10); + jSplitPane1.setResizeWeight(1.0); + + jSplitPaneTables.setBorder(null); + jSplitPaneTables.setDividerSize(10); + jSplitPaneTables.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); + jSplitPaneTables.setResizeWeight(0.5); + + jScrollPaneTablesActive.setBorder(null); + jScrollPaneTablesActive.setViewportBorder(null); + + tableTables.setModel(this.tableModel); + jScrollPaneTablesActive.setViewportView(tableTables); + + jSplitPaneTables.setLeftComponent(jScrollPaneTablesActive); + + jScrollPaneTablesFinished.setBorder(null); + jScrollPaneTablesFinished.setViewportBorder(null); + jScrollPaneTablesFinished.setMinimumSize(new java.awt.Dimension(23, 0)); + + tableCompleted.setModel(this.matchesModel); + jScrollPaneTablesFinished.setViewportView(tableCompleted); + + jSplitPaneTables.setRightComponent(jScrollPaneTablesFinished); + + javax.swing.GroupLayout jPanelTablesLayout = new javax.swing.GroupLayout(jPanelTables); + jPanelTables.setLayout(jPanelTablesLayout); + jPanelTablesLayout.setHorizontalGroup( + jPanelTablesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jSplitPaneTables, javax.swing.GroupLayout.PREFERRED_SIZE, 23, Short.MAX_VALUE) + ); + jPanelTablesLayout.setVerticalGroup( + jPanelTablesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jSplitPaneTables, javax.swing.GroupLayout.DEFAULT_SIZE, 672, Short.MAX_VALUE) + ); + + jSplitPane1.setLeftComponent(jPanelTables); + jSplitPane1.setRightComponent(chatPanelMain); + + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridy = 1; + gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; + gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; + gridBagConstraints.weightx = 1.0; + gridBagConstraints.weighty = 1.0; + add(jSplitPane1, gridBagConstraints); + + jPanelBottom.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED)); + jPanelBottom.setPreferredSize(new java.awt.Dimension(516, 37)); + jPanelBottom.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT)); + + jButtonFooterNext.setText("Next"); + jButtonFooterNext.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); + jButtonFooterNext.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + jButtonFooterNext.setOpaque(false); + jButtonFooterNext.addActionListener(evt -> jButtonFooterNextActionPerformed(evt)); + jPanelBottom.add(jButtonFooterNext); + + jLabelFooterLabel.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N + jLabelFooterLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); + jLabelFooterLabel.setText("Message of the Day:"); + jLabelFooterLabel.setAlignmentY(0.3F); + jPanelBottom.add(jLabelFooterLabel); + + jLabelFooterText.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); + jLabelFooterText.setText("You are playing Mage version 0.7.5. Welcome! -- Mage dev team --"); + jPanelBottom.add(jLabelFooterText); + + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridy = 2; + gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; + gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; + add(jPanelBottom, gridBagConstraints); + }// </editor-fold>//GEN-END:initComponents + + private void btnNewTournamentActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNewTournamentActionPerformed + newTournamentDialog.showDialog(roomId); +}//GEN-LAST:event_btnNewTournamentActionPerformed + + private void btnQuickStartActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnQuickStartActionPerformed + TableView table; + try { + File f = new File("test.dck"); + if (!f.exists()) { + JOptionPane.showMessageDialog(null, "Couldn't find test.dck file for quick game start", "Error", JOptionPane.ERROR_MESSAGE); + return; + } + + MatchOptions options = new MatchOptions("1", "Two Player Duel", false, 2); + options.getPlayerTypes().add(PlayerType.HUMAN); + options.getPlayerTypes().add(PlayerType.COMPUTER_MAD); + options.setDeckType("Limited"); + options.setAttackOption(MultiplayerAttackOption.LEFT); + options.setRange(RangeOfInfluence.ALL); + options.setWinsNeeded(1); + options.setMatchTimeLimit(MatchTimeLimit.NONE); + options.setFreeMulligans(2); + options.setSkillLevel(SkillLevel.CASUAL); + options.setRollbackTurnsAllowed(true); + options.setQuitRatio(100); + options.setMinimumRating(0); + String serverAddress = SessionHandler.getSession().getServerHostname().orElseGet(() -> ""); + options.setBannedUsers(IgnoreList.ignoreList(serverAddress)); + table = SessionHandler.createTable(roomId, options); + + SessionHandler.joinTable(roomId, table.getTableId(), "Human", PlayerType.HUMAN, 1, DeckImporterUtil.importDeck("test.dck"), ""); + SessionHandler.joinTable(roomId, table.getTableId(), "Computer", PlayerType.COMPUTER_MAD, 5, DeckImporterUtil.importDeck("test.dck"), ""); + SessionHandler.startMatch(roomId, table.getTableId()); + } catch (HeadlessException ex) { + handleError(ex); + } +}//GEN-LAST:event_btnQuickStartActionPerformed + + private void btnNewTableActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNewTableActionPerformed + newTableDialog.showDialog(roomId); + }//GEN-LAST:event_btnNewTableActionPerformed + + private void jButtonFooterNextActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonFooterNextActionPerformed + synchronized (this) { + if (messages != null && !messages.isEmpty()) { + currentMessage++; + if (currentMessage >= messages.size()) { + currentMessage = 0; + } + + URLHandler.RemoveMouseAdapter(jLabelFooterText); + URLHandler.handleMessage(messages.get(currentMessage), this.jLabelFooterText); + } + } + }//GEN-LAST:event_jButtonFooterNextActionPerformed + + private void btnFilterActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnFilterActionPerformed + setTableFilter(); + }//GEN-LAST:event_btnFilterActionPerformed + + private void btnStateFinishedActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnStateFinishedActionPerformed + if (this.btnStateFinished.isSelected()) { + this.jSplitPaneTables.setDividerLocation(-1); + } else { + this.jSplitPaneTables.setDividerLocation(this.jPanelTables.getHeight()); + } + this.startTasks(); + }//GEN-LAST:event_btnStateFinishedActionPerformed + + private void handleError(Exception ex) { + LOGGER.fatal("Error loading deck: ", ex); + JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Error loading deck.", "Error", JOptionPane.ERROR_MESSAGE); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JToggleButton btnFormatBlock; + private javax.swing.JToggleButton btnFormatCommander; + private javax.swing.JToggleButton btnFormatLegacy; + private javax.swing.JToggleButton btnFormatLimited; + private javax.swing.JToggleButton btnFormatModern; + private javax.swing.JToggleButton btnFormatOther; + private javax.swing.JToggleButton btnFormatStandard; + private javax.swing.JToggleButton btnFormatTinyLeader; + private javax.swing.JToggleButton btnFormatVintage; + private javax.swing.JButton btnNewTable; + private javax.swing.JButton btnNewTournament; + private javax.swing.JToggleButton btnOpen; + private javax.swing.JToggleButton btnPassword; + private javax.swing.JButton btnQuickStart; + private javax.swing.JToggleButton btnSkillBeginner; + private javax.swing.JToggleButton btnSkillCasual; + private javax.swing.JToggleButton btnSkillSerious; + private javax.swing.JToggleButton btnRated; + private javax.swing.JToggleButton btnUnrated; + private javax.swing.JToggleButton btnStateActive; + private javax.swing.JToggleButton btnStateFinished; + private javax.swing.JToggleButton btnStateWaiting; + private javax.swing.JToggleButton btnTypeMatch; + private javax.swing.JToggleButton btnTypeTourneyConstructed; + private javax.swing.JToggleButton btnTypeTourneyLimited; + private mage.client.table.PlayersChatPanel chatPanelMain; + private javax.swing.JToolBar filterBar1; + private javax.swing.JToolBar filterBar2; + private javax.swing.JButton jButtonFooterNext; + private javax.swing.JLabel jLabelFooterLabel; + private javax.swing.JLabel jLabelFooterText; + private javax.swing.JPanel jPanelBottom; + private javax.swing.JPanel jPanelTables; + private javax.swing.JPanel jPanelTop; + private javax.swing.JScrollPane jScrollPaneTablesActive; + private javax.swing.JScrollPane jScrollPaneTablesFinished; + private javax.swing.JToolBar.Separator jSeparator1; + private javax.swing.JToolBar.Separator jSeparator2; + private javax.swing.JToolBar.Separator jSeparator3; + private javax.swing.JToolBar.Separator jSeparator4; + private javax.swing.JToolBar.Separator jSeparator5; + private javax.swing.JSplitPane jSplitPane1; + private javax.swing.JSplitPane jSplitPaneTables; + private javax.swing.JTable tableCompleted; + private javax.swing.JTable tableTables; + // End of variables declaration//GEN-END:variables + +} + +class TableTableModel extends AbstractTableModel { + + final ImageIcon tourneyIcon = new javax.swing.ImageIcon(getClass().getResource("/tables/tourney_icon.png")); + final ImageIcon matchIcon = new javax.swing.ImageIcon(getClass().getResource("/tables/match_icon.png")); + + public static final int COLUMN_ICON = 0; + public static final int COLUMN_DECK_TYPE = 1; // column the deck type is located (starting with 0) Start string is used to check for Limited + public static final int COLUMN_OWNER = 2; + public static final int COLUMN_GAME_TYPE = 3; + public static final int COLUMN_INFO = 4; + public static final int COLUMN_STATUS = 5; + public static final int COLUMN_PASSWORD = 6; + public static final int COLUMN_CREATED = 7; + public static final int COLUMN_SKILL = 8; + public static final int COLUMN_RATING = 9; + public static final int COLUMN_QUIT_RATIO = 10; + public static final int COLUMN_MINIMUM_RATING = 11; + public static final int ACTION_COLUMN = 12; // column the action is located (starting with 0) + + public static final String RATED_VALUE_YES = "YES"; + public static final String RATED_VALUE_NO = ""; + + public static final String PASSWORD_VALUE_YES = "YES"; + + private final String[] columnNames = new String[]{"M/T", "Deck Type", "Owner / Players", "Game Type", "Info", "Status", "Password", "Created / Started", "Skill Level", "Rated", "Quit %", "Min Rating", "Action"}; + + private TableView[] tables = new TableView[0]; + + TableTableModel() { + } + + public void loadData(Collection<TableView> tables) throws MageRemoteException { + this.tables = tables.toArray(new TableView[0]); + this.fireTableDataChanged(); + } + + public String getSkillLevelAsCode(SkillLevel skill, boolean asRegExp) { + String res; + switch (skill) { + case BEGINNER: + res = "*"; + break; + case CASUAL: + res = "**"; + break; + case SERIOUS: + res = "***"; + break; + default: + res = ""; + break; + } + + // regexp format for search table rows + if (asRegExp) { + res = String.format("^%s$", res.replace("*", "\\*")); + } + + return res; + } + + @Override + public int getRowCount() { + return tables.length; + } + + @Override + public int getColumnCount() { + return columnNames.length; + } + + @Override + public Object getValueAt(int arg0, int arg1) { + switch (arg1) { + case 0: + return tables[arg0].isTournament() ? tourneyIcon : matchIcon; + case 1: + return tables[arg0].getDeckType(); + case 2: + return tables[arg0].getControllerName(); + case 3: + return tables[arg0].getGameType(); + case 4: + return tables[arg0].getAdditionalInfo(); + case 5: + return tables[arg0].getTableStateText(); + case 6: + return tables[arg0].isPassworded() ? PASSWORD_VALUE_YES : ""; + case 7: + return tables[arg0].getCreateTime(); // use cell render, not format here + case 8: return this.getSkillLevelAsCode(tables[arg0].getSkillLevel(), false); - case 9: - return tables[arg0].isRated() ? RATED_VALUE_YES : RATED_VALUE_NO; - case 10: - return tables[arg0].getQuitRatio(); - case 11: - switch (tables[arg0].getTableState()) { + case 9: + return tables[arg0].isRated() ? RATED_VALUE_YES : RATED_VALUE_NO; + case 10: + return tables[arg0].getQuitRatio(); + case 11: + return tables[arg0].getMinimumRating(); + case 12: + switch (tables[arg0].getTableState()) { - case WAITING: - String owner = tables[arg0].getControllerName(); - if (SessionHandler.getSession() != null && owner.equals(SessionHandler.getUserName())) { - return ""; - } - return "Join"; - case CONSTRUCTING: - case DRAFTING: - if (tables[arg0].isTournament()) { - return "Show"; - } - case DUELING: - if (tables[arg0].isTournament()) { - return "Show"; - } else { - owner = tables[arg0].getControllerName(); - if (SessionHandler.getSession() != null && owner.equals(SessionHandler.getUserName())) { - return ""; - } - if (tables[arg0].getSpectatorsAllowed()) { - return "Watch"; - } - return ""; - } - default: - return ""; - } - case 12: - return tables[arg0].isTournament(); - case 13: - if (!tables[arg0].getGames().isEmpty()) { - return tables[arg0].getGames().get(0); - } - return null; - case 14: - return tables[arg0].getTableId(); - } - return ""; - } + case WAITING: + String owner = tables[arg0].getControllerName(); + if (SessionHandler.getSession() != null && owner.equals(SessionHandler.getUserName())) { + return ""; + } + return "Join"; + case CONSTRUCTING: + case DRAFTING: + if (tables[arg0].isTournament()) { + return "Show"; + } + case DUELING: + if (tables[arg0].isTournament()) { + return "Show"; + } else { + owner = tables[arg0].getControllerName(); + if (SessionHandler.getSession() != null && owner.equals(SessionHandler.getUserName())) { + return ""; + } + if (tables[arg0].getSpectatorsAllowed()) { + return "Watch"; + } + return ""; + } + default: + return ""; + } + case 13: + return tables[arg0].isTournament(); + case 14: + if (!tables[arg0].getGames().isEmpty()) { + return tables[arg0].getGames().get(0); + } + return null; + case 15: + return tables[arg0].getTableId(); + } + return ""; + } - @Override - public String getColumnName(int columnIndex) { - String colName = ""; + @Override + public String getColumnName(int columnIndex) { + String colName = ""; - if (columnIndex <= getColumnCount()) { - colName = columnNames[columnIndex]; - } + if (columnIndex <= getColumnCount()) { + colName = columnNames[columnIndex]; + } - return colName; - } + return colName; + } - @Override - public Class getColumnClass(int columnIndex) { - switch (columnIndex) { - case COLUMN_ICON: - return Icon.class; - case COLUMN_SKILL: - return SkillLevel.class; - case COLUMN_CREATED: - return Date.class; - default: - return String.class; - } - } + @Override + public Class getColumnClass(int columnIndex) { + switch (columnIndex) { + case COLUMN_ICON: + return Icon.class; + case COLUMN_SKILL: + return SkillLevel.class; + case COLUMN_CREATED: + return Date.class; + default: + return String.class; + } + } - @Override - public boolean isCellEditable(int rowIndex, int columnIndex) { - return columnIndex == ACTION_COLUMN; - } + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return columnIndex == ACTION_COLUMN; + } - } +} - class UpdateTablesTask extends SwingWorker<Void, Collection<TableView>> { +class UpdateTablesTask extends SwingWorker<Void, Collection<TableView>> { - private final UUID roomId; - private final TablesPanel panel; + private final UUID roomId; + private final TablesPanel panel; - private static final Logger logger = Logger.getLogger(UpdateTablesTask.class); + private static final Logger logger = Logger.getLogger(UpdateTablesTask.class); - private int count = 0; + private int count = 0; - UpdateTablesTask(UUID roomId, TablesPanel panel) { + UpdateTablesTask(UUID roomId, TablesPanel panel) { - this.roomId = roomId; - this.panel = panel; - } + this.roomId = roomId; + this.panel = panel; + } - @Override - protected Void doInBackground() throws Exception { - while (!isCancelled()) { - Collection<TableView> tables = SessionHandler.getTables(roomId); - if (tables != null) { - this.publish(tables); - } - TimeUnit.SECONDS.sleep(3); - } - return null; - } + @Override + protected Void doInBackground() throws Exception { + while (!isCancelled()) { + Collection<TableView> tables = SessionHandler.getTables(roomId); + if (tables != null) { + this.publish(tables); + } + TimeUnit.SECONDS.sleep(3); + } + return null; + } - @Override - protected void process(java.util.List<Collection<TableView>> view) { - panel.updateTables(view.get(0)); - count++; - if (count > 60) { - count = 0; - panel.reloadMessages(); - } - } + @Override + protected void process(java.util.List<Collection<TableView>> view) { + panel.updateTables(view.get(0)); + count++; + if (count > 60) { + count = 0; + panel.reloadMessages(); + } + } - @Override - protected void done() { - try { - get(); - } catch (InterruptedException | ExecutionException ex) { - logger.fatal("Update Tables Task error", ex); - } catch (CancellationException ex) { - } - } + @Override + protected void done() { + try { + get(); + } catch (InterruptedException | ExecutionException ex) { + logger.fatal("Update Tables Task error", ex); + } catch (CancellationException ex) { + } + } - } +} - class UpdatePlayersTask extends SwingWorker<Void, Collection<RoomUsersView>> { +class UpdatePlayersTask extends SwingWorker<Void, Collection<RoomUsersView>> { - private final UUID roomId; - private final PlayersChatPanel chat; + private final UUID roomId; + private final PlayersChatPanel chat; - private static final Logger logger = Logger.getLogger(UpdatePlayersTask.class); + private static final Logger logger = Logger.getLogger(UpdatePlayersTask.class); - UpdatePlayersTask(UUID roomId, PlayersChatPanel chat) { + UpdatePlayersTask(UUID roomId, PlayersChatPanel chat) { - this.roomId = roomId; - this.chat = chat; - } + this.roomId = roomId; + this.chat = chat; + } - @Override - protected Void doInBackground() throws Exception { - while (!isCancelled()) { - this.publish(SessionHandler.getRoomUsers(roomId)); - TimeUnit.SECONDS.sleep(3); - } - return null; - } + @Override + protected Void doInBackground() throws Exception { + while (!isCancelled()) { + this.publish(SessionHandler.getRoomUsers(roomId)); + TimeUnit.SECONDS.sleep(3); + } + return null; + } - @Override - protected void process(java.util.List<Collection<RoomUsersView>> roomUserInfo) { - chat.setRoomUserInfo(roomUserInfo); - } + @Override + protected void process(java.util.List<Collection<RoomUsersView>> roomUserInfo) { + chat.setRoomUserInfo(roomUserInfo); + } - @Override - protected void done() { - try { - get(); - } catch (InterruptedException | ExecutionException ex) { - logger.fatal("Update Players Task error", ex); - } catch (CancellationException ex) { - } - } + @Override + protected void done() { + try { + get(); + } catch (InterruptedException | ExecutionException ex) { + logger.fatal("Update Players Task error", ex); + } catch (CancellationException ex) { + } + } - } +} - class MatchesTableModel extends AbstractTableModel { +class MatchesTableModel extends AbstractTableModel { - private final String[] columnNames = new String[]{"Deck Type", "Players", "Game Type", "Rating", "Result", "Duration", "Start Time", "End Time", "Action"}; - public static final int COLUMN_DURATION = 5; - public static final int COLUMN_START = 6; - public static final int COLUMN_END = 7; - public static final int COLUMN_ACTION = 8; // column the action is located (starting with 0) + private final String[] columnNames = new String[]{"Deck Type", "Players", "Game Type", "Rating", "Result", "Duration", "Start Time", "End Time", "Action"}; + public static final int COLUMN_DURATION = 5; + public static final int COLUMN_START = 6; + public static final int COLUMN_END = 7; + public static final int COLUMN_ACTION = 8; // column the action is located (starting with 0) - private MatchView[] matches = new MatchView[0]; + private MatchView[] matches = new MatchView[0]; - public void loadData(Collection<MatchView> matches) throws MageRemoteException { - this.matches = matches.toArray(new MatchView[0]); - this.fireTableDataChanged(); - } + public void loadData(Collection<MatchView> matches) throws MageRemoteException { + this.matches = matches.toArray(new MatchView[0]); + this.fireTableDataChanged(); + } - MatchesTableModel() { - } + MatchesTableModel() { + } - @Override - public int getRowCount() { - return matches.length; - } + @Override + public int getRowCount() { + return matches.length; + } - @Override - public int getColumnCount() { - return columnNames.length; - } + @Override + public int getColumnCount() { + return columnNames.length; + } - @Override - public Object getValueAt(int arg0, int arg1) { - switch (arg1) { - case 0: - return matches[arg0].getDeckType(); - case 1: - return matches[arg0].getPlayers(); - case 2: - return matches[arg0].getGameType(); - case 3: - return matches[arg0].isRated() ? TableTableModel.RATED_VALUE_YES : TableTableModel.RATED_VALUE_NO; - case 4: - return matches[arg0].getResult(); - case 5: - if (matches[arg0].getEndTime() != null) { - return matches[arg0].getEndTime().getTime() - matches[arg0].getStartTime().getTime() + new Date().getTime(); - } else { - return 0L; - } - case 6: - return matches[arg0].getStartTime(); - case 7: - return matches[arg0].getEndTime(); - case 8: - if (matches[arg0].isTournament()) { - return "Show"; - } else if (matches[arg0].isReplayAvailable()) { - return "Replay"; - } else { - return "None"; - } - case 9: - return matches[arg0].getGames(); - } - return ""; - } + @Override + public Object getValueAt(int arg0, int arg1) { + switch (arg1) { + case 0: + return matches[arg0].getDeckType(); + case 1: + return matches[arg0].getPlayers(); + case 2: + return matches[arg0].getGameType(); + case 3: + return matches[arg0].isRated() ? TableTableModel.RATED_VALUE_YES : TableTableModel.RATED_VALUE_NO; + case 4: + return matches[arg0].getResult(); + case 5: + if (matches[arg0].getEndTime() != null) { + return matches[arg0].getEndTime().getTime() - matches[arg0].getStartTime().getTime() + new Date().getTime(); + } else { + return 0L; + } + case 6: + return matches[arg0].getStartTime(); + case 7: + return matches[arg0].getEndTime(); + case 8: + if (matches[arg0].isTournament()) { + return "Show"; + } else if (matches[arg0].isReplayAvailable()) { + return "Replay"; + } else { + return "None"; + } + case 9: + return matches[arg0].getGames(); + } + return ""; + } - public java.util.List<UUID> getListofGames(int row) { - return matches[row].getGames(); - } + public java.util.List<UUID> getListofGames(int row) { + return matches[row].getGames(); + } - public boolean isTournament(int row) { - return matches[row].isTournament(); - } + public boolean isTournament(int row) { + return matches[row].isTournament(); + } - public UUID getMatchId(int row) { - return matches[row].getMatchId(); - } + public UUID getMatchId(int row) { + return matches[row].getMatchId(); + } - public UUID getTableId(int row) { - return matches[row].getTableId(); - } + public UUID getTableId(int row) { + return matches[row].getTableId(); + } - @Override - public String getColumnName(int columnIndex) { - String colName = ""; + @Override + public String getColumnName(int columnIndex) { + String colName = ""; - if (columnIndex <= getColumnCount()) { - colName = columnNames[columnIndex]; - } + if (columnIndex <= getColumnCount()) { + colName = columnNames[columnIndex]; + } - return colName; - } + return colName; + } - @Override - public Class getColumnClass(int columnIndex) { - switch (columnIndex) { - case COLUMN_DURATION: - return Long.class; - case COLUMN_START: - return Date.class; - case COLUMN_END: - return Date.class; - default: - return String.class; - } - } + @Override + public Class getColumnClass(int columnIndex) { + switch (columnIndex) { + case COLUMN_DURATION: + return Long.class; + case COLUMN_START: + return Date.class; + case COLUMN_END: + return Date.class; + default: + return String.class; + } + } - @Override - public boolean isCellEditable(int rowIndex, int columnIndex) { - return columnIndex == COLUMN_ACTION; - } + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return columnIndex == COLUMN_ACTION; + } - } +} - class UpdateMatchesTask extends SwingWorker<Void, Collection<MatchView>> { +class UpdateMatchesTask extends SwingWorker<Void, Collection<MatchView>> { - private final UUID roomId; - private final TablesPanel panel; + private final UUID roomId; + private final TablesPanel panel; - private static final Logger logger = Logger.getLogger(UpdateTablesTask.class); + private static final Logger logger = Logger.getLogger(UpdateTablesTask.class); - UpdateMatchesTask(UUID roomId, TablesPanel panel) { - this.roomId = roomId; - this.panel = panel; - } + UpdateMatchesTask(UUID roomId, TablesPanel panel) { + this.roomId = roomId; + this.panel = panel; + } - @Override - protected Void doInBackground() throws Exception { - while (!isCancelled()) { - Collection<MatchView> matches = SessionHandler.getFinishedMatches(roomId); - if (!matches.isEmpty()) { - this.publish(matches); - } - TimeUnit.SECONDS.sleep(10); - } - return null; - } + @Override + protected Void doInBackground() throws Exception { + while (!isCancelled()) { + Collection<MatchView> matches = SessionHandler.getFinishedMatches(roomId); + if (!matches.isEmpty()) { + this.publish(matches); + } + TimeUnit.SECONDS.sleep(10); + } + return null; + } - @Override - protected void process(java.util.List<Collection<MatchView>> view) { - panel.updateMatches(view.get(0)); - } + @Override + protected void process(java.util.List<Collection<MatchView>> view) { + panel.updateMatches(view.get(0)); + } - @Override - protected void done() { - try { - get(); - } catch (InterruptedException | ExecutionException ex) { - logger.fatal("Update Matches Task error", ex); - } catch (CancellationException ex) { - } - } + @Override + protected void done() { + try { + get(); + } catch (InterruptedException | ExecutionException ex) { + logger.fatal("Update Matches Task error", ex); + } catch (CancellationException ex) { + } + } - } +} - class GameChooser extends JPopupMenu { +class GameChooser extends JPopupMenu { - public void init() { + public void init() { - } + } - public void show(java.util.List<UUID> games, Point p) { - if (p == null) { - return; - } - this.removeAll(); - for (UUID gameId : games) { - this.add(new GameChooserAction(gameId, gameId.toString())); - } - this.show(MageFrame.getDesktop(), p.x, p.y); - GuiDisplayUtil.keepComponentInsideScreen(p.x, p.y, this); - } + public void show(java.util.List<UUID> games, Point p) { + if (p == null) { + return; + } + this.removeAll(); + for (UUID gameId : games) { + this.add(new GameChooserAction(gameId, gameId.toString())); + } + this.show(MageFrame.getDesktop(), p.x, p.y); + GuiDisplayUtil.keepComponentInsideScreen(p.x, p.y, this); + } - private class GameChooserAction extends AbstractAction { + private class GameChooserAction extends AbstractAction { - private final UUID id; + private final UUID id; - public GameChooserAction(UUID id, String choice) { - this.id = id; - putValue(Action.NAME, choice); - } + public GameChooserAction(UUID id, String choice) { + this.id = id; + putValue(Action.NAME, choice); + } - @Override - public void actionPerformed(ActionEvent e) { - SessionHandler.replayGame(id); - setVisible(false); - } + @Override + public void actionPerformed(ActionEvent e) { + SessionHandler.replayGame(id); + setVisible(false); + } - } + } - } +} diff --git a/Mage.Common/src/main/java/mage/view/TableView.java b/Mage.Common/src/main/java/mage/view/TableView.java index c3d748c344..948c7717bf 100644 --- a/Mage.Common/src/main/java/mage/view/TableView.java +++ b/Mage.Common/src/main/java/mage/view/TableView.java @@ -36,6 +36,7 @@ public class TableView implements Serializable { private List<SeatView> seats = new ArrayList<>(); private List<UUID> games = new ArrayList<>(); private final String quitRatio; + private final String minimumRating; private final boolean limited; private final boolean rated; private final boolean passworded; @@ -111,6 +112,7 @@ public class TableView implements Serializable { this.additionalInfo = addInfo.toString(); this.skillLevel = table.getMatch().getOptions().getSkillLevel(); this.quitRatio = Integer.toString(table.getMatch().getOptions().getQuitRatio()); + this.minimumRating = Integer.toString(table.getMatch().getOptions().getMinimumRating()); this.limited = table.getMatch().getOptions().isLimited(); this.rated = table.getMatch().getOptions().isRated(); this.passworded = !table.getMatch().getOptions().getPassword().isEmpty(); @@ -159,6 +161,7 @@ public class TableView implements Serializable { this.deckType = table.getDeckType() + ' ' + table.getTournament().getBoosterInfo() + (tableNameInfo != null ? tableNameInfo : ""); this.skillLevel = table.getTournament().getOptions().getMatchOptions().getSkillLevel(); this.quitRatio = Integer.toString(table.getTournament().getOptions().getQuitRatio()); + this.minimumRating = Integer.toString(table.getTournament().getOptions().getMinimumRating()); this.limited = table.getTournament().getOptions().getMatchOptions().isLimited(); this.rated = table.getTournament().getOptions().getMatchOptions().isRated(); this.passworded = !table.getTournament().getOptions().getPassword().isEmpty(); @@ -223,9 +226,9 @@ public class TableView implements Serializable { return skillLevel; } - public String getQuitRatio() { - return quitRatio; - } + public String getQuitRatio() { return quitRatio; } + + public String getMinimumRating() { return minimumRating; } public boolean isLimited() { return limited; diff --git a/Mage.Server/src/main/java/mage/server/MageServerImpl.java b/Mage.Server/src/main/java/mage/server/MageServerImpl.java index 899f113519..97d84c1a28 100644 --- a/Mage.Server/src/main/java/mage/server/MageServerImpl.java +++ b/Mage.Server/src/main/java/mage/server/MageServerImpl.java @@ -227,6 +227,20 @@ public class MageServerImpl implements MageServer { user.showUserMessage("Create tournament", message); throw new MageException("No message"); } + // check if the user satisfies the minimumRating requirement. + int minimumRating = options.getMinimumRating(); + int userRating; + if (options.getMatchOptions().isLimited()) { + userRating = user.getUserData().getLimitedRating(); + } else { + userRating = user.getUserData().getConstructedRating(); + } + if (userRating < minimumRating) { + String message = new StringBuilder("Your rating ").append(userRating) + .append(" is lower than the table requirement ").append(minimumRating).toString(); + user.showUserMessage("Create tournament", message); + throw new MageException("No message"); + } Optional<GamesRoom> room = GamesRoomManager.instance.getRoom(roomId); if (!room.isPresent()) { @@ -1386,7 +1400,19 @@ public class MageServerImpl implements MageServer { user.showUserMessage("Create table", "Your quit ratio " + user.getMatchQuitRatio() + "% is higher than the table requirement " + quitRatio + '%'); throw new MageException("No message"); } - + // check if the user satisfies the minimumRating requirement. + int minimumRating = options.getMinimumRating(); + int userRating; + if (options.isLimited()) { + userRating = user.getUserData().getLimitedRating(); + } else { + userRating = user.getUserData().getConstructedRating(); + } + if (userRating < minimumRating) { + String message = new StringBuilder("Your rating ").append(userRating).append(" is lower than the table requirement ").append(minimumRating).toString(); + user.showUserMessage("Create table", message); + throw new MageException("No message"); + } Optional<GamesRoom> room = GamesRoomManager.instance.getRoom(roomId); if (room.isPresent()) { TableView table = room.get().createTable(userId, options); diff --git a/Mage.Server/src/main/java/mage/server/TableController.java b/Mage.Server/src/main/java/mage/server/TableController.java index 1f4d9808cd..a3f993cf41 100644 --- a/Mage.Server/src/main/java/mage/server/TableController.java +++ b/Mage.Server/src/main/java/mage/server/TableController.java @@ -172,6 +172,21 @@ public class TableController { return false; } + // Check minimum rating. + int minimumRating = table.getTournament().getOptions().getMinimumRating(); + int userRating; + if (table.getTournament().getOptions().getMatchOptions().isLimited()) { + userRating = user.getUserData().getLimitedRating(); + } else { + userRating = user.getUserData().getConstructedRating(); + } + if (userRating < minimumRating) { + String message = new StringBuilder("Your rating ").append(userRating) + .append(" is lower than the table requirement ").append(minimumRating).toString(); + user.showUserMessage("Join Table", message); + return false; + } + Optional<Player> playerOptional = createPlayer(name, seat.getPlayerType(), skill); if (playerOptional.isPresent()) { Player player = playerOptional.get(); @@ -272,6 +287,21 @@ public class TableController { return false; } + // Check minimum rating. + int minimumRating = table.getMatch().getOptions().getMinimumRating(); + int userRating; + if (table.getMatch().getOptions().isLimited()) { + userRating = user.getUserData().getLimitedRating(); + } else { + userRating = user.getUserData().getConstructedRating(); + } + if (userRating < minimumRating) { + String message = new StringBuilder("Your rating ").append(userRating) + .append(" is lower than the table requirement ").append(minimumRating).toString(); + user.showUserMessage("Join Table", message); + return false; + } + // Check power level for table (currently only used for EDH/Commander table) int edhPowerLevel = table.getMatch().getOptions().getEdhPowerLevel(); if (edhPowerLevel > 0 && table.getValidator().getName().toLowerCase(Locale.ENGLISH).equals("commander")) { diff --git a/Mage/src/main/java/mage/game/match/MatchOptions.java b/Mage/src/main/java/mage/game/match/MatchOptions.java index 02e6808416..47ad873e63 100644 --- a/Mage/src/main/java/mage/game/match/MatchOptions.java +++ b/Mage/src/main/java/mage/game/match/MatchOptions.java @@ -37,6 +37,7 @@ public class MatchOptions implements Serializable { protected boolean spectatorsAllowed; protected boolean planeChase; protected int quitRatio; + protected int minimumRating; protected int edhPowerLevel; protected boolean rated; protected int numSeatsForMatch; @@ -205,6 +206,10 @@ public class MatchOptions implements Serializable { this.quitRatio = quitRatio; } + public int getMinimumRating() { return minimumRating; } + + public void setMinimumRating(int minimumRating) { this.minimumRating = minimumRating; } + public int getEdhPowerLevel() { return edhPowerLevel; } diff --git a/Mage/src/main/java/mage/game/tournament/TournamentOptions.java b/Mage/src/main/java/mage/game/tournament/TournamentOptions.java index 2b042d19a1..c81294ce3e 100644 --- a/Mage/src/main/java/mage/game/tournament/TournamentOptions.java +++ b/Mage/src/main/java/mage/game/tournament/TournamentOptions.java @@ -24,6 +24,7 @@ public class TournamentOptions implements Serializable { protected int numberRounds; protected String password; protected int quitRatio; + protected int minimumRating; public TournamentOptions(String name, String matchType, int numSeats) { this.name = name; @@ -98,4 +99,8 @@ public class TournamentOptions implements Serializable { public void setQuitRatio(int quitRatio) { this.quitRatio = quitRatio; } + + public int getMinimumRating() { return minimumRating; } + + public void setMinimumRating(int minimumRating) { this.minimumRating = minimumRating; } }