今天搞Eclipse的ActionSet, 搞得我晕头转向....
至今不能明白的问题是, 我在ActionSet里面声明的Action居然在程序中无法拿到, 郁闷无比.
由于我的需求是Windows的菜单中的某些菜单会在NavigatorView中被Popup重用, 因此在写View的代码的时候需要用代码找到这些Action, 但是十分遗憾, 最后我也没有成功.
于是找到替代的方法, 不过很麻烦.
有个插入点是org.eclipse.ui.popupMenus, 这个插入点可以插入到View, Editor中去, 或者还有一种用法就是指定某种Object的Popup, 但是这个我还没有用到. 据说是比如选择IProject(我用JDT做例子来讲), 可以弹出配置的菜单. 选择*.xml, 又可以弹出另外的配置菜单. 诸如此类.
还是说说插入到View/Editor的弹出菜单吧. 先前我一直认为适合Perspective的ActionSet是重用的, 但是根据今天的研究发现可能不是这样的. 举个例子, 大家都可以看到File菜单里面的Refresh菜单和ResourceNavigator里面的Refresh菜单, 仔细看有点不一样的, 就是File菜单里面的Refresh没有图标! 而如果是一个Action的话, 应该是一致的. 同样的情况可以在Rename和Move中发现, Accelator和Mnomenic都不一样, 如果是同一个Action, 这种情况肯定是不可能的.
说了这么多, 还是写写插入点的使用吧.
在org.eclipse.ui.popupMenus中添加一个View*****, 后面的单词忘了....E文不好. id不说了, 唯一标识. targetID是你要将弹出菜单插入到的View或者editor的id. 然后在这个东西下面加menu/action, 另外有个visibility的东西, 属性挺多, 可以看看eclipse的帮助. 主要就是说这个菜单什么时候出现或者不出现之类的事情. 加menu/aciton的方式和actionSet基本一致. 不同之处在于没有toolbarpath, 这个很自然, 弹出哪里还有工具栏? 另外menubarpath也有一些小区别. actionset中menu没有menupath就是顶级菜单. 而这里没有就是第一个popup了. 如果你要在popup上显示separator, 那么设置path不同就行了, 而不同于actionSet中需要添加separator. 因为windows menubar一般不用separator. 子菜单的写法和actionSet完全一致, 不说了.
另外要注意的就是在View的代码里面要做一些相应的处理, 如下:
这些代码非常重要, 不写你的popup出不来....
附一段XML
结构就是rcp.menu1下有个子菜单rcp.action1
rcp.action2和rcp.menu1在同一级别, 中间有个Separator.
至今不能明白的问题是, 我在ActionSet里面声明的Action居然在程序中无法拿到, 郁闷无比.
由于我的需求是Windows的菜单中的某些菜单会在NavigatorView中被Popup重用, 因此在写View的代码的时候需要用代码找到这些Action, 但是十分遗憾, 最后我也没有成功.
于是找到替代的方法, 不过很麻烦.
有个插入点是org.eclipse.ui.popupMenus, 这个插入点可以插入到View, Editor中去, 或者还有一种用法就是指定某种Object的Popup, 但是这个我还没有用到. 据说是比如选择IProject(我用JDT做例子来讲), 可以弹出配置的菜单. 选择*.xml, 又可以弹出另外的配置菜单. 诸如此类.
还是说说插入到View/Editor的弹出菜单吧. 先前我一直认为适合Perspective的ActionSet是重用的, 但是根据今天的研究发现可能不是这样的. 举个例子, 大家都可以看到File菜单里面的Refresh菜单和ResourceNavigator里面的Refresh菜单, 仔细看有点不一样的, 就是File菜单里面的Refresh没有图标! 而如果是一个Action的话, 应该是一致的. 同样的情况可以在Rename和Move中发现, Accelator和Mnomenic都不一样, 如果是同一个Action, 这种情况肯定是不可能的.
说了这么多, 还是写写插入点的使用吧.
在org.eclipse.ui.popupMenus中添加一个View*****, 后面的单词忘了....E文不好. id不说了, 唯一标识. targetID是你要将弹出菜单插入到的View或者editor的id. 然后在这个东西下面加menu/action, 另外有个visibility的东西, 属性挺多, 可以看看eclipse的帮助. 主要就是说这个菜单什么时候出现或者不出现之类的事情. 加menu/aciton的方式和actionSet基本一致. 不同之处在于没有toolbarpath, 这个很自然, 弹出哪里还有工具栏? 另外menubarpath也有一些小区别. actionset中menu没有menupath就是顶级菜单. 而这里没有就是第一个popup了. 如果你要在popup上显示separator, 那么设置path不同就行了, 而不同于actionSet中需要添加separator. 因为windows menubar一般不用separator. 子菜单的写法和actionSet完全一致, 不说了.
另外要注意的就是在View的代码里面要做一些相应的处理, 如下:
public
void
createPartControl(Composite parent) {
MenuManager manager = new MenuManager( " #Popup " ); // popup随便什么字符串, 不知道有没有什么关系.
Menu menu = manager.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(manager, viewer);
}
MenuManager manager = new MenuManager( " #Popup " ); // popup随便什么字符串, 不知道有没有什么关系.
Menu menu = manager.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(manager, viewer);
}
附一段XML
<
extension
point ="org.eclipse.ui.popupMenus" >
< viewerContribution
id ="rcp.viewerContribution1"
targetID ="rcp.viewerContribution1" >
< menu
id ="rcp.menu1"
label ="rcp.menu1"
path ="abc" >
< separator name ="rcp.separator1" />
</ menu >
< action
class ="rcp.Action1"
id ="rcp.action1"
label ="rcp.action1"
menubarPath ="rcp.menu1/rcp.separator1" />
< action
class ="rcp.Action2"
id ="rcp.action2"
label ="rcp.action2"
menubarPath ="def" />
</ viewerContribution >
</ extension >
point ="org.eclipse.ui.popupMenus" >
< viewerContribution
id ="rcp.viewerContribution1"
targetID ="rcp.viewerContribution1" >
< menu
id ="rcp.menu1"
label ="rcp.menu1"
path ="abc" >
< separator name ="rcp.separator1" />
</ menu >
< action
class ="rcp.Action1"
id ="rcp.action1"
label ="rcp.action1"
menubarPath ="rcp.menu1/rcp.separator1" />
< action
class ="rcp.Action2"
id ="rcp.action2"
label ="rcp.action2"
menubarPath ="def" />
</ viewerContribution >
</ extension >
结构就是rcp.menu1下有个子菜单rcp.action1
rcp.action2和rcp.menu1在同一级别, 中间有个Separator.