GEF中连接重定向的一点心得

GEF连接重新定向与命令实现
本文详细介绍了如何在GEF中实现连接的重新定向功能,包括删除连接、选择连接以及通过定制编辑策略和命令来操作连接源与目标端。通过创建特定的编辑策略和命令,实现在同一图形上重新定向连接的源端,同时控制鼠标形状以避免误导用户。最终解决了连接重新定向时可能出现的问题。

接触GEF有一段时间了,跟着鬼子写的那个小教程,确实有很多收获。

在GEF中经常用到连接,包括连接的创建、连接的删除以及连接的重新定向等。

1、想要删除或者对连接重新定向,首先要选中连接。在GEF中,使用ConnectionEndpointEditPolicy的派生类来实现。创建一个CustomConnectionEndpointEditPolicy,它继承自ConnectionEndpointEditPolicy。然后将CustomConnectionEndpointEditPolicy安装到我们的连接所对应的EditPart中。本例中,为所有连接创建了一个CustomAbstractConnectionEditPart,在其中添加代码:

public class CustomAbstractConnectionEditPart extends
        AbstractConnectionEditPart {
    @Override
    protected void createEditPolicies() {
        installEditPolicy(EditPolicy.CONNECTION_ROLE,
                new CustomConnectionEditPolicy());
        installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE,
                new CustomConnectionEndpointEditPolicy());
    }
}

2、在创建连接的时候,创建了一个CustomGraphicalNodeEditPolicy,它继承自GraphicalNodeEditPolicy。其中自动生成的getReconnectTargetCommand与getReconnectSourceCommand方法就是用来重新定向的。

3、我们创建一个命令ReconnectSourceConnectionCommand,用于拖动句柄重新定向连接的Source端:

public class ReconnectSourceConnectionCommand extends Command {
    private AbstractConnectionModel connection;
    private RectangleModel source;
    private RectangleModel oldSource;
    public ReconnectSourceConnectionCommand(Object object,
            Object newSource) {
        super();
        this.connection = (AbstractConnectionModel) object;
        this.source = (RectangleModel) newSource;
    }
    public void execute() {
        oldSource = connection.getSource();
        connection.detachSource();
        connection.setSource(source);
        connection.attachSource();
    }
    public void undo() {
        source = connection.getSource();
        connection.detachSource();
        connection.setSource(oldSource);
        connection.attachSource();
    }
}
4、在getReconnectSourceCommand方法调用上面的Command:
protected Command getReconnectSourceCommand(ReconnectRequest request) {
    ReconnectSourceConnectionCommand command = new ReconnectSourceConnectionCommand(
            request.getConnectionEditPart().getModel(), getHost().getModel());
    return command;
}

这样,就可以重新定向了。然而,运行时却发现了一个问题:上边的重新定向可以允许连接的Source与Target在同一个图形上:

为此,我在ReconnectSourceConnectionCommand中修改代码:

public void execute() {
    if(source.equals(connection.getTarget()))return ;
    oldSource = connection.getSource();
    connection.detachSource();
    connection.setSource(source);
    connection.attachSource();
}

这样倒是不会出现上图的情形了,但是还会出现另一个问题:当拖动连接的Source到Target所在的图形时,鼠标形状是+号,给人一种可以执行的错觉。

我突然明白了,一般创建Command时都有一个canExecute()方法用来判断能否执行,原来,它还能控制鼠标的图形。在ReconnectSourceConnectionCommand中添加代码:

public boolean canExecute() {
    if (source == null)
        return false;
    if (source.equals(connection.getTarget()))
        return false;
    return true;
}

这样,在执行就好了:

重定向Target与重定向Source类似。

 

转载于:https://my.oschina.net/plumsoft/blog/28506

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值