diff options
Diffstat (limited to 'src/jrummikub/view/impl/TablePanel.java')
-rw-r--r-- | src/jrummikub/view/impl/TablePanel.java | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/src/jrummikub/view/impl/TablePanel.java b/src/jrummikub/view/impl/TablePanel.java new file mode 100644 index 0000000..b02a9a9 --- /dev/null +++ b/src/jrummikub/view/impl/TablePanel.java @@ -0,0 +1,171 @@ +package jrummikub.view.impl; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Insets; +import java.awt.RenderingHints; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; + +import javax.swing.ImageIcon; +import javax.swing.JLabel; + +import jrummikub.model.Position; +import jrummikub.model.Stone; +import jrummikub.model.StoneSet; +import jrummikub.view.IStoneCollectionPanel; +import jrummikub.view.ITablePanel; + +/** + * The implementation of the table + */ +@SuppressWarnings("serial") +class TablePanel extends AbstractStonePanel implements ITablePanel { + private final static ImageIcon background = new ImageIcon( + HandPanel.class.getResource("/jrummikub/resource/felt.png")); + + private final static float DEFAULT_SCALE = 1; + private final int COLLECTION_GAP = 5; + + private JLabel leftPlayerLabel, topPlayerLabel, rightPlayerLabel; + private StoneCollectionPanel stoneCollection; + + private Map<StoneSet, Position> stoneSets = Collections.emptyMap(); + private Collection<Stone> selectedStones = Collections.emptyList(); + + @Override + public void setLeftPlayerName(String playerName) { + leftPlayerLabel.setText(playerName); + } + + @Override + public void setTopPlayerName(String playerName) { + topPlayerLabel.setText(playerName); + } + + @Override + public void setRightPlayerName(String playerName) { + rightPlayerLabel.setText(playerName); + } + + @Override + public void setStoneSets(Map<StoneSet, Position> stoneSets) { + this.stoneSets = stoneSets; + repaint(); + } + + @Override + public IStoneCollectionPanel getStoneCollectionPanel() { + return stoneCollection; + } + + /** + * Sets the currently selected stones + * + * @param stones + * the selected stones + */ + void setSelectedStones(Collection<Stone> stones) { + selectedStones = stones; + stoneCollection.setSelectedStones(stones); + repaint(); + } + + private void rescale() { + Insets insets = getInsets(); + int x = insets.left, y = insets.top, width = getWidth() - insets.left + - insets.right, height = getHeight() - insets.top - insets.bottom; + + leftPlayerLabel.setBounds(x, y, width, height); + topPlayerLabel.setBounds(x, y, width, height); + rightPlayerLabel.setBounds(x, y, width, height); + + stoneCollection.setLocation(x + width / 2 - stoneCollection.getWidth() / 2, + y + height - stoneCollection.getHeight() - COLLECTION_GAP); + } + + /** + * Creates a new Table instance + */ + TablePanel() { + super(DEFAULT_SCALE); + + setLayout(null); + + leftPlayerLabel = new JLabel(); + leftPlayerLabel.setForeground(Color.WHITE); + leftPlayerLabel.setHorizontalAlignment(JLabel.LEFT); + leftPlayerLabel.setHorizontalTextPosition(JLabel.LEFT); + add(leftPlayerLabel); + + topPlayerLabel = new JLabel(); + topPlayerLabel.setHorizontalAlignment(JLabel.CENTER); + topPlayerLabel.setHorizontalTextPosition(JLabel.CENTER); + topPlayerLabel.setVerticalAlignment(JLabel.TOP); + topPlayerLabel.setVerticalTextPosition(JLabel.TOP); + topPlayerLabel.setForeground(Color.WHITE); + add(topPlayerLabel); + + rightPlayerLabel = new JLabel(); + rightPlayerLabel.setForeground(Color.WHITE); + rightPlayerLabel.setHorizontalAlignment(JLabel.RIGHT); + rightPlayerLabel.setHorizontalTextPosition(JLabel.RIGHT); + add(rightPlayerLabel); + + stoneCollection = new StoneCollectionPanel(); + add(stoneCollection); + + ComponentListener rescaleListener = new ComponentAdapter() { + @Override + public void componentResized(ComponentEvent e) { + rescale(); + } + }; + + addComponentListener(rescaleListener); + stoneCollection.addComponentListener(rescaleListener); + } + + private void paintStoneSet(Graphics2D g, StoneSet stoneSet, Position pos) { + float x = pos.getX(); + int width = getStonePainter().getStoneWidth(), height = getStonePainter() + .getStoneHeight(); + + g.setColor(new Color(0, 0, 0, 0.25f)); + g.fillRect((int) (x * width) - width / 4, (int) (pos.getY() * height), + width / 4, height); + + for (Stone stone : stoneSet) { + getStonePainter().paintStone(g, stone, new Position(x, pos.getY()), + selectedStones.contains(stone)); + x++; + } + + g.setColor(new Color(0, 0, 0, 0.25f)); + g.fillRect((int) (x * width), (int) (pos.getY() * height), width / 4, + height); + } + + @Override + protected void paintComponent(Graphics g1) { + Graphics2D g = (Graphics2D) g1; + + for (int x = 0; x < getWidth(); x += background.getIconWidth()) { + for (int y = 0; y < getHeight(); y += background.getIconHeight()) { + background.paintIcon(this, g, x, y); + } + } + + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + + for (Map.Entry<StoneSet, Position> stoneSet : stoneSets.entrySet()) { + paintStoneSet(g, stoneSet.getKey(), stoneSet.getValue()); + } + } +} |