# HG changeset patch # User Jaroslav Tulach # Date 1283718883 -7200 # Node ID 9ecd02d694cd2967206b690b31a8b6f48e0642d4 # Parent 1273bfb0e2e7e76988022be5442c07e0223fcf99 Official API for BoardPane with listener to react to user gestures. diff -r 1273bfb0e2e7 -r 9ecd02d694cd visidor/pom.xml --- a/visidor/pom.xml Sun Sep 05 17:58:45 2010 +0200 +++ b/visidor/pom.xml Sun Sep 05 22:34:43 2010 +0200 @@ -4,7 +4,6 @@ visidor jar ${visidorVersion} - visidor http://maven.apache.org cz.xelfi.quoridor @@ -23,6 +22,18 @@ 1.5 + + org.apache.felix + maven-bundle-plugin + 2.0.1 + true + + + cz.xelfi.quoridor.visidor + cz.xelfi.quoridor.visitor.* + + + @@ -38,6 +49,8 @@ ${quoridorVersion} + Quoridor Visual Board + Provides Swing component to display and interact with quoridor board. diff -r 1273bfb0e2e7 -r 9ecd02d694cd visidor/src/main/java/cz/xelfi/quoridor/visidor/BoardEvent.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/visidor/src/main/java/cz/xelfi/quoridor/visidor/BoardEvent.java Sun Sep 05 22:34:43 2010 +0200 @@ -0,0 +1,30 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package cz.xelfi.quoridor.visidor; + +import cz.xelfi.quoridor.Move; +import java.util.EventObject; + +/** Event describing what happens in {@link BoardPane}. + * + * @author Jaroslav Tulach + */ +public final class BoardEvent extends EventObject { + private final Move move; + + BoardEvent(BoardPane p, Move m) { + super(p); + this.move = m; + } + + /** The move that describes recent user gesture on the {@link BoardPane}. + * + * @return the move or null, if this event does not describe a move + */ + public Move getMove() { + return move; + } +} diff -r 1273bfb0e2e7 -r 9ecd02d694cd visidor/src/main/java/cz/xelfi/quoridor/visidor/BoardListener.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/visidor/src/main/java/cz/xelfi/quoridor/visidor/BoardListener.java Sun Sep 05 22:34:43 2010 +0200 @@ -0,0 +1,20 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package cz.xelfi.quoridor.visidor; + +import java.util.EventListener; + +/** Channel referring back what happens in a {@link BoardPane}. + * + * @author Jaroslav Tulach + */ +public interface BoardListener extends EventListener { + /** Notifies listeners about a change in the {@link BoardPane}. + * + * @param ev the event, usually next move applicable to the board + */ + public void boardChanged(BoardEvent ev); +} diff -r 1273bfb0e2e7 -r 9ecd02d694cd visidor/src/main/java/cz/xelfi/quoridor/visidor/BoardPane.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/visidor/src/main/java/cz/xelfi/quoridor/visidor/BoardPane.java Sun Sep 05 22:34:43 2010 +0200 @@ -0,0 +1,65 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package cz.xelfi.quoridor.visidor; + +import cz.xelfi.quoridor.Board; +import cz.xelfi.quoridor.Move; +import java.awt.GridLayout; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import javax.swing.JPanel; + +/** JavaBean class that displays and can manipulate with Quoridor {@link Board}. + * + * @author Jaroslav Tulach + */ +public final class BoardPane extends JPanel { + private final Viewer viewer; + private final List listeners = new CopyOnWriteArrayList(); + + public BoardPane() { + setLayout(new GridLayout(1,1)); + viewer = new Viewer(); + viewer.moveListener(this); + add(viewer); + } + + public final void setBoard(Board b) { + viewer.setBoard(b); + } + + public final Board getBoard() { + return viewer.getBoard(); + } + + /** The board can either be in view only mode when showing state + * of the {@link Board} during opponent's move, or it can be editable. + * In editable mode, one shall listen on changes delivered to + * BoardListener. + * + * @param editable read only or editable mode? + */ + public final void setEditable(boolean editable) { + viewer.enableListeners(editable); + } + + public final void addBoardListener(BoardListener l) { + listeners.add(l); + } + public final void removeBoardListener(BoardListener l) { + listeners.remove(l); + } + + final void moveHappened(Move m) { + BoardEvent ev = null; + for (BoardListener bl : listeners) { + if (ev == null) { + ev = new BoardEvent(this, m); + } + bl.boardChanged(ev); + } + } +} diff -r 1273bfb0e2e7 -r 9ecd02d694cd visidor/src/main/java/cz/xelfi/quoridor/visidor/Viewer.java --- a/visidor/src/main/java/cz/xelfi/quoridor/visidor/Viewer.java Sun Sep 05 17:58:45 2010 +0200 +++ b/visidor/src/main/java/cz/xelfi/quoridor/visidor/Viewer.java Sun Sep 05 22:34:43 2010 +0200 @@ -55,6 +55,7 @@ private int xdelta; private int ydelta; private Orientation lastOrientation; + private BoardPane pane; public Viewer() { this(Board.empty()); @@ -62,8 +63,6 @@ private Viewer(Board b) { this.board = b; - addMouseMotionListener(this); - addMouseListener(this); } @@ -71,10 +70,24 @@ * @param args the command line arguments */ public static void main(String[] args) throws IllegalPositionException { - Board b = Board.empty(); JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - f.add(new Viewer(b)); + final BoardPane bp = new BoardPane(); + class ApplyMove implements BoardListener { + public void boardChanged(BoardEvent ev) { + Move m = ev.getMove(); + if (m != null) { + try { + bp.setBoard(bp.getBoard().apply(m)); + } catch (IllegalPositionException ex) { + // no new move + } + } + } + } + bp.addBoardListener(new ApplyMove()); + bp.setEditable(true); + f.add(bp); f.pack(); f.setVisible(true); } @@ -259,13 +272,9 @@ public void mousePressed(MouseEvent e) { Move m = redrawCurrentMove(e); - if (m != null) { - try { - board = board.apply(m); - } catch (IllegalPositionException ex) { - // no new move - } - repaint(); + BoardPane bp = pane; + if (bp != null) { + bp.moveHappened(m); } } @@ -278,4 +287,29 @@ public void mouseExited(MouseEvent e) { } + final void setBoard(Board b) { + board = b; + if (isShowing()) { + repaint(); + } + } + + final Board getBoard() { + return board; + } + + final void enableListeners(boolean editable) { + if (editable) { + addMouseMotionListener(this); + addMouseListener(this); + } else { + removeMouseListener(this); + removeMouseMotionListener(this); + } + } + + final void moveListener(BoardPane pane) { + this.pane = pane; + } + }