package scrum.client.sprint; import ilarkesto.core.scope.Scope; import ilarkesto.gwt.client.HyperlinkWidget; import java.util.Comparator; import java.util.Map; import scrum.client.ScrumGwt; import scrum.client.admin.Auth; import scrum.client.admin.User; import scrum.client.collaboration.ForumSupport; import scrum.client.common.ReferenceSupport; import scrum.client.common.ShowEntityAction; import scrum.client.project.Project; import scrum.client.project.Requirement; import com.google.gwt.user.client.ui.Widget; public class Task extends GTask implements ReferenceSupport, ForumSupport { public static final int INIT_EFFORT = 1; public static final String REFERENCE_PREFIX = "tsk"; public Task(Requirement requirement) { setRequirement(requirement); // setLabel("New Task"); setRemainingWork(INIT_EFFORT); } public Task(Map data) { super(data); } public boolean isBlocked() { if (!isImpedimentSet()) return false; return getImpediment().isOpen(); } public void claim() { User user = Scope.get().getComponent(Auth.class).getUser(); boolean ownerchange = !isOwner(user); if (isClosed()) { setUnDone(user); } else { setOwner(user); } } public String getLongLabel(boolean showOwner, boolean showRequirement) { StringBuilder sb = new StringBuilder(); sb.append(getLabel()); if (showOwner && isOwnerSet()) { sb.append(" (").append(getOwner().getName()).append(')'); } if (showRequirement) { Requirement requirement = getRequirement(); sb.append(" (").append(requirement.getReference()).append(" ").append(requirement.getLabel()).append(')'); } return sb.toString(); } @Override public String getReference() { return REFERENCE_PREFIX + getNumber(); } public void setDone(User user) { if (user == null) throw new IllegalArgumentException("a Task cannot be set done without claiming Task ownership"); setOwner(user); setRemainingWork(0); } public void setUnDone(User user) { setOwner(user); setRemainingWork(1); getRequirement().setClosed(false); } public void setUnOwned() { setOwner(null); getRequirement().setClosed(false); } public boolean isClaimed() { return !isClosed() && isOwnerSet(); } public boolean isClosed() { return getRemainingWork() == 0; } public String getWorkText() { String work; int burned = getBurnedWork(); if (isClosed()) { work = String.valueOf(burned); } else { int remaining = getRemainingWork(); if (isClaimed()) { int total = remaining + burned; work = burned + " of " + total; } else { work = String.valueOf(remaining); } } return work + " hrs"; } @Override public String toHtml() { return ScrumGwt.toHtml(getReference(), getLabel()); } @Override public String toString() { return getReference(); } public void incrementBurnedWork() { setBurnedWork(getBurnedWork() + 1); } public void decrementBurnedWork() { if (getBurnedWork() == 0) return; setBurnedWork(getBurnedWork() - 1); } public void adjustRemainingWork(int burned) { int remaining = getRemainingWork(); if (remaining == 0) return; remaining -= burned; if (remaining < 1) remaining = 1; setRemainingWork(remaining); } public void incrementRemainingWork() { setRemainingWork(getRemainingWork() + 1); } public void decrementRemainingWork() { int work = getRemainingWork(); if (work <= 1) return; setRemainingWork(work - 1); } public static int sumBurnedWork(Iterable<Task> tasks) { int sum = 0; for (Task task : tasks) { sum += task.getBurnedWork(); } return sum; } public static int sumRemainingWork(Iterable<Task> tasks) { int sum = 0; for (Task task : tasks) { sum += task.getRemainingWork(); } return sum; } public Project getProject() { return getRequirement().getProject(); } @Override public boolean isEditable() { if (!getProject().isTeamMember(Scope.get().getComponent(Auth.class).getUser())) return false; return true; } @Override public Widget createForumItemWidget() { return new HyperlinkWidget(new ShowEntityAction(this, getLabel())); } public static final Comparator<Task> NUMBER_COMPARATOR = new Comparator<Task>() { @Override public int compare(Task a, Task b) { return a.getNumber() - b.getNumber(); } }; public static final Comparator<Task> REQUIREMENT_ORDER_THEN_NUMBER_COMPARATOR = new Comparator<Task>() { @Override public int compare(Task a, Task b) { Requirement ar = a.getRequirement(); Requirement br = b.getRequirement(); int reqOrder = ar.getProject().getRequirementsOrderComparator().compare(ar, br); return reqOrder == 0 ? a.getNumber() - b.getNumber() : reqOrder; } }; }