From fe82b499308012d6ddf2adaa18891a43c5bcd8ac Mon Sep 17 00:00:00 2001
From: LevelX2 <ludwig.hirth@online.de>
Date: Sat, 28 Sep 2013 16:59:43 +0200
Subject: [PATCH] * Join Table - Changed handling of messages while creating or
 joining a table.

---
 .../mage/client/dialog/NewTableDialog.java    |  2 +-
 .../client/remote/CallbackClientImpl.java     |  8 ++++++
 .../java/mage/server/TableController.java     | 28 ++++++++++++++-----
 .../src/main/java/mage/server/User.java       |  9 ++++++
 4 files changed, 39 insertions(+), 8 deletions(-)

diff --git a/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java b/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java
index 83896b7b6a..fc436c76b1 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java
@@ -356,7 +356,7 @@ public class NewTableDialog extends MageDialog {
         } catch (ClassNotFoundException ex) {
             handleError(ex);
         }
-        JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Error joining table.", "Error", JOptionPane.ERROR_MESSAGE);
+        // JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Error joining table.", "Error", JOptionPane.ERROR_MESSAGE);
         session.removeTable(roomId, table.getTableId());
         table = null;
     }//GEN-LAST:event_btnOKActionPerformed
diff --git a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java
index 1a7e4386ef..922b388a96 100644
--- a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java
+++ b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java
@@ -28,6 +28,8 @@
 
 package mage.client.remote;
 
+import java.util.LinkedList;
+import java.util.List;
 import java.util.UUID;
 import javax.swing.JOptionPane;
 import javax.swing.SwingUtilities;
@@ -252,6 +254,12 @@ public class CallbackClientImpl implements CallbackClient {
                     else if (callback.getMethod().equals("endGameInfo")) {
                         MageFrame.getInstance().showGameEndDialog((GameEndView) callback.getData());
                     }
+                    else if (callback.getMethod().equals("showUserMessage")) {
+                        List<String> messageData = (List<String>) callback.getData();
+                        if (messageData.size() == 2) {
+                            JOptionPane.showMessageDialog(null, messageData.get(1), messageData.get(0), JOptionPane.WARNING_MESSAGE);
+                        }
+                    }
                     else if (callback.getMethod().equals("gameInform")) {
 
                         if (callback.getMessageId() > messageId) {
diff --git a/Mage.Server/src/main/java/mage/server/TableController.java b/Mage.Server/src/main/java/mage/server/TableController.java
index 125c3b7851..a2cb5a1adf 100644
--- a/Mage.Server/src/main/java/mage/server/TableController.java
+++ b/Mage.Server/src/main/java/mage/server/TableController.java
@@ -28,6 +28,8 @@
 
 package mage.server;
 
+import java.util.LinkedHashMap;
+import java.util.Map;
 import java.util.Map.Entry;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
@@ -174,28 +176,40 @@ public class TableController {
     }
 
     public synchronized boolean joinTable(UUID userId, String name, String playerType, int skill, DeckCardLists deckList) throws MageException {
+        User user = UserManager.getInstance().getUser(userId);
+        if (user == null) {
+            return false;
+        }
         if (table.getState() != TableState.WAITING) {
+            user.showUserMessage("Join Table", "No available seats.");
             return false;
         }
         Seat seat = table.getNextAvailableSeat(playerType);
         if (seat == null) {
-            throw new GameException("No available seats.");
+            user.showUserMessage("Join Table", "No available seats.");
+            return false;
         }
         Deck deck = Deck.load(deckList, false, false);
+
         if (!Main.isTestMode() && !table.getValidator().validate(deck)) {
-            table.getValidator().getName();
-            throw new InvalidDeckException(
-                    new StringBuilder(name).append(" has an invalid deck for the ").append(table.getValidator().getName()).append(" Format").toString(),
-                    table.getValidator().getInvalid());
+            StringBuilder sb = new StringBuilder("You (").append(name).append(") have an invalid deck for the selected ").append(table.getValidator().getName()).append(" Format. \n\n");
+            for (Map.Entry<String, String> entry : table.getValidator().getInvalid().entrySet()) {
+                sb.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n");
+            }
+            sb.append("\n\nSelect a deck that is appropriate for the selected format and try again!");
+            user.showUserMessage("Join Table", sb.toString());
+            return false;
         }
 
         Player player = createPlayer(name, seat.getPlayerType(), skill);
         if (player == null) {
-            throw new GameException(new StringBuilder("Could not create player ").append(name).append(" of type ").append(seat.getPlayerType().toString()).toString());
+            String message = new StringBuilder("Could not create player ").append(name).append(" of type ").append(seat.getPlayerType().toString()).toString();
+            logger.warn(new StringBuilder("User: ").append(user.getName()).append(" => ").append(message).toString());
+            user.showUserMessage("Join Table",message);
+            return false;
         }
         match.addPlayer(player, deck);
         table.joinTable(player, seat);
-        User user = UserManager.getInstance().getUser(userId);
         user.addTable(player.getId(), table);
         logger.info("player joined " + player.getId());
         //only inform human players and add them to sessionPlayerMap
diff --git a/Mage.Server/src/main/java/mage/server/User.java b/Mage.Server/src/main/java/mage/server/User.java
index a87c4a061a..8441ee306b 100644
--- a/Mage.Server/src/main/java/mage/server/User.java
+++ b/Mage.Server/src/main/java/mage/server/User.java
@@ -29,6 +29,8 @@ package mage.server;
 
 import java.util.Date;
 import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.UUID;
@@ -164,6 +166,13 @@ public class User {
         fireCallback(new ClientCallback("showGameEndDialog", gameId));
     }
 
+    public void showUserMessage(final String titel,  String message) {
+        List<String> messageData = new LinkedList<String>();
+        messageData.add(titel);
+        messageData.add(message);
+        fireCallback(new ClientCallback("showUserMessage", null, messageData ));
+    }
+
     public void watchGame(final UUID gameId) {
         fireCallback(new ClientCallback("watchGame", gameId));
     }