/*******************************************************************************
* Copyright (c) 2007, 2014 compeople AG 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:
* compeople AG - initial API and implementation
*******************************************************************************/
package org.eclipse.riena.navigation.ui.swt.views;
import junit.framework.TestCase;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.riena.core.test.collect.UITestCase;
import org.eclipse.riena.core.util.ReflectionUtils;
import org.eclipse.riena.navigation.IModuleGroupNode;
import org.eclipse.riena.navigation.IModuleNode;
import org.eclipse.riena.navigation.ISubApplicationNode;
import org.eclipse.riena.navigation.ISubModuleNode;
import org.eclipse.riena.navigation.model.ApplicationNode;
import org.eclipse.riena.navigation.model.ModuleGroupNode;
import org.eclipse.riena.navigation.model.ModuleNode;
import org.eclipse.riena.navigation.model.SubApplicationNode;
import org.eclipse.riena.navigation.model.SubModuleNode;
import org.eclipse.riena.ui.swt.utils.SwtUtilities;
/**
* Tests of the class {@link ScrollBarSupport}.
*/
@UITestCase
public class ScrollBarSupportTest extends TestCase {
private Display display;
private Shell shell;
private ScrolledComposite scrolledComposite;
private Composite content;
@Override
protected void setUp() throws Exception {
super.setUp();
shell = new Shell(SWT.SYSTEM_MODAL | SWT.ON_TOP);
GridLayoutFactory.fillDefaults().spacing(0, 0).applyTo(shell);
scrolledComposite = new ScrolledComposite(shell, SWT.VERTICAL | SWT.BORDER);
scrolledComposite.setExpandHorizontal(true);
scrolledComposite.setExpandVertical(true);
scrolledComposite.setShowFocusedControl(false);
content = new Composite(scrolledComposite, SWT.NONE);
scrolledComposite.setContent(content);
GridDataFactory.fillDefaults().hint(30, 60).applyTo(scrolledComposite);
display = shell.getDisplay();
}
@Override
protected void tearDown() throws Exception {
SwtUtilities.dispose(shell);
super.tearDown();
}
/**
* Tests the <i>protected</i> method {@code scrollUp(int)}.
*/
public void testScrollUp() {
final ScrollBarSupport support = new ScrollBarSupport(scrolledComposite, new MockModuleNavigationComponentProvider());
Point origin = scrolledComposite.getOrigin();
assertEquals(0, origin.x);
assertEquals(0, origin.y);
ReflectionUtils.invokeHidden(support, "scrollDown", 30); //$NON-NLS-1$
origin = scrolledComposite.getOrigin();
assertEquals(0, origin.x);
assertEquals(30, origin.y);
ReflectionUtils.invokeHidden(support, "scrollUp", 20); //$NON-NLS-1$
origin = scrolledComposite.getOrigin();
assertEquals(0, origin.x);
assertEquals(10, origin.y);
ReflectionUtils.invokeHidden(support, "scrollUp", 20); //$NON-NLS-1$
origin = scrolledComposite.getOrigin();
assertEquals(0, origin.x);
assertEquals(0, origin.y);
}
/**
* Tests the <i>protected</i> method {@code scrollDown(int)}.
*/
public void testScrollDonw() {
final ScrollBarSupport support = new ScrollBarSupport(scrolledComposite, new MockModuleNavigationComponentProvider());
Point origin = scrolledComposite.getOrigin();
assertEquals(0, origin.x);
assertEquals(0, origin.y);
ReflectionUtils.invokeHidden(support, "scrollDown", 30); //$NON-NLS-1$
origin = scrolledComposite.getOrigin();
assertEquals(0, origin.x);
assertEquals(30, origin.y);
ReflectionUtils.invokeHidden(support, "scrollDown", 20); //$NON-NLS-1$
origin = scrolledComposite.getOrigin();
assertEquals(0, origin.x);
assertEquals(50, origin.y);
ReflectionUtils.invokeHidden(support, "scrollDown", 20); //$NON-NLS-1$
origin = scrolledComposite.getOrigin();
assertEquals(0, origin.x);
assertEquals(70, origin.y);
}
/**
* Tests the <i>private</i> method {@code getScrollPixels(Composite,Composite)}.
*/
public void testGetScrollPixels() {
final ScrollBarSupport support = new ScrollBarSupport(scrolledComposite, new MockModuleNavigationComponentProvider());
scrolledComposite.setMinSize(30, 80);
GridLayoutFactory.fillDefaults().spacing(0, 0).applyTo(content);
final Composite one = new Composite(content, SWT.NONE);
Color bgColor = display.getSystemColor(SWT.COLOR_BLUE);
one.setBackground(bgColor);
GridDataFactory.fillDefaults().hint(20, 20).applyTo(one);
final Composite two = new Composite(content, SWT.NONE);
bgColor = display.getSystemColor(SWT.COLOR_GREEN);
two.setBackground(bgColor);
GridDataFactory.fillDefaults().hint(20, 20).applyTo(two);
final Composite three = new Composite(content, SWT.NONE);
bgColor = display.getSystemColor(SWT.COLOR_YELLOW);
three.setBackground(bgColor);
GridDataFactory.fillDefaults().hint(20, 20).applyTo(three);
final Composite four = new Composite(content, SWT.NONE);
bgColor = display.getSystemColor(SWT.COLOR_RED);
four.setBackground(bgColor);
GridDataFactory.fillDefaults().hint(20, 20).applyTo(four);
shell.setLocation(0, 0);
shell.pack();
shell.open();
scrolledComposite.setOrigin(0, 0);
int pixels = ReflectionUtils.invokeHidden(support, "getScrollPixels", one, two); //$NON-NLS-1$
assertEquals(0, pixels);
pixels = ReflectionUtils.invokeHidden(support, "getScrollPixels", three, four); //$NON-NLS-1$
assertEquals(20, pixels);
scrolledComposite.setOrigin(0, 10);
pixels = ReflectionUtils.invokeHidden(support, "getScrollPixels", one, two); //$NON-NLS-1$
assertEquals(-10, pixels);
}
/**
* Tests the <i>private</i> method {@code getScrollPixels(Tree)}.
*/
public void testGetScrollPixelsTree() {
final ScrollBarSupport support = new ScrollBarSupport(scrolledComposite, new MockModuleNavigationComponentProvider());
GridDataFactory.fillDefaults().hint(75, 60).applyTo(scrolledComposite);
scrolledComposite.setMinSize(30, 80);
GridLayoutFactory.fillDefaults().spacing(0, 0).applyTo(content);
final Tree tree = new Tree(content, SWT.NONE);
GridLayoutFactory.fillDefaults().spacing(0, 0).margins(0, 0).applyTo(tree);
final TreeItem item00 = new TreeItem(tree, SWT.NONE);
item00.setText("one"); //$NON-NLS-1$
final TreeItem item01 = new TreeItem(tree, SWT.NONE);
item01.setText("two"); //$NON-NLS-1$
final TreeItem item02 = new TreeItem(tree, SWT.NONE);
item02.setText("three"); //$NON-NLS-1$
final TreeItem item03 = new TreeItem(tree, SWT.NONE);
item03.setText("four"); //$NON-NLS-1$
final TreeItem item04 = new TreeItem(tree, SWT.NONE);
item04.setText("five"); //$NON-NLS-1$
final TreeItem item05 = new TreeItem(tree, SWT.NONE);
item05.setText("six"); //$NON-NLS-1$
shell.setLocation(0, 0);
shell.pack();
shell.open();
final int itemHeight = item00.getBounds().height;
final int clientHeight = scrolledComposite.getClientArea().height;
scrolledComposite.setOrigin(0, 0);
tree.setSelection(item00);
int pixels = ReflectionUtils.invokeHidden(support, "getScrollPixels", tree); //$NON-NLS-1$
assertEquals(0, pixels);
tree.setSelection(item01);
pixels = ReflectionUtils.invokeHidden(support, "getScrollPixels", tree); //$NON-NLS-1$
assertEquals(0, pixels);
tree.setSelection(item02);
pixels = ReflectionUtils.invokeHidden(support, "getScrollPixels", tree); //$NON-NLS-1$
assertEquals(0, pixels);
tree.setSelection(item03);
pixels = ReflectionUtils.invokeHidden(support, "getScrollPixels", tree); //$NON-NLS-1$
final int expectedPixels = (itemHeight * 4) - clientHeight;
assertEquals(expectedPixels, pixels);
}
/**
* Tests the <i>private</i> method {@code getActiveModule(INavigationNode<?>)}.
*/
public void testGetActiveModule() {
final ScrollBarSupport support = new ScrollBarSupport(scrolledComposite, new MockModuleNavigationComponentProvider());
IModuleNode module = ReflectionUtils.invokeHidden(support, "getActiveModule", new ApplicationNode()); //$NON-NLS-1$
assertNull(module);
module = ReflectionUtils.invokeHidden(support, "getActiveModule", new SubApplicationNode()); //$NON-NLS-1$
assertNull(module);
module = ReflectionUtils.invokeHidden(support, "getActiveModule", new ModuleGroupNode()); //$NON-NLS-1$
assertNull(module);
final IModuleNode module0 = new ModuleNode("node0"); //$NON-NLS-1$
module = ReflectionUtils.invokeHidden(support, "getActiveModule", module0); //$NON-NLS-1$
assertSame(module, module0);
final ISubModuleNode subModule1 = new SubModuleNode("node1"); //$NON-NLS-1$
module = ReflectionUtils.invokeHidden(support, "getActiveModule", subModule1); //$NON-NLS-1$
assertNull(module);
subModule1.setParent(module0);
module = ReflectionUtils.invokeHidden(support, "getActiveModule", subModule1); //$NON-NLS-1$
assertSame(module, module0);
final ISubModuleNode subModule2 = new SubModuleNode("node2"); //$NON-NLS-1$
subModule2.setParent(subModule1);
module = ReflectionUtils.invokeHidden(support, "getActiveModule", subModule2); //$NON-NLS-1$
assertSame(module, module0);
}
private class MockModuleNavigationComponentProvider implements IModuleNavigationComponentProvider {
public Composite getNavigationComponent() {
return shell;
}
public Composite getScrolledComponent() {
return null;
}
public int calculateHeight() {
return 0;
}
public ModuleGroupView getModuleGroupViewForNode(final IModuleGroupNode moduleGroupNode) {
return null;
}
public ModuleView getModuleViewForNode(final IModuleNode moduleGroupNode) {
return null;
}
public IModuleGroupNode getActiveModuleGroupNode() {
return null;
}
public ISubApplicationNode getSubApplicationNode() {
return null;
}
}
}