package tv.dyndns.kishibe.qmaclone.client.game.input;
import java.util.Collections;
import java.util.List;
import tv.dyndns.kishibe.qmaclone.client.constant.Constant;
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.PacketProblem;
import tv.dyndns.kishibe.qmaclone.client.util.Random;
import com.allen_sauer.gwt.dnd.client.PickupDragController;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Label;
public class InputWidgetGroup extends InputWidget implements ClickHandler {
private static final String STYLE_NAME_GROUP = "gwt-Button-group";
private static final String STYLE_NAME_GROUP_HEADER = "gwt-Button-group-header";
private static final String STYLE_NAME_GROUP_CONTROL = "gwt-Button-group-control";
private static final int draggableOffsetHeight = 30;
private AbsolutePanel gridConstrainedDropTarget;
private final List<Label> labelChoices = Lists.newArrayList();
private final Button buttonOk = new Button("OK", this);
private PickupDragController dragController;
public InputWidgetGroup(PacketProblem problem, AnswerView answerView,
QuestionPanel questionPanel, SessionData sessionData) {
super(problem, answerView, questionPanel, sessionData);
// 解答フォーム表示位置の予約
int numberOfGroups = ImmutableSet.copyOf(problem.getAnswerList()).size();
int numberOfChoices = problem.getNumberOfShuffledChoices();
// 解答フォームの表示
gridConstrainedDropTarget = new AbsolutePanel();
gridConstrainedDropTarget.setPixelSize(getDraggableOffsetWidth() * numberOfGroups + 8,
draggableOffsetHeight * (numberOfChoices + 1) + 8);
add(gridConstrainedDropTarget);
// 表示先のDOMのサイズが確定しておらず、ラベルを追加すると左上に表示されてしまうため、追加タイミングを遅らせる
Scheduler.get().scheduleDeferred(cmd);
// OKボタン
buttonOk.setStyleName(STYLE_NAME_GROUP_CONTROL);
add(buttonOk);
}
private int getDraggableOffsetWidth() {
int numberOfGroups = ImmutableSet.copyOf(problem.getAnswerList()).size();
return numberOfGroups == 2 ? 275 : 200;
}
private final Scheduler.ScheduledCommand cmd = new Scheduler.ScheduledCommand() {
@Override
public void execute() {
dragController = new PickupDragController(gridConstrainedDropTarget, false);
dragController.setBehaviorScrollIntoView(false);
final GridHorizontalMoveDropController dropController = new GridHorizontalMoveDropController(
gridConstrainedDropTarget, getDraggableOffsetWidth(), draggableOffsetHeight);
dragController.registerDropController(dropController);
int numberOfGroups = ImmutableSet.copyOf(problem.getAnswerList()).size();
int numberOfChoices = problem.getNumberOfShuffledChoices();
// header
List<String> groups = Lists.newArrayList(ImmutableSet.copyOf(problem.getAnswerList()));
Collections.sort(groups);
for (int i = 0; i < numberOfGroups; ++i) {
Label label = new Label(groups.get(i));
label.addStyleName(STYLE_NAME_GROUP_HEADER);
label.setPixelSize(getDraggableOffsetWidth(), draggableOffsetHeight);
gridConstrainedDropTarget.add(label, getDraggableOffsetWidth() * i, 0);
}
// choices
for (int i = 0; i < numberOfChoices; ++i) {
Label label = new Label(problem.shuffledChoices[i]);
label.addMouseDownHandler(new MouseDownHandler() {
@Override
public void onMouseDown(MouseDownEvent event) {
dropController.setStartY(event.getRelativeElement().getAbsoluteTop());
}
});
label.addStyleName(STYLE_NAME_GROUP);
label.setPixelSize(getDraggableOffsetWidth(), draggableOffsetHeight);
labelChoices.add(label);
dragController.makeDraggable(label);
dropController.drop(label, Random.get().nextInt(numberOfGroups)
* getDraggableOffsetWidth(), draggableOffsetHeight * (i + 1));
}
}
};
@Override
public void enable(boolean b) {
buttonOk.setEnabled(b);
}
@Override
public void onClick(ClickEvent event) {
Object source = event.getSource();
if (source == buttonOk) {
List<String> groups = Lists.newArrayList(ImmutableSet.copyOf(problem.getAnswerList()));
Collections.sort(groups);
StringBuilder sb = new StringBuilder();
for (Label label : labelChoices) {
if (sb.length() != 0) {
sb.append(Constant.DELIMITER_GENERAL);
}
int x = gridConstrainedDropTarget.getWidgetLeft(label);
int groupIndex = (x + getDraggableOffsetWidth() / 2) / getDraggableOffsetWidth();
sb.append(label.getText()).append(Constant.DELIMITER_KUMIAWASE_PAIR)
.append(groups.get(groupIndex));
}
sendAnswer(sb.toString());
}
}
@Override
protected void onUnload() {
dragController.unregisterDropControllers();
super.onUnload();
}
}