public void handleEvent(Event event) { MUIElement changedElement = (MUIElement) event.getProperty(UIEvents.EventTags.ELEMENT); MUIElement parent = changedElement.getParent(); if (parent == null) { parent = (MUIElement) ((EObject) changedElement).eContainer(); if (parent == null) { return; } } AbstractPartRenderer renderer = (AbstractPartRenderer) parent.getRenderer(); if (renderer == null || parent instanceof MToolBar) return; // Re-parent the control based on the visible state if (changedElement.isVisible()) { if (changedElement.isToBeRendered()) { if (changedElement.getWidget() instanceof Control) { // Ensure that the control is under its 'real' parent if // it's visible Composite realComp = (Composite) renderer.getUIContainer(changedElement); Control ctrl = (Control) changedElement.getWidget(); ctrl.setParent(realComp); fixZOrder(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(); if (!(ctrl instanceof Shell)) { ctrl.getShell().layout(new Control[] {ctrl}, SWT.DEFER); } ctrl.setParent(getLimboShell()); } if (parent instanceof MElementContainer<?>) { renderer.hideChild((MElementContainer<MUIElement>) parent, changedElement); } } }
private void hideCustomPanelChildren() { Control[] children = customUIPanel.getChildren(); for (Control child : children) { if (child instanceof Composite && "donotremove".equals(((Composite) child).getData())) { // skip } else { child.setParent(fakeShell); } } customUIPanel.pack(); }
public Object createWidget(final MUIElement element, Object parent) { MPlaceholder ph = (MPlaceholder) element; final MUIElement ref = ph.getRef(); ref.setCurSharedRef(ph); List<MPlaceholder> renderedRefs = renderedMap.get(ref); if (renderedRefs == null) { renderedRefs = new ArrayList<MPlaceholder>(); renderedMap.put(ref, renderedRefs); } if (!renderedRefs.contains(ph)) renderedRefs.add(ph); Composite newComp = new Composite((Composite) parent, SWT.NONE); newComp.setLayout(new FillLayout()); Control refWidget = (Control) ref.getWidget(); if (refWidget == null) { ref.setToBeRendered(true); refWidget = (Control) renderingEngine.createGui(ref, newComp, getContextForParent(ref)); } else { if (refWidget.getParent() != newComp) { refWidget.setParent(newComp); } } if (ref instanceof MContext) { IEclipseContext context = ((MContext) ref).getContext(); IEclipseContext newParentContext = getContext(ph); if (context.getParent() != newParentContext) { context.setParent(newParentContext); } } return newComp; }
public ViewerToolBar(IViewerBinding viewer, int style) { myViewer = viewer; myStyle = style; // TODO: Check style myViewer.registerService(this); final IManager manager = IManager.Factory.getManager(); myToolkit = manager.getFormToolkit(); final IServiceLocator serviceLocator = getViewer().getContext().getServiceLocator(); myCommandService = (ICommandService) serviceLocator.getService(ICommandService.class); myHandlerService = (IHandlerService) serviceLocator.getService(IHandlerService.class); myCommandImageService = (ICommandImageService) serviceLocator.getService(ICommandImageService.class); /* * Find the control of the viewer (a Table or Tree). * * Find the parent Composite. * * Add a new Composite (with a GridLayout) and reparent the control * * Then add the toolbar itself on the correct side of the control */ final Control control = myViewer.getControl(); final Composite parent = control.getParent(); myComposite = myToolkit.createComposite(parent); myComposite.setLayoutData(control.getLayoutData()); final GridLayout compLayout = new GridLayout(1, false); myComposite.setLayout(compLayout); control.setParent(myComposite); control.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); myToolBar = new ToolBar(myComposite, SWT.FLAT | (style & (VERTICAL | HORIZONTAL))); if ((style & VERTICAL) != 0) { myToolBar.setLayoutData(new GridData(SWT.BEGINNING, SWT.FILL, false, false)); compLayout.numColumns = 2; } else { myToolBar.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false)); } /* * Inlined from FormToolkit.adapt(Composite composite). Do not set focus though. */ myToolBar.setBackground(myComposite.getBackground()); myToolBar.setMenu(myComposite.getMenu()); myViewer.registerWidget(myToolBar); /* * Add standard items */ if ((style & ADD) != 0) { // TODO addItem(ADD, ""); } if ((style & DELETE) != 0) { addItem( DELETE, IManager.Factory.getManager() .getCommandIDs() .get(IWorkbenchCommandConstants.EDIT_DELETE)); } if ((style & UP) != 0) { addItem(UP, "com.rcpcompany.uibindings.commands.moveItemUp"); } if ((style & DOWN) != 0) { addItem(DOWN, "com.rcpcompany.uibindings.commands.moveItemDown"); } myComposite.layout(true); }
/* * (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); }
public Object safeCreateGui( MUIElement element, Object parentWidget, IEclipseContext parentContext) { if (!element.isToBeRendered()) return null; if (!renderedElements.contains(element)) renderedElements.add(element); // no creates while processing a remove if (removeRoot != null) { return null; } Object currentWidget = element.getWidget(); if (currentWidget != null) { if (currentWidget instanceof Control) { Control control = (Control) currentWidget; // make sure the control is visible control.setVisible(true); if (parentWidget instanceof Composite) { Composite currentParent = control.getParent(); if (currentParent != parentWidget) { // check if the original parent was a tab folder if (currentParent instanceof CTabFolder) { CTabFolder folder = (CTabFolder) currentParent; // if we used to be the tab folder's top right // control, unset it if (folder.getTopRight() == control) { folder.setTopRight(null); } } // the parents are different so we should reparent it control.setParent((Composite) parentWidget); } } } // Reparent the context (or the kid's context) if (element instanceof MContext) { IEclipseContext ctxt = ((MContext) element).getContext(); if (ctxt != null) ctxt.setParent(parentContext); } else { List<MContext> childContexts = modelService.findElements(element, null, MContext.class, null); for (MContext c : childContexts) { // Ensure that we only reset the context of our direct // children MUIElement kid = (MUIElement) c; MUIElement parent = kid.getParent(); if (parent == null && kid.getCurSharedRef() != null) parent = kid.getCurSharedRef().getParent(); if (!(element instanceof MPlaceholder) && parent != element) continue; if (c.getContext() != null && c.getContext().getParent() != parentContext) { c.getContext().setParent(parentContext); } } } // Now that we have a widget let the parent (if any) know if (element.getParent() instanceof MUIElement) { MElementContainer<MUIElement> parentElement = element.getParent(); AbstractPartRenderer parentRenderer = getRendererFor(parentElement); if (parentRenderer != null) parentRenderer.childRendered(parentElement, element); } return element.getWidget(); } if (element instanceof MContext) { MContext ctxt = (MContext) element; // Assert.isTrue(ctxt.getContext() == null, // "Before rendering Context should be null"); if (ctxt.getContext() == null) { IEclipseContext lclContext = parentContext.createChild(getContextName(element)); populateModelInterfaces(ctxt, lclContext, element.getClass().getInterfaces()); ctxt.setContext(lclContext); // System.out.println("New Context: " + lclContext.toString() // + " parent: " + parentContext.toString()); // make sure the context knows about these variables that have // been defined in the model for (String variable : ctxt.getVariables()) { lclContext.declareModifiable(variable); } Map<String, String> props = ctxt.getProperties(); for (String key : props.keySet()) { lclContext.set(key, props.get(key)); } E4Workbench.processHierarchy(element); } } // Create a control appropriate to the part Object newWidget = createWidget(element, parentWidget); // Remember that we've created the control if (newWidget != null) { AbstractPartRenderer renderer = getRendererFor(element); // Have the renderer hook up any widget specific listeners renderer.hookControllerLogic(element); // Process its internal structure through the renderer that created // it if (element instanceof MElementContainer) { renderer.processContents((MElementContainer<MUIElement>) element); } // Allow a final chance to set up renderer.postProcess(element); // Now that we have a widget let the parent (if any) know if (element.getParent() instanceof MUIElement) { MElementContainer<MUIElement> parentElement = element.getParent(); AbstractPartRenderer parentRenderer = getRendererFor(parentElement); if (parentRenderer != null) parentRenderer.childRendered(parentElement, element); } } else { // failed to create the widget, dispose its context if necessary if (element instanceof MContext) { MContext ctxt = (MContext) element; IEclipseContext lclContext = ctxt.getContext(); if (lclContext != null) { lclContext.dispose(); ctxt.setContext(null); } } } return newWidget; }