/*******************************************************************************
* Copyright (c) 2012, 2013 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.viewport;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.eclipse.nebula.widgets.nattable.layer.event.ILayerEvent;
import org.eclipse.nebula.widgets.nattable.layer.event.IVisualChangeEvent;
import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer.MoveDirectionEnum;
import org.eclipse.nebula.widgets.nattable.selection.command.MoveSelectionCommand;
import org.eclipse.nebula.widgets.nattable.selection.command.ScrollSelectionCommand;
import org.eclipse.nebula.widgets.nattable.test.fixture.command.ScrollSelectionCommandFixture;
import org.eclipse.nebula.widgets.nattable.test.fixture.layer.DataLayerFixture;
import org.eclipse.nebula.widgets.nattable.test.fixture.layer.LayerListenerFixture;
import org.eclipse.nebula.widgets.nattable.test.fixture.layer.ViewportLayerFixture;
import org.eclipse.nebula.widgets.nattable.util.IClientAreaProvider;
import org.eclipse.swt.graphics.Rectangle;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class ViewportLayerTest {
protected ViewportLayer viewportLayer;
protected LayerListenerFixture layerListener;
@Before
public void setup() {
this.viewportLayer = new ViewportLayerFixture();
this.layerListener = new LayerListenerFixture();
}
@After
public void resertStaticFieldsInViewportFixture() {
this.viewportLayer.getClientAreaProvider().getClientArea().x = 0;
this.viewportLayer.getClientAreaProvider().getClientArea().y = 0;
this.viewportLayer.getClientAreaProvider().getClientArea().width = 200;
this.viewportLayer.getClientAreaProvider().getClientArea().height = 100;
}
@Test
public void testMoveColumnPositionIntoViewportSimpleCase() {
this.viewportLayer = new ViewportLayerFixture();
assertEquals(0, this.viewportLayer.getColumnIndexByPosition(0));
assertEquals(1, this.viewportLayer.getColumnIndexByPosition(1));
assertEquals(2, this.viewportLayer.getColumnIndexByPosition(2));
this.viewportLayer.moveColumnPositionIntoViewport(3);
assertEquals(1, this.viewportLayer.getColumnIndexByPosition(0));
assertEquals(2, this.viewportLayer.getColumnIndexByPosition(1));
assertEquals(3, this.viewportLayer.getColumnIndexByPosition(2));
this.viewportLayer.moveColumnPositionIntoViewport(0);
assertEquals(0, this.viewportLayer.getColumnIndexByPosition(0));
}
@Test
public void testMoveColumnPositionIntoViewportForAColumnAlreadyInTheViewport() {
this.viewportLayer = new ViewportLayerFixture(new Rectangle(0, 0, 285, 100));
this.viewportLayer.moveColumnPositionIntoViewport(2);
assertEquals(0, this.viewportLayer.getColumnIndexByPosition(0));
assertEquals(1, this.viewportLayer.getColumnIndexByPosition(1));
assertEquals(2, this.viewportLayer.getColumnIndexByPosition(2));
}
/**
* 0 1 2 3 4 5 6 7 8 9 |----|----|----|----|----|----|----|----|----|----|
*/
@Test
public void moveColumnIntoViewportByMovingLeftAndRight() throws Exception {
// width of each column = 80
// total width = 800
// client area width = 200 = 80 + 80 + 40
this.viewportLayer = new ViewportLayerFixture(10, 5, 80, 40);
assertEquals(200, this.viewportLayer.getClientAreaWidth());
assertEquals(3, this.viewportLayer.getColumnCount());
this.viewportLayer.setOriginX(600);
assertEquals(3, this.viewportLayer.getColumnCount());
assertEquals(200, this.viewportLayer.getWidth());
assertEquals(7, this.viewportLayer.getColumnIndexByPosition(0));
// Keep moving left by 1 col
this.viewportLayer.moveColumnPositionIntoViewport(9);
assertEquals(7, this.viewportLayer.getColumnIndexByPosition(0));
this.viewportLayer.moveColumnPositionIntoViewport(8);
assertEquals(7, this.viewportLayer.getColumnIndexByPosition(0));
this.viewportLayer.moveColumnPositionIntoViewport(7);
assertEquals(7, this.viewportLayer.getColumnIndexByPosition(0));
this.viewportLayer.moveColumnPositionIntoViewport(6);
assertEquals(6, this.viewportLayer.getColumnIndexByPosition(0));
this.viewportLayer.moveColumnPositionIntoViewport(5);
assertEquals(5, this.viewportLayer.getColumnIndexByPosition(0));
// Move right
this.viewportLayer.moveColumnPositionIntoViewport(7); // partially
// displayed
assertEquals(5, this.viewportLayer.getColumnIndexByPosition(0));
this.viewportLayer.moveColumnPositionIntoViewport(8);
assertEquals(6, this.viewportLayer.getColumnIndexByPosition(0));
}
/**
* Rows 0 1 2 3 4 |----|----|----|----|----|
*/
@Test
public void moveRowIntoViewportByMovingUpAndDown() throws Exception {
this.viewportLayer = new ViewportLayerFixture(10, 5, 80, 80);
assertEquals(100, this.viewportLayer.getClientAreaHeight());
assertEquals(3, this.viewportLayer.getColumnCount());
this.viewportLayer.setOriginY(this.viewportLayer.getStartYOfRowPosition(3));
assertEquals(3, this.viewportLayer.getRowIndexByPosition(0));
// Keep moving up by 1 row
this.viewportLayer.moveRowPositionIntoViewport(2);
assertEquals(2, this.viewportLayer.getRowIndexByPosition(0));
this.viewportLayer.moveRowPositionIntoViewport(1);
assertEquals(1, this.viewportLayer.getRowIndexByPosition(0));
// Move down
this.viewportLayer.moveRowPositionIntoViewport(3);
assertEquals(2, this.viewportLayer.getRowIndexByPosition(0)); // partially
// visible
assertEquals(3, this.viewportLayer.getRowIndexByPosition(1));
assertEquals(4, this.viewportLayer.getRowIndexByPosition(2));
}
@Test
public void moveIntoViewportForAColPartiallyDisplayedAtTheRightEdge()
throws Exception {
this.viewportLayer = new ViewportLayerFixture(new Rectangle(0, 0, 260, 100));
assertEquals(0, this.viewportLayer.getColumnIndexByPosition(0));
assertEquals(1, this.viewportLayer.getColumnIndexByPosition(1));
assertEquals(2, this.viewportLayer.getColumnIndexByPosition(2)); // Partially
// visible
this.viewportLayer.moveColumnPositionIntoViewport(2);
assertEquals(0, this.viewportLayer.getColumnIndexByPosition(0)); // no
// movement
assertEquals(1, this.viewportLayer.getColumnIndexByPosition(1));
assertEquals(2, this.viewportLayer.getColumnIndexByPosition(2));
}
@Test
public void getColumnIndexByPositionForAColumnOusideTheViewport() {
assertEquals(2, this.viewportLayer.getColumnCount());
// Does not check bounds. They get restricted by the column count.
// Done for performance reasons
assertEquals(3, this.viewportLayer.getColumnIndexByPosition(3));
assertEquals(4, this.viewportLayer.getColumnIndexByPosition(4));
}
/**
* 0 1 2 3 4 5 6 7 8 9 |----|----|----|----|----|----|----|----|----|----|
*/
@Test
public void getColumnIndexByPosition() {
this.viewportLayer = new ViewportLayerFixture(10, 5, 80, 40);
assertEquals(3, this.viewportLayer.getColumnCount());
assertEquals(0, this.viewportLayer.getColumnIndexByPosition(0));
assertEquals(1, this.viewportLayer.getColumnIndexByPosition(1));
assertEquals(2, this.viewportLayer.getColumnIndexByPosition(2));
this.viewportLayer.setOriginX(this.viewportLayer.getStartXOfColumnPosition(3));
assertEquals(3, this.viewportLayer.getColumnIndexByPosition(0));
assertEquals(4, this.viewportLayer.getColumnIndexByPosition(1));
assertEquals(5, this.viewportLayer.getColumnIndexByPosition(2));
}
@Test
public void testMoveRowPositionIntoViewport() {
this.viewportLayer.moveRowPositionIntoViewport(3);
assertEquals(1, this.viewportLayer.getRowIndexByPosition(0));
this.viewportLayer.moveRowPositionIntoViewport(0);
assertEquals(0, this.viewportLayer.getRowIndexByPosition(0));
}
@Test
public void testMoveCellPositionIntoViewport() {
this.viewportLayer.moveCellPositionIntoViewport(3, 3);
assertEquals(1, this.viewportLayer.getColumnIndexByPosition(0));
assertEquals(1, this.viewportLayer.getRowIndexByPosition(0));
this.viewportLayer.moveCellPositionIntoViewport(2, 0);
assertEquals(1, this.viewportLayer.getColumnIndexByPosition(0));
assertEquals(0, this.viewportLayer.getRowIndexByPosition(0));
this.viewportLayer.moveCellPositionIntoViewport(0, 3);
assertEquals(0, this.viewportLayer.getColumnIndexByPosition(0));
assertEquals(1, this.viewportLayer.getRowIndexByPosition(0));
this.viewportLayer.moveCellPositionIntoViewport(0, 0);
assertEquals(0, this.viewportLayer.getColumnIndexByPosition(0));
assertEquals(0, this.viewportLayer.getRowIndexByPosition(0));
}
@Test
public void getColumnCount() throws Exception {
assertEquals(2, this.viewportLayer.getColumnCount());
}
/**
* Width is calculated by adding of widths of all visible columns
*/
@Test
public void getWidth() throws Exception {
assertEquals(200, this.viewportLayer.getClientAreaWidth());
assertEquals(2, this.viewportLayer.getColumnCount());
assertEquals(200, this.viewportLayer.getWidth());
this.viewportLayer.setOriginX(this.viewportLayer.getStartXOfColumnPosition(2));
assertEquals(200, this.viewportLayer.getClientAreaWidth());
assertEquals(3, this.viewportLayer.getColumnCount());
assertEquals(200, this.viewportLayer.getWidth());
}
/**
* Height is calculated by adding of heights of all visible columns
*/
@Test
public void getHeight() throws Exception {
assertEquals(100, this.viewportLayer.getClientAreaHeight());
assertEquals(2, this.viewportLayer.getRowCount());
assertEquals(100, this.viewportLayer.getHeight());
this.viewportLayer.setOriginY(this.viewportLayer.getStartYOfRowPosition(3));
assertEquals(100, this.viewportLayer.getClientAreaHeight());
assertEquals(3, this.viewportLayer.getRowCount());
assertEquals(100, this.viewportLayer.getHeight());
}
/**
* Scrolling Events fired when origin changes
*/
@Test
public void testMoveColumnPositionIntoViewportFiresEvent() throws Exception {
this.viewportLayer.addLayerListener(this.layerListener);
this.viewportLayer.moveColumnPositionIntoViewport(4);
ILayerEvent event = this.layerListener.getReceivedEvents().get(0);
assertTrue(event instanceof IVisualChangeEvent);
}
@Test
public void setViewportOriginColumnPosition() throws Exception {
// Position count starts from 0
this.viewportLayer.setOriginX(this.viewportLayer.getStartXOfColumnPosition(2));
assertEquals(2, this.viewportLayer.getColumnIndexByPosition(0));
}
@Test
public void settingViewportColumnOriginFiresEvent() throws Exception {
this.viewportLayer.addLayerListener(this.layerListener);
this.viewportLayer.setOriginX(this.viewportLayer.getStartXOfColumnPosition(2));
ILayerEvent event = this.layerListener.getReceivedEvents().get(0);
assertTrue(event instanceof IVisualChangeEvent);
}
@Test
public void setViewportMinOriginColumnPosition() throws Exception {
this.viewportLayer = new ViewportLayerFixture(10, 20, 50, 20);
this.viewportLayer.setMinimumOriginX(100);
assertEquals(2, this.viewportLayer.getMinimumOriginColumnPosition());
assertEquals(100, this.viewportLayer.getOrigin().getX());
assertEquals(2, this.viewportLayer.getColumnIndexByPosition(0));
assertEquals(4, this.viewportLayer.getColumnCount());
this.viewportLayer.setMinimumOriginX(200);
assertEquals(4, this.viewportLayer.getMinimumOriginColumnPosition());
assertEquals(200, this.viewportLayer.getOrigin().getX());
assertEquals(4, this.viewportLayer.getColumnIndexByPosition(0));
assertEquals(4, this.viewportLayer.getColumnCount());
this.viewportLayer.setMinimumOriginX(100);
assertEquals(2, this.viewportLayer.getMinimumOriginColumnPosition());
assertEquals(100, this.viewportLayer.getOrigin().getX());
this.viewportLayer.setOriginX(150);
this.viewportLayer.setMinimumOriginX(200);
assertEquals(4, this.viewportLayer.getMinimumOriginColumnPosition());
assertEquals(250, this.viewportLayer.getOrigin().getX());
this.viewportLayer.setMinimumOriginX(100);
assertEquals(2, this.viewportLayer.getMinimumOriginColumnPosition());
assertEquals(150, this.viewportLayer.getOrigin().getX());
this.viewportLayer.setMinimumOriginX(450);
assertEquals(9, this.viewportLayer.getMinimumOriginColumnPosition());
assertEquals(450, this.viewportLayer.getOrigin().getX());
assertEquals(9, this.viewportLayer.getColumnIndexByPosition(0));
assertEquals(1, this.viewportLayer.getColumnCount());
this.viewportLayer.setMinimumOriginX(500);
assertEquals(-1, this.viewportLayer.getMinimumOriginColumnPosition());
assertEquals(500, this.viewportLayer.getOrigin().getX());
assertEquals(-1, this.viewportLayer.getColumnIndexByPosition(0));
assertEquals(0, this.viewportLayer.getColumnCount());
}
@Test
public void setViewportOriginRowPosition() throws Exception {
// Position count starts from 0
this.viewportLayer.setOriginY(this.viewportLayer.getStartYOfRowPosition(4));
assertEquals(4, this.viewportLayer.getRowIndexByPosition(0));
}
@Test
public void settingViewportRowOriginFireEvent() throws Exception {
this.viewportLayer.addLayerListener(this.layerListener);
this.viewportLayer.setOriginY(this.viewportLayer.getStartYOfRowPosition(1));
assertEquals(1, this.viewportLayer.getRowIndexByPosition(0));
ILayerEvent event = this.layerListener.getReceivedEvents().get(0);
assertTrue(event instanceof IVisualChangeEvent);
}
@Test
public void setViewportMinOriginRowPosition() throws Exception {
this.viewportLayer = new ViewportLayerFixture(10, 20, 50, 20);
this.viewportLayer.setMinimumOriginY(40);
assertEquals(2, this.viewportLayer.getMinimumOriginRowPosition());
assertEquals(40, this.viewportLayer.getOrigin().getY());
assertEquals(2, this.viewportLayer.getRowIndexByPosition(0));
assertEquals(5, this.viewportLayer.getRowCount());
this.viewportLayer.setMinimumOriginY(80);
assertEquals(4, this.viewportLayer.getMinimumOriginRowPosition());
assertEquals(80, this.viewportLayer.getOrigin().getY());
assertEquals(4, this.viewportLayer.getRowIndexByPosition(0));
assertEquals(5, this.viewportLayer.getRowCount());
this.viewportLayer.setMinimumOriginY(40);
assertEquals(2, this.viewportLayer.getMinimumOriginRowPosition());
assertEquals(40, this.viewportLayer.getOrigin().getY());
this.viewportLayer.setOriginY(60);
this.viewportLayer.setMinimumOriginY(80);
assertEquals(4, this.viewportLayer.getMinimumOriginRowPosition());
assertEquals(100, this.viewportLayer.getOrigin().getY());
this.viewportLayer.setMinimumOriginY(40);
assertEquals(2, this.viewportLayer.getMinimumOriginRowPosition());
assertEquals(60, this.viewportLayer.getOrigin().getY());
this.viewportLayer.setMinimumOriginY(380);
assertEquals(19, this.viewportLayer.getMinimumOriginRowPosition());
assertEquals(380, this.viewportLayer.getOrigin().getY());
assertEquals(19, this.viewportLayer.getRowIndexByPosition(0));
assertEquals(1, this.viewportLayer.getRowCount());
this.viewportLayer.setMinimumOriginY(400);
assertEquals(-1, this.viewportLayer.getMinimumOriginRowPosition());
assertEquals(400, this.viewportLayer.getOrigin().getY());
assertEquals(-1, this.viewportLayer.getRowIndexByPosition(0));
assertEquals(0, this.viewportLayer.getRowCount());
}
@Test
public void scrollVerticallyByAPageCommand() throws Exception {
ScrollSelectionCommand scrollCommand = new ScrollSelectionCommandFixture();
MoveSelectionCommand command = new MoveSelectionCommand(
scrollCommand.getDirection(), this.viewportLayer.getRowCount(),
scrollCommand.isShiftMask(), scrollCommand.isControlMask());
assertEquals(MoveDirectionEnum.DOWN, command.getDirection());
assertEquals(2, command.getStepSize().intValue());
}
@Test
public void adjustRowOrigin() throws Exception {
this.viewportLayer = new ViewportLayerFixture(10, 20, 100, 20);
// Default client area: width 200, height 100
assertEquals(5, this.viewportLayer.getRowCount());
assertEquals(200, this.viewportLayer.getStartYOfRowPosition(10));
assertEquals(200, this.viewportLayer.adjustOriginY(this.viewportLayer
.getStartYOfRowPosition(10)));
// Increase view port height
this.viewportLayer.getClientAreaProvider().getClientArea().height = 400;
assertEquals(0, this.viewportLayer.adjustOriginY(this.viewportLayer
.getStartYOfRowPosition(10)));
}
@Test
public void adjustColOrigin() throws Exception {
this.viewportLayer = new ViewportLayerFixture(10, 20, 50, 20);
// Default client area: width 200, height 100
assertEquals(4, this.viewportLayer.getColumnCount());
this.viewportLayer.setOriginX(this.viewportLayer.getStartXOfColumnPosition(4));
assertEquals(4, this.viewportLayer.getColumnIndexByPosition(0));
assertEquals(200, this.viewportLayer.getStartXOfColumnPosition(4));
assertEquals(200, this.viewportLayer.adjustOriginX(this.viewportLayer
.getStartXOfColumnPosition(4)));
// Try to scroll off the end
this.viewportLayer.setOriginX(this.viewportLayer.getStartXOfColumnPosition(9));
assertEquals(6, this.viewportLayer.getColumnIndexByPosition(0));
assertEquals(450, this.viewportLayer.getStartXOfColumnPosition(9));
assertEquals(300, this.viewportLayer.adjustOriginX(this.viewportLayer
.getStartXOfColumnPosition(9)));
// Increase viewport width
this.viewportLayer.getClientAreaProvider().getClientArea().width = 500;
assertEquals(450, this.viewportLayer.getStartXOfColumnPosition(9));
assertEquals(0, this.viewportLayer.adjustOriginX(this.viewportLayer
.getStartXOfColumnPosition(9)));
}
@Test
public void shouldPickUpTheDefaultClientAreaIfItHasNotBeenSet()
throws Exception {
ViewportLayer viewportLayer = new ViewportLayer(new DataLayerFixture());
assertEquals(IClientAreaProvider.DEFAULT,
viewportLayer.getClientAreaProvider());
}
}