private MPart createPart(MPartDescriptor descriptor) { if (descriptor == null) { return null; } MPart part = modelService.createModelElement(MPart.class); part.setElementId(descriptor.getElementId()); part.getMenus().addAll(EcoreUtil.copyAll(descriptor.getMenus())); if (descriptor.getToolbar() != null) { part.setToolbar((MToolBar) EcoreUtil.copy((EObject) descriptor.getToolbar())); } part.setContributorURI(descriptor.getContributorURI()); part.setCloseable(descriptor.isCloseable()); part.setContributionURI(descriptor.getContributionURI()); part.setLabel(descriptor.getLabel()); part.setIconURI(descriptor.getIconURI()); part.setTooltip(descriptor.getTooltip()); part.getHandlers().addAll(EcoreUtil.copyAll(descriptor.getHandlers())); part.getTags().addAll(descriptor.getTags()); part.getPersistedState().putAll(descriptor.getPersistedState()); part.getBindingContexts().addAll(descriptor.getBindingContexts()); return part; }
/* * (non-Javadoc) * * @see * org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer#disposeWidget * (org.eclipse.e4.ui.model.application.ui.MUIElement) */ @Override public void disposeWidget(MUIElement element) { MPlaceholder ph = (MPlaceholder) element; MUIElement refElement = ph.getRef(); Control refCtrl = (Control) refElement.getWidget(); // Remove the element ref from the rendered list List<MPlaceholder> refs = renderedMap.get(refElement); refs.remove(ph); IEclipseContext curContext = modelService.getContainingContext(ph); if (refs.size() == 0) { // Ensure that the image is the 'original' image for this // part. See bug 347471 for details if (refElement instanceof MPart) { MPart thePart = (MPart) refElement; String imageURI = thePart.getIconURI(); thePart.setIconURI(null); thePart.setIconURI(imageURI); } renderingEngine.removeGui(refElement); } else { // Ensure that the dispose of the element reference doesn't cascade // to dispose the 'real' part if (refCtrl != null && !refCtrl.isDisposed()) { MPlaceholder currentRef = refElement.getCurSharedRef(); if (currentRef == ph) { // Find another *rendered* ref to pass the part on to for (MPlaceholder aPH : refs) { Composite phComp = (Composite) aPH.getWidget(); if (phComp == null || phComp.isDisposed()) continue; // Reparent the context(s) (if any) IEclipseContext newParentContext = modelService.getContainingContext(aPH); List<MContext> allContexts = modelService.findElements(refElement, null, MContext.class, null); for (MContext ctxtElement : allContexts) { IEclipseContext theContext = ctxtElement.getContext(); // this may be null if it hasn't been rendered yet if (theContext != null) { if (theContext.getParent() == curContext) { // about to reparent the context, if we're // the active child of the current parent, // deactivate ourselves first if (curContext.getActiveChild() == theContext) { theContext.deactivate(); } theContext.setParent(newParentContext); } } } // reset the 'cur' ref refElement.setCurSharedRef(aPH); // Reparent the widget refCtrl.setParent(phComp); break; } } else if (currentRef != null) { Composite phComp = (Composite) currentRef.getWidget(); if (phComp == null || phComp.isDisposed()) { super.disposeWidget(element); return; } // Reparent the context(s) (if any) IEclipseContext newParentContext = modelService.getContainingContext(currentRef); List<MContext> allContexts = modelService.findElements(refElement, null, MContext.class, null); for (MContext ctxtElement : allContexts) { IEclipseContext theContext = ctxtElement.getContext(); // this may be null if it hasn't been rendered yet if (theContext != null && theContext.getParent() == curContext) { // about to reparent the context, if we're the // active child of the current parent, deactivate // ourselves first if (curContext.getActiveChild() == theContext) { theContext.deactivate(); } theContext.setParent(newParentContext); } } } } } super.disposeWidget(element); }