package org.aperteworkflow.editor.stepeditor.user; import com.vaadin.data.Item; import com.vaadin.data.util.HierarchicalContainer; import com.vaadin.event.DataBoundTransferable; import com.vaadin.event.Transferable; import com.vaadin.event.dd.DragAndDropEvent; import com.vaadin.event.dd.DropHandler; import com.vaadin.event.dd.acceptcriteria.AcceptAll; import com.vaadin.event.dd.acceptcriteria.AcceptCriterion; import com.vaadin.terminal.gwt.client.ui.dd.VerticalDropLocation; import com.vaadin.ui.Component; import com.vaadin.ui.Tree; import static pl.net.bluesoft.util.lang.FormatUtil.nvl; final class TreeDropHandler implements DropHandler { private static final long serialVersionUID = -1252687997956419353L; private Tree tree; private HierarchicalContainer container; public TreeDropHandler(Tree tree, HierarchicalContainer container) { this.tree = tree; this.container = container; } public AcceptCriterion getAcceptCriterion() { return AcceptAll.get(); } public void drop(DragAndDropEvent dropEvent) { Transferable t = dropEvent.getTransferable(); Component src = t.getSourceComponent(); Object sourceItemId; HierarchicalContainer container = (HierarchicalContainer) tree.getContainerDataSource(); if (src instanceof WidgetInfoDnDWrapper) { //add widget WidgetInfoDnDWrapper dragAndDropWrapper = (WidgetInfoDnDWrapper) src; WidgetItem wi = dragAndDropWrapper.widgetItem; Object widgetElement = new WidgetItemInStep(wi); Item subItem = container.addItem(widgetElement); subItem.getItemProperty("name").setValue(wi.getName()); container.setChildrenAllowed(widgetElement, nvl(wi.getChildrenAllowed(), false)); sourceItemId = widgetElement; } else { if (src != tree || !(t instanceof DataBoundTransferable)) { return; } sourceItemId = ((DataBoundTransferable) t).getItemId(); } Tree.TreeTargetDetails dropData = ((Tree.TreeTargetDetails) dropEvent.getTargetDetails()); Object targetItemId = dropData.getItemIdOver(); VerticalDropLocation location = dropData.getDropLocation(); if (container.getParent(targetItemId) == null) { //the can be only one! ... root element2 location = VerticalDropLocation.MIDDLE; } moveNode(sourceItemId, targetItemId, location); } private void moveNode(Object sourceItemId, Object targetItemId, VerticalDropLocation location) { if (sourceItemId == null || targetItemId == null) return; if (location == VerticalDropLocation.MIDDLE) { if (!container.areChildrenAllowed(targetItemId)) return; if (container.setParent(sourceItemId, targetItemId) && container.hasChildren(targetItemId)) { container.moveAfterSibling(sourceItemId, null); } } else if (location == VerticalDropLocation.TOP) { Object parentId = container.getParent(targetItemId); if (!container.areChildrenAllowed(parentId)) return; if (container.setParent(sourceItemId, parentId)) { container.moveAfterSibling(sourceItemId, targetItemId); container.moveAfterSibling(targetItemId, sourceItemId); } } else if (location == VerticalDropLocation.BOTTOM) { Object parentId = container.getParent(targetItemId); if (!container.areChildrenAllowed(parentId)) return; if (container.setParent(sourceItemId, parentId)) { container.moveAfterSibling(sourceItemId, targetItemId); } } tree.expandItem(sourceItemId); tree.expandItem(targetItemId); } }