Search code examples
javadrag-and-dropvaadinvaadin7

vaadin drag n drop component


I have a vertical layout and I need to move the components in that vertical layout, up and down. I used DragAndDropWrapper, but I am not sure what to implement under DropHandler's drop function. I found examples for absoulte layout and it worked.

class MoveHandler implements DropHandler
    {
        public AcceptCriterion getAcceptCriterion()
        {
            return AcceptAll.get();
        }

        public void drop(DragAndDropEvent event)
        {
            WrapperTransferable t = (WrapperTransferable) event.getTransferable();
            WrapperTargetDetails details = (WrapperTargetDetails) event.getTargetDetails();

            // Calculate the drag coordinate difference
            int xChange = details.getMouseEvent().getClientX() - t.getMouseDownEvent().getClientX();
            int yChange = details.getMouseEvent().getClientY() - t.getMouseDownEvent().getClientY();

            // Move the component in the absolute layout
             ComponentPosition pos = ((AbsoluteLayout)
             questionButtonLayout).getPosition(t.getSourceComponent());
             pos.setLeftValue(pos.getLeftValue() + xChange);
             pos.setTopValue(pos.getTopValue() + yChange);
        }
    }

Above is the code for the abstract layout. Not sure what to do for vertical layout.


Solution

  • there is bug in drag n drop functionality in vaadin 7.4.5. If you have more than one textfields inside the layout which is under drag n drop wrapper, it would never get mouse focus on it ( means you wont be able to select it using mouse, to type anything in it). Its fixed in 7.7.5. So, I used the following method

    class MoveHandler implements DropHandler
    {
        private static final long       serialVersionUID    = -5709370299130660699L;
        private AbstractOrderedLayout   layout;
        private Level                   level;
    
        public MoveHandler(AbstractOrderedLayout layout, Level level)
        {
            this.layout = layout;
            this.level = level;
        }
    
        public AcceptCriterion getAcceptCriterion()
        {
            return AcceptAll.get();
        }
    
        @SuppressWarnings("deprecation")
        public void drop(DragAndDropEvent dropEvent)
        {
            Transferable transferable = dropEvent.getTransferable();
            Component sourceComponent = transferable.getSourceComponent();
            TargetDetails dropTargetData = dropEvent.getTargetDetails();
            DropTarget target = dropTargetData.getTarget();
    
            // First question cann't be dragged.
            if (layout.getComponent(0).equals(sourceComponent))
                return;
    
            // find the location of the dragged component
            Iterator<Component> componentIterator = layout.getComponentIterator();
            Component next = null;
            int indexSourceComponent = 0;
            while (componentIterator.hasNext())
            {
                next = componentIterator.next();
                if (next == sourceComponent)
                    break;
                indexSourceComponent++;
            }
    
            // find the location where to move the dragged component
            boolean sourceWasAfterTarget = true;
            int index = 0;
            componentIterator = layout.getComponentIterator();
            next = null;
    
            while (next != target && componentIterator.hasNext())
            {
                next = componentIterator.next();
    
                if (next != sourceComponent)
                {
                    index++;
                }
                else
                {
                    sourceWasAfterTarget = false;
                }
            }
            if (next == null || next != target)
            {
                // component not found - if dragging from another layout
                return;
            }
    
            // drop on top of target?
            if (dropTargetData.getData("verticalLocation").equals(VerticalDropLocation.MIDDLE.toString()))
            {
                if (sourceWasAfterTarget)
                {
                    index--;
                }
            }
    
            // drop before the target?
            else if (dropTargetData.getData("verticalLocation").equals(VerticalDropLocation.TOP.toString()))
            {
                index--;
                if (index < 0)
                {
                    index = 0;
                }
            }
    
            // Nothing can be dragged to 1st position. 1st positions is secured for default question.
            if (index == 0)
                return;
    
            // move component within the layout
            layout.removeComponent(sourceComponent);
            layout.addComponent(sourceComponent, index);
    
        }
    }