/******************************************************************************* * 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.assertFalse; import org.eclipse.nebula.widgets.nattable.test.fixture.layer.ViewportLayerFixture; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.ScrollBar; import org.junit.Before; import org.junit.Test; /** * Test for Horizontal scrolling of the viewport. * * The <code>DataLayerFixture</code> has the following config. Used by all * tests. The viewport is 200px wide. * * Col pos 0 1 2 3 4 ------ ---- - ---- --- Col width 150 100 35 100 80 */ public class HorizontalScrollBarHandlerTest { ViewportLayerFixture viewport; private ScrollBar scrollBar; private HorizontalScrollBarHandler scrollHandler; @Before public void init() { this.viewport = new ViewportLayerFixture(); this.scrollBar = ViewportLayerFixture.DEFAULT_SCROLLABLE.getHorizontalBar(); this.scrollHandler = new HorizontalScrollBarHandler(this.viewport, this.scrollBar); assertEquals(0, this.viewport.getColumnIndexByPosition(0)); assertEquals(1, this.viewport.getColumnIndexByPosition(1)); } private void scrollViewportByOffset(int offset) { this.scrollHandler.setViewportOrigin(this.viewport.getOrigin().getX() + offset); } private void scrollViewportToPixel(int x) { this.scrollHandler.setViewportOrigin(x); } @Test public void scrollViewportLeftByPage() throws Exception { this.viewport.moveColumnPositionIntoViewport(3); assertEquals(1, this.viewport.getColumnIndexByPosition(0)); this.viewport.moveColumnPositionIntoViewport(4); assertEquals(2, this.viewport.getColumnIndexByPosition(0)); } @Test public void scrollViewportLeftByOffset() throws Exception { // Origin adjusted this.viewport.setOriginX(this.viewport.getStartXOfColumnPosition(2)); scrollViewportByOffset(-1); assertEquals(1, this.viewport.getColumnIndexByPosition(0)); this.viewport.setOriginX(this.viewport.getStartXOfColumnPosition(1)); scrollViewportByOffset(-1); assertEquals(0, this.viewport.getColumnIndexByPosition(0)); } @Test public void scrollViewportRightByOffset() throws Exception { scrollViewportByOffset(200); assertEquals(1, this.viewport.getColumnIndexByPosition(0)); scrollViewportByOffset(200); assertEquals(2, this.viewport.getColumnIndexByPosition(0)); } @Test public void dragRight() throws Exception { scrollViewportToPixel(300); assertEquals(2, this.viewport.getColumnIndexByPosition(0)); assertEquals(3, this.viewport.getColumnIndexByPosition(1)); } @Test public void dragLeft() throws Exception { // Origin adjusted this.viewport.moveColumnPositionIntoViewport(3); assertEquals(1, this.viewport.getColumnIndexByPosition(0)); scrollViewportToPixel(50); assertEquals(0, this.viewport.getColumnIndexByPosition(0)); } /* * Test for issue reported in http://nattable.org/jira/browse/NTBL-99. * Resizing the last column to be larger than the width of a table and * scrolling to the right results in a all white background and no columns * * COLUMNS 0 1 |------|------| 250 250 */ @Test public void issueNTBL99MoveByColumn() throws Exception { this.viewport = new ViewportLayerFixture(2, 1, 250, 40); this.scrollHandler = new HorizontalScrollBarHandler(this.viewport, this.scrollBar); assertEquals(200, this.viewport.getClientAreaWidth()); assertEquals(1, this.viewport.getColumnCount()); assertEquals(0, this.viewport.getColumnIndexByPosition(0)); scrollViewportByOffset(200); assertEquals(0, this.viewport.getColumnIndexByPosition(0)); scrollViewportByOffset(200); assertEquals(1, this.viewport.getColumnIndexByPosition(0)); // No more scrolling scrollViewportByOffset(200); assertEquals(1, this.viewport.getColumnIndexByPosition(0)); } @Test public void issueNTBL99MoveByPage() throws Exception { this.viewport = new ViewportLayerFixture(2, 1, 250, 40); this.scrollHandler = new HorizontalScrollBarHandler(this.viewport, this.scrollBar); assertEquals(200, this.viewport.getClientAreaWidth()); assertEquals(1, this.viewport.getColumnCount()); assertEquals(0, this.viewport.getColumnIndexByPosition(0)); } @Test public void horizontalScrollbarThumbSize() throws Exception { this.viewport = new ViewportLayerFixture(new Rectangle(0, 0, 250, 100)); this.scrollHandler = new HorizontalScrollBarHandler(this.viewport, this.scrollBar); assertEquals(250, this.viewport.getWidth()); this.scrollHandler.recalculateScrollBarSize(); // Fixture data - viewport (250px), scrollable(465px) assertEquals(250, this.scrollHandler.scroller.getThumb()); this.viewport.moveColumnPositionIntoViewport(9); assertEquals(250, this.scrollHandler.scroller.getThumb()); } @Test public void horizontalScrollbarThumbSizeCalcNoScrollingNeeded() throws Exception { this.viewport = new ViewportLayerFixture(new Rectangle(0, 0, 500, 500)); this.scrollHandler = new HorizontalScrollBarHandler(this.viewport, this.scrollBar); this.scrollHandler.recalculateScrollBarSize(); assertEquals(465, this.viewport.getWidth()); assertEquals(465, this.scrollHandler.scroller.getThumb()); assertFalse(this.scrollBar.isEnabled()); assertFalse(this.scrollBar.isVisible()); } }