package tv.dyndns.kishibe.qmaclone.client.creation;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import tv.dyndns.kishibe.qmaclone.client.packet.PacketProblemCreationLog;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.common.collect.Maps;
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.safehtml.shared.SafeHtml;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.Widget;
/**
* 問題変更履歴表示ビューの実装
*
* @author nodchip
*/
public class ChangeHistoryViewImpl extends Composite implements ChangeHistoryView, ClickHandler {
private static PanelProblemChangeHistoryUiBinder uiBinder = GWT
.create(PanelProblemChangeHistoryUiBinder.class);
private static final String[] HEADER = { "日時", "プレイヤー", "変更前", "変更後" };
private static final String GROUP_BEFORE = "before";
private static final String GROUP_AFTER = "after";
interface PanelProblemChangeHistoryUiBinder extends UiBinder<Widget, ChangeHistoryViewImpl> {
}
@UiField
Grid gridHistory;
@UiField
HTML htmlDiff;
private final ChangeHistoryPresenter presenter;
private final Map<RadioButton, PacketProblemCreationLog> buttonToLogBefore = Maps.newHashMap();
private final Map<RadioButton, PacketProblemCreationLog> buttonToLogAfter = Maps.newHashMap();
public ChangeHistoryViewImpl(ChangeHistoryPresenter presenter) {
this.presenter = Preconditions.checkNotNull(presenter);
initWidget(uiBinder.createAndBindUi(this));
}
@Override
public void setCreationLog(List<PacketProblemCreationLog> creationLog) {
gridHistory.resize(creationLog.size() + 1, HEADER.length);
for (int column = 0; column < HEADER.length; ++column) {
gridHistory.setText(0, column, HEADER[column]);
}
gridHistory.getColumnFormatter().addStyleName(2, "problemChangeHistoryDiffColumn");
gridHistory.getColumnFormatter().addStyleName(3, "problemChangeHistoryDiffColumn");
int row = 0;
for (PacketProblemCreationLog change : creationLog) {
++row;
gridHistory.setHTML(row, 0, change.getDate());
gridHistory.setHTML(row, 1, change.getPlayer());
if (Strings.isNullOrEmpty(change.summary)) {
continue;
}
RadioButton buttonBefore = new RadioButton(GROUP_BEFORE);
buttonBefore.addClickHandler(this);
gridHistory.setWidget(row, 2, buttonBefore);
buttonToLogBefore.put(buttonBefore, change);
RadioButton buttonAfter = new RadioButton(GROUP_AFTER);
buttonAfter.addClickHandler(this);
gridHistory.setWidget(row, 3, buttonAfter);
buttonToLogAfter.put(buttonAfter, change);
}
htmlDiff.setHTML("");
}
private PacketProblemCreationLog selectedLog(
Map<RadioButton, PacketProblemCreationLog> buttonToLog) {
for (Entry<RadioButton, PacketProblemCreationLog> entry : buttonToLog.entrySet()) {
if (entry.getKey().getValue()) {
return entry.getValue();
}
}
return null;
}
@Override
public void onClick(ClickEvent event) {
PacketProblemCreationLog before = selectedLog(buttonToLogBefore);
PacketProblemCreationLog after = selectedLog(buttonToLogAfter);
presenter.onUpdateDiffTarget(before, after);
}
@Override
public void setDiffHtml(SafeHtml html) {
htmlDiff.setHTML(html);
}
}