]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fixed moving components from an outer AbsoluteLayout into an inner layout #10034 49/149/1
authorJohn Ahlroos <john@vaadin.com>
Tue, 23 Oct 2012 10:26:52 +0000 (13:26 +0300)
committerJohn Ahlroos <john@vaadin.com>
Tue, 23 Oct 2012 10:26:52 +0000 (13:26 +0300)
Change-Id: Ib635a02e2a4b2dd70623c221da4289b0ee7bed27

client/src/com/vaadin/client/ui/absolutelayout/VAbsoluteLayout.java

index 04acb06c400aae98cb0d2eb28bc953d251e72f03..fbf534a5b54a55a42bfcd1dbe1f790179757a26a 100644 (file)
@@ -305,6 +305,23 @@ public class VAbsoluteLayout extends ComplexPanel {
         for (Widget widget : getChildren()) {
             if (widget instanceof AbsoluteWrapper) {
                 AbsoluteWrapper wrapper = (AbsoluteWrapper) widget;
+
+                /*
+                 * Cleanup old wrappers which have been left empty by other
+                 * inner layouts moving the widget from the wrapper into their
+                 * own hierarchy. This usually happens when a call to
+                 * setWidget(widget) is done in an inner layout which
+                 * automatically detaches the widget from the parent, in this
+                 * case the wrapper, and re-attaches it somewhere else. This has
+                 * to be done in the layout phase since the order of the
+                 * hierarchy events are not defined.
+                 */
+                if (wrapper.getWidget() == null) {
+                    wrapper.destroy();
+                    super.remove(wrapper);
+                    continue;
+                }
+
                 Style wrapperStyle = wrapper.getElement().getStyle();
                 Style widgetStyle = wrapper.getWidget().getElement().getStyle();
                 if (widgetStyle.getHeight() != null
@@ -341,6 +358,23 @@ public class VAbsoluteLayout extends ComplexPanel {
         for (Widget widget : getChildren()) {
             if (widget instanceof AbsoluteWrapper) {
                 AbsoluteWrapper wrapper = (AbsoluteWrapper) widget;
+
+                /*
+                 * Cleanup old wrappers which have been left empty by other
+                 * inner layouts moving the widget from the wrapper into their
+                 * own hierarchy. This usually happens when a call to
+                 * setWidget(widget) is done in an inner layout which
+                 * automatically detaches the widget from the parent, in this
+                 * case the wrapper, and re-attaches it somewhere else. This has
+                 * to be done in the layout phase since the order of the
+                 * hierarchy events are not defined.
+                 */
+                if (wrapper.getWidget() == null) {
+                    wrapper.destroy();
+                    super.remove(wrapper);
+                    continue;
+                }
+
                 Style wrapperStyle = wrapper.getElement().getStyle();
                 Style widgetStyle = wrapper.getWidget().getElement().getStyle();