package scrum.client.sprint;
import ilarkesto.gwt.client.Gwt;
import ilarkesto.gwt.client.TableBuilder;
import java.util.List;
import scrum.client.ScrumGwt;
import scrum.client.collaboration.EmoticonsWidget;
import scrum.client.common.ABlockWidget;
import scrum.client.common.BlockHeaderWidget;
import scrum.client.common.BlockListWidget;
import scrum.client.common.BlockWidgetFactory;
import scrum.client.img.Img;
import scrum.client.journal.ActivateChangeHistoryAction;
import scrum.client.journal.ChangeHistoryWidget;
import scrum.client.project.CloseRequirementAction;
import scrum.client.project.FixRequirementAction;
import scrum.client.project.RejectRequirementAction;
import scrum.client.project.RemoveRequirementFromSprintAction;
import scrum.client.project.ReopenRequirementAction;
import scrum.client.project.Requirement;
import scrum.client.project.RequirementWidget;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
public class RequirementInSprintBlock extends ABlockWidget<Requirement> {
private BlockListWidget<Task> taskList;
private RequirementWidget requirementWidget;
private FlowPanel right;
private FlexTable bodyWidget;
private ChangeHistoryWidget changeHistoryWidget;
private SimplePanel statusIcon;
private Label statusLabel;
private boolean decidableOnInitialization;
@Override
protected void onInitializationHeader(BlockHeaderWidget header) {
Requirement requirement = getObject();
decidableOnInitialization = requirement.isDecidable();
statusIcon = header.insertPrefixIcon();
statusLabel = header.appendCenterSuffix("");
header.appendCell(new EmoticonsWidget(requirement), null, true, true, null);
header.addMenuAction(new RejectRequirementAction(requirement));
header.addMenuAction(new FixRequirementAction(requirement));
header.addMenuAction(new CloseRequirementAction(requirement));
header.addMenuAction(new ReopenRequirementAction(requirement));
header.addMenuAction(new RemoveRequirementFromSprintAction(requirement));
header.addMenuAction(new ActivateChangeHistoryAction(requirement));
header.addMenuAction(new CreateTaskAction(requirement));
}
@Override
protected boolean isResetRequired() {
return decidableOnInitialization != getObject().isDecidable();
}
@Override
protected void onUpdateHeader(BlockHeaderWidget header) {
Requirement requirement = getObject();
header.setDragHandle(requirement.getReference());
Image statusImage = null;
if (requirement.isRejected()) {
statusImage = Img.bundle.reqRejected().createImage();
statusImage.setTitle("Rejected.");
} else if (requirement.isClosed()) {
statusImage = Img.bundle.reqClosed().createImage();
statusImage.setTitle("Accepted.");
} else if (requirement.isTasksClosed()) {
statusImage = Img.bundle.reqTasksClosed().createImage();
statusImage.setTitle("All tasks done.");
}
statusIcon.setWidget(statusImage);
statusLabel.setText(requirement.getTaskStatusLabel());
header.setCenter(requirement.getLabel());
}
@Override
protected Widget onExtendedInitialization() {
Requirement requirement = getObject();
requirementWidget = new RequirementWidget(requirement, false, false, true, false, false, false, false);
taskList = new BlockListWidget<Task>(TaskInRequirementBlock.FACTORY);
taskList.setAutoSorter(requirement.getTasksOrderComparator());
if (requirement.getProject().isTeamMember(getCurrentUser())) {
taskList.setDndSorting(true);
taskList.setMoveObserver(new MoveObserver());
}
changeHistoryWidget = new ChangeHistoryWidget(requirement);
FlowPanel left = new FlowPanel();
left.add(requirementWidget);
left.add(taskList);
left.add(changeHistoryWidget);
right = new FlowPanel();
if (requirement.isDecidable() && requirement.getProject().isProductOwner(getCurrentUser())) {
right.add(RequirementWidget.createActionsPanelForCompletedRequirement(requirement));
right.add(Gwt.createSpacer(1, 10));
}
right.add(ScrumGwt.createEmoticonsAndComments(requirement));
bodyWidget = TableBuilder.row(20, left, right);
return bodyWidget;
}
@Override
protected void onUpdateBody() {
requirementWidget.update();
taskList.setObjects(getObject().getTasks());
taskList.update();
Gwt.update(right);
changeHistoryWidget.update();
}
public void selectTask(Task task) {
taskList.showObject(task);
}
class MoveObserver implements Runnable {
public void run() {
List<Task> tasks = taskList.getObjects();
getObject().updateTasksOrder(tasks);
update();
}
}
public static final BlockWidgetFactory<Requirement> FACTORY = new BlockWidgetFactory<Requirement>() {
public RequirementInSprintBlock createBlock() {
return new RequirementInSprintBlock();
}
};
}