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