Coverage Summary for Class: GameInProgressPanel (it.polimi.ingsw.Client.GUI.Panels)

Class Class, % Method, % Branch, % Line, %
GameInProgressPanel 0% (0/1) 0% (0/5) 0% (0/60) 0% (0/94)


1 package it.polimi.ingsw.Client.GUI.Panels; 2  3 import it.polimi.ingsw.Client.GUI.Context; 4 import it.polimi.ingsw.Client.GUI.Listeners.GUISocketListener; 5 import it.polimi.ingsw.Client.GUI.Window; 6 import it.polimi.ingsw.Controller.Actions.*; 7 import it.polimi.ingsw.Exceptions.Container.InvalidContainerIndexException; 8 import it.polimi.ingsw.Model.Enums.GameMode; 9 import it.polimi.ingsw.Model.Model; 10 import it.polimi.ingsw.Model.PlayerBoard; 11 import it.polimi.ingsw.Network.SocketWrapper; 12  13 import javax.swing.*; 14 import java.awt.*; 15 import java.util.ArrayList; 16 import java.util.HashMap; 17 import java.util.Map; 18  19 /** 20  * Class container of all others Panel inside a JTabbedPane 21  */ 22 public class GameInProgressPanel extends JTabbedPane { 23  24  /** 25  * nickname of GUI's player 26  */ 27  private final String ownNickname; 28  /** 29  * Frame containing all others components 30  */ 31  private final Window window; 32  33  /** 34  * SocketWrapper used to communicate with Server 35  */ 36  private final SocketWrapper sw; 37  /** 38  * Contains GuiReader's information necessary to record user's requests during his turn 39  */ 40  private final GUISocketListener guiSocketListener; 41  42  /** 43  * Constructor that should be called only upon the creation of first GameInProgressPanel 44  * 45  * @param ctx Context to use during the game 46  */ 47  public GameInProgressPanel(Context ctx) { 48  // unwrapping context into useful variables 49  this.ownNickname = ctx.getNickname(); 50  this.window = ctx.getWindow(); 51  this.sw = ctx.getSocketWrapper(); 52  this.window.changeView(this); 53  this.guiSocketListener = new GUISocketListener(ctx); 54  //run GuiReader thread 55  Thread readerThread = new Thread(guiSocketListener); 56  readerThread.start(); 57  } 58  59  /** 60  * Public constructor to create GameInProgressPanel's object starting from the second creation; it should never be called the first time 61  * 62  * @param ctx Context to use during the game 63  * @param model Model containing all game's information 64  * @param guiSocketListener created upon first gameInProgressPanel creation 65  * @param previousPanel if not null, signifies an old panel was previously drawn and will keep the displayed 66  * tab the same in the new panel 67  */ 68  public GameInProgressPanel(Context ctx, Model model, GUISocketListener guiSocketListener, GameInProgressPanel previousPanel) { 69  this(ctx, guiSocketListener); 70  if (!model.isGameOver()) { 71  //add IslandFieldPanel to JTabbedPane 72  this.add("Islands", new IslandFieldPanel(model, sw, guiSocketListener)); 73  Map<String, PlayerBoardPanel> playerTabs = new HashMap<>(); 74  ArrayList<String> tooltips = new ArrayList<>(model.getMutablePlayerBoards().size()); 75  //set ToolTip font 76  UIManager.put("ToolTip.font", new Font("Arial", Font.BOLD, 15)); 77  for (PlayerBoard pb : model.getMutablePlayerBoards()) { 78  //for all playerBoards create and add a PlayerBoardPanel to JTabbedPane 79  playerTabs.put(pb.getNickname(), new PlayerBoardPanel(pb, model, this.sw, guiSocketListener)); 80  } 81  for (Map.Entry<String, PlayerBoardPanel> pbp : playerTabs.entrySet()) { 82  //set a proper name to playerBoardPanel's tab inside jTabbedPane 83  if (pbp.getKey().equals(this.ownNickname)) { 84  if (pbp.getKey().equals(model.getMutableTurnOrder().getMutableCurrentPlayer().getNickname())) 85  this.add("Your board (current player)", pbp.getValue()); 86  else 87  this.add("Your board", pbp.getValue()); 88  } else { 89  if (pbp.getKey().equals(model.getMutableTurnOrder().getMutableCurrentPlayer().getNickname())) 90  this.add(pbp.getKey() + "'s PlayerBoard (current player)", pbp.getValue()); 91  else 92  this.add(pbp.getKey() + "'s PlayerBoard", pbp.getValue()); 93  } 94  PlayerBoard pb = null; 95  try { 96  pb = model.getMutablePlayerBoard(pbp.getValue().getPlayerBoardId()); 97  } catch (InvalidContainerIndexException e) { 98  e.printStackTrace(); 99  } 100  String tooltip; 101  //create ToolTip's string for all playerBoardPanels' tabs (containing assistantCard that has been played and eventual coin balance) 102  if (model.getMutableTurnOrder().getMutableSelectedCard(pb).isPresent()) { 103  tooltip = "<html>Played assistant card: #" + model.getMutableTurnOrder().getMutableSelectedCard(pb).get().getPriority() + "<br>"; 104  } else { 105  tooltip = "<html>No assistant card has been played<br>"; 106  } 107  if (model.getGameMode() == GameMode.ADVANCED) 108  tooltip = tooltip + "Available coins:" + (pb != null ? pb.getCoinBalance() : 0); 109  tooltip = tooltip + "</html>"; 110  tooltips.add(tooltip); 111  } 112  //add ToolTip to all playerBoardPanels' tabs 113  for (int i = 1; i <= tooltips.size(); i++) { 114  this.setToolTipTextAt(i, tooltips.get(i - 1)); 115  } 116  //If the game is an advanced game then create and add a new CharacterCardsPanel to JTabbedPane 117  if (model.getGameMode() == GameMode.ADVANCED) { 118  final JPanel characterCardsPanel = new CharacterCardsPanel(model, sw, guiSocketListener); 119  this.add("CharacterCards", characterCardsPanel); 120  } 121  //create and add CloudPanel to JTabbedPane 122  this.add("Clouds", new CloudPanel(model.getClouds(), model.getMutableTurnOrder().getMutableCurrentPlayer(), guiSocketListener, sw)); 123  124  if (ownNickname.equals(model.getMutableTurnOrder().getMutableCurrentPlayer().getNickname())) { 125  this.add("NEXT ACTION: " + getNextAction(model), null); 126  } else { 127  this.add("WAIT YOUR TURN", null); 128  } 129  this.setEnabledAt(this.getTabCount() - 1, false); 130  131  //set JTabbedPane to the the last tab the user had opened 132  if (previousPanel != null) { 133  this.setSelectedIndex(previousPanel.getSelectedIndex()); 134  } 135  136  // show an "it's your turn" dialog if appropriate 137  if (model.getMutableTurnOrder().getMutableCurrentPlayer().getNickname().equals(ownNickname) && 138  (guiSocketListener.getSuccessfulRequestsByType(PlayAssistantCard.class) == 0 || 139  (guiSocketListener.getSuccessfulRequestsByType(PlayAssistantCard.class) == 1 && 140  guiSocketListener.getSuccessfulRequestsByType(MoveStudent.class) == 0))) { 141  // when selecting an assistant card, remember the user what other players have chosen 142  StringBuilder text = new StringBuilder("<html>It's your turn!!"); 143  if (guiSocketListener.getSuccessfulRequestsByType(PlayAssistantCard.class) == 0) { 144  for (PlayerBoard playerBoard : model.getMutableTurnOrder().getCurrentTurnOrder()) { 145  if (playerBoard.getNickname().equals(ownNickname)) break; 146  text.append(playerBoard.getNickname()).append("<br> has played assistantCard: #").append(model.getMutableTurnOrder().getMutableSelectedCard(playerBoard).get().getPriority()); 147  } 148  } 149  text.append("</html>"); 150  JLabel resLabel = new JLabel(text.toString()); 151  resLabel.setFont(new Font("Monospaced", Font.BOLD, 17)); 152  SwingUtilities.invokeLater(() -> 153  JOptionPane.showMessageDialog(null, resLabel, "Turn change", JOptionPane.INFORMATION_MESSAGE)); 154  } 155  } else { 156  this.add("WINNERS", new EndGamePanel(model.getWinners().get(), ctx)); 157  } 158  } 159  160  /** 161  * Should be used upon the second creation of GameInProgressPanel 162  * 163  * @param ctx Context to use during the game 164  * @param guiSocketListener created upon first gameInProgressPanel creation 165  */ 166  private GameInProgressPanel(Context ctx, GUISocketListener guiSocketListener) { 167  this.ownNickname = ctx.getNickname(); 168  this.window = ctx.getWindow(); 169  this.sw = ctx.getSocketWrapper(); 170  this.guiSocketListener = guiSocketListener; 171  Thread readerThread = new Thread(guiSocketListener); 172  readerThread.start(); 173  } 174  175  private String getNextAction(Model model) { 176  String nextAction = ""; 177  if (guiSocketListener.getSuccessfulRequestsByType(PlayCharacterCard.class) == 0 && model.getGameMode() == GameMode.ADVANCED) { 178  nextAction = "play character card or "; 179  } 180  if (guiSocketListener.getSuccessfulRequestsByType(PlayAssistantCard.class) == 0) { 181  nextAction = nextAction + "play assistant card"; 182  return nextAction; 183  } 184  if ((model.getMutablePlayerBoards().size() != 3 && guiSocketListener.getSuccessfulRequestsByType(MoveStudent.class) < 3) || 185  (model.getMutablePlayerBoards().size() == 3 && guiSocketListener.getSuccessfulRequestsByType(MoveStudent.class) < 4)) { 186  nextAction = nextAction + "move Student"; 187  return nextAction; 188  } 189  if (guiSocketListener.getSuccessfulRequestsByType(MoveMotherNature.class) == 0) { 190  nextAction = nextAction + "move MotherNature"; 191  return nextAction; 192  } 193  if (guiSocketListener.getSuccessfulRequestsByType(ChooseCloudTile.class) == 0) { 194  nextAction = nextAction + "choose cloud"; 195  return nextAction; 196  } 197  if (guiSocketListener.getSuccessfulRequestsByType(EndTurnOfActionPhase.class) == 0) { 198  nextAction = nextAction + "end the turn"; 199  return nextAction; 200  } 201  return "no action can be executed"; 202  } 203 }