Skip to content

Commit 4e6af9b

Browse files
Copilotlaeubi
authored andcommitted
Implement visibility tracking for regular toolbar items
Fix #3513
1 parent ef09467 commit 4e6af9b

File tree

3 files changed

+362
-9
lines changed

3 files changed

+362
-9
lines changed
Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+
<component id="org.eclipse.e4.ui.workbench.renderers.swt" version="2">
3+
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/CSSEngineHelper.java" type="org.eclipse.e4.ui.workbench.renderers.swt.CSSEngineHelper">
4+
<filter id="640712815">
5+
<message_arguments>
6+
<message_argument value="IStylingEngine"/>
7+
<message_argument value="CSSEngineHelper"/>
8+
<message_argument value="getStyle(Object)"/>
9+
</message_arguments>
10+
</filter>
11+
</resource>
12+
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/ContributionRecord.java" type="org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord">
13+
<filter id="640712815">
14+
<message_arguments>
15+
<message_argument value="MApplicationElement"/>
16+
<message_argument value="ContributionRecord"/>
17+
<message_argument value="getTransientData()"/>
18+
</message_arguments>
19+
</filter>
20+
<filter id="640712815">
21+
<message_arguments>
22+
<message_argument value="MElementContainer&lt;T&gt;"/>
23+
<message_argument value="ContributionRecord"/>
24+
<message_argument value="getChildren()"/>
25+
</message_arguments>
26+
</filter>
27+
<filter id="640712815">
28+
<message_arguments>
29+
<message_argument value="MMenuContribution"/>
30+
<message_argument value="ContributionRecord"/>
31+
<message_argument value="getPositionInParent()"/>
32+
</message_arguments>
33+
</filter>
34+
<filter id="640712815">
35+
<message_arguments>
36+
<message_argument value="MUIElement"/>
37+
<message_argument value="ContributionRecord"/>
38+
<message_argument value="getVisibleWhen()"/>
39+
</message_arguments>
40+
</filter>
41+
</resource>
42+
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java" type="org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem">
43+
<filter id="640712815">
44+
<message_arguments>
45+
<message_argument value="MHandledItem"/>
46+
<message_argument value="HandledContributionItem"/>
47+
<message_argument value="getWbCommand()"/>
48+
</message_arguments>
49+
</filter>
50+
<filter id="640712815">
51+
<message_arguments>
52+
<message_argument value="MHandledItem"/>
53+
<message_argument value="HandledContributionItem"/>
54+
<message_argument value="setWbCommand(ParameterizedCommand)"/>
55+
</message_arguments>
56+
</filter>
57+
</resource>
58+
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/PerspectiveRenderer.java" type="org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveRenderer">
59+
<filter id="640712815">
60+
<message_arguments>
61+
<message_argument value="IStylingEngine"/>
62+
<message_argument value="PerspectiveRenderer"/>
63+
<message_argument value="setClassname(Object, String)"/>
64+
</message_arguments>
65+
</filter>
66+
</resource>
67+
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/PerspectiveStackRenderer.java" type="org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveStackRenderer">
68+
<filter id="640712815">
69+
<message_arguments>
70+
<message_argument value="IStylingEngine"/>
71+
<message_argument value="PerspectiveStackRenderer"/>
72+
<message_argument value="setClassname(Object, String)"/>
73+
</message_arguments>
74+
</filter>
75+
</resource>
76+
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/SWTPartRenderer.java" type="org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer">
77+
<filter id="640712815">
78+
<message_arguments>
79+
<message_argument value="IStylingEngine"/>
80+
<message_argument value="SWTPartRenderer"/>
81+
<message_argument value="setClassnameAndId(Object, String, String)"/>
82+
</message_arguments>
83+
</filter>
84+
</resource>
85+
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java" type="org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer">
86+
<filter id="640712815">
87+
<message_arguments>
88+
<message_argument value="ISaveHandler"/>
89+
<message_argument value="StackRenderer"/>
90+
<message_argument value="save(MPart, boolean)"/>
91+
</message_arguments>
92+
</filter>
93+
<filter id="640712815">
94+
<message_arguments>
95+
<message_argument value="ISaveHandler"/>
96+
<message_argument value="StackRenderer"/>
97+
<message_argument value="saveParts(Collection&lt;MPart&gt;, boolean)"/>
98+
</message_arguments>
99+
</filter>
100+
</resource>
101+
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarContributionRecord.java" type="org.eclipse.e4.ui.workbench.renderers.swt.ToolBarContributionRecord">
102+
<filter id="640712815">
103+
<message_arguments>
104+
<message_argument value="MApplicationElement"/>
105+
<message_argument value="ToolBarContributionRecord"/>
106+
<message_argument value="getTransientData()"/>
107+
</message_arguments>
108+
</filter>
109+
<filter id="640712815">
110+
<message_arguments>
111+
<message_argument value="MElementContainer&lt;T&gt;"/>
112+
<message_argument value="ToolBarContributionRecord"/>
113+
<message_argument value="getChildren()"/>
114+
</message_arguments>
115+
</filter>
116+
<filter id="640712815">
117+
<message_arguments>
118+
<message_argument value="MToolBarContribution"/>
119+
<message_argument value="ToolBarContributionRecord"/>
120+
<message_argument value="getPositionInParent()"/>
121+
</message_arguments>
122+
</filter>
123+
<filter id="640712815">
124+
<message_arguments>
125+
<message_argument value="MUIElement"/>
126+
<message_argument value="ToolBarContributionRecord"/>
127+
<message_argument value="getVisibleWhen()"/>
128+
</message_arguments>
129+
</filter>
130+
</resource>
131+
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java" type="org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer">
132+
<filter id="640712815">
133+
<message_arguments>
134+
<message_argument value="IStylingEngine"/>
135+
<message_argument value="ToolBarManagerRenderer"/>
136+
<message_argument value="setClassname(Object, String)"/>
137+
</message_arguments>
138+
</filter>
139+
</resource>
140+
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/TrimBarRenderer.java" type="org.eclipse.e4.ui.workbench.renderers.swt.TrimBarRenderer">
141+
<filter id="640712815">
142+
<message_arguments>
143+
<message_argument value="MTrimBar"/>
144+
<message_argument value="TrimBarRenderer"/>
145+
<message_argument value="getPendingCleanup()"/>
146+
</message_arguments>
147+
</filter>
148+
<filter id="640712815">
149+
<message_arguments>
150+
<message_argument value="MUIElement"/>
151+
<message_argument value="TrimBarRenderer"/>
152+
<message_argument value="getVisibleWhen()"/>
153+
</message_arguments>
154+
</filter>
155+
</resource>
156+
<resource path="src/org/eclipse/e4/ui/workbench/renderers/swt/WBWRenderer.java" type="org.eclipse.e4.ui.workbench.renderers.swt.WBWRenderer">
157+
<filter id="623939596">
158+
<message_arguments>
159+
<message_argument value="Save"/>
160+
<message_argument value="WBWRenderer"/>
161+
<message_argument value="CANCEL"/>
162+
</message_arguments>
163+
</filter>
164+
<filter id="623939596">
165+
<message_arguments>
166+
<message_argument value="Save"/>
167+
<message_argument value="WBWRenderer"/>
168+
<message_argument value="NO"/>
169+
</message_arguments>
170+
</filter>
171+
<filter id="623939596">
172+
<message_arguments>
173+
<message_argument value="Save"/>
174+
<message_argument value="WBWRenderer"/>
175+
<message_argument value="YES"/>
176+
</message_arguments>
177+
</filter>
178+
<filter id="640712815">
179+
<message_arguments>
180+
<message_argument value="IStylingEngine"/>
181+
<message_argument value="WBWRenderer"/>
182+
<message_argument value="style(Object)"/>
183+
</message_arguments>
184+
</filter>
185+
<filter id="640712815">
186+
<message_arguments>
187+
<message_argument value="IWindowCloseHandler"/>
188+
<message_argument value="WBWRenderer"/>
189+
<message_argument value="close(MWindow)"/>
190+
</message_arguments>
191+
</filter>
192+
</resource>
193+
</component>

bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java

Lines changed: 111 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import java.util.List;
3636
import java.util.Map;
3737
import org.eclipse.core.expressions.ExpressionInfo;
38+
import org.eclipse.e4.core.commands.ExpressionContext;
3839
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
3940
import org.eclipse.e4.core.contexts.IContextFunction;
4041
import org.eclipse.e4.core.contexts.IEclipseContext;
@@ -516,15 +517,7 @@ public boolean changed(IEclipseContext context) {
516517

517518
record.updateVisibility(parentContext.getActiveLeaf());
518519
runExternalCode(() -> {
519-
manager.update(false);
520-
getUpdater().updateContributionItems(e -> {
521-
if (e instanceof MToolBarElement) {
522-
if (((MUIElement) ((MToolBarElement) e).getParent()) == toolbarModel) {
523-
return true;
524-
}
525-
}
526-
return false;
527-
});
520+
updateToolbar(toolbarModel, manager);
528521
});
529522
return true;
530523
}
@@ -627,9 +620,118 @@ public void processContents(MElementContainer<MUIElement> container) {
627620
}
628621
}
629622

623+
// Set up visibility tracking for direct toolbar items with visibleWhen expressions
624+
final MToolBar toolbarModel = (MToolBar) obj;
625+
setupVisibilityTracking(toolbarModel, parentManager);
626+
630627
updateWidget(parentManager);
631628
}
632629

