Example usage for com.vaadin.client.ui.dd VDragAndDropManager get

List of usage examples for com.vaadin.client.ui.dd VDragAndDropManager get

Introduction

In this page you can find the example usage for com.vaadin.client.ui.dd VDragAndDropManager get.

Prototype

public static VDragAndDropManager get() 

Source Link

Usage

From source file:annis.gui.widgets.gwt.client.ui.VGripDragComponent.java

License:Apache License

private boolean startDrag(NativeEvent event) {
    VTransferable transferable = new VTransferable();
    transferable.setDragSource(ConnectorMap.get(client).getConnector(this));

    Element targetElement = (Element) event.getEventTarget().cast();

    Paintable paintable;/*from  ww  w.  j  ava2s . c  om*/
    Widget w = Util.findWidget(targetElement, null);

    if (!w.getStyleName().contains("drag-source-enabled")) {
        return false;
    }

    while (w != null && !(w instanceof Paintable)) {
        w = w.getParent();
    }
    paintable = (Paintable) w;

    transferable.setData("component", paintable);
    VDragEvent dragEvent = VDragAndDropManager.get().startDrag(transferable, event, true);

    transferable.setData("clientX", event.getClientX());
    transferable.setData("clientY", event.getClientY());

    dragEvent.createDragImage(getElement(), true);

    return true;

}

From source file:com.haulmont.cuba.web.widgets.client.addons.dragdroplayouts.ui.VLayoutDragDropMouseHandler.java

License:Apache License

/**
 * Called when the dragging a component should be initiated by both a mouse
 * down event as well as a touch start event
 *
 * FIXME This method is a BIG hack to circumvent Vaadin's very poor client
 * side API's. This will break often. Refactor once Vaadin gets a grip.
 *
 * @param event/*  w  w w  . ja v a  2  s. c o  m*/
 */
