]> source.dussan.org Git - vaadin-framework.git/commitdiff
fixes #3195
authorMatti Tahvonen <matti.tahvonen@itmill.com>
Fri, 21 Aug 2009 07:35:53 +0000 (07:35 +0000)
committerMatti Tahvonen <matti.tahvonen@itmill.com>
Fri, 21 Aug 2009 07:35:53 +0000 (07:35 +0000)
svn changeset:8519/svn branch:6.1

src/com/vaadin/terminal/gwt/client/ui/layout/CellBasedLayout.java

index c9bacadcceafa77dc0efcdb62c1273dfc8a96f0b..538d4f8c9fa8646ebd7ff507585bc70d64075fb5 100644 (file)
@@ -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<Widget> 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);
+            }
         }
 
     }