java - Eclipse 插件 : disable/enable dynamically an action from main menubar

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

编辑:已解决

背景

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

这个新 Action 在 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. 由于我的插件已初始化,所以我的操作已启用

谢谢。

最佳答案

<objectState><objectClass>测试当前选定对象的状态和类而不是操作处理程序类。

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

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

public void selectionChanged(IAction action, ISelection selection)

action参数为实际 Action ,调用action.setEnabled(true)启用操作。

关于java - Eclipse 插件 : disable/enable dynamically an action from main menubar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24571372/

相关文章:

java - Android 中将首先处理哪些代码?

Eclipse 插件 junit-tools 使用 @MethodRef 生成代码,但未定义

java - Eclipse 插件中的 Postgres 驱动程序不断出现找不到类异常

从 int 中减去时,Java 代码不运行

java - 将 Netbeans 项目移至 Windows 10 家庭版

java - m2e 插件 - Eclipse - 创建 Java 类和包。不被视为项目的一部分

java - Android:在 Eclipse 上安装库

java - 是否可以在 Eclipse 插件开发中使用 JTree 而不是标准 JFace 树?

Java : how to get the active editor in a thread?

java - 如何设置方法优先级以便在运行时从工作线程更新 Java-Gnome GUI 组件