}
// Add all necessary listeners
+ boolean listenersAdded = false;
if (needsFixedHeight()) {
slot.setWidgetResizeListener(childComponentResizeListener);
if (slot.hasCaption()) {
slot.setCaptionResizeListener(slotCaptionResizeListener);
}
+ listenersAdded = true;
} else if ((hasChildrenWithRelativeHeight
|| hasChildrenWithRelativeWidth) && slot.hasCaption()) {
/*
* as the relative size?
*/
slot.setCaptionResizeListener(slotCaptionResizeListener);
+ listenersAdded = true;
}
if (needsExpand()) {
if (slot.hasSpacing()) {
slot.setSpacingResizeListener(spacingResizeListener);
}
+ listenersAdded = true;
+ }
+
+ if (listenersAdded) {
+ // removing these listeners makes widget unmeasurable and resets the
+ // measured height, measure again if listeners got added back
+ getLayoutManager().setNeedsMeasure(child);
}
}
--- /dev/null
+package com.vaadin.tests.layouts;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.ProgressBar;
+
+public class UpdateComponentWithinExpandRatio extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ ProgressBar progress = new ProgressBar();
+ progress.setWidth(100, Unit.PERCENTAGE);
+ Button button = new Button("Progress", e -> {
+ float value = progress.getValue();
+ value = (value >= 1) ? 0 : value + 0.1f;
+ progress.setValue(value);
+ });
+
+ HorizontalLayout layout = new HorizontalLayout(progress, button);
+ layout.setExpandRatio(progress, 1);
+ layout.setWidth(100, Unit.PERCENTAGE);
+ getLayout().addComponent(layout);
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Clicking the button to update the progress bar (expanded) "
+ + "shouldn't push the button (fixed width) to the right";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 10734;
+ }
+}
--- /dev/null
+package com.vaadin.tests.layouts;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.elements.ProgressBarElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class UpdateComponentWithinExpandRatioTest extends MultiBrowserTest {
+
+ @Test
+ public void updateProgressShouldNotMoveButton() {
+ openTestURL();
+ ProgressBarElement pb = $(ProgressBarElement.class).first();
+ ButtonElement button = $(ButtonElement.class).first();
+
+ int initialX = button.getLocation().getX();
+ int initialWidth = pb.getSize().getWidth();
+
+ button.click();
+
+ assertEquals("Button's position changed unexpectedly", initialX,
+ button.getLocation().getX());
+ assertEquals("ProgressBar's width changed unexpectedly", initialWidth,
+ pb.getSize().getWidth());
+ }
+}