blob: b676f55546aca769a160725813769482a03437dc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2017 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.workbench;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.eclipse.e4.core.commands.CommandServiceAddon;
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.ui.di.UISynchronize;
import org.eclipse.e4.ui.internal.workbench.E4Workbench;
import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
import org.eclipse.e4.ui.internal.workbench.swt.E4Application;
import org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.model.application.ui.basic.MPartSashContainer;
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.model.application.ui.menu.MDirectMenuItem;
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
import org.eclipse.e4.ui.model.application.ui.menu.MMenuItem;
import org.eclipse.e4.ui.services.IServiceConstants;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.Widget;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
/**
*
*/
public class MWindowTest {
protected IEclipseContext appContext;
protected E4Workbench wb;
private EModelService ems;
@Before
public void setUp() throws Exception {
appContext = E4Application.createDefaultContext();
ContextInjectionFactory.make(CommandServiceAddon.class, appContext);
appContext.set(E4Workbench.PRESENTATION_URI_ARG, PartRenderingEngine.engineURI);
appContext.set(UISynchronize.class, new UISynchronize() {
@Override
public void syncExec(Runnable runnable) {
runnable.run();
}
@Override
public void asyncExec(final Runnable runnable) {
runnable.run();
}
});
ContextInjectionFactory.setDefault(appContext);
ems = appContext.get(EModelService.class);
}
@After
public void tearDown() throws Exception {
if (wb != null) {
wb.close();
}
appContext.dispose();
ContextInjectionFactory.setDefault(null);
}
@Test
public void testCreateWindow() {
final MWindow window = ems.createModelElement(MWindow.class);
window.setLabel("MyWindow");
MApplication application = ems.createModelElement(MApplication.class);
application.getChildren().add(window);
application.setContext(appContext);
appContext.set(MApplication.class, application);
wb = new E4Workbench(application, appContext);
wb.createAndRunUI(window);
Widget topWidget = (Widget) window.getWidget();
assertNotNull(topWidget);
assertTrue(topWidget instanceof Shell);
assertEquals("MyWindow", ((Shell) topWidget).getText());
// XXX Use of ACTIVE_SHELL fails when running standalone
assertEquals(topWidget, appContext.get(IServiceConstants.ACTIVE_SHELL));
}
@Test
public void testWindowVisibility() {
final MWindow window = ems.createModelElement(MWindow.class);
window.setLabel("MyWindow");
MApplication application = ems.createModelElement(MApplication.class);
application.getChildren().add(window);
application.setContext(appContext);
appContext.set(MApplication.class, application);
wb = new E4Workbench(application, appContext);
wb.createAndRunUI(window);
Widget topWidget = (Widget) window.getWidget();
assertNotNull(topWidget);
assertTrue(topWidget instanceof Shell);
Shell shell = (Shell) topWidget;
assertTrue(shell.getVisible() == true);
window.setVisible(false);
assertTrue(shell.getVisible() == false);
window.setVisible(true);
assertTrue(shell.getVisible() == true);
}
@Test
public void testWindowInvisibleCreate() {
final MWindow window = ems.createModelElement(MWindow.class);
window.setLabel("MyWindow");
window.setVisible(false);
MApplication application = ems.createModelElement(MApplication.class);
application.getChildren().add(window);
application.setContext(appContext);
appContext.set(MApplication.class, application);
wb = new E4Workbench(application, appContext);
wb.createAndRunUI(window);
Widget topWidget = (Widget) window.getWidget();
assertNotNull(topWidget);
assertTrue(topWidget instanceof Shell);
Shell shell = (Shell) topWidget;
assertTrue(shell.getVisible() == false);
}
@Test
public void testCreateView() {
final MWindow window = createWindowWithOneView();
MApplication application = ems.createModelElement(MApplication.class);
application.getChildren().add(window);
application.setContext(appContext);
appContext.set(MApplication.class, application);
wb = new E4Workbench(application, appContext);
wb.createAndRunUI(window);
MPartSashContainer container = (MPartSashContainer) window.getChildren().get(0);
MPartStack stack = (MPartStack) container.getChildren().get(0);
CTabFolder folder = (CTabFolder) stack.getWidget();
assertEquals(1, folder.getItemCount());
Control c = folder.getItem(0).getControl();
assertTrue(c instanceof Composite);
Control[] viewPart = ((Composite) c).getChildren();
assertEquals(1, viewPart.length);
assertTrue(viewPart[0] instanceof Tree);
}
@Test
public void testContextChildren() {
final MWindow window = createWindowWithOneView();
MApplication application = ems.createModelElement(MApplication.class);
application.getChildren().add(window);
application.setContext(appContext);
appContext.set(MApplication.class, application);
wb = new E4Workbench(application, appContext);
wb.createAndRunUI(window);
Widget topWidget = (Widget) window.getWidget();
assertNotNull(topWidget);
assertTrue(topWidget instanceof Shell);
Shell shell = (Shell) topWidget;
assertEquals("MyWindow", shell.getText());
// should get the window context
IEclipseContext child = appContext.getActiveChild();
assertNotNull(child);
assertEquals(window.getContext(), child);
MPart modelPart = getContributedPart(window);
assertNotNull(modelPart);
assertEquals(window, modelPart.getParent().getParent().getParent());
// "activate" the part, same as (in theory) an
// SWT.Activate event.
AbstractPartRenderer factory = (AbstractPartRenderer) modelPart.getRenderer();
factory.activate(modelPart);
IEclipseContext next = child.getActiveChild();
while (next != null) {
child = next;
next = child.getActiveChild();
if (next == child) {
fail("Cycle detected in part context");
break;
}
}
assertFalse(window.getContext() == child);
MPart contextPart = child.get(MPart.class);
assertNotNull(contextPart);
assertEquals(window, contextPart.getParent().getParent().getParent());
}
@Test
public void testCreateMenu() {
final MWindow window = createWindowWithOneViewAndMenu();
MApplication application = ems.createModelElement(MApplication.class);
application.getChildren().add(window);
application.setContext(appContext);
appContext.set(MApplication.class, application);
wb = new E4Workbench(application, appContext);
wb.createAndRunUI(window);
((MenuManager) ((Widget) window.getMainMenu().getWidget()).getData()).updateAll(true);
Widget topWidget = (Widget) window.getWidget();
assertNotNull(topWidget);
assertTrue(topWidget instanceof Shell);
Shell shell = (Shell) topWidget;
final Menu menuBar = shell.getMenuBar();
assertNotNull(menuBar);
assertEquals(1, menuBar.getItemCount());
final MenuItem fileItem = menuBar.getItem(0);
assertEquals("File", fileItem.getText());
final Menu fileMenu = fileItem.getMenu();
fileMenu.notifyListeners(SWT.Show, null);
assertEquals(2, fileMenu.getItemCount());
fileMenu.notifyListeners(SWT.Hide, null);
MMenu mainMenu = window.getMainMenu();
MMenu modelFileMenu = (MMenu) mainMenu.getChildren().get(0);
final MMenuItem item2Model = (MMenuItem) modelFileMenu.getChildren().get(0);
item2Model.setToBeRendered(false);
fileMenu.notifyListeners(SWT.Show, null);
assertEquals(1, fileMenu.getItemCount());
fileMenu.notifyListeners(SWT.Hide, null);
item2Model.setToBeRendered(true);
fileMenu.notifyListeners(SWT.Show, null);
assertEquals(2, fileMenu.getItemCount());
fileMenu.notifyListeners(SWT.Hide, null);
}
@Test
public void testWindow_Name() {
final MWindow window = ems.createModelElement(MWindow.class);
window.setLabel("windowName");
MApplication application = ems.createModelElement(MApplication.class);
application.getChildren().add(window);
application.setContext(appContext);
appContext.set(MApplication.class, application);
wb = new E4Workbench(application, appContext);
wb.createAndRunUI(window);
Object widget = window.getWidget();
assertNotNull(widget);
assertTrue(widget instanceof Shell);
Shell shell = (Shell) widget;
assertEquals(shell.getText(), window.getLabel());
assertEquals("windowName", shell.getText());
// the shell's name should have been updated
window.setLabel("windowName2");
assertEquals(shell.getText(), window.getLabel());
assertEquals("windowName2", shell.getText());
}
@Ignore
@Test
public void TODOtestWindow_X() {
final MWindow window = ems.createModelElement(MWindow.class);
window.setX(200);
window.setY(200);
window.setWidth(200);
window.setHeight(200);
MApplication application = ems.createModelElement(MApplication.class);
application.getChildren().add(window);
application.setContext(appContext);
appContext.set(MApplication.class, application);
wb = new E4Workbench(application, appContext);
wb.createAndRunUI(window);
Object widget = window.getWidget();
assertTrue(widget instanceof Shell);
Shell shell = (Shell) widget;
Rectangle bounds = shell.getBounds();
assertEquals(window.getX(), bounds.x);
assertEquals(200, bounds.x);
// the shell's X coordinate should have been updated
window.setX(300);
while (shell.getDisplay().readAndDispatch()) {
// spin the event loop
}
bounds = shell.getBounds();
assertEquals(300, window.getX());
assertEquals(window.getX(), bounds.x);
assertEquals(300, bounds.x);
}
@Ignore
@Test
public void TODOtestWindow_Y() {
final MWindow window = ems.createModelElement(MWindow.class);
window.setX(200);
window.setY(200);
window.setWidth(200);
window.setHeight(200);
MApplication application = ems.createModelElement(MApplication.class);
application.getChildren().add(window);
application.setContext(appContext);
appContext.set(MApplication.class, application);
wb = new E4Workbench(application, appContext);
wb.createAndRunUI(window);
Object widget = window.getWidget();
assertTrue(widget instanceof Shell);
Shell shell = (Shell) widget;
Rectangle bounds = shell.getBounds();
assertEquals(window.getY(), bounds.y);
assertEquals(200, bounds.y);
// the shell's Y coordinate should have been updated
window.setY(300);
while (shell.getDisplay().readAndDispatch()) {
// spin the event loop
}
bounds = shell.getBounds();
assertEquals(300, window.getY());
assertEquals(window.getY(), bounds.y);
assertEquals(300, bounds.y);
}
@Test
public void testWindow_Width() {
final MWindow window = ems.createModelElement(MWindow.class);
window.setX(200);
window.setY(200);
window.setWidth(200);
window.setHeight(200);
MApplication application = ems.createModelElement(MApplication.class);
application.getChildren().add(window);
application.setContext(appContext);
appContext.set(MApplication.class, application);
wb = new E4Workbench(application, appContext);
wb.createAndRunUI(window);
Object widget = window.getWidget();
assertTrue(widget instanceof Shell);
Shell shell = (Shell) widget;
assertEquals(shell.getBounds().width, window.getWidth());
assertEquals(200, shell.getBounds().width);
// the shell's width should have been updated
window.setWidth(300);
while (shell.getDisplay().readAndDispatch()) {
// spin the event loop
}
assertEquals(shell.getBounds().width, window.getWidth());
assertEquals(300, shell.getBounds().width);
}
@Test
public void testWindow_Height() {
final MWindow window = ems.createModelElement(MWindow.class);
window.setX(200);
window.setY(200);
window.setWidth(200);
window.setHeight(200);
MApplication application = ems.createModelElement(MApplication.class);
application.getChildren().add(window);
application.setContext(appContext);
appContext.set(MApplication.class, application);
wb = new E4Workbench(application, appContext);
wb.createAndRunUI(window);
Object widget = window.getWidget();
assertTrue(widget instanceof Shell);
Shell shell = (Shell) widget;
assertEquals(shell.getBounds().height, window.getHeight());
assertEquals(200, shell.getBounds().height);
// the shell's width should have been updated
window.setHeight(300);
while (shell.getDisplay().readAndDispatch()) {
// spin the event loop
}
assertEquals(shell.getBounds().height, window.getHeight());
assertEquals(300, shell.getBounds().height);
}
@Test
public void testDetachedWindow() {
final MWindow window = ems.createModelElement(MWindow.class);
window.setLabel("MyWindow");
final MWindow detachedWindow = ems.createModelElement(MWindow.class);
detachedWindow.setLabel("DetachedWindow");
window.getWindows().add(detachedWindow);
MApplication application = ems.createModelElement(MApplication.class);
application.getChildren().add(window);
application.setContext(appContext);
appContext.set(MApplication.class, application);
wb = new E4Workbench(application, appContext);
wb.createAndRunUI(window);
assertTrue(window.getWidget() instanceof Shell);
assertTrue(detachedWindow.getWidget() instanceof Shell);
Shell topShell = (Shell) window.getWidget();
Shell detachedShell = (Shell) detachedWindow.getWidget();
assertEquals(window, ems.getContainer(detachedWindow));
assertNull("Should have no shell image", topShell.getImage());
assertEquals("Detached should have same image", topShell.getImage(), detachedShell.getImage());
// now set icon on top-level window; detached window should inherit it
window.setIconURI("platform:/plugin/org.eclipse.e4.ui.tests/icons/filenav_nav.png");
while (topShell.getDisplay().readAndDispatch()) {
}
assertNotNull("Should have shell image", topShell.getImage());
assertEquals("Detached should have same image", topShell.getImage(), detachedShell.getImage());
// change top-level icon; detached window should inherit it
window.setIconURI(null);
while (topShell.getDisplay().readAndDispatch()) {
}
assertNull("Should have no shell image", topShell.getImage());
assertEquals("Detached should have same image", topShell.getImage(), detachedShell.getImage());
// turn detached into top-level window; inherited icon should be removed
window.setIconURI("platform:/plugin/org.eclipse.e4.ui.tests/icons/filenav_nav.png");
application.getChildren().add(detachedWindow);
while (topShell.getDisplay().readAndDispatch()) {
}
assertTrue(window.getWindows().isEmpty());
assertNotEquals(window, ems.getContainer(detachedWindow));
assertNotNull(topShell.getImage());
assertNull(detachedShell.getImage());
}
private MPart getContributedPart(MWindow window) {
MPartSashContainer psc = (MPartSashContainer) window.getChildren().get(0);
MPartStack stack = (MPartStack) psc.getChildren().get(0);
MPart part = (MPart) stack.getChildren().get(0);
assertTrue("part is incorrect type " + part, part instanceof MPart);
return part;
}
private MWindow createWindowWithOneView() {
final MWindow window = ems.createModelElement(MWindow.class);
window.setHeight(300);
window.setWidth(400);
window.setLabel("MyWindow");
MPartSashContainer sash = ems.createModelElement(MPartSashContainer.class);
window.getChildren().add(sash);
MPartStack stack = ems.createModelElement(MPartStack.class);
sash.getChildren().add(stack);
MPart contributedPart = ems.createModelElement(MPart.class);
stack.getChildren().add(contributedPart);
contributedPart.setLabel("Sample View");
contributedPart.setContributionURI(
"bundleclass://org.eclipse.e4.ui.tests/org.eclipse.e4.ui.tests.workbench.SampleView");
return window;
}
private MWindow createWindowWithOneViewAndMenu() {
final MWindow window = createWindowWithOneView();
final MMenu menuBar = ems.createModelElement(MMenu.class);
window.setMainMenu(menuBar);
final MMenu fileMenu = ems.createModelElement(MMenu.class);
fileMenu.setLabel("File");
fileMenu.setElementId("file");
menuBar.getChildren().add(fileMenu);
final MMenuItem item1 = ems.createModelElement(MDirectMenuItem.class);
item1.setElementId("item1");
item1.setLabel("item1");
fileMenu.getChildren().add(item1);
final MMenuItem item2 = ems.createModelElement(MDirectMenuItem.class);
item2.setElementId("item2");
item2.setLabel("item2");
fileMenu.getChildren().add(item2);
return window;
}
}