diff options
Diffstat (limited to 'src/jrummikub/view')
-rw-r--r-- | src/jrummikub/view/IClickable.java | 26 | ||||
-rw-r--r-- | src/jrummikub/view/IHandPanel.java | 2 | ||||
-rw-r--r-- | src/jrummikub/view/IStoneCollectionPanel.java | 2 | ||||
-rw-r--r-- | src/jrummikub/view/IStonePanel.java | 38 | ||||
-rw-r--r-- | src/jrummikub/view/ITablePanel.java | 2 | ||||
-rw-r--r-- | src/jrummikub/view/impl/AbstractStonePanel.java | 77 | ||||
-rw-r--r-- | src/jrummikub/view/impl/HandPanel.java | 5 | ||||
-rw-r--r-- | src/jrummikub/view/impl/StoneCollectionPanel.java | 27 | ||||
-rw-r--r-- | src/jrummikub/view/impl/TablePanel.java | 14 |
9 files changed, 146 insertions, 47 deletions
diff --git a/src/jrummikub/view/IClickable.java b/src/jrummikub/view/IClickable.java index c827042..4f44b5e 100644 --- a/src/jrummikub/view/IClickable.java +++ b/src/jrummikub/view/IClickable.java @@ -1,38 +1,18 @@ package jrummikub.view; import jrummikub.model.Position; -import jrummikub.util.IEvent2; +import jrummikub.util.IEvent1; /** * An interface for view elements that can emit click events */ public interface IClickable { /** - * the click event is emitted when the player clicks on the table/board/etc. + * the click event is emitted when the player clicks on the table/hand/etc. * * @return the event; the first parameter is the position of the click in grid * coordinates, the second is true when the player wants to add stones * to his selection instead of replacing them */ - public IEvent2<Position, Boolean> getClickEvent(); - - /** - * the range click event is emitted when the player clicks on the table/board/ - * etc. and wants to select a range instead of a single stone - * - * @return the event; the first parameter is the position of the click in grid - * coordinates, the second is true when the player wants to add stones - * to his selection instead of replacing them - */ - public IEvent2<Position, Boolean> getRangeClickEvent(); - - /** - * the set click event is emitted when the player clicks on the table/board/ - * etc. and wants to select a whole set instead of a single stone - * - * @return the event; the first parameter is the position of the click in grid - * coordinates, the second is true when the player wants to add stones - * to his selection instead of replacing them - */ - public IEvent2<Position, Boolean> getSetClickEvent(); + public IEvent1<Position> getClickEvent(); } diff --git a/src/jrummikub/view/IHandPanel.java b/src/jrummikub/view/IHandPanel.java index 4573b93..23cd0ca 100644 --- a/src/jrummikub/view/IHandPanel.java +++ b/src/jrummikub/view/IHandPanel.java @@ -8,7 +8,7 @@ import jrummikub.model.Stone; /** * The view for a player's hand that displays his stones */ -public interface IHandPanel extends IClickable { +public interface IHandPanel extends IStonePanel, IClickable { /** * Set the player's stones to display on the board * diff --git a/src/jrummikub/view/IStoneCollectionPanel.java b/src/jrummikub/view/IStoneCollectionPanel.java index 4c84508..5fa234c 100644 --- a/src/jrummikub/view/IStoneCollectionPanel.java +++ b/src/jrummikub/view/IStoneCollectionPanel.java @@ -3,5 +3,5 @@ package jrummikub.view; /** * The view of the collection that shows the stones a player has selected */ -public interface IStoneCollectionPanel extends IClickable { +public interface IStoneCollectionPanel extends IStonePanel { } diff --git a/src/jrummikub/view/IStonePanel.java b/src/jrummikub/view/IStonePanel.java new file mode 100644 index 0000000..6720902 --- /dev/null +++ b/src/jrummikub/view/IStonePanel.java @@ -0,0 +1,38 @@ +package jrummikub.view; + +import jrummikub.model.Stone; +import jrummikub.util.IEvent2; + +/** + * An interface for view elements that can emit click events for clicks on stones + */ +public interface IStonePanel { + /** + * the click event is emitted when the player clicks on the table/hand/etc. + * + * @return the event; the first parameter is the position of the click in grid + * coordinates, the second is true when the player wants to add stones + * to his selection instead of replacing them + */ + public IEvent2<Stone, Boolean> getStoneClickEvent(); + + /** + * the range click event is emitted when the player clicks on the table/hand/ + * etc. and wants to select a range instead of a single stone + * + * @return the event; the first parameter is the position of the click in grid + * coordinates, the second is true when the player wants to add stones + * to his selection instead of replacing them + */ + public IEvent2<Stone, Boolean> getRangeClickEvent(); + + /** + * the set click event is emitted when the player clicks on the table/hand/ + * etc. and wants to select a whole set instead of a single stone + * + * @return the event; the first parameter is the position of the click in grid + * coordinates, the second is true when the player wants to add stones + * to his selection instead of replacing them + */ + public IEvent2<Stone, Boolean> getSetClickEvent(); +} diff --git a/src/jrummikub/view/ITablePanel.java b/src/jrummikub/view/ITablePanel.java index 48eb357..ec7f3ea 100644 --- a/src/jrummikub/view/ITablePanel.java +++ b/src/jrummikub/view/ITablePanel.java @@ -8,7 +8,7 @@ import jrummikub.model.StoneSet; /** * The view of the table, where the stone sets lie */ -public interface ITablePanel extends IClickable { +public interface ITablePanel extends IStonePanel, IClickable { /** * Sets the player name on the left label * 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<Position, Boolean> clickEvent = new Event2<Position, Boolean>(); - private Event2<Position, Boolean> rangeClickEvent = new Event2<Position, Boolean>(); - private Event2<Position, Boolean> setClickEvent = new Event2<Position, Boolean>(); + private Event1<Position> clickEvent = new Event1<Position>(); + private Event2<Stone, Boolean> stoneClickEvent = new Event2<Stone, Boolean>(); + private Event2<Stone, Boolean> rangeClickEvent = new Event2<Stone, Boolean>(); + private Event2<Stone, Boolean> setClickEvent = new Event2<Stone, Boolean>(); + + private Map<Stone, Position> 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<Position, Boolean> 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<Stone, Boolean> 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<Stone, Position> 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<Stone, Position> stones) { + this.stones = stones; + } + + /** + * Returns the list of stones and positions currently set + * + * @return the stones + */ + protected Map<Stone, Position> getStones() { + return stones; + } + @Override - public Event2<Position, Boolean> getClickEvent() { + public Event1<Position> getClickEvent() { return clickEvent; } @Override - public Event2<Position, Boolean> getRangeClickEvent() { + public Event2<Stone, Boolean> getStoneClickEvent() { + return stoneClickEvent; + } + + @Override + public Event2<Stone, Boolean> getRangeClickEvent() { return rangeClickEvent; } @Override - public Event2<Position, Boolean> getSetClickEvent() { + public Event2<Stone, Boolean> 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<Stone, Position> stones = Collections.emptyMap(); private Collection<Stone> 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<Stone, Position> entry : stones.entrySet()) { + for (Map.Entry<Stone, Position> 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<Stone, Position> 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<Stone> stones) { - selectedStones = stones; + void setSelectedStones(Collection<Stone> selectedStones) { + this.selectedStones = selectedStones; - if (stones.isEmpty()) { + Map<Stone, Position> stones = new HashMap<Stone, Position>(); + 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<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(); } |