/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
/*
* TablesPanel.java
*
* Created on 15-Dec-2009, 10:54:01 PM
*/
package mage.client.table;
import mage.cards.decks.importer.DeckImporterUtil;
import mage.client.MageFrame;
import mage.client.SessionHandler;
import mage.client.chat.ChatPanelBasic;
import mage.client.components.MageComponents;
import mage.client.dialog.*;
import mage.client.util.ButtonColumn;
import mage.client.util.GUISizeHelper;
import mage.client.util.IgnoreList;
import mage.client.util.MageTableRowSorter;
import mage.client.util.gui.GuiDisplayUtil;
import mage.client.util.gui.TableUtil;
import mage.constants.*;
import mage.game.match.MatchOptions;
import mage.players.PlayerType;
import mage.remote.MageRemoteException;
import mage.view.MatchView;
import mage.view.RoomUsersView;
import mage.view.TableView;
import mage.view.UserRequestMessage;
import org.apache.log4j.Logger;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.beans.PropertyVetoException;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.List;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import static mage.client.dialog.PreferencesDialog.KEY_TABLES_COLUMNS_ORDER;
import static mage.client.dialog.PreferencesDialog.KEY_TABLES_COLUMNS_WIDTH;
import static mage.client.table.TablesPanel.PASSWORDED;
/**
*
* @author BetaSteward_at_googlemail.com
*/
public class TablesPanel extends javax.swing.JPanel {
private static final Logger LOGGER = Logger.getLogger(TablesPanel.class);
private static final int[] DEFAULT_COLUMNS_WIDTH = {35, 150, 120, 180, 80, 120, 80, 60, 40, 40, 60};
public static final String PASSWORDED = "***";
private final TableTableModel tableModel;
private final MatchesTableModel matchesModel;
private UUID roomId;
private UpdateTablesTask updateTablesTask;
private UpdatePlayersTask updatePlayersTask;
private UpdateMatchesTask updateMatchesTask;
private JoinTableDialog joinTableDialog;
private NewTableDialog newTableDialog;
private NewTournamentDialog newTournamentDialog;
private final GameChooser gameChooser;
private List<String> messages;
private int currentMessage;
private final MageTableRowSorter activeTablesSorter;
private final ButtonColumn actionButton1;
private final ButtonColumn actionButton2;
final JToggleButton[] filterButtons;
/**
* Creates new form TablesPanel
*/
public TablesPanel() {
tableModel = new TableTableModel();
matchesModel = new MatchesTableModel();
gameChooser = new GameChooser();
initComponents();
// tableModel.setSession(session);
tableTables.createDefaultColumnsFromModel();
activeTablesSorter = new MageTableRowSorter(tableModel);
tableTables.setRowSorter(activeTablesSorter);
TableUtil.setColumnWidthAndOrder(tableTables, DEFAULT_COLUMNS_WIDTH,
PreferencesDialog.KEY_TABLES_COLUMNS_WIDTH, PreferencesDialog.KEY_TABLES_COLUMNS_ORDER);
tableCompleted.setRowSorter(new MageTableRowSorter(matchesModel));
chatPanelMain.getUserChatPanel().useExtendedView(ChatPanelBasic.VIEW_MODE.NONE);
chatPanelMain.getUserChatPanel().setBorder(null);
chatPanelMain.getUserChatPanel().setChatType(ChatPanelBasic.ChatType.TABLES);
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};
JComponent[] components = new JComponent[]{chatPanelMain, jSplitPane1, jScrollPaneTablesActive, jScrollPaneTablesFinished, jPanelTop, jPanelTables};
for (JComponent component : components) {
component.setOpaque(false);
}
jScrollPaneTablesActive.getViewport().setBackground(new Color(255, 255, 255, 50));
jScrollPaneTablesFinished.getViewport().setBackground(new Color(255, 255, 255, 50));
restoreSettings();
setGUISize();
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);
}
}
}
} catch (InterruptedException ex) {
LOGGER.error(ex);
}
return;
}
if (isTournament) {
LOGGER.info("Joining tournament " + tableId);
if (deckType.startsWith("Limited")) {
if (PASSWORDED.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 closedTableAction;
closedTableAction = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
int modelRow = Integer.valueOf(e.getActionCommand());
String action = (String) matchesModel.getValueAt(modelRow, MatchesTableModel.ACTION_COLUMN);
switch (action) {
case "Replay":
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.ACTION_COLUMN));
// !!!!
}
public void cleanUp() {
saveSettings();
chatPanelMain.cleanUp();
}
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());
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));
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_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));
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);
}
private void saveDividerLocations() {
// save panel sizes and divider locations.
Rectangle rec = MageFrame.getDesktop().getBounds();
String sb = Double.toString(rec.getWidth()) + 'x' + Double.toString(rec.getHeight());
PreferencesDialog.saveValue(PreferencesDialog.KEY_MAGE_PANEL_LAST_SIZE, sb);
PreferencesDialog.saveValue(PreferencesDialog.KEY_TABLES_DIVIDER_LOCATION_1, Integer.toString(this.jSplitPane1.getDividerLocation()));
PreferencesDialog.saveValue(PreferencesDialog.KEY_TABLES_DIVIDER_LOCATION_2, Integer.toString(this.jSplitPaneTables.getDividerLocation()));
PreferencesDialog.saveValue(PreferencesDialog.KEY_TABLES_DIVIDER_LOCATION_3, Integer.toString(chatPanelMain.getSplitDividerLocation()));
}
private void restoreSettings() {
// filter settings
String formatSettings = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_TABLES_FILTER_SETTINGS, "");
int i = 0;
for (JToggleButton component : filterButtons) {
if (formatSettings.length() > i) {
component.setSelected(formatSettings.substring(i, i + 1).equals("x"));
} else {
component.setSelected(true);
}
i++;
}
setTableFilter();
}
private void saveSettings() {
// Filters
StringBuilder formatSettings = new StringBuilder();
for (JToggleButton component : filterButtons) {
formatSettings.append(component.isSelected() ? "x" : "-");
}
PreferencesDialog.saveValue(PreferencesDialog.KEY_TABLES_FILTER_SETTINGS, formatSettings.toString());
TableUtil.saveColumnWidthAndOrderToPrefs(tableTables, KEY_TABLES_COLUMNS_WIDTH, KEY_TABLES_COLUMNS_ORDER);
}
private void restoreDividerLocations() {
Rectangle rec = MageFrame.getDesktop().getBounds();
if (rec != null) {
String size = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_MAGE_PANEL_LAST_SIZE, null);
String sb = Double.toString(rec.getWidth()) + 'x' + Double.toString(rec.getHeight());
// use divider positions only if screen size is the same as it was the time the settings were saved
if (size != null && size.equals(sb)) {
String location = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_TABLES_DIVIDER_LOCATION_1, null);
if (location != null && jSplitPane1 != null) {
jSplitPane1.setDividerLocation(Integer.parseInt(location));
}
if (this.btnStateFinished.isSelected()) {
this.jSplitPaneTables.setDividerLocation(-1);
} else {
location = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_TABLES_DIVIDER_LOCATION_2, null);
if (location != null && jSplitPaneTables != null) {
jSplitPaneTables.setDividerLocation(Integer.parseInt(location));
}
}
location = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_TABLES_DIVIDER_LOCATION_3, null);
if (location != null && chatPanelMain != null) {
chatPanelMain.setSplitDividerLocation(Integer.parseInt(location));
}
}
}
}
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);
return components;
}
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 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 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();
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(() -> restoreDividerLocations(), 300, TimeUnit.MILLISECONDS);
}
protected void reloadMessages() {
// reload server messages
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);
this.jLabelFooterText.setText(serverMessages.get(0));
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();
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 void setTableFilter() {
// state
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
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
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", 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", TableTableModel.COLUMN_DECK_TYPE));
}
List<RowFilter<Object, Object>> skillFilterList = new ArrayList<>();
if (btnSkillBeginner.isSelected()) {
skillFilterList.add(RowFilter.regexFilter(SkillLevel.BEGINNER.toString(), TableTableModel.COLUMN_SKILL));
}
if (btnSkillCasual.isSelected()) {
skillFilterList.add(RowFilter.regexFilter(SkillLevel.CASUAL.toString(), TableTableModel.COLUMN_SKILL));
}
if (btnSkillSerious.isSelected()) {
skillFilterList.add(RowFilter.regexFilter(SkillLevel.SERIOUS.toString(), TableTableModel.COLUMN_SKILL));
}
List<RowFilter<Object, Object>> ratingFilterList = new ArrayList<>();
if (btnRated.isSelected()) {
ratingFilterList.add(RowFilter.regexFilter("^Rated", TableTableModel.COLUMN_RATING));
}
if (btnUnrated.isSelected()) {
ratingFilterList.add(RowFilter.regexFilter("^Unrated", TableTableModel.COLUMN_RATING));
}
// Password
List<RowFilter<Object, Object>> passwordFilterList = new ArrayList<>();
if (btnOpen.isSelected()) {
passwordFilterList.add(RowFilter.regexFilter("^$", TableTableModel.COLUMN_PASSWORD));
}
if (btnPassword.isSelected()) {
passwordFilterList.add(RowFilter.regexFilter("^\\*\\*\\*$", TableTableModel.COLUMN_PASSWORD));
}
// Hide games of ignored players
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 {
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;
}
this.jLabelFooterText.setText(messages.get(currentMessage));
}
}
}//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)
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];
private static final DateFormat timeFormatter = new SimpleDateFormat("HH:mm:ss");
public void loadData(Collection<TableView> tables) throws MageRemoteException {
this.tables = tables.toArray(new TableView[0]);
this.fireTableDataChanged();
}
@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() ? PASSWORDED : "";
case 7:
return timeFormatter.format(tables[arg0].getCreateTime());
case 8:
return tables[arg0].getSkillLevel();
case 9:
return tables[arg0].isRated() ? "Rated" : "Unrated";
case 10:
return tables[arg0].getQuitRatio();
case 11:
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 "";
}
return "Watch";
}
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 "";
}
@Override
public String getColumnName(int columnIndex) {
String colName = "";
if (columnIndex <= getColumnCount()) {
colName = columnNames[columnIndex];
}
return colName;
}
@Override
public Class getColumnClass(int columnIndex) {
switch (columnIndex) {
case COLUMN_ICON:
return Icon.class;
case COLUMN_SKILL:
return SkillLevel.class;
default:
return String.class;
}
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == ACTION_COLUMN;
}
}
class UpdateTablesTask extends SwingWorker<Void, Collection<TableView>> {
private final UUID roomId;
private final TablesPanel panel;
private static final Logger logger = Logger.getLogger(UpdateTablesTask.class);
private int count = 0;
UpdateTablesTask(UUID roomId, TablesPanel panel) {
this.roomId = roomId;
this.panel = panel;
}
@Override
protected Void doInBackground() throws Exception {
while (!isCancelled()) {
Collection<TableView> tables = SessionHandler.getTables(roomId);
if (!tables.isEmpty()) {
this.publish(tables);
}
TimeUnit.SECONDS.sleep(3);
}
return null;
}
@Override
protected void process(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) {
}
}
}
class UpdatePlayersTask extends SwingWorker<Void, Collection<RoomUsersView>> {
private final UUID roomId;
private final PlayersChatPanel chat;
private static final Logger logger = Logger.getLogger(UpdatePlayersTask.class);
UpdatePlayersTask(UUID roomId, PlayersChatPanel 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 process(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) {
}
}
}
class MatchesTableModel extends AbstractTableModel {
public static final int ACTION_COLUMN = 7; // column the action is located (starting with 0)
public static final int GAMES_LIST_COLUMN = 8;
private final String[] columnNames = new String[]{"Deck Type", "Players", "Game Type", "Rating", "Result", "Start Time", "End Time", "Action"};
private MatchView[] matches = new MatchView[0];
private static final DateFormat timeFormatter = SimpleDateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
public void loadData(Collection<MatchView> matches) throws MageRemoteException {
this.matches = matches.toArray(new MatchView[0]);
this.fireTableDataChanged();
}
@Override
public int getRowCount() {
return matches.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() ? "Rated" : "Unrated";
case 4:
return matches[arg0].getResult();
case 5:
if (matches[arg0].getStartTime() != null) {
return timeFormatter.format(matches[arg0].getStartTime());
} else {
return "";
}
case 6:
if (matches[arg0].getEndTime() != null) {
return timeFormatter.format(matches[arg0].getEndTime());
} else {
return "";
}
case 7:
if (matches[arg0].isTournament()) {
return "Show";
} else if (matches[arg0].isReplayAvailable()) {
return "Replay";
} else {
return "None";
}
case 8:
return matches[arg0].getGames();
}
return "";
}
public List<UUID> getListofGames(int row) {
return matches[row].getGames();
}
public boolean isTournament(int row) {
return matches[row].isTournament();
}
public UUID getMatchId(int row) {
return matches[row].getMatchId();
}
public UUID getTableId(int row) {
return matches[row].getTableId();
}
@Override
public String getColumnName(int columnIndex) {
String colName = "";
if (columnIndex <= getColumnCount()) {
colName = columnNames[columnIndex];
}
return colName;
}
@Override
public Class getColumnClass(int columnIndex) {
return String.class;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == ACTION_COLUMN;
}
}
class UpdateMatchesTask extends SwingWorker<Void, Collection<MatchView>> {
private final UUID roomId;
private final TablesPanel panel;
private static final Logger logger = Logger.getLogger(UpdateTablesTask.class);
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 process(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) {
}
}
}
class GameChooser extends JPopupMenu {
public void init() {
}
public void show(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 final UUID id;
public GameChooserAction(UUID id, String choice) {
this.id = id;
putValue(Action.NAME, choice);
}
@Override
public void actionPerformed(ActionEvent e) {
SessionHandler.replayGame(id);
setVisible(false);
}
}
}