### Eclipse Workspace Patch 1.0 #P eclipse.platform.ui diff --git bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/SWTPartRenderer.java bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/SWTPartRenderer.java index 933ddc4..48d3f0b 100644 --- bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/SWTPartRenderer.java +++ bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/SWTPartRenderer.java @@ -43,10 +43,10 @@ public abstract class SWTPartRenderer extends AbstractPartRenderer { private static final String ICON_URI_FOR_PART = "IconUriForPart"; //$NON-NLS-1$ + static final String PIN_URI = "platform:/plugin/org.eclipse.e4.ui.workbench.renderers.swt/icons/full/ovr16/pinned_ovr.gif"; //$NON-NLS-1$ private Map imageMap = new HashMap<>(); - private String pinURI = "platform:/plugin/org.eclipse.e4.ui.workbench.renderers.swt/icons/full/ovr16/pinned_ovr.gif"; //$NON-NLS-1$ private Image pinImage; private ISWTResourceUtilities resUtils; @@ -327,7 +327,7 @@ resUtils = (ISWTResourceUtilities) context.get(IResourceUtilities.class .getName()); - pinImage = getImageFromURI(pinURI); + pinImage = getImageFromURI(PIN_URI); Display.getCurrent().disposeExec(new Runnable() { @Override diff --git bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java index 6784213..472feea 100644 --- bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java +++ bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java @@ -27,6 +27,7 @@ import javax.annotation.PostConstruct; import javax.inject.Inject; import org.eclipse.core.expressions.ExpressionInfo; +import org.eclipse.e4.core.commands.ExpressionContext; import org.eclipse.e4.core.contexts.ContextInjectionFactory; import org.eclipse.e4.core.contexts.IContextFunction; import org.eclipse.e4.core.contexts.IEclipseContext; @@ -40,6 +41,7 @@ import org.eclipse.e4.ui.internal.workbench.swt.CSSRenderingUtils; import org.eclipse.e4.ui.model.application.MApplication; import org.eclipse.e4.ui.model.application.MApplicationElement; +import org.eclipse.e4.ui.model.application.ui.MCoreExpression; 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.SideValue; @@ -191,7 +193,7 @@ } if (parent == null) { - ici.setVisible(itemModel.isVisible()); + ici.setVisible(isVisible(itemModel)); return; } @@ -199,13 +201,13 @@ // partial fix for bug 383569: only change state if there are no // extra override mechanics controlling element visibility if (ov == null) { - ici.setVisible(itemModel.isVisible()); + ici.setVisible(isVisible(itemModel)); } else { Boolean visible = ov.getVisible(ici); if (visible == null) { // same as above: only change state if there are no extra // override mechanics controlling element visibility - ici.setVisible(itemModel.isVisible()); + ici.setVisible(isVisible(itemModel)); } } @@ -711,7 +713,7 @@ } itemModel.setRenderer(this); AbstractGroupMarker marker = null; - if (itemModel.isVisible() && !itemModel.getTags().contains(MenuManagerRenderer.GROUP_MARKER)) { + if (isVisible(itemModel) && !itemModel.getTags().contains(MenuManagerRenderer.GROUP_MARKER)) { marker = new Separator(); marker.setId(itemModel.getElementId()); } else { @@ -734,7 +736,7 @@ final IEclipseContext lclContext = getContext(itemModel); ToolControlContribution ci = ContextInjectionFactory.make(ToolControlContribution.class, lclContext); ci.setModel(itemModel); - ci.setVisible(itemModel.isVisible()); + ci.setVisible(isVisible(itemModel)); addToManager(parentManager, itemModel, ci); linkModelToContribution(itemModel, ci); } @@ -748,7 +750,7 @@ final IEclipseContext lclContext = getContext(itemModel); DirectContributionItem ci = ContextInjectionFactory.make(DirectContributionItem.class, lclContext); ci.setModel(itemModel); - ci.setVisible(itemModel.isVisible()); + ci.setVisible(isVisible(itemModel)); addToManager(parentManager, itemModel, ci); linkModelToContribution(itemModel, ci); } @@ -762,7 +764,7 @@ final IEclipseContext lclContext = getContext(itemModel); HandledContributionItem ci = ContextInjectionFactory.make(HandledContributionItem.class, lclContext); ci.setModel(itemModel); - ci.setVisible(itemModel.isVisible()); + ci.setVisible(isVisible(itemModel)); addToManager(parentManager, itemModel, ci); linkModelToContribution(itemModel, ci); } @@ -780,11 +782,24 @@ } else { return; } - ici.setVisible(itemModel.isVisible()); + ici.setVisible(isVisible(itemModel)); addToManager(parentManager, itemModel, ici); linkModelToContribution(itemModel, ici); } + private boolean isVisible(MToolBarElement element) { + return isVisible(element, getContext(element)); + } + + static boolean isVisible(MToolBarElement element, IEclipseContext contextForEvaluation) { + boolean visible = element.isVisible(); + if (visible && (element.getVisibleWhen() instanceof MCoreExpression)) { + final ExpressionContext evalContext = new ExpressionContext(contextForEvaluation); + visible = ContributionsAnalyzer.isVisible((MCoreExpression) element.getVisibleWhen(), evalContext); + } + return visible; + } + private void addToManager(ToolBarManager parentManager, MToolBarElement model, IContributionItem ci) { MElementContainer parent = model.getParent(); ### Eclipse Workspace Patch 1.0 #P eclipse.platform.ui diff --git bundles/org.eclipse.e4.ui.workbench.renderers.swt/.settings/org.eclipse.core.resources.prefs bundles/org.eclipse.e4.ui.workbench.renderers.swt/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ bundles/org.eclipse.e4.ui.workbench.renderers.swt/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git bundles/org.eclipse.e4.ui.workbench.renderers.swt/.settings/org.eclipse.m2e.core.prefs bundles/org.eclipse.e4.ui.workbench.renderers.swt/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ bundles/org.eclipse.e4.ui.workbench.renderers.swt/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/SWTPartRenderer.java bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/SWTPartRenderer.java index 933ddc4..48d3f0b 100644 --- bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/SWTPartRenderer.java +++ bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/SWTPartRenderer.java @@ -43,10 +43,10 @@ public abstract class SWTPartRenderer extends AbstractPartRenderer { private static final String ICON_URI_FOR_PART = "IconUriForPart"; //$NON-NLS-1$ + static final String PIN_URI = "platform:/plugin/org.eclipse.e4.ui.workbench.renderers.swt/icons/full/ovr16/pinned_ovr.gif"; //$NON-NLS-1$ private Map imageMap = new HashMap<>(); - private String pinURI = "platform:/plugin/org.eclipse.e4.ui.workbench.renderers.swt/icons/full/ovr16/pinned_ovr.gif"; //$NON-NLS-1$ private Image pinImage; private ISWTResourceUtilities resUtils; @@ -327,7 +327,7 @@ resUtils = (ISWTResourceUtilities) context.get(IResourceUtilities.class .getName()); - pinImage = getImageFromURI(pinURI); + pinImage = getImageFromURI(PIN_URI); Display.getCurrent().disposeExec(new Runnable() { @Override diff --git bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java index 6784213..472feea 100644 --- bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java +++ bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java @@ -27,6 +27,7 @@ import javax.annotation.PostConstruct; import javax.inject.Inject; import org.eclipse.core.expressions.ExpressionInfo; +import org.eclipse.e4.core.commands.ExpressionContext; import org.eclipse.e4.core.contexts.ContextInjectionFactory; import org.eclipse.e4.core.contexts.IContextFunction; import org.eclipse.e4.core.contexts.IEclipseContext; @@ -40,6 +41,7 @@ import org.eclipse.e4.ui.internal.workbench.swt.CSSRenderingUtils; import org.eclipse.e4.ui.model.application.MApplication; import org.eclipse.e4.ui.model.application.MApplicationElement; +import org.eclipse.e4.ui.model.application.ui.MCoreExpression; 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.SideValue; @@ -191,7 +193,7 @@ } if (parent == null) { - ici.setVisible(itemModel.isVisible()); + ici.setVisible(isVisible(itemModel)); return; } @@ -199,13 +201,13 @@ // partial fix for bug 383569: only change state if there are no // extra override mechanics controlling element visibility if (ov == null) { - ici.setVisible(itemModel.isVisible()); + ici.setVisible(isVisible(itemModel)); } else { Boolean visible = ov.getVisible(ici); if (visible == null) { // same as above: only change state if there are no extra // override mechanics controlling element visibility - ici.setVisible(itemModel.isVisible()); + ici.setVisible(isVisible(itemModel)); } } @@ -711,7 +713,7 @@ } itemModel.setRenderer(this); AbstractGroupMarker marker = null; - if (itemModel.isVisible() && !itemModel.getTags().contains(MenuManagerRenderer.GROUP_MARKER)) { + if (isVisible(itemModel) && !itemModel.getTags().contains(MenuManagerRenderer.GROUP_MARKER)) { marker = new Separator(); marker.setId(itemModel.getElementId()); } else { @@ -734,7 +736,7 @@ final IEclipseContext lclContext = getContext(itemModel); ToolControlContribution ci = ContextInjectionFactory.make(ToolControlContribution.class, lclContext); ci.setModel(itemModel); - ci.setVisible(itemModel.isVisible()); + ci.setVisible(isVisible(itemModel)); addToManager(parentManager, itemModel, ci); linkModelToContribution(itemModel, ci); } @@ -748,7 +750,7 @@ final IEclipseContext lclContext = getContext(itemModel); DirectContributionItem ci = ContextInjectionFactory.make(DirectContributionItem.class, lclContext); ci.setModel(itemModel); - ci.setVisible(itemModel.isVisible()); + ci.setVisible(isVisible(itemModel)); addToManager(parentManager, itemModel, ci); linkModelToContribution(itemModel, ci); } @@ -762,7 +764,7 @@ final IEclipseContext lclContext = getContext(itemModel); HandledContributionItem ci = ContextInjectionFactory.make(HandledContributionItem.class, lclContext); ci.setModel(itemModel); - ci.setVisible(itemModel.isVisible()); + ci.setVisible(isVisible(itemModel)); addToManager(parentManager, itemModel, ci); linkModelToContribution(itemModel, ci); } @@ -780,11 +782,24 @@ } else { return; } - ici.setVisible(itemModel.isVisible()); + ici.setVisible(isVisible(itemModel)); addToManager(parentManager, itemModel, ici); linkModelToContribution(itemModel, ici); } + private boolean isVisible(MToolBarElement element) { + return isVisible(element, getContext(element)); + } + + static boolean isVisible(MToolBarElement element, IEclipseContext contextForEvaluation) { + boolean visible = element.isVisible(); + if (visible && (element.getVisibleWhen() instanceof MCoreExpression)) { + final ExpressionContext evalContext = new ExpressionContext(contextForEvaluation); + visible = ContributionsAnalyzer.isVisible((MCoreExpression) element.getVisibleWhen(), evalContext); + } + return visible; + } + private void addToManager(ToolBarManager parentManager, MToolBarElement model, IContributionItem ci) { MElementContainer parent = model.getParent(); diff --git tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRendererTest.java tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRendererTest.java new file mode 100644 index 0000000..33a9b6b --- /dev/null +++ tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRendererTest.java @@ -0,0 +1,54 @@ +package org.eclipse.e4.ui.workbench.renderers.swt; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.eclipse.core.expressions.EvaluationResult; +import org.eclipse.core.expressions.Expression; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.e4.core.contexts.IEclipseContext; +import org.eclipse.e4.ui.model.application.ui.MCoreExpression; +import org.eclipse.e4.ui.model.application.ui.menu.MToolItem; +import org.junit.Before; +import org.junit.Test; + +public class ToolBarManagerRendererTest { + private IEclipseContext context; + + @Before + public void setUp() { + context = null; + } + + @Test + public void isVisible() { + MToolItem toolItem = mock(MToolItem.class); + + assertFalse(ToolBarManagerRenderer.isVisible(toolItem, context)); + + when(toolItem.isVisible()).thenReturn(Boolean.TRUE); + assertTrue(ToolBarManagerRenderer.isVisible(toolItem, context)); + } + + @Test + public void isVisibleWithExpression() throws CoreException { + Expression expression = mock(Expression.class); + when(expression.evaluate(any())).thenReturn(EvaluationResult.FALSE); + MCoreExpression visibleWhen = mock(MCoreExpression.class); + when(visibleWhen.getCoreExpression()).thenReturn(expression); + + MToolItem toolItem = mock(MToolItem.class); + when(toolItem.getVisibleWhen()).thenReturn(visibleWhen); + // item is visible, but expression must also evaluate to true + when(toolItem.isVisible()).thenReturn(Boolean.TRUE); + + assertFalse(ToolBarManagerRenderer.isVisible(toolItem, context)); + + when(expression.evaluate(any())).thenReturn(EvaluationResult.TRUE); + assertTrue(ToolBarManagerRenderer.isVisible(toolItem, context)); + } + +}