protected void initiateDrag(NativeEvent event) {
    // Check that dragging is enabled
    if (dragMode == LayoutDragMode.NONE) {
        return;
    }

    // Dragging can only be done with left mouse button and no modifier keys
    if (!isMouseDragEvent(event) && !Util.isTouchEvent(event)) {
        return;
    }

    // Get target widget
    EventTarget eventTarget = event.getEventTarget();
    Element targetElement = Element.as(eventTarget);
    Widget target = WidgetUtil.findWidget(targetElement, null);

    if (isEventOnScrollBar(event)) {
        return;
    }

    // do not drag close button of TabSheet tab
    if (isElementNotDraggable(targetElement)) {
        VDragAndDropManager.get().interruptDrag();
        return;
    }

    // Abort if drag mode is caption mode and widget is not a caption
    boolean isPanelCaption = target instanceof VPanel
            && targetElement.getParentElement().getClassName().contains("v-panel-caption");
    boolean isCaption = isPanelCaption || VDragDropUtil.isCaptionOrCaptionless(target);

    if (dragMode == LayoutDragMode.CAPTION && !isCaption) {
        /*
         * Ensure target is a caption in caption mode
         */
        return;
    }

    if (dragMode == LayoutDragMode.CAPTION && isCaption) {

        /*
         * Ensure that captions in nested layouts don't get accepted if in
         * caption mode
         */

        Widget w = VDragDropUtil.getTransferableWidget(target);
        ComponentConnector c = Util.findConnectorFor(w);
        ComponentConnector parent = (ComponentConnector) c.getParent();
        if (parent.getWidget() != root) {
            return;
        }
    }

    // Create the transfarable
    VTransferable transferable = VDragDropUtil.createLayoutTransferableFromMouseDown(event, root, target);

    // Are we trying to drag the root layout
    if (transferable == null) {
        VConsole.log("Creating transferable on mouse down returned null");
        return;
    }

    // Resolve the component
    final Widget w;
    ComponentConnector c = null, parent = null;

    if (target instanceof TabCaption) {
        TabCaption tabCaption = (TabCaption) target;
        Tab tab = tabCaption.getTab();
        int tabIndex = ((ComplexPanel) tab.getParent()).getWidgetIndex(tab);
        VTabsheet tabsheet = tab.getTabsheet();

        w = tab;
        c = tabsheet.getTab(tabIndex);
        parent = Util.findConnectorFor(tabsheet);

    } else if (root instanceof VDDAccordion) {
        w = target;
        parent = Util.findConnectorFor(root);

        StackItem tab = WidgetUtil.findWidget(targetElement, StackItem.class);
        if (tab != null && root.getElement().isOrHasChild(tab.getElement())) {
            c = ((VDDAccordion) root).getTab(((VDDAccordion) root).getTabPosition(tab));
        }

    } else if (transferable.getData(Constants.TRANSFERABLE_DETAIL_COMPONENT) != null) {

        ComponentConnector connector = (ComponentConnector) transferable
                .getData(Constants.TRANSFERABLE_DETAIL_COMPONENT);
        w = connector.getWidget();
        c = Util.findConnectorFor(w);
        parent = (ComponentConnector) c.getParent();

    } else {
        // Failsafe if no widget was found
        w = root;
        c = Util.findConnectorFor(w);
        parent = (ComponentConnector) c.getParent();
        VConsole.log("Could not resolve component, using root as component");
    }

    VConsole.log("Dragging widget: " + w);
    VConsole.log(" in parent: " + parent);

    // Ensure component is draggable
    if (!VDragDropUtil.isDraggingEnabled(parent, w)) {
        VConsole.log("Dragging disabled for " + w.getClass().getName() + " in "
                + parent.getWidget().getClass().getName());
        VDragAndDropManager.get().interruptDrag();
        return;
    }

    // Announce drag start to listeners
    for (DragStartListener dl : dragStartListeners) {
        if (!dl.dragStart(w, dragMode)) {
            VDragAndDropManager.get().interruptDrag();
            return;
        }
    }

    currentDraggedWidget = w;

    // Announce to handler that we are starting a drag operation
    VDragEvent currentDragEvent = VDragAndDropManager.get().startDrag(transferable, event, true);

    /*
     * Create the drag image
     */
    boolean hasDragCaption = false;

    com.google.gwt.dom.client.Element dragImageElement = null;
    if (root instanceof VHasDragCaptionProvider) {
        VDragCaptionProvider dragCaptionProvider = ((VHasDragCaptionProvider) root).getDragCaptionProvider();
        if (dragCaptionProvider != null) {
            hasDragCaption = true;
            dragImageElement = dragCaptionProvider.getDragCaptionElement(currentDraggedWidget);
        }
    }

    if (!hasDragCaption && dragImageProvider != null) {
        dragImageElement = dragImageProvider.getDragImageElement(w);
    }

    if (dragImageElement != null) {

        // Set stylename to proxy component as well
        if (hasDragCaption) {
            dragImageElement.addClassName(ACTIVE_DRAG_CUSTOM_IMAGE_STYLENAME);
        } else {
            dragImageElement.addClassName(ACTIVE_DRAG_SOURCE_STYLENAME);
        }

    } else if (root instanceof VCssLayout) {
        /*
         * CSS Layout does not have an enclosing div so we just use the
         * component div
         */
        dragImageElement = w.getElement();

    } else if (root instanceof VTabsheet) {
        /*
         * Tabsheet should use the dragged tab as a drag image
         */
        dragImageElement = targetElement;

    } else if (root instanceof VAccordion) {
        /*
         * Accordion should use the dragged tab as a drag image
         */
        dragImageElement = targetElement;

    } else if (root instanceof VFormLayout) {
        /*
         * Dragging a component in a form layout should include the caption
         * and error indicator as well
         */
        Element rowElement = (Element) VDDFormLayout
                .getRowFromChildElement((com.google.gwt.dom.client.Element) w.getElement().cast(),
                        (com.google.gwt.dom.client.Element) root.getElement().cast())
                .cast();

        dragImageElement = rowElement;

    } else {
        /*
         * For other layouts we just use the target element;
         */
        dragImageElement = w.getElement();
    }

    Element clone;
    if (hasDragCaption) {
        currentDragEvent.setDragImage(dragImageElement);
        clone = dragImageElement;
    } else {
        currentDragEvent.createDragImage(dragImageElement, true);
        clone = currentDragEvent.getDragImage();
    }

    assert (clone != null);

    // Lock drag image dimensions
    if (!hasDragCaption) {
        clone.getStyle().setWidth(dragImageElement.getOffsetWidth(), Style.Unit.PX);
        clone.getStyle().setHeight(dragImageElement.getOffsetHeight(), Style.Unit.PX);
    }

    if (c != null && c.delegateCaptionHandling() && !(root instanceof VTabsheet)
            && !(root instanceof VAccordion)) {
        /*
         * Captions are not being dragged with the widget since they are
         * separate. Manually add a clone of the caption to the drag image.
         */
        if (target instanceof VCaption) {
            clone.insertFirst(targetElement.cloneNode(true));
        }
    }

    if (BrowserInfo.get().isIE()) {
        // Fix IE not aligning the drag image correctly when dragging
        // layouts
        clone.getStyle().setPosition(Position.ABSOLUTE);
    }

    currentDraggedWidget.addStyleName(ACTIVE_DRAG_SOURCE_STYLENAME);

    // Listen to mouse up for cleanup
    mouseUpHandlerReg = Event.addNativePreviewHandler(new Event.NativePreviewHandler() {
        @Override
        public void onPreviewNativeEvent(NativePreviewEvent event) {
            if (event.getTypeInt() == Event.ONMOUSEUP || event.getTypeInt() == Event.ONTOUCHEND
                    || event.getTypeInt() == Event.ONTOUCHCANCEL) {
                if (mouseUpHandlerReg != null) {
                    mouseUpHandlerReg.removeHandler();
                    if (currentDraggedWidget != null) {

                        currentDraggedWidget.removeStyleName(ACTIVE_DRAG_SOURCE_STYLENAME);

                        if (dragImageProvider != null) {
                            com.google.gwt.dom.client.Element dragImageElement = dragImageProvider
                                    .getDragImageElement(currentDraggedWidget);
                            if (dragImageElement != null) {
                                dragImageElement.removeClassName(ACTIVE_DRAG_SOURCE_STYLENAME);
                            }
                        }

                        currentDraggedWidget = null;
                    }
                }

                // Ensure capturing is turned off at mouse up
                Event.releaseCapture(RootPanel.getBodyElement());
            }
        }
    });

}

