package com.christophdietze.jack.client.view.embed;
import com.christophdietze.jack.client.presenter.embed.MoveTextPresenter;
import com.christophdietze.jack.client.presenter.embed.MoveTextPresenter.View;
import com.christophdietze.jack.client.resources.MyClientBundle;
import com.christophdietze.jack.client.resources.MyCss;
import com.christophdietze.jack.shared.board.ChessUtils;
import com.christophdietze.jack.shared.board.Game;
import com.christophdietze.jack.shared.board.GameResult;
import com.christophdietze.jack.shared.board.MoveNode;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.InlineHTML;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
public class MoveTextPanel extends Composite implements View {
private static MyCss CSS = MyClientBundle.CSS;
private static MoveTextPanelUiBinder uiBinder = GWT.create(MoveTextPanelUiBinder.class);
static {
CSS.ensureInjected();
}
interface MoveTextPanelUiBinder extends UiBinder<Widget, MoveTextPanel> {
}
private MoveTextPresenter presenter;
@UiField
FlowPanel moveListPanel;
@Inject
public MoveTextPanel(MoveTextPresenter presenter) {
this.presenter = presenter;
presenter.bindView(this);
initWidget(uiBinder.createAndBindUi(this));
update();
}
@Override
public void update() {
moveListPanel.clear();
Game game = presenter.getGame();
appendMoveNode(game.getInitialMoveNode());
if (game.getGameResult() != GameResult.UNDECIDED) {
appendBigSpace();
appendStaticText(game.getGameResult().getSymbol(), CSS.nowrap());
}
}
private void appendMoveNode(MoveNode node) {
if (node.isInitialNode()) {
boolean isWhiteToMove = ChessUtils.toIsWhiteToMoveFromPly(node.getPly() + 1);
if (isWhiteToMove) {
appendMoveNumber(node);
}
if (!isWhiteToMove) {
appendMoveNumber(node);
appendStaticText("...");
appendSmallNonbreakableSpace();
}
node = node.getNext();
}
while (node != null) {
appendMove(node);
if (node.hasNext() && ChessUtils.toIsWhiteToMoveFromPly(node.getPly() + 1)) {
// if the next move is by white, then append a move number indicator
appendMoveNumber(node);
}
node = node.getNext();
}
}
private void appendMoveNumber(final MoveNode node) {
int fullMoveNum = ChessUtils.toFullmoveNumberFromPly(node.getPly() + 1);
Anchor moveNumberLink = new Anchor(fullMoveNum + ".");
moveNumberLink.addStyleName(CSS.moveListMoveNumber());
moveNumberLink.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
presenter.getGame().gotoPly(node.getPly());
}
});
appendWidget(moveNumberLink);
appendSmallNonbreakableSpace();
}
private void appendMove(final MoveNode node) {
boolean isWhiteToMove = ChessUtils.toIsWhiteToMoveFromPly(node.getPly());
Anchor link = new Anchor(node.getSanNotation());
link.addStyleName(CSS.moveListMove());
link.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
presenter.getGame().gotoPly(node.getPly());
}
});
if (presenter.getGame().getCurrentMoveNode() == node) {
link.addStyleName(CSS.moveListCurrentMove());
}
appendWidget(link);
if (isWhiteToMove) {
appendSmallBreakableSpace();
} else {
appendBigSpace();
}
}
private void appendBigSpace() {
HTML widget = new InlineHTML(" ");
widget.addStyleName(CSS.moveListBigSpace());
moveListPanel.add(widget);
}
private void appendSmallNonbreakableSpace() {
InlineHTML widget = new InlineHTML(" ");
widget.addStyleName(CSS.moveListSmallNonBreakableSpace());
moveListPanel.add(widget);
}
private void appendSmallBreakableSpace() {
InlineHTML widget = new InlineHTML(" ");
widget.addStyleName(CSS.moveListSmallBreakableSpace());
moveListPanel.add(widget);
}
private void appendStaticText(String text) {
moveListPanel.add(new InlineHTML(text));
}
private void appendStaticText(String text, String cssStyle) {
InlineHTML element = new InlineHTML(text);
element.addStyleName(cssStyle);
moveListPanel.add(element);
}
private void appendWidget(Widget widget) {
moveListPanel.add(widget);
}
}