/******************************************************************************* * 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.lnf.renderer; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import org.eclipse.core.runtime.AssertionFailedException; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.riena.core.test.RienaTestCase; import org.eclipse.riena.core.test.collect.UITestCase; import org.eclipse.riena.core.util.ReflectionUtils; import org.eclipse.riena.navigation.model.NavigationProcessor; import org.eclipse.riena.navigation.model.SubModuleNode; import org.eclipse.riena.ui.core.marker.ErrorMarker; import org.eclipse.riena.ui.core.marker.IIconizableMarker; import org.eclipse.riena.ui.core.marker.MandatoryMarker; import org.eclipse.riena.ui.core.marker.NegativeMarker; import org.eclipse.riena.ui.swt.lnf.LnfKeyConstants; import org.eclipse.riena.ui.swt.lnf.LnfManager; import org.eclipse.riena.ui.swt.lnf.rienadefault.RienaDefaultLnf; import org.eclipse.riena.ui.swt.utils.SwtUtilities; /** * Tests of the class {@link SubModuleTreeItemMarkerRenderer}. */ @UITestCase public class SubModuleTreeItemMarkerRendererTest extends RienaTestCase { private Shell shell; private GC gc; private TreeItem item; private RienaDefaultLnf originalLnf; @Override protected void setUp() throws Exception { super.setUp(); shell = new Shell(); final Tree tree = new Tree(shell, SWT.NONE); item = new TreeItem(tree, SWT.NONE); gc = new GC(tree); originalLnf = LnfManager.getLnf(); LnfManager.setLnf(new MyLnf()); LnfManager.getLnf().initialize(); } @Override protected void tearDown() throws Exception { super.tearDown(); gc.dispose(); gc = null; SwtUtilities.dispose(shell); LnfManager.setLnf(originalLnf); } /** * Tests the method {@code paint}. */ public void testPaint() { final MockRenderer renderer = new MockRenderer(); renderer.setBounds(0, 0, 100, 100); try { renderer.paint(gc, null); fail("AssertionFailedException expected"); //$NON-NLS-1$ } catch (final AssertionFailedException e) { ok("AssertionFailedException expected"); //$NON-NLS-1$ } try { renderer.paint(gc, shell); fail("AssertionFailedException expected"); //$NON-NLS-1$ } catch (final AssertionFailedException e) { ok("AssertionFailedException expected"); //$NON-NLS-1$ } try { renderer.paint(null, item); fail("AssertionFailedException expected"); //$NON-NLS-1$ } catch (final AssertionFailedException e) { ok("AssertionFailedException expected"); //$NON-NLS-1$ } renderer.resetPaintMarkersCalled(); renderer.paint(gc, item); assertFalse(renderer.isPaintMarkersCalled()); final SubModuleNode node = new SubModuleNode(); node.setNavigationProcessor(new NavigationProcessor()); renderer.setMarkers(node.getMarkers()); renderer.resetPaintMarkersCalled(); renderer.paint(gc, item); assertFalse(renderer.isPaintMarkersCalled()); node.addMarker(new ErrorMarker()); renderer.setMarkers(node.getMarkers()); renderer.resetPaintMarkersCalled(); renderer.paint(gc, item); assertTrue(renderer.isPaintMarkersCalled()); node.removeAllMarkers(); node.addMarker(new NegativeMarker()); renderer.setMarkers(node.getMarkers()); renderer.resetPaintMarkersCalled(); renderer.paint(gc, item); assertFalse(renderer.isPaintMarkersCalled()); renderer.dispose(); } /** * Tests the method {@code paintMarkers}. * * @throws Exception */ public void testPaintMarkers() throws Exception { item.setImage(createItemImage()); final SubModuleTreeItemMarkerRenderer renderer = new SubModuleTreeItemMarkerRenderer(); renderer.setBounds(0, 0, 100, 25); // create image without markers final Collection<IIconizableMarker> markers = new ArrayList<IIconizableMarker>(); final byte[] noMarkersBytes = paintMarker(renderer, markers, item); // no marker -> no marker image is drawn byte[] paintBytes = paintMarker(renderer, markers, item); assertTrue(Arrays.equals(noMarkersBytes, paintBytes)); // one error marker -> error marker image is drawn markers.add(new ErrorMarker()); paintBytes = paintMarker(renderer, markers, item); assertFalse(Arrays.equals(noMarkersBytes, paintBytes)); // one error marker, but item has no image -> no marker image is drawn item.setImage((Image) null); paintBytes = paintMarker(renderer, markers, item); assertTrue(Arrays.equals(noMarkersBytes, paintBytes)); renderer.dispose(); } public void testPaintMarkersHierarchically() throws Exception { LnfManager.setLnf(new MyLnf() { @Override protected void initializeTheme() { super.initializeTheme(); putLnfSetting(LnfKeyConstants.SUB_MODULE_TREE_MARKER_HIERARCHIC_ORDER_POSITION, IIconizableMarker.MarkerPosition.BOTTOM_RIGHT); } }); item.setImage(createItemImage()); final SubModuleTreeItemMarkerRenderer renderer = new SubModuleTreeItemMarkerRenderer(); renderer.setBounds(0, 0, 100, 25); // create image without markers final Collection<IIconizableMarker> markers = new ArrayList<IIconizableMarker>(); final byte[] noMarkersBytes = paintMarker(renderer, markers, item); // one ErrorMarker -> ErrorMarker image is drawn markers.add(new ErrorMarker()); final byte[] errorMarkersBytes = paintMarker(renderer, markers, item); assertFalse(Arrays.equals(noMarkersBytes, errorMarkersBytes)); // one ErrorMarker and one MandatoryMarker -> only ErrorMarker image is drawn markers.add(new MandatoryMarker()); byte[] paintBytes = paintMarker(renderer, markers, item); assertTrue(Arrays.equals(errorMarkersBytes, paintBytes)); // remove ErrorMarker -> MandatoryMarker is drawn markers.clear(); markers.add(new MandatoryMarker()); paintBytes = paintMarker(renderer, markers, item); assertFalse(Arrays.equals(noMarkersBytes, paintBytes)); assertFalse(Arrays.equals(errorMarkersBytes, paintBytes)); // one MandatoryMarker, but item has no image -> no marker image is drawn item.setImage((Image) null); paintBytes = paintMarker(renderer, markers, item); assertTrue(Arrays.equals(noMarkersBytes, paintBytes)); renderer.dispose(); } /** * Paints a Collection of markers and returns the bytes written. */ private byte[] paintMarker(final SubModuleTreeItemMarkerRenderer renderer, final Collection<IIconizableMarker> markers, final TreeItem item) { final Image paintImage = new Image(shell.getDisplay(), new Rectangle(0, 0, 10, 10)); final GC paintGC = new GC(paintImage); ReflectionUtils.invokeHidden(renderer, "paintMarkers", paintGC, markers, item); //$NON-NLS-1$ final byte[] paintBytes = paintImage.getImageData().data; paintGC.dispose(); SwtUtilities.dispose(paintImage); return paintBytes; } /** * Tests the method {@code calcMarkerCoordinates}. */ public void testCalcMarkerCoordinates() { final SubModuleTreeItemMarkerRenderer renderer = new SubModuleTreeItemMarkerRenderer(); renderer.setBounds(2, 3, 100, 25); final Image itemImage = createItemImage(); final Image markerImage = createMarkerImage(); Point pos = ReflectionUtils.invokeHidden(renderer, "calcMarkerCoordinates", itemImage, markerImage, //$NON-NLS-1$ IIconizableMarker.MarkerPosition.TOP_LEFT); assertEquals(2 + 2, pos.x); assertEquals(3, pos.y); pos = ReflectionUtils.invokeHidden(renderer, "calcMarkerCoordinates", itemImage, markerImage, //$NON-NLS-1$ IIconizableMarker.MarkerPosition.TOP_RIGHT); assertEquals(2 + 2 + 5, pos.x); assertEquals(3, pos.y); pos = ReflectionUtils.invokeHidden(renderer, "calcMarkerCoordinates", itemImage, markerImage, //$NON-NLS-1$ IIconizableMarker.MarkerPosition.BOTTOM_LEFT); assertEquals(2 + 2, pos.x); assertEquals(3 + 5, pos.y); pos = ReflectionUtils.invokeHidden(renderer, "calcMarkerCoordinates", itemImage, markerImage, //$NON-NLS-1$ IIconizableMarker.MarkerPosition.BOTTOM_RIGHT); assertEquals(2 + 2 + 5, pos.x); assertEquals(3 + 5, pos.y); SwtUtilities.dispose(itemImage); SwtUtilities.dispose(markerImage); } /** * Creates a image with a small green rectangle. * * @return image */ private Image createItemImage() { final Image image = new Image(shell.getDisplay(), new Rectangle(0, 0, 10, 10)); final GC imageGC = new GC(image); imageGC.setForeground(LnfManager.getLnf().getColor("green")); //$NON-NLS-1$ imageGC.setBackground(LnfManager.getLnf().getColor("green")); //$NON-NLS-1$ imageGC.fillRectangle(0, 0, 5, 5); imageGC.dispose(); return image; } /** * Creates a image with a very small red rectangle. * * @return image */ private Image createMarkerImage() { final Image image = new Image(shell.getDisplay(), new Rectangle(0, 0, 5, 5)); final GC imageGC = new GC(image); imageGC.setForeground(LnfManager.getLnf().getColor("red")); //$NON-NLS-1$ imageGC.setBackground(LnfManager.getLnf().getColor("red")); //$NON-NLS-1$ imageGC.fillRectangle(0, 0, 3, 3); imageGC.dispose(); return image; } /** * Creates a image with a very small green rectangle. * * @return image */ private Image createMandatoraMarkerImage() { final Image image = new Image(shell.getDisplay(), new Rectangle(0, 0, 5, 5)); final GC imageGC = new GC(image); imageGC.setForeground(LnfManager.getLnf().getColor("green")); //$NON-NLS-1$ imageGC.setBackground(LnfManager.getLnf().getColor("green")); //$NON-NLS-1$ imageGC.fillRectangle(0, 0, 2, 2); imageGC.dispose(); return image; } /** * This Look and Feel returns always the same image. */ private class MyLnf extends RienaDefaultLnf { private final Image errorImage; private final Image mandatoryImage; public MyLnf() { super(); errorImage = createMarkerImage(); mandatoryImage = createMandatoraMarkerImage(); } @Override public Image getImage(final String key) { if (key.equals("ErrorMarker")) { //$NON-NLS-1$ return errorImage; } else { return mandatoryImage; } } } private static class MockRenderer extends SubModuleTreeItemMarkerRenderer { private boolean paintMarkersCalled; public MockRenderer() { resetPaintMarkersCalled(); } public boolean isPaintMarkersCalled() { return paintMarkersCalled; } public void resetPaintMarkersCalled() { this.paintMarkersCalled = false; } /** * @see org.eclipse.riena.navigation.ui.swt.lnf.renderer.SubModuleTreeItemMarkerRenderer#paintMarkers(org.eclipse.swt.graphics.GC, java.util.Collection, * org.eclipse.swt.widgets.TreeItem) */ @Override protected void paintMarkers(final GC gc, final Collection<IIconizableMarker> markers, final TreeItem item) { super.paintMarkers(gc, markers, item); this.paintMarkersCalled = true; } } }