/*******************************************************************************
 * Copyright (c) 2004 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.ui.tests.commands;

import java.util.Map;

import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.commands.AbstractHandler;
import org.eclipse.ui.commands.ExecutionException;
import org.eclipse.ui.commands.HandlerSubmission;
import org.eclipse.ui.commands.ICommand;
import org.eclipse.ui.commands.IHandler;
import org.eclipse.ui.commands.IWorkbenchCommandSupport;
import org.eclipse.ui.commands.Priority;
import org.eclipse.ui.tests.harness.util.UITestCase;

/**
 * A test for whether part identifiers work properly for HandlerSubmissions.
 * 
 * @since 3.1
 */
public final class Bug74990Test extends UITestCase {

	/**
	 * Constructs a new instance of <code>Bug74990Test</code>.
	 * 
	 * @param name
	 *            The name of the test
	 */
	public Bug74990Test(final String name) {
		super(name);
	}

	/**
	 * Tests whether a part-specific handler -- submitted via Java code -- is
	 * matched properly. This is only using the part id. The test verifies that
	 * it is active when the part is active, and not active when the part is not
	 * active.
	 * 
	 * @throws PartInitException
	 *             If something goes wrong creating the part to which this
	 *             handler is tied.
	 * 
	 */
	public final void testPartIdSubmission() throws PartInitException {
		// Define a command.
		final String testCommandId = "org.eclipse.ui.tests.commands.Bug74990";
		final IWorkbenchCommandSupport commandSupport = fWorkbench
				.getCommandSupport();
		final ICommand testCommand = commandSupport.getCommandManager()
				.getCommand(testCommandId);

		// Create a handler submission.
		final IHandler handler = new AbstractHandler() {
			public final Object execute(final Map parameterValuesByName)
					throws ExecutionException {
				// Do nothing.
				return null;
			}
		};
		final HandlerSubmission testSubmission = new HandlerSubmission(
				"org.eclipse.ui.tests.api.MockViewPart", null, null,
				testCommandId, handler, Priority.MEDIUM);
		commandSupport.addHandlerSubmission(testSubmission);

		try {
			// Test to make sure the command is not currently handled.
			assertTrue("The MockViewPart command should not be handled",
					!testCommand.isHandled());

			/*
			 * Open a window with the MockViewPart, and make sure it is now
			 * handled.
			 */
			final IWorkbenchPage page = openTestWindow().getActivePage();
			final IViewPart openedView = page
					.showView("org.eclipse.ui.tests.api.MockViewPart");
			page.activate(openedView);
			while (fWorkbench.getDisplay().readAndDispatch()) {
				// Read the event queue
			}
			assertTrue("The MockViewPart command should be handled",
					testCommand.isHandled());

			// Hide the view, and test that is becomes unhandled again.
			page.hideView(openedView);
			while (fWorkbench.getDisplay().readAndDispatch()) {
				// Read the event queue
			}
			assertTrue("The MockViewPart command should not be handled",
					!testCommand.isHandled());

		} finally {
			commandSupport.removeHandlerSubmission(testSubmission);
		}

	}
}
