From: Leif Åstrand Date: Tue, 21 Feb 2012 07:41:51 +0000 (+0200) Subject: Don't remove widgets that are not there (#8313) X-Git-Tag: 7.0.0.alpha2~434^2~25 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=733b655faacc678dc2e5c5838e08aaf4d2275c5f;p=vaadin-framework.git Don't remove widgets that are not there (#8313) --- diff --git a/src/com/vaadin/terminal/gwt/client/ui/VMeasuringOrderedLayoutPaintable.java b/src/com/vaadin/terminal/gwt/client/ui/VMeasuringOrderedLayoutPaintable.java index 867e0eef12..b991b37c44 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VMeasuringOrderedLayoutPaintable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VMeasuringOrderedLayoutPaintable.java @@ -3,6 +3,7 @@ package com.vaadin.terminal.gwt.client.ui; import java.util.HashSet; import java.util.Iterator; +import com.google.gwt.dom.client.Node; import com.google.gwt.dom.client.Style; import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ApplicationConnection; @@ -105,10 +106,35 @@ public abstract class VMeasuringOrderedLayoutPaintable extends for (VPaintableWidget child : previousChildren) { Widget widget = child.getWidgetForPaintable(); - layout.removeSlot(layout.getSlotForChild(widget)); - VPaintableMap vPaintableMap = VPaintableMap.get(client); - vPaintableMap.unregisterPaintable(child); + // Don't remove and unregister if it has been moved to a different + // parent. Slot element will be left behind, but that is taken care + // of later + if (widget.getParent() == getWidgetForPaintable()) { + layout.removeSlot(layout.getSlotForChild(widget)); + + VPaintableMap vPaintableMap = VPaintableMap.get(client); + vPaintableMap.unregisterPaintable(child); + } + } + + // Remove empty layout slots left behind after children have moved to + // other paintables + while (true) { + int childCount = layout.getElement().getChildCount(); + if (childCount <= 1) { + // Stop if no more slots (spacing element is always present) + break; + } + + Node lastSlot = layout.getElement().getChild(childCount - 2); + if (lastSlot.getChildCount() == 0) { + // Remove if empty + lastSlot.removeFromParent(); + } else { + // Stop searching when last slot is not empty + break; + } } int bitMask = uidl.getIntAttribute("margins");