在不更改提供程序的情况下修改Eclipse EMF编辑器新子菜单

时间:2013-07-24 08:39:12

标签: java eclipse-rcp eclipse-emf

我在修改EMF自动创建的“New Child”菜单时遇到问题,无法为某些类型的项目创建子菜单。我发现,默认情况下,管道符号用作分隔符,因此名为Hamburger | Megaplusbig的子对象会出现Hamburger子菜单。 This page似乎建议在相关项目提供商中覆盖getCreateChildText()是一个不错的选择。

我想要的是某些类型的模型项目出现在子菜单中,为了达到这个目的,我只需要确保MySubmenu |被添加到名称前面。我的问题是我在Eclipse中编辑的模型的类是在一个单独的Jar文件中,我不能(或者实际上不应该)修改。

我尝试以另一种方式实现这一点并没有太多运气。我的另一个尝试是扩展BasicModelEditActionProvider并覆盖其fillContextMenu()updateActions()方法。后者通过对BasicActionProvider.extractSubmenuActions()的另一次调用来创建子菜单,我再次可以覆盖它,但到那时,关于我的模型对象的信息在抽象中丢失了。该方法适用于IAction列表,即使我将操作转换为StaticSelectionCommandAction(它始终是),command字段也没有公共getter,而且只能通过{{}的字段我在某处看到了实际的EMF EObject。

我正在寻找一个不太难看的解决方案,不涉及修改Jar文件中的项目提供程序,除非我真的必须这样做。

1 个答案:

答案 0 :(得分:0)

所以最后,唯一有效的解决方案是不幸的黑客攻击。我在我的extractSubmenuActions()中覆盖BasicModelEditActionProvider,改变它以给我我想要的子菜单。丑陋的部分是找到要添加的EMF对象,为此我不幸地使用反射来强制读取正常抽象的command的受保护IAction字段。

这有力地破坏了封装,但是由于我的代码的外部限制,我无法修改模型的项目提供者。反射解决方案并不漂亮,但效果很好。