/* * This file is part of LibrePlan * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia * Copyright (C) 2010-2011 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.libreplan.web.templates; import org.apache.commons.lang3.StringUtils; import org.libreplan.business.orders.entities.SchedulingState; import org.libreplan.business.templates.entities.OrderElementTemplate; import org.libreplan.business.templates.entities.OrderLineTemplate; import org.libreplan.web.common.Util; import org.libreplan.web.tree.EntitiesTree; import org.libreplan.web.tree.TreeController; import org.zkoss.zk.ui.Component; import org.zkoss.zul.Button; import org.zkoss.zul.Intbox; import org.zkoss.zul.Textbox; import org.zkoss.zul.Treeitem; import java.math.BigDecimal; import static org.libreplan.web.I18nHelper._; /** * Controller for template element tree <br /> * * @author Óscar González Fernández <ogonzalez@igalia.com> */ public class TemplatesTreeController extends TreeController<OrderElementTemplate> { private final IOrderTemplatesModel model; private final OrderTemplatesController orderTemplatesController; private TemplateElementOperations operationsForOrderTemplate; @Override public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); operationsForOrderTemplate.tree(tree); } final class TemplatesTreeRenderer extends Renderer { @Override protected void addOperationsCell(Treeitem item, OrderElementTemplate currentElement) { addCell(createEditButton(), createRemoveButton(currentElement)); } private Button createEditButton() { return createButton( "/common/img/ico_editar1.png", _("Edit"), "/common/img/ico_editar.png", "icono", event -> { Treeitem item = getTreeitem(event.getTarget()); operationsForOrderTemplate.showEditElement(item); }); } private Treeitem getTreeitem(Component comp) { return (Treeitem) comp.getParent().getParent().getParent(); } @Override protected void addDescriptionCell(final OrderElementTemplate element) { Textbox textBox = Util.bind( new Textbox(), () -> element.getName(), value -> element.setName(value)); textBox.setConstraint("no empty:" + _("cannot be empty")); addCell(textBox); putNameTextbox(element, textBox); } @Override protected void addCodeCell(final OrderElementTemplate element) { // Empty because templates don't have code attribute } void addInitCell(final OrderElementTemplate currentElement) { final Intbox intbox = new Intbox(); Util.bind( intbox, () -> currentElement.getStartAsDaysFromBeginning(), value -> { checkInvalidValues("startAsDaysFromBeginning", value, intbox); currentElement.setStartAsDaysFromBeginning(value); }); addCell(intbox); } void addEndCell(final OrderElementTemplate currentElement) { final Intbox intbox = new Intbox(); Util.bind( intbox, () -> currentElement.getDeadlineAsDaysFromBeginning(), value -> { checkInvalidValues("deadlineAsDaysFromBeginning", value, intbox); currentElement.setDeadlineAsDaysFromBeginning(value); }); addCell(intbox); } @Override protected void onDoubleClickForSchedulingStateCell(OrderElementTemplate currentElement) { // Do nothing } @Override protected SchedulingState getSchedulingStateFrom(OrderElementTemplate currentElement) { return currentElement.getSchedulingState(); } } public TemplatesTreeController(IOrderTemplatesModel model, OrderTemplatesController orderTemplatesController) { super(OrderElementTemplate.class); this.model = model; this.orderTemplatesController = orderTemplatesController; initializeOperationsForOrderTemplate(); } /** * Initializes operationsForOrderTemplate. * A reference to variable tree is needed to be added later in doAfterCompose() */ private void initializeOperationsForOrderTemplate() { operationsForOrderTemplate = TemplateElementOperations .build() .treeController(this) .orderTemplatesController(this.orderTemplatesController); } @Override protected void reloadTreeUIAfterChanges() {} @Override protected EntitiesTree<OrderElementTemplate> getModel() { return model.getTemplatesTreeModel(); } @Override public TemplatesTreeRenderer getRenderer() { return new TemplatesTreeRenderer(); } @Override protected boolean isNewButtonDisabled() { return false; } @Override protected boolean isPredicateApplied() { return false; } @Override protected String createTooltipText(OrderElementTemplate elem) { StringBuilder tooltipText = new StringBuilder(); tooltipText.append(elem.getName()).append(". "); if ((elem.getDescription() != null) && (!elem.getDescription().equals(""))) { tooltipText.append(elem.getDescription()); tooltipText.append(". "); } if ((elem.getLabels() != null) && (!elem.getLabels().isEmpty())) { tooltipText.append(" ").append(_("Labels")).append(":"); tooltipText.append(StringUtils.join(elem.getLabels(), ",")); tooltipText.append("."); } // There are no CriterionRequirement or advances in templates return tooltipText.toString(); } @Override protected IHoursGroupHandler<OrderElementTemplate> getHoursGroupHandler() { return new IHoursGroupHandler<OrderElementTemplate>() { @Override public boolean hasMoreThanOneHoursGroup(OrderElementTemplate element) { return element.getHoursGroups().size() > 1; } @Override public boolean isTotalHoursValid(OrderElementTemplate line, Integer value) { return ((OrderLineTemplate) line).isTotalHoursValid(value); } @Override public Integer getWorkHoursFor(OrderElementTemplate element) { return element.getWorkHours(); } @Override public void setWorkHours(OrderElementTemplate element, Integer value) { if (element instanceof OrderLineTemplate) { OrderLineTemplate line = (OrderLineTemplate) element; line.setWorkHours(value); } } }; } @Override protected IBudgetHandler<OrderElementTemplate> getBudgetHandler() { return new IBudgetHandler<OrderElementTemplate>() { @Override public BigDecimal getBudgetFor(OrderElementTemplate element) { return element.getBudget(); } @Override public void setBudgetHours(OrderElementTemplate element, BigDecimal budget) { if (element instanceof OrderLineTemplate) { OrderLineTemplate line = (OrderLineTemplate) element; line.setBudget(budget); } } }; } @Override protected INameHandler<OrderElementTemplate> getNameHandler() { return element -> element.getName(); } @Override protected ICodeHandler<OrderElementTemplate> getCodeHandler() { // Empty as OrderElementTemplate doesn't have code return element -> ""; } public void refreshRow(Treeitem item) { try { OrderElementTemplate orderElement = item.getValue(); getRenderer().updateColumnsFor(orderElement); getRenderer().render(item, orderElement, 0); } catch (Exception e) { e.printStackTrace(); } } /** * Operations for a node. */ public void editSelectedElement() { operationsForOrderTemplate.editSelectedElement(); } public void moveSelectedElementDown() { operationsForOrderTemplate.moveSelectedElementDown(); } public void moveSelectedElementUp() { operationsForOrderTemplate.moveSelectedElementUp(); } public void unindentSelectedElement() { operationsForOrderTemplate.unindentSelectedElement(); } public void indentSelectedElement() { operationsForOrderTemplate.indentSelectedElement(); } public void deleteSelectedElement() { operationsForOrderTemplate.deleteSelectedElement(); } }