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 @@ -
+ @@ -16,46 +16,95 @@ - - + + - - + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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