/*******************************************************************************
 * Copyright (c) 2011 Fabian Steeg. 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
 * <p/>
 * Contributors: Fabian Steeg - initial tests
 *******************************************************************************/
package org.eclipse.zest.tests;

import org.eclipse.draw2d.BorderLayout;
import org.eclipse.draw2d.Ellipse;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.zest.core.viewers.GraphViewer;
import org.eclipse.zest.core.viewers.IFigureProvider;
import org.eclipse.zest.core.viewers.IGraphContentProvider;
import org.eclipse.zest.core.widgets.CGraphNode;

/**
 * Tests for the {@link IFigureProvider} class.
 * 
 * @author Fabian Steeg (fsteeg)
 * 
 */
public class IFigureProviderTests extends AbstractFixtureTestCase {

	private GraphViewer viewer;
	private Shell shell;

	/**
	 * Set up the shell and viewer to use in the tests.
	 * 
	 * @throws Exception
	 * 
	 * @see junit.framework.TestCase#setUp()
	 */
	public void setUp() throws Exception {
		super.setUp();
		shell = new Shell();
		viewer = new GraphViewer(shell, SWT.NONE);
	}

	/**
	 * Test with IGraphContentProvider that provides destinations only.
	 */
	public void testWithDestinationProvider() {
		testWith(new DestinationContentProvider());
	}

	/**
	 * Test with IGraphContentProvider that provides sources only.
	 */
	public void testWithSourceProvider() {
		testWith(new SourceContentProvider());
	}

	/**
	 * Test with IGraphContentProvider that provides destinations and sources.
	 */
	public void testWithFullProvider() {
		testWith(new FullContentProvider());
	}

	private void testWith(IGraphContentProvider contentProvider) {
		viewer.setContentProvider(contentProvider);
		viewer.setLabelProvider(new CustomLabelProvider());
		viewer.setInput(new Object());
		StringBuffer buffer = new StringBuffer();
		for (int i = 0; i < viewer.getGraphControl().getNodes().size(); i++) {
			CGraphNode n = (CGraphNode) viewer.getGraphControl().getNodes()
					.get(i);
			buffer.append(((Label) n.getNodeFigure().getChildren().get(0))
					.getText());
		}
		String string = buffer.toString();
		assertTrue("Label 1 should be in figure labels",
				string.indexOf("1") >= 0);
		assertTrue("Label 2 should be in figure labels",
				string.indexOf("2") >= 0);
		assertTrue("Label 3 should be in figure labels",
				string.indexOf("3") >= 0);
	}

	private class DestinationContentProvider implements IGraphContentProvider {

		public void dispose() {
		}

		public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
		}

		public Object getDestination(Object r) {
			if (r.equals("1to2"))
				return "2";
			if (r.equals("2to3"))
				return "3";
			if (r.equals("3to1"))
				return "1";
			return null;
		}

		public Object[] getElements(Object arg0) {
			return new String[] { "1to2", "2to3", "3to1" };
		}

		public Object getSource(Object r) {
			return null;
		}

	}

	private class SourceContentProvider implements IGraphContentProvider {

		public void dispose() {
		}

		public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
		}

		public Object getDestination(Object r) {
			return null;
		}

		public Object[] getElements(Object arg0) {
			return new String[] { "1to2", "2to3", "3to1" };
		}

		public Object getSource(Object r) {
			if (r.equals("1to2"))
				return "1";
			if (r.equals("2to3"))
				return "2";
			if (r.equals("3to1"))
				return "3";
			return null;
		}

	}

	private class FullContentProvider implements IGraphContentProvider {

		public void dispose() {
		}

		public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
		}

		public Object getDestination(Object r) {
			if (r.equals("1to2"))
				return "2";
			if (r.equals("2to3"))
				return "3";
			if (r.equals("3to1"))
				return "1";
			return null;
		}

		public Object[] getElements(Object arg0) {
			return new String[] { "1to2", "2to3", "3to1" };
		}

		public Object getSource(Object r) {
			if (r.equals("1to2"))
				return "1";
			if (r.equals("2to3"))
				return "2";
			if (r.equals("3to1"))
				return "3";
			return null;
		}

	}

	private class CustomLabelProvider extends LabelProvider implements
			IFigureProvider {
		public String getText(Object node) {
			return node.toString();
		}

		public IFigure getFigure(Object node) {
			Ellipse e = new Ellipse();
			e.setSize(40, 40);
			e.setLayoutManager(new BorderLayout());
			e.add(new Label(node.toString()), BorderLayout.CENTER);
			return e;
		}
	}

}
