@Override public void onDragStart( DragStartEvent event ) { String text = extractText(); event.setData( type.name(), text ); event.getDataTransfer().setDragImage( move.getElement(), 10, 10 ); } }, DragStartEvent.getType() );
@Test public void mustHaveDragOverToAllowDrop() { StubAnchor a1 = new StubAnchor(); StubAnchor a2 = new StubAnchor(); a1.addDragStartHandler(e -> e.setData("text/plain", "foo")); a1.dragStart(); try { a2.drop(); fail(); } catch (IllegalStateException ise) { assertThat(ise.getMessage(), is("addDragOverHandler must be called to get drop events")); } }
@Test public void dropRequiresDragStart() { StubAnchor a1 = new StubAnchor(); StubAnchor a2 = new StubAnchor(); a1.addDragStartHandler(e -> e.setData("text/plain", "foo")); a2.addDragOverHandler(e -> { }); try { a2.drop(); fail(); } catch (IllegalStateException ise) { assertThat(ise.getMessage(), is("No stub dragStart() was called")); } }
@UiHandler("container") void onDragStart(DragStartEvent event) { if (!dragEnabled) { return; } // IE strikes again, for some unknown reason, in IE you can only put 'Text' as the setData first // parameter. So if you want to pass multiple values, you have to collect them in one string, then parse // the string on the other end instead of passing different values. String aggregatedString = "VM_GID=" + nodeModel.getVm().getId().toString(); //$NON-NLS-1$ aggregatedString += "|PINNED=" + String.valueOf(nodeModel.isPinned()); //$NON-NLS-1$ aggregatedString += "|INDEX=" + String.valueOf(nodeModel.getIndex()); //$NON-NLS-1$ event.setData("Text", aggregatedString); //$NON-NLS-1$ // show a ghost of the widget under cursor. NativeEvent nativeEvent = event.getNativeEvent(); int x = nativeEvent.getClientX() - getAbsoluteLeft(); int y = nativeEvent.getClientY() - getAbsoluteTop(); event.getDataTransfer().setDragImage(getElement(), x, y); }
@Test public void dropRequiresLastDragOverToBeCanceled() { StubAnchor a1 = new StubAnchor(); StubAnchor a2 = new StubAnchor(); a1.addDragStartHandler(e -> e.setData("text/plain", "foo")); a2.addDragOverHandler(e -> { }); a1.dragStart(); a2.dragOver(); try { a2.drop(); fail(); } catch (IllegalStateException ise) { assertThat(ise.getMessage(), is("addDragOverHandler should call preventDefault() if it wants to drop")); } }
@Test public void dropHandlerShouldPreventDefault() { StubAnchor a1 = new StubAnchor(); StubAnchor a2 = new StubAnchor(); a1.addDragStartHandler(e -> e.setData("text/plain", "foo")); a2.addDragOverHandler(e -> { e.preventDefault(); }); a1.dragStart(); a2.dragOver(); try { a2.drop(); fail(); } catch (IllegalStateException ise) { assertThat(ise.getMessage(), is("addDropHandler should call preventDefault()")); } }
@Test public void dropCallsDragEnd() { StubAnchor a1 = new StubAnchor(); StubAnchor a2 = new StubAnchor(); boolean[] ended = { false }; a1.addDragStartHandler(e -> e.setData("text/plain", "foo")); a1.addDragEndHandler(e -> ended[0] = true); a2.addDragOverHandler(e -> { e.preventDefault(); }); a2.addDropHandler(e -> { e.preventDefault(); }); a1.dragStart(); a2.drop(); assertThat(ended[0], is(true)); }
@Test public void dataIsPassedToDrop() { StubAnchor a1 = new StubAnchor(); StubAnchor a2 = new StubAnchor(); boolean[] ended = { false }; a1.addDragStartHandler(e -> e.setData("text/plain", "foo")); a1.addDragEndHandler(e -> ended[0] = true); a2.addDragOverHandler(e -> { e.preventDefault(); }); a2.addDropHandler(e -> { assertThat(e.getData("text/plain"), is("foo")); e.preventDefault(); }); a1.dragStart(); a2.drop(); } }
private <T extends HasAllDragAndDropHandlers & IsWidget> void set(String type, IsFlowPanel root, Property<T> current, T a) { // just to see one of them not be draggable if (a != view.a4() && a != view.l4()) { a.getIsElement().setAttribute("draggable", "true"); } binder.when(draggingOver(a)).is(true).set(view.style().bold()).on(a); binder.when(dragging(a)).is(true).set(current).to(a); a.addDragStartHandler(e -> e.setData("text", type)); a.addDragOverHandler(e -> e.preventDefault()); a.addDropHandler(e -> { if (type.equals(e.getData("text")) && current.get() != a) { GWT.log("Dropped " + current + " onto " + a); root.remove(current.get()); root.insert(current.get(), root.getWidgetIndex(a)); } e.preventDefault(); }); }
@Test public void dropImplicitlyCallsOverIfNotExplicitlyCalled() { StubAnchor a1 = new StubAnchor(); StubAnchor a2 = new StubAnchor(); a1.addDragStartHandler(e -> e.setData("text/plain", "foo")); a2.addDragOverHandler(e -> { e.preventDefault(); }); a2.addDropHandler(e -> { e.preventDefault(); }); a1.dragStart(); // no explicit dragOver // a2.dragOver(); a2.drop(); }
@Test public void successfulDragAndDrop() { StubAnchor a1 = new StubAnchor(); StubAnchor a2 = new StubAnchor(); a1.addDragStartHandler(e -> e.setData("text/plain", "foo")); a2.addDragOverHandler(e -> { e.preventDefault(); }); a2.addDropHandler(e -> { e.preventDefault(); }); a1.dragStart(); a2.dragOver(); a2.drop(); }