630+
/**
631+
* Set up visibility tracking for direct toolbar items (not from contributions)
632+
* that have visibleWhen expressions.
633+
*/
634+
private void setupVisibilityTracking(final MToolBar toolbarModel, final ToolBarManager manager) {
635+
// Check if any direct children have visibleWhen expressions
636+
List<MToolBarElement> itemsWithVisibility = new ArrayList<>();
637+
for (MUIElement child : toolbarModel.getChildren()) {
638+
if (child instanceof MToolBarElement element) {
639+
if (requiresVisibilityCheck(element)) {
640+
itemsWithVisibility.add(element);
641+
}
642+
}
643+
}
644+
645+
if (itemsWithVisibility.isEmpty()) {
646+
return;
647+
}
648+
649+
// Collect all variable names that need to be tracked
650+
ExpressionInfo info = new ExpressionInfo();
651+
for (MToolBarElement element : itemsWithVisibility) {
652+
ContributionsAnalyzer.collectInfo(info, element.getVisibleWhen());
653+
String visibilityId = element.getPersistedState().get(MenuManagerRenderer.VISIBILITY_IDENTIFIER);
654+
if (visibilityId != null) {
655+
info.addVariableNameAccess(visibilityId);
656+
}
657+
}
658+
updateVariables.addAll(Arrays.asList(info.getAccessedVariableNames()));
659+
660+
final IEclipseContext parentContext = getContext(toolbarModel);
661+
if (parentContext == null) {
662+
return;
663+
}
664+
665+
parentContext.runAndTrack(new RunAndTrack() {
666+
@Override
667+
public boolean changed(IEclipseContext context) {
668+
if (getManager(toolbarModel) == null) {
669+
// tool bar no longer being managed, ignore it
670+
return false;
671+
}
672+
673+
// Update visibility for all items with visibleWhen expressions
674+
ExpressionContext exprContext = new ExpressionContext(parentContext.getActiveLeaf());
675+
boolean visibilityChanged = false;
676+
for (MToolBarElement element : itemsWithVisibility) {
677+
boolean newVisibility = computeElementVisibility(element, exprContext);
678+
if (element.isVisible() != newVisibility) {
679+
element.setVisible(newVisibility);
680+
visibilityChanged = true;
681+
}
682+
}
683+
684+
if (visibilityChanged) {
685+
runExternalCode(() -> updateToolbar(toolbarModel, manager));
686+
}
687+
return true;
688+
}
689+
});
690+
}
691+
692+
/**
693+
* Check if a toolbar element requires visibility checking
694+
*/
695+
private boolean requiresVisibilityCheck(MToolBarElement element) {
696+
return element.getVisibleWhen() != null
697+
|| element.getPersistedState().get(MenuManagerRenderer.VISIBILITY_IDENTIFIER) != null;
698+
}
699+
700+
/**
701+
* Compute visibility for a single toolbar element
702+
*/
703+
private boolean computeElementVisibility(MToolBarElement element, ExpressionContext exprContext) {
704+
boolean visible = true;
705+
706+
// Check persisted state visibility identifier
707+
String identifier = element.getPersistedState().get(MenuManagerRenderer.VISIBILITY_IDENTIFIER);
708+
if (identifier != null) {
709+
Object rc = exprContext.eclipseContext.get(identifier);
710+
if (rc instanceof Boolean) {
711+
visible = ((Boolean) rc).booleanValue();
712+
}
713+
}
714+
715+
// Check visibleWhen expression
716+
if (visible && element.getVisibleWhen() != null) {
717+
visible = ContributionsAnalyzer.isVisible(element.getVisibleWhen(), exprContext);
718+
}
719+
720+
return visible;
721+
}
722+
723+
private void updateToolbar(final MToolBar toolbarModel, final ToolBarManager manager) {
724+
manager.update(false);
725+
getUpdater().updateContributionItems(e -> {
726+
if (e instanceof MToolBarElement) {
727+
if (((MUIElement) ((MToolBarElement) e).getParent()) == toolbarModel) {
728+
return true;
729+
}
730+
}
731+
return false;
732+
});
733+
}
734+
633735
private void updateWidget(ToolBarManager manager) {
634736
manager.update(true);
635737
ToolBar toolbar = manager.getControl();

0 commit comments

Comments
 (0)