aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/vaadin
diff options
context:
space:
mode:
authorMatti Tahvonen <matti.tahvonen@itmill.com>2010-02-17 16:33:11 +0000
committerMatti Tahvonen <matti.tahvonen@itmill.com>2010-02-17 16:33:11 +0000
commit51dcdc1c98d70c7aec857e28f1d8933321a6431a (patch)
tree68cd90d23282e36efeec76197d73ca6c59841120 /src/com/vaadin
parent326484dc6b14a10bf98955b67026464512c1b2f5 (diff)
downloadvaadin-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')
-rw-r--r--src/com/vaadin/event/dd/acceptCriteria/ContainsDataFlawor.java36
-rw-r--r--src/com/vaadin/event/dd/acceptCriteria/DropDetailEquals.java39
-rw-r--r--src/com/vaadin/event/dd/acceptCriteria/Not.java8
-rw-r--r--src/com/vaadin/event/dd/acceptCriteria/SourceIsSameAsTarget.java26
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/VCustomComponent.java8
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/VDragAndDropWrapper.java112
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/dd/VContainsDataFlawor.java22
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java4
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/dd/VDropDetailEquals.java22
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/dd/VSourceIsSameAsTarget.java24
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