上下文
我正在为eclipse 3.4及更多版本构建一个插件。
我有一个ID mrp.view
的视图,其menuContribution设置为toolbar:mrp.view
。
这个menuContribution有一些命令,我有这个:
<handler
class="mrp.handlers.export"
commandId="mrp.commands.export">
</handler>
<command
commandId="mrp.commands.export"
label="My command"
style="push">
</command>
我的处理程序mrp.handlers.export
有一个动态的“sEnabled()”方法,看起来像这样:
@Override
public boolean isEnabled() {
return !getMySelection().isEmpty();
}
问题
如果数据发生变化,如何刷新工具栏上的按钮? (如果我单击工具栏的其他按钮,则自动完成刷新,但如果我没有...)
我试过..
ICommandService service = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
service.refreshElements("mrp.commands.export", null);
但它似乎没有做任何事情。
还有这个:
public class Export extends AbstractHandler implements PropertyChangeListener {
@Override
public void propertyChange(PropertyChangeEvent evt) {
setBaseEnabled(!getSelection().isEmpty());
}
// ....
}
它被调用,但我视图菜单上的图标没有刷新(在eclipse 3.7上)。 我做错了吗?
答案 0 :(得分:1)
您的处理程序必须在启用更改时触发事件。如果您使用 org.eclipse.core.commands.AbstractHandler.setBaseEnabled(boolean)更改了处理程序,它将触发所需的事件。
答案 1 :(得分:0)
感谢Paul Webster的回答,我明白了。
public class Export extends AbstractHandler implements PropertyChangeListener {
public Export() {
Activator.getDefault().AddListener(this);
setBaseEnabled(!getMySelection().isEmpty());
}
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
// My handler
return null;
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(Activator.EVENT_SELECTION_CHANGED)) {
boolean before = isEnabled();
boolean after = !getMySelection().isEmpty();
if (after != before) {
setBaseEnabled(after);
}
}
}
}