Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 192735 Details for
Bug 334580
View tool bar is disposed prematurely even though it's still up in another perspective
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
ToolBar rendering patch v3
bug334580-patch-v3.txt (text/plain), 13.70 KB, created by
Remy Suen
on 2011-04-07 09:29:39 EDT
(
hide
)
Description:
ToolBar rendering patch v3
Filename:
MIME Type:
Creator:
Remy Suen
Created:
2011-04-07 09:29:39 EDT
Size:
13.70 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.e4.ui.tests >Index: src/org/eclipse/e4/ui/tests/workbench/PartRenderingEngineTests.java >=================================================================== >RCS file: /cvsroot/eclipse/e4/org.eclipse.e4.ui/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/PartRenderingEngineTests.java,v >retrieving revision 1.64 >diff -u -r1.64 PartRenderingEngineTests.java >--- src/org/eclipse/e4/ui/tests/workbench/PartRenderingEngineTests.java 10 Mar 2011 18:32:18 -0000 1.64 >+++ src/org/eclipse/e4/ui/tests/workbench/PartRenderingEngineTests.java 7 Apr 2011 13:27:17 -0000 >@@ -40,22 +40,43 @@ > import org.eclipse.e4.ui.workbench.modeling.EModelService; > import org.eclipse.e4.ui.workbench.modeling.EPartService; > import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState; >+import org.eclipse.swt.widgets.Control; > import org.eclipse.swt.widgets.Display; >+import org.eclipse.swt.widgets.Shell; > import org.eclipse.swt.widgets.Widget; >+import org.osgi.service.log.LogEntry; >+import org.osgi.service.log.LogListener; >+import org.osgi.service.log.LogReaderService; >+import org.osgi.service.log.LogService; > > public class PartRenderingEngineTests extends TestCase { > protected IEclipseContext appContext; > protected E4Workbench wb; > >+ private LogListener listener = new LogListener() { >+ public void logged(LogEntry entry) { >+ if (!logged) { >+ logged = entry.getLevel() == LogService.LOG_ERROR; >+ } >+ } >+ }; >+ private boolean logged = false; >+ > @Override > protected void setUp() throws Exception { > appContext = E4Application.createDefaultContext(); > appContext.set(E4Workbench.PRESENTATION_URI_ARG, > PartRenderingEngine.engineURI); >+ LogReaderService logReaderService = appContext >+ .get(LogReaderService.class); >+ logReaderService.addLogListener(listener); > } > > @Override > protected void tearDown() throws Exception { >+ LogReaderService logReaderService = appContext >+ .get(LogReaderService.class); >+ logReaderService.removeLogListener(listener); > if (wb != null) { > wb.close(); > } >@@ -2165,6 +2186,177 @@ > assertFalse(widgetB.isDisposed()); > } > >+ public void testBug334580_01() { >+ MApplication application = ApplicationFactoryImpl.eINSTANCE >+ .createApplication(); >+ MWindow window = BasicFactoryImpl.eINSTANCE.createWindow(); >+ application.getChildren().add(window); >+ application.setSelectedElement(window); >+ >+ MPart part = BasicFactoryImpl.eINSTANCE.createPart(); >+ window.getSharedElements().add(part); >+ >+ MToolBar toolBar = MenuFactoryImpl.eINSTANCE.createToolBar(); >+ part.setToolbar(toolBar); >+ >+ MPerspectiveStack perspectiveStack = AdvancedFactoryImpl.eINSTANCE >+ .createPerspectiveStack(); >+ window.getChildren().add(perspectiveStack); >+ window.setSelectedElement(perspectiveStack); >+ >+ MPerspective perspectiveA = AdvancedFactoryImpl.eINSTANCE >+ .createPerspective(); >+ perspectiveA.setElementId("perspectiveA"); //$NON-NLS-1$ >+ perspectiveStack.getChildren().add(perspectiveA); >+ perspectiveStack.setSelectedElement(perspectiveA); >+ >+ MPartStack partStackA = BasicFactoryImpl.eINSTANCE.createPartStack(); >+ perspectiveA.getChildren().add(partStackA); >+ perspectiveA.setSelectedElement(partStackA); >+ >+ MPlaceholder placeholderA = AdvancedFactoryImpl.eINSTANCE >+ .createPlaceholder(); >+ placeholderA.setRef(part); >+ part.setCurSharedRef(placeholderA); >+ partStackA.getChildren().add(placeholderA); >+ partStackA.setSelectedElement(placeholderA); >+ >+ MPerspective perspectiveB = AdvancedFactoryImpl.eINSTANCE >+ .createPerspective(); >+ perspectiveB.setElementId("perspectiveB"); //$NON-NLS-1$ >+ perspectiveStack.getChildren().add(perspectiveB); >+ >+ MPartStack partStackB = BasicFactoryImpl.eINSTANCE.createPartStack(); >+ perspectiveB.getChildren().add(partStackB); >+ perspectiveB.setSelectedElement(partStackB); >+ >+ MPlaceholder placeholderB = AdvancedFactoryImpl.eINSTANCE >+ .createPlaceholder(); >+ placeholderB.setRef(part); >+ partStackB.getChildren().add(placeholderB); >+ partStackB.setSelectedElement(placeholderB); >+ >+ application.setContext(appContext); >+ appContext.set(MApplication.class.getName(), application); >+ >+ wb = new E4Workbench(application, appContext); >+ wb.createAndRunUI(window); >+ >+ Shell limboShell = (Shell) appContext.get("limbo"); >+ assertNotNull(limboShell); >+ >+ EPartService partService = window.getContext().get(EPartService.class); >+ partService.switchPerspective(perspectiveB); >+ partService.switchPerspective(perspectiveA); >+ >+ Control control = (Control) toolBar.getWidget(); >+ assertNotNull(control); >+ assertFalse(control.isDisposed()); >+ >+ partService.hidePart(part); >+ control = (Control) toolBar.getWidget(); >+ assertNotNull(control); >+ assertFalse(control.isDisposed()); >+ assertEquals(limboShell, control.getShell()); >+ >+ partService.switchPerspective(perspectiveB); >+ partService.hidePart(part); >+ assertTrue(control.isDisposed()); >+ assertNull(toolBar.getWidget()); >+ } >+ >+ public void testBug334580_02() { >+ MApplication application = ApplicationFactoryImpl.eINSTANCE >+ .createApplication(); >+ MWindow window = BasicFactoryImpl.eINSTANCE.createWindow(); >+ application.getChildren().add(window); >+ application.setSelectedElement(window); >+ >+ MPartStack partStack = BasicFactoryImpl.eINSTANCE.createPartStack(); >+ window.getChildren().add(partStack); >+ window.setSelectedElement(partStack); >+ >+ MPart partA = BasicFactoryImpl.eINSTANCE.createPart(); >+ partStack.getChildren().add(partA); >+ partStack.setSelectedElement(partA); >+ >+ MToolBar toolBarA = MenuFactoryImpl.eINSTANCE.createToolBar(); >+ partA.setToolbar(toolBarA); >+ >+ MPart partB = BasicFactoryImpl.eINSTANCE.createPart(); >+ partStack.getChildren().add(partB); >+ >+ MToolBar toolBarB = MenuFactoryImpl.eINSTANCE.createToolBar(); >+ partB.setToolbar(toolBarB); >+ >+ application.setContext(appContext); >+ appContext.set(MApplication.class.getName(), application); >+ >+ wb = new E4Workbench(application, appContext); >+ wb.createAndRunUI(window); >+ >+ Shell limboShell = (Shell) appContext.get("limbo"); >+ assertNotNull(limboShell); >+ >+ EPartService partService = window.getContext().get(EPartService.class); >+ partService.activate(partB); >+ partService.activate(partA); >+ >+ Control controlA = (Control) toolBarA.getWidget(); >+ Control controlB = (Control) toolBarB.getWidget(); >+ assertNotNull(controlA); >+ assertFalse(controlA.isDisposed()); >+ assertNotNull(controlB); >+ assertFalse(controlB.isDisposed()); >+ >+ partService.hidePart(partA); >+ controlB = (Control) toolBarB.getWidget(); >+ assertNull(toolBarA.getWidget()); >+ assertTrue(controlA.isDisposed()); >+ assertNotNull(controlB); >+ assertFalse(controlB.isDisposed()); >+ >+ partService.hidePart(partB); >+ assertNull(toolBarA.getWidget()); >+ assertNull(toolBarB.getWidget()); >+ assertTrue(controlB.isDisposed()); >+ } >+ >+ public void testBug334580_03() { >+ MApplication application = ApplicationFactoryImpl.eINSTANCE >+ .createApplication(); >+ MWindow window = BasicFactoryImpl.eINSTANCE.createWindow(); >+ application.getChildren().add(window); >+ application.setSelectedElement(window); >+ >+ MPartStack partStack = BasicFactoryImpl.eINSTANCE.createPartStack(); >+ window.getChildren().add(partStack); >+ window.setSelectedElement(partStack); >+ >+ MPart partA = BasicFactoryImpl.eINSTANCE.createPart(); >+ partStack.getChildren().add(partA); >+ partStack.setSelectedElement(partA); >+ >+ MPart partB = BasicFactoryImpl.eINSTANCE.createPart(); >+ partStack.getChildren().add(partB); >+ >+ application.setContext(appContext); >+ appContext.set(MApplication.class.getName(), application); >+ >+ wb = new E4Workbench(application, appContext); >+ wb.createAndRunUI(window); >+ >+ Shell limboShell = (Shell) appContext.get("limbo"); >+ assertNotNull(limboShell); >+ >+ EPartService partService = window.getContext().get(EPartService.class); >+ partService.activate(partB); >+ partService.activate(partA); >+ partService.hidePart(partA); >+ >+ assertFalse(logged); >+ } >+ > private MWindow createWindowWithOneView(String partName) { > final MWindow window = BasicFactoryImpl.eINSTANCE.createWindow(); > window.setHeight(300); >#P org.eclipse.e4.ui.workbench.addons.swt >Index: src/org/eclipse/e4/ui/workbench/addons/cleanupaddon/CleanupAddon.java >=================================================================== >RCS file: /cvsroot/eclipse/e4/org.eclipse.e4.ui/bundles/org.eclipse.e4.ui.workbench.addons.swt/src/org/eclipse/e4/ui/workbench/addons/cleanupaddon/CleanupAddon.java,v >retrieving revision 1.31 >diff -u -r1.31 CleanupAddon.java >--- src/org/eclipse/e4/ui/workbench/addons/cleanupaddon/CleanupAddon.java 17 Mar 2011 18:17:51 -0000 1.31 >+++ src/org/eclipse/e4/ui/workbench/addons/cleanupaddon/CleanupAddon.java 7 Apr 2011 13:27:18 -0000 >@@ -166,6 +166,9 @@ > } else if (changedObj.getWidget() instanceof Control) { > Control ctrl = (Control) changedObj.getWidget(); > MElementContainer<MUIElement> parent = changedObj.getParent(); >+ if (parent == null) { >+ return; >+ } > if (changedObj.isVisible()) { > if (parent.getRenderer() != null) { > Object myParent = ((AbstractPartRenderer) parent.getRenderer()) >#P org.eclipse.e4.ui.workbench.renderers.swt >Index: src/org/eclipse/e4/ui/workbench/renderers/swt/ContributedPartRenderer.java >=================================================================== >RCS file: /cvsroot/eclipse/e4/org.eclipse.e4.ui/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ContributedPartRenderer.java,v >retrieving revision 1.6 >diff -u -r1.6 ContributedPartRenderer.java >--- src/org/eclipse/e4/ui/workbench/renderers/swt/ContributedPartRenderer.java 17 Nov 2010 18:28:04 -0000 1.6 >+++ src/org/eclipse/e4/ui/workbench/renderers/swt/ContributedPartRenderer.java 7 Apr 2011 13:27:18 -0000 >@@ -18,7 +18,12 @@ > import org.eclipse.e4.core.services.log.Logger; > import org.eclipse.e4.ui.di.Focus; > import org.eclipse.e4.ui.model.application.ui.MUIElement; >+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.menu.MMenu; >+import org.eclipse.e4.ui.model.application.ui.menu.MToolBar; >+import org.eclipse.e4.ui.workbench.IPresentationEngine; >+import org.eclipse.emf.ecore.EObject; > import org.eclipse.swt.SWT; > import org.eclipse.swt.graphics.Point; > import org.eclipse.swt.graphics.Rectangle; >@@ -36,6 +41,9 @@ > */ > public class ContributedPartRenderer extends SWTPartRenderer { > >+ @Inject >+ private IPresentationEngine engine; >+ > @Optional > @Inject > private Logger logger; >@@ -216,4 +224,42 @@ > } > > } >+ >+ @Override >+ public Object getUIContainer(MUIElement element) { >+ if (element instanceof MToolBar) { >+ MUIElement container = (MUIElement) ((EObject) element) >+ .eContainer(); >+ MUIElement parent = container.getParent(); >+ if (parent == null) { >+ MPlaceholder placeholder = container.getCurSharedRef(); >+ if (placeholder != null) { >+ return placeholder.getParent().getWidget(); >+ } >+ } else { >+ return parent.getWidget(); >+ } >+ } >+ return super.getUIContainer(element); >+ } >+ >+ @Override >+ public void disposeWidget(MUIElement element) { >+ if (element instanceof MPart) { >+ MPart part = (MPart) element; >+ MToolBar toolBar = part.getToolbar(); >+ if (toolBar != null) { >+ Widget widget = (Widget) toolBar.getWidget(); >+ if (widget != null) { >+ unbindWidget(toolBar); >+ widget.dispose(); >+ } >+ } >+ >+ for (MMenu menu : part.getMenus()) { >+ engine.removeGui(menu); >+ } >+ } >+ super.disposeWidget(element); >+ } > } >#P org.eclipse.e4.ui.workbench.swt >Index: src/org/eclipse/e4/ui/internal/workbench/swt/PartRenderingEngine.java >=================================================================== >RCS file: /cvsroot/eclipse/e4/org.eclipse.e4.ui/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/internal/workbench/swt/PartRenderingEngine.java,v >retrieving revision 1.69 >diff -u -r1.69 PartRenderingEngine.java >--- src/org/eclipse/e4/ui/internal/workbench/swt/PartRenderingEngine.java 10 Mar 2011 19:16:53 -0000 1.69 >+++ src/org/eclipse/e4/ui/internal/workbench/swt/PartRenderingEngine.java 7 Apr 2011 13:27:18 -0000 >@@ -144,9 +144,13 @@ > public void handleEvent(Event event) { > MUIElement changedElement = (MUIElement) event > .getProperty(UIEvents.EventTags.ELEMENT); >- MElementContainer<MUIElement> parent = changedElement.getParent(); >- if (parent == null) >- return; >+ MUIElement parent = changedElement.getParent(); >+ if (parent == null) { >+ parent = (MUIElement) ((EObject) changedElement).eContainer(); >+ if (parent == null) { >+ return; >+ } >+ } > > AbstractPartRenderer renderer = (AbstractPartRenderer) parent > .getRenderer(); >@@ -163,14 +167,23 @@ > Control ctrl = (Control) changedElement.getWidget(); > ctrl.setParent(realComp); > fixZOrder(changedElement); >- renderer.childRendered(parent, changedElement); >+ >+ if (parent instanceof MElementContainer<?>) { >+ renderer.childRendered( >+ (MElementContainer<MUIElement>) parent, >+ changedElement); >+ } > } else { > // Put the control under the 'limbo' shell > if (changedElement.getWidget() instanceof Control) { > Control ctrl = (Control) changedElement.getWidget(); > ctrl.setParent(getLimboShell()); > } >- renderer.hideChild(parent, changedElement); >+ >+ if (parent instanceof MElementContainer<?>) { >+ renderer.hideChild((MElementContainer<MUIElement>) parent, >+ changedElement); >+ } > } > } > };
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 334580
:
191024
|
192666
|
192735
|
192736