| /******************************************************************************* |
| * 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; |
| } |
| } |