I have two modules A and B where B should bring some extensions to A.
The module A is a source of custom Nodes and I need to add a new Action into the context menu of such nodes.
How can I do that in module B declaratively? I looked at several samples and Wiki, but nowhere found a clear answer on this question.
Thanks a lot for any help.
Vlad.
> Hi,
>
> I have two modules A and B where B should bring some extensions to A.
>
> The module A is a source of custom Nodes and I need to add a new Action into the context menu of such nodes.
> How can I do that in module B declaratively? I looked at several samples and Wiki, but nowhere found a clear answer on this question.
>
In A's Node implementation:
public Action[] getActions( boolean context ) {
List<Action> actions = new ArrayList<Action>();
for (Object o :
Lookups.forPath("MyActionsFolder").lookupAll(Object.class)) {
if (o instanceof Action) {
actions.add((Action) o);
} else if (o instanceof JSeparator) {
actions.add(null);
}
}
return actions.toArray(new Action[actions.size()]);
}
In B's layer file:
<folder name="MyActionsFolder">
<file name="MyBeeAction.instance"/>
</folder>
You've got the idea.
> Thanks a lot for any help.
>
> Vlad.
另外,为将当前所选结点的信息传递给MyBeeAction:
1 在A的Node实现中稍微修改一下:
PeerInfo peerInfo = getLookup().lookup(PeerInfo.class); // 假设peerInfo为当前选中结点信息
Action[] actions = ... // 获得Action数组(代码略)
for(int i=0; i<actions.length; i++) {
actions[i].putValue("PEERINFO", peerInfo);
}
return actions;
2 在 B的Action中接收
public void actionPerformed(ActionEvent e) {
PeerInfo = (PeerInfo)getValue("PEERINFO");
// other stuff...
}
-----------------------------------------------------------------------------------------------------------------------
上面只是一个临时的解决方式,估计Action类中在设计putValue和getValue时的本意并不是这样的。
还没有找到优雅一点的解决方式。
-----------------------------------------------------------------------------------------------------------------------
在《NetBeans Platform 6.9 Developer's Guide》中发现一条线索,似乎org.openide.util.Utilities.actionsGlobalContext就是干这个用的。
The static method Utilities.actionsGlobalContext() gives you access to the Lookup of whichever TopComponent currently is the Activated TopComponent.
As the user can only work on one TopComponent at a time, there is always at most one active TopComponent. With that in mind, you never needed to merge the Lookups of the two TopComponents at all.
尚未测试,也许我的理解有错误。
-------------------------------------------------------------------------------------------------------------------------
另外,在该书P143页有一段EditAction的代码:
private Lookup.Result<Task> result;
private JButton toolbarBtn;
public EditAction() {
this(Utilities.actionsGlobalContext());
}
public EditAction(Lookup lookup) {
super("Edit Task...", new ImageIcon("com/netbeansrcp/taskactions/Universal.png")));
this.result = lookup.lookupResult(Task.class);
this.result.addLookupListener(this);
this.resultChanged(new LookupEvent(result);
}
public void actionPerformed(ActionEvent arg0) {
if(null != this.result && 0<this.result.allInstances().size()) {
Task task = this.result.allInstances().iterator().next();
EditAction.openInTaskEditor(task);
}
// ...
}