[导入]GEF理解系列五(2)


网站: JavaEye  作者: liugang594  链接:http://liugang594.javaeye.com/blog/152092  发表时间: 2007年12月31日

声明:本文系JavaEye网站发布的原创博客文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!

二、新建连接模型

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


本文的讨论也很精彩,浏览讨论>>


JavaEye推荐




文章来源:http://liugang594.javaeye.com/blog/152092

posted on 2007-12-31 22:11  刘刚  阅读(181)  评论(0)    收藏  举报

导航