package com.christophdietze.jack.client.view; import com.christophdietze.jack.client.presenter.PromotionPresenter; import com.christophdietze.jack.client.resources.MyClientBundle; import com.christophdietze.jack.client.resources.MyCss; import com.christophdietze.jack.client.resources.PieceImageProvider; import com.christophdietze.jack.client.util.UiUtils; import com.christophdietze.jack.shared.board.ChessUtils; import com.christophdietze.jack.shared.board.Piece; import com.christophdietze.jack.shared.board.PieceType; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.CloseEvent; import com.google.gwt.event.logical.shared.CloseHandler; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.PopupPanel.PositionCallback; import com.google.inject.Inject; import com.google.inject.Singleton; @Singleton public class PromotionView implements PromotionPresenter.View { private static MyCss CSS = MyClientBundle.CSS; private PromotionPresenter model; private BoardPanel boardPanel; private PopupPanel whitePopupPanel; private PopupPanel blackPopupPanel; private boolean pieceSelected = false; @Inject public PromotionView(PromotionPresenter model, BoardPanel boardPanel) { this.model = model; this.boardPanel = boardPanel; whitePopupPanel = createPopupPanel(true); blackPopupPanel = createPopupPanel(false); model.bindView(this); } @Override public void showPopup(int toIndex) { pieceSelected = false; int rank = ChessUtils.toRank(toIndex); assert rank == 0 || rank == 7; final PopupPanel popup = rank == 0 ? blackPopupPanel : whitePopupPanel; final Widget reference = boardPanel.getSquares()[toIndex]; popup.setPopupPositionAndShow(new PositionCallback() { public void setPosition(int offsetWidth, int offsetHeight) { UiUtils.setPopupPositionAtTopLeft(popup, reference); } }); } private PopupPanel createPopupPanel(boolean isWhite) { final PopupPanel popupPanel = new PopupPanel(true); popupPanel.setStylePrimaryName(CSS.promotionPopup()); FlowPanel flow = new FlowPanel(); popupPanel.setWidget(flow); for (final PieceType piece : new PieceType[] { PieceType.QUEEN, PieceType.ROOK, PieceType.BISHOP, PieceType.KNIGHT }) { Piece square = Piece.getFromColorAndPieceType(isWhite, piece); Image image = PieceImageProvider.getImage(square); image.addStyleName(CSS.promotionPieceImage()); image.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { pieceSelected = true; model.onPieceSelected(piece); popupPanel.hide(); } }); flow.add(image); } popupPanel.addCloseHandler(new CloseHandler<PopupPanel>() { public void onClose(CloseEvent<PopupPanel> arg0) { if (!pieceSelected) { model.onNoPieceSelected(); } pieceSelected = false; } }); return popupPanel; } }