在视图中刷新菜单项

时间:2013-06-13 12:34:59

标签: java eclipse eclipse-plugin

上下文

我正在为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上)。 我做错了吗?

2 个答案:

答案 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);
            }
        }
    }
}