package magic.ui.screen.duel.setup; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.nio.file.Path; import javax.swing.JPanel; import magic.data.DeckType; import magic.data.DuelConfig; import magic.data.MagicFormat; import magic.exception.InvalidDeckException; import magic.model.MagicDeck; import magic.model.player.IPlayerProfileListener; import magic.model.player.PlayerProfile; import magic.model.player.PlayerProfiles; import magic.ui.ScreenController; import magic.ui.helpers.MouseHelper; import magic.ui.screen.widget.DuelSettingsPanel; import magic.ui.utility.MagicStyle; import magic.utility.DeckUtils; import net.miginfocom.swing.MigLayout; @SuppressWarnings("serial") class ScreenContentPanel extends JPanel implements IPlayerProfileListener { private static final int PLAYERS_COUNT = 2; private final MigLayout migLayout = new MigLayout(); private final DuelSettingsPanel duelSettingsPanel; private final DuelPlayerPanel[] playerPanels = new DuelPlayerPanel[PLAYERS_COUNT]; private final DuelPlayerDeckPanel[] newPlayerDeckPanels = new DuelPlayerDeckPanel[PLAYERS_COUNT]; ScreenContentPanel(final DuelConfig config) { this.duelSettingsPanel = new DuelSettingsPanel(config); for (int i = 0; i < PLAYERS_COUNT; i++) { this.playerPanels[i] = getNewDuelPlayerPanel(config.getPlayerProfile(i)); this.newPlayerDeckPanels[i] = new DuelPlayerDeckPanel(config.getPlayerDeckProfile(i)); } setLookAndFeel(); refreshLayout(); } private void setLookAndFeel() { setOpaque(false); setLayout(migLayout); } private void refreshLayout() { migLayout.setLayoutConstraints("insets 0, center, center, wrap 2"); migLayout.setColumnConstraints("[310, fill]6[310, fill]"); migLayout.setRowConstraints("[40, fill]6[270, fill]4[60, fill]"); add(duelSettingsPanel, "spanx 2"); add(playerPanels[0]); add(playerPanels[1]); add(newPlayerDeckPanels[0]); add(newPlayerDeckPanels[1]); } private DuelPlayerPanel getNewDuelPlayerPanel(final PlayerProfile player) { final DuelPlayerPanel panel = new DuelPlayerPanel(player); panel.addMouseListener(getDuelPlayerPanelMouseAdapter(panel)); return panel; } private MouseAdapter getDuelPlayerPanelMouseAdapter(final DuelPlayerPanel panel) { return new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { MouseHelper.showBusyCursor(); selectNewProfile(panel.getPlayer()); mouseExited(e); MouseHelper.showDefaultCursor(); } @Override public void mouseEntered(MouseEvent e) { MagicStyle.setHightlight(panel, true); } @Override public void mouseExited(MouseEvent e) { MagicStyle.setHightlight(panel, false); } }; } private void selectNewProfile(final PlayerProfile playerProfile) { if (playerProfile.isHuman()) { ScreenController.showSelectHumanPlayerScreen(this, playerProfile); } else { ScreenController.showSelectAiProfileScreen(this, playerProfile); } } MagicFormat getCube() { return duelSettingsPanel.getCube(); } int getNrOfGames() { return duelSettingsPanel.getNrOfGames(); } int getHandSize() { return duelSettingsPanel.getHandSize(); } int getStartLife() { return duelSettingsPanel.getStartLife(); } String getDeckValue(final int playerIndex) { return newPlayerDeckPanels[playerIndex].getDeckValue(); } DeckType getDeckType(final int playerIndex) { return newPlayerDeckPanels[playerIndex].getDeckType(); } PlayerProfile getPlayerProfile(final int index) { return playerPanels[index].getPlayer(); } private DuelPlayerPanel getDuelPlayerPanel(final PlayerProfile player) { return playerPanels[player.isHuman() ? 0 : 1]; } @Override public void PlayerProfileUpdated(PlayerProfile player) { getDuelPlayerPanel(player).setPlayer(player); } @Override public void PlayerProfileDeleted(PlayerProfile deletedPlayer) { if (deletedPlayer.isHuman()) { final PlayerProfile playerProfile = PlayerProfiles.getDefaultHumanPlayer(); DuelConfig.getInstance().setPlayerProfile(0, playerProfile); getDuelPlayerPanel(playerProfile).setPlayer(playerProfile); } else { final PlayerProfile playerProfile = PlayerProfiles.getDefaultAiPlayer(); DuelConfig.getInstance().setPlayerProfile(1, playerProfile); getDuelPlayerPanel(playerProfile).setPlayer(playerProfile); } } @Override public void PlayerProfileSelected(PlayerProfile player) { getDuelPlayerPanel(player).setPlayer(player); saveSelectedPlayerProfile(player); } private void saveSelectedPlayerProfile(final PlayerProfile player) { DuelConfig.getInstance().setPlayerProfile(player.isHuman() ? 0 : 1, player); } boolean isDeckValid(int i) { if (getDeckType(i) != DeckType.Random) { final String deckFilename = getDeckValue(i) + DeckUtils.DECK_EXTENSION; final Path deckFolder = DeckType.getDeckFolder(getDeckType(i)); try { final MagicDeck deck = DeckUtils.loadDeckFromFile(deckFolder.resolve(deckFilename)); return deck.isValid(); } catch (InvalidDeckException ex) { return false; } } else { return true; } } }