From source file:com.haulmont.cuba.web.widgets.client.tabsheet.CubaTabSheetWidget.java

License:Apache License

public CubaTabSheetWidget() {
    RootPanel rootPanel = RootPanel.get();

    dragEndHandler = rootPanel.addBitlessDomHandler(event -> handleBadDD(event.getNativeEvent()),
            DragEndEvent.getType());/*from   w w w . ja v  a2s .  c  o  m*/

    dropHandler = rootPanel.addBitlessDomHandler(event -> handleBadDD(event.getNativeEvent()),
            DropEvent.getType());

    dragLeaveHandler = rootPanel.addBitlessDomHandler(event -> {
        Element element = event.getRelativeElement();
        if (element == null || element == rootPanel.getElement()) {
            VDragAndDropManager.get().interruptDrag();
        }
    }, DragLeaveEvent.getType());
}

From source file:com.haulmont.cuba.web.widgets.client.tabsheet.CubaTabSheetWidget.java

License:Apache License

protected void handleBadDD(NativeEvent event) {
    Element target = WidgetUtil.getElementUnderMouse(event);
    if (target == null) {
        VDragAndDropManager.get().interruptDrag();
        return;//from   w  w  w.  j  a va2  s .c o  m
    }

    Node targetParent = DOM.asOld(target).getParentNode();
    if (!getElement().isOrHasChild(targetParent)) {
        VDragAndDropManager.get().interruptDrag();
    }
}

From source file:fi.jasoft.dragdroplayouts.client.ui.VLayoutDragDropMouseHandler.java

