今天搞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
<
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.
至今不能明白的问题是, 我在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
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
结构就是rcp.menu1下有个子菜单rcp.action1
rcp.action2和rcp.menu1在同一级别, 中间有个Separator.