diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java index b1d5d390b..5711dcfb2 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java @@ -24,11 +24,8 @@ import static org.navalplanner.web.I18nHelper._; import java.util.Date; import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Set; import javax.annotation.Resource; @@ -38,14 +35,12 @@ import org.navalplanner.business.orders.entities.OrderLine; import org.navalplanner.business.orders.entities.SchedulingState; import org.navalplanner.business.orders.entities.SchedulingState.ITypeChangedListener; import org.navalplanner.business.orders.entities.SchedulingState.Type; -import org.navalplanner.web.common.IMessagesForUser; -import org.navalplanner.web.common.Level; -import org.navalplanner.web.common.MessagesForUser; import org.navalplanner.web.common.Util; import org.navalplanner.web.common.Util.Getter; import org.navalplanner.web.common.Util.Setter; import org.navalplanner.web.common.components.bandboxsearch.BandboxSearch; import org.navalplanner.web.templates.IOrderTemplatesControllerEntryPoints; +import org.navalplanner.web.tree.TreeController; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.WrongValueException; @@ -53,7 +48,6 @@ import org.zkoss.zk.ui.event.DropEvent; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; -import org.zkoss.zk.ui.util.GenericForwardComposer; import org.zkoss.zul.Button; import org.zkoss.zul.Combobox; import org.zkoss.zul.Constraint; @@ -64,7 +58,6 @@ import org.zkoss.zul.RendererCtrl; import org.zkoss.zul.Tab; import org.zkoss.zul.Textbox; import org.zkoss.zul.Tree; -import org.zkoss.zul.TreeModel; import org.zkoss.zul.Treecell; import org.zkoss.zul.Treeitem; import org.zkoss.zul.TreeitemRenderer; @@ -76,24 +69,16 @@ import org.zkoss.zul.Vbox; * @author Lorenzo Tilve Álvaro * @author Manuel Rego Casasnovas */ -public class OrderElementTreeController extends GenericForwardComposer { +public class OrderElementTreeController extends TreeController { private Vbox filter; - private IMessagesForUser messagesForUser; - - private Component messagesContainer; - private Combobox cbFilterType; private BandboxSearch bdFilter; - private Tree tree; - private OrderElementTreeitemRenderer renderer = new OrderElementTreeitemRenderer(); - private TreeViewStateSnapshot snapshotOfOpenedNodes; - private final IOrderModel orderModel; private final OrderElementController orderElementController; @@ -107,61 +92,23 @@ public class OrderElementTreeController extends GenericForwardComposer { return orderModel.getLabels(); } + @Override public OrderElementTreeitemRenderer getRenderer() { return renderer; } public OrderElementTreeController(IOrderModel orderModel, OrderElementController orderElementController) { + super(OrderElement.class); this.orderModel = orderModel; this.orderElementController = orderElementController; } - public void indent() { - if (tree.getSelectedCount() == 1) { - indent(getSelectedNode()); - } - } - - private void indent(OrderElement orderElement) { - snapshotOfOpenedNodes = TreeViewStateSnapshot.snapshotOpened(tree); - getModel().indent(orderElement); - filterByPredicateIfAny(); - } - - public TreeModel getTreeModel() { - return (getModel() != null) ? getModel().asTree() : null; - } - - private OrderElementTreeModel getModel() { + @Override + protected OrderElementTreeModel getModel() { return orderModel.getOrderElementTreeModel(); } - public void unindent() { - if (tree.getSelectedCount() == 1) { - unindent(getSelectedNode()); - } - } - - private void unindent(OrderElement orderElement) { - snapshotOfOpenedNodes = TreeViewStateSnapshot.snapshotOpened(tree); - getModel().unindent(orderElement); - filterByPredicateIfAny(); - } - - public void up() { - snapshotOfOpenedNodes = TreeViewStateSnapshot.snapshotOpened(tree); - if (tree.getSelectedCount() == 1) { - up(getSelectedNode()); - } - } - - public void up(OrderElement orderElement) { - snapshotOfOpenedNodes = TreeViewStateSnapshot.snapshotOpened(tree); - getModel().up(orderElement); - filterByPredicateIfAny(); - } - public void createTemplate() { if (tree.getSelectedCount() == 1) { createTemplate(getSelectedNode()); @@ -172,56 +119,7 @@ public class OrderElementTreeController extends GenericForwardComposer { orderTemplates.goToCreateTemplateFrom(selectedNode); } - public void down() { - if (tree.getSelectedCount() == 1) { - down(getSelectedNode()); - } - } - - public void down(OrderElement orderElement) { - snapshotOfOpenedNodes = TreeViewStateSnapshot.snapshotOpened(tree); - getModel().down(orderElement); - filterByPredicateIfAny(); - } - - private OrderElement getSelectedNode() { - return (OrderElement) tree.getSelectedItemApi().getValue(); - } - - public void move(Component dropedIn, Component dragged) { - snapshotOfOpenedNodes = TreeViewStateSnapshot.snapshotOpened(tree); - - Treerow from = (Treerow) dragged; - OrderElement fromNode = (OrderElement) ((Treeitem) from.getParent()) - .getValue(); - if (dropedIn instanceof Tree) { - getModel().moveToRoot(fromNode); - } - if (dropedIn instanceof Treerow) { - Treerow to = (Treerow) dropedIn; - OrderElement toNode = (OrderElement) ((Treeitem) to.getParent()) - .getValue(); - - getModel().move(fromNode, toNode); - } - filterByPredicateIfAny(); - } - - public void addElement() { - snapshotOfOpenedNodes = TreeViewStateSnapshot.snapshotOpened(tree); - try { - if (tree.getSelectedCount() == 1) { - getModel().addElementAt(getSelectedNode()); - } else { - getModel().addElement(); - } - filterByPredicateIfAny(); - } catch (IllegalStateException e) { - messagesForUser.showMessage(Level.ERROR, e.getMessage()); - } - } - - private void filterByPredicateIfAny() { + protected void filterByPredicateIfAny() { if (predicate != null) { filterByPredicate(); } @@ -234,61 +132,6 @@ public class OrderElementTreeController extends GenericForwardComposer { tree.invalidate(); } - private static class TreeViewStateSnapshot { - private final Set all; - private final Set dataOpen; - - private TreeViewStateSnapshot(Set dataOpen, Set all) { - this.dataOpen = dataOpen; - this.all = all; - } - - public static TreeViewStateSnapshot snapshotOpened(Tree tree) { - Iterator itemsIterator = tree.getTreechildrenApi() - .getItems().iterator(); - Set dataOpen = new HashSet(); - Set all = new HashSet(); - while (itemsIterator.hasNext()) { - Treeitem treeitem = (Treeitem) itemsIterator.next(); - Object value = getAssociatedValue(treeitem); - if (treeitem.isOpen()) { - dataOpen.add(value); - } - all.add(value); - } - return new TreeViewStateSnapshot(dataOpen, all); - } - - private static Object getAssociatedValue(Treeitem treeitem) { - return treeitem.getValue(); - } - - public void openIfRequired(Treeitem item) { - Object value = getAssociatedValue(item); - item.setOpen(isNewlyCreated(value) || wasOpened(value)); - } - - private boolean wasOpened(Object value) { - return dataOpen.contains(value); - } - - private boolean isNewlyCreated(Object value) { - return !all.contains(value); - } - } - - public void removeElement() { - Set selectedItems = tree.getSelectedItems(); - for (Treeitem treeItem : selectedItems) { - remove((OrderElement) treeItem.getValue()); - } - filterByPredicateIfAny(); - } - - private void remove(OrderElement orderElement) { - getModel().removeNode(orderElement); - } - void doEditFor(Order order) { Util.reloadBindings(tree); } @@ -296,7 +139,6 @@ public class OrderElementTreeController extends GenericForwardComposer { @Override public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); - messagesForUser = new MessagesForUser(messagesContainer); Executions.createComponents("/orders/_orderElementTreeFilter.zul", filter, new HashMap()); } @@ -823,16 +665,6 @@ public class OrderElementTreeController extends GenericForwardComposer { .getSelectedElement(); } - public boolean isItemSelected() { - return (tree.getSelectedItem() != null); - } - - public boolean isNotItemSelected() { - return !isItemSelected(); - } - - private Button btnNew, btnDown, btnUp, btnUnindent, btnIndent, btnDelete; - private void resetControlButtons() { final boolean disabled = tree.getSelectedItem() == null; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/tree/TreeController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/tree/TreeController.java new file mode 100644 index 000000000..6314a369a --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/tree/TreeController.java @@ -0,0 +1,231 @@ +/* + * This file is part of ###PROJECT_NAME### + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * + * 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 . + */ +package org.navalplanner.web.tree; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.navalplanner.business.trees.ITreeNode; +import org.navalplanner.web.common.IMessagesForUser; +import org.navalplanner.web.common.Level; +import org.navalplanner.web.common.MessagesForUser; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.util.GenericForwardComposer; +import org.zkoss.zul.Button; +import org.zkoss.zul.Tree; +import org.zkoss.zul.TreeModel; +import org.zkoss.zul.Treeitem; +import org.zkoss.zul.TreeitemRenderer; +import org.zkoss.zul.Treerow; + +public abstract class TreeController> extends + GenericForwardComposer { + + private static final Log LOG = LogFactory.getLog(TreeController.class); + + private IMessagesForUser messagesForUser; + + private Component messagesContainer; + + protected Tree tree; + + protected TreeViewStateSnapshot snapshotOfOpenedNodes; + + private final Class type; + + public abstract TreeitemRenderer getRenderer(); + + protected TreeController(Class type) { + this.type = type; + } + + public void indent() { + if (tree.getSelectedCount() == 1) { + indent(getSelectedNode()); + } + } + + protected void indent(T element) { + snapshotOfOpenedNodes = TreeViewStateSnapshot.snapshotOpened(tree); + getModel().indent(element); + filterByPredicateIfAny(); + } + + public TreeModel getTreeModel() { + return (getModel() != null) ? getModel().asTree() : null; + } + + protected abstract EntitiesTree getModel(); + + public void unindent() { + if (tree.getSelectedCount() == 1) { + unindent(getSelectedNode()); + } + } + + protected void unindent(T element) { + snapshotOfOpenedNodes = TreeViewStateSnapshot.snapshotOpened(tree); + getModel().unindent(element); + filterByPredicateIfAny(); + } + + public void up() { + snapshotOfOpenedNodes = TreeViewStateSnapshot.snapshotOpened(tree); + if (tree.getSelectedCount() == 1) { + up(getSelectedNode()); + } + } + + public void up(T element) { + snapshotOfOpenedNodes = TreeViewStateSnapshot.snapshotOpened(tree); + getModel().up(element); + filterByPredicateIfAny(); + } + + public void down() { + if (tree.getSelectedCount() == 1) { + down(getSelectedNode()); + } + } + + public void down(T element) { + snapshotOfOpenedNodes = TreeViewStateSnapshot.snapshotOpened(tree); + getModel().down(element); + filterByPredicateIfAny(); + } + + protected T getSelectedNode() { + return type.cast(tree.getSelectedItemApi().getValue()); + } + + public void move(Component dropedIn, Component dragged) { + snapshotOfOpenedNodes = TreeViewStateSnapshot.snapshotOpened(tree); + + Treerow from = (Treerow) dragged; + T fromNode = type.cast(((Treeitem) from.getParent()).getValue()); + if (dropedIn instanceof Tree) { + getModel().moveToRoot(fromNode); + } + if (dropedIn instanceof Treerow) { + Treerow to = (Treerow) dropedIn; + T toNode = type.cast(((Treeitem) to.getParent()).getValue()); + + getModel().move(fromNode, toNode); + } + filterByPredicateIfAny(); + } + + public void addElement() { + snapshotOfOpenedNodes = TreeViewStateSnapshot.snapshotOpened(tree); + try { + if (tree.getSelectedCount() == 1) { + getModel().addElementAt(getSelectedNode()); + } else { + getModel().addElement(); + } + filterByPredicateIfAny(); + } catch (IllegalStateException e) { + LOG.warn("exception ocurred adding element", e); + messagesForUser.showMessage(Level.ERROR, e.getMessage()); + } + } + + protected abstract void filterByPredicateIfAny(); + + protected static class TreeViewStateSnapshot { + private final Set all; + private final Set dataOpen; + + private TreeViewStateSnapshot(Set dataOpen, Set all) { + this.dataOpen = dataOpen; + this.all = all; + } + + public static TreeViewStateSnapshot snapshotOpened(Tree tree) { + Iterator itemsIterator = tree.getTreechildrenApi() + .getItems().iterator(); + Set dataOpen = new HashSet(); + Set all = new HashSet(); + while (itemsIterator.hasNext()) { + Treeitem treeitem = (Treeitem) itemsIterator.next(); + Object value = getAssociatedValue(treeitem); + if (treeitem.isOpen()) { + dataOpen.add(value); + } + all.add(value); + } + return new TreeViewStateSnapshot(dataOpen, all); + } + + private static Object getAssociatedValue(Treeitem treeitem) { + return treeitem.getValue(); + } + + public void openIfRequired(Treeitem item) { + Object value = getAssociatedValue(item); + item.setOpen(isNewlyCreated(value) || wasOpened(value)); + } + + private boolean wasOpened(Object value) { + return dataOpen.contains(value); + } + + private boolean isNewlyCreated(Object value) { + return !all.contains(value); + } + } + + public void removeElement() { + Set selectedItems = tree.getSelectedItems(); + for (Treeitem treeItem : selectedItems) { + remove(type.cast(treeItem.getValue())); + } + filterByPredicateIfAny(); + } + + protected void remove(T element) { + getModel().removeNode(element); + } + + @Override + public void doAfterCompose(Component comp) throws Exception { + super.doAfterCompose(comp); + messagesForUser = new MessagesForUser(messagesContainer); + } + + public boolean isItemSelected() { + return tree.getSelectedItem() != null; + } + + public boolean isNotItemSelected() { + return !isItemSelected(); + } + + protected Button btnNew, btnDown, btnUp, btnUnindent, btnIndent, btnDelete; + + + protected TreeViewStateSnapshot getSnapshotOfOpenedNodes() { + return snapshotOfOpenedNodes; + } + +}