Search in sources :

Example 1 with Transferable

use of com.vaadin.event.Transferable in project cuba by cuba-platform.

the class WebFilterHelper method initConditionsDragAndDrop.

@Override
public void initConditionsDragAndDrop(final Tree tree, final ConditionsTree conditions) {
    final com.vaadin.ui.Tree vTree = tree.unwrap(com.vaadin.ui.Tree.class);
    vTree.setDragMode(com.vaadin.ui.Tree.TreeDragMode.NODE);
    vTree.setDropHandler(new DropHandler() {

        @Override
        public void drop(DragAndDropEvent event) {
            Transferable t = event.getTransferable();
            if (t.getSourceComponent() != vTree)
                return;
            com.vaadin.ui.Tree.TreeTargetDetails target = (com.vaadin.ui.Tree.TreeTargetDetails) event.getTargetDetails();
            VerticalDropLocation location = target.getDropLocation();
            Object sourceItemId = t.getData("itemId");
            Object targetItemId = target.getItemIdOver();
            if (targetItemId == null)
                return;
            CollectionDatasource datasource = tree.getDatasource();
            AbstractCondition sourceCondition = (AbstractCondition) datasource.getItem(sourceItemId);
            AbstractCondition targetCondition = (AbstractCondition) datasource.getItem(targetItemId);
            Node<AbstractCondition> sourceNode = conditions.getNode(sourceCondition);
            Node<AbstractCondition> targetNode = conditions.getNode(targetCondition);
            if (isAncestorOf(targetNode, sourceNode))
                return;
            boolean moveToTheSameParent = Objects.equals(sourceNode.getParent(), targetNode.getParent());
            if (location == VerticalDropLocation.MIDDLE) {
                if (sourceNode.getParent() == null) {
                    conditions.getRootNodes().remove(sourceNode);
                } else {
                    sourceNode.getParent().getChildren().remove(sourceNode);
                }
                targetNode.addChild(sourceNode);
                refreshConditionsDs();
                tree.expand(targetCondition.getId());
            } else {
                List<Node<AbstractCondition>> siblings;
                if (targetNode.getParent() == null)
                    siblings = conditions.getRootNodes();
                else
                    siblings = targetNode.getParent().getChildren();
                int targetIndex = siblings.indexOf(targetNode);
                if (location == VerticalDropLocation.BOTTOM)
                    targetIndex++;
                int sourceNodeIndex;
                if (sourceNode.getParent() == null) {
                    sourceNodeIndex = conditions.getRootNodes().indexOf(sourceNode);
                    conditions.getRootNodes().remove(sourceNode);
                } else {
                    sourceNodeIndex = sourceNode.getParent().getChildren().indexOf(sourceNode);
                    sourceNode.getParent().getChildren().remove(sourceNode);
                }
                // decrease drop position index if dragging from top to bottom inside the same parent node
                if (moveToTheSameParent && (sourceNodeIndex < targetIndex))
                    targetIndex--;
                if (targetNode.getParent() == null) {
                    sourceNode.parent = null;
                    conditions.getRootNodes().add(targetIndex, sourceNode);
                } else {
                    targetNode.getParent().insertChildAt(targetIndex, sourceNode);
                }
                refreshConditionsDs();
            }
        }

        protected boolean isAncestorOf(Node childNode, Node possibleParentNode) {
            while (childNode.getParent() != null) {
                if (childNode.getParent().equals(possibleParentNode))
                    return true;
                childNode = childNode.getParent();
            }
            return false;
        }

        protected void refreshConditionsDs() {
            tree.getDatasource().refresh(Collections.singletonMap("conditions", conditions));
        }

        @Override
        public AcceptCriterion getAcceptCriterion() {
            return new Or(new AbstractSelect.TargetItemIs(vTree, getGroupConditionIds().toArray()), new Not(AbstractSelect.VerticalLocationIs.MIDDLE));
        }

        protected List<UUID> getGroupConditionIds() {
            List<UUID> groupConditions = new ArrayList<>();
            List<AbstractCondition> list = conditions.toConditionsList();
            for (AbstractCondition condition : list) {
                if (condition instanceof GroupCondition)
                    groupConditions.add(condition.getId());
            }
            return groupConditions;
        }
    });
}
Also used : Or(com.vaadin.event.dd.acceptcriteria.Or) VerticalDropLocation(com.vaadin.shared.ui.dd.VerticalDropLocation) DragAndDropEvent(com.vaadin.event.dd.DragAndDropEvent) CollectionDatasource(com.haulmont.cuba.gui.data.CollectionDatasource) Node(com.haulmont.bali.datastruct.Node) Transferable(com.vaadin.event.Transferable) Not(com.vaadin.event.dd.acceptcriteria.Not) ConditionsTree(com.haulmont.cuba.gui.components.filter.ConditionsTree) GroupCondition(com.haulmont.cuba.gui.components.filter.condition.GroupCondition) DropHandler(com.vaadin.event.dd.DropHandler) AbstractCondition(com.haulmont.cuba.gui.components.filter.condition.AbstractCondition) AcceptCriterion(com.vaadin.event.dd.acceptcriteria.AcceptCriterion)

Aggregations

Node (com.haulmont.bali.datastruct.Node)1 ConditionsTree (com.haulmont.cuba.gui.components.filter.ConditionsTree)1 AbstractCondition (com.haulmont.cuba.gui.components.filter.condition.AbstractCondition)1 GroupCondition (com.haulmont.cuba.gui.components.filter.condition.GroupCondition)1 CollectionDatasource (com.haulmont.cuba.gui.data.CollectionDatasource)1 Transferable (com.vaadin.event.Transferable)1 DragAndDropEvent (com.vaadin.event.dd.DragAndDropEvent)1 DropHandler (com.vaadin.event.dd.DropHandler)1 AcceptCriterion (com.vaadin.event.dd.acceptcriteria.AcceptCriterion)1 Not (com.vaadin.event.dd.acceptcriteria.Not)1 Or (com.vaadin.event.dd.acceptcriteria.Or)1 VerticalDropLocation (com.vaadin.shared.ui.dd.VerticalDropLocation)1