* Don't reset to default column sizes when adding row to emtpy escalator * Don't wait for data after size is explicilty reset to 0 * Don't assume there were previous rows when adjusting focus on add Change-Id: I59e8c0ef0c5633cf3678db63a660e3f1d1ca7d2atags/7.4.2
@@ -1390,10 +1390,10 @@ public class Escalator extends Widget implements RequiresResize, DeferredWorker | |||
* first time. | |||
*/ | |||
Map<Integer, Double> colWidths = new HashMap<Integer, Double>(); | |||
Double width = Double | |||
.valueOf(ColumnConfigurationImpl.Column.DEFAULT_COLUMN_WIDTH_PX); | |||
for (int i = 0; i < getColumnConfiguration() | |||
.getColumnCount(); i++) { | |||
Double width = Double.valueOf(getColumnConfiguration() | |||
.getColumnWidth(i)); | |||
Integer col = Integer.valueOf(i); | |||
colWidths.put(col, width); | |||
} |
@@ -2119,6 +2119,8 @@ public class Grid<T> extends ResizeComposite implements | |||
boolean insertionIsAboveFocusedCell = (added.getStart() <= rowWithFocus); | |||
if (bodyHasFocus && insertionIsAboveFocusedCell) { | |||
rowWithFocus += added.length(); | |||
rowWithFocus = Math.min(rowWithFocus, escalator.getBody() | |||
.getRowCount() - 1); | |||
refreshRow(rowWithFocus); | |||
} | |||
} | |||
@@ -4578,6 +4580,10 @@ public class Grid<T> extends ResizeComposite implements | |||
Range visibleRowRange = escalator.getVisibleRowRange(); | |||
dataSource.ensureAvailability(visibleRowRange.getStart(), | |||
visibleRowRange.length()); | |||
} else { | |||
// We won't expect any data more data updates, so just make | |||
// the bookkeeping happy | |||
dataAvailable(0, 0); | |||
} | |||
assert body.getRowCount() == newSize; |
@@ -0,0 +1,87 @@ | |||
/* | |||
* 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.server.VaadinRequest; | |||
import com.vaadin.tests.components.AbstractTestUI; | |||
import com.vaadin.ui.Button; | |||
import com.vaadin.ui.Button.ClickEvent; | |||
import com.vaadin.ui.Grid; | |||
import com.vaadin.ui.VerticalLayout; | |||
public class GridColumnWidthsWithoutData extends AbstractTestUI { | |||
private Grid grid = createGrid(true); | |||
@Override | |||
protected void setup(VaadinRequest request) { | |||
addComponent(grid); | |||
addComponent(new Button("Recreate without data", | |||
new Button.ClickListener() { | |||
@Override | |||
public void buttonClick(ClickEvent event) { | |||
replaceGrid(createGrid(false)); | |||
} | |||
})); | |||
addComponent(new Button("Recreate with data", | |||
new Button.ClickListener() { | |||
@Override | |||
public void buttonClick(ClickEvent event) { | |||
replaceGrid(createGrid(true)); | |||
} | |||
})); | |||
addComponent(new Button("Add data", new Button.ClickListener() { | |||
@Override | |||
public void buttonClick(ClickEvent event) { | |||
addDataToGrid(grid); | |||
} | |||
})); | |||
addComponent(new Button("Remove data", new Button.ClickListener() { | |||
@Override | |||
public void buttonClick(ClickEvent event) { | |||
grid.getContainerDataSource().removeAllItems(); | |||
} | |||
})); | |||
} | |||
private void replaceGrid(Grid newGrid) { | |||
((VerticalLayout) grid.getParent()).replaceComponent(grid, newGrid); | |||
grid = newGrid; | |||
} | |||
private Grid createGrid(boolean withData) { | |||
Grid grid = new Grid(); | |||
grid.addColumn("foo"); | |||
grid.addColumn("bar"); | |||
grid.setWidth("300px"); | |||
if (withData) { | |||
addDataToGrid(grid); | |||
} | |||
return grid; | |||
} | |||
private void addDataToGrid(Grid grid) { | |||
grid.addRow("Some", "Data with more data in one col"); | |||
} | |||
} |
@@ -0,0 +1,105 @@ | |||
/* | |||
* 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 java.util.List; | |||
import org.junit.Assert; | |||
import org.junit.Test; | |||
import com.vaadin.testbench.elements.ButtonElement; | |||
import com.vaadin.testbench.elements.GridElement; | |||
import com.vaadin.testbench.elements.GridElement.GridCellElement; | |||
import com.vaadin.testbench.elements.NotificationElement; | |||
import com.vaadin.tests.tb3.SingleBrowserTest; | |||
public class GridColumnWidthsWithoutDataTest extends SingleBrowserTest { | |||
@Test | |||
public void testWidthsWhenAddingDataBack() { | |||
openTestURL(); | |||
GridElement grid = $(GridElement.class).first(); | |||
int[] baseWidths = getColWidths(grid); | |||
Assert.assertEquals("Sanity check", 2, baseWidths.length); | |||
Assert.assertTrue("Columns should not have equal width", | |||
Math.abs(baseWidths[0] - baseWidths[1]) > 2); | |||
removeData(); | |||
assertSameWidths(baseWidths, getColWidths(grid)); | |||
addData(); | |||
assertSameWidths(baseWidths, getColWidths(grid)); | |||
} | |||
@Test | |||
public void restWidthsWhenInitiallyEmpty() { | |||
setDebug(true); | |||
openTestURL(); | |||
$(ButtonElement.class).caption("Recreate without data").first().click(); | |||
GridElement grid = $(GridElement.class).first(); | |||
int[] baseWidths = getColWidths(grid); | |||
Assert.assertEquals("Sanity check", 2, baseWidths.length); | |||
Assert.assertTrue("Columns should have roughly equal width", | |||
Math.abs(baseWidths[0] - baseWidths[1]) < 10); | |||
Assert.assertTrue("Columns should not have default widths", | |||
baseWidths[0] > 140); | |||
Assert.assertTrue("Columns should not have default widths", | |||
baseWidths[1] > 140); | |||
addData(); | |||
assertSameWidths(baseWidths, getColWidths(grid)); | |||
Assert.assertFalse("Notification was present", | |||
isElementPresent(NotificationElement.class)); | |||
} | |||
private static void assertSameWidths(int[] expected, int[] actual) { | |||
Assert.assertEquals("Arrays have differing lengths", expected.length, | |||
actual.length); | |||
for (int i = 0; i < expected.length; i++) { | |||
if (Math.abs(expected[i] - actual[i]) > 1) { | |||
Assert.fail("Differing sizes at index " + i + ". Expected " | |||
+ expected[i] + " but got " + actual[i]); | |||
} | |||
} | |||
} | |||
private void removeData() { | |||
$(ButtonElement.class).caption("Remove data").first().click(); | |||
} | |||
private void addData() { | |||
$(ButtonElement.class).caption("Add data").first().click(); | |||
} | |||
private int[] getColWidths(GridElement grid) { | |||
List<GridCellElement> headerCells = grid.getHeaderCells(0); | |||
int[] widths = new int[headerCells.size()]; | |||
for (int i = 0; i < widths.length; i++) { | |||
widths[i] = headerCells.get(i).getSize().getWidth(); | |||
} | |||
return widths; | |||
} | |||
} |