Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<component id="org.eclipse.e4.ui.workbench.renderers.swt" version="2">
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/CSSEngineHelper.java" type="org.eclipse.e4.ui.workbench.renderers.swt.CSSEngineHelper">
<filter id="640712815">
<message_arguments>
<message_argument value="IStylingEngine"/>
<message_argument value="CSSEngineHelper"/>
<message_argument value="getStyle(Object)"/>
</message_arguments>
</filter>
</resource>
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/ContributionRecord.java" type="org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord">
<filter id="640712815">
<message_arguments>
<message_argument value="MApplicationElement"/>
<message_argument value="ContributionRecord"/>
<message_argument value="getTransientData()"/>
</message_arguments>
</filter>
<filter id="640712815">
<message_arguments>
<message_argument value="MElementContainer&lt;T&gt;"/>
<message_argument value="ContributionRecord"/>
<message_argument value="getChildren()"/>
</message_arguments>
</filter>
<filter id="640712815">
<message_arguments>
<message_argument value="MMenuContribution"/>
<message_argument value="ContributionRecord"/>
<message_argument value="getPositionInParent()"/>
</message_arguments>
</filter>
<filter id="640712815">
<message_arguments>
<message_argument value="MUIElement"/>
<message_argument value="ContributionRecord"/>
<message_argument value="getVisibleWhen()"/>
</message_arguments>
</filter>
</resource>
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java" type="org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem">
<filter id="640712815">
<message_arguments>
<message_argument value="MHandledItem"/>
<message_argument value="HandledContributionItem"/>
<message_argument value="getWbCommand()"/>
</message_arguments>
</filter>
<filter id="640712815">
<message_arguments>
<message_argument value="MHandledItem"/>
<message_argument value="HandledContributionItem"/>
<message_argument value="setWbCommand(ParameterizedCommand)"/>
</message_arguments>
</filter>
</resource>
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/PerspectiveRenderer.java" type="org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveRenderer">
<filter id="640712815">
<message_arguments>
<message_argument value="IStylingEngine"/>
<message_argument value="PerspectiveRenderer"/>
<message_argument value="setClassname(Object, String)"/>
</message_arguments>
</filter>
</resource>
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/PerspectiveStackRenderer.java" type="org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveStackRenderer">
<filter id="640712815">
<message_arguments>
<message_argument value="IStylingEngine"/>
<message_argument value="PerspectiveStackRenderer"/>
<message_argument value="setClassname(Object, String)"/>
</message_arguments>
</filter>
</resource>
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/SWTPartRenderer.java" type="org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer">
<filter id="640712815">
<message_arguments>
<message_argument value="IStylingEngine"/>
<message_argument value="SWTPartRenderer"/>
<message_argument value="setClassnameAndId(Object, String, String)"/>
</message_arguments>
</filter>
</resource>
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java" type="org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer">
<filter id="640712815">
<message_arguments>
<message_argument value="ISaveHandler"/>
<message_argument value="StackRenderer"/>
<message_argument value="save(MPart, boolean)"/>
</message_arguments>
</filter>
<filter id="640712815">
<message_arguments>
<message_argument value="ISaveHandler"/>
<message_argument value="StackRenderer"/>
<message_argument value="saveParts(Collection&lt;MPart&gt;, boolean)"/>
</message_arguments>
</filter>
</resource>
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarContributionRecord.java" type="org.eclipse.e4.ui.workbench.renderers.swt.ToolBarContributionRecord">
<filter id="640712815">
<message_arguments>
<message_argument value="MApplicationElement"/>
<message_argument value="ToolBarContributionRecord"/>
<message_argument value="getTransientData()"/>
</message_arguments>
</filter>
<filter id="640712815">
<message_arguments>
<message_argument value="MElementContainer&lt;T&gt;"/>
<message_argument value="ToolBarContributionRecord"/>
<message_argument value="getChildren()"/>
</message_arguments>
</filter>
<filter id="640712815">
<message_arguments>
<message_argument value="MToolBarContribution"/>
<message_argument value="ToolBarContributionRecord"/>
<message_argument value="getPositionInParent()"/>
</message_arguments>
</filter>
<filter id="640712815">
<message_arguments>
<message_argument value="MUIElement"/>
<message_argument value="ToolBarContributionRecord"/>
<message_argument value="getVisibleWhen()"/>
</message_arguments>
</filter>
</resource>
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java" type="org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer">
<filter id="640712815">
<message_arguments>
<message_argument value="IStylingEngine"/>
<message_argument value="ToolBarManagerRenderer"/>
<message_argument value="setClassname(Object, String)"/>
</message_arguments>
</filter>
</resource>
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/TrimBarRenderer.java" type="org.eclipse.e4.ui.workbench.renderers.swt.TrimBarRenderer">
<filter id="640712815">
<message_arguments>
<message_argument value="MTrimBar"/>
<message_argument value="TrimBarRenderer"/>
<message_argument value="getPendingCleanup()"/>
</message_arguments>
</filter>
<filter id="640712815">
<message_arguments>
<message_argument value="MUIElement"/>
<message_argument value="TrimBarRenderer"/>
<message_argument value="getVisibleWhen()"/>
</message_arguments>
</filter>
</resource>
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/WBWRenderer.java" type="org.eclipse.e4.ui.workbench.renderers.swt.WBWRenderer">
<filter id="623939596">
<message_arguments>
<message_argument value="Save"/>
<message_argument value="WBWRenderer"/>
<message_argument value="CANCEL"/>
</message_arguments>
</filter>
<filter id="623939596">
<message_arguments>
<message_argument value="Save"/>
<message_argument value="WBWRenderer"/>
<message_argument value="NO"/>
</message_arguments>
</filter>
<filter id="623939596">
<message_arguments>
<message_argument value="Save"/>
<message_argument value="WBWRenderer"/>
<message_argument value="YES"/>
</message_arguments>
</filter>
<filter id="640712815">
<message_arguments>
<message_argument value="IStylingEngine"/>
<message_argument value="WBWRenderer"/>
<message_argument value="style(Object)"/>
</message_arguments>
</filter>
<filter id="640712815">
<message_arguments>
<message_argument value="IWindowCloseHandler"/>
<message_argument value="WBWRenderer"/>
<message_argument value="close(MWindow)"/>
</message_arguments>
</filter>
</resource>
</component>
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import java.util.List;
import java.util.Map;
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;
Expand Down Expand Up @@ -516,15 +517,7 @@

