/** * This file is part of JSkat. * * JSkat is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * JSkat is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with JSkat. If not, see <http://www.gnu.org/licenses/>. */ package org.jskat.gui.swing.table; import java.awt.Font; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import javax.swing.JLabel; import javax.swing.JPanel; import org.jskat.data.GameAnnouncement; import org.jskat.data.GameSummary; import org.jskat.data.SkatGameData.GameState; import org.jskat.gui.swing.LayoutFactory; import org.jskat.util.GameType; import org.jskat.util.JSkatResourceBundle; import org.jskat.util.Player; /** * Panel for showing game informations */ class GameInformationPanel extends JPanel { private static final long serialVersionUID = 1L; // private JSkatGraphicRepository bitmaps; private final JSkatResourceBundle strings; private JLabel label; private int gameNumber; private GameState gameState; private GameType gameType; private int multiplier; private boolean playWithJacks; private boolean handGame; private boolean ouvertGame; private boolean schneiderAnnounced; private boolean schneider; private boolean schwarzAnnounced; private boolean schwarz; private boolean overBidded; private boolean contra; private boolean re; private int trick; private boolean gameWon; private int declarerPoints; private int opponentPoints; private Set<Player> ramschLoosers; /** * Constructor */ GameInformationPanel() { // bitmaps = JSkatGraphicRepository.instance(); strings = JSkatResourceBundle.INSTANCE; initPanel(); } private void initPanel() { setLayout(LayoutFactory.getMigLayout("fill")); //$NON-NLS-1$ setOpaque(true); label = new JLabel(); label.setFont(new Font(Font.DIALOG, Font.BOLD, 16)); setGameState(GameState.GAME_START); add(label); } void clear() { label.setText(" "); //$NON-NLS-1$ } void setGameState(final GameState newGameState) { gameState = newGameState; if (gameState.equals(GameState.GAME_START)) { resetGameData(); } refreshText(); } void setGameAnnouncement(final GameAnnouncement announcement) { gameType = announcement.getGameType(); handGame = announcement.isHand(); ouvertGame = announcement.isOuvert(); schneiderAnnounced = announcement.isSchneider(); schwarzAnnounced = announcement.isSchwarz(); } private void resetGameData() { gameType = null; multiplier = 0; playWithJacks = false; handGame = false; ouvertGame = false; schneiderAnnounced = false; schneider = false; schwarzAnnounced = false; schwarz = false; overBidded = false; contra = false; re = false; trick = 1; gameWon = false; declarerPoints = 0; opponentPoints = 0; ramschLoosers = new HashSet<Player>(); } private void refreshText() { StringBuffer text = new StringBuffer(); appendGameNumber(text); text.append(getGameStateString(gameState)); appendGameType(text); appendGameStateDetails(text); label.setText(text.toString()); } private void appendGameStateDetails(StringBuffer text) { if (gameState.equals(GameState.TRICK_PLAYING)) { appendTrickPlayingDetails(text); } else if (gameState.equals(GameState.GAME_OVER)) { appendGameOverDetails(text); } } private void appendGameOverDetails(StringBuffer text) { if (gameType != GameType.PASSED_IN) { text.append(" - "); //$NON-NLS-1$ if (gameWon) { text.append(strings.getString("won")); //$NON-NLS-1$ } else { text.append(strings.getString("lost")); //$NON-NLS-1$ } } if (gameType == GameType.RAMSCH) { text.append(" - "); //$NON-NLS-1$ Iterator<Player> iterator = ramschLoosers.iterator(); if (iterator.hasNext()) { text.append(strings.getPlayerString(iterator.next())); } while (iterator.hasNext()) { text.append(", "); text.append(strings.getPlayerString(iterator.next())); } } else if (gameType != GameType.NULL && gameType != GameType.PASSED_IN) { text.append(" - "); //$NON-NLS-1$ text.append( declarerPoints + " " + strings.getString("versus") + " "); text.append(opponentPoints + " " + strings.getString("points")); //$NON-NLS-1$//$NON-NLS-2$ } } private void appendTrickPlayingDetails(StringBuffer text) { text.append(" " + strings.getString("trick") + " " + trick); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ } private void appendGameType(StringBuffer text) { if (gameType != null) { text.append(" [" + strings.getGameType(gameType)); //$NON-NLS-1$ if (gameState.equals(GameState.GAME_OVER) && multiplier > 0) { if (playWithJacks) { text.append(" " + strings.getString("with")); //$NON-NLS-1$//$NON-NLS-2$ } else { text.append(" " + strings.getString("without")); //$NON-NLS-1$//$NON-NLS-2$ } text.append(" " + (multiplier - 1)); //$NON-NLS-1$ text.append(" " + strings.getString("play")); //$NON-NLS-1$//$NON-NLS-2$ text.append(" " + multiplier); //$NON-NLS-1$ } if (handGame) { text.append(" " + strings.getString("hand")); } if (ouvertGame) { text.append(" " + strings.getString("ouvert")); } if (schneiderAnnounced) { text.append(" " + strings.getString("schneider_announced")); } else if (schneider) { text.append(" " + strings.getString("schneider")); } if (schwarzAnnounced) { text.append(" " + strings.getString("schwarz_announced")); } else if (schwarz) { text.append(" " + strings.getString("schwarz")); } if (contra) { text.append(" " + strings.getString("contra")); } if (re) { text.append(" " + strings.getString("re")); } if (overBidded) { text.append(" " + strings.getString("overbidded")); } text.append("]"); //$NON-NLS-1$ } } private void appendGameNumber(StringBuffer text) { if (gameNumber > 0) { text.append(strings.getString("game") + " " + gameNumber + ": "); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ } } void setGameSummary(final GameSummary summary) { multiplier = summary.getGameMultiplier(); playWithJacks = summary.isGamePlayedWithJacks(); gameWon = summary.isGameWon(); declarerPoints = summary.getFinalDeclarerPoints(); opponentPoints = summary.getFinalOpponentScore(); ramschLoosers = summary.getRamschLosers(); overBidded = summary.gameResult.isOverBidded(); schneider = summary.gameResult.isSchneider(); schwarz = summary.gameResult.isSchwarz(); refreshText(); } String getGameStateString(final GameState state) { String result = null; switch (state) { case BIDDING: result = strings.getString("bidding_phase"); //$NON-NLS-1$ break; case CALCULATING_GAME_VALUE: result = strings.getString("calc_game_value_phase"); //$NON-NLS-1$ break; case DEALING: result = strings.getString("dealing_phase"); //$NON-NLS-1$ break; case DECLARING: result = strings.getString("declaring_phase"); //$NON-NLS-1$ break; case DISCARDING: result = strings.getString("discarding_phase"); //$NON-NLS-1$ break; case GAME_OVER: result = strings.getString("game_over_phase"); //$NON-NLS-1$ break; case GAME_START: result = strings.getString("game_start_phase"); //$NON-NLS-1$ break; case PICKING_UP_SKAT: case RAMSCH_GRAND_HAND_ANNOUNCING: case SCHIEBERAMSCH: result = strings.getString("pick_up_skat_phase"); //$NON-NLS-1$ break; case PRELIMINARY_GAME_END: result = strings.getString("preliminary_game_end_phase"); //$NON-NLS-1$ break; case TRICK_PLAYING: result = strings.getString("trick_playing_phase"); //$NON-NLS-1$ break; case CONTRA: result = strings.getString("contra_or_play_phase"); break; case RE: result = strings.getString("re_or_play_phase"); break; default: result = state.name(); break; } return result; } /** * Sets the trick number * * @param trickNumber * Trick number */ public void setTrickNumber(final int trickNumber) { trick = trickNumber; refreshText(); } /** * Sets the game number * * @param newGameNumber * Game number */ public void setGameNumber(final int newGameNumber) { gameNumber = newGameNumber; refreshText(); } public void setContra() { contra = true; refreshText(); } public void setRe() { re = true; refreshText(); } }