Reviewers: sbrubaker,

Description:
Fixing a bug in TabLayoutPanel where calling setTabText() removes the
tab from the panel. r9689 fixed some edge cases in TabLayoutPanel such
as calling tabContents.removeFromParent(), but it introduced this bug.

Issue: 6034


Please review this at http://gwt-code-reviews.appspot.com/1368806/

Affected files:
  M user/src/com/google/gwt/user/client/ui/TabLayoutPanel.java
  M user/test/com/google/gwt/user/client/ui/TabLayoutPanelTest.java


Index: user/src/com/google/gwt/user/client/ui/TabLayoutPanel.java
===================================================================
--- user/src/com/google/gwt/user/client/ui/TabLayoutPanel.java (revision 9792) +++ user/src/com/google/gwt/user/client/ui/TabLayoutPanel.java (working copy)
@@ -100,6 +100,7 @@

   private class Tab extends SimplePanel {
     private Element inner;
+    private boolean replacingWidget;

     public Tab(Widget child) {
       super(Document.get().createDivElement());
@@ -123,8 +124,11 @@
        * ensure consistency.
        */
       int index = tabs.indexOf(this);
-      if (index < 0) {
-        // This tab is no longer in the panel, so just remove the widget.
+      if (replacingWidget || index < 0) {
+        /*
+ * The tab contents are being replaced, or this tab is no longer in the
+         * panel, so just remove the widget.
+         */
         return super.remove(w);
       } else {
         // Delegate to the TabLayoutPanel.
@@ -138,6 +142,13 @@
       } else {
         removeStyleDependentName("selected");
       }
+    }
+
+    @Override
+    public void setWidget(Widget w) {
+      replacingWidget = true;
+      super.setWidget(w);
+      replacingWidget = false;
     }

     @Override
Index: user/test/com/google/gwt/user/client/ui/TabLayoutPanelTest.java
===================================================================
--- user/test/com/google/gwt/user/client/ui/TabLayoutPanelTest.java (revision 9792) +++ user/test/com/google/gwt/user/client/ui/TabLayoutPanelTest.java (working copy)
@@ -401,6 +401,23 @@
   }

   /**
+   * Issue 6034: setTabText() removes the tab.
+   */
+  public void testSetTabText() {
+    TabLayoutPanel p = new TabLayoutPanel(1, Unit.EM);
+    Label[] labels = new Label[3];
+    for (int i = 0; i < labels.length; i++) {
+      labels[i] = new Label("content" + i);
+      p.add(labels[i]);
+    }
+
+    // Set the text of tab 1.
+    p.setTabText(1, "new text");
+    assertEquals(3, p.getWidgetCount());
+    assertEquals("new text", ((HasText) p.getTabWidget(1)).getText());
+  }
+
+  /**
* Test that {@link TabLayoutPanel} calls widget.setVisible(true/false) on
    * each widget, when it is shown/hidden.
    */


--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to