License:Apache License

/**
 * Called when the dragging a component should be initiated by both a mouse
 * down event as well as a touch start event
 * //from   www.  jav  a2 s  .c o  m
 * FIXME This method is a BIG hack to circumvent Vaadin's very poor client
 * side API's. This will break often. Refactor once Vaadin gets a grip.
 * 
 * @param event
 */
protected void initiateDrag(NativeEvent event) {
    // Check that dragging is enabled
    if (dragMode == LayoutDragMode.NONE) {
        return;
    }

    // Dragging can only be done with left mouse button and no modifier keys
    if (!isMouseDragEvent(event) && !Util.isTouchEvent(event)) {
        return;
    }

    // Get target widget
    EventTarget eventTarget = event.getEventTarget();
    Element targetElement = Element.as(eventTarget);
    Widget target = WidgetUtil.findWidget(targetElement, null);

    if (isEventOnScrollBar(event)) {
        return;
    }

    // do not drag close button of TabSheet tab
    if (isElementNotDraggable(targetElement)) {
        VDragAndDropManager.get().interruptDrag();
        return;
    }

    // Abort if drag mode is caption mode and widget is not a caption
    boolean isPanelCaption = target instanceof VPanel
            && targetElement.getParentElement().getClassName().contains("v-panel-caption");
    boolean isCaption = isPanelCaption || VDragDropUtil.isCaptionOrCaptionless(target);

    if (dragMode == LayoutDragMode.CAPTION && !isCaption) {
        /*
         * Ensure target is a caption in caption mode
         */
        return;
    }

    if (dragMode == LayoutDragMode.CAPTION && isCaption) {

        /*
         * Ensure that captions in nested layouts don't get accepted if in
         * caption mode
         */

        Widget w = VDragDropUtil.getTransferableWidget(target);
        ComponentConnector c = Util.findConnectorFor(w);
        ComponentConnector parent = (ComponentConnector) c.getParent();
        if (parent.getWidget() != root) {
            return;
        }
    }

    // Create the transfarable
    VTransferable transferable = VDragDropUtil.createLayoutTransferableFromMouseDown(event, root, target);

    // Are we trying to drag the root layout
    if (transferable == null) {
        VConsole.log("Creating transferable on mouse down returned null");
        return;
    }

    // Resolve the component
    final Widget w;
    ComponentConnector c = null, parent = null;

    if (target instanceof TabCaption) {
        TabCaption tabCaption = (TabCaption) target;
        Tab tab = tabCaption.getTab();
        int tabIndex = ((ComplexPanel) tab.getParent()).getWidgetIndex(tab);
        VTabsheet tabsheet = tab.getTabsheet();

        w = tab;
        c = tabsheet.getTab(tabIndex);
        parent = Util.findConnectorFor(tabsheet);

    } else if (root instanceof VDDAccordion) {
        w = target;
        parent = Util.findConnectorFor(root);

        StackItem tab = WidgetUtil.findWidget(targetElement, StackItem.class);
        if (tab != null && root.getElement().isOrHasChild(tab.getElement())) {
            c = ((VDDAccordion) root).getTab(((VDDAccordion) root).getTabPosition(tab));
        }

    } else if (transferable.getData(Constants.TRANSFERABLE_DETAIL_COMPONENT) != null) {

        ComponentConnector connector = (ComponentConnector) transferable
                .getData(Constants.TRANSFERABLE_DETAIL_COMPONENT);
        w = connector.getWidget();
        c = Util.findConnectorFor(w);
        parent = (ComponentConnector) c.getParent();

    } else {
        // Failsafe if no widget was found
        w = root;
        c = Util.findConnectorFor(w);
        parent = (ComponentConnector) c.getParent();
        VConsole.log("Could not resolve component, using root as component");
    }

    VConsole.log("Dragging widget: " + w);
    VConsole.log(" in parent: " + parent);

    // Ensure component is draggable
    if (!VDragDropUtil.isDraggingEnabled(parent, w)) {
        VConsole.log("Dragging disabled for " + w.getClass().getName() + " in "
                + parent.getWidget().getClass().getName());
        VDragAndDropManager.get().interruptDrag();
        return;
    }

    // Announce drag start to listeners
    for (DragStartListener dl : dragStartListeners) {
        if (!dl.dragStart(w, dragMode)) {
            VDragAndDropManager.get().interruptDrag();
            return;
        }
    }

    currentDraggedWidget = w;

    // Announce to handler that we are starting a drag operation
    VDragEvent currentDragEvent = VDragAndDropManager.get().startDrag(transferable, event, true);

    /*
     * Create the drag image
     */
    com.google.gwt.dom.client.Element dragImageElement = dragImageProvider == null ? null
            : dragImageProvider.getDragImageElement(w);

    if (dragImageElement != null) {

        // Set stylename to proxy component as well
        dragImageElement.addClassName(ACTIVE_DRAG_SOURCE_STYLENAME);

    } else if (root instanceof VCssLayout) {
        /*
         * CSS Layout does not have an enclosing div so we just use the
         * component div
         */
        dragImageElement = w.getElement();

    } else if (root instanceof VTabsheet) {
        /*
         * Tabsheet should use the dragged tab as a drag image
         */
        dragImageElement = targetElement;

    } else if (root instanceof VAccordion) {
        /*
         * Accordion should use the dragged tab as a drag image
         */
        dragImageElement = targetElement;

    } else if (root instanceof VFormLayout) {
        /*
         * Dragging a component in a form layout should include the caption
         * and error indicator as well
         */
        Element rowElement = (Element) VDDFormLayout
                .getRowFromChildElement((com.google.gwt.dom.client.Element) w.getElement().cast(),
                        (com.google.gwt.dom.client.Element) root.getElement().cast())
                .cast();

        dragImageElement = rowElement;

    } else {
        /*
         * For other layouts we just use the target element;
         */
        dragImageElement = w.getElement();
    }

    currentDragEvent.createDragImage(dragImageElement, true);
    Element clone = currentDragEvent.getDragImage();
    assert (clone != null);

    // Lock drag image dimensions
    clone.getStyle().setWidth(dragImageElement.getOffsetWidth(), Unit.PX);
    clone.getStyle().setHeight(dragImageElement.getOffsetHeight(), Unit.PX);

    if (c != null && c.delegateCaptionHandling() && !(root instanceof VTabsheet)
            && !(root instanceof VAccordion)) {
        /*
         * Captions are not being dragged with the widget since they are
         * separate. Manually add a clone of the caption to the drag image.
         */
        if (target instanceof VCaption) {
            clone.insertFirst(targetElement.cloneNode(true));
        }
    }

    if (BrowserInfo.get().isIE()) {
        // Fix IE not aligning the drag image correctly when dragging
        // layouts
        clone.getStyle().setPosition(Position.ABSOLUTE);
    }

    currentDraggedWidget.addStyleName(ACTIVE_DRAG_SOURCE_STYLENAME);

    // Listen to mouse up for cleanup
    mouseUpHandlerReg = Event.addNativePreviewHandler(new Event.NativePreviewHandler() {
        @Override
        public void onPreviewNativeEvent(NativePreviewEvent event) {
            if (event.getTypeInt() == Event.ONMOUSEUP || event.getTypeInt() == Event.ONTOUCHEND
                    || event.getTypeInt() == Event.ONTOUCHCANCEL) {
                if (mouseUpHandlerReg != null) {
                    mouseUpHandlerReg.removeHandler();
                    if (currentDraggedWidget != null) {

                        currentDraggedWidget.removeStyleName(ACTIVE_DRAG_SOURCE_STYLENAME);

                        if (dragImageProvider != null) {
                            com.google.gwt.dom.client.Element dragImageElement = dragImageProvider
                                    .getDragImageElement(currentDraggedWidget);
                            if (dragImageElement != null) {
                                dragImageElement.removeClassName(ACTIVE_DRAG_SOURCE_STYLENAME);
                            }
                        }

                        currentDraggedWidget = null;
                    }
                }

                // Ensure capturing is turned off at mouse up
                Event.releaseCapture(RootPanel.getBodyElement());
            }
        }
    });

}

