package scrum.client.project; import ilarkesto.gwt.client.AFieldValueWidget; import ilarkesto.gwt.client.ButtonWidget; import ilarkesto.gwt.client.Gwt; import ilarkesto.gwt.client.TableBuilder; import ilarkesto.gwt.client.editor.IntegerEditorWidget; import java.util.Collections; import java.util.List; import scrum.client.ScrumGwt; import scrum.client.common.AScrumWidget; import scrum.client.common.BlockListWidget; import scrum.client.common.UserGuideWidget; import scrum.client.workspace.PagePanel; import com.google.gwt.user.client.ui.Widget; public class ProductBacklogWidget extends AScrumWidget { private BlockListWidget<Requirement> list; @Override protected Widget onInitialization() { list = new BlockListWidget<Requirement>(RequirementBlock.FACTORY); list.setAutoSorter(getCurrentProject().getRequirementsOrderComparator()); if (getCurrentProject().isProductOwner(getCurrentUser())) { list.setDndSorting(true); list.setMoveObserver(new MoveObserver()); } TableBuilder tb = ScrumGwt.createFieldTable(); tb.addField("Assumed Velocity", new IntegerEditorWidget(getCurrentProject().getVelocityModel())); tb.addField("Velocity History", new AFieldValueWidget() { @Override protected void onUpdate() { setText(getCurrentProject().getVelocitiesFromLastSprints()); super.onUpdate(); } }); PagePanel page = new PagePanel(); page.addHeader("Product Backlog", new ButtonWidget(new CreateRequirementAction())); page.addSection(tb.createTable()); page.addSection(Gwt.createFlowPanel(list)); page.addSection(ScrumGwt.createPdfLink("Download as PDF", "productBacklog", getCurrentProject())); page.addSection(new UserGuideWidget(getLocalizer().views().productBacklog(), getCurrentProject() .getProductBacklogRequirements().size() < 5, getCurrentUser().getHideUserGuideProductBacklogModel())); return page; } @Override protected void onUpdate() { List<Requirement> requirements = getCurrentProject().getProductBacklogRequirements(); Collections.sort(requirements, getCurrentProject().getRequirementsOrderComparator()); EstimationBarFactory.createEstimationBars(requirements, getCurrentProject().getVelocity()); list.setObjects(requirements); super.onUpdate(); } public boolean select(Requirement requirement) { if (!list.contains(requirement)) update(); return list.showObject(requirement); } class MoveObserver implements Runnable { public void run() { List<Requirement> requirements = list.getObjects(); getCurrentProject().updateRequirementsOrder(requirements); update(); } } }