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 192666 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 v2
bug334580-patch-v2.txt (text/plain), 16.77 KB, created by
Remy Suen
on 2011-04-06 16:12:39 EDT
(
hide
)
Description:
ToolBar rendering patch v2
Filename:
MIME Type:
Creator:
Remy Suen
Created:
2011-04-06 16:12:39 EDT
Size:
16.77 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 6 Apr 2011 20:11:51 -0000 >@@ -40,7 +40,9 @@ > 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; > > public class PartRenderingEngineTests extends TestCase { >@@ -2165,6 +2167,85 @@ > assertFalse(widgetB.isDisposed()); > } > >+ public void testBug334580() { >+ 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()); >+ } >+ > 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 6 Apr 2011 20:11:52 -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 6 Apr 2011 20:11:52 -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); >+ } > } >Index: src/org/eclipse/e4/ui/workbench/renderers/swt/ElementReferenceRenderer.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/ElementReferenceRenderer.java,v >retrieving revision 1.8 >diff -u -r1.8 ElementReferenceRenderer.java >--- src/org/eclipse/e4/ui/workbench/renderers/swt/ElementReferenceRenderer.java 7 Feb 2011 16:15:30 -0000 1.8 >+++ src/org/eclipse/e4/ui/workbench/renderers/swt/ElementReferenceRenderer.java 6 Apr 2011 20:11:52 -0000 >@@ -19,6 +19,8 @@ > import org.eclipse.e4.ui.model.application.ui.MContext; > 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.MToolBar; > import org.eclipse.e4.ui.workbench.IPresentationEngine; > import org.eclipse.swt.SWT; > import org.eclipse.swt.layout.FillLayout; >@@ -174,6 +176,13 @@ > } > } > } >+ >+ if (refElement instanceof MPart) { >+ MToolBar toolbar = ((MPart) refElement).getToolbar(); >+ if (toolbar != null) { >+ toolbar.setVisible(false); >+ } >+ } > } > } > >Index: src/org/eclipse/e4/ui/workbench/renderers/swt/LazyStackRenderer.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/LazyStackRenderer.java,v >retrieving revision 1.23 >diff -u -r1.23 LazyStackRenderer.java >--- src/org/eclipse/e4/ui/workbench/renderers/swt/LazyStackRenderer.java 17 Mar 2011 18:17:51 -0000 1.23 >+++ src/org/eclipse/e4/ui/workbench/renderers/swt/LazyStackRenderer.java 6 Apr 2011 20:11:52 -0000 >@@ -147,31 +147,7 @@ > > if (element instanceof MPlaceholder) { > MPlaceholder ph = (MPlaceholder) element; >- MUIElement ref = ph.getRef(); >- if (ref instanceof MPart && ph.getParent() != null >- && ph.getParent().getWidget() instanceof CTabFolder) { >- // Reparent the existing Toolbar >- MPart part = (MPart) ref; >- CTabFolder ctf = (CTabFolder) ph.getParent().getWidget(); >- IPresentationEngine renderer = part.getContext().get( >- IPresentationEngine.class); >- >- // Dispose the existing toolbar >- if (ctf.getTopRight() != null) { >- Control curTB = ctf.getTopRight(); >- ctf.setTopRight(null); >- if (!curTB.isDisposed()) { >- MUIElement tbME = (MUIElement) curTB >- .getData(AbstractPartRenderer.OWNING_ME); >- if (tbME instanceof MToolBar) >- renderer.removeGui(tbME); >- else >- curTB.dispose(); >- } >- } >- } >- >- element = ((MPlaceholder) element).getRef(); >+ element = ph.getRef(); > } > > // Hide any floating windows >@@ -210,41 +186,52 @@ > if (!element.isToBeRendered()) > return; > >- if (element instanceof MPlaceholder && element.getWidget() != null) { >+ if (element instanceof MPlaceholder) { > MPlaceholder ph = (MPlaceholder) element; > MUIElement ref = ph.getRef(); > ref.setCurSharedRef(ph); > > Composite phComp = (Composite) ph.getWidget(); >- Control refCtrl = (Control) ph.getRef().getWidget(); >- refCtrl.setParent(phComp); >- phComp.layout(new Control[] { refCtrl }, SWT.DEFER); >+ if (phComp != null) { >+ Control refCtrl = (Control) ph.getRef().getWidget(); >+ refCtrl.setParent(phComp); >+ phComp.layout(new Control[] { refCtrl }, SWT.DEFER); >+ } > > if (ref instanceof MPart > && ph.getParent().getWidget() instanceof CTabFolder) { > // Reparent the existing Toolbar > MPart part = (MPart) ref; >+ MToolBar tbModel = part.getToolbar(); >+ boolean same = false; > CTabFolder ctf = (CTabFolder) ph.getParent().getWidget(); > IPresentationEngine renderer = modelService > .getContainingContext(ph) > .get(IPresentationEngine.class); > >+ if (tbModel != null) { >+ tbModel.setVisible(true); >+ } >+ > // Dispose the existing toolbar > if (ctf.getTopRight() != null) { > Control curTB = ctf.getTopRight(); >- ctf.setTopRight(null); >- if (!curTB.isDisposed()) { >- MUIElement tbME = (MUIElement) curTB >- .getData(AbstractPartRenderer.OWNING_ME); >- if (tbME instanceof MToolBar) >- renderer.removeGui(tbME); >- else >- curTB.dispose(); >+ if (tbModel != null && curTB == tbModel.getWidget()) { >+ same = true; >+ } else { >+ ctf.setTopRight(null); >+ if (!curTB.isDisposed()) { >+ MUIElement tbME = (MUIElement) curTB >+ .getData(AbstractPartRenderer.OWNING_ME); >+ if (tbME instanceof MToolBar) >+ renderer.removeGui(tbME); >+ else >+ curTB.dispose(); >+ } > } > } > >- MToolBar tbModel = part.getToolbar(); >- if (tbModel != null) { >+ if (!same && tbModel != null && ref.getRenderer() != null) { > Control c = (Control) renderer.createGui(tbModel, ctf, > part.getContext()); > ctf.setTopRight(c, SWT.RIGHT | SWT.WRAP); >Index: src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.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/StackRenderer.java,v >retrieving revision 1.34 >diff -u -r1.34 StackRenderer.java >--- src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java 28 Mar 2011 17:48:44 -0000 1.34 >+++ src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java 6 Apr 2011 20:11:52 -0000 >@@ -544,20 +544,6 @@ > ctf.setSelection(cti); > ignoreTabSelChanges = false; > >- // Dispose the existing toolbar >- if (ctf.getTopRight() != null) { >- Control curTB = ctf.getTopRight(); >- ctf.setTopRight(null); >- if (!curTB.isDisposed()) { >- MUIElement tbME = (MUIElement) curTB >- .getData(AbstractPartRenderer.OWNING_ME); >- if (tbME instanceof MToolBar) >- renderer.removeGui(tbME); >- else >- curTB.dispose(); >- } >- } >- > // Show the TB, create one if necessary > MPart part = (MPart) ((element instanceof MPart) ? element > : ((MPlaceholder) element).getRef()); >Index: src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.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/ToolBarManagerRenderer.java,v >retrieving revision 1.6 >diff -u -r1.6 ToolBarManagerRenderer.java >--- src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java 14 Mar 2011 14:25:55 -0000 1.6 >+++ src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java 6 Apr 2011 20:11:52 -0000 >@@ -690,11 +690,7 @@ > > @Override > public void disposeWidget(MUIElement element) { >- Object widget = element.getWidget(); >- if (widget instanceof Control) { >- // hide ourselves from the user interface >- ((Control) widget).setVisible(false); >- } >+ element.setVisible(false); > } > > @Override >#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 6 Apr 2011 20:11:53 -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