0

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

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

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

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

4

1 回答 1

0

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

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

于 2013-08-16T17:10:26.230 回答