package org.xmind.cathy.internal.renderer;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
import org.eclipse.e4.ui.internal.workbench.swt.CSSRenderingUtils;
import org.eclipse.e4.ui.model.application.MApplicationElement;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
import org.eclipse.e4.ui.model.application.ui.SideValue;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar;
import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
import org.eclipse.e4.ui.workbench.IPresentationEngine;
import org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer;
import org.eclipse.jface.action.IContributionManagerOverrides;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.ToolBar;
public class XToolBarManagerRenderer extends ToolBarManagerRenderer {
public Object createWidget(final MUIElement element, Object parent) {
if (!(element instanceof MToolBar) || !(parent instanceof Composite))
return null;
final MToolBar toolbarModel = (MToolBar) element;
ToolBar newTB = createToolbar(toolbarModel, (Composite) parent);
bindWidget(element, newTB);
processContribution(toolbarModel, toolbarModel.getElementId());
Control renderedCtrl = newTB;
MUIElement parentElement = element.getParent();
if (parentElement instanceof MTrimBar) {
//default can't be draggable
// if (!element.getTags().contains(IPresentationEngine.NO_MOVE)) {
// element.getTags().add(IPresentationEngine.DRAGGABLE);
// }
setCSSInfo(element, newTB);
boolean vertical = false;
MTrimBar bar = (MTrimBar) parentElement;
vertical = bar.getSide() == SideValue.LEFT
|| bar.getSide() == SideValue.RIGHT;
IEclipseContext parentContext = getContextForParent(element);
CSSRenderingUtils cssUtils = parentContext
.get(CSSRenderingUtils.class);
if (cssUtils != null) {
MUIElement modelElement = (MUIElement) newTB
.getData(AbstractPartRenderer.OWNING_ME);
boolean draggable = ((modelElement != null) && (modelElement
.getTags().contains(IPresentationEngine.DRAGGABLE)));
renderedCtrl = cssUtils.frameMeIfPossible(newTB, null, vertical,
draggable);
}
}
return renderedCtrl;
}
@Override
public Object getUIContainer(MUIElement childElement) {
Composite intermediate = (Composite) super.getUIContainer(childElement);
if (intermediate == null || intermediate.isDisposed()) {
return null;
}
if (intermediate instanceof ToolBar) {
return intermediate;
}
ToolBar toolbar = findToolbar(intermediate);
if (toolbar == null) {
toolbar = createToolbar(childElement.getParent(), intermediate);
}
return toolbar;
}
private ToolBar findToolbar(Composite intermediate) {
for (Control child : intermediate.getChildren()) {
if (child.getData() instanceof ToolBarManager) {
return (ToolBar) child;
}
}
return null;
}
private ToolBar createToolbar(final MUIElement element, Composite parent) {
int orientation = getOrientationStyle(element);
int style = orientation | SWT.WRAP | SWT.FLAT | SWT.RIGHT;
ToolBarManager manager = getManager((MToolBar) element);
if (manager == null) {
manager = new ToolBarManager(style);
IContributionManagerOverrides overrides = null;
MApplicationElement parentElement = element.getParent();
if (parentElement != null) {
overrides = (IContributionManagerOverrides) parentElement
.getTransientData()
.get(IContributionManagerOverrides.class.getName());
}
manager.setOverrides(overrides);
linkModelToManager((MToolBar) element, manager);
} else {
ToolBar toolBar = manager.getControl();
if (toolBar != null && !toolBar.isDisposed()
&& (toolBar.getStyle() & orientation) == 0) {
toolBar.dispose();
}
manager.setStyle(style);
}
ToolBar bar = manager.createControl(parent);
bar.setData(manager);
bar.setData(AbstractPartRenderer.OWNING_ME, element);
bar.getShell().layout(new Control[] { bar }, SWT.DEFER);
return bar;
}
private int getOrientationStyle(final MUIElement element) {
MUIElement theParent = element.getParent();
if (theParent instanceof MTrimBar) {
MTrimBar trimContainer = (MTrimBar) theParent;
SideValue side = trimContainer.getSide();
if (side.getValue() == SideValue.LEFT_VALUE
|| side.getValue() == SideValue.RIGHT_VALUE)
return SWT.VERTICAL;
}
return SWT.HORIZONTAL;
}
}