0
点赞
收藏
分享

微信扫一扫

中国式的emf(gef)建模,带来的问题


中国式的emf(gef)建模,带来的问题,,以下是中国式的建模

--------------------------------------------- 

<?xml version="1.0" encoding="UTF-8"?> 

<action:Diagram xmlns:action="http://www.j.com/action"> 

 <logic name="业务逻辑1" description="" location="Point(290, 76)" size="Dimension(150, 40)" logicClass=""> 

 <link to="//@logic.1"/> 

 <link to="//@logic.2"/> 

 </logic> 

 <logic name="业务逻辑2" description="" location="Point(278, 273)" size="Dimension(150, 40)" logicClass=""/> 

 <logic name="业务逻辑" description="" location="Point(61, 263)" size="Dimension(150, 40)" logicClass=""/> 

</action:Diagram>


----------------------
从模型看是很票啦的,<link to="//@logic.1"/>指向<logic name="业务逻辑2" description="" location="Point(278, 273)"

但到了gef编码的时候,就容易出现编码了,因为你在建立连线的时候,在命令里面一般是这样实现:

link = ActionFactory.eINSTANCE.createLink(); 

 link.setTo(target); 

 source.getLink().add(link);



注意这里,只是设置source.getLink().add(link); 就可以满足模型的需求了,当代码执行到source.getLink().add(link);的时候,就会出发souce这个监听器,,然后就是刷新连接,
但这个刷新连接都是source刷新,就算你执行了refreshTargetConnections也没用,因为这个执行的的对象是source对象editpart,而不是taget,,

那怎样触发taget所对应的editpart刷新呢?

如果你看一些经典的例子,你会发现别人的连线命令是这样:
source.getOutgoingConnections().add(connection);
target.getIncomingConnections().add(connection);

学别人,就在画线命令里面多加一项对taget模型的改动代码即可,,
例如:target.setId(target.getId()); 就是拿些无关重要的熟悉(最好是少被操作的属性)重置下值,既可以触发和source一样的动作,,也会走到notifyChanged方法上面去,然后多加一个判断:
case ActionPackage.NODE__ID:
refreshTargetConnections();
break;

即可。
感觉模型文件(指生成的结果那个,例如上面那个)和代码,不能都那么完美,要么,把中国式的模型改改,这样代码就没那么别扭,要么就类似我的做法。

举报

相关推荐

0 条评论