From: Matti Tahvonen Date: Wed, 17 Feb 2010 16:33:11 +0000 (+0000) Subject: wrapper enhancements + rules X-Git-Tag: 6.7.0.beta1~1988^2~11 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=51dcdc1c98d70c7aec857e28f1d8933321a6431a;p=vaadin-framework.git wrapper enhancements + rules svn changeset:11363/svn branch:6.3_dd --- 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/HorizontalSortableCssLayoutWithWrappers.java b/tests/src/com/vaadin/tests/dd/HorizontalSortableCssLayoutWithWrappers.java new file mode 100644 index 0000000000..8673ffb71f --- /dev/null +++ b/tests/src/com/vaadin/tests/dd/HorizontalSortableCssLayoutWithWrappers.java @@ -0,0 +1,104 @@ +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.AcceptAll; +import com.vaadin.event.dd.acceptCriteria.AcceptCriterion; +import com.vaadin.ui.Component; +import com.vaadin.ui.CssLayout; +import com.vaadin.ui.DragAndDropWrapper; +import com.vaadin.ui.Label; +import com.vaadin.ui.Window; + +public class HorizontalSortableCssLayoutWithWrappers extends Window { + + static int count; + + private CssLayout cssLayout = new CssLayout() { + @Override + protected String getCss(Component c) { + return "float:left; width:60px;height:60px;background: yellow;padding:2px;"; + }; + }; + + class WrappedLabel extends DragAndDropWrapper { + + private static final long serialVersionUID = 1L; + + public WrappedLabel(String content) { + 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 + setDragStartMode(DragStartMode.WRAPPER); + } + + @Override + public DropHandler getDropHandler() { + return dh; + } + + } + + private DropHandler dh = new DropHandler() { + + public AcceptCriterion getAcceptCriterion() { + return AcceptAll.get(); + } + + 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 = cssLayout + .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; + } + } + + cssLayout.removeComponent(sourceComponent); + cssLayout.addComponent(sourceComponent, index); + } + } + // TODO Auto-generated method stub + + } + }; + + public HorizontalSortableCssLayoutWithWrappers() { + setCaption("Horizontally sortable csslayout via (ddwrappers):Try sorting blocks by draggin them"); + DragAndDropWrapper pane = new DragAndDropWrapper(cssLayout); + setContent(pane); + pane.setSizeFull(); + setWidth("400px"); + setHeight("100px"); + + for (int i = 0; i < 4; i++) { + cssLayout.addComponent(new WrappedLabel("Block")); + } + + } +} diff --git a/tests/src/com/vaadin/tests/dd/VerticalSortableCssLayoutWithWrappers.java b/tests/src/com/vaadin/tests/dd/VerticalSortableCssLayoutWithWrappers.java deleted file mode 100644 index ac27755212..0000000000 --- a/tests/src/com/vaadin/tests/dd/VerticalSortableCssLayoutWithWrappers.java +++ /dev/null @@ -1,104 +0,0 @@ -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.AcceptAll; -import com.vaadin.event.dd.acceptCriteria.AcceptCriterion; -import com.vaadin.ui.Component; -import com.vaadin.ui.CssLayout; -import com.vaadin.ui.DragAndDropWrapper; -import com.vaadin.ui.Label; -import com.vaadin.ui.Window; - -public class VerticalSortableCssLayoutWithWrappers extends Window { - - static int count; - - private CssLayout cssLayout = new CssLayout() { - @Override - protected String getCss(Component c) { - return "float:left; width:60px;height:60px;background: yellow;padding:2px;"; - }; - }; - - class WrappedLabel extends DragAndDropWrapper { - - private static final long serialVersionUID = 1L; - - public WrappedLabel(String content) { - 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 - setDragStartMode(DragStartMode.WRAPPER); - } - - @Override - public DropHandler getDropHandler() { - return dh; - } - - } - - private DropHandler dh = new DropHandler() { - - public AcceptCriterion getAcceptCriterion() { - return AcceptAll.get(); - } - - 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 = cssLayout - .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; - } - } - - cssLayout.removeComponent(sourceComponent); - cssLayout.addComponent(sourceComponent, index); - } - } - // TODO Auto-generated method stub - - } - }; - - public VerticalSortableCssLayoutWithWrappers() { - setCaption("Horizontally sortable csslayout via (ddwrappers):Try sorting block by draggin them"); - DragAndDropWrapper pane = new DragAndDropWrapper(cssLayout); - setContent(pane); - pane.setSizeFull(); - setWidth("400px"); - setHeight("100px"); - - for (int i = 0; i < 4; i++) { - cssLayout.addComponent(new WrappedLabel("Block")); - } - - } -}