昨天一哥们碰到一个问题,他用gmf做的编辑器有个connection,这个connection很特殊,它的source和target都是connection,这个connection删除的时候只是不显示了,
下次打开diagram的时候还是存在的,经观察,点击右键的时候有两个删除选项分别是:
delete From Diagram(别的点完之后这个是disable的)和delete From Model。而点delete的时候默认执行的是delete From Diagram,
这样不会删除对应模型,也就导致了上面的问题。我先是想办法让与delete From Diagram对应的Action不被加到右键
菜单上(如果能让它的etCommand()方法返回null问题也解决了,但是没做到。。。),用如下扩展点
<extension point="org.eclipse.gmf.runtime.common.ui.services.action.contributionItemProviders">
<?gmfgen generated="true"?>
<contributionItemProvider
class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContributionItemProvider"
checkPluginLoaded="false">
<Priority name="Low"/>
<popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
<popupStructuredContributionCriteria objectClass="kmPkg.diagram.edit.parts.KAssociationBetweenVariablesEditPart"/>
<popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
</popupContribution>
</contributionItemProvider>
</extension>
发现那个菜单是没了,但问题依然没有解决。于是继续debug,看看别的按delete的时候和这个按delete的时候到底有什么区别,经过了一夜加一个早上的奋战终于发现,原因出在,别的Connection删除的时候ConnectionEditPolicy#shouldDeleteSemantic()返回的是true,也就是删除对应模型的意思,而这个删除的时候
上面的方法返回false。。。。
于是在Connection对应的EditPart上重新安装如下policy
protected void createDefaultEditPolicies() {
super.createDefaultEditPolicies();
installEditPolicy(EditPolicy.CONNECTION_ROLE,
new MyConnectionEditPolicy());
//install other policy
}