`
liugang594
  • 浏览: 979730 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

GEF理解系列五(2)

    博客分类:
  • GEF
 
阅读更多

二、新建连接模型

新建连接模型,过程大同小异。此时需要在结点模型上安装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();

            }

      }

最后试一下效果:

addConnection

图三

 小提示:EditPolicy的getHost()方法返回的是安装这个Policy的那个对象。也就是安装这个Policy的那个EditPart。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics