/*******************************************************************************
* Copyright (c) 2015
* <p/>
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
* <p/>
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
* <p/>
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*******************************************************************************/
package jsettlers.main.swing.menu.mainmenu;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.util.List;
import java.util.Vector;
import java.util.stream.Collectors;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;
import jsettlers.common.ai.EPlayerType;
import jsettlers.common.menu.EProgressState;
import jsettlers.common.menu.IJoinPhaseMultiplayerGameConnector;
import jsettlers.common.menu.IJoiningGame;
import jsettlers.common.menu.IJoiningGameListener;
import jsettlers.common.menu.IMultiplayerConnector;
import jsettlers.common.menu.IStartingGame;
import jsettlers.common.menu.Player;
import jsettlers.graphics.localization.Labels;
import jsettlers.graphics.startscreen.SettingsManager;
import jsettlers.logic.map.loading.MapLoader;
import jsettlers.logic.map.loading.list.MapList;
import jsettlers.logic.map.loading.savegame.SavegameLoader;
import jsettlers.logic.player.PlayerSetting;
import jsettlers.main.JSettlersGame;
import jsettlers.main.MultiplayerConnector;
import jsettlers.main.swing.JSettlersFrame;
import jsettlers.main.swing.lookandfeel.ELFStyle;
import jsettlers.main.swing.lookandfeel.components.SplitedBackgroundPanel;
import jsettlers.main.swing.menu.openpanel.OpenPanel;
import jsettlers.main.swing.menu.settingsmenu.SettingsMenuPanel;
/**
* @author codingberlin
*/
public class MainMenuPanel extends SplitedBackgroundPanel {
private static final long serialVersionUID = -6745474019479693347L;
private static final Dimension PREFERRED_WEST_PANEL_SIZE = new Dimension(300, 300);
private final JSettlersFrame settlersFrame;
private final JPanel emptyPanel = new JPanel();
private final SettingsMenuPanel settingsPanel;
private final JButton exitButton = new JButton();
private final JToggleButton newSinglePlayerGameButton = new JToggleButton();
private final JToggleButton loadSaveGameButton = new JToggleButton();
private final JToggleButton settingsButton = new JToggleButton();
private final JToggleButton newNetworkGameButton = new JToggleButton();
private final JToggleButton joinNetworkGameButton = new JToggleButton();
private final OpenPanel openSinglePlayerPanel;
private final OpenPanel openSaveGamePanel;
private final OpenPanel newMultiPlayerGamePanel;
private final OpenPanel joinMultiPlayerGamePanel;
private final ButtonGroup buttonGroup = new ButtonGroup();
public MainMenuPanel(JSettlersFrame settlersFrame, IMultiplayerConnector multiPlayerConnector) {
this.settlersFrame = settlersFrame;
openSinglePlayerPanel = new OpenPanel(MapList.getDefaultList().getFreshMaps().getItems(), this::showNewSingleplayerGamePanel);
openSaveGamePanel = new OpenPanel(MapList.getDefaultList().getSavedMaps(), this::loadSavegame);
newMultiPlayerGamePanel = new OpenPanel(MapList.getDefaultList().getFreshMaps().getItems(), this::showNewMultiplayerGamePanel);
joinMultiPlayerGamePanel = new OpenPanel(new Vector<MapLoader>(), this::showJoinMultiplayerGamePanel);
settingsPanel = new SettingsMenuPanel(this);
createStructure();
setStyle();
localize();
addListener(multiPlayerConnector);
}
private void loadSavegame(MapLoader map) {
SavegameLoader savegameLoader = (SavegameLoader) map;
if (savegameLoader != null) {
PlayerSetting[] playerSettings = savegameLoader.getFileHeader().getPlayerSettings();
byte playerId = 0; // find playerId of HUMAN player
for (byte i = 0; i < playerSettings.length; i++) {
if (playerSettings[i].getPlayerType() == EPlayerType.HUMAN) {
playerId = i;
break;
}
}
JSettlersGame game = new JSettlersGame(savegameLoader, -1, playerId, playerSettings);
IStartingGame startingGame = game.start();
settlersFrame.showStartingGamePanel(startingGame);
}
}
private void showNewSingleplayerGamePanel(MapLoader map) {
settlersFrame.showNewSinglePlayerGameMenu(map);
}
private void showNewMultiplayerGamePanel(MapLoader map) {
SettingsManager settingsManager = SettingsManager.getInstance();
Player player = settingsManager.getPlayer();
IMultiplayerConnector connector = new MultiplayerConnector(settingsManager.get(SettingsManager.SETTING_SERVER),
player.getId(), player.getName());
settlersFrame.showNewMultiPlayerGameMenu(map, connector);
}
private void showJoinMultiplayerGamePanel(MapLoader map) {
NetworkGameMapLoader networkGameMapLoader = (NetworkGameMapLoader) map;
IJoiningGame joiningGame = settlersFrame.getMultiPlayerConnector().joinMultiplayerGame(networkGameMapLoader.getJoinableGame());
joiningGame.setListener(new IJoiningGameListener() {
@Override
public void joinProgressChanged(EProgressState state, float progress) {
}
@Override
public void gameJoined(IJoinPhaseMultiplayerGameConnector connector) {
SwingUtilities.invokeLater(
() -> settlersFrame.showJoinMultiplayerMenu(connector, MapList.getDefaultList().getMapById(networkGameMapLoader.getMapId())));
}
});
}
private void setStyle() {
newSinglePlayerGameButton.putClientProperty(ELFStyle.KEY, ELFStyle.BUTTON_MENU);
loadSaveGameButton.putClientProperty(ELFStyle.KEY, ELFStyle.BUTTON_MENU);
settingsButton.putClientProperty(ELFStyle.KEY, ELFStyle.BUTTON_MENU);
newNetworkGameButton.putClientProperty(ELFStyle.KEY, ELFStyle.BUTTON_MENU);
joinNetworkGameButton.putClientProperty(ELFStyle.KEY, ELFStyle.BUTTON_MENU);
exitButton.putClientProperty(ELFStyle.KEY, ELFStyle.BUTTON_MENU);
SwingUtilities.updateComponentTreeUI(this);
SwingUtilities.updateComponentTreeUI(openSinglePlayerPanel);
SwingUtilities.updateComponentTreeUI(openSaveGamePanel);
SwingUtilities.updateComponentTreeUI(settingsPanel);
SwingUtilities.updateComponentTreeUI(newMultiPlayerGamePanel);
SwingUtilities.updateComponentTreeUI(joinMultiPlayerGamePanel);
}
private void localize() {
exitButton.setText(Labels.getString("main-panel-exit-button"));
newSinglePlayerGameButton.setText(Labels.getString("main-panel-new-single-player-game-button"));
loadSaveGameButton.setText(Labels.getString("start-loadgame"));
settingsButton.setText(Labels.getString("settings-title"));
newNetworkGameButton.setText(Labels.getString("start-newmultiplayer"));
joinNetworkGameButton.setText(Labels.getString("start-joinmultiplayer"));
}
private void addListener(IMultiplayerConnector multiPlayerConnector) {
newSinglePlayerGameButton.addActionListener(e -> setCenter("main-panel-new-single-player-game-button", openSinglePlayerPanel));
loadSaveGameButton.addActionListener(e -> setCenter("start-loadgame", openSaveGamePanel));
newNetworkGameButton.addActionListener(e -> setCenter("start-newmultiplayer-start", newMultiPlayerGamePanel));
joinNetworkGameButton.addActionListener(e -> setCenter("start-joinmultiplayer-start", joinMultiPlayerGamePanel));
exitButton.addActionListener(e -> settlersFrame.exit());
settingsButton.addActionListener(e -> {
setCenter("settings-title", settingsPanel);
settingsPanel.initializeValues();
});
multiPlayerConnector
.getJoinableMultiplayerGames()
.setListener(networkGames -> {
List<MapLoader> mapLoaders = networkGames.getItems()
.stream()
.map(NetworkGameMapLoader::new)
.collect(Collectors.toList());
SwingUtilities.invokeLater(() -> joinMultiPlayerGamePanel.setMapLoaders(mapLoaders));
});
}
private void createStructure() {
JPanel westPanel = new JPanel();
westPanel.setLayout(new GridLayout(0, 1, 20, 20));
westPanel.add(newSinglePlayerGameButton);
westPanel.add(loadSaveGameButton);
westPanel.add(settingsButton);
westPanel.add(newNetworkGameButton);
westPanel.add(joinNetworkGameButton);
westPanel.add(exitButton);
add(westPanel);
buttonGroup.add(newSinglePlayerGameButton);
buttonGroup.add(loadSaveGameButton);
buttonGroup.add(settingsButton);
buttonGroup.add(newNetworkGameButton);
buttonGroup.add(joinNetworkGameButton);
add(emptyPanel);
getTitleLabel().setVisible(false);
westPanel.setPreferredSize(PREFERRED_WEST_PANEL_SIZE);
}
public void reset() {
setCenter(emptyPanel);
getTitleLabel().setVisible(false);
buttonGroup.clearSelection();
}
private void setCenter(final String titleKey, final JPanel panelToBeSet) {
getTitleLabel().setText(Labels.getString(titleKey));
getTitleLabel().setVisible(true);
setCenter(panelToBeSet);
}
private void setCenter(final JPanel panelToBeSet) {
remove(2);
add(panelToBeSet);
settlersFrame.revalidate();
settlersFrame.repaint();
}
}