Fixing a bug in DeckLayoutPanel where animating the current widget causes the current widget to disappear. This can happen if the user calls forceLayout() without setting a new widget, or if the user calls setWidget() with the currently visible widget.
http://gwt-code-reviews.appspot.com/1354801
Review by: pdr@google.com
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9716 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/ui/DeckLayoutPanel.java b/user/src/com/google/gwt/user/client/ui/DeckLayoutPanel.java
index 7cdd76d..ed83651 100644
--- a/user/src/com/google/gwt/user/client/ui/DeckLayoutPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/DeckLayoutPanel.java
@@ -332,20 +332,29 @@
double hDirection = isAnimationVertical ? 0.0
: LocaleInfo.getCurrentLocale().isRTL() ? -direction : direction;
- // Position the layers in their start positions.
- if (oldLayer != null) {
- // The old layer starts centered in the panel.
- oldLayer.setTopHeight(0.0, Unit.PCT, 100.0, Unit.PCT);
- oldLayer.setLeftWidth(0.0, Unit.PCT, 100.0, Unit.PCT);
- setWidgetVisible(lastVisibleWidget, oldLayer, true);
+ /*
+ * Position the old widget in the center of the panel, and the new widget
+ * off to one side. If the old widget is the same as the new widget, then
+ * skip this step.
+ */
+ hidingWidget = null;
+ if (visibleWidget != lastVisibleWidget) {
+ // Position the layers in their start positions.
+ if (oldLayer != null) {
+ // The old layer starts centered in the panel.
+ oldLayer.setTopHeight(0.0, Unit.PCT, 100.0, Unit.PCT);
+ oldLayer.setLeftWidth(0.0, Unit.PCT, 100.0, Unit.PCT);
+ setWidgetVisible(lastVisibleWidget, oldLayer, true);
+ }
+ if (newLayer != null) {
+ // The new layer starts off to one side.
+ newLayer.setTopHeight(vDirection, Unit.PCT, 100.0, Unit.PCT);
+ newLayer.setLeftWidth(hDirection, Unit.PCT, 100.0, Unit.PCT);
+ setWidgetVisible(visibleWidget, newLayer, true);
+ }
+ layout.layout();
+ hidingWidget = lastVisibleWidget;
}
- if (newLayer != null) {
- // The new layer starts off to one side.
- newLayer.setTopHeight(vDirection, Unit.PCT, 100.0, Unit.PCT);
- newLayer.setLeftWidth(hDirection, Unit.PCT, 100.0, Unit.PCT);
- setWidgetVisible(visibleWidget, newLayer, true);
- }
- layout.layout();
// Set the end positions of the layers.
if (oldLayer != null) {
@@ -367,7 +376,6 @@
setWidgetVisible(visibleWidget, newLayer, true);
}
- hidingWidget = lastVisibleWidget;
lastVisibleWidget = visibleWidget;
}
diff --git a/user/test/com/google/gwt/user/client/ui/DeckLayoutPanelTest.java b/user/test/com/google/gwt/user/client/ui/DeckLayoutPanelTest.java
index 87ee8e8..5103ad6 100644
--- a/user/test/com/google/gwt/user/client/ui/DeckLayoutPanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DeckLayoutPanelTest.java
@@ -21,6 +21,34 @@
*/
public class DeckLayoutPanelTest extends PanelTestBase<DeckLayoutPanel> {
+ /**
+ * Test that forcing layout without changing the widget doesn't cause the
+ * widget to disappear.
+ */
+ public void testForceLayoutSameWidget() {
+ DeckLayoutPanel deck = createPanel();
+ Label[] labels = new Label[2];
+ for (int i = 0; i < labels.length; i++) {
+ labels[i] = new Label("content" + i);
+ deck.add(labels[i]);
+ }
+
+ // Show widget at index 1, make sure it becomes visible.
+ deck.showWidget(1);
+ assertEquals(1, deck.getVisibleWidgetIndex());
+ assertEquals(labels[1], deck.getVisibleWidget());
+ deck.forceLayout();
+ assertFalse(labels[0].isVisible());
+ assertTrue(labels[1].isVisible());
+
+ // Force layout and make sure that widget 1 is still visible.
+ deck.forceLayout();
+ assertEquals(1, deck.getVisibleWidgetIndex());
+ assertEquals(labels[1], deck.getVisibleWidget());
+ assertFalse(labels[0].isVisible());
+ assertTrue(labels[1].isVisible());
+ }
+
public void testSetWidget() {
DeckLayoutPanel deck = createPanel();
Label[] labels = new Label[2];
@@ -93,6 +121,36 @@
assertFalse(labels[2].isVisible());
}
+ /**
+ * Test that toggling a widget out and back in within the same event loop
+ * doesn't cause the widget to be hidden.
+ */
+ public void testShowWidgetToggle() {
+ DeckLayoutPanel deck = createPanel();
+ Label[] labels = new Label[2];
+ for (int i = 0; i < labels.length; i++) {
+ labels[i] = new Label("content" + i);
+ deck.add(labels[i]);
+ }
+
+ // Show widget at index 1, make sure it becomes visible.
+ deck.showWidget(1);
+ assertEquals(1, deck.getVisibleWidgetIndex());
+ assertEquals(labels[1], deck.getVisibleWidget());
+ deck.forceLayout();
+ assertFalse(labels[0].isVisible());
+ assertTrue(labels[1].isVisible());
+
+ // Toggle the widget out and back in.
+ deck.showWidget(0);
+ deck.showWidget(1);
+ assertEquals(1, deck.getVisibleWidgetIndex());
+ assertEquals(labels[1], deck.getVisibleWidget());
+ deck.forceLayout();
+ assertFalse(labels[0].isVisible());
+ assertTrue(labels[1].isVisible());
+ }
+
@Override
protected DeckLayoutPanel createPanel() {
return new DeckLayoutPanel();