summaryrefslogtreecommitdiffstats
path: root/src/jrummikub/view
diff options
context:
space:
mode:
Diffstat (limited to 'src/jrummikub/view')
-rw-r--r--src/jrummikub/view/impl/AbstractStonePanel.java57
-rw-r--r--src/jrummikub/view/impl/StoneCollectionPanel.java35
-rw-r--r--src/jrummikub/view/impl/StonePainter.java7
-rw-r--r--src/jrummikub/view/impl/TablePanel.java26
4 files changed, 93 insertions, 32 deletions
diff --git a/src/jrummikub/view/impl/AbstractStonePanel.java b/src/jrummikub/view/impl/AbstractStonePanel.java
index fd3862b..82bc7b7 100644
--- a/src/jrummikub/view/impl/AbstractStonePanel.java
+++ b/src/jrummikub/view/impl/AbstractStonePanel.java
@@ -1,6 +1,7 @@
package jrummikub.view.impl;
import java.awt.Insets;
+import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
@@ -61,27 +62,8 @@ abstract class AbstractStonePanel extends JPanel implements IStonePanel,
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
- Insets insets = getInsets();
- 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) {
- if (!handleOtherClickEvent(pos))
- clickEvent.emit(pos);
-
- return;
- }
-
- Event2<Stone, Boolean> event = stoneClickEvent;
-
- if (e.isShiftDown())
- event = rangeClickEvent;
- else if (e.getClickCount() >= 2)
- event = setClickEvent;
-
- event.emit(stone, e.isControlDown());
+ clickAt(e.getPoint(), e.getClickCount(), e.isShiftDown(),
+ e.isControlDown());
}
@Override
@@ -103,6 +85,39 @@ abstract class AbstractStonePanel extends JPanel implements IStonePanel,
});
}
+ /**
+ * clickAt is called when a click has occured
+ *
+ * @param p the point in component coordinates
+ * @param clickCount the click count
+ * @param shift is shift down?
+ * @param control is control down?
+ */
+ protected void clickAt(Point p, int clickCount, boolean shift, boolean control) {
+ Insets insets = getInsets();
+ Pair<Integer, Integer> trans = getTranslation();
+ Position pos = stonePainter.calculatePosition(
+ p.x - insets.left - trans.getFirst(),
+ p.y - insets.top - trans.getSecond());
+ Stone stone = getStoneAt(pos);
+
+ if (stone == null) {
+ if (!handleOtherClickEvent(pos))
+ clickEvent.emit(pos);
+
+ return;
+ }
+
+ Event2<Stone, Boolean> event = stoneClickEvent;
+
+ if (shift)
+ event = rangeClickEvent;
+ else if (clickCount >= 2)
+ event = setClickEvent;
+
+ event.emit(stone, control);
+ }
+
private void setHoveredStone(Stone stone) {
Stone oldStone = hoveredStone;
hoveredStone = stone;
diff --git a/src/jrummikub/view/impl/StoneCollectionPanel.java b/src/jrummikub/view/impl/StoneCollectionPanel.java
index 5064b56..3bd57ea 100644
--- a/src/jrummikub/view/impl/StoneCollectionPanel.java
+++ b/src/jrummikub/view/impl/StoneCollectionPanel.java
@@ -2,6 +2,8 @@ package jrummikub.view.impl;
import java.awt.Graphics;
import java.awt.Graphics2D;
+import java.awt.Insets;
+import java.awt.Point;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.geom.RoundRectangle2D;
@@ -14,6 +16,8 @@ import javax.swing.ImageIcon;
import jrummikub.model.Position;
import jrummikub.model.Stone;
+import jrummikub.util.Event1;
+import jrummikub.util.IEvent1;
import jrummikub.util.Pair;
import jrummikub.view.IStoneCollectionPanel;
@@ -31,6 +35,8 @@ class StoneCollectionPanel extends AbstractStonePanel implements
private Collection<Stone> selectedStones = Collections.emptyList();
+ private Event1<Point> otherClickEvent = new Event1<Point>();
+
/**
* Creates a new StoneCollection instance
*/
@@ -81,6 +87,32 @@ class StoneCollectionPanel extends AbstractStonePanel implements
return new Pair<Integer, Integer>(x + inset, inset);
}
+ /**
+ * The other click event is emitted by the stone collection when the player
+ * has clicked on it, but hasn't hit a stone. This is rather probable as the
+ * stone collection panel is filling the whole table width while being mostly
+ * invisible.
+ *
+ * @return the event
+ */
+ IEvent1<Point> getOtherClickEvent() {
+ return otherClickEvent;
+ }
+
+ @Override
+ protected boolean handleOtherClickEvent(Position pos) {
+ Insets insets = getInsets();
+ Pair<Integer, Integer> trans = getTranslation();
+ int x = (int) (pos.getX() * getStonePainter().getStoneWidth())
+ + insets.left + trans.getFirst();
+ int y = (int) (pos.getY() * getStonePainter().getStoneHeight())
+ + insets.top + trans.getSecond();
+
+ otherClickEvent.emit(new Point(x, y));
+
+ return true;
+ }
+
@Override
public void paintComponent(Graphics g1) {
for (int xpos = 0; xpos < getWidth(); xpos += BACKGROUND.getIconWidth()) {
@@ -110,7 +142,8 @@ class StoneCollectionPanel extends AbstractStonePanel implements
float xpos = 0;
for (Stone stone : selectedStones) {
- getStonePainter().paintStone(g, stone, new Position(xpos, 0), false, stone == getHoveredStone());
+ getStonePainter().paintStone(g, stone, new Position(xpos, 0), false,
+ stone == getHoveredStone());
xpos++;
}
}
diff --git a/src/jrummikub/view/impl/StonePainter.java b/src/jrummikub/view/impl/StonePainter.java
index bfa61ea..0812beb 100644
--- a/src/jrummikub/view/impl/StonePainter.java
+++ b/src/jrummikub/view/impl/StonePainter.java
@@ -64,9 +64,9 @@ class StonePainter {
}
private static Color hover(Color color) {
- int r = (int) (color.getRed() * HOVER_RATIO + 255 * (1-HOVER_RATIO));
- int g = (int) (color.getGreen() * HOVER_RATIO + 255 * (1-HOVER_RATIO));
- int b = (int) (color.getBlue() * HOVER_RATIO + 255 * (1-HOVER_RATIO));
+ int r = (int) (color.getRed() * HOVER_RATIO + 255 * (1 - HOVER_RATIO));
+ int g = (int) (color.getGreen() * HOVER_RATIO + 255 * (1 - HOVER_RATIO));
+ int b = (int) (color.getBlue() * HOVER_RATIO + 255 * (1 - HOVER_RATIO));
return new Color(r > 255 ? 255 : r, g > 255 ? 255 : g, b > 255 ? 255 : b);
}
@@ -327,7 +327,6 @@ class StonePainter {
*/
public void paintStone(Graphics2D g, Stone stone, Position p,
boolean selected, boolean hovered) {
- // Color background = selected ? SELECTED_COLOR : BACKGROUND_COLOR;
int width = getStoneWidth();
int height = getStoneHeight();
int x = (int) (p.getX() * width), y = (int) (p.getY() * height);
diff --git a/src/jrummikub/view/impl/TablePanel.java b/src/jrummikub/view/impl/TablePanel.java
index f34765e..7eb798d 100644
--- a/src/jrummikub/view/impl/TablePanel.java
+++ b/src/jrummikub/view/impl/TablePanel.java
@@ -4,6 +4,7 @@ import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
+import java.awt.Point;
import java.awt.Shape;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
@@ -17,11 +18,13 @@ import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
+import javax.swing.SwingUtilities;
import jrummikub.model.Position;
import jrummikub.model.Stone;
import jrummikub.model.StoneSet;
import jrummikub.util.Event1;
+import jrummikub.util.IListener1;
import jrummikub.util.Pair;
import jrummikub.view.IStoneCollectionPanel;
import jrummikub.view.ITablePanel;
@@ -114,12 +117,7 @@ class TablePanel extends AbstractStonePanel implements ITablePanel {
repaint();
}
- /**
- * Creates a new Table instance
- */
- TablePanel() {
- setLayout(null);
-
+ private void createLabels() {
leftPlayerLabel = new JLabel();
leftPlayerLabel.setForeground(Color.WHITE);
leftPlayerLabel.setHorizontalAlignment(JLabel.LEFT);
@@ -139,8 +137,24 @@ class TablePanel extends AbstractStonePanel implements ITablePanel {
rightPlayerLabel.setHorizontalAlignment(JLabel.RIGHT);
rightPlayerLabel.setHorizontalTextPosition(JLabel.RIGHT);
add(rightPlayerLabel);
+ }
+
+ /**
+ * Creates a new Table instance
+ */
+ TablePanel() {
+ setLayout(null);
+
+ createLabels();
stoneCollection = new StoneCollectionPanel();
+ stoneCollection.getOtherClickEvent().add(new IListener1<Point>() {
+
+ @Override
+ public void handle(Point p) {
+ Point p2 = SwingUtilities.convertPoint(stoneCollection, p, TablePanel.this);
+ clickAt(p2, 1, false, false);
+ }});
add(stoneCollection);
addComponentListener(new ComponentAdapter() {