From: Matti Tahvonen Date: Fri, 21 Aug 2009 07:35:53 +0000 (+0000) Subject: fixes #3195 X-Git-Tag: 6.7.0.beta1~2602 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=35735b3e35a7b097cf5d3872a7d4c5b3610303db;p=vaadin-framework.git fixes #3195 svn changeset:8519/svn branch:6.1 --- diff --git a/src/com/vaadin/terminal/gwt/client/ui/layout/CellBasedLayout.java b/src/com/vaadin/terminal/gwt/client/ui/layout/CellBasedLayout.java index c9bacadcce..538d4f8c9f 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/layout/CellBasedLayout.java +++ b/src/com/vaadin/terminal/gwt/client/ui/layout/CellBasedLayout.java @@ -1,6 +1,7 @@ package com.vaadin.terminal.gwt.client.ui.layout; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import com.google.gwt.dom.client.DivElement; @@ -311,12 +312,37 @@ public abstract class CellBasedLayout extends ComplexPanel implements Container int toRemove = getChildren().size() - pos; while (toRemove-- > 0) { + /* flag to not if widget has been moved and rendered elsewhere */ + boolean relocated = false; ChildComponentContainer child = (ChildComponentContainer) getChildren() .get(pos); - widgetToComponentContainer.remove(child.getWidget()); + Widget widget = child.getWidget(); + if (widget == null) { + // a rare case where child component has been relocated and + // rendered elsewhere + // clean widgetToComponentContainer map by iterating the correct + // mapping + Iterator iterator = widgetToComponentContainer.keySet() + .iterator(); + while (iterator.hasNext()) { + Widget key = iterator.next(); + if (widgetToComponentContainer.get(key) == child) { + widget = key; + relocated = true; + break; + } + } + if (widget == null) { + throw new NullPointerException(); + } + } + ChildComponentContainer remove = widgetToComponentContainer + .remove(widget); remove(child); - Paintable p = (Paintable) child.getWidget(); - client.unregisterPaintable(p); + if (!relocated) { + Paintable p = (Paintable) widget; + client.unregisterPaintable(p); + } } }