package org.xmind.cathy.internal.renderer;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
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.basic.MPartStack;
import org.eclipse.e4.ui.model.application.ui.basic.MStackElement;
import org.eclipse.e4.ui.workbench.IPresentationEngine;
import org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
public class XRightStackRenderer extends LazyStackRenderer {
@Inject
private IPresentationEngine renderer;
@Inject
private IEventBroker eventBroker;
@Override
public Object createWidget(MUIElement element, Object parent) {
if (!(element instanceof MPartStack) || !(parent instanceof Composite))
return null;
MPartStack viewStack = (MPartStack) element;
Composite parentComposite = (Composite) parent;
Composite viewContainer = null;
// Ensure that all rendered PartStacks have an Id
if (element.getElementId() == null
|| element.getElementId().length() == 0) {
String generatedId = "RightStack@" //$NON-NLS-1$
+ Integer.toHexString(element.hashCode());
element.setElementId(generatedId);
}
int styleOverride = getStyleOverride(viewStack);
int style = styleOverride == -1 ? SWT.NONE : styleOverride;
//TODO Should use custom composite?
viewContainer = new Composite(parentComposite, style);
viewContainer.setLayout(new StackLayout());
bindWidget(element, viewContainer);
return viewContainer;
}
@Override
protected void showTab(MUIElement element) {
super.showTab(element);
if (element instanceof MPartStack
&& element.getRenderer() == XRightStackRenderer.this) {
MPartStack stackModel = (MPartStack) element;
MUIElement curSel = stackModel.getSelectedElement();
MPart part = (MPart) ((curSel instanceof MPlaceholder)
? ((MPlaceholder) curSel).getRef() : curSel);
if (curSel instanceof MPlaceholder) {
part.setCurSharedRef((MPlaceholder) curSel);
}
}
// an invisible element won't have the correct widget hierarchy
if (!element.isVisible()) {
return;
}
final Composite viewContainer = (Composite) getParentWidget(element);
Control ctrl = (Control) element.getWidget();
if (ctrl != null && ctrl.getParent() != viewContainer) {
ctrl.setParent(viewContainer);
} else if (ctrl == null) {
renderer.createGui(element);
}
ctrl = (Control) element.getWidget();
if (ctrl instanceof Composite) {
((Composite) ctrl).layout(false, true);
}
((StackLayout) viewContainer.getLayout()).topControl = ctrl;
viewContainer.layout(true, true);
}
@Override
public void childRendered(final MElementContainer<MUIElement> parentElement,
MUIElement element) {
super.childRendered(parentElement, element);
if (!(((MUIElement) parentElement) instanceof MPartStack)
|| !(element instanceof MStackElement))
return;
showTab(element);
}
@PostConstruct
public void init() {
super.init(eventBroker);
}
@PreDestroy
public void contextDisposed() {
super.contextDisposed(eventBroker);
}
}