diff --git a/Mage.Client/src/main/java/mage/client/chat/ChatPanel.form b/Mage.Client/src/main/java/mage/client/chat/ChatPanel.form
index 210d34b1e48..b7fe000f28e 100644
--- a/Mage.Client/src/main/java/mage/client/chat/ChatPanel.form
+++ b/Mage.Client/src/main/java/mage/client/chat/ChatPanel.form
@@ -1,6 +1,6 @@
-
diff --git a/Mage.Client/src/main/java/mage/client/chat/ChatPanel.java b/Mage.Client/src/main/java/mage/client/chat/ChatPanel.java
index 6eaf17a0456..b5b9e71ad5b 100644
--- a/Mage.Client/src/main/java/mage/client/chat/ChatPanel.java
+++ b/Mage.Client/src/main/java/mage/client/chat/ChatPanel.java
@@ -34,14 +34,20 @@
package mage.client.chat;
-import java.awt.Color;
+import java.awt.*;
import java.awt.event.KeyEvent;
-import java.util.UUID;
+import java.util.*;
+import java.util.List;
import java.util.logging.Logger;
import mage.client.MageFrame;
import mage.client.remote.Session;
import mage.util.Logging;
import mage.view.ChatMessage.MessageColor;
+import mage.view.SeatView;
+import mage.view.TableView;
+
+import javax.swing.table.AbstractTableModel;
+
/**
*
* @author BetaSteward_at_googlemail.com
@@ -54,12 +60,22 @@ public class ChatPanel extends javax.swing.JPanel {
private UUID clientId;
private Session session;
+ private List players = new ArrayList();
+ private TableModel tableModel;
- /** Creates new form ChatPanel */
+ /** Creates new form ChatPanel */
public ChatPanel() {
+ this(false);
+ }
+
+ /**
+ * @param extendedView if true, adds chat/players tabs
+ */
+ /** Creates new form ChatPanel */
+ public ChatPanel(boolean extendedView) {
+ tableModel = new TableModel();
initComponents();
- jScrollPane1.setOpaque(false);
- jScrollPane1.getViewport().setOpaque(false);
+ if (!extendedView) simplifyComponents();
}
public void connect(UUID chatId) {
@@ -95,6 +111,52 @@ public class ChatPanel extends javax.swing.JPanel {
txtConversation.setCaretPosition(txtConversation.getText().length() - 1);
}
+class TableModel extends AbstractTableModel {
+ private String[] columnNames = new String[]{"Players"};
+ private List players = new ArrayList(0);
+
+ public void loadData(List players) {
+ this.players = players;
+ this.fireTableDataChanged();
+ }
+
+ @Override
+ public int getRowCount() {
+ return players.size();
+ }
+
+ @Override
+ public int getColumnCount() {
+ return columnNames.length;
+ }
+
+ @Override
+ public Object getValueAt(int arg0, int arg1) {
+ return players.get(arg0);
+ }
+
+ @Override
+ public String getColumnName(int columnIndex) {
+ String colName = "";
+
+ if (columnIndex <= getColumnCount())
+ colName = columnNames[columnIndex];
+
+ return colName;
+ }
+
+ @Override
+ public Class getColumnClass(int columnIndex){
+ return String.class;
+ }
+
+ @Override
+ public boolean isCellEditable(int rowIndex, int columnIndex) {
+ return false;
+ }
+
+}
+
public void clear() {
this.txtConversation.selectAll();
this.txtConversation.replaceSelection("");
@@ -109,17 +171,12 @@ public class ChatPanel extends javax.swing.JPanel {
// //GEN-BEGIN:initComponents
private void initComponents() {
+ txtMessage = new javax.swing.JTextField();
+ jTabbedPane1 = new javax.swing.JTabbedPane();
jScrollPane1 = new javax.swing.JScrollPane();
txtConversation = new javax.swing.JTextArea();
- txtMessage = new javax.swing.JTextField();
-
- txtConversation.setColumns(20);
- txtConversation.setEditable(false);
- txtConversation.setFont(new java.awt.Font("Arial", 0, 10)); // NOI18N
- txtConversation.setLineWrap(true);
- txtConversation.setRows(5);
- txtConversation.setWrapStyleWord(true);
- jScrollPane1.setViewportView(txtConversation);
+ jScrollPane2 = new javax.swing.JScrollPane();
+ jTable1 = new javax.swing.JTable();
txtMessage.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
@@ -127,22 +184,63 @@ public class ChatPanel extends javax.swing.JPanel {
}
});
+ jTabbedPane1.setTabPlacement(javax.swing.JTabbedPane.BOTTOM);
+
+ txtConversation.setColumns(20);
+ txtConversation.setEditable(false);
+ txtConversation.setFont(new java.awt.Font("Arial", 0, 10));
+ txtConversation.setLineWrap(true);
+ txtConversation.setRows(5);
+ txtConversation.setWrapStyleWord(true);
+ jScrollPane1.setViewportView(txtConversation);
+
+ jTabbedPane1.addTab("chat", jScrollPane1);
+
+ jTable1.setModel(this.tableModel);
+ jTable1.setToolTipText("Connected players");
+ jTable1.setGridColor(new java.awt.Color(255, 255, 255));
+ jScrollPane2.setViewportView(jTable1);
+
+ jTabbedPane1.addTab("players", jScrollPane2);
+
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(txtMessage, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 179, Short.MAX_VALUE)
- .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 179, Short.MAX_VALUE)
+ .addComponent(txtMessage, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 168, Short.MAX_VALUE)
+ .addComponent(jTabbedPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 168, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
- .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE)
- .addGap(0, 0, 0)
+ .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 294, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(txtMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
);
+
+ jTabbedPane1.getAccessibleContext().setAccessibleName("chat");
}// //GEN-END:initComponents
+ private void simplifyComponents() {
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+ this.setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(txtMessage, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 168, Short.MAX_VALUE)
+ .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 168, Short.MAX_VALUE)
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+ .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 294, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(txtMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
+ );
+ jTabbedPane1 = null;
+ jTable1 = null;
+ jScrollPane2 = null;
+ }
+
private void txtMessageKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtMessageKeyTyped
if (evt.getKeyChar() == KeyEvent.VK_ENTER) {
session.sendChatMessage(chatId, this.txtMessage.getText());
@@ -151,9 +249,40 @@ public class ChatPanel extends javax.swing.JPanel {
}
}//GEN-LAST:event_txtMessageKeyTyped
+ public void setPlayers(Collection players) {
+ if (players != null) {
+ boolean update = false;
+ int size = players.size();
+ List list = new ArrayList(players);
+ Collections.sort(list);
+ if (size != this.players.size()) {
+ update = true;
+ } else {
+ update = true;
+ for (int i = 0; i < size; i++) {
+ if (!list.get(i).equals(this.players.get(i))) {
+ update = false;
+ break;
+ }
+ }
+ }
+ if (update && list != null) {
+ synchronized (tableModel) {
+ this.players = list;
+ tableModel.loadData(this.players);
+ }
+ }
+
+ } else {
+ this.players.clear();
+ }
+ }
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JScrollPane jScrollPane1;
+ private javax.swing.JScrollPane jScrollPane2;
+ private javax.swing.JTabbedPane jTabbedPane1;
+ private javax.swing.JTable jTable1;
private javax.swing.JTextArea txtConversation;
private javax.swing.JTextField txtMessage;
// End of variables declaration//GEN-END:variables
diff --git a/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.form b/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.form
index 92a9074ab5b..b41b93b0b42 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.form
+++ b/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.form
@@ -40,7 +40,7 @@
-
+
@@ -123,6 +123,9 @@
+
+
+
diff --git a/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java b/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java
index 1d1dffd2649..71981e43e79 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java
@@ -37,10 +37,12 @@ package mage.client.dialog;
import mage.client.*;
import java.util.List;
import java.util.UUID;
+import java.util.logging.Logger;
import javax.swing.SwingWorker;
import javax.swing.table.AbstractTableModel;
import mage.client.components.MageComponents;
import mage.client.remote.Session;
+import mage.util.Logging;
import mage.view.SeatView;
import mage.view.TableView;
@@ -155,7 +157,7 @@ public class TableWaitingDialog extends MageDialog {
jSplitPane1 = new javax.swing.JSplitPane();
jScrollPane1 = new javax.swing.JScrollPane();
tableSeats = new javax.swing.JTable();
- chatPanel = new mage.client.chat.ChatPanel();
+ chatPanel = new mage.client.chat.ChatPanel(false);
setResizable(true);
setTitle("Waiting for players");
@@ -221,7 +223,7 @@ public class TableWaitingDialog extends MageDialog {
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
- .addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 259, Short.MAX_VALUE)
+ .addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 263, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(btnMoveDown)
@@ -350,6 +352,8 @@ class UpdateSeatsTask extends SwingWorker {
private UUID tableId;
private TableWaitingDialog dialog;
+ private final static Logger logger = Logging.getLogger(TableWaitingDialog.class.getName());
+
UpdateSeatsTask(Session session, UUID roomId, UUID tableId, TableWaitingDialog dialog) {
this.session = session;
this.roomId = roomId;
diff --git a/Mage.Client/src/main/java/mage/client/table/TablesPanel.form b/Mage.Client/src/main/java/mage/client/table/TablesPanel.form
index bcdad1179a2..0ecd9f5af06 100644
--- a/Mage.Client/src/main/java/mage/client/table/TablesPanel.form
+++ b/Mage.Client/src/main/java/mage/client/table/TablesPanel.form
@@ -96,7 +96,7 @@
-
+
diff --git a/Mage.Client/src/main/java/mage/client/table/TablesPanel.java b/Mage.Client/src/main/java/mage/client/table/TablesPanel.java
index f9184a292c4..a5b2aab66f6 100644
--- a/Mage.Client/src/main/java/mage/client/table/TablesPanel.java
+++ b/Mage.Client/src/main/java/mage/client/table/TablesPanel.java
@@ -39,6 +39,7 @@ import java.awt.Component;
import mage.Constants.MultiplayerAttackOption;
import mage.Constants.RangeOfInfluence;
import mage.client.MageFrame;
+import mage.client.chat.ChatPanel;
import mage.client.components.MageComponents;
import mage.client.dialog.JoinTableDialog;
import mage.client.dialog.NewTableDialog;
@@ -75,6 +76,7 @@ public class TablesPanel extends javax.swing.JPanel {
private TableTableModel tableModel;
private UUID roomId;
private UpdateTablesTask updateTask;
+ private UpdatePlayersTask updatePlayersTask;
private JoinTableDialog joinTableDialog;
private NewTableDialog newTableDialog;
private NewTournamentDialog newTournamentDialog;
@@ -156,6 +158,7 @@ public class TablesPanel extends javax.swing.JPanel {
this.roomId = roomId;
session = MageFrame.getSession();
updateTask = new UpdateTablesTask(session, roomId, this);
+ updatePlayersTask = new UpdatePlayersTask(session, roomId, this.chatPanel);
if (session != null) {
btnQuickStart.setVisible(session.isTestMode());
}
@@ -179,6 +182,7 @@ public class TablesPanel extends javax.swing.JPanel {
if (chatRoomId != null) {
this.chatPanel.connect(chatRoomId);
updateTask.execute();
+ updatePlayersTask.execute();
this.setVisible(true);
this.repaint();
}
@@ -195,6 +199,8 @@ public class TablesPanel extends javax.swing.JPanel {
}
if (updateTask != null)
updateTask.cancel(true);
+ if (updatePlayersTask != null)
+ updatePlayersTask.cancel(true);
this.chatPanel.disconnect();
Component c = this.getParent();
@@ -219,7 +225,7 @@ public class TablesPanel extends javax.swing.JPanel {
btnQuickStart = new javax.swing.JButton();
btnNewTournament = new javax.swing.JButton();
jSplitPane1 = new javax.swing.JSplitPane();
- chatPanel = new mage.client.chat.ChatPanel();
+ chatPanel = new mage.client.chat.ChatPanel(true);
jScrollPane1 = new javax.swing.JScrollPane();
tableTables = new javax.swing.JTable();
@@ -271,7 +277,7 @@ public class TablesPanel extends javax.swing.JPanel {
jSplitPane1.setDividerSize(3);
jSplitPane1.setResizeWeight(1.0);
- chatPanel.setMinimumSize(new java.awt.Dimension(100, 43));
+ chatPanel.setMinimumSize(new java.awt.Dimension(100, 43));
jSplitPane1.setRightComponent(chatPanel);
tableTables.setModel(this.tableModel);
@@ -338,8 +344,8 @@ public class TablesPanel extends javax.swing.JPanel {
private javax.swing.JButton btnNewTable;
private javax.swing.JButton btnNewTournament;
private javax.swing.JButton btnQuickStart;
- private mage.client.chat.ChatPanel chatPanel;
private javax.swing.JPanel jPanel1;
+ private ChatPanel chatPanel;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JSplitPane jSplitPane1;
private javax.swing.JTable tableTables;
@@ -433,7 +439,7 @@ class UpdateTablesTask extends SwingWorker> {
private UUID roomId;
private TablesPanel panel;
- private final static Logger logger = Logging.getLogger(TablesPanel.class.getName());
+ private final static Logger logger = Logging.getLogger(UpdateTablesTask.class.getName());
UpdateTablesTask(Session session, UUID roomId, TablesPanel panel) {
this.session = session;
@@ -445,10 +451,6 @@ class UpdateTablesTask extends SwingWorker> {
protected Void doInBackground() throws Exception {
while (!isCancelled()) {
this.publish(session.getTables(roomId));
- /*logger.info("connected players:");
- for (String player : session.getConnectedPlayers(roomId)) {
- logger.info(" " + player);
- }*/
Thread.sleep(1000);
}
return null;
@@ -458,5 +460,33 @@ class UpdateTablesTask extends SwingWorker> {
protected void process(List> view) {
panel.update(view.get(0));
}
+}
+class UpdatePlayersTask extends SwingWorker> {
+
+ private Session session;
+ private UUID roomId;
+ private ChatPanel chat;
+
+ private final static Logger logger = Logging.getLogger(UpdatePlayersTask.class.getName());
+
+ UpdatePlayersTask(Session session, UUID roomId, ChatPanel chat) {
+ this.session = session;
+ this.roomId = roomId;
+ this.chat = chat;
+ }
+
+ @Override
+ protected Void doInBackground() throws Exception {
+ while (!isCancelled()) {
+ this.publish(session.getConnectedPlayers(roomId));
+ Thread.sleep(1000);
+ }
+ return null;
+ }
+
+ @Override
+ protected void process(List> players) {
+ chat.setPlayers(players.get(0));
+ }
}
\ No newline at end of file