| /* |
| * Copyright 2010 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package com.google.gwt.user.client.ui; |
| |
| import com.google.gwt.core.client.Scheduler; |
| import com.google.gwt.core.client.Scheduler.ScheduledCommand; |
| import com.google.gwt.dom.client.Document; |
| import com.google.gwt.dom.client.Style.Unit; |
| import com.google.gwt.layout.client.LayerFriend; |
| import com.google.gwt.layout.client.Layout; |
| import com.google.gwt.layout.client.Layout.AnimationCallback; |
| import com.google.gwt.layout.client.Layout.Layer; |
| import com.google.gwt.user.client.Command; |
| |
| /** |
| * Tests for {@link LayoutPanel}. Note that this only tests LayoutPanel-specific |
| * behavior, not general layout correctness, which is covered by |
| * {@link com.google.gwt.layout.client.LayoutTest}. |
| */ |
| public class LayoutPanelTest extends WidgetTestBase { |
| |
| /** |
| * Tests for a bug in LayoutCommand, which caused an animate() call, just |
| * before an unnecessary forceLayout(), to get stuck. See issue 4360. |
| */ |
| @SuppressWarnings("deprecation") |
| public void testRedundantForceLayout() { |
| final LayoutPanel p = new LayoutPanel(); |
| Label l = new Label("foo"); |
| p.add(l); |
| |
| p.setWidgetTopHeight(l, 0, Unit.PX, 10, Unit.PX); |
| p.forceLayout(); |
| |
| delayTestFinish(5000); |
| // Fully qualified to avoid the deprecation warning in the import section |
| com.google.gwt.user.client.DeferredCommand.addCommand(new Command() { |
| public void execute() { |
| p.animate(100, new AnimationCallback() { |
| public void onLayout(Layer layer, double progress) { |
| } |
| |
| public void onAnimationComplete() { |
| // If LayoutCommand is broken, this will never happen. |
| finishTest(); |
| } |
| }); |
| } |
| }); |
| } |
| |
| /** |
| * Ensures that the popup implementation doesn't interfere with layout. This |
| * cropped up on IE7 as a result of CSS expressions used in PopupImplIE6, as |
| * described in issue 4532. |
| */ |
| @SuppressWarnings("deprecation") |
| public void testWeirdPopupInteraction() { |
| assertTrue(Document.get().isCSS1Compat()); |
| |
| final LayoutPanel lp = new LayoutPanel(); |
| lp.add(new HTML("foo")); |
| RootLayoutPanel.get().add(lp); |
| |
| PopupPanel popup = new PopupPanel(); |
| popup.center(); |
| |
| delayTestFinish(2000); |
| // Fully qualified to avoid the deprecation warning in the import section |
| com.google.gwt.user.client.DeferredCommand.addCommand(new Command() { |
| public void execute() { |
| int offsetWidth = lp.getOffsetWidth(); |
| int offsetHeight = lp.getOffsetHeight(); |
| assertTrue(offsetWidth > 0); |
| assertTrue(offsetHeight > 0); |
| finishTest(); |
| } |
| }); |
| } |
| |
| /** |
| * Tests |
| * {@link LayoutPanel#setWidgetBottomHeight(Widget, double, Unit, double, Unit)} |
| * . |
| */ |
| public void testSetWidgetBottomHeight() { |
| LayoutPanel layoutPanel = createLayoutPanel(); |
| Widget label = createLabelInPanel(layoutPanel); |
| |
| layoutPanel.setWidgetBottomHeight(label, 1.5, Unit.EM, 2.0, Unit.EM); |
| |
| assertLayerProperties( |
| label, |
| new LayerProperties().bottom(1.5).bottomUnit(Unit.EM).height(2.0).heightUnit( |
| Unit.EM)); |
| } |
| |
| /** |
| * Tests |
| * {@link LayoutPanel#setWidgetBottomHeight(IsWidget, double, Unit, double, Unit)} |
| * . |
| */ |
| public void testSetWidgetBottomHeightAsIsWidget() { |
| LayoutPanel layoutPanel = createLayoutPanel(); |
| Widget label = createLabelInPanel(layoutPanel); |
| |
| // IsWidget cast to call the overloaded version |
| layoutPanel.setWidgetBottomHeight((IsWidget) label, 10.0, Unit.PX, 15.0, |
| Unit.PX); |
| |
| assertLayerProperties( |
| label, |
| new LayerProperties().bottom(10.0).bottomUnit(Unit.PX).height(15.0).heightUnit( |
| Unit.PX)); |
| } |
| |
| /** |
| * Tests |
| * {@link LayoutPanel#setWidgetLeftRight(Widget, double, Unit, double, Unit)} |
| * . |
| */ |
| public void testSetWidgetLeftRight() { |
| LayoutPanel layoutPanel = createLayoutPanel(); |
| Widget label = createLabelInPanel(layoutPanel); |
| |
| layoutPanel.setWidgetLeftRight(label, 10.0, Unit.PX, 20.0, Unit.PX); |
| |
| assertLayerProperties( |
| label, |
| new LayerProperties().left(10.0).leftUnit(Unit.PX).right(20.0).rightUnit( |
| Unit.PX)); |
| } |
| |
| /** |
| * Tests |
| * {@link LayoutPanel#setWidgetLeftRight(IsWidget, double, Unit, double, Unit)} |
| * . |
| */ |
| public void testSetWidgetLeftRightAsIsWidget() { |
| LayoutPanel layoutPanel = createLayoutPanel(); |
| Widget label = createLabelInPanel(layoutPanel); |
| |
| // IsWidget cast to call the overloaded version |
| layoutPanel.setWidgetLeftRight((IsWidget) label, 10.0, Unit.PX, 15.0, |
| Unit.PX); |
| |
| assertLayerProperties( |
| label, |
| new LayerProperties().left(10.0).leftUnit(Unit.PX).right(15.0).rightUnit( |
| Unit.PX)); |
| } |
| |
| /** |
| * Tests |
| * {@link LayoutPanel#setWidgetLeftWidth(Widget, double, Unit, double, Unit)} |
| * . |
| */ |
| public void testSetWidgetLeftWidth() { |
| LayoutPanel layoutPanel = createLayoutPanel(); |
| Widget label = createLabelInPanel(layoutPanel); |
| |
| layoutPanel.setWidgetLeftWidth(label, 10.0, Unit.PX, 20.0, Unit.PX); |
| |
| assertLayerProperties( |
| label, |
| new LayerProperties().left(10.0).leftUnit(Unit.PX).width(20.0).widthUnit( |
| Unit.PX)); |
| } |
| |
| /** |
| * Tests |
| * {@link LayoutPanel#setWidgetLeftWidth(IsWidget, double, Unit, double, Unit)} |
| * . |
| */ |
| public void testSetWidgetLeftWidthAsIsWidget() { |
| LayoutPanel layoutPanel = createLayoutPanel(); |
| Widget label = createLabelInPanel(layoutPanel); |
| |
| // IsWidget cast to call the overloaded version |
| layoutPanel.setWidgetLeftWidth((IsWidget) label, 10.0, Unit.PX, 15.0, |
| Unit.PX); |
| |
| assertLayerProperties( |
| label, |
| new LayerProperties().left(10.0).leftUnit(Unit.PX).width(15.0).widthUnit( |
| Unit.PX)); |
| } |
| |
| /** |
| * Tests |
| * {@link LayoutPanel#setWidgetRightWidth(Widget, double, Unit, double, Unit)} |
| * . |
| */ |
| public void testSetWidgetRightWidth() { |
| LayoutPanel layoutPanel = createLayoutPanel(); |
| Widget label = createLabelInPanel(layoutPanel); |
| |
| layoutPanel.setWidgetRightWidth(label, 10.0, Unit.PX, 20.0, Unit.PX); |
| |
| assertLayerProperties( |
| label, |
| new LayerProperties().right(10.0).rightUnit(Unit.PX).width(20.0).widthUnit( |
| Unit.PX)); |
| } |
| |
| /** |
| * Tests |
| * {@link LayoutPanel#setWidgetRightWidth(IsWidget, double, Unit, double, Unit)} |
| * . |
| */ |
| public void testSetWidgetRightWidthAsIsWidget() { |
| LayoutPanel layoutPanel = createLayoutPanel(); |
| Widget label = createLabelInPanel(layoutPanel); |
| |
| // IsWidget cast to call the overloaded version |
| layoutPanel.setWidgetRightWidth((IsWidget) label, 10.0, Unit.PX, 15.0, |
| Unit.PX); |
| |
| assertLayerProperties( |
| label, |
| new LayerProperties().right(10.0).rightUnit(Unit.PX).width(15.0).widthUnit( |
| Unit.PX)); |
| } |
| |
| /** |
| * Tests |
| * {@link LayoutPanel#setWidgetTopBottom(Widget, double, Unit, double, Unit)} |
| * . |
| */ |
| public void testSetWidgetTopBottom() { |
| LayoutPanel layoutPanel = createLayoutPanel(); |
| Widget label = createLabelInPanel(layoutPanel); |
| |
| layoutPanel.setWidgetTopBottom(label, 10.0, Unit.PX, 20.0, Unit.PX); |
| |
| assertLayerProperties( |
| label, |
| new LayerProperties().top(10.0).topUnit(Unit.PX).bottom(20.0).bottomUnit( |
| Unit.PX)); |
| } |
| |
| /** |
| * Tests |
| * {@link LayoutPanel#setWidgetTopBottom(IsWidget, double, Unit, double, Unit)} |
| * . |
| */ |
| public void testSetWidgetTopBottomAsIsWidget() { |
| LayoutPanel layoutPanel = createLayoutPanel(); |
| Widget label = createLabelInPanel(layoutPanel); |
| |
| // IsWidget cast to call the overloaded version |
| layoutPanel.setWidgetTopBottom((IsWidget) label, 10.0, Unit.PX, 15.0, |
| Unit.PX); |
| |
| assertLayerProperties( |
| label, |
| new LayerProperties().top(10.0).topUnit(Unit.PX).bottom(15.0).bottomUnit( |
| Unit.PX)); |
| } |
| |
| /** |
| * Tests |
| * {@link LayoutPanel#setWidgetTopHeight(Widget, double, Unit, double, Unit)} |
| * . |
| */ |
| public void testSetWidgetTopHeight() { |
| LayoutPanel layoutPanel = createLayoutPanel(); |
| Widget label = createLabelInPanel(layoutPanel); |
| |
| layoutPanel.setWidgetTopHeight(label, 10.0, Unit.PX, 20.0, Unit.PX); |
| |
| assertLayerProperties( |
| label, |
| new LayerProperties().top(10.0).topUnit(Unit.PX).height(20.0).heightUnit( |
| Unit.PX)); |
| } |
| |
| /** |
| * Tests |
| * {@link LayoutPanel#setWidgetTopHeight(IsWidget, double, Unit, double, Unit)} |
| * . |
| */ |
| public void testSetWidgetTopHeightAsIsWidget() { |
| LayoutPanel layoutPanel = createLayoutPanel(); |
| Widget label = createLabelInPanel(layoutPanel); |
| |
| // IsWidget cast to call the overloaded version |
| layoutPanel.setWidgetTopHeight((IsWidget) label, 10.0, Unit.PX, 15.0, |
| Unit.PX); |
| |
| assertLayerProperties( |
| label, |
| new LayerProperties().top(10.0).topUnit(Unit.PX).height(15.0).heightUnit( |
| Unit.PX)); |
| } |
| |
| protected LayoutPanel createLayoutPanel() { |
| return new LayoutPanel(); |
| } |
| |
| protected Widget createLabelInPanel(LayoutPanel layoutPanel) { |
| Widget label = new Label("foo"); |
| layoutPanel.add(label); |
| return label; |
| } |
| |
| /** |
| * <p> |
| * Parameter class that hold a set of properties of a {@link Layout.Layer}. The |
| * default value for all the six properties (top, right, bottom, left, height |
| * and width) is 0.0, value that matches the default values for this |
| * properties in the actual {@link Layout.Layer}. The default values for the |
| * units also match the default values in {@link Layout.Layer}: <br> |
| * <code>topUnit = rightUnit = bottomUnit = leftUnit = {@link Unit#PX}</code> |
| * <br> |
| * <code>heigthUnit = widthUnit = null</code> |
| * </p> |
| * This class must be used as a parameter of |
| * {@link LayoutPanelTest#assertLayerProperties(Widget, LayerProperties)}, and |
| * was thought to be used as a builder in order to improve readability and |
| * reduce errors with the parameters of |
| * {@link LayoutPanelTest#assertLayerProperties(Widget, LayerProperties)}. |
| * </p> |
| * |
| * <p> |
| * <h3>Example:</h3> |
| * <code>assertLayerProperties(label, |
| * new LayerProperties().bottom(10.0).bottomUnit(Unit.PX) |
| * .height(15.0).heightUnit(Unit.PX);</code> |
| * </p> |
| */ |
| static class LayerProperties { |
| private double top, right, bottom, left, height, width; |
| private Unit topUnit = Unit.PX, rightUnit = Unit.PX, bottomUnit = Unit.PX, |
| leftUnit = Unit.PX, heightUnit, widthUnit; |
| |
| LayerProperties top(double top) { |
| this.top = top; |
| return this; |
| } |
| |
| double getTop() { |
| return top; |
| } |
| |
| LayerProperties topUnit(Unit topUnit) { |
| this.topUnit = topUnit; |
| return this; |
| } |
| |
| Unit getTopUnit() { |
| return topUnit; |
| } |
| |
| LayerProperties right(double right) { |
| this.right = right; |
| return this; |
| } |
| |
| double getRight() { |
| return right; |
| } |
| |
| LayerProperties rightUnit(Unit rightUnit) { |
| this.rightUnit = rightUnit; |
| return this; |
| } |
| |
| Unit getRightUnit() { |
| return rightUnit; |
| } |
| |
| LayerProperties bottom(double bottom) { |
| this.bottom = bottom; |
| return this; |
| } |
| |
| double getBottom() { |
| return bottom; |
| } |
| |
| LayerProperties bottomUnit(Unit bottomUnit) { |
| this.bottomUnit = bottomUnit; |
| return this; |
| } |
| |
| Unit getBottomUnit() { |
| return bottomUnit; |
| } |
| |
| LayerProperties left(double left) { |
| this.left = left; |
| return this; |
| } |
| |
| double getLeft() { |
| return left; |
| } |
| |
| LayerProperties leftUnit(Unit leftUnit) { |
| this.leftUnit = leftUnit; |
| return this; |
| } |
| |
| Unit getLeftUnit() { |
| return leftUnit; |
| } |
| |
| LayerProperties height(double height) { |
| this.height = height; |
| return this; |
| } |
| |
| double getHeight() { |
| return height; |
| } |
| |
| LayerProperties heightUnit(Unit heightUnit) { |
| this.heightUnit = heightUnit; |
| return this; |
| } |
| |
| Unit getHeightUnit() { |
| return heightUnit; |
| } |
| |
| LayerProperties width(double width) { |
| this.width = width; |
| return this; |
| } |
| |
| double getWidth() { |
| return width; |
| } |
| |
| LayerProperties widthUnit(Unit widthUnit) { |
| this.widthUnit = widthUnit; |
| return this; |
| } |
| |
| Unit getWidthUnit() { |
| return widthUnit; |
| } |
| } |
| |
| /** |
| * <p> |
| * Asserts that the layer properties of the <b>widget</b> are the given ones. |
| * </p> |
| * |
| * @param widget the widget being tested |
| * @param expectedLayerProperties the expected properties of <b>widget</b> |
| */ |
| private void assertLayerProperties(final Widget widget, |
| final LayerProperties expectedLayerProperties) { |
| delayTestFinish(2000); |
| Scheduler.get().scheduleDeferred(new ScheduledCommand() { |
| |
| public void execute() { |
| Layer layer = (Layout.Layer) widget.getLayoutData(); |
| LayerFriend helper = new LayerFriend(layer); |
| |
| assertEquals("Top", expectedLayerProperties.getTop(), helper.getTop()); |
| assertEquals("Right", expectedLayerProperties.getRight(), |
| helper.getRight()); |
| assertEquals("Bottom", expectedLayerProperties.getBottom(), |
| helper.getBottom()); |
| assertEquals("Left", expectedLayerProperties.getLeft(), |
| helper.getLeft()); |
| assertEquals("Height", expectedLayerProperties.getHeight(), |
| helper.getHeight()); |
| assertEquals("Width", expectedLayerProperties.getWidth(), |
| helper.getWidth()); |
| |
| assertEquals("Top Units", expectedLayerProperties.getTopUnit(), |
| helper.getTopUnit()); |
| assertEquals("Right Units", expectedLayerProperties.getRightUnit(), |
| helper.getRightUnit()); |
| assertEquals("Bottom Units", expectedLayerProperties.getBottomUnit(), |
| helper.getBottomUnit()); |
| assertEquals("Left Units", expectedLayerProperties.getLeftUnit(), |
| helper.getLeftUnit()); |
| assertEquals("Height Units", expectedLayerProperties.getHeightUnit(), |
| helper.getHeightUnit()); |
| assertEquals("Width Units", expectedLayerProperties.getWidthUnit(), |
| helper.getWidthUnit()); |
| finishTest(); |
| } |
| }); |
| } |
| } |