diff options
author | Bennet Gerlach <bennet_gerlach@web.de> | 2011-05-03 20:39:21 +0200 |
---|---|---|
committer | Bennet Gerlach <bennet_gerlach@web.de> | 2011-05-03 20:39:21 +0200 |
commit | 344d63598afa6aea19e1975d4253bb11dfef6182 (patch) | |
tree | 9f1cddaf52635cbc49e1efde8b810c59c9ad9fe4 /src/jrummikub/view/impl/TablePanel.java | |
parent | e7613bfd930290025b4c5abaf4acf63683efd5f2 (diff) | |
download | JRummikub-344d63598afa6aea19e1975d4253bb11dfef6182.tar JRummikub-344d63598afa6aea19e1975d4253bb11dfef6182.zip |
Added connector click events
git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@94 72836036-5685-4462-b002-a69064685172
Diffstat (limited to 'src/jrummikub/view/impl/TablePanel.java')
-rw-r--r-- | src/jrummikub/view/impl/TablePanel.java | 350 |
1 files changed, 195 insertions, 155 deletions
diff --git a/src/jrummikub/view/impl/TablePanel.java b/src/jrummikub/view/impl/TablePanel.java index 3eb33d8..6a91b41 100644 --- a/src/jrummikub/view/impl/TablePanel.java +++ b/src/jrummikub/view/impl/TablePanel.java @@ -8,6 +8,7 @@ import java.awt.RenderingHints; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; +import java.awt.geom.Rectangle2D; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -19,6 +20,7 @@ import javax.swing.JLabel; import jrummikub.model.Position; import jrummikub.model.Stone; import jrummikub.model.StoneSet; +import jrummikub.util.Event1; import jrummikub.view.IStoneCollectionPanel; import jrummikub.view.ITablePanel; @@ -27,159 +29,197 @@ import jrummikub.view.ITablePanel; */ @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) { - Map<Stone, Position> stones = new HashMap<Stone, Position>(); - - for (Map.Entry<StoneSet, Position> entry : stoneSets.entrySet()) { - float x = entry.getValue().getX(), y = entry.getValue().getY(); - - for (Stone stone : entry.getKey()) { - stones.put(stone, new Position(x, y)); - x += stone.getWidth(); - } - } - - setStones(stones); - 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()); - } - } + private final static ImageIcon background = new ImageIcon( + HandPanel.class.getResource("/jrummikub/resource/felt.png")); + + private final static float DEFAULT_SCALE = 1; + private final static float CONNECTOR_WIDTH = 0.25f; + 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(); + + private Event1<StoneSet> leftConnectorClickEvent = new Event1<StoneSet>(); + private Event1<StoneSet> rightConnectorClickEvent = new Event1<StoneSet>(); + + @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 Event1<StoneSet> getLeftConnectorClickEvent() { + return leftConnectorClickEvent; + } + + @Override + public Event1<StoneSet> getRightConnectorClickEvent() { + return rightConnectorClickEvent; + } + + @Override + public void setStoneSets(Map<StoneSet, Position> stoneSets) { + Map<Stone, Position> stones = new HashMap<Stone, Position>(); + + for (Map.Entry<StoneSet, Position> entry : stoneSets.entrySet()) { + float x = entry.getValue().getX(), y = entry.getValue().getY(); + + for (Stone stone : entry.getKey()) { + stones.put(stone, new Position(x, y)); + x++; + } + } + + setStones(stones); + 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); + } + + protected boolean handleOtherClickEvent(Position pos) { + for (Map.Entry<StoneSet, Position> entry : stoneSets.entrySet()) { + Position p = entry.getValue(); + StoneSet stoneSet = entry.getKey(); + float x = p.getX(), y = p.getY(); + + // left connector + Rectangle2D rect = new Rectangle2D.Float(x - CONNECTOR_WIDTH, y, + CONNECTOR_WIDTH, 1); + if (rect.contains(pos.getX(), pos.getY())) { + leftConnectorClickEvent.emit(stoneSet); + return true; + } + + // right connector + rect = new Rectangle2D.Float(x + stoneSet.size(), y, CONNECTOR_WIDTH, 1); + if (rect.contains(pos.getX(), pos.getY())) { + rightConnectorClickEvent.emit(stoneSet); + return true; + } + } + return false; + } + + 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 * CONNECTOR_WIDTH), + (int) (pos.getY() * height), (int) (width * CONNECTOR_WIDTH), 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), + (int) (width * CONNECTOR_WIDTH), 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> entry : stoneSets.entrySet()) { + paintStoneSet(g, entry.getKey(), entry.getValue()); + } + } } |