/*******************************************************************************
* Copyright (c) 2009, 2015 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.e4.ui.tests.application;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import javax.inject.Inject;
import javax.inject.Named;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.contexts.RunAndTrack;
import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.ui.di.UISynchronize;
import org.eclipse.e4.ui.internal.workbench.UIEventPublisher;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective;
import org.eclipse.e4.ui.model.application.ui.advanced.MPerspectiveStack;
import org.eclipse.e4.ui.model.application.ui.advanced.MPlaceholder;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
import org.eclipse.e4.ui.services.IServiceConstants;
import org.eclipse.e4.ui.workbench.modeling.EPartService;
import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState;
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
import org.eclipse.e4.ui.workbench.modeling.ISelectionListener;
import org.eclipse.emf.common.notify.Notifier;
import org.junit.Test;
public class ESelectionServiceTest extends UITest {
@Test
public void testGetSelection() {
MWindow window = ems.createModelElement(MWindow.class);
application.getChildren().add(window);
application.setSelectedElement(window);
MPart partA = ems.createModelElement(MPart.class);
partA.setElementId("partA"); //$NON-NLS-1$
window.getChildren().add(partA);
window.setSelectedElement(partA);
MPart partB = ems.createModelElement(MPart.class);
partB.setElementId("partB"); //$NON-NLS-1$
window.getChildren().add(partB);
initialize();
getEngine().createGui(window);
IEclipseContext contextA = partA.getContext();
IEclipseContext contextB = partB.getContext();
IEclipseContext windowContext = window.getContext();
ESelectionService serviceA = contextA.get(ESelectionService.class);
ESelectionService serviceB = contextB.get(ESelectionService.class);
ESelectionService windowService = windowContext.get(ESelectionService.class);
EPartService partService = windowContext.get(EPartService.class);
Object selection1 = new Object();
Object selection2 = new Object();
serviceA.setSelection(selection1);
assertEquals(selection1, windowService.getSelection());
assertEquals(selection1, serviceA.getSelection());
assertEquals(selection1, serviceB.getSelection());
serviceB.setSelection(selection2);
assertEquals(selection1, windowService.getSelection());
assertEquals(selection1, serviceA.getSelection());
assertEquals(selection1, serviceB.getSelection());
partService.activate(partB);
assertEquals(selection2, windowService.getSelection());
assertEquals(selection2, serviceA.getSelection());
assertEquals(selection2, serviceB.getSelection());
}
@Test
public void testGetSelection_Id() {
MWindow window = ems.createModelElement(MWindow.class);
application.getChildren().add(window);
application.setSelectedElement(window);
MPart partA = ems.createModelElement(MPart.class);
partA.setElementId("partA"); //$NON-NLS-1$
window.getChildren().add(partA);
window.setSelectedElement(partA);
MPart partB = ems.createModelElement(MPart.class);
partB.setElementId("partB"); //$NON-NLS-1$
window.getChildren().add(partB);
initialize();
getEngine().createGui(window);
IEclipseContext contextA = partA.getContext();
IEclipseContext contextB = partB.getContext();
IEclipseContext windowContext = window.getContext();
ESelectionService serviceA = contextA.get(ESelectionService.class);
ESelectionService serviceB = contextB.get(ESelectionService.class);
ESelectionService windowService = windowContext.get(ESelectionService.class);
Object selection1 = new Object();
Object selection2 = new Object();
serviceA.setSelection(selection1);
assertEquals(selection1, windowService.getSelection("partA")); //$NON-NLS-1$
assertEquals(selection1, serviceA.getSelection("partA")); //$NON-NLS-1$
assertEquals(selection1, serviceB.getSelection("partA")); //$NON-NLS-1$
assertNull(windowService.getSelection("partB")); //$NON-NLS-1$
assertNull(serviceA.getSelection("partB")); //$NON-NLS-1$
assertNull(serviceB.getSelection("partB")); //$NON-NLS-1$
serviceB.setSelection(selection2);
assertEquals(selection1, windowService.getSelection("partA")); //$NON-NLS-1$
assertEquals(selection1, serviceA.getSelection("partA")); //$NON-NLS-1$
assertEquals(selection1, serviceB.getSelection("partA")); //$NON-NLS-1$
assertEquals(selection2, windowService.getSelection("partB")); //$NON-NLS-1$
assertEquals(selection2, serviceA.getSelection("partB")); //$NON-NLS-1$
assertEquals(selection2, serviceB.getSelection("partB")); //$NON-NLS-1$
}
@Test
public void testSelectionListener() {
MWindow window = ems.createModelElement(MWindow.class);
application.getChildren().add(window);
application.setSelectedElement(window);
MPart partA = ems.createModelElement(MPart.class);
partA.setElementId("partA"); //$NON-NLS-1$
window.getChildren().add(partA);
window.setSelectedElement(partA);
MPart partB = ems.createModelElement(MPart.class);
partB.setElementId("partB"); //$NON-NLS-1$
window.getChildren().add(partB);
initialize();
getEngine().createGui(window);
IEclipseContext contextB = partB.getContext();
IEclipseContext windowContext = window.getContext();
ESelectionService serviceB = contextB.get(ESelectionService.class);
ESelectionService windowService = windowContext.get(ESelectionService.class);
EPartService partService = windowContext.get(EPartService.class);
Object selection = new Object();
SelectionListener listener = new SelectionListener();
windowService.addSelectionListener(listener);
serviceB.setSelection(selection);
listener.reset();
partService.activate(partB);
assertEquals(partB, listener.getPart());
assertEquals(selection, listener.getSelection());
windowService.removeSelectionListener(listener);
listener.reset();
partService.activate(partA);
assertNull(listener.getPart());
assertNull(listener.getSelection());
listener.reset();
partService.activate(partB);
assertNull(listener.getPart());
assertNull(listener.getSelection());
}
@Test
public void testSelectionListener2() {
MWindow window = ems.createModelElement(MWindow.class);
application.getChildren().add(window);
application.setSelectedElement(window);
MPart partA = ems.createModelElement(MPart.class);
partA.setElementId("partA"); //$NON-NLS-1$
window.getChildren().add(partA);
window.setSelectedElement(partA);
MPart partB = ems.createModelElement(MPart.class);
partB.setElementId("partB"); //$NON-NLS-1$
window.getChildren().add(partB);
initialize();
getEngine().createGui(window);
IEclipseContext contextA = partA.getContext();
IEclipseContext contextB = partB.getContext();
IEclipseContext windowContext = window.getContext();
ESelectionService serviceA = contextA.get(ESelectionService.class);
ESelectionService serviceB = contextB.get(ESelectionService.class);
ESelectionService windowService = windowContext.get(ESelectionService.class);
EPartService partService = windowContext.get(EPartService.class);
Object selectionA = new Object();
Object selectionB = new Object();
SelectionListener listener = new SelectionListener();
windowService.addSelectionListener(listener);
serviceA.setSelection(selectionA);
assertEquals(partA, listener.getPart());
assertEquals(selectionA, listener.getSelection());
listener.reset();
serviceA.setSelection(selectionA);
assertNull(listener.getPart());
assertNull(listener.getSelection());
listener.reset();
serviceB.setSelection(selectionB);
assertNull(listener.getPart());
assertNull(listener.getSelection());
listener.reset();
partService.activate(partB);
assertEquals(partB, listener.getPart());
assertEquals(selectionB, listener.getSelection());
windowService.removeSelectionListener(listener);
listener.reset();
partService.activate(partA);
assertNull(listener.getPart());
assertNull(listener.getSelection());
listener.reset();
partService.activate(partB);
assertNull(listener.getPart());
assertNull(listener.getSelection());
}
@Test
public void testSelectionListener3() {
MWindow window = ems.createModelElement(MWindow.class);
application.getChildren().add(window);
application.setSelectedElement(window);
MPart partA = ems.createModelElement(MPart.class);
partA.setElementId("partA"); //$NON-NLS-1$
window.getChildren().add(partA);
window.setSelectedElement(partA);
MPart partB = ems.createModelElement(MPart.class);
partB.setElementId("partB"); //$NON-NLS-1$
window.getChildren().add(partB);
initialize();
getEngine().createGui(window);
IEclipseContext contextA = partA.getContext();
IEclipseContext windowContext = window.getContext();
ESelectionService serviceA = contextA.get(ESelectionService.class);
ESelectionService windowService = windowContext.get(ESelectionService.class);
EPartService partService = windowContext.get(EPartService.class);
Object selectionA = new Object();
Object selectionB = new Object();
SelectionListener listener = new SelectionListener();
windowService.addSelectionListener(listener);
serviceA.setSelection(selectionA);
assertEquals(partA, listener.getPart());
assertEquals(selectionA, listener.getSelection());
listener.reset();
serviceA.setSelection(selectionA);
assertNull(listener.getPart());
assertNull(listener.getSelection());
listener.reset();
partService.activate(partB);
assertNull(listener.getPart());
assertNull(listener.getSelection());
listener.reset();
serviceA.setSelection(selectionB);
assertNull(listener.getPart());
assertNull(listener.getSelection());
}
@Test
public void testBug314538() {
MWindow window = ems.createModelElement(MWindow.class);
application.getChildren().add(window);
application.setSelectedElement(window);
initialize();
getEngine().createGui(window);
IEclipseContext windowContext = window.getContext();
ESelectionService windowService = windowContext.get(ESelectionService.class);
EPartService partService = windowContext.get(EPartService.class);
SelectionListener listener = new SelectionListener();
windowService.addSelectionListener(listener);
MPerspectiveStack perspectiveStack = ems.createModelElement(MPerspectiveStack.class);
window.getChildren().add(perspectiveStack);
window.setSelectedElement(perspectiveStack);
MPerspective perspective = ems.createModelElement(MPerspective.class);
perspectiveStack.getChildren().add(perspective);
perspectiveStack.setSelectedElement(perspective);
MPart partA = ems.createModelElement(MPart.class);
partA.setElementId("partA"); //$NON-NLS-1$
perspective.getChildren().add(partA);
perspective.setSelectedElement(partA);
MPart partB = ems.createModelElement(MPart.class);
partB.setElementId("partB"); //$NON-NLS-1$
perspective.getChildren().add(partB);
IEclipseContext contextB = partB.getContext();
ESelectionService serviceB = contextB.get(ESelectionService.class);
Object selection = new Object();
serviceB.setSelection(selection);
listener.reset();
partService.activate(partB);
assertEquals(partB, listener.getPart());
assertEquals(selection, listener.getSelection());
windowService.removeSelectionListener(listener);
listener.reset();
partService.activate(partA);
assertNull(listener.getPart());
assertNull(listener.getSelection());
listener.reset();
partService.activate(partB);
assertNull(listener.getPart());
assertNull(listener.getSelection());
}
@Test
public void testSelectionListener_Id() {
MWindow window = ems.createModelElement(MWindow.class);
application.getChildren().add(window);
application.setSelectedElement(window);
MPart partA = ems.createModelElement(MPart.class);
partA.setElementId("partA"); //$NON-NLS-1$
window.getChildren().add(partA);
window.setSelectedElement(partA);
MPart partB = ems.createModelElement(MPart.class);
partB.setElementId("partB"); //$NON-NLS-1$
window.getChildren().add(partB);
initialize();
getEngine().createGui(window);
IEclipseContext contextA = partA.getContext();
IEclipseContext contextB = partB.getContext();
IEclipseContext windowContext = window.getContext();
ESelectionService serviceA = contextA.get(ESelectionService.class);
ESelectionService serviceB = contextB.get(ESelectionService.class);
ESelectionService windowService = windowContext.get(ESelectionService.class);
EPartService partService = windowContext.get(EPartService.class);
Object selectionA = new Object();
Object selectionB = new Object();
SelectionListener listener = new SelectionListener();
windowService.addSelectionListener("partB", listener); //$NON-NLS-1$
serviceA.setSelection(selectionA);
assertNull(listener.getPart());
assertNull(listener.getSelection());
listener.reset();
partService.activate(partB);
assertNull(listener.getPart());
assertNull(listener.getSelection());
listener.reset();
serviceB.setSelection(selectionB);
assertEquals(partB, listener.getPart());
assertEquals(selectionB, listener.getSelection());
listener.reset();
serviceA.setSelection(selectionB);
assertNull(listener.getPart());
assertNull(listener.getSelection());
listener.reset();
windowService.removeSelectionListener("partB", listener); //$NON-NLS-1$
serviceB.setSelection(selectionA);
assertNull(listener.getPart());
assertNull(listener.getSelection());
}
@Test
public void testSelectionListener_Id2() {
MWindow window = ems.createModelElement(MWindow.class);
application.getChildren().add(window);
application.setSelectedElement(window);
MPart partA = ems.createModelElement(MPart.class);
partA.setElementId("partA"); //$NON-NLS-1$
window.getChildren().add(partA);
window.setSelectedElement(partA);
MPart partB = ems.createModelElement(MPart.class);
partB.setElementId("partB"); //$NON-NLS-1$
window.getChildren().add(partB);
initialize();
getEngine().createGui(window);
IEclipseContext contextB = partB.getContext();
IEclipseContext windowContext = window.getContext();
ESelectionService serviceB = contextB.get(ESelectionService.class);
ESelectionService windowService = windowContext.get(ESelectionService.class);
EPartService partService = windowContext.get(EPartService.class);
Object selectionB = new Object();
SelectionListener listener = new SelectionListener();
windowService.addSelectionListener("partB", listener); //$NON-NLS-1$
partService.activate(partA);
assertNull(listener.getPart());
assertNull(listener.getSelection());
listener.reset();
serviceB.setSelection(selectionB);
assertEquals(partB, listener.getPart());
assertEquals(selectionB, listener.getSelection());
}
@Test
public void testSelectionListener_Id3() {
MWindow window = ems.createModelElement(MWindow.class);
application.getChildren().add(window);
application.setSelectedElement(window);
MPart partA = ems.createModelElement(MPart.class);
partA.setElementId("partA"); //$NON-NLS-1$
window.getChildren().add(partA);
window.setSelectedElement(partA);
MPartStack partStack = ems.createModelElement(MPartStack.class);
MPart partB = ems.createModelElement(MPart.class);
partB.setElementId("partB"); //$NON-NLS-1$
partStack.getChildren().add(partB);
MPart partC = ems.createModelElement(MPart.class);
partC.setElementId("partC"); //$NON-NLS-1$
partStack.getChildren().add(partC);
partStack.setSelectedElement(partB);
window.getChildren().add(partStack);
initialize();
getEngine().createGui(window);
IEclipseContext windowContext = window.getContext();
ESelectionService windowService = windowContext.get(ESelectionService.class);
EPartService partService = windowContext.get(EPartService.class);
Object selection = new Object();
SelectionListener listener = new SelectionListener();
windowService.addSelectionListener("partC", listener); //$NON-NLS-1$
partService.showPart("partC", PartState.CREATE); //$NON-NLS-1$
assertNull(listener.getPart());
assertNull(listener.getSelection());
IEclipseContext contextC = partC.getContext();
ESelectionService serviceC = contextC.get(ESelectionService.class);
listener.reset();
serviceC.setSelection(selection);
assertEquals(partC, listener.getPart());
assertEquals(selection, listener.getSelection());
}
static class ConsumerPart {
public Object input;
@Inject
@Optional
public void setInput(@Named(IServiceConstants.ACTIVE_SELECTION) Object current) {
input = current;
}
}
static class ProviderPart extends ConsumerPart {
private ESelectionService selectionService;
@Inject
public void setSelectionService(ESelectionService s) {
selectionService = s;
}
public void setSelection(Object selection) {
selectionService.setSelection(selection);
}
}
static class TrackingProviderPart extends ProviderPart {
public Object otherSelection;
public void setOtherSelection(Object selection) {
otherSelection = selection;
}
}
static class UseSelectionHandler {
public Object selection;
@Execute
public void execute(@Optional @Named(IServiceConstants.ACTIVE_SELECTION) Object s) {
selection = s;
}
}
@Test
public void testOnePartSelection() throws Exception {
MWindow window = ems.createModelElement(MWindow.class);
application.getChildren().add(window);
application.setSelectedElement(window);
MPart part = ems.createModelElement(MPart.class);
window.getChildren().add(part);
window.setSelectedElement(part);
initialize();
getEngine().createGui(window);
ProviderPart p = new ProviderPart();
ContextInjectionFactory.inject(p, part.getContext());
assertNull(p.input);
Object selection = new Object();
p.setSelection(selection);
assertEquals(selection, p.input);
p.setSelection(null);
assertNull(p.input);
}
@Test
public void testTwoPartHandlerExecute() throws Exception {
MWindow window = ems.createModelElement(MWindow.class);
application.getChildren().add(window);
application.setSelectedElement(window);
MPart partA = ems.createModelElement(MPart.class);
window.getChildren().add(partA);
MPart partB = ems.createModelElement(MPart.class);
window.getChildren().add(partB);
window.setSelectedElement(partA);
initialize();
getEngine().createGui(window);
IEclipseContext windowContext = window.getContext();
IEclipseContext partContextA = partA.getContext();
IEclipseContext partContextB = partB.getContext();
ProviderPart partOneImpl = new ProviderPart();
ContextInjectionFactory.inject(partOneImpl, partContextA);
ConsumerPart partTwoImpl = new ConsumerPart();
ContextInjectionFactory.inject(partTwoImpl, partContextB);
Object selection = new Object();
partOneImpl.setSelection(selection);
UseSelectionHandler handler = new UseSelectionHandler();
assertNull(handler.selection);
ContextInjectionFactory.invoke(handler, Execute.class, applicationContext, null);
assertEquals(selection, handler.selection);
handler.selection = null;
ContextInjectionFactory.invoke(handler, Execute.class, windowContext, null);
assertEquals(selection, handler.selection);
handler.selection = null;
ContextInjectionFactory.invoke(handler, Execute.class, partContextA, null);
assertEquals(selection, handler.selection);
handler.selection = null;
ContextInjectionFactory.invoke(handler, Execute.class, partContextB, null);
// assertNull(handler.selection); // incorrect: should be the window
// selection
EPartService partService = windowContext.get(EPartService.class);
partService.activate(partB);
ContextInjectionFactory.invoke(handler, Execute.class, applicationContext, null);
// assertNull(handler.selection); // partB does not post a selection
handler.selection = null;
ContextInjectionFactory.invoke(handler, Execute.class, windowContext, null);
// assertNull(handler.selection); // partB does not post a selection
handler.selection = null;
ContextInjectionFactory.invoke(handler, Execute.class, partContextA, null);
// assertEquals(selection, handler.selection); // incorrect;
// selection is at window level and active part did not change
handler.selection = null;
ContextInjectionFactory.invoke(handler, Execute.class, partContextB, null);
// assertNull(handler.selection); // incorrect; should be selection
}
@Test
public void testThreePartSelection() throws Exception {
MWindow window = ems.createModelElement(MWindow.class);
application.getChildren().add(window);
application.setSelectedElement(window);
MPart partA = ems.createModelElement(MPart.class);
window.getChildren().add(partA);
MPart partB = ems.createModelElement(MPart.class);
window.getChildren().add(partB);
MPart partC = ems.createModelElement(MPart.class);
window.getChildren().add(partC);
window.setSelectedElement(partA);
initialize();
getEngine().createGui(window);
IEclipseContext windowContext = window.getContext();
IEclipseContext partContextA = partA.getContext();
IEclipseContext partContextB = partB.getContext();
IEclipseContext partContextC = partC.getContext();
ProviderPart partOneImpl = new ProviderPart();
ContextInjectionFactory.inject(partOneImpl, partContextA);
ConsumerPart partTwoImpl = new ConsumerPart();
ContextInjectionFactory.inject(partTwoImpl, partContextB);
ProviderPart partThreeImpl = new ProviderPart();
ContextInjectionFactory.inject(partThreeImpl, partContextC);
ESelectionService windowService = windowContext.get(ESelectionService.class);
EPartService partService = windowContext.get(EPartService.class);
Object selection = new Object();
Object selection2 = new Object();
assertNull(windowService.getSelection());
assertNull(partOneImpl.input);
assertNull(partTwoImpl.input);
assertNull(partThreeImpl.input);
partOneImpl.setSelection(selection);
assertEquals(selection, windowService.getSelection());
assertEquals(selection, partOneImpl.input);
// assertNull(partTwoImpl.input); // incorrect
// assertNull(partThreeImpl.input); // incorrect
partThreeImpl.setSelection(selection2);
assertEquals(selection, windowService.getSelection());
assertEquals(selection, partOneImpl.input);
// assertNull(partTwoImpl.input); // incorrect
// assertEquals(selection2, partThreeImpl.input); // incorrect, it is
// not active
partService.activate(partB);
// assertNull(windowService.getSelection()); // partB does not post
// a selection
// assertEquals(selection, partOneImpl.input); // incorrect
// assertNull(partTwoImpl.input);// partB does not post a selection
// assertEquals(selection2, partThreeImpl.input); // incorrect
partService.activate(partC);
assertEquals(selection2, windowService.getSelection());
// assertEquals(selection, partOneImpl.input); // incorrect
// assertNull(partTwoImpl.input); // incorrect
assertEquals(selection2, partThreeImpl.input);
}
@Test
public void testPartOneTracksPartThree() throws Exception {
MWindow window = ems.createModelElement(MWindow.class);
application.getChildren().add(window);
application.setSelectedElement(window);
MPart partA = ems.createModelElement(MPart.class);
window.getChildren().add(partA);
MPart partB = ems.createModelElement(MPart.class);
window.getChildren().add(partB);
MPart partC = ems.createModelElement(MPart.class);
partC.setElementId("partC");
window.getChildren().add(partC);
window.setSelectedElement(partA);
initialize();
getEngine().createGui(window);
final IEclipseContext partContextA = partA.getContext();
IEclipseContext partContextB = partB.getContext();
final IEclipseContext partContextC = partC.getContext();
final TrackingProviderPart partOneImpl = new TrackingProviderPart();
ContextInjectionFactory.inject(partOneImpl, partContextA);
ConsumerPart partTwoImpl = new ConsumerPart();
ContextInjectionFactory.inject(partTwoImpl, partContextB);
ProviderPart partThreeImpl = new ProviderPart();
ContextInjectionFactory.inject(partThreeImpl, partContextC);
Object selection = new Object();
Object selection2 = new Object();
partOneImpl.setSelection(selection);
partThreeImpl.setSelection(selection2);
assertEquals(selection, partOneImpl.input);
assertNull(partOneImpl.otherSelection);
// assertNull(partTwoImpl.input); // incorrect
// assertEquals(selection2, partThreeImpl.input); // incorrect
// part one tracks down part three. this could just as easily be
// fronted by the mediator.addSelectionListener(*)
partContextC.runAndTrack(new RunAndTrack() {
@Override
public boolean changed(IEclipseContext context) {
ESelectionService s = partContextA.get(ESelectionService.class);
partOneImpl.setOtherSelection(s.getSelection("partC"));
return true;
}
});
assertEquals(selection, partOneImpl.input);
assertEquals(selection2, partOneImpl.otherSelection);
// assertNull(partTwoImpl.input); // incorrect
// assertEquals(selection2, partThreeImpl.input); // incorrect
partThreeImpl.setSelection(selection);
assertEquals(selection, partOneImpl.input);
assertEquals(selection, partOneImpl.otherSelection);
// assertNull(partTwoImpl.input); // incorrect
// assertEquals(selection, partThreeImpl.input); // incorrect
partThreeImpl.setSelection(null);
assertEquals(selection, partOneImpl.input);
assertNull(partOneImpl.otherSelection);
// assertNull(partTwoImpl.input); // incorrect
// assertNull(partThreeImpl.input); // incorrect
}
@Test
public void testPartOneTracksPartThree2() throws Exception {
MWindow window = ems.createModelElement(MWindow.class);
application.getChildren().add(window);
application.setSelectedElement(window);
MPart partA = ems.createModelElement(MPart.class);
window.getChildren().add(partA);
MPart partB = ems.createModelElement(MPart.class);
window.getChildren().add(partB);
MPart partC = ems.createModelElement(MPart.class);
partC.setElementId("partC");
window.getChildren().add(partC);
window.setSelectedElement(partA);
initialize();
getEngine().createGui(window);
final IEclipseContext partContextA = partA.getContext();
IEclipseContext partContextB = partB.getContext();
final IEclipseContext partContextC = partC.getContext();
final TrackingProviderPart partOneImpl = new TrackingProviderPart();
ContextInjectionFactory.inject(partOneImpl, partContextA);
ConsumerPart partTwoImpl = new ConsumerPart();
ContextInjectionFactory.inject(partTwoImpl, partContextB);
ProviderPart partThreeImpl = new ProviderPart();
ContextInjectionFactory.inject(partThreeImpl, partContextC);
Object selection = new Object();
Object selection2 = new Object();
Object selection3 = new Object();
partOneImpl.setSelection(selection);
partThreeImpl.setSelection(selection2);
assertEquals(selection, partOneImpl.input);
assertNull(partOneImpl.otherSelection);
// assertNull(partTwoImpl.input); // incorrect
// assertEquals(selection2, partThreeImpl.input); // incorrect
ESelectionService selectionService = partContextA.get(ESelectionService.class);
selectionService.addSelectionListener(partC.getElementId(), new ISelectionListener() {
@Override
public void selectionChanged(MPart part, Object selection) {
partOneImpl.setOtherSelection(selection);
}
});
partThreeImpl.setSelection(selection3);
assertEquals(selection, partOneImpl.input);
assertEquals(selection3, partOneImpl.otherSelection);
// assertNull(partTwoImpl.input); // incorrect
// assertEquals(selection3, partThreeImpl.input); // incorrect
partThreeImpl.setSelection(selection);
assertEquals(selection, partOneImpl.input);
assertEquals(selection, partOneImpl.otherSelection);
// assertNull(partTwoImpl.input); // incorrect
// assertEquals(selection, partThreeImpl.input); // incorrect
partThreeImpl.setSelection(null);
assertEquals(selection, partOneImpl.input);
assertNull(partOneImpl.otherSelection);
// assertNull(partTwoImpl.input); // incorrect
// assertNull(partThreeImpl.input); // incorrect
}
static class Target {
Target(String s) {
}
}
static class InjectPart {
Object selection;
@Inject
void setSelection(@Optional @Named(IServiceConstants.ACTIVE_SELECTION) Target selection) {
this.selection = selection;
}
}
@Test
public void testInjection() {
MWindow window = ems.createModelElement(MWindow.class);
application.getChildren().add(window);
application.setSelectedElement(window);
MPart partA = ems.createModelElement(MPart.class);
window.getChildren().add(partA);
MPart partB = ems.createModelElement(MPart.class);
window.getChildren().add(partB);
window.setSelectedElement(partA);
initialize();
getEngine().createGui(window);
IEclipseContext windowContext = window.getContext();
IEclipseContext partContextA = partA.getContext();
IEclipseContext partContextB = partB.getContext();
EPartService partService = windowContext.get(EPartService.class);
partService.activate(partA);
ESelectionService selectionServiceA = partContextA.get(ESelectionService.class);
ESelectionService selectionServiceB = partContextB.get(ESelectionService.class);
InjectPart injectPart = ContextInjectionFactory.make(InjectPart.class, partContextA);
assertNull(injectPart.selection);
Object o = new Target("");
selectionServiceA.setSelection(o);
assertEquals(o, injectPart.selection);
partService.activate(partB);
assertEquals("Part B doesn't post a selection, no change", o, injectPart.selection);
partService.activate(partA);
assertEquals(o, injectPart.selection);
Object o2 = new Target("");
selectionServiceB.setSelection(o2);
assertEquals(o, injectPart.selection);
partService.activate(partB);
assertEquals(o2, injectPart.selection);
partService.activate(partA);
assertEquals(o, injectPart.selection);
}
@Test
public void testBug343003() {
MWindow window = ems.createModelElement(MWindow.class);
application.getChildren().add(window);
application.setSelectedElement(window);
MPerspectiveStack perspectiveStack = ems.createModelElement(MPerspectiveStack.class);
window.getChildren().add(perspectiveStack);
window.setSelectedElement(perspectiveStack);
MPerspective perspective = ems.createModelElement(MPerspective.class);
perspectiveStack.getChildren().add(perspective);
perspectiveStack.setSelectedElement(perspective);
MPart partA = ems.createModelElement(MPart.class);
perspective.getChildren().add(partA);
perspective.setSelectedElement(partA);
initialize();
getEngine().createGui(window);
window.getContext().get(EPartService.class).activate(partA);
ESelectionService selectionServiceA = partA.getContext().get(ESelectionService.class);
SelectionListener listener = new SelectionListener();
selectionServiceA.addSelectionListener("partB", listener); //$NON-NLS-1$
MPart partB = ems.createModelElement(MPart.class);
partB.setElementId("partB");
window.getSharedElements().add(partB);
MPlaceholder placeholder = ems.createModelElement(MPlaceholder.class);
placeholder.setRef(partB);
partB.setCurSharedRef(placeholder);
perspective.getChildren().add(placeholder);
Object o = new Object();
ESelectionService selectionServiceB = partB.getContext().get(ESelectionService.class);
selectionServiceB.setSelection(o);
assertEquals(partB, listener.getPart());
assertEquals(o, listener.getSelection());
}
@Test
public void testBug343984() throws Exception {
MWindow window = ems.createModelElement(MWindow.class);
application.getChildren().add(window);
application.setSelectedElement(window);
MPart part = ems.createModelElement(MPart.class);
window.getChildren().add(part);
window.setSelectedElement(part);
initialize();
applicationContext.set(UISynchronize.class, new JobUISynchronizeImpl());
getEngine().createGui(window);
IEclipseContext context = part.getContext();
Bug343984Listener listener = new Bug343984Listener();
listener.context = context;
ESelectionService selectionService = context.get(ESelectionService.class);
selectionService.addSelectionListener(listener);
selectionService.setSelection(new Object());
Thread.sleep(1000);
assertTrue(listener.success);
listener.reset();
selectionService.setSelection(new Object());
Thread.sleep(1000);
assertTrue(listener.success);
}
@Test
public void testBug393137() {
MWindow window = ems.createModelElement(MWindow.class);
application.getChildren().add(window);
application.setSelectedElement(window);
MPart partA = ems.createModelElement(MPart.class);
window.getChildren().add(partA);
MPart partB = ems.createModelElement(MPart.class);
window.getChildren().add(partB);
window.setSelectedElement(partA);
initialize();
getEngine().createGui(window);
IEclipseContext windowContext = window.getContext();
IEclipseContext partContextB = partB.getContext();
EPartService partService = windowContext.get(EPartService.class);
partService.activate(partA);
ESelectionService selectionServiceB = partContextB.get(ESelectionService.class);
Object o = new Target("");
selectionServiceB.setSelection(o);
selectionServiceB.setPostSelection(o);
SelectionListener listener = new SelectionListener();
SelectionListener postListener = new SelectionListener();
selectionServiceB.addSelectionListener(listener);
selectionServiceB.addPostSelectionListener(postListener);
partService.activate(partB);
assertEquals(1, listener.count);
assertEquals(1, postListener.count);
}
private void initialize() {
applicationContext.set(MApplication.class, application);
applicationContext.set(UISynchronize.class, new UISynchronize() {
@Override
public void syncExec(Runnable runnable) {
runnable.run();
}
@Override
public void asyncExec(final Runnable runnable) {
runnable.run();
}
});
application.setContext(applicationContext);
final UIEventPublisher ep = new UIEventPublisher(applicationContext);
((Notifier) application).eAdapters().add(ep);
applicationContext.set(UIEventPublisher.class, ep);
}
static class SelectionListener implements ISelectionListener {
private MPart part;
private Object selection;
private int count;
public void reset() {
part = null;
selection = null;
count = 0;
}
@Override
public void selectionChanged(MPart part, Object selection) {
this.part = part;
this.selection = selection;
this.count++;
}
public MPart getPart() {
return part;
}
public Object getSelection() {
return selection;
}
public int getCount() {
return count;
}
}
static class Bug343984Listener implements ISelectionListener {
IEclipseContext context;
int count = 0;
boolean success = false;
public void reset() {
count = 0;
success = false;
}
@Override
public void selectionChanged(MPart part, Object selection) {
if (count > 0) {
success = false;
return;
}
success = true;
count++;
context.get("a");
context.set("a", new Object());
context.get("b");
context.set("b", new Object());
}
}
static class JobUISynchronizeImpl extends UISynchronize {
@Override
public void syncExec(Runnable runnable) {
runnable.run();
}
@Override
public void asyncExec(final Runnable runnable) {
Job job = new Job("") {
@Override
protected IStatus run(IProgressMonitor monitor) {
runnable.run();
return Status.OK_STATUS;
}
};
job.setPriority(Job.INTERACTIVE);
job.schedule();
}
}
}