diff options
author | Matti Tahvonen <matti.tahvonen@itmill.com> | 2010-05-14 08:05:08 +0000 |
---|---|---|
committer | Matti Tahvonen <matti.tahvonen@itmill.com> | 2010-05-14 08:05:08 +0000 |
commit | 6f426a86829f1c233e01002ebdeb8a1d921ebc9f (patch) | |
tree | ccea1dc0b243ad72fa2faca575c9e50157fa6cd2 /src/com/vaadin/terminal | |
parent | 98fecdee354b6dc560ae39e23dc23f4a97e70160 (diff) | |
parent | b0699dd777644ae304c70d36547e873a8e8db758 (diff) | |
download | vaadin-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')
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() { |