如何启用和禁用菜单贡献中的项目?

时间:2014-02-12 03:42:09

标签: eclipse eclipse-plugin swt

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

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

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

我尝试使用属性测试程序,但每次都不会调用它。只有在您选择其他视图时才会调用它。

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

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

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

2 个答案:

答案 0 :(得分:1)

我可能很晚才回答......

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

作为工具栏中某处的暂停操作的示例,这里是源提供程序的代码段及其在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(...)

答案 1 :(得分:0)

快速浏览一下:您在处理程序中使用'activeWhen'。您可以尝试在XML中使用“enabledWhen

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