/*
* 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.v7.tests.components.grid;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractReindeerTestUI;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.v7.data.Property.ValueChangeEvent;
import com.vaadin.v7.data.Property.ValueChangeListener;
import com.vaadin.v7.event.ItemClickEvent;
import com.vaadin.v7.event.ItemClickEvent.ItemClickListener;
import com.vaadin.v7.shared.ui.grid.HeightMode;
import com.vaadin.v7.ui.Grid;
import com.vaadin.v7.ui.Grid.DetailsGenerator;
import com.vaadin.v7.ui.Grid.RowReference;
import com.vaadin.v7.ui.OptionGroup;
/**
* 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 grid;
private Map<Object, VerticalLayout> detailsLayouts = new HashMap<>();
private OptionGroup detailsHeightSelector;
@Override
protected void setup(VaadinRequest request) {
grid = new Grid();
grid.addColumn("name", String.class);
grid.addColumn("born", Integer.class);
grid.addRow("Nicolaus Copernicus", 1543);
grid.addRow("Galileo Galilei", 1564);
for (int i = 0; i < 1; ++i) {
grid.addRow("Johannes Kepler", 1571);
}
grid.setDetailsGenerator(new DetailsGenerator() {
@Override
public Component getDetails(final RowReference rowReference) {
if (!detailsLayouts.containsKey(rowReference.getItemId())) {
createDetailsLayout(rowReference.getItemId());
}
return detailsLayouts.get(rowReference.getItemId());
}
});
grid.addItemClickListener(new ItemClickListener() {
@Override
public void itemClick(final ItemClickEvent event) {
final Object itemId = event.getItemId();
grid.setDetailsVisible(itemId, !grid.isDetailsVisible(itemId));
}
});
addComponent(createOptionLayout());
addComponent(grid);
}
private void createDetailsLayout(Object itemId) {
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(itemId, detailsLayout);
}
private Component createOptionLayout() {
HorizontalLayout optionLayout = new HorizontalLayout();
OptionGroup gridHeightSelector = new OptionGroup("Grid height",
Arrays.<Object> asList(gridHeights));
gridHeightSelector.setId("gridHeightSelector");
gridHeightSelector.setItemCaption(ROW3, ROW3 + " rows");
gridHeightSelector.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
Object value = event.getProperty().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);
OptionGroup gridWidthSelector = new OptionGroup("Grid width",
Arrays.asList(gridWidths));
gridWidthSelector.setId("gridWidthSelector");
gridWidthSelector.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
Object value = event.getProperty().getValue();
if (UNDEFINED.equals(value)) {
grid.setWidthUndefined();
} else if (FULL.equals(value)) {
grid.setWidth("100%");
}
}
});
gridWidthSelector.setValue(UNDEFINED);
optionLayout.addComponent(gridWidthSelector);
detailsHeightSelector = new OptionGroup("Details row height",
Arrays.asList(detailsRowHeights));
detailsHeightSelector.setId("detailsHeightSelector");
detailsHeightSelector.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
Object value = event.getProperty().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;
}
}