【问题标题】:How to enable and disable items in the menu contribution?如何启用和禁用菜单贡献中的项目?
【发布时间】:2014-03-12 21:03:48
【问题描述】:

我正在尝试对我为 Eclipse 插件所做的菜单贡献使用属性测试器。

基本上我在主菜单栏中添加了一个新菜单(通过扩展 menu:org.eclipse.ui.main.menu 并添加一个菜单)。然后我用正确的处理程序在那里添加了我的命令。 一切都按预期工作。

我唯一的问题是我无法决定何时激活它们。 我正在尝试将 activeWhen 用于我的处理程序。当服务器上有某些数据时,我希望它们处于活动状态。

我尝试使用属性测试器,但它不会每次都被调用。只有在您选择不同的视图时才会调用它。

这样做的正确方法是什么?

编辑:这是我正在使用的代码 http://pastebin.com/TGtZaBtM

我的属性测试器会运行,因为它运行时我会打印出一些东西。 唯一的问题是它不会在每次打开菜单时运行。 我希望它每次都运行,以便检查用户是否登录。

【问题讨论】:

  • 使用相关的plugin.xml 内容和相关代码更新您的帖子。

标签: eclipse eclipse-plugin swt


【解决方案1】:

我可能回复晚了……

无论如何,我总是使用org.eclipse.ui.services 扩展点定义sourceProvider 和一些variable

作为工具栏中某处暂停操作的示例,这里是源提供者的一段代码及其在 plugins.xml 中的定义:

  <extension
         point="org.eclipse.ui.services">
      <sourceProvider
            provider="DataCollectionSourceProvider">
         <variable
               name="Pause"
               priorityLevel="workbench">
         </variable>
      </sourceProvider>
  </extension>

来源提供者:

public class DataCollectionSourceProvider extends AbstractSourceProvider {

    public final static String ID        = "DataCollectionSourceProvider";
    public final static String ID_PAUSED = "Pause";
    public final static String VAL_TRUE  = "TRUE";
    public final static String VAL_FALSE = "FALSE";

    /**
     * @return the instance of this source provider in this workbench
     */
    public static DataCollectionSourceProvider getInstance() {
        ISourceProviderService sourceProviderService = ISourceProviderService)PlatformUI.getWorkbench().getService(ISourceProviderService.class);
        DataCollectionSourceProvider dcProvider = (DataCollectionSourceProvider)sourceProviderService.getSourceProvider(ID);
        return dcProvider;
    }


    private boolean paused = false;

    public DataCollectionSourceProvider() {
        // do nothing
    }

    @Override
    public Map<?, ?> getCurrentState() {
        String value = null;
        Map<String, String> map = new HashMap<String, String>(2);

        // fake variable (my id)
        map.put(ID, VAL_TRUE);

        // paused state
        value = paused ? VAL_TRUE : VAL_FALSE;
        map.put(ID_PAUSED, value);

        return map;
    }

    @Override
    public String[] getProvidedSourceNames() {
        return new String[] { ID, ID_PAUSED };
    }

    public void setPaused(boolean paused) {
        this.paused = paused;
        String value = paused ? VAL_TRUE : VAL_FALSE;
        fireSourceChanged(ISources.WORKBENCH, ID_PAUSED, value);
    }
}

然后在您的 org.eclipse.ui.handlers 贡献中,使用定义的 id 中的变量添加 enableWhen:

<extension
         point="org.eclipse.ui.handlers">
      <handler
            commandId="__your_command_id__">
         <class
               class="__your_handler_class__">
         </class>
         <enabledWhen>
            <with
                  variable="Pause">
               <equals
                     value="FALSE">
               </equals>
            </with>
         </enabledWhen>
      </handler>
</extension>

最后,如果您想更新处理程序/操作状态,您只需在代码中的某处调用以下代码

DataCollectionSourceProvider.getInstance().setPause(...)

【讨论】:

    【解决方案2】:

    一目了然:您在处理程序中使用了“activeWhen”。您或许可以尝试在 XML 中使用 'enabledWhen'

    您还可以查看在您的处理程序中覆盖isEnabled()。当您的插件被激活时,这将起作用。查看文档以获取更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      相关资源
      最近更新 更多