forked from External/mage
2005 lines
94 KiB
Java
2005 lines
94 KiB
Java
package mage.client.table;
|
|
|
|
import mage.cards.decks.DeckCardLists;
|
|
import mage.cards.decks.importer.DeckImporter;
|
|
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.GUISizeHelper;
|
|
import mage.client.util.IgnoreList;
|
|
import mage.client.util.MageTableRowSorter;
|
|
import mage.client.util.URLHandler;
|
|
import mage.client.util.gui.GuiDisplayUtil;
|
|
import mage.client.util.gui.TableUtil;
|
|
import mage.components.table.MageTable;
|
|
import mage.components.table.TableInfo;
|
|
import mage.components.table.TimeAgoTableCellRenderer;
|
|
import mage.constants.*;
|
|
import mage.game.match.MatchOptions;
|
|
import mage.players.PlayerType;
|
|
import mage.remote.MageRemoteException;
|
|
import mage.util.DeckUtil;
|
|
import mage.util.RandomUtil;
|
|
import mage.view.MatchView;
|
|
import mage.view.RoomUsersView;
|
|
import mage.view.TableView;
|
|
import mage.view.UserRequestMessage;
|
|
import org.apache.log4j.Logger;
|
|
import org.mage.card.arcane.CardRendererUtils;
|
|
import org.ocpsoft.prettytime.Duration;
|
|
import org.ocpsoft.prettytime.PrettyTime;
|
|
|
|
import javax.swing.*;
|
|
import javax.swing.border.EmptyBorder;
|
|
import javax.swing.border.LineBorder;
|
|
import javax.swing.event.ListSelectionEvent;
|
|
import javax.swing.event.ListSelectionListener;
|
|
import javax.swing.event.TableModelEvent;
|
|
import javax.swing.event.TableModelListener;
|
|
import javax.swing.table.DefaultTableCellRenderer;
|
|
import javax.swing.table.TableCellRenderer;
|
|
import java.awt.*;
|
|
import java.awt.event.ActionEvent;
|
|
import java.awt.event.MouseAdapter;
|
|
import java.awt.event.MouseEvent;
|
|
import java.beans.PropertyVetoException;
|
|
import java.io.File;
|
|
import java.text.DateFormat;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.List;
|
|
import java.util.*;
|
|
import java.util.concurrent.CancellationException;
|
|
import java.util.concurrent.ExecutionException;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
import static mage.client.dialog.PreferencesDialog.*;
|
|
|
|
/**
|
|
* GUI: lobby's main component
|
|
*
|
|
* @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, 100, 50, 120, 180, 80, 120, 80, 60, 40, 40, 60};
|
|
|
|
// ping timeout (warning, must be less than UserManagerImpl.USER_CONNECTION_TIMEOUTS_CHECK_SECS)
|
|
public static final int PING_SERVER_SECS = 20;
|
|
|
|
// refresh timeouts for data downloads from server
|
|
public static final int REFRESH_ACTIVE_TABLES_SECS = 5;
|
|
public static final int REFRESH_FINISHED_TABLES_SECS = 30;
|
|
public static final int REFRESH_PLAYERS_SECS = 10;
|
|
public static final double REFRESH_TIMEOUTS_INCREASE_FACTOR = 0.8; // can increase timeouts by 80% (0.8)
|
|
|
|
private final TablesTableModel tableModel;
|
|
|
|
private static final TableInfo tableInfo = new TableInfo() // currently only the hint texts are used from this object
|
|
.addColumn(0, 35, Icon.class, "M/T",
|
|
"<b>Basic table type</b><br>"
|
|
+ "A symbol for match or a tournament table")
|
|
.addColumn(1, 150, String.class, "Deck Type", null)
|
|
.addColumn(2, 100, String.class, "Name",
|
|
"<b>Table name</b><br>"
|
|
+ "A name for the table the table creator has set")
|
|
.addColumn(3, 50, String.class, "Seats",
|
|
"<b>Seats of the table</b>"
|
|
+ "<br>Occupied Seats / Total number of seats ")
|
|
.addColumn(4, 120, String.class, "Owner / Players",
|
|
"<b>Joined players</b><br>"
|
|
+ "Owner = First name is the creator of the table<br>"
|
|
+ "Players = Names of the other players joint to the table")
|
|
|
|
.addColumn(5, 180, String.class, "Game Type",null)
|
|
.addColumn(6, 80, String.class, "Info",
|
|
"<b>Match / Tournament settings</b>"
|
|
+ "<br>Wins = Number of games you need to wins to win a match"
|
|
+ "<br>Time = Time limit per player"
|
|
+ "<br>Constr.: = Construction time for limited tournament formats"
|
|
+ "<br>RB = Rollbacks allowed"
|
|
+ "<br>SP = Spectators allowed"
|
|
+ "<br>Rng: Range of visibility for multiplayer matches"
|
|
+ "<br>Custom options: Nonstandard options, hover for details"
|
|
)
|
|
.addColumn(7, 120, String.class, "Status",
|
|
"<b>Table status</b><br>"
|
|
+ "Information about the progress of the match or tournament")
|
|
.addColumn(8, 80, String.class, "Password",
|
|
"<b>Password set</b><br>"
|
|
+ "Yes = You need the password of this table<br>"
|
|
+ "to join the table")
|
|
.addColumn(9, 60, Date.class, "Created / Started",
|
|
"<b>Creation and starting time</b><br>"
|
|
+ "When was the table created<br>"
|
|
+ "when started the match or tournament")
|
|
.addColumn(10, 40, SkillLevel.class, "Skill Level",
|
|
"<b>Defined skill level</b><br>"
|
|
+ "Expectations of the table creator<br>"
|
|
+ "on the level of experience of the joining players")
|
|
.addColumn(11, 40, String.class, "Rated",
|
|
"<b>Rating status</b><br>"
|
|
+ "Yes = The matches of this table are rated")
|
|
.addColumn(12, 60, String.class, "Quit %",
|
|
"<b>Needed maximal quit ratio</b><br>"
|
|
+ "Your calculated quit ratio of your past games"
|
|
+ "<br>needs to be below or equal to the given value"
|
|
+ "<br>to be able to join to the table")
|
|
.addColumn(13, 40, String.class, "Min Rating",
|
|
"<b>Rating restriction</b><br>"
|
|
+ "You need at least this rating"
|
|
+ "<br> to be able to join the table")
|
|
.addColumn(14, 80, String.class, "Action",
|
|
"<b>Actions related to this table</b><br>"
|
|
+ "Depending on the state of the table<br>"
|
|
+ "the possible actions you can take<br>"
|
|
+ "are shown here as buttons");
|
|
|
|
private final MatchesTableModel matchesModel;
|
|
private UUID roomId;
|
|
private UpdateTablesTask updateTablesTask;
|
|
private UpdatePlayersTask updatePlayersTask;
|
|
private UpdateMatchesTask updateMatchesTask;
|
|
|
|
// no needs in multiple create/join tables dialogs, it's a client side action
|
|
private JoinTableDialog joinTableDialog;
|
|
private NewTableDialog newTableDialog;
|
|
private NewTournamentDialog newTournamentDialog;
|
|
|
|
private final GameChooser gameChooser;
|
|
private java.util.List<String> messages;
|
|
private int currentMessage;
|
|
private final MageTableRowSorter activeTablesSorter;
|
|
private final MageTableRowSorter completedTablesSorter;
|
|
|
|
private final TablesButtonColumn actionButton1;
|
|
private final TablesButtonColumn actionButton2;
|
|
private final Map<JTable, String> tablesLastSelection = new HashMap<>();
|
|
|
|
final JToggleButton[] filterButtons;
|
|
|
|
// time formatter
|
|
private final PrettyTime timeFormatter = new PrettyTime(Locale.ENGLISH);
|
|
|
|
// duration renderer
|
|
TableCellRenderer durationCellRenderer = new DefaultTableCellRenderer() {
|
|
@Override
|
|
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
|
|
JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
|
|
Long ms = (Long) value;
|
|
|
|
if (ms != 0) {
|
|
Duration dur = timeFormatter.approximateDuration(new Date(ms));
|
|
label.setText((timeFormatter.formatDuration(dur)));
|
|
} else {
|
|
label.setText("");
|
|
}
|
|
return label;
|
|
}
|
|
};
|
|
|
|
// datetime render
|
|
TableCellRenderer datetimeCellRenderer = new DefaultTableCellRenderer() {
|
|
final DateFormat datetimeFormater = new SimpleDateFormat("HH:mm:ss");
|
|
|
|
@Override
|
|
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
|
|
JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
|
|
Date d = (Date) value;
|
|
if (d != null) {
|
|
label.setText(datetimeFormater.format(d));
|
|
} else {
|
|
label.setText("");
|
|
}
|
|
|
|
return label;
|
|
}
|
|
};
|
|
|
|
// skill renderer
|
|
TableCellRenderer skillCellRenderer = new DefaultTableCellRenderer() {
|
|
|
|
// base panel to render
|
|
private final JPanel renderPanel = new JPanel();
|
|
private final ImageIcon skillIcon = new ImageIcon(this.getClass().getResource("/info/yellow_star_16.png"));
|
|
|
|
@Override
|
|
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
|
|
|
|
// get table text cell settings
|
|
DefaultTableCellRenderer baseRenderer = (DefaultTableCellRenderer) table.getDefaultRenderer(String.class);
|
|
JLabel baseComp = (JLabel) baseRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
|
|
String skillCode = baseComp.getText();
|
|
|
|
// apply settings to render panel from parent
|
|
renderPanel.setOpaque(baseComp.isOpaque());
|
|
renderPanel.setForeground(CardRendererUtils.copyColor(baseComp.getForeground()));
|
|
renderPanel.setBackground(CardRendererUtils.copyColor(baseComp.getBackground()));
|
|
renderPanel.setBorder(baseComp.getBorder());
|
|
|
|
// create each skill symbol as child label
|
|
renderPanel.removeAll();
|
|
renderPanel.setLayout(new BoxLayout(renderPanel, BoxLayout.X_AXIS));
|
|
for (char skillSymbol : skillCode.toCharArray()) {
|
|
JLabel symbolLabel = new JLabel();
|
|
symbolLabel.setBorder(new EmptyBorder(0, 3, 0, 0));
|
|
symbolLabel.setIcon(skillIcon);
|
|
renderPanel.add(symbolLabel);
|
|
}
|
|
|
|
return renderPanel;
|
|
}
|
|
};
|
|
|
|
// seats render
|
|
TableCellRenderer seatsCellRenderer = new DefaultTableCellRenderer() {
|
|
|
|
final JLabel greenLabel = new JLabel();
|
|
|
|
@Override
|
|
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
|
|
JLabel defaultLabel = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
|
|
defaultLabel.setHorizontalAlignment(JLabel.CENTER);
|
|
// colors
|
|
String val = (String) value;
|
|
int[] seats = parseSeatsInfo(val);
|
|
if (seats[0] != seats[1]) {
|
|
// green draw
|
|
Color defaultBack = defaultLabel.getBackground();
|
|
greenLabel.setText(val);
|
|
greenLabel.setHorizontalAlignment(JLabel.CENTER);
|
|
greenLabel.setFont(defaultLabel.getFont());
|
|
greenLabel.setForeground(Color.black);
|
|
greenLabel.setOpaque(true);
|
|
greenLabel.setBackground(new Color(156, 240, 146));
|
|
greenLabel.setBorder(new LineBorder(defaultBack, 1));
|
|
return greenLabel;
|
|
} else {
|
|
// default draw
|
|
return defaultLabel;
|
|
}
|
|
}
|
|
};
|
|
|
|
private int[] parseSeatsInfo(String info) {
|
|
String[] valsList = info.split("/");
|
|
int[] res = {0, 0};
|
|
if (valsList.length == 2) {
|
|
res[0] = Integer.parseInt(valsList[0]);
|
|
res[1] = Integer.parseInt(valsList[1]);
|
|
}
|
|
return res;
|
|
}
|
|
|
|
public static int randomizeTimout(int minTimout) {
|
|
// randomize timeouts to fix calls waves -- slow server can creates queue and moves all clients to same call window
|
|
int increase = (int) (minTimout * REFRESH_TIMEOUTS_INCREASE_FACTOR);
|
|
return minTimout + RandomUtil.nextInt(increase);
|
|
}
|
|
|
|
|
|
/**
|
|
* Creates new form TablesPanel
|
|
*/
|
|
public TablesPanel() {
|
|
|
|
tableModel = new TablesTableModel();
|
|
matchesModel = new MatchesTableModel();
|
|
gameChooser = new GameChooser();
|
|
|
|
initComponents();
|
|
// tableModel.setSession(session);
|
|
|
|
// formatter
|
|
MageTable.fixTimeFormatter(this.timeFormatter);
|
|
|
|
// 1. TABLE CURRENT
|
|
tableTables.createDefaultColumnsFromModel();
|
|
((MageTable)tableTables).setTableInfo(tableInfo);
|
|
|
|
activeTablesSorter = new MageTableRowSorter(tableModel) {
|
|
@Override
|
|
public void toggleSortOrder(int column) {
|
|
// special sort for created and seat column
|
|
if (column == TablesTableModel.COLUMN_CREATED || column == TablesTableModel.COLUMN_SEATS) {
|
|
List<? extends SortKey> sortKeys = getSortKeys();
|
|
if (sortKeys.size() == 2) {
|
|
// clear sort on second click
|
|
setSortKeys(null);
|
|
} else {
|
|
// setup sort on first click
|
|
List<SortKey> list = new ArrayList<>();
|
|
list.add(new RowSorter.SortKey(TablesTableModel.COLUMN_SEATS, SortOrder.ASCENDING));
|
|
list.add(new RowSorter.SortKey(TablesTableModel.COLUMN_CREATED, SortOrder.DESCENDING));
|
|
setSortKeys(list);
|
|
}
|
|
} else {
|
|
super.toggleSortOrder(column);
|
|
}
|
|
}
|
|
};
|
|
tableTables.setRowSorter(activeTablesSorter);
|
|
|
|
// time ago
|
|
tableTables.getColumnModel().getColumn(TablesTableModel.COLUMN_CREATED).setCellRenderer(TimeAgoTableCellRenderer.getInstance());
|
|
// skill level
|
|
tableTables.getColumnModel().getColumn(TablesTableModel.COLUMN_SKILL).setCellRenderer(skillCellRenderer);
|
|
// seats
|
|
tableTables.getColumnModel().getColumn(TablesTableModel.COLUMN_SEATS).setCellRenderer(seatsCellRenderer);
|
|
|
|
/* date sorter (not need, default is good - see getColumnClass)
|
|
activeTablesSorter.setComparator(TablesTableModel.COLUMN_CREATED, new Comparator<Date>() {
|
|
@Override
|
|
public int compare(Date v1, Date v2) {
|
|
return v1.compareTo(v2);
|
|
}
|
|
|
|
});*/
|
|
|
|
// seats sorter (free tables must be first)
|
|
activeTablesSorter.setComparator(TablesTableModel.COLUMN_SEATS, new Comparator<String>() {
|
|
@Override
|
|
public int compare(String v1, String v2) {
|
|
int[] seats1 = parseSeatsInfo(v1);
|
|
int[] seats2 = parseSeatsInfo(v2);
|
|
boolean free1 = seats1[0] != seats1[1];
|
|
boolean free2 = seats2[0] != seats2[1];
|
|
|
|
// free seats go first
|
|
if (free1 || free2) {
|
|
return Boolean.compare(free2, free1);
|
|
}
|
|
|
|
// all other seats go without sorts
|
|
return 0;
|
|
}
|
|
});
|
|
|
|
// default sort by created date (last games from above)
|
|
ArrayList list = new ArrayList<>();
|
|
list.add(new RowSorter.SortKey(TablesTableModel.COLUMN_SEATS, SortOrder.ASCENDING));
|
|
list.add(new RowSorter.SortKey(TablesTableModel.COLUMN_CREATED, SortOrder.DESCENDING));
|
|
activeTablesSorter.setSortKeys(list);
|
|
|
|
TableUtil.setColumnWidthAndOrder(tableTables, DEFAULT_COLUMNS_WIDTH, KEY_TABLES_COLUMNS_WIDTH, KEY_TABLES_COLUMNS_ORDER);
|
|
|
|
// 2. TABLE COMPLETED
|
|
completedTablesSorter = new MageTableRowSorter(matchesModel);
|
|
tableCompleted.setRowSorter(completedTablesSorter);
|
|
|
|
// 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);
|
|
|
|
// 3. CHAT
|
|
chatPanelMain.getUserChatPanel().useExtendedView(ChatPanelBasic.VIEW_MODE.NONE);
|
|
chatPanelMain.getUserChatPanel().setBorder(null);
|
|
chatPanelMain.getUserChatPanel().setChatType(ChatPanelBasic.ChatType.TABLES);
|
|
|
|
// 4. BUTTONS (add new buttons to the end of the list -- if not then users lost their filter settings)
|
|
filterButtons = new JToggleButton[]{btnStateWaiting, btnStateActive, btnStateFinished,
|
|
btnTypeMatch, btnTypeTourneyConstructed, btnTypeTourneyLimited,
|
|
btnFormatBlock, btnFormatStandard, btnFormatModern, btnFormatLegacy, btnFormatVintage, btnFormatPremodern, btnFormatCommander, btnFormatTinyLeader, btnFormatLimited, btnFormatOther,
|
|
btnSkillBeginner, btnSkillCasual, btnSkillSerious, btnRated, btnUnrated, btnOpen, btnPassword, btnFormatOathbreaker, btnFormatPioneer};
|
|
|
|
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));
|
|
|
|
restoreFilters();
|
|
setGUISize();
|
|
|
|
Action openTableAction;
|
|
openTableAction = new AbstractAction() {
|
|
@Override
|
|
public void actionPerformed(ActionEvent e) {
|
|
String searchID = e.getActionCommand();
|
|
int modelRow = TablesUtil.findTableRowFromSearchId(tableModel, searchID);
|
|
if (modelRow == -1) {
|
|
return;
|
|
}
|
|
UUID tableId = (UUID) tableModel.getValueAt(modelRow, TablesTableModel.ACTION_COLUMN + 3);
|
|
UUID gameId = (UUID) tableModel.getValueAt(modelRow, TablesTableModel.ACTION_COLUMN + 2);
|
|
String action = (String) tableModel.getValueAt(modelRow, TablesTableModel.ACTION_COLUMN);
|
|
String gameType = (String) tableModel.getValueAt(modelRow, TablesTableModel.COLUMN_GAME_TYPE);
|
|
boolean isTournament = (Boolean) tableModel.getValueAt(modelRow, TablesTableModel.ACTION_COLUMN + 1);
|
|
String owner = (String) tableModel.getValueAt(modelRow, TablesTableModel.COLUMN_OWNER);
|
|
String pwdColumn = (String) tableModel.getValueAt(modelRow, TablesTableModel.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 (!gameType.startsWith("Constructed")) {
|
|
if (TablesTableModel.PASSWORD_VALUE_YES.equals(pwdColumn)) {
|
|
// need enter password
|
|
joinTableDialog.showDialog(roomId, tableId, true, !gameType.startsWith("Constructed"));
|
|
} else {
|
|
// direct join (no pass, no deck)
|
|
SessionHandler.joinTournamentTable(roomId, tableId, SessionHandler.getUserName(), PlayerType.HUMAN, 1, null, "");
|
|
}
|
|
} else {
|
|
// need choose deck
|
|
joinTableDialog.showDialog(roomId, tableId, true, !gameType.startsWith("Constructed"));
|
|
}
|
|
} else {
|
|
// need choose deck
|
|
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) {
|
|
String searchID = e.getActionCommand();
|
|
int modelRow = TablesUtil.findTableRowFromSearchId(matchesModel, searchID);
|
|
if (modelRow == -1) {
|
|
return;
|
|
}
|
|
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 TablesButtonColumn(tableTables, openTableAction, tableTables.convertColumnIndexToView(TablesTableModel.ACTION_COLUMN));
|
|
actionButton2 = new TablesButtonColumn(tableCompleted, closedTableAction, tableCompleted.convertColumnIndexToView(MatchesTableModel.COLUMN_ACTION));
|
|
// selection
|
|
tablesLastSelection.put(tableTables, "");
|
|
tablesLastSelection.put(tableCompleted, "");
|
|
addTableSelectListener(tableTables);
|
|
addTableSelectListener(tableCompleted);
|
|
// double click
|
|
addTableDoubleClickListener(tableTables, openTableAction);
|
|
addTableDoubleClickListener(tableCompleted, closedTableAction);
|
|
}
|
|
|
|
private void addTableSelectListener(JTable table) {
|
|
// https://stackoverflow.com/a/26142800/1276632
|
|
|
|
// save last selection
|
|
table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
|
|
@Override
|
|
public void valueChanged(ListSelectionEvent e) {
|
|
int modelRow = MageTable.getSelectedModelRow(table);
|
|
if (modelRow != -1) {
|
|
// needs only selected
|
|
String rowId = TablesUtil.getSearchIdFromTable(table, modelRow);
|
|
tablesLastSelection.put(table, rowId);
|
|
}
|
|
}
|
|
});
|
|
|
|
// restore selection
|
|
table.getModel().addTableModelListener(new TableModelListener() {
|
|
@Override
|
|
public void tableChanged(TableModelEvent e) {
|
|
SwingUtilities.invokeLater(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
String lastRowID = tablesLastSelection.get(table);
|
|
int needModelRow = TablesUtil.findTableRowFromSearchId(table.getModel(), lastRowID);
|
|
int needViewRow = MageTable.getViewRowFromModel(table, needModelRow);
|
|
if (needViewRow != -1) {
|
|
table.clearSelection();
|
|
table.addRowSelectionInterval(needViewRow, needViewRow);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
private void addTableDoubleClickListener(JTable table, Action action) {
|
|
table.addMouseListener(new MouseAdapter() {
|
|
@Override
|
|
public void mouseClicked(MouseEvent e) {
|
|
if (!SwingUtilities.isLeftMouseButton(e)) {
|
|
return;
|
|
}
|
|
int modelRow = MageTable.getSelectedModelRow(table);
|
|
if (e.getClickCount() == 2 && modelRow != -1) {
|
|
action.actionPerformed(new ActionEvent(table, ActionEvent.ACTION_PERFORMED, TablesUtil.getSearchIdFromTable(table, modelRow)));
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
public void cleanUp() {
|
|
saveGuiSettings();
|
|
chatPanelMain.cleanUp();
|
|
stopTasks();
|
|
}
|
|
|
|
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.tableRowHeight);
|
|
|
|
tableCompleted.getTableHeader().setFont(GUISizeHelper.tableFont);
|
|
tableCompleted.setFont(GUISizeHelper.tableFont);
|
|
tableCompleted.setRowHeight(GUISizeHelper.tableRowHeight);
|
|
|
|
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.dialogFont.getSize(), GUISizeHelper.dialogFont.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.dialogFont.getSize(), GUISizeHelper.dialogFont.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.dialogFont.getSize(), GUISizeHelper.dialogFont.getSize(), java.awt.Image.SCALE_SMOOTH);
|
|
btnStateFinished.setIcon(new ImageIcon(newimg));
|
|
|
|
int iconSize = 48 + GUISizeHelper.dialogFont.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.dialogFont);
|
|
}
|
|
Dimension newDimension = new Dimension((int) jPanelBottom.getPreferredSize().getWidth(), GUISizeHelper.dialogFont.getSize() + 28);
|
|
jPanelBottom.setMinimumSize(newDimension);
|
|
jPanelBottom.setPreferredSize(newDimension);
|
|
buttonWhatsNew.setFont(GUISizeHelper.dialogFont);
|
|
buttonNextMessage.setFont(GUISizeHelper.dialogFont);
|
|
labelMessageHeader.setFont(new Font(GUISizeHelper.dialogFont.getName(), Font.BOLD, GUISizeHelper.dialogFont.getSize()));
|
|
labelMessageText.setFont(GUISizeHelper.dialogFont);
|
|
|
|
btnQuickStart2Player.setFont(GUISizeHelper.dialogFont);
|
|
btnQuickStart4Player.setFont(GUISizeHelper.dialogFont);
|
|
btnQuickStartMCTS.setFont(GUISizeHelper.dialogFont);
|
|
}
|
|
|
|
private void restoreDividerLocations() {
|
|
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 saveDividerLocations() {
|
|
// save divider locations
|
|
if (this.jSplitPane1.getDividerLocation() == -1) {
|
|
// server lobby hidden by default, so ignore that settings
|
|
return;
|
|
}
|
|
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 saveGuiSettings() {
|
|
TableUtil.saveActiveFiltersToPrefs(KEY_TABLES_FILTER_SETTINGS, filterButtons);
|
|
TableUtil.saveColumnWidthAndOrderToPrefs(tableTables, KEY_TABLES_COLUMNS_WIDTH, KEY_TABLES_COLUMNS_ORDER);
|
|
}
|
|
|
|
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 startUpdateTasks(boolean refreshImmediately) {
|
|
if (SessionHandler.getSession() != null) {
|
|
// active tables and server messages
|
|
if (updateTablesTask == null || updateTablesTask.isDone() || refreshImmediately) {
|
|
if (updateTablesTask != null) updateTablesTask.cancel(true);
|
|
updateTablesTask = new UpdateTablesTask(roomId, this);
|
|
updateTablesTask.execute();
|
|
}
|
|
|
|
// finished tables
|
|
if (this.btnStateFinished.isSelected()) {
|
|
if (updateMatchesTask == null || updateMatchesTask.isDone() || refreshImmediately) {
|
|
if (updateMatchesTask != null) updateMatchesTask.cancel(true);
|
|
updateMatchesTask = new UpdateMatchesTask(roomId, this);
|
|
updateMatchesTask.execute();
|
|
}
|
|
} else {
|
|
if (updateMatchesTask != null) updateMatchesTask.cancel(true);
|
|
}
|
|
|
|
// players list
|
|
if (updatePlayersTask == null || updatePlayersTask.isDone() || refreshImmediately) {
|
|
if (updatePlayersTask != null) updatePlayersTask.cancel(true);
|
|
updatePlayersTask = new UpdatePlayersTask(roomId, this.chatPanelMain);
|
|
updatePlayersTask.execute();
|
|
}
|
|
}
|
|
}
|
|
|
|
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) {
|
|
btnQuickStart2Player.setVisible(SessionHandler.isTestMode());
|
|
btnQuickStart4Player.setVisible(SessionHandler.isTestMode());
|
|
btnQuickStartMCTS.setVisible(SessionHandler.isTestMode());
|
|
gameChooser.init();
|
|
chatRoomId = SessionHandler.getRoomChatId(roomId).orElse(null);
|
|
}
|
|
if (newTableDialog == null) {
|
|
newTableDialog = new NewTableDialog();
|
|
MageFrame.getDesktop().add(newTableDialog, newTableDialog.isModal() ? JLayeredPane.MODAL_LAYER : JLayeredPane.PALETTE_LAYER);
|
|
}
|
|
if (newTournamentDialog == null) {
|
|
newTournamentDialog = new NewTournamentDialog();
|
|
MageFrame.getDesktop().add(newTournamentDialog, newTournamentDialog.isModal() ? JLayeredPane.MODAL_LAYER : JLayeredPane.PALETTE_LAYER);
|
|
}
|
|
if (joinTableDialog == null) {
|
|
joinTableDialog = new JoinTableDialog();
|
|
MageFrame.getDesktop().add(joinTableDialog, joinTableDialog.isModal() ? JLayeredPane.MODAL_LAYER : JLayeredPane.PALETTE_LAYER);
|
|
}
|
|
if (chatRoomId != null) {
|
|
this.chatPanelMain.getUserChatPanel().connect(chatRoomId);
|
|
startUpdateTasks(true);
|
|
this.setVisible(true);
|
|
this.repaint();
|
|
} else {
|
|
hideTables();
|
|
}
|
|
//tableModel.setSession(session);
|
|
|
|
reloadServerMessages();
|
|
MageFrame.getUI().addButton(MageComponents.NEW_GAME_BUTTON, btnNewTable);
|
|
|
|
restoreDividerLocations();
|
|
}
|
|
|
|
protected void reloadServerMessages() {
|
|
// reload server messages
|
|
java.util.List<String> serverMessages = SessionHandler.getServerMessages();
|
|
synchronized (this) {
|
|
if (serverMessages != null) {
|
|
this.messages = serverMessages;
|
|
} else {
|
|
this.messages = new ArrayList<>();
|
|
}
|
|
|
|
this.currentMessage = 0;
|
|
}
|
|
if (this.messages.isEmpty()) {
|
|
this.jPanelBottom.setVisible(false);
|
|
} else {
|
|
this.jPanelBottom.setVisible(true);
|
|
URLHandler.RemoveMouseAdapter(labelMessageText);
|
|
URLHandler.handleMessage(this.messages.get(0), this.labelMessageText);
|
|
this.buttonNextMessage.setVisible(this.messages.size() > 1);
|
|
}
|
|
}
|
|
|
|
public void hideTables() {
|
|
this.saveDividerLocations();
|
|
for (Component component : MageFrame.getDesktop().getComponents()) {
|
|
if (component instanceof TableWaitingDialog) {
|
|
((TableWaitingDialog) component).doClose();
|
|
}
|
|
}
|
|
stopTasks();
|
|
this.chatPanelMain.cleanUp();;
|
|
|
|
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
|
|
java.util.List<RowFilter<Object, Object>> stateFilterList = new ArrayList<>();
|
|
if (btnStateWaiting.isSelected()) {
|
|
stateFilterList.add(RowFilter.regexFilter("Waiting", TablesTableModel.COLUMN_STATUS));
|
|
}
|
|
if (btnStateActive.isSelected()) {
|
|
stateFilterList.add(RowFilter.regexFilter("Dueling|Constructing|Drafting|Sideboard", TablesTableModel.COLUMN_STATUS));
|
|
}
|
|
|
|
// type
|
|
java.util.List<RowFilter<Object, Object>> typeFilterList = new ArrayList<>();
|
|
if (btnTypeMatch.isSelected()) {
|
|
typeFilterList.add(RowFilter.regexFilter("Two|Commander|Free|Tiny|Momir", TablesTableModel.COLUMN_GAME_TYPE));
|
|
}
|
|
if (btnTypeTourneyConstructed.isSelected()) {
|
|
typeFilterList.add(RowFilter.regexFilter("Constructed", TablesTableModel.COLUMN_GAME_TYPE));
|
|
}
|
|
if (btnTypeTourneyLimited.isSelected()) {
|
|
typeFilterList.add(RowFilter.regexFilter("Booster|Sealed|Jumpstart", TablesTableModel.COLUMN_GAME_TYPE));
|
|
}
|
|
|
|
// format
|
|
java.util.List<RowFilter<Object, Object>> formatFilterList = new ArrayList<>();
|
|
if (btnFormatBlock.isSelected()) {
|
|
formatFilterList.add(RowFilter.regexFilter("^Constructed.*Block", TablesTableModel.COLUMN_DECK_TYPE));
|
|
}
|
|
if (btnFormatStandard.isSelected()) {
|
|
formatFilterList.add(RowFilter.regexFilter("^Constructed - Standard", TablesTableModel.COLUMN_DECK_TYPE));
|
|
}
|
|
if (btnFormatModern.isSelected()) {
|
|
formatFilterList.add(RowFilter.regexFilter("^Constructed - Modern", TablesTableModel.COLUMN_DECK_TYPE));
|
|
}
|
|
if (btnFormatPioneer.isSelected()) {
|
|
formatFilterList.add(RowFilter.regexFilter("^Constructed - Pioneer", TablesTableModel.COLUMN_DECK_TYPE));
|
|
}
|
|
if (btnFormatLegacy.isSelected()) {
|
|
formatFilterList.add(RowFilter.regexFilter("^Constructed - Legacy", TablesTableModel.COLUMN_DECK_TYPE));
|
|
}
|
|
if (btnFormatVintage.isSelected()) {
|
|
formatFilterList.add(RowFilter.regexFilter("^Constructed - Vintage", TablesTableModel.COLUMN_DECK_TYPE));
|
|
}
|
|
if (btnFormatPremodern.isSelected()) {
|
|
formatFilterList.add(RowFilter.regexFilter("^Constructed - Premodern", TablesTableModel.COLUMN_DECK_TYPE));
|
|
}
|
|
if (btnFormatCommander.isSelected()) {
|
|
formatFilterList.add(RowFilter.regexFilter("^Commander|^Duel Commander|^Centurion Commander|^Penny Dreadful Commander|^Freeform Commander|^Freeform Unlimited Commander|^MTGO 1v1 Commander|^Duel Brawl|^Brawl", TablesTableModel.COLUMN_DECK_TYPE));
|
|
}
|
|
if (btnFormatTinyLeader.isSelected()) {
|
|
formatFilterList.add(RowFilter.regexFilter("^Tiny", TablesTableModel.COLUMN_DECK_TYPE));
|
|
}
|
|
if (btnFormatOathbreaker.isSelected()) {
|
|
formatFilterList.add(RowFilter.regexFilter("^Oathbreaker", TablesTableModel.COLUMN_DECK_TYPE));
|
|
}
|
|
if (btnFormatLimited.isSelected()) {
|
|
formatFilterList.add(RowFilter.regexFilter("^Limited", TablesTableModel.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|^Constructed - Freeform Unlimited|^Australian Highlander|^European Highlander|^Canadian Highlander|^Constructed - Old|^Constructed - Historic", TablesTableModel.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), TablesTableModel.COLUMN_SKILL));
|
|
}
|
|
if (btnSkillCasual.isSelected()) {
|
|
skillFilterList.add(RowFilter.regexFilter(this.tableModel.getSkillLevelAsCode(SkillLevel.CASUAL, true), TablesTableModel.COLUMN_SKILL));
|
|
}
|
|
if (btnSkillSerious.isSelected()) {
|
|
skillFilterList.add(RowFilter.regexFilter(this.tableModel.getSkillLevelAsCode(SkillLevel.SERIOUS, true), TablesTableModel.COLUMN_SKILL));
|
|
}
|
|
|
|
String ratedMark = TablesTableModel.RATED_VALUE_YES;
|
|
java.util.List<RowFilter<Object, Object>> ratingFilterList = new ArrayList<>();
|
|
if (btnRated.isSelected()) {
|
|
// yes word
|
|
ratingFilterList.add(RowFilter.regexFilter("^" + ratedMark, TablesTableModel.COLUMN_RATING));
|
|
}
|
|
if (btnUnrated.isSelected()) {
|
|
// not yes word, see https://stackoverflow.com/a/406408/1276632
|
|
ratingFilterList.add(RowFilter.regexFilter("^((?!" + ratedMark + ").)*$", TablesTableModel.COLUMN_RATING));
|
|
}
|
|
|
|
// Password
|
|
String passwordMark = TablesTableModel.PASSWORD_VALUE_YES;
|
|
java.util.List<RowFilter<Object, Object>> passwordFilterList = new ArrayList<>();
|
|
if (btnPassword.isSelected()) {
|
|
// yes
|
|
passwordFilterList.add(RowFilter.regexFilter("^" + passwordMark, TablesTableModel.COLUMN_PASSWORD));
|
|
}
|
|
if (btnOpen.isSelected()) {
|
|
// no
|
|
passwordFilterList.add(RowFilter.regexFilter("^((?!" + passwordMark + ").)*$", TablesTableModel.COLUMN_PASSWORD));
|
|
}
|
|
|
|
// Hide games of ignored players
|
|
java.util.List<RowFilter<Object, Object>> ignoreListFilterList = new ArrayList<>();
|
|
String serverAddress = SessionHandler.getSession().getServerHost();
|
|
final Set<String> ignoreListCopy = IgnoreList.getIgnoredUsers(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(TablesTableModel.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", TablesTableModel.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();
|
|
jSeparator6 = 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();
|
|
btnFormatPioneer = new javax.swing.JToggleButton();
|
|
btnFormatLegacy = new javax.swing.JToggleButton();
|
|
btnFormatVintage = new javax.swing.JToggleButton();
|
|
btnFormatPremodern = new javax.swing.JToggleButton();
|
|
jSeparator3 = new javax.swing.JToolBar.Separator();
|
|
btnFormatCommander = new javax.swing.JToggleButton();
|
|
btnFormatOathbreaker = 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();
|
|
btnQuickStart2Player = new javax.swing.JButton();
|
|
btnQuickStart4Player = new javax.swing.JButton();
|
|
btnQuickStartMCTS = 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 MageTable();
|
|
jScrollPaneTablesFinished = new javax.swing.JScrollPane();
|
|
tableCompleted = new javax.swing.JTable();
|
|
chatPanelMain = new mage.client.table.PlayersChatPanel();
|
|
jPanelBottom = new javax.swing.JPanel();
|
|
buttonWhatsNew = new javax.swing.JButton();
|
|
buttonNextMessage = new javax.swing.JButton();
|
|
labelMessageHeader = new javax.swing.JLabel();
|
|
labelMessageText = 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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent 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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent 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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent 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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent 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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent 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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
btnFilterActionPerformed(evt);
|
|
}
|
|
});
|
|
filterBar1.add(btnTypeMatch);
|
|
|
|
btnTypeTourneyConstructed.setSelected(true);
|
|
btnTypeTourneyConstructed.setText("Constructed tourney");
|
|
btnTypeTourneyConstructed.setToolTipText("Shows all constructed tournament tables.");
|
|
btnTypeTourneyConstructed.setActionCommand("typeTourneyConstructed");
|
|
btnTypeTourneyConstructed.setFocusPainted(false);
|
|
btnTypeTourneyConstructed.setFocusable(false);
|
|
btnTypeTourneyConstructed.setRequestFocusEnabled(false);
|
|
btnTypeTourneyConstructed.setVerifyInputWhenFocusTarget(false);
|
|
btnTypeTourneyConstructed.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
btnFilterActionPerformed(evt);
|
|
}
|
|
});
|
|
filterBar1.add(btnTypeTourneyConstructed);
|
|
|
|
btnTypeTourneyLimited.setSelected(true);
|
|
btnTypeTourneyLimited.setText("Limited tourney");
|
|
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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent 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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent 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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent 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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
btnFilterActionPerformed(evt);
|
|
}
|
|
});
|
|
filterBar1.add(btnSkillSerious);
|
|
filterBar1.add(jSeparator6);
|
|
|
|
btnRated.setSelected(true);
|
|
btnRated.setText("Rated");
|
|
btnRated.setToolTipText("Shows all rated tables.");
|
|
btnRated.setActionCommand("typeMatch");
|
|
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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
btnFilterActionPerformed(evt);
|
|
}
|
|
});
|
|
filterBar1.add(btnRated);
|
|
|
|
btnUnrated.setSelected(true);
|
|
btnUnrated.setText("Unrated");
|
|
btnUnrated.setToolTipText("Shows all unrated tables.");
|
|
btnUnrated.setActionCommand("typeMatch");
|
|
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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
btnFilterActionPerformed(evt);
|
|
}
|
|
});
|
|
filterBar1.add(btnUnrated);
|
|
|
|
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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent 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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent 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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
btnFilterActionPerformed(evt);
|
|
}
|
|
});
|
|
filterBar2.add(btnFormatModern);
|
|
|
|
btnFormatPioneer.setSelected(true);
|
|
btnFormatPioneer.setText("Pioneer");
|
|
btnFormatPioneer.setToolTipText("Pioneer format.");
|
|
btnFormatPioneer.setFocusPainted(false);
|
|
btnFormatPioneer.setFocusable(false);
|
|
btnFormatPioneer.setRequestFocusEnabled(false);
|
|
btnFormatPioneer.setVerifyInputWhenFocusTarget(false);
|
|
btnFormatPioneer.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
btnFilterActionPerformed(evt);
|
|
}
|
|
});
|
|
filterBar2.add(btnFormatPioneer);
|
|
|
|
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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent 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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
btnFilterActionPerformed(evt);
|
|
}
|
|
});
|
|
filterBar2.add(btnFormatVintage);
|
|
|
|
btnFormatPremodern.setSelected(true);
|
|
btnFormatPremodern.setText("Premodern");
|
|
btnFormatPremodern.setToolTipText("Premodern format.");
|
|
btnFormatPremodern.setFocusPainted(false);
|
|
btnFormatPremodern.setFocusable(false);
|
|
btnFormatPremodern.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
|
|
btnFormatPremodern.setRequestFocusEnabled(false);
|
|
btnFormatPremodern.setVerifyInputWhenFocusTarget(false);
|
|
btnFormatPremodern.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
|
|
btnFormatPremodern.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
btnFilterActionPerformed(evt);
|
|
}
|
|
});
|
|
filterBar2.add(btnFormatPremodern);
|
|
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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
btnFilterActionPerformed(evt);
|
|
}
|
|
});
|
|
filterBar2.add(btnFormatCommander);
|
|
|
|
btnFormatOathbreaker.setSelected(true);
|
|
btnFormatOathbreaker.setText("Oathbreaker");
|
|
btnFormatOathbreaker.setToolTipText("Oathbreaker format.");
|
|
btnFormatOathbreaker.setFocusPainted(false);
|
|
btnFormatOathbreaker.setFocusable(false);
|
|
btnFormatOathbreaker.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
|
|
btnFormatOathbreaker.setRequestFocusEnabled(false);
|
|
btnFormatOathbreaker.setVerifyInputWhenFocusTarget(false);
|
|
btnFormatOathbreaker.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
|
|
btnFormatOathbreaker.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
btnFilterActionPerformed(evt);
|
|
}
|
|
});
|
|
filterBar2.add(btnFormatOathbreaker);
|
|
|
|
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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent 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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
btnFilterActionPerformed(evt);
|
|
}
|
|
});
|
|
filterBar2.add(btnFormatLimited);
|
|
|
|
btnFormatOther.setSelected(true);
|
|
btnFormatOther.setText("Other");
|
|
btnFormatOther.setToolTipText("Other formats (Freeform, Pauper, Historic, Extended, etc.)");
|
|
btnFormatOther.setFocusPainted(false);
|
|
btnFormatOther.setFocusable(false);
|
|
btnFormatOther.setRequestFocusEnabled(false);
|
|
btnFormatOther.setVerifyInputWhenFocusTarget(false);
|
|
btnFormatOther.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent 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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent 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(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
btnFilterActionPerformed(evt);
|
|
}
|
|
});
|
|
filterBar2.add(btnPassword);
|
|
|
|
btnQuickStart2Player.setText("Quick 2 player");
|
|
btnQuickStart2Player.setFocusable(false);
|
|
btnQuickStart2Player.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
|
|
btnQuickStart2Player.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
|
|
btnQuickStart2Player.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
btnQuickStart2PlayerActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
btnQuickStart4Player.setText("Quick 4 player");
|
|
btnQuickStart4Player.setFocusable(false);
|
|
btnQuickStart4Player.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
|
|
btnQuickStart4Player.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
|
|
btnQuickStart4Player.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
btnQuickStart4PlayerActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
btnQuickStartMCTS.setText("Quick start MCTS");
|
|
btnQuickStartMCTS.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
btnQuickStartMCTSActionPerformed(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, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
.addComponent(filterBar2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addGroup(jPanelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(jPanelTopLayout.createSequentialGroup()
|
|
.addComponent(btnQuickStart2Player)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(btnQuickStartMCTS))
|
|
.addComponent(btnQuickStart4Player))
|
|
.addContainerGap(540, 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)
|
|
.addGroup(jPanelTopLayout.createSequentialGroup()
|
|
.addGroup(jPanelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addComponent(btnQuickStart2Player)
|
|
.addComponent(btnQuickStartMCTS))
|
|
.addGap(0, 0, Short.MAX_VALUE)))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addGroup(jPanelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addComponent(filterBar2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
.addGroup(jPanelTopLayout.createSequentialGroup()
|
|
.addComponent(btnQuickStart4Player)
|
|
.addGap(0, 0, 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.DEFAULT_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));
|
|
|
|
buttonWhatsNew.setText("Show what's new");
|
|
buttonWhatsNew.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
|
|
buttonWhatsNew.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
|
|
buttonWhatsNew.setOpaque(false);
|
|
buttonWhatsNew.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
buttonWhatsNewActionPerformed(evt);
|
|
}
|
|
});
|
|
jPanelBottom.add(buttonWhatsNew);
|
|
|
|
buttonNextMessage.setText("Next message");
|
|
buttonNextMessage.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
|
|
buttonNextMessage.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
|
|
buttonNextMessage.setOpaque(false);
|
|
buttonNextMessage.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
buttonNextMessageActionPerformed(evt);
|
|
}
|
|
});
|
|
jPanelBottom.add(buttonNextMessage);
|
|
|
|
labelMessageHeader.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
|
|
labelMessageHeader.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
|
|
labelMessageHeader.setText("Message of the Day:");
|
|
labelMessageHeader.setAlignmentY(0.3F);
|
|
jPanelBottom.add(labelMessageHeader);
|
|
|
|
labelMessageText.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
|
|
labelMessageText.setText("You are playing Mage version 0.7.5. Welcome! -- Mage dev team --");
|
|
jPanelBottom.add(labelMessageText);
|
|
|
|
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 createTestGame(String gameName, String gameType, boolean useMonteCarloAI) {
|
|
TableView table;
|
|
try {
|
|
String testDeckFile = "test.dck";
|
|
File f = new File(testDeckFile);
|
|
if (!f.exists()) {
|
|
// default test deck
|
|
testDeckFile = DeckUtil.writeTextToTempFile(""
|
|
+ "5 Swamp" + System.lineSeparator()
|
|
+ "5 Forest" + System.lineSeparator()
|
|
+ "5 Island" + System.lineSeparator()
|
|
+ "5 Mountain" + System.lineSeparator()
|
|
+ "5 Plains");
|
|
}
|
|
DeckCardLists testDeck = DeckImporter.importDeckFromFile(testDeckFile, false);
|
|
|
|
PlayerType aiType = useMonteCarloAI ? PlayerType.COMPUTER_MONTE_CARLO : PlayerType.COMPUTER_MAD;
|
|
int numPlayers = gameName.contains("2") || gameName.contains("Monte Carlo") ? 2 : 4;
|
|
boolean multiPlayer = numPlayers > 2;
|
|
|
|
MatchOptions options = new MatchOptions(gameName, gameType, multiPlayer);
|
|
options.getPlayerTypes().add(PlayerType.HUMAN);
|
|
options.getPlayerTypes().add(aiType);
|
|
for (int i=2 ; i < numPlayers ; i++) {
|
|
options.getPlayerTypes().add(aiType);
|
|
}
|
|
options.setDeckType("Variant Magic - Freeform Commander");
|
|
options.setAttackOption(MultiplayerAttackOption.MULTIPLE);
|
|
options.setRange(RangeOfInfluence.ONE);
|
|
options.setWinsNeeded(2);
|
|
options.setMatchTimeLimit(MatchTimeLimit.NONE);
|
|
options.setMatchBufferTime(MatchBufferTime.NONE);
|
|
options.setFreeMulligans(2);
|
|
options.setSkillLevel(SkillLevel.CASUAL);
|
|
options.setRollbackTurnsAllowed(true);
|
|
options.setQuitRatio(100);
|
|
options.setMinimumRating(0);
|
|
String serverAddress = SessionHandler.getSession().getServerHost();
|
|
options.setBannedUsers(IgnoreList.getIgnoredUsers(serverAddress));
|
|
table = SessionHandler.createTable(roomId, options);
|
|
|
|
SessionHandler.joinTable(roomId, table.getTableId(), "Human", PlayerType.HUMAN, 1, testDeck, "");
|
|
SessionHandler.joinTable(roomId, table.getTableId(), "Computer", aiType, 1, testDeck, "");
|
|
for (int i=2 ; i < numPlayers ; i++) {
|
|
SessionHandler.joinTable(roomId, table.getTableId(), "Computer" + i, aiType, 1, testDeck, "");
|
|
}
|
|
SessionHandler.startMatch(roomId, table.getTableId());
|
|
} catch (HeadlessException ex) {
|
|
handleError(ex);
|
|
}
|
|
}
|
|
|
|
private void btnNewTableActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNewTableActionPerformed
|
|
newTableDialog.showDialog(roomId);
|
|
}//GEN-LAST:event_btnNewTableActionPerformed
|
|
|
|
private void buttonNextMessageActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonNextMessageActionPerformed
|
|
synchronized (this) {
|
|
if (messages != null && !messages.isEmpty()) {
|
|
currentMessage++;
|
|
if (currentMessage >= messages.size()) {
|
|
currentMessage = 0;
|
|
}
|
|
|
|
URLHandler.RemoveMouseAdapter(labelMessageText);
|
|
URLHandler.handleMessage(messages.get(currentMessage), this.labelMessageText);
|
|
}
|
|
}
|
|
}//GEN-LAST:event_buttonNextMessageActionPerformed
|
|
|
|
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.startUpdateTasks(true);
|
|
}//GEN-LAST:event_btnStateFinishedActionPerformed
|
|
|
|
private void buttonWhatsNewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonWhatsNewActionPerformed
|
|
MageFrame.getInstance().showWhatsNewDialog(true);
|
|
}//GEN-LAST:event_buttonWhatsNewActionPerformed
|
|
|
|
private void btnQuickStart2PlayerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnQuickStartDuelActionPerformed
|
|
createTestGame("Test 2 player", "Commander Free For All", false);
|
|
}//GEN-LAST:event_btnQuickStartDuelActionPerformed
|
|
|
|
private void btnQuickStart4PlayerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnQuickStartCommanderActionPerformed
|
|
createTestGame("Test 4 player", "Commander Free For All", false);
|
|
}//GEN-LAST:event_btnQuickStartCommanderActionPerformed
|
|
|
|
private void btnQuickStartMCTSActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnQuickStartMCTSActionPerformed
|
|
createTestGame("Test Monte Carlo AI", "Two Player Duel", true);
|
|
}//GEN-LAST:event_btnQuickStartMCTSActionPerformed
|
|
|
|
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 btnFormatOathbreaker;
|
|
private javax.swing.JToggleButton btnFormatOther;
|
|
private javax.swing.JToggleButton btnFormatPioneer;
|
|
private javax.swing.JToggleButton btnFormatPremodern;
|
|
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 btnQuickStart4Player;
|
|
private javax.swing.JButton btnQuickStart2Player;
|
|
private javax.swing.JButton btnQuickStartMCTS;
|
|
private javax.swing.JToggleButton btnRated;
|
|
private javax.swing.JToggleButton btnSkillBeginner;
|
|
private javax.swing.JToggleButton btnSkillCasual;
|
|
private javax.swing.JToggleButton btnSkillSerious;
|
|
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 javax.swing.JToggleButton btnUnrated;
|
|
private javax.swing.JButton buttonNextMessage;
|
|
private javax.swing.JButton buttonWhatsNew;
|
|
private mage.client.table.PlayersChatPanel chatPanelMain;
|
|
private javax.swing.JToolBar filterBar1;
|
|
private javax.swing.JToolBar filterBar2;
|
|
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.JToolBar.Separator jSeparator6;
|
|
private javax.swing.JSplitPane jSplitPane1;
|
|
private javax.swing.JSplitPane jSplitPaneTables;
|
|
private javax.swing.JLabel labelMessageHeader;
|
|
private javax.swing.JLabel labelMessageText;
|
|
private javax.swing.JTable tableCompleted;
|
|
private javax.swing.JTable tableTables;
|
|
// End of variables declaration//GEN-END:variables
|
|
|
|
}
|
|
|
|
class UpdateTablesTask extends SwingWorker<Void, Collection<TableView>> {
|
|
|
|
private final UUID roomId;
|
|
private final TablesPanel panel;
|
|
private boolean isFirstRun = true;
|
|
|
|
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 != null) {
|
|
this.publish(tables);
|
|
}
|
|
TimeUnit.SECONDS.sleep(TablesPanel.randomizeTimout(TablesPanel.REFRESH_ACTIVE_TABLES_SECS));
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
protected void process(java.util.List<Collection<TableView>> view) {
|
|
panel.updateTables(view.get(0));
|
|
|
|
// update server messages
|
|
count++;
|
|
if (isFirstRun || count > 60) {
|
|
count = 0;
|
|
isFirstRun = false;
|
|
panel.reloadServerMessages();
|
|
}
|
|
}
|
|
|
|
@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(TablesPanel.randomizeTimout(TablesPanel.REFRESH_PLAYERS_SECS));
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@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) {
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
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()) {
|
|
this.publish(SessionHandler.getFinishedMatches(roomId));
|
|
TimeUnit.SECONDS.sleep(TablesPanel.randomizeTimout(TablesPanel.REFRESH_FINISHED_TABLES_SECS));
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@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) {
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
class GameChooser extends JPopupMenu {
|
|
|
|
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);
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
}
|
|
}
|