summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jrummikub/JRummikub.java371
-rw-r--r--src/jrummikub/view/impl/AbstractStonePanel.java19
-rw-r--r--src/jrummikub/view/impl/TablePanel.java62
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);
}
}