HI,
Using eclipse 3.7, i cannot find a way to correctly set up an expression to make a toolbar contribution visible only when an editor is opened.
My use case is a little complex, because i must use the dynamic contribution to populate programmatically the toolbar. this toolbar creates several menus and actions programmatically, too.
I am able to create an expression programmatically and it is correctly called ( i suppose ) by the framework, because the setvisible method is called when the toolbar should change it's state.
BUT the toolbar is shown, because the toolbar contribution algorithm for isVisible [1] does not relies on the visible state, but on the contents of the toolbar ?!
Since i populate the toolbar with menus and actions, it always returns "true".
what i did for now :
1/ use new menu extension point :
<extension
point="org.eclipse.ui.menus">
<menuContribution
allPopups="false"
class="ContributionFactory"
locationURI="toolbar:org.eclipse.ui.main.toolbar">
</menuContribution>
( for those who are still reading, how do i set a label to this menucontribution , it does not appear on the customize dialog ?? )
2/ implements the contribution factory :
@Override
public void createContributionItems(IServiceLocator serviceLocator, IContributionRoot additions) {
ToolBarManager toolBarManager=new ToolBarManager(SWT.FLAT);
ToolBarContributionItem toolbar=new ToolBarContributionItem(toolBarManager, "toolbar");
Expression exp=new VisibleExpression();
additions.addContributionItem(toolbar, exp);
for (MyMenu myMenu: myMenus) {
DropDownAction action=new DropDownAction();
toolBarManager.add(action);
}
}
3/ implemented a visible expression :
public final class VisibleExpression extends Expression {
public EvaluationResult evaluate(IEvaluationContext context) {
Object activeEditorId=context.getVariable("activeEditorId");
if (activeEditorId != null
&& activeEditorId.equals("editorId")))
return EvaluationResult.TRUE;
return EvaluationResult.FALSE;
}
public void collectExpressionInfo(ExpressionInfo info) {
info.addVariableNameAccess(ISources.ACTIVE_EDITOR_ID_NAME);
}
}
I think i am very close to make it work.
Any help greatly appreciated.
[1] snippet org.eclipse.jface.action.ToolBarContributionItem.isVisible():
public boolean isVisible() {
if (checkDisposed()) {
return false;
}
boolean visibleItem = false;
if (toolBarManager != null) {
IContributionItem[] contributionItems = toolBarManager.getItems();
for (int i = 0; i < contributionItems.length; i++) {
IContributionItem contributionItem = contributionItems[i];
if ((!contributionItem.isGroupMarker())
&& (!contributionItem.isSeparator())) {
visibleItem = true;
break;
}
}
}
return (visibleItem || super.isVisible());
}