From source file:org.eclipse.hawkbit.ui.dd.client.criteria.ViewComponentClientCriterion.java

License:Open Source License

/**
 * Checks if the current drop location is a valid drop target for the
 * criterion. Therefore the current drop location id has to start with one
 * of the drop target id-prefixes configured for the criterion.
 *
 * @param configuration/*from   w  w w . ja v  a  2 s .  c  o m*/
 *            for the accept criterion to retrieve the configured drop
 *            target id-prefixes.
 * @return <code>true</code> if the current drop location is a valid drop
 *         target for the criterion, otherwise <code>false</code>.
 */
// Exception squid:S1166 - Hide origin exception
// Exception squid:S2221 - This code is trans-coded to JavaScript, hence
// Exception semantics changes
// Exception squid:S2629 - not supported by GWT
@SuppressWarnings({ "squid:S1166", "squid:S2221", "squid:S2629" })
boolean isValidDropTarget(final UIDL configuration) {
    try {
        final String dropTarget = VDragAndDropManager.get().getCurrentDropHandler().getConnector().getWidget()
                .getElement().getId();
        final int dropTargetCount = configuration.getIntAttribute(DROP_TARGET_COUNT);
        for (int dropTargetIndex = 0; dropTargetIndex < dropTargetCount; dropTargetIndex++) {
            final String dropTargetPrefix = configuration.getStringAttribute(DROP_TARGET + dropTargetIndex);
            LOGGER.log(Level.FINE, "Drop Target: " + dropTargetPrefix);
            if (dropTarget.startsWith(dropTargetPrefix)) {
                return true;
            }
        }
    } catch (final Exception e) {
        // log and continue
        LOGGER.log(Level.SEVERE, "Error verifying drop target: " + e.getLocalizedMessage());
    }
    return false;
}

