二、新建连接模型
新建连接模型,过程大同小异。此时需要在结点模型上安装Policy,Policy的类型为:GraphicalNodeEditPolicy。
在HelloWorldEditPart的createEditPolicies()方法里追加:
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new HelloWorldGraphicalNodeEditPolicy());
其中HelloWorldGraphicalNodeEditPolicy是我们的Policy实现类。还是一样,先完成Command,再回过头来完成Policy。
要成功的实现一个连接,首先我们知道至少需要有三个对象:连接线、源结点和目标结点。所以我们的command的可以如下实现: 这时显示出来的效果和上一节一样:能创建,不显示。还是因为没刷新的问题。增加一个刷新事监听即可。如下:
public class AddConnectionCommand extends Command {
private AbstractConnectionModel connection;
public AddConnectionCommand(AbstractConnectionModel connection) {
super();
this.connection = connection;
}
public void setSrc(HelloWorldModel src) {
connection.setSrc(src);
}
public void setTarget(HelloWorldModel target) {
connection.setTarget(target);
}
public void setConnection(AbstractConnectionModel connection) {
this.connection = connection;
}
@Override
public void execute() {
connection.attachSource();
connection.attachTarget();
}
@Override
public void undo() {
connection.deattachTarget();
connection.deattachSource();
}
}
然后我们实现我们的Policy。这里要分两步进行,首先是完成源结点的连接,然后就完成目标结点的连接,代码如下:
@Override
protected Command getConnectionCompleteCommand(
CreateConnectionRequest request) {
AddConnectionCommand command = (AddConnectionCommand) request
.getStartCommand();
command.setTarget((HelloWorldModel) getHost().getModel());
return command;
}
@Override
protected Command getConnectionCreateCommand(CreateConnectionRequest request) {
AddConnectionCommand command = new AddConnectionCommand(
(AbstractConnectionModel) request.getNewObject());
command.setSrc((HelloWorldModel) getHost().getModel());
request.setStartCommand(command);
return command;
}
修改HelloWorldModel里与连接相关的四个方法如下:
public static final String P_SOURCE = "p_source";
public static final String P_TARGET = "p_target";
public void addInput(AbstractConnectionModel model) {
if (!inputs.contains(model)) {
inputs.add(model);
firePropertyChange(P_TARGET, null, model);
}
}
public void addOut(AbstractConnectionModel model) {
if (!outputs.contains(model)) {
outputs.add(model);
firePropertyChange(P_SOURCE, null, model);
}
}
public void removeInput(AbstractConnectionModel model) {
if (inputs.contains(model)) {
inputs.remove(model);
firePropertyChange(P_TARGET, model, null);
}
}
public void removeOut(AbstractConnectionModel model) {
if (outputs.contains(model)) {
outputs.remove(model);
firePropertyChange(P_SOURCE, model, null);
}
}
然后再修改对应的EditPart的propertyChange()方法如下:
public void propertyChange(PropertyChangeEvent evt) {
if(evt.getPropertyName().equals(HelloWorldModel.P_CONSTRAINT)){
refreshVisuals();
}else if(evt.getPropertyName().equals(HelloWorldModel.P_SOURCE)){
refreshSourceConnections();
}else if(evt.getPropertyName().equals(HelloWorldModel.P_TARGET)){
refreshTargetConnections();
}
}
最后试一下效果:
图三
小提示:EditPolicy的getHost()方法返回的是安装这个Policy的那个对象。也就是安装这个Policy的那个EditPart。