Eclipse插件:从主菜单栏动态禁用/启用动作

时间:2014-07-04 09:45:53

标签: java eclipse eclipse-plugin eclipse-indigo eclipse-pde

编辑:已解决

背景

我已经实现了一个eclipse插件(在indigo上,3.7.2),它在条形图菜单中提供了一个新图标。

这个新操作在eclipse启动几秒后完全初始化(一些配置文件从我的maven存储库加载)。

我正在尝试禁用此操作,直到我的激活器完成初始化。

我在寻找什么

在初始化之前

Disabled

初始化后

Enabled

我已经完成了什么

我在操作上添加了启用测试。仅当我的插件被激活时才会启用我的操作。

<extension
     point="org.eclipse.ui.actionSets">
  <actionSet
        label="Action Set"
        visible="true"
        id="com.eclipse.plugins.extarcheytpe.actionSet">
     <action
           class="com.eclipse.plugins.extarchetype.actions.ShortcutsAction"
           icon="src/main/resources/icons/generic_box_16x16.png"
           id="com.eclipse.plugins.extarcheytpe.actions.ShortcutsAction"
           label="Shortcuts List"
           style="pulldown"
           toolbarPath="Shortcuts"
           tooltip="Shortcuts">
        <enablement>
           <pluginState
                 id="com.eclipse.plugins.extarchetype"
                 value="activated">
           </pluginState>
        </enablement>
     </action>
  </actionSet>
</extension>

[...]

<extension
      point="org.eclipse.ui.startup">
   <startup
          class="com.eclipse.plugins.extarchetype.Startup">
   </startup>
</extension>

我定义了一个启动类,其中ignite()方法初始化我的插件配置:

public class Startup implements org.eclipse.ui.IStartup{

    @Override
    public void earlyStartup() {
            try {
                Activator.getDefault().ignite();
                Activator.getDefault().setChanged();
                Activator.getDefault().notifyObservers();
            } catch (Exception e) {
                e.printStackTrace();
            }       
    }

}

我在动作和激活器之间实现了一个观察设计模式(通知初始化结束)。

public class ShortcutsAction extends Action implements
        IWorkbenchWindowPulldownDelegate, IMenuCreator, IObserver {

    private IAction action;
    private Menu menu;
    public boolean enabled = false;

    public ShortcutsAction() {
        super();
        Activator.getDefault().addObserver(this);
    }

    @Override
    public void selectionChanged(IAction action, ISelection selection) {
        // Change action object instance at first selection
        if (action != this.action) {
            this.action = action;
        }
        // If property enabled is true, enable this action
        if (enabled) {
            action.setEnabled(true);
        } else {
            action.setEnabled(false);
        }
    }

    [...]

    @Override
    public void update(IObservable obs, Object obj) {
        this.enabled = true;
        ConsoleHandler.logInfo("Shortcut enabled");
        action.setEnabled(true);
    }
}

结论

我得到了我想要的东西:

  1. 加载时,我的操作已停用
  2. 由于我的插件已初始化,我的操作已启用
  3. 谢谢。

1 个答案:

答案 0 :(得分:1)

<objectState><objectClass>测试当前所选对象的状态和类动作处理程序类。

我认为您必须使用<systemProperty>来检查您设置的属性。或使用selectionChanged方法启用IAction

selectionChanged方法是您使用IActionDelegate间接实现的IWorkbenchWindowPulldownDelegate接口的一部分:

public void selectionChanged(IAction action, ISelection selection)

action参数是实际操作,请调用action.setEnabled(true)以启用操作。