2 * The MIT License (MIT)
4 * Copyright (C) 2013 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 package org.apidesign.html.demo.chess;
26 import java.util.Locale;
27 import net.java.html.json.ComputedProperty;
28 import net.java.html.json.Function;
29 import net.java.html.json.Model;
30 import net.java.html.json.Property;
32 @Model(className="Board", properties={
33 @Property(name = "rows", type = Row.class, array = true),
34 @Property(name = "turn", type = BoardModel.ColorType.class)
36 public class BoardModel {
37 @Function static void selected(Board b, Square data) {
38 Square previoslySelected = findSelectedSquare(b);
39 if (previoslySelected == null) {
40 if (data.getPiece() != null && data.getPieceColor() == b.getTurn()) {
41 data.setSelected(true);
42 Rules.computeAccessible(b, data);
45 if (data.getPiece() != null && data.getPieceColor() == previoslySelected.getPieceColor()) {
46 previoslySelected.setSelected(false);
47 data.setSelected(true);
48 Rules.computeAccessible(b, data);
51 if (data.isAccessible()) {
52 previoslySelected.setSelected(false);
53 data.setPieceColor(previoslySelected.getPieceColor());
54 data.setPiece(previoslySelected.getPiece());
55 b.setTurn(b.getTurn() == ColorType.WHITE ? ColorType.BLACK : ColorType.WHITE);
56 previoslySelected.setPiece(null);
57 previoslySelected.setPieceColor(null);
58 Rules.computeAccessible(b, null);
63 @ComputedProperty static boolean whiteTurn(ColorType turn) {
64 return turn == ColorType.WHITE;
67 @ComputedProperty static boolean blackTurn(ColorType turn) {
68 return turn == ColorType.BLACK;
71 static Square findSquare(Board b, char column, int row) {
72 for (Row r : b.getRows()) {
73 for (Square square : r.getColumns()) {
74 if (square.getX() == column && square.getY() == row) {
82 static Square findSelectedSquare(Board b) {
83 for (Row row : b.getRows()) {
84 for (Square square : row.getColumns()) {
85 if (square.isSelected()) {
93 @Model(className="Row", properties = {
94 @Property(name = "columns", type = Square.class, array = true)
96 static class RowsImpl {
100 PAWN(5), ROCK(2), KNIGHT(4), BISHOP(3), QUEEN(1), KING(0);
102 final int entityIndex;
105 this.entityIndex = ei;
108 String computeEntity(ColorType color) {
110 color = ColorType.WHITE;
114 case WHITE: base = 12; break;
115 case BLACK: base = 18; break;
117 throw new AssertionError();
119 return "b" + String.valueOf(base + entityIndex) + ";";
126 @Model(className="Square", properties = {
127 @Property(name = "piece", type = PieceType.class),
128 @Property(name = "pieceColor", type = ColorType.class),
129 @Property(name = "color", type = ColorType.class),
130 @Property(name = "x", type = int.class),
131 @Property(name = "y", type = int.class),
132 @Property(name = "selected", type = boolean.class),
133 @Property(name = "accessible", type = boolean.class),
135 static class PieceImpl {
136 @ComputedProperty static String pieceEntity(
137 PieceType piece, ColorType pieceColor
142 return piece.computeEntity(pieceColor);
145 @ComputedProperty static String squareColor(
146 ColorType color, boolean selected, boolean accessible
158 return color.toString().toLowerCase(Locale.US);
163 public static void initialize(String[] args) {
164 Board b = createBoard();
168 static Board createBoard() {
169 Board b = new Board();
170 b.setTurn(ColorType.WHITE);
171 for (int i = 8; i > 0; i--) {
174 for (int j = 'A'; j <= 'H'; j++) {
175 Square s = new Square();
178 s.setColor((i + j) % 2 == 1 ? ColorType.WHITE : ColorType.BLACK);
179 r.getColumns().add(s);
181 s.setPiece(PieceType.PAWN);
182 s.setPieceColor(ColorType.WHITE);
184 s.setPiece(PieceType.PAWN);
185 s.setPieceColor(ColorType.BLACK);
186 } else if (i == 8 || i == 1) {
187 s.setPieceColor(i == 1 ? ColorType.WHITE : ColorType.BLACK);
190 case 'A': case 'H': t = PieceType.ROCK; break;
191 case 'B': case 'G': t = PieceType.KNIGHT; break;
192 case 'C': case 'F': t = PieceType.BISHOP; break;
193 case 'D': t = PieceType.QUEEN; break;
194 default: t = PieceType.KING; break;