目标:1. 删除连接
2. 连接的重新定向
3. 显示与操作连接的控制点bendpoint
删除连接的要点:
删除连接时产生REQ_DELETE请求。使用ConnectionEditPolicy重载getDeleteCommand方法创建相应的command来处理这种请求。这个EditPolicy安装在连接控制器中(ConnectionEditPart),Role是EditPolicy.CONNECTION_ROLE。
它非常类似与删除HelloModel,下文摘自前面的笔记:
“用户发出Delete命令时,会生成REQ_DELETE请求,GEF提供了ComponentEditPolicy来处理REQ_DELETE类型的请求,重载createDeleteCommand方法使其生成DeleteCommand。”“Role是EditPolicy.COMPONENT_ROLE。”
重新定向连接的要点:
首先要把ConnectionEndpointEditPolicy安装到连接控制器中,以使得可以选中连接的端点(是锚点吗?)
installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE, new CustomConnectionEndpointEditPolicy());
连接的重新定向涉及到节点,所以和创建连接一样交给GraphicalNodeEditPolicy负责。重载getReconnectSourceCommand方法和getReconnectTargetCommand方法创建恰当的命令。
显示与操作连接的控制点的要点:
ConnectionRouter接口用来确定连接的路径(即连接是怎样走的,或者说怎么布线的)。BendpointConnectionRouter是该接口的一个实现类,它使用一系列的连接的控制点bend points来确定连接的路径。
首先要为连接对应的figure设置ConnectionRouter:
polylineConnection.setConnectionRouter(new BendpointConnectionRouter());
我们的连接模型需要管理这些bend points,并且在它们发生改变时通知控制器。控制器要能接受这些通知,刷新视图。
protected void refreshBendpoints() {
List bendpoints = ((AbstractConnectionModel) getModel()).getBendpoints();
List constraint = new ArrayList();
for (int i = 0; i < bendpoints.size(); i++) {
constraint.add(new AbsoluteBendpoint((Point) bendpoints.get(i)));
}
getConnectionFigure().setRoutingConstraint(constraint);
}
(教程中说重载refreshVisuals方法调用refreshBendpoints是为了防止NullPointerException,这是不正确的。实际的用处是为了打开editor时就能显示正确的连接路径,可以想象一下打开一个保存了的设置过bendpoints的文件)
BendpointEditPolicy用来管理控制点bend points的操作。它需要安装到ConnectionEditPart中,Role是EditPolicy.CONNECTION_BENDPOINTS_ROLE。
控制点是有顺序index的。这很容易理解,因为画线时就是按照起点-各控制点-终点的顺序连接各个点的。
source----(index 0 if insert here)----bend 0----(index 1)----bend 1----(index 2)----bend 2----(index 3)----target
已经存在的bend points的index用蓝色表示,可新建的bend point位置就是括号表示的4个位置。删除和重设bend point时request里面的index值就是蓝色的index值;新建bend point时request里面得index值就是对应位置上橙色的index值。
最后一点是关于相对位置与绝对位置的。上面代码中我们创建了AbsoluteBendpoint作为constraint,它记录的是绝对位置。当我们操作控制点时,我们需要的是相对位置,所以必须通过Connection类提供的translateToRelative方法转化为相对位置。(这段我自己都不相信= =!!,等研究过draw2d再回过头来看吧)