/******************************************************************************
 * Copyright (c) 2008, 2008 IBM Corporation 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:
 *    IBM Corporation - initial API and implementation 
 ****************************************************************************/

package org.eclipse.gmf.tests.runtime.diagram.ui.logic;

import junit.framework.Test;
import junit.framework.TestSuite;

import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.gmf.runtime.diagram.ui.actions.internal.TextAlignmentAction;
import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeEditPart;
import org.eclipse.gmf.runtime.diagram.ui.geoshapes.type.GeoshapeType;
import org.eclipse.gmf.runtime.diagram.ui.internal.properties.Properties;
import org.eclipse.gmf.runtime.diagram.ui.type.DiagramNotationType;
import org.eclipse.gmf.runtime.emf.core.util.PackageUtil;
import org.eclipse.gmf.runtime.notation.TextAlignment;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.gmf.tests.runtime.diagram.ui.AbstractTestBase;
import org.eclipse.gmf.tests.runtime.diagram.ui.util.ITestActionCallback;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;

/**
 * Tests for the text alignment feature.
 * 
 * @author Anthony Hunter
 */
public class TextAlignmentTests extends AbstractTestBase {

	public static Test suite() {
		TestSuite s = new TestSuite(TextAlignmentTests.class);
		return s;
	}

	public TextAlignmentTests() {
		super("Group Tests");//$NON-NLS-1$
	}

	public class TextAlignmentTestFixture extends LogicTestFixture {

		public void setup() throws Exception {
			closeWelcome();
			super.setup();
		}

		public void closeWelcome() {
			IWorkbench workbench = PlatformUI.getWorkbench();
			if (workbench != null) {
				IWorkbenchWindow workbenchWindow = workbench
						.getActiveWorkbenchWindow();
				if (workbenchWindow != null) {
					IWorkbenchPage workbenchPage = workbenchWindow
							.getActivePage();
					if (workbenchPage != null) {
						IWorkbenchPart workbenchPart = workbenchPage
								.getActivePart();
						if (workbenchPart != null) {
							IWorkbenchPartSite workbenchPartSite = workbenchPart
									.getSite();
							if (workbenchPartSite != null) {
								if (workbenchPartSite.getId().equals(
										"org.eclipse.ui.internal.introview")) { //$NON-NLS-1$
									IViewPart welcomeView = (IViewPart) workbenchPart;
									workbenchPage.hideView(welcomeView);

								}
							}
						}
					}
				}
			}
		}

		protected void createShapesAndConnectors() throws Exception {
			/**
			 * Override so that the test creates the shapes it wants
			 */
		}
	}

	protected void setTestFixture() {
		testFixture = new TextAlignmentTestFixture();
	}

	protected LogicTestFixture getFixture() {
		return (LogicTestFixture) testFixture;
	}

	protected void setUp() throws Exception {
		super.setUp();
	}

	/** the note edit part */
	protected ShapeEditPart noteEditPart;

	/** the square edit part */
	protected ShapeEditPart squareEditPart;

	/** the note shape */
	protected View noteView;

	/** the square shape */
	protected View squareView;

	/**
	 * Create the four shapes to be used to test grouping.
	 */
	protected void setupShapes() {

		final String description = "Text align this text\nThe quick brown fox\njumps over\nthe lazy\ndog"; //$NON-NLS-1$

		/* create a square geoshape */
		squareEditPart = getFixture().createShapeUsingTool(
				GeoshapeType.RECTANGLE, new Point(10, 10),
				new Dimension(-1, -1), getDiagramEditPart());

		squareView = (View) squareEditPart.getModel();

		/* set the description (text) for the square geoshape */
		testProperty(squareView, Properties.ID_DESCRIPTION, description);

		/* create a note */
		noteEditPart = getFixture().createShapeUsingTool(
				DiagramNotationType.NOTE, new Point(200, 200),
				new Dimension(-1, -1), getDiagramEditPart());

		noteView = (View) noteEditPart.getModel();
		
		/* set the description (text) for the note */
		testProperty(noteView, Properties.ID_DESCRIPTION, description);

		flushEventQueue();

	}

	public void testSetTextAlignmentCenterAction() throws Exception {
		setupShapes();

		getDiagramEditPart().getViewer().setSelection(
				new StructuredSelection(squareEditPart));

		TextAlignmentAction action = TextAlignmentAction
				.createTextAlignmentCenterAction(getWorkbenchPage());
		testAction(action, new ITestActionCallback() {

			public void onRunExecution() {

				assertEquals(
						TextAlignment.CENTER_LITERAL,
						squareEditPart
								.getStructuralFeatureValue((EStructuralFeature) PackageUtil
										.getElement(Properties.ID_TEXT_ALIGNMENT)));

			}
		});
		
		getCommandStack().undo();
		
		assertEquals(
				TextAlignment.LEFT_LITERAL,
				squareEditPart
						.getStructuralFeatureValue((EStructuralFeature) PackageUtil
								.getElement(Properties.ID_TEXT_ALIGNMENT)));
		
	}

	public void testSetTextAlignmentRightAction() throws Exception {
		setupShapes();

		getDiagramEditPart().getViewer().setSelection(
				new StructuredSelection(noteEditPart));

		TextAlignmentAction action = TextAlignmentAction
				.createTextAlignmentRightAction(getWorkbenchPage());
		testAction(action, new ITestActionCallback() {

			public void onRunExecution() {

				assertEquals(
						TextAlignment.RIGHT_LITERAL,
						noteEditPart
								.getStructuralFeatureValue((EStructuralFeature) PackageUtil
										.getElement(Properties.ID_TEXT_ALIGNMENT)));

			}
		});
		
		getCommandStack().undo();
		
		assertEquals(
				TextAlignment.LEFT_LITERAL,
				noteEditPart
						.getStructuralFeatureValue((EStructuralFeature) PackageUtil
								.getElement(Properties.ID_TEXT_ALIGNMENT)));
		
	}

	public void testSetTextAlignmentProperty() throws Exception {

		setupShapes();

		testProperty(squareView, Properties.ID_TEXT_ALIGNMENT,
				TextAlignment.RIGHT_LITERAL);

		testProperty(squareView, Properties.ID_TEXT_ALIGNMENT,
				TextAlignment.CENTER_LITERAL);

		testProperty(squareView, Properties.ID_TEXT_ALIGNMENT,
				TextAlignment.LEFT_LITERAL);

		testProperty(noteView, Properties.ID_TEXT_ALIGNMENT,
				TextAlignment.RIGHT_LITERAL);

		testProperty(noteView, Properties.ID_TEXT_ALIGNMENT,
				TextAlignment.CENTER_LITERAL);

		testProperty(noteView, Properties.ID_TEXT_ALIGNMENT,
				TextAlignment.LEFT_LITERAL);
	}

}
