diff options
author | Matti Tahvonen <matti.tahvonen@itmill.com> | 2010-02-17 16:33:11 +0000 |
---|---|---|
committer | Matti Tahvonen <matti.tahvonen@itmill.com> | 2010-02-17 16:33:11 +0000 |
commit | 51dcdc1c98d70c7aec857e28f1d8933321a6431a (patch) | |
tree | 68cd90d23282e36efeec76197d73ca6c59841120 /src/com/vaadin | |
parent | 326484dc6b14a10bf98955b67026464512c1b2f5 (diff) | |
download | vaadin-framework-51dcdc1c98d70c7aec857e28f1d8933321a6431a.tar.gz vaadin-framework-51dcdc1c98d70c7aec857e28f1d8933321a6431a.zip |
wrapper enhancements + rules
svn changeset:11363/svn branch:6.3_dd
Diffstat (limited to 'src/com/vaadin')
10 files changed, 260 insertions, 41 deletions
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<String, Object> 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 |