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 Review at http://gwt-code-reviews.appspot.com/1368806 Review by: sbrubaker@google.com git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9804 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/ui/TabLayoutPanel.java b/user/src/com/google/gwt/user/client/ui/TabLayoutPanel.java index 8cd476e..0c90414 100644 --- a/user/src/com/google/gwt/user/client/ui/TabLayoutPanel.java +++ b/user/src/com/google/gwt/user/client/ui/TabLayoutPanel.java
@@ -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. @@ -141,6 +145,13 @@ } @Override + public void setWidget(Widget w) { + replacingWidget = true; + super.setWidget(w); + replacingWidget = false; + } + + @Override protected com.google.gwt.user.client.Element getContainerElement() { return inner.cast(); }
diff --git a/user/test/com/google/gwt/user/client/ui/TabLayoutPanelTest.java b/user/test/com/google/gwt/user/client/ui/TabLayoutPanelTest.java index a9ffe65..487b598 100644 --- a/user/test/com/google/gwt/user/client/ui/TabLayoutPanelTest.java +++ b/user/test/com/google/gwt/user/client/ui/TabLayoutPanelTest.java
@@ -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. */