package tv.dyndns.kishibe.qmaclone.client.game.input;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import tv.dyndns.kishibe.qmaclone.client.game.AnswerView;
import tv.dyndns.kishibe.qmaclone.client.game.SessionData;
import tv.dyndns.kishibe.qmaclone.client.game.panel.QuestionPanel;
import tv.dyndns.kishibe.qmaclone.client.packet.PacketGameStatus;
import tv.dyndns.kishibe.qmaclone.client.packet.PacketGameStatus.GamePlayerStatus;
import tv.dyndns.kishibe.qmaclone.client.packet.PacketProblem;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Grid;
public class InputWidgetHayaimono extends InputWidget implements ClickHandler {
private static final String BUTTON_HAYAIMONO = "gwt-Button-hayaimono";
private static final Map<Integer, Integer> numberOfAnswersToNumberOfSeats = ImmutableMap.of(2,
4, 3, 3, 4, 2);
private final Button[] buttons;
private final Map<Button, String> buttonToChoice = Maps.newHashMap();
private final int numberOfSeats;
public InputWidgetHayaimono(PacketProblem problem, AnswerView answerView,
QuestionPanel questionPanel, SessionData sessionData) {
super(problem, answerView, questionPanel, sessionData);
int numberOfChoices = problem.getNumberOfShuffledChoices();
buttons = new Button[numberOfChoices];
int numberOfRows = numberOfChoices / 2;
Grid grid = new Grid(numberOfRows, 4);
add(grid);
for (int i = 0; i < numberOfChoices; ++i) {
String choice = problem.shuffledChoices[i];
// BugTrack-QMAClone/387 - QMAClone wiki
// http://kishibe.dyndns.tv/qmaclone/wiki/wiki.cgi?page=BugTrack%2DQMAClone%2F387#1322577322
Button button = new Button(toMultilineSafeHtml(choice), this);
button.setStyleName(BUTTON_HAYAIMONO);
buttonToChoice.put(button, choice);
buttons[i] = button;
grid.setHTML(i % numberOfRows, i / numberOfRows * 2, Integer.toString(i + 1));
grid.setWidget(i % numberOfRows, i / numberOfRows * 2 + 1, button);
}
int numberOfAnswers = problem.getNumberOfShuffledAnswers();
// BugTrack-QMAClone/384 - QMAClone wiki
// http://kishibe.dyndns.tv/qmaclone/wiki/wiki.cgi?page=BugTrack%2DQMAClone%2F384
numberOfSeats = numberOfAnswersToNumberOfSeats.get(numberOfAnswers);
}
@Override
public void enable(boolean b) {
for (Button button : buttons) {
button.setEnabled(b);
}
}
@Override
public void onClick(ClickEvent event) {
Object sender = event.getSource();
String choice = Preconditions.checkNotNull(buttonToChoice.get(sender));
sendAnswer(choice);
}
@Override
public void onReceivedGameStatus(PacketGameStatus gameStatus) {
super.onReceivedGameStatus(gameStatus);
// 満席になったらボタンを無効化する
List<String> answers = Lists.newArrayList();
for (GamePlayerStatus playerStatus : gameStatus.status) {
answers.add(playerStatus.answer);
}
// エラー発生のため
Map<Button, String> buttonToChoice = this.buttonToChoice;
if (buttonToChoice == null) {
return;
}
for (Entry<Button, String> entry : buttonToChoice.entrySet()) {
Button button = entry.getKey();
String choice = entry.getValue();
if (numberOfSeats <= Collections.frequency(answers, choice)) {
button.setEnabled(false);
}
}
}
}