package com.vaadin.tests.dd; import java.util.Iterator; import com.vaadin.event.dd.DragAndDropEvent; import com.vaadin.event.dd.DropHandler; import com.vaadin.event.dd.DropTarget; import com.vaadin.event.dd.acceptcriteria.AcceptAll; import com.vaadin.event.dd.acceptcriteria.AcceptCriterion; import com.vaadin.tests.components.TestBase; import com.vaadin.ui.Component; import com.vaadin.ui.CssLayout; import com.vaadin.ui.DragAndDropWrapper; import com.vaadin.ui.DragAndDropWrapper.DragStartMode; import com.vaadin.ui.DragAndDropWrapper.WrapperTransferable; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.UI; public class DDTest5 extends TestBase { java.util.Random r = new java.util.Random(1); HorizontalLayout hl = new HorizontalLayout(); private DragAndDropWrapper dragAndDropWrapper2; private DropHandler dh; private static int count; class WrappedLabel extends DragAndDropWrapper { private static final long serialVersionUID = 1L; public WrappedLabel(String content) { super(new Label(content + " c:" + ++count)); setDragStartMode(DragStartMode.WRAPPER); } @Override public DropHandler getDropHandler() { return dh; } } @Override protected void setup() { UI w = getLayout().getUI(); HorizontalSortableCssLayoutWithWrappers verticalSortableCssLayoutWithWrappers = new HorizontalSortableCssLayoutWithWrappers(); w.addWindow(verticalSortableCssLayoutWithWrappers); verticalSortableCssLayoutWithWrappers.setPositionX(200); /* * FIXME: subwindow horizontal position does not work if only x set */ verticalSortableCssLayoutWithWrappers.setPositionY(40); Label l; l = new Label("Drag me"); DragAndDropWrapper dragAndDropWrapper = new DragAndDropWrapper(l); dragAndDropWrapper.setDragStartMode(DragStartMode.COMPONENT); dragAndDropWrapper.setWidth("100px"); dragAndDropWrapper.setHeight("100px"); getLayout().addComponent(dragAndDropWrapper); l = new Label("Drag me too"); dragAndDropWrapper = new DragAndDropWrapper(l); dragAndDropWrapper.setDragStartMode(DragStartMode.WRAPPER); dragAndDropWrapper.setWidth("100px"); dragAndDropWrapper.setHeight("100px"); getLayout().addComponent(dragAndDropWrapper); final CssLayout cssLayout = new CssLayout(); cssLayout.setHeight("300px"); dragAndDropWrapper2 = new DragAndDropWrapper(cssLayout); dragAndDropWrapper2.setCaption( "Drop here or sort with dd (wrapper(csslayout(n*wrapper(label))))"); dh = new DropHandler() { @Override public AcceptCriterion getAcceptCriterion() { return AcceptAll.get(); } @Override public void drop(DragAndDropEvent dropEvent) { /* * TODO wrap componentns in wrappers (so we can build reordering * here) */ if (dropEvent .getTransferable() instanceof WrapperTransferable) { WrapperTransferable transferable = (WrapperTransferable) dropEvent .getTransferable(); Component sourceComponent = transferable .getSourceComponent(); Component draggedComponent = transferable .getDraggedComponent(); DropTarget target = dropEvent.getTargetDetails() .getTarget(); WrappedLabel wrappedLabel = new WrappedLabel( draggedComponent.toString()); if (target instanceof WrappedLabel) { int i = 1; // add next to reference by default Iterator<Component> componentIterator = cssLayout .getComponentIterator(); Component next = componentIterator.next(); while (next != target && componentIterator.hasNext()) { if (next != sourceComponent) { // don't count on index if component is being // moved i++; } next = componentIterator.next(); } if (sourceComponent instanceof WrappedLabel) { cssLayout.removeComponent(sourceComponent); wrappedLabel = (WrappedLabel) sourceComponent; } if (dropEvent.getTargetDetails() .getData("verticalLocation").equals("TOP")) { // before reference if dropped on topmost part i--; if (i < 0) { i = 0; } } cssLayout.addComponent(wrappedLabel, i); } else { cssLayout.addComponent(wrappedLabel); } } else { // no component, add label with "Text" String data = (String) dropEvent.getTransferable() .getData("text/plain"); if (data == null || "".equals(data)) { data = "-- no Text --"; } cssLayout.addComponent(new WrappedLabel(data)); } } }; dragAndDropWrapper2.setDropHandler(dh); getLayout().addComponent(dragAndDropWrapper2); } @Override protected String getDescription() { return "dd: DragAndDropWrapper to build various use cases completely on server side"; } @Override protected Integer getTicketNumber() { return 119; } }