From ac387be250a91ee8ae593581f97a8d05bd5dbd67 Mon Sep 17 00:00:00 2001 From: Markus Koivisto Date: Thu, 16 Apr 2015 15:00:07 +0300 Subject: [PATCH] Revert "Reduce reflows when sizing columns (#17315)" This reverts commit 103b329d328ab0dde95da9426462491be510a8be. It causes problems with screenshot tests (GridColumnAutoWidthServerTest). Change-Id: I1de4a44573b22e0bea8ffa2626724e2a182cb876 --- .../com/vaadin/client/widgets/Escalator.java | 110 +++++------- .../components/grid/GridResizeTerror.java | 45 ----- .../vaadin/tests/util/ResizeTerrorizer.java | 51 ------ .../ResizeTerrorizerControlConnector.java | 157 ------------------ .../rebind/TestWidgetRegistryGenerator.java | 3 - 5 files changed, 38 insertions(+), 328 deletions(-) delete mode 100644 uitest/src/com/vaadin/tests/components/grid/GridResizeTerror.java delete mode 100644 uitest/src/com/vaadin/tests/util/ResizeTerrorizer.java delete mode 100644 uitest/src/com/vaadin/tests/widgetset/client/ResizeTerrorizerControlConnector.java diff --git a/client/src/com/vaadin/client/widgets/Escalator.java b/client/src/com/vaadin/client/widgets/Escalator.java index 83c176d6fd..3d4459a0cc 100644 --- a/client/src/com/vaadin/client/widgets/Escalator.java +++ b/client/src/com/vaadin/client/widgets/Escalator.java @@ -16,7 +16,6 @@ package com.vaadin.client.widgets; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; @@ -2011,8 +2010,9 @@ public class Escalator extends Widget implements RequiresResize, DeferredWorker return new Cell(domRowIndex, domColumnIndex, cellElement); } - void createAutoSizeElements(int colIndex, - Collection elements) { + double getMaxCellWidth(int colIndex) throws IllegalArgumentException { + double maxCellWidth = -1; + assert isAttached() : "Can't measure max width of cell, since Escalator is not attached to the DOM."; NodeList rows = root.getRows(); @@ -2041,9 +2041,24 @@ public class Escalator extends Widget implements RequiresResize, DeferredWorker cellClone.getStyle().clearWidth(); rowElement.insertBefore(cellClone, cellOriginal); + double requiredWidth = WidgetUtil + .getRequiredWidthBoundingClientRectDouble(cellClone); + + if (BrowserInfo.get().isIE()) { + /* + * IE browsers have some issues with subpixels. Occasionally + * content is overflown even if not necessary. Increase the + * counted required size by 0.01 just to be on the safe + * side. + */ + requiredWidth += 0.01; + } - elements.add(cellClone); + maxCellWidth = Math.max(requiredWidth, maxCellWidth); + cellClone.removeFromParent(); } + + return maxCellWidth; } private boolean cellIsPartOfSpan(TableCellElement cell) { @@ -3774,8 +3789,7 @@ public class Escalator extends Widget implements RequiresResize, DeferredWorker if (px < 0) { if (isAttached()) { - autosizeColumns(Collections.singletonList(columns - .indexOf(this))); + calculateWidth(); } else { /* * the column's width is calculated at Escalator.onLoad @@ -3829,6 +3843,10 @@ public class Escalator extends Widget implements RequiresResize, DeferredWorker } return false; } + + private void calculateWidth() { + calculatedWidth = getMaxCellWidth(columns.indexOf(this)); + } } private final List columns = new ArrayList(); @@ -4133,7 +4151,6 @@ public class Escalator extends Widget implements RequiresResize, DeferredWorker return; } - List autosizeColumns = new ArrayList(); for (Entry entry : indexWidthMap.entrySet()) { int index = entry.getKey().intValue(); double width = entry.getValue().doubleValue(); @@ -4143,14 +4160,9 @@ public class Escalator extends Widget implements RequiresResize, DeferredWorker } checkValidColumnIndex(index); - if (width >= 0) { - columns.get(index).setWidth(width); - } else { - autosizeColumns.add(index); - } - } + columns.get(index).setWidth(width); - autosizeColumns(autosizeColumns); + } widthsArray = null; header.reapplyColumnWidths(); @@ -4162,64 +4174,6 @@ public class Escalator extends Widget implements RequiresResize, DeferredWorker recalculateElementSizes(); } - private void autosizeColumns(List columns) { - if (columns.isEmpty()) { - return; - } - - // Must process columns in index order - Collections.sort(columns); - - Map> autoSizeElements = new HashMap>(); - try { - // Set up the entire DOM at once - for (int i = columns.size() - 1; i >= 0; i--) { - // Iterate backwards to not mess with the indexing - Integer colIndex = columns.get(i); - - ArrayList elements = new ArrayList(); - autoSizeElements.put(colIndex, elements); - - header.createAutoSizeElements(colIndex, elements); - body.createAutoSizeElements(colIndex, elements); - footer.createAutoSizeElements(colIndex, elements); - } - - // Extract all measurements & update values - for (Integer colIndex : columns) { - double maxWidth = Double.NEGATIVE_INFINITY; - List elements = autoSizeElements - .get(colIndex); - for (TableCellElement element : elements) { - - double cellWidth = WidgetUtil - .getRequiredWidthBoundingClientRectDouble(element); - - maxWidth = Math.max(maxWidth, cellWidth); - } - assert maxWidth >= 0 : "Got a negative max width for a column, which should be impossible."; - - if (BrowserInfo.get().isIE()) { - /* - * IE browsers have some issues with subpixels. - * Occasionally content is overflown even if not - * necessary. Increase the counted required size by 0.01 - * just to be on the safe side. - */ - maxWidth += 0.01; - } - - this.columns.get(colIndex).calculatedWidth = maxWidth; - } - } finally { - for (List list : autoSizeElements.values()) { - for (TableCellElement element : list) { - element.removeFromParent(); - } - } - } - } - private void checkValidColumnIndex(int index) throws IllegalArgumentException { if (!Range.withLength(0, getColumnCount()).contains(index)) { @@ -4239,6 +4193,18 @@ public class Escalator extends Widget implements RequiresResize, DeferredWorker return columns.get(index).getCalculatedWidth(); } + private double getMaxCellWidth(int colIndex) + throws IllegalArgumentException { + double headerWidth = header.getMaxCellWidth(colIndex); + double bodyWidth = body.getMaxCellWidth(colIndex); + double footerWidth = footer.getMaxCellWidth(colIndex); + + double maxWidth = Math.max(headerWidth, + Math.max(bodyWidth, footerWidth)); + assert maxWidth >= 0 : "Got a negative max width for a column, which should be impossible."; + return maxWidth; + } + /** * Calculates the width of the columns in a given range. * diff --git a/uitest/src/com/vaadin/tests/components/grid/GridResizeTerror.java b/uitest/src/com/vaadin/tests/components/grid/GridResizeTerror.java deleted file mode 100644 index 365461caa9..0000000000 --- a/uitest/src/com/vaadin/tests/components/grid/GridResizeTerror.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2000-2014 Vaadin Ltd. - * - * 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.vaadin.tests.components.grid; - -import com.vaadin.annotations.Widgetset; -import com.vaadin.server.VaadinRequest; -import com.vaadin.tests.util.ResizeTerrorizer; -import com.vaadin.tests.widgetset.TestingWidgetSet; -import com.vaadin.ui.Grid; -import com.vaadin.ui.UI; - -@Widgetset(TestingWidgetSet.NAME) -public class GridResizeTerror extends UI { - @Override - protected void init(VaadinRequest request) { - Grid grid = new Grid(); - - int cols = 10; - Object[] data = new Object[cols]; - - for (int i = 0; i < cols; i++) { - grid.addColumn("Col " + i); - data[i] = "Data " + i; - } - - for (int i = 0; i < 500; i++) { - grid.addRow(data); - } - - setContent(new ResizeTerrorizer(grid)); - } -} diff --git a/uitest/src/com/vaadin/tests/util/ResizeTerrorizer.java b/uitest/src/com/vaadin/tests/util/ResizeTerrorizer.java deleted file mode 100644 index f124305d8a..0000000000 --- a/uitest/src/com/vaadin/tests/util/ResizeTerrorizer.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2000-2014 Vaadin Ltd. - * - * 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.vaadin.tests.util; - -import com.vaadin.tests.widgetset.client.ResizeTerrorizerControlConnector.ResizeTerorrizerState; -import com.vaadin.ui.AbstractComponent; -import com.vaadin.ui.Component; -import com.vaadin.ui.VerticalLayout; - -public class ResizeTerrorizer extends VerticalLayout { - private final ResizeTerrorizerControl control; - - public class ResizeTerrorizerControl extends AbstractComponent implements - Component { - - public ResizeTerrorizerControl(Component target) { - getState().target = target; - } - - @Override - protected ResizeTerorrizerState getState() { - return (ResizeTerorrizerState) super.getState(); - } - } - - public ResizeTerrorizer(Component target) { - target.setWidth("700px"); - setSizeFull(); - addComponent(target); - setExpandRatio(target, 1); - control = new ResizeTerrorizerControl(target); - addComponent(control); - } - - public void setDefaultWidthOffset(int px) { - control.getState().defaultWidthOffset = px; - } -} diff --git a/uitest/src/com/vaadin/tests/widgetset/client/ResizeTerrorizerControlConnector.java b/uitest/src/com/vaadin/tests/widgetset/client/ResizeTerrorizerControlConnector.java deleted file mode 100644 index 9fe037706b..0000000000 --- a/uitest/src/com/vaadin/tests/widgetset/client/ResizeTerrorizerControlConnector.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright 2000-2014 Vaadin Ltd. - * - * 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.vaadin.tests.widgetset.client; - -import com.google.gwt.animation.client.AnimationScheduler; -import com.google.gwt.animation.client.AnimationScheduler.AnimationCallback; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.FlowPanel; -import com.google.gwt.user.client.ui.IntegerBox; -import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.RequiresResize; -import com.vaadin.client.ui.AbstractComponentConnector; -import com.vaadin.client.ui.PostLayoutListener; -import com.vaadin.shared.AbstractComponentState; -import com.vaadin.shared.Connector; -import com.vaadin.shared.ui.Connect; -import com.vaadin.tests.util.ResizeTerrorizer; - -@Connect(ResizeTerrorizer.ResizeTerrorizerControl.class) -public class ResizeTerrorizerControlConnector extends - AbstractComponentConnector implements PostLayoutListener { - - public static class ResizeTerorrizerState extends AbstractComponentState { - public Connector target; - public int defaultWidthOffset = 200; - } - - public class ResizeTerrorizerControlPanel extends FlowPanel { - private Label results = new Label("Results"); - private IntegerBox startWidth = new IntegerBox(); - private IntegerBox endWidth = new IntegerBox(); - private final Button terrorizeButton = new Button("Terrorize", - new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - terrorize(startWidth.getValue(), endWidth.getValue(), - 1000); - } - }); - - public ResizeTerrorizerControlPanel() { - add(new Label("Start width")); - add(startWidth); - - add(new Label("End width")); - add(endWidth); - - add(terrorizeButton); - add(results); - - startWidth.getElement().setId("terror-start-width"); - endWidth.getElement().setId("terror-end-width"); - terrorizeButton.getElement().setId("terror-button"); - results.getElement().setId("terror-results"); - } - - private void showResults(String results) { - Integer temp = startWidth.getValue(); - startWidth.setValue(endWidth.getValue()); - endWidth.setValue(temp); - - this.results.setText(results); - } - } - - private void terrorize(final double startWidth, final double endWidth, - final double duration) { - final AbstractComponentConnector target = getTarget(); - - final AnimationScheduler scheduler = AnimationScheduler.get(); - AnimationCallback callback = new AnimationCallback() { - double startTime = -1; - int frameCount = 0; - - @Override - public void execute(double timestamp) { - frameCount++; - - boolean done = false; - if (startTime == -1) { - startTime = timestamp; - } - - double time = timestamp - startTime; - if (time > duration) { - time = duration; - done = true; - } - - double progress = time / duration; - double widthToSet = startWidth + (endWidth - startWidth) - * progress; - - // TODO Optionally inform LayoutManager as well - target.getWidget().setWidth(widthToSet + "px"); - if (target.getWidget() instanceof RequiresResize) { - ((RequiresResize) target.getWidget()).onResize(); - } - - if (!done) { - scheduler.requestAnimationFrame(this); - } else { - double fps = Math.round(frameCount / (duration / 1000)); - String results = frameCount + " frames, " + fps + " fps"; - - getWidget().showResults(results); - } - } - }; - scheduler.requestAnimationFrame(callback); - } - - private AbstractComponentConnector getTarget() { - return (AbstractComponentConnector) getState().target; - } - - @Override - public ResizeTerorrizerState getState() { - return (ResizeTerorrizerState) super.getState(); - } - - @Override - public ResizeTerrorizerControlPanel getWidget() { - return (ResizeTerrorizerControlPanel) super.getWidget(); - } - - @Override - protected ResizeTerrorizerControlPanel createWidget() { - return new ResizeTerrorizerControlPanel(); - } - - @Override - public void postLayout() { - if (getWidget().startWidth.getValue() == null) { - int width = getTarget().getWidget().getElement().getOffsetWidth(); - getWidget().startWidth.setValue(width); - getWidget().endWidth - .setValue(width + getState().defaultWidthOffset); - } - } - -} diff --git a/uitest/src/com/vaadin/tests/widgetset/rebind/TestWidgetRegistryGenerator.java b/uitest/src/com/vaadin/tests/widgetset/rebind/TestWidgetRegistryGenerator.java index c7b29e271b..1bdbba2c36 100644 --- a/uitest/src/com/vaadin/tests/widgetset/rebind/TestWidgetRegistryGenerator.java +++ b/uitest/src/com/vaadin/tests/widgetset/rebind/TestWidgetRegistryGenerator.java @@ -136,9 +136,6 @@ public class TestWidgetRegistryGenerator extends Generator { } else if (!widgetType.getPackage().getName() .startsWith(TestWidgetConnector.class.getPackage().getName())) { return false; - } else if (widgetType.getEnclosingType() != null - && !widgetType.isStatic()) { - return false; } return true; -- 2.39.5