blob: 66f66ff0d9dfbdf9811e999d8906f2d22f9c95a2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 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.api;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.internal.PartSite;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.tests.harness.util.CallHistory;
import org.eclipse.ui.tests.harness.util.EmptyPerspective;
import org.eclipse.ui.tests.harness.util.FileUtil;
import org.eclipse.ui.tests.harness.util.UITestCase;
/**
* Tests the IPartService, IPartListener and IPartListener2 interfaces.
*/
public class IPartServiceTest extends UITestCase {
private IWorkbenchWindow fWindow;
private IWorkbenchPage fPage;
// Event state.
private IWorkbenchPart eventPart;
private IWorkbenchPartReference eventPartRef;
class TestPartListener implements IPartListener {
public void partActivated(IWorkbenchPart part) {
history.add("partActivated");
eventPart = part;
}
public void partBroughtToTop(IWorkbenchPart part) {
history.add("partBroughtToTop");
eventPart = part;
}
public void partClosed(IWorkbenchPart part) {
history.add("partClosed");
eventPart = part;
}
public void partDeactivated(IWorkbenchPart part) {
history.add("partDeactivated");
eventPart = part;
}
public void partOpened(IWorkbenchPart part) {
history.add("partOpened");
eventPart = part;
}
}
class TestPartListener2 implements IPartListener2 {
public void partActivated(IWorkbenchPartReference ref) {
history2.add("partActivated");
eventPartRef = ref;
}
public void partBroughtToTop(IWorkbenchPartReference ref) {
history2.add("partBroughtToTop");
eventPartRef = ref;
}
public void partClosed(IWorkbenchPartReference ref) {
history2.add("partClosed");
eventPartRef = ref;
}
public void partDeactivated(IWorkbenchPartReference ref) {
history2.add("partDeactivated");
eventPartRef = ref;
}
public void partOpened(IWorkbenchPartReference ref) {
history2.add("partOpened");
eventPartRef = ref;
}
public void partHidden(IWorkbenchPartReference ref) {
history2.add("partHidden");
eventPartRef = ref;
}
public void partVisible(IWorkbenchPartReference ref) {
history2.add("partVisible");
eventPartRef = ref;
}
public void partInputChanged(IWorkbenchPartReference ref) {
history2.add("partInputChanged");
eventPartRef = ref;
}
}
private IPartListener partListener = new TestPartListener();
private IPartListener2 partListener2 = new TestPartListener2();
private CallHistory history = new CallHistory(partListener);
private CallHistory history2 = new CallHistory(partListener2);
public IPartServiceTest(String testName) {
super(testName);
}
/**
* Clear the event state.
*/
private void clearEventState() {
eventPart = null;
eventPartRef = null;
history.clear();
history2.clear();
}
protected void doSetUp() throws Exception {
super.doSetUp();
fWindow = openTestWindow();
fPage = fWindow.getActivePage();
}
private IWorkbenchPartReference getRef(IWorkbenchPart part) {
return ((PartSite) part.getSite()).getPartReference();
}
/**
* Tests the addPartListener method on IWorkbenchPage's part service.
*/
public void testAddPartListenerToPage() throws Throwable {
// From Javadoc: "Adds the given listener for part lifecycle events.
// Has no effect if an identical listener is already registered."
fPage.addPartListener(partListener);
fPage.addPartListener(partListener2);
// Open a view.
// Verify events are received.
clearEventState();
MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
assertTrue(history.verifyOrder(new String[] { "partOpened",
"partActivated" }));
assertEquals(view, eventPart);
assertTrue(history2.verifyOrder(new String[] { "partOpened",
"partVisible", "partActivated" }));
assertEquals(getRef(view), eventPartRef);
// Hide the view
// Verify events are received.
clearEventState();
fPage.hideView(view);
assertTrue(history.verifyOrder(new String[] { "partDeactivated",
"partClosed" }));
assertEquals(view, eventPart);
assertTrue(history2.verifyOrder(new String[] { "partDeactivated",
"partHidden", "partClosed" }));
assertEquals(getRef(view), eventPartRef);
fPage.removePartListener(partListener);
fPage.removePartListener(partListener2);
}
/**
* Tests the addPartListener method on IWorkbenchWindow's part service.
*/
public void testAddPartListenerToWindow() throws Throwable {
// From Javadoc: "Adds the given listener for part lifecycle events.
// Has no effect if an identical listener is already registered."
fWindow.getPartService().addPartListener(partListener);
fWindow.getPartService().addPartListener(partListener2);
// Open a view.
// Verify events are received.
clearEventState();
MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
assertTrue(history.verifyOrder(new String[] { "partOpened",
"partActivated" }));
assertEquals(view, eventPart);
assertTrue(history2.verifyOrder(new String[] { "partOpened",
"partVisible", "partActivated" }));
assertEquals(getRef(view), eventPartRef);
// Hide the view
// Verify events are received.
clearEventState();
fPage.hideView(view);
assertTrue(history.verifyOrder(new String[] { "partDeactivated",
"partClosed" }));
assertEquals(view, eventPart);
assertTrue(history2.verifyOrder(new String[] { "partDeactivated",
"partHidden", "partClosed" }));
assertEquals(getRef(view), eventPartRef);
fPage.removePartListener(partListener);
fPage.removePartListener(partListener2);
}
/**
* Tests the removePartListener method on IWorkbenchPage's part service.
*/
public void testRemovePartListenerFromPage() throws Throwable {
// From Javadoc: "Removes the given part listener.
// Has no affect if an identical listener is not registered."
// Add and remove listener.
fPage.addPartListener(partListener);
fPage.addPartListener(partListener2);
fPage.removePartListener(partListener);
fPage.removePartListener(partListener2);
// Open a view.
// Verify no events are received.
clearEventState();
fPage.showView(MockViewPart.ID);
assertTrue(history.isEmpty());
assertTrue(history2.isEmpty());
}
/**
* Tests the removePartListener method on IWorkbenchWindow's part service.
*/
public void testRemovePartListenerFromWindow() throws Throwable {
// From Javadoc: "Removes the given part listener.
// Has no affect if an identical listener is not registered."
// Add and remove listener.
fWindow.getPartService().addPartListener(partListener);
fWindow.getPartService().addPartListener(partListener2);
fWindow.getPartService().removePartListener(partListener);
fWindow.getPartService().removePartListener(partListener2);
// Open a view.
// Verify no events are received.
clearEventState();
fPage.showView(MockViewPart.ID);
assertTrue(history.isEmpty());
assertTrue(history2.isEmpty());
}
/**
* Tests the partHidden method by closing a view when it is not shared with another perspective.
* Includes regression test for:
* Bug 60039 [ViewMgmt] (regression) IWorkbenchPage#findView returns non-null value after part has been closed
*/
public void testPartHiddenWhenClosedAndUnshared() throws Throwable {
IPartListener2 listener = new TestPartListener2() {
public void partHidden(IWorkbenchPartReference ref) {
super.partHidden(ref);
// ensure that the notification is for the view we closed
assertEquals(MockViewPart.ID, ref.getId());
// ensure that the view cannot be found
assertNull(fPage.findView(MockViewPart.ID));
}
};
MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
fPage.addPartListener(listener);
clearEventState();
fPage.hideView(view);
assertTrue(history2.contains("partHidden"));
assertEquals(getRef(view), eventPartRef);
fPage.removePartListener(listener);
}
/**
* Tests the partHidden method by closing a view when it is shared with another perspective.
* Includes regression test for:
* Bug 60039 [ViewMgmt] (regression) IWorkbenchPage#findView returns non-null value after part has been closed
*/
public void testPartHiddenWhenClosedAndShared() throws Throwable {
IPartListener2 listener = new TestPartListener2() {
public void partHidden(IWorkbenchPartReference ref) {
super.partHidden(ref);
// ensure that the notification is for the view we closed
assertEquals(MockViewPart.ID, ref.getId());
// ensure that the view cannot be found
assertNull(fPage.findView(MockViewPart.ID));
}
};
MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
IPerspectiveDescriptor emptyPerspDesc2 = fWindow.getWorkbench()
.getPerspectiveRegistry().findPerspectiveWithId(
EmptyPerspective.PERSP_ID2);
fPage.setPerspective(emptyPerspDesc2);
MockViewPart view2 = (MockViewPart) fPage.showView(MockViewPart.ID);
assertTrue(view == view2);
fPage.addPartListener(listener);
clearEventState();
fPage.hideView(view);
assertTrue(history2.contains("partHidden"));
assertEquals(getRef(view), eventPartRef);
fPage.removePartListener(listener);
}
/**
* Tests the partHidden method by activating another view in the same folder.
*/
public void testPartHiddenWhenObscured() throws Throwable {
final boolean[] eventReceived = { false };
IPartListener2 listener = new TestPartListener2() {
public void partHidden(IWorkbenchPartReference ref) {
super.partHidden(ref);
// ensure that the notification is for the view that was obscured
assertEquals(MockViewPart.ID, ref.getId());
// ensure that the view can still be found
assertNotNull(fPage.findView(MockViewPart.ID));
eventReceived[0] = true;
}
};
MockViewPart view2 = (MockViewPart) fPage.showView(MockViewPart.ID2);
MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
assertEquals(view, fPage.getActivePart());
fPage.addPartListener(listener);
clearEventState();
fPage.activate(view2);
fPage.removePartListener(listener);
assertTrue(eventReceived[0]);
}
/**
* Tests the partVisible method by showing a view when it is not
* open in any other perspectives.
*/
public void testPartVisibleWhenOpenedUnshared() throws Throwable {
final boolean[] eventReceived = { false };
IPartListener2 listener = new TestPartListener2() {
public void partVisible(IWorkbenchPartReference ref) {
super.partVisible(ref);
// ensure that the notification is for the view we opened
assertEquals(MockViewPart.ID, ref.getId());
// ensure that the view can be found
assertNotNull(fPage.findView(MockViewPart.ID));
eventReceived[0] = true;
}
};
fPage.addPartListener(listener);
clearEventState();
MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
fPage.removePartListener(listener);
assertEquals(view, fPage.getActivePart());
assertTrue(eventReceived[0]);
}
/**
* Tests the partVisible method by showing a view when it is already
* open in another perspective.
*/
public void testPartVisibleWhenOpenedShared() throws Throwable {
final boolean[] eventReceived = { false };
IPartListener2 listener = new TestPartListener2() {
public void partVisible(IWorkbenchPartReference ref) {
super.partVisible(ref);
// ensure that the notification is for the view we opened
assertEquals(MockViewPart.ID, ref.getId());
// ensure that the view can be found
assertNotNull(fPage.findView(MockViewPart.ID));
eventReceived[0] = true;
}
};
MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
IPerspectiveDescriptor emptyPerspDesc2 = fWindow.getWorkbench()
.getPerspectiveRegistry().findPerspectiveWithId(
EmptyPerspective.PERSP_ID2);
fPage.setPerspective(emptyPerspDesc2);
fPage.addPartListener(listener);
clearEventState();
MockViewPart view2 = (MockViewPart) fPage.showView(MockViewPart.ID);
assertTrue(view == view2);
assertEquals(view2, fPage.getActivePart());
assertTrue(eventReceived[0]);
fPage.removePartListener(listener);
}
/**
* Tests that both a part hidden and a part closed event are sent when
* a part is closed
*
* @throws Throwable
*/
public void testPartHiddenBeforeClosing() throws Throwable {
final boolean[] eventReceived = {false, false};
IPartListener2 listener = new TestPartListener2() {
public void partHidden(IWorkbenchPartReference ref) {
super.partHidden(ref);
// ensure that the notification is for the view we revealed
assertEquals(MockViewPart.ID, ref.getId());
// ensure that the part cannot be found in the page
assertNull(fPage.findView(MockViewPart.ID));
// Ensure that partHidden is sent first
eventReceived[0] = true;
assertFalse(eventReceived[1]);
}
public void partClosed(IWorkbenchPartReference ref) {
super.partClosed(ref);
// ensure that the notification is for the view we revealed
assertEquals(MockViewPart.ID, ref.getId());
// ensure that the view can no longer be found
assertNull(fPage.findView(MockViewPart.ID));
// Ensure that partHidden is sent first
eventReceived[1] = true;
assertTrue(eventReceived[0]);
}
};
MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
assertEquals(view, fPage.getActivePart());
fPage.addPartListener(listener);
clearEventState();
fPage.hideView(view);
fPage.removePartListener(listener);
history.verifyOrder(new String[] {"partHidden", "partClosed"});
assertTrue(eventReceived[0]);
assertTrue(eventReceived[1]);
}
/**
* Tests the partVisible method by activating a view obscured by
* another view in the same folder.
*/
public void testPartVisibleWhenObscured() throws Throwable {
final boolean[] eventReceived = { false };
IPartListener2 listener = new TestPartListener2() {
public void partVisible(IWorkbenchPartReference ref) {
super.partVisible(ref);
// ensure that the notification is for the view we revealed
assertEquals(MockViewPart.ID, ref.getId());
// ensure that the view can still be found
assertNotNull(fPage.findView(MockViewPart.ID));
eventReceived[0] = true;
}
};
MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
MockViewPart view2 = (MockViewPart) fPage.showView(MockViewPart.ID2);
assertEquals(view2, fPage.getActivePart());
fPage.addPartListener(listener);
clearEventState();
fPage.activate(view);
fPage.removePartListener(listener);
assertTrue(eventReceived[0]);
}
// /**
// * Tests that when a partOpened is received for a view being shown,
// * the view is available via findView, findViewReference, getViews and getViewReferences.
// *
// * @since 3.1
// */
// This does not work as expected. See bug 93784.
//
// public void testViewFoundWhenOpened() throws Throwable {
// final String viewId = MockViewPart.ID;
// final boolean[] eventReceived = { false, false };
// IPartListener listener = new TestPartListener() {
// public void partOpened(IWorkbenchPart part) {
// super.partOpened(part);
// // ensure that the notification is for the view we opened
// assertEquals(viewId, part.getSite().getId());
// // ensure that the view can be found
// assertNotNull(fPage.findView(viewId));
// IViewPart[] views = fPage.getViews();
// assertEquals(1, views.length);
// assertEquals(viewId, views[0].getSite().getId());
// eventReceived[0] = true;
// }
// };
// IPartListener2 listener2 = new TestPartListener2() {
// public void partOpened(IWorkbenchPartReference ref) {
// super.partOpened(ref);
// // ensure that the notification is for the view we opened
// assertEquals(viewId, ref.getId());
// // ensure that the view can be found
// assertNotNull(fPage.findViewReference(viewId));
// IViewReference[] refs = fPage.getViewReferences();
// assertEquals(1, refs.length);
// assertEquals(viewId, refs[0].getId());
// eventReceived[1] = true;
// }
// };
// fPage.addPartListener(listener);
// fPage.addPartListener(listener2);
// fPage.showView(viewId);
// fPage.removePartListener(listener);
// fPage.removePartListener(listener2);
// assertTrue(eventReceived[0]);
// assertTrue(eventReceived[1]);
// }
/**
* Tests that when a partOpened is received for an editor being opened,
* the editor is available via findEditor, getEditors, and getEditorReferences.
*
* @since 3.1
*/
public void testEditorFoundWhenOpened() throws Throwable {
final String editorId = MockEditorPart.ID1;
IProject proj = FileUtil.createProject("IPartServiceTest");
IFile file = FileUtil.createFile("testEditorFoundWhenOpened.txt", proj);
final IEditorInput editorInput = new FileEditorInput(file);
final boolean[] eventReceived = { false, false };
IPartListener listener = new TestPartListener() {
public void partOpened(IWorkbenchPart part) {
super.partOpened(part);
// ensure that the notification is for the editor we opened
assertEquals(editorId, part.getSite().getId());
// ensure that the editor can be found
assertNotNull(fPage.findEditor(editorInput));
IEditorPart[] editors = fPage.getEditors();
assertEquals(1, editors.length);
assertEquals(editorId, editors[0].getSite().getId());
eventReceived[0] = true;
}
};
IPartListener2 listener2 = new TestPartListener2() {
public void partOpened(IWorkbenchPartReference ref) {
super.partOpened(ref);
// ensure that the notification is for the editor we opened
assertEquals(editorId, ref.getId());
// ensure that the editor can be found
IEditorReference[] refs = fPage.getEditorReferences();
assertEquals(1, refs.length);
assertEquals(editorId, refs[0].getId());
eventReceived[1] = true;
}
};
fPage.addPartListener(listener);
fPage.addPartListener(listener2);
fPage.openEditor(editorInput, editorId);
fPage.removePartListener(listener);
fPage.removePartListener(listener2);
assertTrue(eventReceived[0]);
assertTrue(eventReceived[1]);
}
}