RightPanelView.java

package org.microcol.gui;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import org.microcol.gui.event.FocusedTileEvent;
import org.microcol.model.Model;
import org.microcol.model.Player;

import com.google.common.base.Preconditions;
import com.google.inject.Inject;

/**
 * Draw right panel containing info about selected tile and selected unit.
 *
 */
public class RightPanelView extends JPanel implements RightPanelPresenter.Display, Localized {

	/**
	 * Default serialVersionUID.
	 */
	private static final long serialVersionUID = 1L;

	private final static int RIGHT_PANEL_WIDTH = 150;

	private final ImageProvider imageProvider;

	private final ImageIcon tileImage;

	private final JLabel tileOnMove;

	private final JLabel tileName;

	private final JLabel unitsLabel;

	private final JScrollPane scrollPaneGamePanel;

	private final UnitsPanel unitsPanel;

	private final JButton nextTurnButton;

	private final LocalizationHelper localizationHelper;

	@Inject
	public RightPanelView(final ImageProvider imageProvider, final UnitsPanel unitsPanel,
			final LocalizationHelper localizationHelper) {
		this.imageProvider = Preconditions.checkNotNull(imageProvider);
		this.unitsPanel = Preconditions.checkNotNull(unitsPanel);
		this.localizationHelper = Preconditions.checkNotNull(localizationHelper);
		this.setLayout(new GridBagLayout());

		// Y=0
		tileOnMove = new JLabel();
		add(tileOnMove, new GridBagConstraints(0, 0, 2, 1, 0D, 0D, GridBagConstraints.NORTH, GridBagConstraints.NONE,
				new Insets(0, 0, 0, 0), 0, 0));

		// Y=1
		tileImage = new ImageIcon();
		add(new JLabel(tileImage), new GridBagConstraints(0, 1, 1, 1, 0D, 0D, GridBagConstraints.NORTHWEST,
				GridBagConstraints.VERTICAL, new Insets(0, 0, 0, 0), 0, 0));
		tileName = new JLabel();
		add(tileName, new GridBagConstraints(1, 1, 1, 1, 0D, 0D, GridBagConstraints.NORTH, GridBagConstraints.NONE,
				new Insets(0, 0, 0, 0), 0, 0));

		// Y=2
		unitsLabel = new JLabel();
		add(unitsLabel, new GridBagConstraints(0, 2, 2, 1, 1D, 0D, GridBagConstraints.NORTHWEST,
				GridBagConstraints.HORIZONTAL, new Insets(10, 0, 5, 0), 0, 0));

		// Y=3
		scrollPaneGamePanel = new JScrollPane(unitsPanel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
				JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		add(scrollPaneGamePanel, new GridBagConstraints(0, 3, 2, 1, 1D, 1D, GridBagConstraints.NORTH,
				GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));

		// Y=10
		nextTurnButton = new JButton();
		nextTurnButton.setName("nextTurnButton");
		add(nextTurnButton, new GridBagConstraints(0, 10, 2, 1, 0D, 0D, GridBagConstraints.SOUTH,
				GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
		setPreferredSize(new Dimension(RIGHT_PANEL_WIDTH, 200));
		setMinimumSize(new Dimension(RIGHT_PANEL_WIDTH, 200));
		validate();
		unitsPanel.setMaximumSize(scrollPaneGamePanel.getViewport().getExtentSize());
		unitsPanel.setPreferredSize(scrollPaneGamePanel.getViewport().getExtentSize());
	}

	@Override
	public void showTile(final FocusedTileEvent event, final Model game) {
		setCurrentPlayer(game.getCurrentPlayer());
		tileImage.setImage(imageProvider.getTerrainImage(event.getTerrain()));
		StringBuilder sb = new StringBuilder(200);
		sb.append("<html><div>");
		sb.append(localizationHelper.getTerrainName(event.getTerrain()));
		sb.append("");
		sb.append("</div><div>");
		sb.append("Move cost: 1");
		sb.append("</div></html>");
		tileName.setText(sb.toString());
		unitsPanel.clear();
		if (game.getShipsAt(event.getLocation()).isEmpty()) {
			unitsLabel.setText("");
		} else {
			unitsLabel.setText(getText().get("unitsPanel.units"));
			unitsPanel.setUnits(game.getShipsAt(event.getLocation()));
		}
		repaint();
	}

	@Override
	public void setCurrentPlayer(final Player player) {
		StringBuilder sb = new StringBuilder(200);
		sb.append("<html><div>");
		sb.append(getText().get("unitsPanel.currentUser"));
		sb.append(" ");
		sb.append(player.getName());
		sb.append("</div></html>");
		tileOnMove.setText(sb.toString());
	}

	@Override
	public JButton getNextTurnButton() {
		return nextTurnButton;
	}

	@Override
	public JPanel getRightPanel() {
		return this;
	}

}