/*******************************************************************************
 * Copyright (c) 2000, 2006 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.multipageeditor;

import java.io.ByteArrayInputStream;
import java.util.Collection;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.viewers.IPostSelectionProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.contexts.IContextService;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.tests.harness.util.UITestCase;

/**
 * <p>
 * Test that the MultiPageEditorPart is acting on events and changes. These
 * tests are for making sure that selection events and page change events are
 * handled.
 * </p>
 * <p>
 * It also checks for changing Contexts.
 * </p>
 * 
 * @since 3.2
 */
public class MultiVariablePageTest extends UITestCase {

	private static final String FILE_CONTENTS = "#section01\nsection 1\n#section02\nsection 2\nwith info\n#section03\nLast page\n";

	private static final String MTEST01_FILE = "mtest01.multivar";

	private static final String MULTI_VARIABLE_PROJ = "MultiVariableTest";

	private int fPostCalled;

	public MultiVariablePageTest(String testName) {
		super(testName);
	}

	/**
	 * Make sure that setting the active page programmatically calls
	 * pageChanged(int) on the way. This method is overridden in a lot of
	 * editors to provide their functionality on page changes.
	 * 
	 * @throws Throwable
	 */
	public void testSetActivePage() throws Throwable {
		// Open a new test window.
		// Create and open a blurb file.
		IEditorPart part = openMultivarFile();

		MultiVariablePageEditor editor = (MultiVariablePageEditor) part;

		editor.setPage(1);
		ISelection selection = editor.getEditorSite().getSelectionProvider()
				.getSelection();
		TextSelection text = (TextSelection) selection;
		// when we change to the second page, the selection should be
		// updated.
		assertEquals("#section02", text.getText());

		editor.setPage(0);
		selection = editor.getEditorSite().getSelectionProvider()
				.getSelection();
		text = (TextSelection) selection;
		// when we change back to the first page, the selection should be
		// updated.
		assertEquals("#section01", text.getText());
	}

	/**
	 * Make sure that removing a page that is a Control (instead of an editor)
	 * disposes of the Control immediately.
	 * 
	 * @throws Throwable
	 */
	public void testRemovePage() throws Throwable {
		// Open a new test window.
		// Create and open a blurb file.
		IEditorPart part = openMultivarFile();

		MultiVariablePageEditor editor = (MultiVariablePageEditor) part;
		editor.addLastPage();
		Control c = editor.getLastPage();
		assertFalse(c.isDisposed());
		editor.removeLastPage();
		assertTrue(c.isDisposed());

		c = editor.getTestControl(2);
		assertFalse(c.isDisposed());
		editor.removeLastPage();
		assertTrue(c.isDisposed());
		editor.setPage(0);
		editor.getSite().getPage().activate(editor);
	}

	/**
	 * Now the MPEP site's selection provider should by default support post
	 * selection listeners. Since the MVPE is based on Text editors, we should
	 * be getting the post selection events when we change pages.
	 * 
	 * @throws Throwable
	 *             on error cases
	 */
	public void testPostSelection() throws Throwable {
		// Open a new test window.
		// Create and open a blurb file.
		IEditorPart part = openMultivarFile();

		MultiVariablePageEditor editor = (MultiVariablePageEditor) part;
		ISelectionProvider sp = editor.getEditorSite().getSelectionProvider();
		assertTrue(sp instanceof IPostSelectionProvider);

		IPostSelectionProvider postProvider = (IPostSelectionProvider) sp;

		fPostCalled = 0;
		ISelectionChangedListener listener = new ISelectionChangedListener() {
			public void selectionChanged(SelectionChangedEvent event) {
				++fPostCalled;
			}
		};

		try {
			postProvider.addPostSelectionChangedListener(listener);
			editor.setPage(1);
			assertEquals(1, fPostCalled);
			editor.setPage(0);
			assertEquals(2, fPostCalled);
		} finally {
			postProvider.removePostSelectionChangedListener(listener);
		}
	}

	private IEditorPart openMultivarFile() throws CoreException,
			PartInitException {
		IWorkbenchPage page = openTestWindow().getActivePage();
		IWorkspace workspace = ResourcesPlugin.getWorkspace();
		IProject testProject = workspace.getRoot().getProject(
				MULTI_VARIABLE_PROJ);
		if (!testProject.exists()) {
			testProject.create(null);
		}
		testProject.open(null);
		IFile multiFile = testProject.getFile(MTEST01_FILE);
		if (!multiFile.exists()) {
			multiFile.create(
					new ByteArrayInputStream(FILE_CONTENTS.getBytes()), true,
					null);
		}

		// I can't be bothered to use the ID, but this editor has an
		// extention registered against it.
		IEditorPart part = IDE.openEditor(page, multiFile);
		assertTrue("Should have opened our multi variable page editor",
				part instanceof MultiVariablePageEditor);
		return part;
	}

	/**
	 * Make sure that contexts are activated-deactivated by pages changes and
	 * other editors.
	 * 
	 * @throws Throwable
	 *             on error
	 */
	public void testContextActivation() throws Throwable {
		IContextService globalService = (IContextService) getWorkbench()
				.getService(IContextService.class);

		// Open a new test window.
		// Create and open a blurb file.
		IEditorPart part = openMultivarFile();

		MultiVariablePageEditor editor = (MultiVariablePageEditor) part;
		checkActiveContext(globalService, ContextTextEditor.CONTEXT_ID, false);
		checkActiveContext(globalService, ContextTextEditor.TEXT_CONTEXT_ID,
				true);

		editor.setPage(1);
		checkActiveContext(globalService, ContextTextEditor.CONTEXT_ID, false);
		checkActiveContext(globalService, ContextTextEditor.TEXT_CONTEXT_ID,
				true);

		editor.setPage(2);
		checkActiveContext(globalService, ContextTextEditor.CONTEXT_ID, true);
		checkActiveContext(globalService, ContextTextEditor.TEXT_CONTEXT_ID,
				true);

		editor.setPage(1);
		checkActiveContext(globalService, ContextTextEditor.CONTEXT_ID, false);
		checkActiveContext(globalService, ContextTextEditor.TEXT_CONTEXT_ID,
				true);

		editor.setPage(2);
		checkActiveContext(globalService, ContextTextEditor.CONTEXT_ID, true);
		editor.removeLastPage();
		checkActiveContext(globalService, ContextTextEditor.CONTEXT_ID, false);
		checkActiveContext(globalService, ContextTextEditor.TEXT_CONTEXT_ID,
				true);
	}

	/**
	 * Assert if the contextId is active in the contextService.
	 * 
	 * @param contextService
	 * @param contextId
	 * @param isActive
	 */
	private void checkActiveContext(IContextService contextService,
			String contextId, boolean isActive) {
		Collection activeContexts = contextService.getActiveContextIds();
		assertEquals(contextId, isActive, activeContexts.contains(contextId));
	}
}
