编辑:已解决
背景
我已经实现了一个 eclipse 插件(在 indigo,3.7.2 上),它在栏菜单中提供了一个新图标。
这个新 Action 在 eclipse 启动几秒钟后完全初始化(一些配置文件是从我的 maven 存储库加载的)。
我正在尝试禁用此操作,直到我的激活器完成初始化。
我在找什么
初始化前
初始化后
我已经做了什么
我为我的操作添加了启用测试。仅当我的插件被激活时,我的操作才会被启用。
<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);
}
}
结论
我得到了我要找的东西:
- 加载时,我的操作被禁用
- 由于我的插件已初始化,所以我的操作已启用
谢谢。
最佳答案
<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/