aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/vaadin/terminal
diff options
context:
space:
mode:
authorMatti Tahvonen <matti.tahvonen@itmill.com>2010-05-14 08:05:08 +0000
committerMatti Tahvonen <matti.tahvonen@itmill.com>2010-05-14 08:05:08 +0000
commit6f426a86829f1c233e01002ebdeb8a1d921ebc9f (patch)
treeccea1dc0b243ad72fa2faca575c9e50157fa6cd2 /src/com/vaadin/terminal
parent98fecdee354b6dc560ae39e23dc23f4a97e70160 (diff)
parentb0699dd777644ae304c70d36547e873a8e8db758 (diff)
downloadvaadin-framework-6f426a86829f1c233e01002ebdeb8a1d921ebc9f.tar.gz
vaadin-framework-6f426a86829f1c233e01002ebdeb8a1d921ebc9f.zip
merged bug fixes from 6.3 branch
svn changeset:13187/svn branch:6.4
Diffstat (limited to 'src/com/vaadin/terminal')
-rw-r--r--src/com/vaadin/terminal/gwt/DefaultWidgetSet.gwt.xml59
-rw-r--r--src/com/vaadin/terminal/gwt/client/Util.java2
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/UploadIFrameOnloadStrategy.java22
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/UploadIFrameOnloadStrategyIE.java26
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java12
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/VProgressIndicator.java6
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java6
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/VSlider.java5
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/VUpload.java149
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/VView.java20
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/VWindow.java2
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java43
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/layout/ChildComponentContainer.java12
13 files changed, 290 insertions, 74 deletions
diff --git a/src/com/vaadin/terminal/gwt/DefaultWidgetSet.gwt.xml b/src/com/vaadin/terminal/gwt/DefaultWidgetSet.gwt.xml
index d8c77e0d6d..c5c9556eb0 100644
--- a/src/com/vaadin/terminal/gwt/DefaultWidgetSet.gwt.xml
+++ b/src/com/vaadin/terminal/gwt/DefaultWidgetSet.gwt.xml
@@ -1,14 +1,10 @@
<module>
<!--
-
- This GWT module defines the Vaadin DefaultWidgetSet. This is
- the module you want to extend when creating an extended widget set, or
+
+ This GWT module defines the Vaadin DefaultWidgetSet. This is the
+ module you want to extend when creating an extended widget set, or
when creating a specialized widget set with a subset of the
- components.
-
-
- WS Compiler: manually edited
-
+ components. WS Compiler: manually edited
-->
<inherits name="com.google.gwt.user.User" />
@@ -16,28 +12,47 @@
<inherits name="com.google.gwt.http.HTTP" />
<source path="client" />
-
- <!-- Use our own history impl for IE to workaround #2931. -->
+
+ <!-- Use our own history impl for IE to workaround #2931. -->
<replace-with class="com.vaadin.terminal.gwt.client.HistoryImplIEVaadin">
- <when-type-is class="com.google.gwt.user.client.impl.HistoryImpl"/>
- <when-property-is name="user.agent" value="ie6"/>
+ <when-type-is class="com.google.gwt.user.client.impl.HistoryImpl" />
+ <when-property-is name="user.agent" value="ie6" />
</replace-with>
- <!-- Safari needs a different implementation due to GWT bug. See #4279 (vaadin trac) -->
- <replace-with class="com.vaadin.terminal.gwt.client.ui.richtextarea.CustomWebkitRichTextArea">
+ <!--
+ Safari needs a different implementation due to GWT bug. See #4279
+ (vaadin trac)
+ -->
+ <replace-with
+ class="com.vaadin.terminal.gwt.client.ui.richtextarea.CustomWebkitRichTextArea">
<when-type-is class="com.google.gwt.user.client.ui.impl.RichTextAreaImpl" />
<when-property-is name="user.agent" value="safari" />
</replace-with>
- <generate-with class="com.vaadin.terminal.gwt.widgetsetutils.WidgetMapGenerator">
- <when-type-is class="com.vaadin.terminal.gwt.client.WidgetMap"/>
+ <generate-with
+ class="com.vaadin.terminal.gwt.widgetsetutils.WidgetMapGenerator">
+ <when-type-is class="com.vaadin.terminal.gwt.client.WidgetMap" />
</generate-with>
-
- <generate-with class="com.vaadin.terminal.gwt.widgetsetutils.AcceptCriteriaFactoryGenerator">
- <when-type-is class="com.vaadin.terminal.gwt.client.ui.dd.VAcceptCriterionFactory"/>
+
+ <generate-with
+ class="com.vaadin.terminal.gwt.widgetsetutils.AcceptCriteriaFactoryGenerator">
+ <when-type-is
+ class="com.vaadin.terminal.gwt.client.ui.dd.VAcceptCriterionFactory" />
</generate-with>
-
-
+
+ <!-- Fall through to this rule for everything but IE -->
+ <replace-with class="com.vaadin.terminal.gwt.client.ui.UploadIFrameOnloadStrategy">
+ <when-type-is class="com.vaadin.terminal.gwt.client.ui.UploadIFrameOnloadStrategy" />
+ </replace-with>
+
+ <replace-with class="com.vaadin.terminal.gwt.client.ui.UploadIFrameOnloadStrategyIE">
+ <when-type-is class="com.vaadin.terminal.gwt.client.ui.UploadIFrameOnloadStrategy" />
+ <any>
+ <when-property-is name="user.agent" value="ie6" />
+ <when-property-is name="user.agent" value="ie8" />
+ </any>
+ </replace-with>
+
<entry-point class="com.vaadin.terminal.gwt.client.DefaultWidgetSet" />
-
+
</module>
diff --git a/src/com/vaadin/terminal/gwt/client/Util.java b/src/com/vaadin/terminal/gwt/client/Util.java
index 4b56ae7a44..13cb3b0955 100644
--- a/src/com/vaadin/terminal/gwt/client/Util.java
+++ b/src/com/vaadin/terminal/gwt/client/Util.java
@@ -53,7 +53,7 @@ public class Util {
public static native Element getElementFromPoint(int clientX, int clientY)
/*-{
var el = $wnd.document.elementFromPoint(clientX, clientY);
- if(el.nodeType == 3) {
+ if(el != null && el.nodeType == 3) {
el = el.parentNode;
}
return el;
diff --git a/src/com/vaadin/terminal/gwt/client/ui/UploadIFrameOnloadStrategy.java b/src/com/vaadin/terminal/gwt/client/ui/UploadIFrameOnloadStrategy.java
new file mode 100644
index 0000000000..a79d1cd685
--- /dev/null
+++ b/src/com/vaadin/terminal/gwt/client/ui/UploadIFrameOnloadStrategy.java
@@ -0,0 +1,22 @@
+package com.vaadin.terminal.gwt.client.ui;
+
+public class UploadIFrameOnloadStrategy {
+
+ native void hookEvents(com.google.gwt.dom.client.Element iframe,
+ VUpload upload)
+ /*-{
+ iframe.onload = function() {
+ upload.@com.vaadin.terminal.gwt.client.ui.VUpload::onSubmitComplete()();
+ };
+ }-*/;
+
+ /**
+ * @param iframe
+ * the iframe whose onLoad event is to be cleaned
+ */
+ native void unHookEvents(com.google.gwt.dom.client.Element iframe)
+ /*-{
+ iframe.onload = null;
+ }-*/;
+
+}
diff --git a/src/com/vaadin/terminal/gwt/client/ui/UploadIFrameOnloadStrategyIE.java b/src/com/vaadin/terminal/gwt/client/ui/UploadIFrameOnloadStrategyIE.java
new file mode 100644
index 0000000000..698d630b4f
--- /dev/null
+++ b/src/com/vaadin/terminal/gwt/client/ui/UploadIFrameOnloadStrategyIE.java
@@ -0,0 +1,26 @@
+package com.vaadin.terminal.gwt.client.ui;
+
+import com.google.gwt.dom.client.Element;
+
+/**
+ * IE does not have onload, detect onload via readystatechange
+ *
+ */
+public class UploadIFrameOnloadStrategyIE extends UploadIFrameOnloadStrategy {
+ @Override
+ native void hookEvents(Element iframe, VUpload upload)
+ /*-{
+ iframe.onreadystatechange = function() {
+ if (iframe.readyState == 'complete') {
+ upload.@com.vaadin.terminal.gwt.client.ui.VUpload::onSubmitComplete()();
+ }
+ };
+ }-*/;
+
+ @Override
+ native void unHookEvents(Element iframe)
+ /*-{
+ iframe.onreadystatechange = null;
+ }-*/;
+
+}
diff --git a/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java b/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java
index d8b9413236..56de379988 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java
@@ -595,6 +595,7 @@ public class VFilterSelect extends Composite implements Paintable, Field,
private boolean filtering = false;
private boolean selecting = false;
private boolean tabPressed = false;
+ private boolean initDone = false;
private String lastFilter = "";
private int lastIndex = -1; // last selected index when using arrows
@@ -761,6 +762,7 @@ public class VFilterSelect extends Composite implements Paintable, Field,
lastNewItemString = null;
currentSuggestions.clear();
+ currentSuggestion = null;
final UIDL options = uidl.getChildUIDL(0);
totalMatches = uidl.getIntAttribute("totalMatches");
@@ -855,6 +857,8 @@ public class VFilterSelect extends Composite implements Paintable, Field,
popupOpenerClicked = false;
updateRootWidth();
+
+ initDone = true;
}
private void setPromptingOn() {
@@ -1133,7 +1137,10 @@ public class VFilterSelect extends Composite implements Paintable, Field,
}
horizPaddingAndBorder = Util.setWidthExcludingPaddingAndBorder(this,
width, horizPaddingAndBorder);
- updateRootWidth();
+
+ if (initDone) {
+ updateRootWidth();
+ }
}
@Override
@@ -1156,7 +1163,8 @@ public class VFilterSelect extends Composite implements Paintable, Field,
- Util.measureMarginLeft(selectedItemIcon.getElement()) : 0;
int w = tbWidth + openerWidth + iconWidth;
- if (suggestionPopupMinWidth > w) {
+ if ((!initDone || currentPage + 1 <= 0)
+ && suggestionPopupMinWidth > w) {
setTextboxWidth(suggestionPopupMinWidth);
w = suggestionPopupMinWidth;
} else {
diff --git a/src/com/vaadin/terminal/gwt/client/ui/VProgressIndicator.java b/src/com/vaadin/terminal/gwt/client/ui/VProgressIndicator.java
index ab9f20bcc3..65fb5179e9 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/VProgressIndicator.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/VProgressIndicator.java
@@ -76,8 +76,10 @@ public class VProgressIndicator extends Widget implements Paintable {
@Override
protected void onDetach() {
super.onDetach();
- poller.cancel();
- pollerSuspendedDueDetach = true;
+ if (interval > 0) {
+ poller.cancel();
+ pollerSuspendedDueDetach = true;
+ }
}
@Override
diff --git a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java
index bd30bac739..9629ea4a95 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java
@@ -909,6 +909,7 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
}
tHead.setVisible(showColHeaders);
+ setContainerHeight();
}
@@ -4266,8 +4267,9 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
*/
private void setContainerHeight() {
if (height != null && !"".equals(height)) {
- int contentH = getOffsetHeight() - tHead.getOffsetHeight()
- - tFoot.getOffsetHeight();
+ int contentH = getOffsetHeight();
+ contentH -= showColHeaders ? tHead.getOffsetHeight() : 0;
+ contentH -= tFoot.getOffsetHeight();
contentH -= getContentAreaBorderHeight();
if (contentH < 0) {
contentH = 0;
diff --git a/src/com/vaadin/terminal/gwt/client/ui/VSlider.java b/src/com/vaadin/terminal/gwt/client/ui/VSlider.java
index 732ba84a3f..81fb898011 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/VSlider.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/VSlider.java
@@ -10,6 +10,7 @@ import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Widget;
import com.vaadin.terminal.gwt.client.ApplicationConnection;
@@ -428,7 +429,9 @@ public class VSlider extends Widget implements Paintable, Field,
final double baseSize = Integer.parseInt(DOM.getElementProperty(base,
domProperty));
final double baseOffset = vertical ? DOM.getAbsoluteTop(base)
- - handleSize / 2 : DOM.getAbsoluteLeft(base) + handleSize / 2;
+ - Window.getScrollTop() - handleSize / 2 : DOM
+ .getAbsoluteLeft(base)
+ - Window.getScrollLeft() + handleSize / 2;
if (vertical) {
v = ((baseSize - (coord - baseOffset)) / (baseSize - handleSize))
diff --git a/src/com/vaadin/terminal/gwt/client/ui/VUpload.java b/src/com/vaadin/terminal/gwt/client/ui/VUpload.java
index aded833138..ce3012b3b0 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/VUpload.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/VUpload.java
@@ -4,8 +4,14 @@
package com.vaadin.terminal.gwt.client.ui;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.DivElement;
+import com.google.gwt.dom.client.Document;
+import com.google.gwt.dom.client.FormElement;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Timer;
@@ -14,14 +20,18 @@ import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.Hidden;
import com.google.gwt.user.client.ui.Panel;
-import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteHandler;
-import com.google.gwt.user.client.ui.FormPanel.SubmitHandler;
+import com.google.gwt.user.client.ui.SimplePanel;
import com.vaadin.terminal.gwt.client.ApplicationConnection;
import com.vaadin.terminal.gwt.client.Paintable;
import com.vaadin.terminal.gwt.client.UIDL;
-public class VUpload extends FormPanel implements Paintable,
- SubmitCompleteHandler, SubmitHandler {
+/**
+ *
+ * Note, we are not using GWT FormPanel as we want to listen submitcomplete
+ * events even though the upload component is already detached.
+ *
+ */
+public class VUpload extends SimplePanel implements Paintable {
private final class MyFileUpload extends FileUpload {
@Override
@@ -53,6 +63,9 @@ public class VUpload extends FormPanel implements Paintable,
Panel panel = new FlowPanel();
+ UploadIFrameOnloadStrategy onloadstrategy = GWT
+ .create(UploadIFrameOnloadStrategy.class);
+
ApplicationConnection client;
private String paintableId;
@@ -82,10 +95,18 @@ public class VUpload extends FormPanel implements Paintable,
private Hidden maxfilesize = new Hidden();
+ private FormElement element;
+
+ private com.google.gwt.dom.client.Element synthesizedFrame;
+
+ private int nextUploadId;
+
public VUpload() {
- super();
- setEncoding(FormPanel.ENCODING_MULTIPART);
- setMethod(FormPanel.METHOD_POST);
+ super(com.google.gwt.dom.client.Document.get().createFormElement());
+
+ element = getElement().cast();
+ setEncoding(getElement(), FormPanel.ENCODING_MULTIPART);
+ element.setMethod(FormPanel.METHOD_POST);
setWidget(panel);
panel.add(maxfilesize);
@@ -103,20 +124,29 @@ public class VUpload extends FormPanel implements Paintable,
});
panel.add(submitButton);
- addSubmitCompleteHandler(this);
- addSubmitHandler(this);
-
setStyleName(CLASSNAME);
}
+ private static native void setEncoding(Element form, String encoding)
+ /*-{
+ form.enctype = encoding;
+ // For IE6
+ form.encoding = encoding;
+ }-*/;
+
public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
if (client.updateComponent(this, uidl, true)) {
return;
}
+ if (uidl.hasAttribute("notStarted")) {
+ t.schedule(400);
+ return;
+ }
setImmediate(uidl.getBooleanAttribute("immediate"));
this.client = client;
paintableId = uidl.getId();
- setAction(client.getAppUri());
+ nextUploadId = uidl.getIntAttribute("nextid");
+ element.setAction(client.getAppUri());
submitButton.setText(uidl.getStringAttribute("buttoncaption"));
fu.setName(paintableId + "_file");
@@ -125,6 +155,7 @@ public class VUpload extends FormPanel implements Paintable,
} else if (!uidl.getBooleanAttribute("state")) {
// Enable the button only if an upload is not in progress
enableUpload();
+ ensureTargetFrame();
}
}
@@ -182,24 +213,38 @@ public class VUpload extends FormPanel implements Paintable,
}
}
- public void onSubmitComplete(SubmitCompleteEvent event) {
- if (client != null) {
- if (t != null) {
- t.cancel();
- }
- ApplicationConnection.getConsole().log("Submit complete");
- client.sendPendingVariableChanges();
- }
+ /**
+ * Called by JSNI (hooked via {@link #onloadstrategy})
+ */
+ @SuppressWarnings("unused")
+ private void onSubmitComplete() {
+ /* Needs to be run dereferred to avoid various browser issues. */
+ DeferredCommand.addCommand(new Command() {
+ public void execute() {
+ if (client != null) {
+ if (t != null) {
+ t.cancel();
+ }
+ ApplicationConnection.getConsole().log("Submit complete");
+ client.sendPendingVariableChanges();
+ }
- rebuildPanel();
+ rebuildPanel();
- submitted = false;
- enableUpload();
+ submitted = false;
+ enableUpload();
+ if (!isAttached()) {
+ /*
+ * Upload is complete when upload is already abandoned.
+ */
+ cleanTargetFrame();
+ }
+ }
+ });
}
- public void onSubmit(SubmitEvent event) {
+ private void submit() {
if (fu.getFilename().length() == 0 || submitted || !enabled) {
- event.cancel();
ApplicationConnection
.getConsole()
.log(
@@ -210,6 +255,7 @@ public class VUpload extends FormPanel implements Paintable,
// before upload
client.sendPendingVariableChanges();
+ element.submit();
submitted = true;
ApplicationConnection.getConsole().log("Submitted form");
@@ -222,10 +268,63 @@ public class VUpload extends FormPanel implements Paintable,
t = new Timer() {
@Override
public void run() {
- client.sendPendingVariableChanges();
+ ApplicationConnection
+ .getConsole()
+ .log(
+ "Visiting server to see if upload started event changed UI.");
+ client.updateVariable(paintableId, "pollForStart",
+ nextUploadId, true);
}
};
t.schedule(800);
}
+ @Override
+ protected void onAttach() {
+ super.onAttach();
+ if (client != null) {
+ ensureTargetFrame();
+ }
+ }
+
+ private void ensureTargetFrame() {
+ if (synthesizedFrame == null) {
+ // Attach a hidden IFrame to the form. This is the target iframe to
+ // which
+ // the form will be submitted. We have to create the iframe using
+ // innerHTML,
+ // because setting an iframe's 'name' property dynamically doesn't
+ // work on
+ // most browsers.
+ DivElement dummy = Document.get().createDivElement();
+ dummy.setInnerHTML("<iframe src=\"javascript:''\" name='"
+ + getFrameName()
+ + "' style='position:absolute;width:0;height:0;border:0'>");
+ synthesizedFrame = dummy.getFirstChildElement();
+ Document.get().getBody().appendChild(synthesizedFrame);
+ element.setTarget(getFrameName());
+ onloadstrategy.hookEvents(synthesizedFrame, this);
+ }
+ }
+
+ private String getFrameName() {
+ return paintableId + "_TGT_FRAME";
+ }
+
+ @Override
+ protected void onDetach() {
+ super.onDetach();
+ if (!submitted) {
+ cleanTargetFrame();
+ }
+ }
+
+ private void cleanTargetFrame() {
+ if (synthesizedFrame != null) {
+ Document.get().getBody().removeChild(synthesizedFrame);
+ onloadstrategy.unHookEvents(synthesizedFrame);
+ synthesizedFrame = null;
+ }
+ }
+
}
diff --git a/src/com/vaadin/terminal/gwt/client/ui/VView.java b/src/com/vaadin/terminal/gwt/client/ui/VView.java
index 033d35dab1..d004d35b17 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/VView.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/VView.java
@@ -389,9 +389,29 @@ public class VView extends SimplePanel implements Container, ResizeHandler,
Util.runWebkitOverflowAutoFix(getElement());
}
+ scrollIntoView(uidl);
+
rendering = false;
}
+ /**
+ * Tries to scroll paintable referenced from given UIDL snippet to be
+ * visible.
+ *
+ * @param uidl
+ */
+ void scrollIntoView(final UIDL uidl) {
+ if (uidl.hasAttribute("scrollTo")) {
+ DeferredCommand.addCommand(new Command() {
+ public void execute() {
+ final Paintable paintable = uidl.getPaintableAttribute(
+ "scrollTo", connection);
+ ((Widget) paintable).getElement().scrollIntoView();
+ }
+ });
+ }
+ }
+
@Override
public void onBrowserEvent(Event event) {
super.onBrowserEvent(event);
diff --git a/src/com/vaadin/terminal/gwt/client/ui/VWindow.java b/src/com/vaadin/terminal/gwt/client/ui/VWindow.java
index 6005556fff..ecb499fdf8 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/VWindow.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/VWindow.java
@@ -473,6 +473,8 @@ public class VWindow extends VOverlay implements Container, ScrollListener {
Util.runWebkitOverflowAutoFix(contentPanel.getElement());
+ client.getView().scrollIntoView(uidl);
+
}
private void setDraggable(boolean draggable) {
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 0fbc561c7f..936cdf8408 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java
@@ -4,6 +4,7 @@
package com.vaadin.terminal.gwt.client.ui.dd;
import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.EventTarget;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.dom.client.Node;
import com.google.gwt.dom.client.Style;
@@ -59,8 +60,7 @@ public class VDragAndDropManager {
currentDrag.setCurrentGwtEvent(nativeEvent);
updateDragImagePosition();
- Element targetElement = (Element) nativeEvent.getEventTarget()
- .cast();
+ Element targetElement = Element.as(nativeEvent.getEventTarget());
if (dragElement != null && dragElement.isOrHasChild(targetElement)) {
// to detect the "real" target, hide dragelement temporary and
@@ -168,8 +168,8 @@ public class VDragAndDropManager {
}
break;
case Event.ONMOUSEOUT:
- Element relatedTarget = (Element) nativeEvent
- .getRelatedEventTarget().cast();
+ Element relatedTarget = Element.as(nativeEvent
+ .getRelatedEventTarget());
VDropHandler newDragHanler = findDragTarget(relatedTarget);
if (dragElement != null
&& dragElement.isOrHasChild(relatedTarget)) {
@@ -294,8 +294,8 @@ public class VDragAndDropManager {
isStarted = true;
VDropHandler dh = null;
if (startEvent != null) {
- dh = findDragTarget((Element) currentDrag
- .getCurrentGwtEvent().getEventTarget().cast());
+ dh = findDragTarget(Element.as(currentDrag
+ .getCurrentGwtEvent().getEventTarget()));
}
if (dh != null) {
// drag has started on a DropHandler, kind of drag over
@@ -331,12 +331,15 @@ public class VDragAndDropManager {
int typeInt = event.getTypeInt();
switch (typeInt) {
case Event.ONMOUSEOVER:
- if (dragElement == null
- || !dragElement
- .isOrHasChild((Node) event
- .getNativeEvent()
- .getCurrentEventTarget()
- .cast())) {
+ if (dragElement == null) {
+ break;
+ }
+ EventTarget currentEventTarget = event
+ .getNativeEvent()
+ .getCurrentEventTarget();
+ if (Node.is(currentEventTarget)
+ && !dragElement.isOrHasChild(Node
+ .as(currentEventTarget))) {
// drag image appeared below, ignore
break;
}
@@ -348,12 +351,15 @@ public class VDragAndDropManager {
break;
case Event.ONMOUSEOUT:
- if (dragElement == null
- || !dragElement
- .isOrHasChild((Node) event
- .getNativeEvent()
- .getRelatedEventTarget()
- .cast())) {
+ if (dragElement == null) {
+ break;
+ }
+ EventTarget relatedEventTarget = event
+ .getNativeEvent()
+ .getRelatedEventTarget();
+ if (Node.is(relatedEventTarget)
+ && !dragElement.isOrHasChild(Node
+ .as(relatedEventTarget))) {
// drag image appeared below, ignore
break;
}
@@ -374,7 +380,6 @@ public class VDragAndDropManager {
clearDragElement();
break;
}
-
}
});
diff --git a/src/com/vaadin/terminal/gwt/client/ui/layout/ChildComponentContainer.java b/src/com/vaadin/terminal/gwt/client/ui/layout/ChildComponentContainer.java
index 25d1fd0cc0..83e3c66536 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/layout/ChildComponentContainer.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/layout/ChildComponentContainer.java
@@ -452,6 +452,18 @@ public class ChildComponentContainer extends Panel {
}
updateCaptionSize();
+
+ if (relativeSize == null) {
+ /*
+ * relativeSize may be null if component is updated via independent
+ * update, after it has initially been hidden. See #4608
+ *
+ * It might also change in which case there would be similar issues.
+ *
+ * Yes, it is an ugly hack. Don't come telling me about it.
+ */
+ setRelativeSize(Util.parseRelativeSize(uidl));
+ }
}
public void updateCaptionSize() {