package vooga.rts.networking.client.clientgui; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import vooga.rts.networking.NetworkBundle; import vooga.rts.networking.client.ClientModel; import vooga.rts.networking.communications.ExpandedLobbyInfo; import vooga.rts.networking.communications.LobbyInfo; /** * Class used as a meddler between the client view and model * It manages the necessary operations on the model given the * user input and keeps the display information up to date * in case data comes from the network * * @author Henrique Moraes * @author David Winegar * */ public class ClientViewAdapter extends ViewAdapter { private TableContainerView myServerBrowserView; private CreateLobbyView myCreateLobbyView; private LobbyView myLobbyView; private ServerBrowserTableAdapter myServerBrowserAdapter = new ServerBrowserTableAdapter(); private ActionListener myHostGameListener; private ActionListener myJoinGameListener; private ActionListener myBackToBrowserListener; private ActionListener myStartLobbyListener; private ActionListener myLeaveLobbyListener; private ActionListener myStartGameListener; /** * Constructor for this class. * * @param model model to communicate with * @param gameName name of game * @param mapNameList list of maps * @param maxPlayerList list of max players */ public ClientViewAdapter (ClientModel model, String gameName, List<String> mapNameList, List<Integer> maxPlayerList) { super(model, gameName); initializeActionListeners(); myServerBrowserView = new TableContainerView(myServerBrowserAdapter); myCreateLobbyView = new CreateLobbyView(mapNameList, maxPlayerList); switchToServerBrowserView(); } /** * Instantiates the listeners. This is a utility method so that there is not too much code in * the "switch" methods. */ private void initializeActionListeners () { myHostGameListener = new ActionListener() { @Override public void actionPerformed (ActionEvent arg0) { switchToCreateLobbyView(); } }; myJoinGameListener = new ActionListener() { @Override public void actionPerformed (ActionEvent arg0) { if (myServerBrowserView.hasSelectedRow()) { getMyModel().requestJoinLobby(myServerBrowserAdapter .getIdOfRow(myServerBrowserView .getSelectedRow())); } } }; myBackToBrowserListener = new ActionListener() { @Override public void actionPerformed (ActionEvent arg0) { switchToServerBrowserView(); } }; myStartLobbyListener = new ActionListener() { @Override public void actionPerformed (ActionEvent arg0) { if (myCreateLobbyView.allItemsChosen()) { getMyModel().startLobby(myCreateLobbyView .getLobbyInfo()); } } }; myLeaveLobbyListener = new ActionListener() { @Override public void actionPerformed (ActionEvent arg0) { getMyModel().leaveLobby(); switchToServerBrowserView(); } }; myStartGameListener = new ActionListener() { @Override public void actionPerformed (ActionEvent arg0) { if (getMyModel().getLobbyInfo().canStartGame()) { getMyModel().requestStartGame(); } } }; } /** * Switches the current View to the ServerBrowser. */ private void switchToServerBrowserView () { getMyModel().requestLobbies(); getView().changeView(myServerBrowserView, NetworkBundle.getString("ServerBrowser")); getView().changeLeftButton(NetworkBundle.getString("HostGame"), myHostGameListener); getView().changeRightButton(NetworkBundle.getString("JoinGame"), myJoinGameListener); } /** * Switches the current View to the LobbyCreatorScreen. */ private void switchToCreateLobbyView () { getView().changeView(myCreateLobbyView, NetworkBundle.getString("LobbyCreation")); getView().changeLeftButton(NetworkBundle.getString("BackToBrowser"), myBackToBrowserListener); getView().changeRightButton(NetworkBundle.getString("StartLobby"), myStartLobbyListener); } /** * Switches the current view to the Lobby. * * @param lobbyInfo info of lobby */ public void switchToLobbyView (ExpandedLobbyInfo lobbyInfo) { myLobbyView = new LobbyView(getMyModel(), getMyModel().getFactions(), lobbyInfo.getMaxPlayers()); getMyModel().updateLobby(lobbyInfo); getMyModel().sendUpdatedLobbyInfo(); getView().changeView(myLobbyView, NetworkBundle.getString("LobbyCreation")); getView().changeLeftButton(NetworkBundle.getString("LeaveLobby"), myLeaveLobbyListener); getView().changeRightButton(NetworkBundle.getString("StartLobby"), myStartGameListener); } /** * * @param lobbies array with LobbyInfo that should update * the ServerBrowserAdapter */ public void changeLobbies (LobbyInfo[] lobbies) { myServerBrowserAdapter.changeLobbies(lobbies); } /** * Updates the information on the LobbyView according to the * model's current information */ public void updateLobby () { myLobbyView.update(getMyModel().getPlayersInfo(), getMyModel().getLobbyInfo().getPlayers()); } }