/*
* Copyright 2000-2016 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.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.ui.grid.HeightMode;
import com.vaadin.tests.components.AbstractReindeerTestUI;
import com.vaadin.tests.data.bean.Person;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Component;
import com.vaadin.ui.Grid;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.RadioButtonGroup;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.renderers.NumberRenderer;
/**
* Tests that Grid gets correct height based on height mode, and resizes
* properly with details row if height is undefined.
*
* @author Vaadin Ltd
*/
public class GridHeight extends AbstractReindeerTestUI {
static final String FULL = "Full";
static final String UNDEFINED = "Undefined";
static final String PX100 = "100px";
static final Integer ROW3 = 3;
static final Object[] gridHeights = { FULL, UNDEFINED, ROW3 };
static final String[] gridWidths = { FULL, UNDEFINED };
static final String[] detailsRowHeights = { FULL, UNDEFINED, PX100 };
private Grid<Person> grid;
private Map<Person, VerticalLayout> detailsLayouts = new HashMap<>();
private RadioButtonGroup<String> detailsHeightSelector;
@Override
protected void setup(VaadinRequest request) {
grid = new Grid<>();
grid.addColumn(Person::getFirstName);
grid.addColumn(Person::getAge, new NumberRenderer());
grid.setItems(createPersons());
grid.setDetailsGenerator(person -> {
if (!detailsLayouts.containsKey(person)) {
createDetailsLayout(person);
}
return detailsLayouts.get(person);
});
grid.addItemClickListener(click -> grid.setDetailsVisible(
click.getItem(), !grid.isDetailsVisible(click.getItem())));
addComponent(createOptionLayout());
addComponent(grid);
}
private List<Person> createPersons() {
Person person1 = new Person();
person1.setFirstName("Nicolaus Copernicus");
person1.setAge(1543);
Person person2 = new Person();
person2.setFirstName("Galileo Galilei");
person2.setAge(1564);
Person person3 = new Person();
person3.setFirstName("Johannes Kepler");
person3.setAge(1571);
return Arrays.asList(person1, person2, person3);
}
private void createDetailsLayout(Person person) {
VerticalLayout detailsLayout = new VerticalLayout();
setDetailsHeight(detailsLayout, detailsHeightSelector.getValue());
detailsLayout.setWidth("100%");
Label lbl1 = new Label("details row");
lbl1.setId("lbl1");
lbl1.setSizeUndefined();
detailsLayout.addComponent(lbl1);
detailsLayout.setComponentAlignment(lbl1, Alignment.MIDDLE_CENTER);
detailsLayouts.put(person, detailsLayout);
}
private Component createOptionLayout() {
HorizontalLayout optionLayout = new HorizontalLayout();
RadioButtonGroup<Object> gridHeightSelector = new RadioButtonGroup<>(
"Grid height");
gridHeightSelector.setItems(Arrays.asList(gridHeights));
gridHeightSelector.setId("gridHeightSelector");
gridHeightSelector.setItemCaptionGenerator(this::generateCaption);
gridHeightSelector.addValueChangeListener(event -> {
Object value = event.getValue();
if (UNDEFINED.equals(value)) {
grid.setHeightUndefined();
grid.setHeightMode(HeightMode.UNDEFINED);
} else if (FULL.equals(value)) {
grid.setHeight("100%");
grid.setHeightMode(HeightMode.CSS);
} else if (ROW3.equals(value)) {
grid.setHeightByRows(ROW3);
grid.setHeightMode(HeightMode.ROW);
}
});
gridHeightSelector.setValue(UNDEFINED);
optionLayout.addComponent(gridHeightSelector);
RadioButtonGroup<String> gridWidthSelector = new RadioButtonGroup<>(
"Grid width", Arrays.asList(gridWidths));
gridWidthSelector.setId("gridWidthSelector");
gridWidthSelector.addValueChangeListener(event -> {
Object value = event.getValue();
if (UNDEFINED.equals(value)) {
grid.setWidthUndefined();
} else if (FULL.equals(value)) {
grid.setWidth("100%");
}
});
gridWidthSelector.setValue(UNDEFINED);
optionLayout.addComponent(gridWidthSelector);
detailsHeightSelector = new RadioButtonGroup<>("Details row height");
detailsHeightSelector.setItems(Arrays.asList(detailsRowHeights));
detailsHeightSelector.setId("detailsHeightSelector");
detailsHeightSelector.addValueChangeListener(event -> {
Object value = event.getValue();
for (VerticalLayout detailsLayout : detailsLayouts.values()) {
setDetailsHeight(detailsLayout, value);
}
});
detailsHeightSelector.setValue(PX100);
optionLayout.addComponent(detailsHeightSelector);
return optionLayout;
}
private void setDetailsHeight(VerticalLayout detailsLayout, Object value) {
if (UNDEFINED.equals(value)) {
detailsLayout.setHeightUndefined();
} else if (FULL.equals(value)) {
detailsLayout.setHeight("100%");
} else if (PX100.equals(value)) {
detailsLayout.setHeight(PX100);
}
}
@Override
protected String getTestDescription() {
return "Grid with undefined height should display all rows and resize when details row is opened."
+ "<br>Grid with full height is always 400px high regardless or details row."
+ "<br>Grid with row height should always be the height of those rows regardless of details row.";
}
@Override
protected Integer getTicketNumber() {
return 19690;
}
private String generateCaption(Object item) {
if (item instanceof String) {
return item.toString();
} else {
return item + " rows";
}
}
}