blob: f2ff980ba75ade5eb9325d778fa10f7ac707850a [file] [log] [blame]
/*******************************************************************************
* 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));
}
}