public MenuKey(MMenuContribution mc) { super( mc.getParentId(), mc.getPositionInParent(), mc.getTags(), (MCoreExpression) mc.getVisibleWhen(), mc.getTransientData().get(FACTORY)); this.contribution = mc; mc.setWidget(this); }
public static boolean isVisible(MMenuContribution menuContribution, ExpressionContext eContext) { if (menuContribution.getVisibleWhen() == null) { return true; } return isVisible((MCoreExpression) menuContribution.getVisibleWhen(), eContext); }
// this is similar in nature to: // org.eclipse.e4.ui.internal.workbench.ContributionsAnalyzer.addMenuContributions(MMenu, // ArrayList<MMenuContribution>, ArrayList<MMenuElement>) // the difference is it needs to add all the contributions and manage their // visiblility through a RAT private void addMenuBarContributions( final MMenu menuModel, ArrayList<MMenuContribution> toContribute, final IEclipseContext ctx, final ExpressionContext eContext) { HashSet<String> existingMenuIds = new HashSet<String>(); HashSet<String> existingSeparatorNames = new HashSet<String>(); for (MMenuElement child : menuModel.getChildren()) { String elementId = child.getElementId(); if (child instanceof MMenu && elementId != null) { existingMenuIds.add(elementId); } else if (child instanceof MMenuSeparator && elementId != null) { existingSeparatorNames.add(elementId); } } boolean done = toContribute.size() == 0; while (!done) { ArrayList<MMenuContribution> curList = new ArrayList<MMenuContribution>(toContribute); int retryCount = toContribute.size(); toContribute.clear(); for (final MMenuContribution menuContribution : curList) { final ArrayList<MMenuElement> menuContributionsToRemove = new ArrayList<MMenuElement>(); if (!ContributionsAnalyzer.processAddition( menuModel, menuContributionsToRemove, menuContribution, existingMenuIds, existingSeparatorNames)) { toContribute.add(menuContribution); } else { if (menuContribution.getVisibleWhen() != null) { ctx.runAndTrack( new RunAndTrack() { @Override public boolean changed(IEclipseContext context) { if (!menuModel.isToBeRendered() || !menuModel.isVisible() || menuModel.getWidget() == null) { return false; } boolean rc = ContributionsAnalyzer.isVisible(menuContribution, eContext); for (MMenuElement element : menuContributionsToRemove) { element.setToBeRendered(rc); } return true; } }); } ArrayList<ArrayList<MMenuElement>> lists = pendingCleanup.get(menuModel); if (lists == null) { lists = new ArrayList<ArrayList<MMenuElement>>(); pendingCleanup.put(menuModel, lists); } lists.add(menuContributionsToRemove); } } // We're done if the retryList is now empty (everything done) or // if the list hasn't changed at all (no hope) done = (toContribute.size() == 0) || (toContribute.size() == retryCount); } }