From 51dcdc1c98d70c7aec857e28f1d8933321a6431a Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Wed, 17 Feb 2010 16:33:11 +0000 Subject: [PATCH] wrapper enhancements + rules svn changeset:11363/svn branch:6.3_dd --- .../dd/acceptCriteria/ContainsDataFlawor.java | 36 ++++++ .../dd/acceptCriteria/DropDetailEquals.java | 39 ++++++ .../vaadin/event/dd/acceptCriteria/Not.java | 8 ++ .../acceptCriteria/SourceIsSameAsTarget.java | 26 ++++ .../gwt/client/ui/VCustomComponent.java | 8 +- .../gwt/client/ui/VDragAndDropWrapper.java | 112 ++++++++++++------ .../gwt/client/ui/dd/VContainsDataFlawor.java | 22 ++++ .../gwt/client/ui/dd/VDragAndDropManager.java | 4 + .../gwt/client/ui/dd/VDropDetailEquals.java | 22 ++++ .../client/ui/dd/VSourceIsSameAsTarget.java | 24 ++++ .../customcomponent/ClipContent.java | 56 +++++++++ .../HorizontalLayoutSortableWithWrappers.java | 111 +++++++++++++++++ ...izontalSortableCssLayoutWithWrappers.java} | 8 +- 13 files changed, 431 insertions(+), 45 deletions(-) create mode 100644 src/com/vaadin/event/dd/acceptCriteria/ContainsDataFlawor.java create mode 100644 src/com/vaadin/event/dd/acceptCriteria/DropDetailEquals.java create mode 100644 src/com/vaadin/event/dd/acceptCriteria/SourceIsSameAsTarget.java create mode 100644 src/com/vaadin/terminal/gwt/client/ui/dd/VContainsDataFlawor.java create mode 100644 src/com/vaadin/terminal/gwt/client/ui/dd/VDropDetailEquals.java create mode 100644 src/com/vaadin/terminal/gwt/client/ui/dd/VSourceIsSameAsTarget.java create mode 100644 tests/src/com/vaadin/tests/components/customcomponent/ClipContent.java create mode 100644 tests/src/com/vaadin/tests/dd/HorizontalLayoutSortableWithWrappers.java rename tests/src/com/vaadin/tests/dd/{VerticalSortableCssLayoutWithWrappers.java => HorizontalSortableCssLayoutWithWrappers.java} (93%) diff --git a/src/com/vaadin/event/dd/acceptCriteria/ContainsDataFlawor.java b/src/com/vaadin/event/dd/acceptCriteria/ContainsDataFlawor.java new file mode 100644 index 0000000000..536de5e4fe --- /dev/null +++ b/src/com/vaadin/event/dd/acceptCriteria/ContainsDataFlawor.java @@ -0,0 +1,36 @@ +/** + * + */ +package com.vaadin.event.dd.acceptCriteria; + +import com.vaadin.event.dd.DragAndDropEvent; +import com.vaadin.terminal.PaintException; +import com.vaadin.terminal.PaintTarget; +import com.vaadin.terminal.gwt.client.ui.dd.VContainsDataFlawor; + +@ClientCriterion(VContainsDataFlawor.class) +public final class ContainsDataFlawor extends ClientSideCriterion { + + private String dataFlaworId; + + /** + * TODO should support basic UIDL data types + * + * @param dataFlawor + * @param value + */ + public ContainsDataFlawor(String dataFlawor) { + dataFlaworId = dataFlawor; + } + + @Override + public void paintContent(PaintTarget target) throws PaintException { + super.paintContent(target); + target.addAttribute("p", dataFlaworId); + } + + public boolean accepts(DragAndDropEvent dragEvent) { + return dragEvent.getTransferable().getDataFlawors().contains( + dataFlaworId); + } +} \ No newline at end of file diff --git a/src/com/vaadin/event/dd/acceptCriteria/DropDetailEquals.java b/src/com/vaadin/event/dd/acceptCriteria/DropDetailEquals.java new file mode 100644 index 0000000000..a7852a6c82 --- /dev/null +++ b/src/com/vaadin/event/dd/acceptCriteria/DropDetailEquals.java @@ -0,0 +1,39 @@ +/** + * + */ +package com.vaadin.event.dd.acceptCriteria; + +import com.vaadin.event.dd.DragAndDropEvent; +import com.vaadin.terminal.PaintException; +import com.vaadin.terminal.PaintTarget; +import com.vaadin.terminal.gwt.client.ui.dd.VDropDetailEquals; + +@ClientCriterion(VDropDetailEquals.class) +public final class DropDetailEquals extends ClientSideCriterion { + + private String propertyName; + private String value; + + /** + * TODO should support basic UIDL data types + * + * @param propertyName + * @param value + */ + public DropDetailEquals(String propertyName, String value) { + this.propertyName = propertyName; + this.value = value; + } + + @Override + public void paintContent(PaintTarget target) throws PaintException { + super.paintContent(target); + target.addAttribute("p", propertyName); + target.addAttribute("v", value); + } + + public boolean accepts(DragAndDropEvent dragEvent) { + Object data = dragEvent.getDropTargetData().getData(propertyName); + return value.equals(data); + } +} \ No newline at end of file diff --git a/src/com/vaadin/event/dd/acceptCriteria/Not.java b/src/com/vaadin/event/dd/acceptCriteria/Not.java index d11df81d55..72c1f5e629 100644 --- a/src/com/vaadin/event/dd/acceptCriteria/Not.java +++ b/src/com/vaadin/event/dd/acceptCriteria/Not.java @@ -4,6 +4,8 @@ package com.vaadin.event.dd.acceptCriteria; import com.vaadin.event.dd.DragAndDropEvent; +import com.vaadin.terminal.PaintException; +import com.vaadin.terminal.PaintTarget; import com.vaadin.terminal.gwt.client.ui.dd.VNot; @ClientCriterion(VNot.class) @@ -15,6 +17,12 @@ public class Not extends ClientSideCriterion { this.acceptCriterion = acceptCriterion; } + @Override + public void paintContent(PaintTarget target) throws PaintException { + super.paintContent(target); + acceptCriterion.paint(target); + } + public boolean accepts(DragAndDropEvent dragEvent) { return !acceptCriterion.accepts(dragEvent); } diff --git a/src/com/vaadin/event/dd/acceptCriteria/SourceIsSameAsTarget.java b/src/com/vaadin/event/dd/acceptCriteria/SourceIsSameAsTarget.java new file mode 100644 index 0000000000..a0a0afe37a --- /dev/null +++ b/src/com/vaadin/event/dd/acceptCriteria/SourceIsSameAsTarget.java @@ -0,0 +1,26 @@ +/** + * + */ +package com.vaadin.event.dd.acceptCriteria; + +import com.vaadin.event.ComponentTransferable; +import com.vaadin.event.dd.DragAndDropEvent; +import com.vaadin.event.dd.DropTarget; +import com.vaadin.terminal.gwt.client.ui.dd.VSourceIsSameAsTarget; +import com.vaadin.ui.Component; + +@ClientCriterion(VSourceIsSameAsTarget.class) +public class SourceIsSameAsTarget extends ClientSideCriterion { + + public boolean accepts(DragAndDropEvent dragEvent) { + if (dragEvent.getTransferable() instanceof ComponentTransferable) { + Component sourceComponent = ((ComponentTransferable) dragEvent + .getTransferable()).getSourceComponent(); + DropTarget target = dragEvent.getDropTargetData().getTarget(); + return sourceComponent == target; + } + + return false; + } + +} \ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/ui/VCustomComponent.java b/src/com/vaadin/terminal/gwt/client/ui/VCustomComponent.java index dc3cd6b2e3..9cd6cc27a6 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VCustomComponent.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VCustomComponent.java @@ -93,11 +93,11 @@ public class VCustomComponent extends SimplePanel implements Container { return updated; } - private boolean isDynamicWidth() { + protected boolean isDynamicWidth() { return width == null || width.equals(""); } - private boolean isDynamicHeight() { + protected boolean isDynamicHeight() { return height == null || height.equals(""); } @@ -138,7 +138,7 @@ public class VCustomComponent extends SimplePanel implements Container { if (!height.equals(this.height)) { this.height = height; if (!rendering) { - client.runDescendentsLayout(this); + client.handleComponentRelativeSize(getWidget()); } } } @@ -151,7 +151,7 @@ public class VCustomComponent extends SimplePanel implements Container { if (!width.equals(this.width)) { this.width = width; if (!rendering) { - client.runDescendentsLayout(this); + client.handleComponentRelativeSize(getWidget()); } } } diff --git a/src/com/vaadin/terminal/gwt/client/ui/VDragAndDropWrapper.java b/src/com/vaadin/terminal/gwt/client/ui/VDragAndDropWrapper.java index 5aab1fa955..70072a8066 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VDragAndDropWrapper.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VDragAndDropWrapper.java @@ -11,7 +11,10 @@ import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.Paintable; +import com.vaadin.terminal.gwt.client.RenderInformation; import com.vaadin.terminal.gwt.client.UIDL; +import com.vaadin.terminal.gwt.client.Util; +import com.vaadin.terminal.gwt.client.RenderInformation.Size; import com.vaadin.terminal.gwt.client.ui.dd.HorizontalDropLocation; import com.vaadin.terminal.gwt.client.ui.dd.VAbstractDropHandler; import com.vaadin.terminal.gwt.client.ui.dd.VAcceptCallback; @@ -198,14 +201,18 @@ public class VDragAndDropWrapper extends VCustomComponent implements return dropHandler; } - private class CustomDropHandler extends VAbstractDropHandler { + protected VerticalDropLocation verticalDropLocation; + protected HorizontalDropLocation horizontalDropLocation; + private VerticalDropLocation emphasizedVDrop; + private HorizontalDropLocation emphasizedHDrop; - private static final String OVER_STYLE = "v-ddwrapper-over"; - private VerticalDropLocation verticalDropLocation; - private HorizontalDropLocation horizontalDropLocation; + private static final String OVER_STYLE = "v-ddwrapper-over"; + + public class CustomDropHandler extends VAbstractDropHandler { @Override public void dragEnter(VDragEvent drag) { + updateDropDetails(drag); ApplicationConnection.getConsole().log("DDWrapper DragEnter"); super.dragEnter(drag); } @@ -213,11 +220,12 @@ public class VDragAndDropWrapper extends VCustomComponent implements @Override public void dragLeave(VDragEvent drag) { ApplicationConnection.getConsole().log("DDWrapper DragLeave"); - deEmphasis(); + deEmphasis(true); } @Override public void dragOver(final VDragEvent drag) { + updateDropDetails(drag); validate(new VAcceptCallback() { public void accepted(VDragEvent event) { dragAccepted(drag); @@ -228,7 +236,7 @@ public class VDragAndDropWrapper extends VCustomComponent implements @Override public boolean drop(VDragEvent drag) { ApplicationConnection.getConsole().log("Drop" + drag.sinceStart()); - deEmphasis(); + deEmphasis(true); Map dd = drag.getDropDetails(); @@ -243,22 +251,12 @@ public class VDragAndDropWrapper extends VCustomComponent implements dd.put("absoluteLeft", absoluteLeft); dd.put("absoluteTop", absoluteTop); - dd.put("verticalLocation", verticalDropLocation.toString()); - dd.put("horizontalLocation", horizontalDropLocation.toString()); - - return super.drop(drag); - } - - private void deEmphasis() { if (verticalDropLocation != null) { - VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE, - false); - VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE + "-" - + verticalDropLocation.toString().toLowerCase(), false); - VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE + "-" - + horizontalDropLocation.toString().toLowerCase(), - false); + dd.put("verticalLocation", verticalDropLocation.toString()); + dd.put("horizontalLocation", horizontalDropLocation.toString()); } + + return super.drop(drag); } @Override @@ -266,23 +264,6 @@ public class VDragAndDropWrapper extends VCustomComponent implements emphasis(drag); } - private void emphasis(VDragEvent drag) { - deEmphasis(); - verticalDropLocation = VerticalDropLocation.get(getElement(), drag - .getCurrentGwtEvent().getClientY(), 0.2); - horizontalDropLocation = HorizontalDropLocation.get(getElement(), - drag.getCurrentGwtEvent().getClientX(), 0.2); - VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE, true); - VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE + "-" - + verticalDropLocation.toString().toLowerCase(), true); - VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE + "-" - + horizontalDropLocation.toString().toLowerCase(), true); - - // TODO build (to be an example) an emphasis mode where drag image - // is fitted before or after the content - - } - @Override public Paintable getPaintable() { return VDragAndDropWrapper.this; @@ -341,4 +322,61 @@ public class VDragAndDropWrapper extends VCustomComponent implements }-*/; + public void updateDropDetails(VDragEvent drag) { + verticalDropLocation = VerticalDropLocation.get(getElement(), drag + .getCurrentGwtEvent().getClientY(), 0.2); + drag.getDropDetails().put("verticalLocation", + verticalDropLocation.toString()); + horizontalDropLocation = HorizontalDropLocation.get(getElement(), drag + .getCurrentGwtEvent().getClientX(), 0.2); + drag.getDropDetails().put("horizontalLocation", + horizontalDropLocation.toString()); + } + + protected void deEmphasis(boolean doLayout) { + Size size = null; + if (doLayout) { + size = new RenderInformation.Size(getOffsetWidth(), + getOffsetHeight()); + } + if (emphasizedVDrop != null) { + VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE, false); + VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE + "-" + + emphasizedVDrop.toString().toLowerCase(), false); + VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE + "-" + + emphasizedHDrop.toString().toLowerCase(), false); + } + if (doLayout) { + handleVaadinRelatedSizeChange(size); + } + } + + protected void emphasis(VDragEvent drag) { + Size size = new RenderInformation.Size(getOffsetWidth(), + getOffsetHeight()); + deEmphasis(false); + VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE, true); + VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE + "-" + + verticalDropLocation.toString().toLowerCase(), true); + VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE + "-" + + horizontalDropLocation.toString().toLowerCase(), true); + emphasizedVDrop = verticalDropLocation; + emphasizedHDrop = horizontalDropLocation; + + // TODO build (to be an example) an emphasis mode where drag image + // is fitted before or after the content + handleVaadinRelatedSizeChange(size); + + } + + protected void handleVaadinRelatedSizeChange(Size originalSize) { + if (isDynamicHeight() || isDynamicWidth()) { + if (!originalSize.equals(new RenderInformation.Size( + getOffsetWidth(), getOffsetHeight()))) { + Util.notifyParentOfSizeChange(VDragAndDropWrapper.this, false); + } + } + client.handleComponentRelativeSize(VDragAndDropWrapper.this); + } + } diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VContainsDataFlawor.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VContainsDataFlawor.java new file mode 100644 index 0000000000..51f4bf8cbe --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VContainsDataFlawor.java @@ -0,0 +1,22 @@ +/** + * + */ +package com.vaadin.terminal.gwt.client.ui.dd; + +import com.vaadin.terminal.gwt.client.UIDL; + +final public class VContainsDataFlawor implements VAcceptCriteria { + public void accept(VDragEvent drag, UIDL configuration, + VAcceptCallback callback) { + String name = configuration.getStringAttribute("p"); + boolean contains = drag.getTransferable().getDataFlawors().contains( + name); + if (contains) { + callback.accepted(drag); + } + } + + public boolean needsServerSideCheck(VDragEvent drag, UIDL criterioUIDL) { + return false; + } +} \ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java index e499f929b8..8c7617537a 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java @@ -84,6 +84,7 @@ public class VDragAndDropManager { // dragleave on old if (currentDropHandler != null) { currentDropHandler.dragLeave(currentDrag); + currentDrag.getDropDetails().clear(); serverCallback = null; } // dragenter on new @@ -138,6 +139,7 @@ public class VDragAndDropManager { if (target != null && target != currentDropHandler) { if (currentDropHandler != null) { currentDropHandler.dragLeave(currentDrag); + currentDrag.getDropDetails().clear(); } currentDropHandler = target; @@ -148,6 +150,7 @@ public class VDragAndDropManager { } else if (target == null && currentDropHandler != null) { ApplicationConnection.getConsole().log("Invalid state!?"); currentDropHandler.dragLeave(currentDrag); + currentDrag.getDropDetails().clear(); currentDropHandler = null; } break; @@ -168,6 +171,7 @@ public class VDragAndDropManager { if (currentDropHandler != null && currentDropHandler != newDragHanler) { currentDropHandler.dragLeave(currentDrag); + currentDrag.getDropDetails().clear(); currentDropHandler = null; serverCallback = null; } diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VDropDetailEquals.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VDropDetailEquals.java new file mode 100644 index 0000000000..ba5275d6a4 --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VDropDetailEquals.java @@ -0,0 +1,22 @@ +/** + * + */ +package com.vaadin.terminal.gwt.client.ui.dd; + +import com.vaadin.terminal.gwt.client.UIDL; + +final public class VDropDetailEquals implements VAcceptCriteria { + public void accept(VDragEvent drag, UIDL configuration, + VAcceptCallback callback) { + String name = configuration.getStringAttribute("p"); + String value = configuration.getStringAttribute("v"); + Object object = drag.getDropDetails().get(name); + if (value.equals(object)) { + callback.accepted(drag); + } + } + + public boolean needsServerSideCheck(VDragEvent drag, UIDL criterioUIDL) { + return false; + } +} \ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VSourceIsSameAsTarget.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VSourceIsSameAsTarget.java new file mode 100644 index 0000000000..952c159067 --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VSourceIsSameAsTarget.java @@ -0,0 +1,24 @@ +/** + * + */ +package com.vaadin.terminal.gwt.client.ui.dd; + +import com.vaadin.terminal.gwt.client.Paintable; +import com.vaadin.terminal.gwt.client.UIDL; + +final public class VSourceIsSameAsTarget implements VAcceptCriteria { + public void accept(VDragEvent drag, UIDL configuration, + VAcceptCallback callback) { + Paintable dragSource = drag.getTransferable().getDragSource(); + Paintable paintable = VDragAndDropManager.get().getCurrentDropHandler() + .getPaintable(); + + if (paintable == dragSource) { + callback.accepted(drag); + } + } + + public boolean needsServerSideCheck(VDragEvent drag, UIDL criterioUIDL) { + return false; + } +} \ No newline at end of file diff --git a/tests/src/com/vaadin/tests/components/customcomponent/ClipContent.java b/tests/src/com/vaadin/tests/components/customcomponent/ClipContent.java new file mode 100644 index 0000000000..cc7320ad03 --- /dev/null +++ b/tests/src/com/vaadin/tests/components/customcomponent/ClipContent.java @@ -0,0 +1,56 @@ +package com.vaadin.tests.components.customcomponent; + +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.Button; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.Label; +import com.vaadin.ui.TextField; + +public class ClipContent extends TestBase { + + @Override + protected void setup() { + + Label text = new Label( + "1_long_line_that_should_be_clipped
2_long_line_that_should_be_clipped
3_long_line_that_should_be_clipped
4_long_line_that_should_be_clipped
", + Label.CONTENT_XHTML); + + final CustomComponent cc = new CustomComponent(text); + cc.setWidth("20px"); + cc.setHeight("20px"); + + final TextField w = new TextField("Width"); + w.setValue("20px"); + w.addListener(new TextField.ValueChangeListener() { + public void valueChange(ValueChangeEvent event) { + cc.setWidth((String) w.getValue()); + } + }); + addComponent(w); + final TextField h = new TextField("Height"); + h.setValue("20px"); + h.addListener(new TextField.ValueChangeListener() { + public void valueChange(ValueChangeEvent event) { + cc.setHeight((String) h.getValue()); + } + }); + addComponent(h); + Button b = new Button("apply"); + addComponent(b); + + addComponent(cc); + + } + + @Override + protected String getDescription() { + return "The text in CustomComponent should be clipped if it has size defined."; + } + + @Override + protected Integer getTicketNumber() { + return null; + } + +} diff --git a/tests/src/com/vaadin/tests/dd/HorizontalLayoutSortableWithWrappers.java b/tests/src/com/vaadin/tests/dd/HorizontalLayoutSortableWithWrappers.java new file mode 100644 index 0000000000..5caeaf4432 --- /dev/null +++ b/tests/src/com/vaadin/tests/dd/HorizontalLayoutSortableWithWrappers.java @@ -0,0 +1,111 @@ +package com.vaadin.tests.dd; + +import java.util.Iterator; + +import com.vaadin.event.ComponentTransferable; +import com.vaadin.event.Transferable; +import com.vaadin.event.dd.DropEvent; +import com.vaadin.event.dd.DropHandler; +import com.vaadin.event.dd.DropTarget; +import com.vaadin.event.dd.TargetDetails; +import com.vaadin.event.dd.acceptCriteria.AcceptCriterion; +import com.vaadin.event.dd.acceptCriteria.And; +import com.vaadin.event.dd.acceptCriteria.DropDetailEquals; +import com.vaadin.event.dd.acceptCriteria.Not; +import com.vaadin.event.dd.acceptCriteria.SourceIsSameAsTarget; +import com.vaadin.ui.Component; +import com.vaadin.ui.DragAndDropWrapper; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.Window; + +/** + * Same as with css layout but tests size change propagation on emphasis + + * rules. + * + * + */ +public class HorizontalLayoutSortableWithWrappers extends Window { + + static int count; + + private HorizontalLayout layout = new HorizontalLayout(); + + class WrappedLabel extends DragAndDropWrapper { + + private static final long serialVersionUID = 1L; + + public WrappedLabel(String content) { + super(new Label(content + " c:" + ++count)); + getCompositionRoot().setWidth("60px"); + getCompositionRoot().setHeight("60px"); + setSizeUndefined(); + setDragStartMode(DragStartMode.WRAPPER); + } + + @Override + public DropHandler getDropHandler() { + return dh; + } + + } + + private DropHandler dh = new DropHandler() { + AcceptCriterion crit = new And(new DropDetailEquals( + "horizontalLocation", "LEFT"), new Not( + new SourceIsSameAsTarget())); + + public AcceptCriterion getAcceptCriterion() { + return crit; + } + + public void drop(DropEvent dropEvent) { + Transferable transferable = dropEvent.getTransferable(); + if (transferable instanceof ComponentTransferable) { + ComponentTransferable ct = (ComponentTransferable) transferable; + Component sourceComponent = ct.getSourceComponent(); + if (sourceComponent instanceof WrappedLabel) { + int index = 1; + Iterator componentIterator = layout + .getComponentIterator(); + Component next = componentIterator.next(); + TargetDetails dropTargetData = dropEvent + .getDropTargetData(); + DropTarget target = dropTargetData.getTarget(); + while (next != target) { + if (next != sourceComponent) { + index++; + } + next = componentIterator.next(); + } + if (dropTargetData.getData("horizontalLocation").equals( + "LEFT")) { + index--; + if (index < 0) { + index = 0; + } + } + + layout.removeComponent(sourceComponent); + layout.addComponent(sourceComponent, index); + } + } + // TODO Auto-generated method stub + + } + }; + + public HorizontalLayoutSortableWithWrappers() { + setCaption("Horizontally sortable layout via (ddwrappers):Try sorting blocks by draggin them"); + DragAndDropWrapper pane = new DragAndDropWrapper(layout); + setContent(pane); + pane.setSizeFull(); + setWidth("400px"); + setHeight("100px"); + + for (int i = 0; i < 4; i++) { + layout.addComponent(new WrappedLabel("Block")); + } + + } +} diff --git a/tests/src/com/vaadin/tests/dd/VerticalSortableCssLayoutWithWrappers.java b/tests/src/com/vaadin/tests/dd/HorizontalSortableCssLayoutWithWrappers.java similarity index 93% rename from tests/src/com/vaadin/tests/dd/VerticalSortableCssLayoutWithWrappers.java rename to tests/src/com/vaadin/tests/dd/HorizontalSortableCssLayoutWithWrappers.java index ac27755212..8673ffb71f 100644 --- a/tests/src/com/vaadin/tests/dd/VerticalSortableCssLayoutWithWrappers.java +++ b/tests/src/com/vaadin/tests/dd/HorizontalSortableCssLayoutWithWrappers.java @@ -16,7 +16,7 @@ import com.vaadin.ui.DragAndDropWrapper; import com.vaadin.ui.Label; import com.vaadin.ui.Window; -public class VerticalSortableCssLayoutWithWrappers extends Window { +public class HorizontalSortableCssLayoutWithWrappers extends Window { static int count; @@ -35,7 +35,7 @@ public class VerticalSortableCssLayoutWithWrappers extends Window { super(new Label(content + " c:" + ++count)); setSizeUndefined(); // via css setHeight("60px"); // FIXME custom component seems to be broken: - // can't set height with css only + // can't set height with css only setDragStartMode(DragStartMode.WRAPPER); } @@ -88,8 +88,8 @@ public class VerticalSortableCssLayoutWithWrappers extends Window { } }; - public VerticalSortableCssLayoutWithWrappers() { - setCaption("Horizontally sortable csslayout via (ddwrappers):Try sorting block by draggin them"); + public HorizontalSortableCssLayoutWithWrappers() { + setCaption("Horizontally sortable csslayout via (ddwrappers):Try sorting blocks by draggin them"); DragAndDropWrapper pane = new DragAndDropWrapper(cssLayout); setContent(pane); pane.setSizeFull(); -- 2.39.5