record.updateVisibility(parentContext.getActiveLeaf());
runExternalCode(() -> {
manager.update(false);
getUpdater().updateContributionItems(e -> {
if (e instanceof MToolBarElement) {
if (((MUIElement) ((MToolBarElement) e).getParent()) == toolbarModel) {
return true;
}
}
return false;
});
updateToolbar(toolbarModel, manager);
});
return true;
}
Expand Down Expand Up @@ -627,9 +620,118 @@
}
}

// Set up visibility tracking for direct toolbar items with visibleWhen expressions
final MToolBar toolbarModel = (MToolBar) obj;
setupVisibilityTracking(toolbarModel, parentManager);

updateWidget(parentManager);
}

/**
* Set up visibility tracking for direct toolbar items (not from contributions)
* that have visibleWhen expressions.
*/
private void setupVisibilityTracking(final MToolBar toolbarModel, final ToolBarManager manager) {
// Check if any direct children have visibleWhen expressions
List<MToolBarElement> itemsWithVisibility = new ArrayList<>();
for (MUIElement child : toolbarModel.getChildren()) {
if (child instanceof MToolBarElement element) {
if (requiresVisibilityCheck(element)) {
itemsWithVisibility.add(element);
}
}
}

if (itemsWithVisibility.isEmpty()) {
return;
}

// Collect all variable names that need to be tracked
ExpressionInfo info = new ExpressionInfo();
for (MToolBarElement element : itemsWithVisibility) {
ContributionsAnalyzer.collectInfo(info, element.getVisibleWhen());
String visibilityId = element.getPersistedState().get(MenuManagerRenderer.VISIBILITY_IDENTIFIER);
if (visibilityId != null) {
info.addVariableNameAccess(visibilityId);
}
}
updateVariables.addAll(Arrays.asList(info.getAccessedVariableNames()));

final IEclipseContext parentContext = getContext(toolbarModel);
if (parentContext == null) {
return;
}

parentContext.runAndTrack(new RunAndTrack() {
@Override
public boolean changed(IEclipseContext context) {
if (getManager(toolbarModel) == null) {
// tool bar no longer being managed, ignore it
return false;
}

// Update visibility for all items with visibleWhen expressions

Check warning on line 673 in bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java

View check run for this annotation

Jenkins - Eclipse Platform / API Tools

ILLEGAL_INSTANTIATE

NORMAL: ToolBarManagerRenderer illegally instantiates ExpressionContext

Check warning on line 673 in bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java

View check run for this annotation

Jenkins - Eclipse Platform / API Tools

ILLEGAL_REFERENCE

NORMAL: ToolBarManagerRenderer illegally references constructor ExpressionContext(IEclipseContext)
ExpressionContext exprContext = new ExpressionContext(parentContext.getActiveLeaf());
boolean visibilityChanged = false;
for (MToolBarElement element : itemsWithVisibility) {
boolean newVisibility = computeElementVisibility(element, exprContext);
if (element.isVisible() != newVisibility) {
element.setVisible(newVisibility);
visibilityChanged = true;
}
}

if (visibilityChanged) {
runExternalCode(() -> updateToolbar(toolbarModel, manager));
}
return true;
}
});
}

/**
* Check if a toolbar element requires visibility checking
*/
private boolean requiresVisibilityCheck(MToolBarElement element) {
return element.getVisibleWhen() != null
|| element.getPersistedState().get(MenuManagerRenderer.VISIBILITY_IDENTIFIER) != null;
}

/**
* Compute visibility for a single toolbar element
*/
private boolean computeElementVisibility(MToolBarElement element, ExpressionContext exprContext) {
boolean visible = true;

// Check persisted state visibility identifier
String identifier = element.getPersistedState().get(MenuManagerRenderer.VISIBILITY_IDENTIFIER);
if (identifier != null) {

Check warning on line 708 in bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java

View check run for this annotation

Jenkins - Eclipse Platform / API Tools

ILLEGAL_REFERENCE

NORMAL: ToolBarManagerRenderer illegally references field ExpressionContext.eclipseContext
Object rc = exprContext.eclipseContext.get(identifier);
if (rc instanceof Boolean) {
visible = ((Boolean) rc).booleanValue();
}
}

// Check visibleWhen expression
if (visible && element.getVisibleWhen() != null) {
visible = ContributionsAnalyzer.isVisible(element.getVisibleWhen(), exprContext);
}

return visible;
}

private void updateToolbar(final MToolBar toolbarModel, final ToolBarManager manager) {
manager.update(false);
getUpdater().updateContributionItems(e -> {
if (e instanceof MToolBarElement) {
if (((MUIElement) ((MToolBarElement) e).getParent()) == toolbarModel) {
return true;
}
}
return false;
});
}

private void updateWidget(ToolBarManager manager) {
manager.update(true);
ToolBar toolbar = manager.getControl();
Expand Down
Loading
Loading