diff options
-rw-r--r-- | src/jrummikub/JRummikub.java | 371 | ||||
-rw-r--r-- | src/jrummikub/view/impl/AbstractStonePanel.java | 19 | ||||
-rw-r--r-- | src/jrummikub/view/impl/TablePanel.java | 62 |
3 files changed, 249 insertions, 203 deletions
diff --git a/src/jrummikub/JRummikub.java b/src/jrummikub/JRummikub.java index 1c2ef63..0765dd5 100644 --- a/src/jrummikub/JRummikub.java +++ b/src/jrummikub/JRummikub.java @@ -19,191 +19,190 @@ import jrummikub.view.IView; public class JRummikub { - /** - * @param args - */ - public static void main(String[] args) { - String nativeLF = UIManager.getSystemLookAndFeelClassName(); - - try { - UIManager.setLookAndFeel(nativeLF); - } catch (Exception e) { - } - - IView view = new jrummikub.view.impl.View(); - - view.getPlayerPanel().setCurrentPlayerName("Player 1"); - view.getPlayerPanel().setTimeLeft(42); - view.getTablePanel().setLeftPlayerName("Player 2"); - view.getTablePanel().setTopPlayerName("Player 3"); - view.getTablePanel().setRightPlayerName("Player 4"); - - view.getPlayerPanel().getSortByGroupsEvent().add(new IListener() { - @Override - public void handle() { - System.out.println("'Sort by groups' fired"); - } - }); - view.getPlayerPanel().getSortByRunsEvent().add(new IListener() { - @Override - public void handle() { - System.out.println("'Sort by runs' fired"); - } - }); - view.getPlayerPanel().getEndTurnEvent().add(new IListener() { - @Override - public void handle() { - System.out.println("'End turn' fired"); - } - }); - - // stones on the board - Map<Stone, Position> stones = new HashMap<Stone, Position>(); - stones.put(new Stone(1, StoneColor.ORANGE), new Position(0, 0)); - stones.put(new Stone(10, StoneColor.BLUE), new Position(1, 0)); - stones.put(new Stone(9, StoneColor.RED), new Position(0.5f, 1)); - stones.put(new Stone(7, StoneColor.BLACK), new Position(1.75f, 1)); - - Stone stoneJoker = new Stone(StoneColor.RED); - stones.put(stoneJoker, new Position(2.5f, 0)); - stones.put(new Stone(StoneColor.BLACK), new Position(3.5f, 0)); - - view.getPlayerPanel().getHandPanel().setStones(stones); - - view.getPlayerPanel().getHandPanel().getClickEvent() - .add(new IListener1<Position>() { - @Override - public void handle(Position p) { - System.out.println("Hand clicked at " + p); - } - }); - view.getPlayerPanel().getHandPanel().getStoneClickEvent() - .add(new IListener2<Stone, Boolean>() { - @Override - public void handle(Stone s, Boolean collect) { - System.out.println("Hand clicked on " + s - + (collect ? ", collect" : "")); - - } - }); - view.getPlayerPanel().getHandPanel().getRangeClickEvent() - .add(new IListener2<Stone, Boolean>() { - @Override - public void handle(Stone s, Boolean collect) { - System.out.println("Hand range-clicked on " + s - + (collect ? ", collect" : "")); - - } - }); - view.getPlayerPanel().getHandPanel().getSetClickEvent() - .add(new IListener2<Stone, Boolean>() { - @Override - public void handle(Stone s, Boolean collect) { - System.out.println("Hand set-clicked at " + s - + (collect ? ", collect" : "")); - - } - }); - - view.getTablePanel().getClickEvent() - .add(new IListener1<Position>() { - @Override - public void handle(Position p) { - System.out.println("Table clicked at " + p); - } - }); - view.getTablePanel().getStoneClickEvent() - .add(new IListener2<Stone, Boolean>() { - @Override - public void handle(Stone s, Boolean collect) { - System.out.println("Table clicked on " + s - + (collect ? ", collect" : "")); - - } - }); - view.getTablePanel().getRangeClickEvent() - .add(new IListener2<Stone, Boolean>() { - @Override - public void handle(Stone s, Boolean collect) { - System.out.println("Table range-clicked on " + s - + (collect ? ", collect" : "")); - - } - }); - view.getTablePanel().getSetClickEvent() - .add(new IListener2<Stone, Boolean>() { - @Override - public void handle(Stone s, Boolean collect) { - System.out.println("Table set-clicked at " + s - + (collect ? ", collect" : "")); - - } - }); - - view.getTablePanel().getLeftConnectorClickEvent() - .add(new IListener1<StoneSet>() { - @Override - public void handle(StoneSet s) { - System.out.println("Left connector clicked on " + s); - } - }); - - view.getTablePanel().getRightConnectorClickEvent() - .add(new IListener1<StoneSet>() { - @Override - public void handle(StoneSet s) { - System.out.println("Right connector clicked on " + s); - } - }); - - view.getTablePanel().getStoneCollectionPanel().getStoneClickEvent() - .add(new IListener2<Stone, Boolean>() { - @Override - public void handle(Stone s, Boolean collect) { - System.out.println("Collection clicked on " + s - + (collect ? ", collect" : "")); - - } - }); - - view.getTablePanel().getStoneCollectionPanel().getRangeClickEvent() - .add(new IListener2<Stone, Boolean>() { - @Override - public void handle(Stone s, Boolean collect) { - System.out.println("Collection range-clicked on " + s - + (collect ? ", collect" : "")); - - } - }); - view.getTablePanel().getStoneCollectionPanel().getSetClickEvent() - .add(new IListener2<Stone, Boolean>() { - @Override - public void handle(Stone s, Boolean collect) { - System.out.println("Collection set-clicked at " + s - + (collect ? ", collect" : "")); - - } - }); - - // stoneSets on the table - Map<StoneSet, Position> stoneSets = new HashMap<StoneSet, Position>(); - - stoneSets.put(new StoneSet(new Stone(5, StoneColor.ORANGE)), new Position( - 0.5f, 1)); - - List<Stone> stoneList = new ArrayList<Stone>(); - - stoneList.add(new Stone(7, StoneColor.BLACK)); - Stone stone8 = new Stone(8, StoneColor.BLACK); - stoneList.add(stone8); - stoneList.add(new Stone(9, StoneColor.BLACK)); - stoneList.add(new Stone(10, StoneColor.BLACK)); - - stoneSets.put(new StoneSet(stoneList), new Position(3.5f, 4)); - - view.getTablePanel().setStoneSets(stoneSets); - - view.setSelectedStones(Arrays.asList(stoneJoker, stone8)); - } + /** + * @param args + */ + public static void main(String[] args) { + String nativeLF = UIManager.getSystemLookAndFeelClassName(); + + try { + UIManager.setLookAndFeel(nativeLF); + } catch (Exception e) { + } + + IView view = new jrummikub.view.impl.View(); + + view.getPlayerPanel().setCurrentPlayerName("Player 1"); + view.getPlayerPanel().setTimeLeft(42); + view.getTablePanel().setLeftPlayerName("Player 2"); + view.getTablePanel().setTopPlayerName("Player 3"); + view.getTablePanel().setRightPlayerName("Player 4"); + + view.getPlayerPanel().getSortByGroupsEvent().add(new IListener() { + @Override + public void handle() { + System.out.println("'Sort by groups' fired"); + } + }); + view.getPlayerPanel().getSortByRunsEvent().add(new IListener() { + @Override + public void handle() { + System.out.println("'Sort by runs' fired"); + } + }); + view.getPlayerPanel().getEndTurnEvent().add(new IListener() { + @Override + public void handle() { + System.out.println("'End turn' fired"); + } + }); + + // stones on the board + Map<Stone, Position> stones = new HashMap<Stone, Position>(); + stones.put(new Stone(1, StoneColor.ORANGE), new Position(0, 0)); + stones.put(new Stone(10, StoneColor.BLUE), new Position(1, 0)); + stones.put(new Stone(9, StoneColor.RED), new Position(0.5f, 1)); + stones.put(new Stone(7, StoneColor.BLACK), new Position(1.75f, 1)); + + Stone stoneJoker = new Stone(StoneColor.RED); + stones.put(stoneJoker, new Position(2.5f, 0)); + stones.put(new Stone(StoneColor.BLACK), new Position(3.5f, 0)); + + view.getPlayerPanel().getHandPanel().setStones(stones); + + view.getPlayerPanel().getHandPanel().getClickEvent() + .add(new IListener1<Position>() { + @Override + public void handle(Position p) { + System.out.println("Hand clicked at " + p); + } + }); + view.getPlayerPanel().getHandPanel().getStoneClickEvent() + .add(new IListener2<Stone, Boolean>() { + @Override + public void handle(Stone s, Boolean collect) { + System.out.println("Hand clicked on " + s + + (collect ? ", collect" : "")); + + } + }); + view.getPlayerPanel().getHandPanel().getRangeClickEvent() + .add(new IListener2<Stone, Boolean>() { + @Override + public void handle(Stone s, Boolean collect) { + System.out.println("Hand range-clicked on " + s + + (collect ? ", collect" : "")); + + } + }); + view.getPlayerPanel().getHandPanel().getSetClickEvent() + .add(new IListener2<Stone, Boolean>() { + @Override + public void handle(Stone s, Boolean collect) { + System.out.println("Hand set-clicked at " + s + + (collect ? ", collect" : "")); + + } + }); + + view.getTablePanel().getClickEvent().add(new IListener1<Position>() { + @Override + public void handle(Position p) { + System.out.println("Table clicked at " + p); + } + }); + view.getTablePanel().getStoneClickEvent() + .add(new IListener2<Stone, Boolean>() { + @Override + public void handle(Stone s, Boolean collect) { + System.out.println("Table clicked on " + s + + (collect ? ", collect" : "")); + + } + }); + view.getTablePanel().getRangeClickEvent() + .add(new IListener2<Stone, Boolean>() { + @Override + public void handle(Stone s, Boolean collect) { + System.out.println("Table range-clicked on " + s + + (collect ? ", collect" : "")); + + } + }); + view.getTablePanel().getSetClickEvent() + .add(new IListener2<Stone, Boolean>() { + @Override + public void handle(Stone s, Boolean collect) { + System.out.println("Table set-clicked at " + s + + (collect ? ", collect" : "")); + + } + }); + + view.getTablePanel().getLeftConnectorClickEvent() + .add(new IListener1<StoneSet>() { + @Override + public void handle(StoneSet s) { + System.out.println("Left connector clicked on " + s); + } + }); + + view.getTablePanel().getRightConnectorClickEvent() + .add(new IListener1<StoneSet>() { + @Override + public void handle(StoneSet s) { + System.out.println("Right connector clicked on " + s); + } + }); + + view.getTablePanel().getStoneCollectionPanel().getStoneClickEvent() + .add(new IListener2<Stone, Boolean>() { + @Override + public void handle(Stone s, Boolean collect) { + System.out.println("Collection clicked on " + s + + (collect ? ", collect" : "")); + + } + }); + + view.getTablePanel().getStoneCollectionPanel().getRangeClickEvent() + .add(new IListener2<Stone, Boolean>() { + @Override + public void handle(Stone s, Boolean collect) { + System.out.println("Collection range-clicked on " + s + + (collect ? ", collect" : "")); + + } + }); + view.getTablePanel().getStoneCollectionPanel().getSetClickEvent() + .add(new IListener2<Stone, Boolean>() { + @Override + public void handle(Stone s, Boolean collect) { + System.out.println("Collection set-clicked at " + s + + (collect ? ", collect" : "")); + + } + }); + + // stoneSets on the table + Map<StoneSet, Position> stoneSets = new HashMap<StoneSet, Position>(); + + stoneSets.put(new StoneSet(new Stone(5, StoneColor.ORANGE)), new Position( + 0.5f, 1)); + + List<Stone> stoneList = new ArrayList<Stone>(); + + stoneList.add(new Stone(7, StoneColor.BLACK)); + Stone stone8 = new Stone(8, StoneColor.BLACK); + stoneList.add(stone8); + stoneList.add(new Stone(9, StoneColor.BLACK)); + stoneList.add(new Stone(10, StoneColor.BLACK)); + + stoneSets.put(new StoneSet(stoneList), new Position(3.5f, 4)); + + view.getTablePanel().setStoneSets(stoneSets); + + view.setSelectedStones(Arrays.asList(stoneJoker, stone8)); + } } diff --git a/src/jrummikub/view/impl/AbstractStonePanel.java b/src/jrummikub/view/impl/AbstractStonePanel.java index 68818cf..e858662 100644 --- a/src/jrummikub/view/impl/AbstractStonePanel.java +++ b/src/jrummikub/view/impl/AbstractStonePanel.java @@ -13,6 +13,7 @@ import jrummikub.model.Position; import jrummikub.model.Stone; import jrummikub.util.Event1; import jrummikub.util.Event2; +import jrummikub.util.Pair; import jrummikub.view.IClickable; import jrummikub.view.IStonePanel; @@ -60,8 +61,9 @@ abstract class AbstractStonePanel extends JPanel implements IStonePanel, @Override public void mouseClicked(MouseEvent e) { Insets insets = getInsets(); - Position pos = stonePainter.calculatePosition(e.getX() - insets.left, - e.getY() - insets.top); + Pair<Integer, Integer> trans = getTranslation(); + Position pos = stonePainter.calculatePosition(e.getX() - insets.left + - trans.getFirst(), e.getY() - insets.top - trans.getSecond()); Stone stone = getStoneAt(pos); if (stone == null) { @@ -85,7 +87,9 @@ abstract class AbstractStonePanel extends JPanel implements IStonePanel, /** * *Overwrite this method* to signal if special zone was clicked - * @param pos the clicked position + * + * @param pos + * the clicked position * * @return special zone clicked */ @@ -117,6 +121,15 @@ abstract class AbstractStonePanel extends JPanel implements IStonePanel, } /** + * Returns the translation in pixels the stones in this panel are painted with + * + * @return the translation + */ + protected Pair<Integer, Integer> getTranslation() { + return new Pair<Integer, Integer>(0, 0); + } + + /** * Returns the list of stones and positions currently set * * @return the stones diff --git a/src/jrummikub/view/impl/TablePanel.java b/src/jrummikub/view/impl/TablePanel.java index 02d67dc..dbe5496 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.AffineTransform; import java.awt.geom.Rectangle2D; import java.util.Collection; import java.util.Collections; @@ -21,6 +22,7 @@ import jrummikub.model.Position; import jrummikub.model.Stone; import jrummikub.model.StoneSet; import jrummikub.util.Event1; +import jrummikub.util.Pair; import jrummikub.view.IStoneCollectionPanel; import jrummikub.view.ITablePanel; @@ -34,6 +36,8 @@ class TablePanel extends AbstractStonePanel implements ITablePanel { private final static float MIN_VISIBLE_WIDTH = 15; private final static float MIN_VISIBLE_HEIGHT = 7.5f; + private final static float HORIZONTAL_MARGIN = 1.5f; + private final static float VERTICAL_MARGIN = 1; private final static float CONNECTOR_WIDTH = 0.25f; private final int COLLECTION_GAP = 5; @@ -107,18 +111,7 @@ class TablePanel extends AbstractStonePanel implements ITablePanel { 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); - + private Rectangle2D calculateTableExtent() { float minx = -MIN_VISIBLE_WIDTH / 2, maxx = MIN_VISIBLE_WIDTH / 2; float miny = -MIN_VISIBLE_HEIGHT / 2, maxy = MIN_VISIBLE_HEIGHT / 2; @@ -139,8 +132,29 @@ class TablePanel extends AbstractStonePanel implements ITablePanel { maxy = p.getY() + 1; } - float widthScale = width / (maxx - minx) * StonePainter.WIDTH_SCALE; - float heightScale = height / (maxy - miny) * StonePainter.HEIGHT_SCALE; + return new Rectangle2D.Float(minx - HORIZONTAL_MARGIN, miny + - VERTICAL_MARGIN, maxx - minx + 2 * HORIZONTAL_MARGIN, maxy - miny + 2 + * VERTICAL_MARGIN); + } + + 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); + + Rectangle2D extent = calculateTableExtent(); + + float widthScale = width / (float) extent.getWidth() + * StonePainter.WIDTH_SCALE; + float heightScale = height / (float) extent.getHeight() + * StonePainter.HEIGHT_SCALE; getStonePainter().setScale(Math.min(widthScale, heightScale)); @@ -211,6 +225,19 @@ class TablePanel extends AbstractStonePanel implements ITablePanel { return false; } + @Override + protected Pair<Integer, Integer> getTranslation() { + Insets insets = getInsets(); + int width = getWidth() - insets.left - insets.right, height = getHeight() + - insets.top - insets.bottom; + int stoneWidth = getStonePainter().getStoneWidth(), stoneHeight = getStonePainter() + .getStoneHeight(); + Rectangle2D extent = calculateTableExtent(); + + return new Pair<Integer, Integer>((int) (width / 2 - extent.getCenterX() + * stoneWidth), (int) (height / 2 - extent.getCenterY() * stoneHeight)); + } + private void paintStoneSet(Graphics2D g, StoneSet stoneSet, Position pos) { float x = pos.getX(); int width = getStonePainter().getStoneWidth(), height = getStonePainter() @@ -241,11 +268,18 @@ class TablePanel extends AbstractStonePanel implements ITablePanel { } } + AffineTransform oldTransform = g.getTransform(); + + Pair<Integer, Integer> translation = getTranslation(); + g.translate(translation.getFirst(), translation.getSecond()); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); for (Map.Entry<StoneSet, Position> entry : stoneSets.entrySet()) { paintStoneSet(g, entry.getKey(), entry.getValue()); } + + g.setTransform(oldTransform); } } |