Change-Id: I0ae9144817db3bb730c80748d5e9190484b323e7tags/7.7.6
@@ -5791,40 +5791,6 @@ public class Escalator extends Widget | |||
header.paintInsertRows(0, header.getRowCount()); | |||
footer.paintInsertRows(0, footer.getRowCount()); | |||
// recalculateElementSizes(); | |||
Scheduler.get().scheduleDeferred(new Command() { | |||
@Override | |||
public void execute() { | |||
/* | |||
* Not a faintest idea why we have to defer this call, but | |||
* unless it is deferred, the size of the escalator will be 0x0 | |||
* after it is first detached and then reattached to the DOM. | |||
* This only applies to a bare Escalator; inside a Grid | |||
* everything works fine either way. | |||
* | |||
* The three autodetectRowHeightLater calls above seem obvious | |||
* suspects at first. However, they don't seem to have anything | |||
* to do with the issue, as they are no-ops in the | |||
* detach-reattach case. | |||
*/ | |||
recalculateElementSizes(); | |||
} | |||
}); | |||
/* | |||
* Note: There's no need to explicitly insert rows into the body. | |||
* | |||
* recalculateElementSizes will recalculate the height of the body. This | |||
* has the side-effect that as the body's size grows bigger (i.e. from 0 | |||
* to its actual height), more escalator rows are populated. Those | |||
* escalator rows are then immediately rendered. This, in effect, is the | |||
* same thing as inserting those rows. | |||
* | |||
* In fact, having an extra paintInsertRows here would lead to duplicate | |||
* rows. | |||
*/ | |||
boolean columnsChanged = false; | |||
for (ColumnConfigurationImpl.Column column : columnConfiguration.columns) { | |||
boolean columnChanged = column.measureAndSetWidthIfNeeded(); | |||
@@ -5851,6 +5817,20 @@ public class Escalator extends Widget | |||
} else { | |||
scroller.attachTouchListeners(getElement()); | |||
} | |||
/* | |||
* Note: There's no need to explicitly insert rows into the body. | |||
* | |||
* recalculateElementSizes will recalculate the height of the body. This | |||
* has the side-effect that as the body's size grows bigger (i.e. from 0 | |||
* to its actual height), more escalator rows are populated. Those | |||
* escalator rows are then immediately rendered. This, in effect, is the | |||
* same thing as inserting those rows. | |||
* | |||
* In fact, having an extra paintInsertRows here would lead to duplicate | |||
* rows. | |||
*/ | |||
recalculateElementSizes(); | |||
} | |||
@Override |
@@ -0,0 +1,48 @@ | |||
package com.vaadin.tests.components.grid; | |||
import com.vaadin.server.VaadinRequest; | |||
import com.vaadin.tests.components.AbstractTestUIWithLog; | |||
import com.vaadin.ui.Button; | |||
import com.vaadin.ui.Button.ClickEvent; | |||
import com.vaadin.ui.Button.ClickListener; | |||
import com.vaadin.ui.Grid; | |||
import com.vaadin.ui.HorizontalLayout; | |||
import com.vaadin.ui.Label; | |||
import com.vaadin.ui.VerticalLayout; | |||
public class MoveGridAndAddRow extends AbstractTestUIWithLog { | |||
@Override | |||
protected void setup(VaadinRequest request) { | |||
final VerticalLayout layout = new VerticalLayout(); | |||
final VerticalLayout anotherLayout = new VerticalLayout(); | |||
anotherLayout.addComponent(new Label("This is another layout")); | |||
final Grid g = new Grid(); | |||
g.addColumn("A"); | |||
g.addRow("1"); | |||
final Button b = new Button("Add row and remove this button"); | |||
b.setId("add"); | |||
b.addClickListener(new ClickListener() { | |||
@Override | |||
public void buttonClick(ClickEvent e) { | |||
g.addRow("2"); | |||
b.setVisible(false); | |||
} | |||
}); | |||
Button move = new Button("Move grid to other layout"); | |||
move.setId("move"); | |||
move.addClickListener(new ClickListener() { | |||
@Override | |||
public void buttonClick(ClickEvent event) { | |||
anotherLayout.addComponent(g); | |||
} | |||
}); | |||
layout.addComponents(b, move, g); | |||
addComponent(new HorizontalLayout(layout, anotherLayout)); | |||
} | |||
} |
@@ -379,9 +379,25 @@ public class EscalatorBasicClientFeaturesWidget | |||
String[] menupath = { GENERAL_MENU }; | |||
addMenuCommand("Detach Escalator", new ScheduledCommand() { | |||
@Override | |||
public void execute() { | |||
// DockLayoutPanel removes height and width definitions on | |||
// detach, so store them and restore them in attach to keep | |||
// Escalator the same size | |||
String detachHeight = escalator.getElement().getStyle() | |||
.getHeight(); | |||
String detachWidth = escalator.getElement().getStyle() | |||
.getWidth(); | |||
escalator.removeFromParent(); | |||
if (detachHeight != null) { | |||
escalator.getElement().getStyle().setProperty("height", | |||
detachHeight); | |||
} | |||
if (detachWidth != null) { | |||
escalator.getElement().getStyle().setProperty("width", | |||
detachWidth); | |||
} | |||
} | |||
}, menupath); | |||
@@ -0,0 +1,21 @@ | |||
package com.vaadin.tests.components.grid; | |||
import org.junit.Assert; | |||
import org.junit.Test; | |||
import com.vaadin.testbench.elements.ButtonElement; | |||
import com.vaadin.testbench.elements.GridElement; | |||
import com.vaadin.tests.tb3.SingleBrowserTest; | |||
public class MoveGridAndAddRowTest extends SingleBrowserTest { | |||
@Test | |||
public void addRowAndChangeLayout() { | |||
openTestURL(); | |||
$(ButtonElement.class).id("add").click(); | |||
GridElement grid = $(GridElement.class).first(); | |||
Assert.assertEquals("1", grid.getCell(0, 0).getText()); | |||
Assert.assertEquals("2", grid.getCell(1, 0).getText()); | |||
} | |||
} |