/*******************************************************************************
* Copyright (c) 2012, 2016 Original authors and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Original authors and others - initial API and implementation
******************************************************************************/
package org.eclipse.nebula.widgets.nattable.group;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.eclipse.nebula.widgets.nattable.grid.GridRegion;
import org.eclipse.nebula.widgets.nattable.grid.command.ClientAreaResizeCommand;
import org.eclipse.nebula.widgets.nattable.grid.layer.DefaultGridLayer;
import org.eclipse.nebula.widgets.nattable.group.config.DefaultColumnGroupHeaderLayerConfiguration;
import org.eclipse.nebula.widgets.nattable.hideshow.command.ColumnHideCommand;
import org.eclipse.nebula.widgets.nattable.layer.LabelStack;
import org.eclipse.nebula.widgets.nattable.layer.cell.IConfigLabelAccumulator;
import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
import org.eclipse.nebula.widgets.nattable.test.fixture.layer.GridLayerFixture;
import org.eclipse.nebula.widgets.nattable.util.IClientAreaProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.junit.Before;
import org.junit.Test;
public class ColumnGroupHeaderLayerTest {
public static final String TEST_GROUP_NAME_3 = "testGroupName3";
public static final String TEST_GROUP_NAME_2 = "testGroupName2";
public static final String TEST_GROUP_NAME_1 = "testGroupName";
public static final String NO_GROUP_NAME = "";
public ColumnGroupHeaderLayer columnGroupLayer;
private ColumnGroupModel model;
private DefaultGridLayer gridLayer;
@Before
public void setup() {
this.gridLayer = new GridLayerFixture();
this.model = new ColumnGroupModel();
// 10 columns in header
this.columnGroupLayer = new ColumnGroupHeaderLayer(
this.gridLayer.getColumnHeaderLayer(),
this.gridLayer.getBodyLayer().getSelectionLayer(),
this.model);
this.columnGroupLayer.addColumnsIndexesToGroup(TEST_GROUP_NAME_1, 0, 1);
this.columnGroupLayer.addColumnsIndexesToGroup(TEST_GROUP_NAME_2, 5, 6);
this.columnGroupLayer.addColumnsIndexesToGroup(TEST_GROUP_NAME_3, 8, 9);
this.gridLayer.setClientAreaProvider(new IClientAreaProvider() {
@Override
public Rectangle getClientArea() {
return new Rectangle(0, 0, 1050, 250);
}
});
this.gridLayer.doCommand(
new ClientAreaResizeCommand(new Shell(Display.getDefault(), SWT.V_SCROLL | SWT.H_SCROLL)));
}
@Test
public void getCellForACellInAColumnGroup() {
ILayerCell cell = this.columnGroupLayer.getCellByPosition(0, 0);
assertEquals(TEST_GROUP_NAME_1, cell.getDataValue());
assertEquals(0, cell.getBounds().x);
assertEquals(0, cell.getBounds().y);
assertEquals(200, cell.getBounds().width);
assertEquals(20, cell.getBounds().height);
cell = this.columnGroupLayer.getCellByPosition(1, 0);
assertEquals(TEST_GROUP_NAME_1, cell.getDataValue());
assertEquals(0, cell.getBounds().x);
assertEquals(0, cell.getBounds().y);
assertEquals(200, cell.getBounds().width);
assertEquals(20, cell.getBounds().height);
}
@Test
public void aCollapsedColumnGroupShouldNotBeSpanned() {
assertEquals(2, this.columnGroupLayer.getCellByPosition(0, 0).getColumnSpan());
this.columnGroupLayer.setGroupAsCollapsed(0);
assertEquals(1, this.columnGroupLayer.getCellByPosition(0, 0).getColumnSpan());
}
@Test
public void getCellForACellNotInAColumnGroup() {
ILayerCell cell = this.columnGroupLayer.getCellByPosition(5, 0);
assertEquals(500, cell.getBounds().x);
assertEquals(0, cell.getBounds().y);
assertEquals(200, cell.getBounds().width);
assertEquals(20, cell.getBounds().height);
}
@Test
public void getDataValueByPosition() {
String dataValueGroup1 = (String) this.columnGroupLayer.getDataValueByPosition(1, 0);
String dataValue = (String) this.columnGroupLayer.getDataValueByPosition(2, 0);
assertEquals(TEST_GROUP_NAME_1, dataValueGroup1);
assertEquals("[2,0]", dataValue); // Regular header
}
@Test
public void getColumnWidthByPosition() {
// Col 0,1 are in group 150 + 100
assertEquals(100, this.columnGroupLayer.getColumnWidthByPosition(0));
assertEquals(100, this.columnGroupLayer.getColumnWidthByPosition(1));
}
@Test
public void getColumnWidthWhenNoColumnGroupsPresent() {
this.columnGroupLayer.clearAllGroups();
// Width of the vsible columns - see fixture
assertEquals(1000, this.columnGroupLayer.getWidth());
}
@Test
public void getColumnWidthByPositionForAColumnOutsideTheViewport() {
// Returns default column width from DataLayer
assertEquals(100, this.columnGroupLayer.getColumnWidthByPosition(100));
}
@Test
public void getCellSpan() {
// Index in group: 5, 6, 7
this.model.addColumnsIndexesToGroup(TEST_GROUP_NAME_2, 7);
assertEquals(3, this.columnGroupLayer.getColumnSpan(5));
this.model.getColumnGroupByIndex(5).setCollapsed(true);
assertEquals(1, this.columnGroupLayer.getColumnSpan(5));
}
@Test
public void getCellSpanWhenColumnsInGroupAreHidden() {
// Index in group: 5, 6, 7
this.model.addColumnsIndexesToGroup(TEST_GROUP_NAME_2, 7);
assertEquals(3, this.columnGroupLayer.getColumnSpan(5));
// Hide position 6
ColumnHideCommand hideColumnCommand = new ColumnHideCommand(this.gridLayer.getBodyLayer(), 6);
this.gridLayer.getBodyLayer().getColumnHideShowLayer().doCommand(hideColumnCommand);
assertEquals(2, this.columnGroupLayer.getColumnSpan(5));
// Hide position 5
hideColumnCommand = new ColumnHideCommand(this.gridLayer.getBodyLayer(), 6);
this.gridLayer.getBodyLayer().getColumnHideShowLayer().doCommand(hideColumnCommand);
assertEquals(1, this.columnGroupLayer.getColumnSpan(5));
}
@Test
public void testConfigLabels() {
// check expanded column group
LabelStack stack = this.columnGroupLayer.getConfigLabelsByPosition(0, 0);
assertEquals(2, stack.getLabels().size());
assertTrue(stack.hasLabel(GridRegion.COLUMN_GROUP_HEADER));
assertTrue(stack.hasLabel(DefaultColumnGroupHeaderLayerConfiguration.GROUP_EXPANDED_CONFIG_TYPE));
// check collapsed column group
this.model.getColumnGroupByIndex(0).setCollapsed(true);
stack = this.columnGroupLayer.getConfigLabelsByPosition(0, 0);
assertEquals(2, stack.getLabels().size());
assertTrue(stack.hasLabel(GridRegion.COLUMN_GROUP_HEADER));
assertTrue(stack.hasLabel(DefaultColumnGroupHeaderLayerConfiguration.GROUP_COLLAPSED_CONFIG_TYPE));
// check ungrouped
stack = this.columnGroupLayer.getConfigLabelsByPosition(3, 0);
assertEquals(0, stack.getLabels().size());
}
@Test
public void testConfigLabelsWithAccumulator() {
// set config label accumulator
this.columnGroupLayer.setConfigLabelAccumulator(new IConfigLabelAccumulator() {
@Override
public void accumulateConfigLabels(LabelStack configLabels, int columnPosition, int rowPosition) {
if (columnPosition == 0 || columnPosition == 3) {
configLabels.addLabel("custom");
}
}
});
// check expanded column group
LabelStack stack = this.columnGroupLayer.getConfigLabelsByPosition(0, 0);
assertEquals(3, stack.getLabels().size());
assertTrue(stack.hasLabel(GridRegion.COLUMN_GROUP_HEADER));
assertTrue(stack.hasLabel("custom"));
assertTrue(stack.hasLabel(DefaultColumnGroupHeaderLayerConfiguration.GROUP_EXPANDED_CONFIG_TYPE));
// check collapsed column group
this.model.getColumnGroupByIndex(0).setCollapsed(true);
stack = this.columnGroupLayer.getConfigLabelsByPosition(0, 0);
assertEquals(3, stack.getLabels().size());
assertTrue(stack.hasLabel(GridRegion.COLUMN_GROUP_HEADER));
assertTrue(stack.hasLabel("custom"));
assertTrue(stack.hasLabel(DefaultColumnGroupHeaderLayerConfiguration.GROUP_COLLAPSED_CONFIG_TYPE));
// check ungrouped
stack = this.columnGroupLayer.getConfigLabelsByPosition(3, 0);
assertEquals(0, stack.getLabels().size());
}
@Test
public void testRowHeightByPosition() {
this.columnGroupLayer.clearAllGroups();
this.columnGroupLayer.setRowHeight(100);
// Height of the header column row - see fixture
assertEquals(120, this.columnGroupLayer.getHeight());
assertEquals(2, this.columnGroupLayer.getRowCount());
assertEquals(100, this.columnGroupLayer.getRowHeightByPosition(0));
assertEquals(20, this.columnGroupLayer.getRowHeightByPosition(1));
// Test calculated height
this.columnGroupLayer.setCalculateHeight(true);
assertEquals(20, this.columnGroupLayer.getHeight());
assertEquals(1, this.columnGroupLayer.getRowCount());
assertEquals(20, this.columnGroupLayer.getRowHeightByPosition(0));
}
}