From bcc3f95847eafa1b61bb32dac047101c7adc0e64 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 3 May 2011 17:29:52 +0200 Subject: Make StonePanel emit Stone click events git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@80 72836036-5685-4462-b002-a69064685172 --- src/jrummikub/view/impl/AbstractStonePanel.java | 77 +++++++++++++++++++---- src/jrummikub/view/impl/HandPanel.java | 5 +- src/jrummikub/view/impl/StoneCollectionPanel.java | 27 +++++--- src/jrummikub/view/impl/TablePanel.java | 14 +++++ 4 files changed, 102 insertions(+), 21 deletions(-) (limited to 'src/jrummikub/view/impl') diff --git a/src/jrummikub/view/impl/AbstractStonePanel.java b/src/jrummikub/view/impl/AbstractStonePanel.java index 8ab18d8..19e5891 100644 --- a/src/jrummikub/view/impl/AbstractStonePanel.java +++ b/src/jrummikub/view/impl/AbstractStonePanel.java @@ -3,23 +3,33 @@ package jrummikub.view.impl; import java.awt.Insets; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.awt.geom.Rectangle2D; +import java.util.Collections; +import java.util.Map; import javax.swing.JPanel; import jrummikub.model.Position; +import jrummikub.model.Stone; +import jrummikub.util.Event1; import jrummikub.util.Event2; import jrummikub.view.IClickable; +import jrummikub.view.IStonePanel; /** * Base class for panels that draw stones */ @SuppressWarnings("serial") -abstract class AbstractStonePanel extends JPanel implements IClickable { +abstract class AbstractStonePanel extends JPanel implements IStonePanel, + IClickable { private StonePainter stonePainter; - private Event2 clickEvent = new Event2(); - private Event2 rangeClickEvent = new Event2(); - private Event2 setClickEvent = new Event2(); + private Event1 clickEvent = new Event1(); + private Event2 stoneClickEvent = new Event2(); + private Event2 rangeClickEvent = new Event2(); + private Event2 setClickEvent = new Event2(); + + private Map stones = Collections.emptyMap(); /** * @return the stone painter @@ -50,32 +60,77 @@ abstract class AbstractStonePanel extends JPanel implements IClickable { @Override public void mouseClicked(MouseEvent e) { Insets insets = getInsets(); - Event2 event = clickEvent; + Position pos = stonePainter.calculatePosition(e.getX() - insets.left, + e.getY() - insets.top); + Stone stone = getStoneAt(pos); + + if (stone == null) { + clickEvent.fire(pos); + return; + } + + Event2 event = stoneClickEvent; if (e.isShiftDown()) event = rangeClickEvent; else if (e.getClickCount() >= 2) event = setClickEvent; - event.fire( - stonePainter.calculatePosition(e.getX() - insets.left, e.getY() - - insets.top), e.isControlDown()); + event.fire(stone, e.isControlDown()); } }); } + private Stone getStoneAt(Position pos) { + for (Map.Entry entry : stones.entrySet()) { + Stone stone = entry.getKey(); + Position p = entry.getValue(); + Rectangle2D rect = new Rectangle2D.Float(p.getX(), p.getY(), + stone.getWidth(), stone.getHeight()); + + if (rect.contains(pos.getX(), pos.getY())) + return stone; + } + + return null; + } + + /** + * Sets the list of stones that can be clicked on + * + * @param stones + * the stones and positions + */ + protected void setStones(Map stones) { + this.stones = stones; + } + + /** + * Returns the list of stones and positions currently set + * + * @return the stones + */ + protected Map getStones() { + return stones; + } + @Override - public Event2 getClickEvent() { + public Event1 getClickEvent() { return clickEvent; } @Override - public Event2 getRangeClickEvent() { + public Event2 getStoneClickEvent() { + return stoneClickEvent; + } + + @Override + public Event2 getRangeClickEvent() { return rangeClickEvent; } @Override - public Event2 getSetClickEvent() { + public Event2 getSetClickEvent() { return setClickEvent; } diff --git a/src/jrummikub/view/impl/HandPanel.java b/src/jrummikub/view/impl/HandPanel.java index 1610c00..0533181 100644 --- a/src/jrummikub/view/impl/HandPanel.java +++ b/src/jrummikub/view/impl/HandPanel.java @@ -39,7 +39,6 @@ class HandPanel extends AbstractStonePanel implements IHandPanel { } private BufferedImage scaledBackground = BACKGROUND; - private Map stones = Collections.emptyMap(); private Collection selectedStones = Collections.emptyList(); /** @@ -97,7 +96,7 @@ class HandPanel extends AbstractStonePanel implements IHandPanel { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - for (Map.Entry entry : stones.entrySet()) { + for (Map.Entry entry : getStones().entrySet()) { getStonePainter().paintStone(g, entry.getKey(), entry.getValue(), selectedStones.contains(entry.getKey())); } @@ -105,7 +104,7 @@ class HandPanel extends AbstractStonePanel implements IHandPanel { @Override public void setStones(Map stones) { - this.stones = stones; + super.setStones(stones); repaint(); } diff --git a/src/jrummikub/view/impl/StoneCollectionPanel.java b/src/jrummikub/view/impl/StoneCollectionPanel.java index e4ca1c6..8729170 100644 --- a/src/jrummikub/view/impl/StoneCollectionPanel.java +++ b/src/jrummikub/view/impl/StoneCollectionPanel.java @@ -6,6 +6,8 @@ import java.awt.Graphics2D; import java.awt.Insets; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import javax.swing.border.EmptyBorder; @@ -17,7 +19,8 @@ import jrummikub.view.IStoneCollectionPanel; * Implementation of the stone collection (selection) */ @SuppressWarnings("serial") -class StoneCollectionPanel extends AbstractStonePanel implements IStoneCollectionPanel { +class StoneCollectionPanel extends AbstractStonePanel implements + IStoneCollectionPanel { private final static int INSET = 7; private final static float STONE_SCALE = 1.1f; @@ -37,17 +40,27 @@ class StoneCollectionPanel extends AbstractStonePanel implements IStoneCollectio /** * Sets the stones to be shown in the collection * - * @param stones + * @param selectedStones * the selected stones */ - void setSelectedStones(Collection stones) { - selectedStones = stones; + void setSelectedStones(Collection selectedStones) { + this.selectedStones = selectedStones; - if (stones.isEmpty()) { + Map stones = new HashMap(); + float x = 0; + + for (Stone stone : selectedStones) { + stones.put(stone, new Position(x, 0)); + x += stone.getWidth(); + } + + setStones(stones); + + if (selectedStones.isEmpty()) { setVisible(false); } else { - setSize(getStonePainter().getStoneWidth() * stones.size() + 2 * INSET, - getStonePainter().getStoneHeight() + 2 * INSET); + setSize(getStonePainter().getStoneWidth() * selectedStones.size() + 2 + * INSET, getStonePainter().getStoneHeight() + 2 * INSET); setVisible(true); repaint(); diff --git a/src/jrummikub/view/impl/TablePanel.java b/src/jrummikub/view/impl/TablePanel.java index b02a9a9..3eb33d8 100644 --- a/src/jrummikub/view/impl/TablePanel.java +++ b/src/jrummikub/view/impl/TablePanel.java @@ -10,6 +10,7 @@ import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.Map; import javax.swing.ImageIcon; @@ -55,7 +56,20 @@ class TablePanel extends AbstractStonePanel implements ITablePanel { @Override public void setStoneSets(Map stoneSets) { + Map stones = new HashMap(); + + for (Map.Entry 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(); } -- cgit v1.2.3