From source file:org.peergreen.vaadin.diagram.client.DiagramConnector.java

License:Apache License

@Override
protected void init() {
    super.init();

    // Register all the mouse events.
    getWidget().addMouseDownHandler(new DiagramClientMouseDownHandler(this, clientStateModel));
    getWidget().addMouseMoveHandler(new DiagramClientMouseMoveHandler(this, clientStateModel));
    getWidget().addMouseOutHandler(new DiagramClientMouseOutHandler(this, clientStateModel));
    getWidget().addMouseUpHandler(new DiagramClientMouseUpHandler(this, clientStateModel));
    getWidget().addClickHandler(new DiagramClientClickHandler(this, clientStateModel));
    getWidget().addMouseWheelHandler(new DiagramClientMouseWheelHandler(this, clientStateModel));

    // For the drop, notify the Drag and Drop manager
    getWidget().addMouseOutHandler(new MouseOutHandler() {

        @Override//from ww w . java 2s.  c o  m
        public void onMouseOut(MouseOutEvent event) {
            VDragAndDropManager.get().setCurrentDropHandler(null);
        }
    });
    getWidget().addMouseOverHandler(new MouseOverHandler() {
        @Override
        public void onMouseOver(MouseOverEvent event) {
            VDragAndDropManager.get().setCurrentDropHandler(getWidget().getDropHandler());
        }
    });

    // Key events
    getWidget().addKeyUpHandler(new DiagramClientKeyUpHandler(this, clientStateModel));

    MoveComponentUI moveComponentUI = new MoveComponentUI(this, clientStateModel, "moveComponent");
    clientStateModel.getRootUIs().add(moveComponentUI);
    clientStateModel.setMoveComponentUI(moveComponentUI);

    ZoomComponentUI zoomComponentUI = new ZoomComponentUI(this, clientStateModel, "zoomComponent");
    clientStateModel.getRootUIs().add(zoomComponentUI);
    clientStateModel.setZoomComponentUI(zoomComponentUI);

}