流程设计器开发五(拐点部分)
2007-03-17 19:56
429 查看
这一节主要介绍如何在转移上增加拐点,要实现这功能,首先要修改转移的模型,增加一个列表属性,维护转移上所有的拐点,转移模型为实现拐点功能而增加的代码如下:
public static final String BENDPOINT_PROP = "Transition.BendPoint";
private List bendPoints = new ArrayList();//存放转移上的所有拐点的坐标
//向转移上增加拐点(拐点在转移上是有顺序的)
//index 拐点的顺序
//point 观点的坐标
public void addBendPoint(int index,Point point){
if(point == null){
throw new IllegalArgumentException();
}
bendPoints.add(index,point);
//通知转移控制器,转移的拐点属性变化了,让它刷新视图
firePropertyChange(BENDPOINT_PROP, null, point);
}
//从转移上删除指定位置的拐点
public void removeBendPoint(int index){
if(index<0){
throw new IllegalArgumentException();
}
bendPoints.remove(index);
//通知转移控制器,转移的拐点属性变化了,让它刷新视图
firePropertyChange(BENDPOINT_PROP, null, null);
}
//得到转移上的拐点列表
public List getBendPoints() {
return new ArrayList(bendPoints);
}
要让转移控制器能接受增加拐点的请求,应该在转移的控制器上安装相应的策略,代码如下:
//add or remove or move the BendPoint
installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE,new TransitionBendpointEditPolicy());
在这里安装了TransitionBendpointEditPolicy策略,这个策略使的转移控制器能接受增加,删除和移动拐点的请求,这个类的代码如下:
package com.example.workflow.policy;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editpolicies.BendpointEditPolicy;
import org.eclipse.gef.requests.BendpointRequest;
import com.example.workflow.commands.AbstractBendpointCommand;
import com.example.workflow.commands.CreateBendpointCommand;
import com.example.workflow.commands.DeleteBendpointCommand;
import com.example.workflow.commands.MoveBendpointCommand;
import com.example.workflow.model.Transition;
/**
* EditPolicy for the BendPoint used by this edit part.
*/
public class TransitionBendpointEditPolicy extends BendpointEditPolicy{
/**新建拐点 */
protected Command getCreateBendpointCommand(BendpointRequest request) {
Point point = request.getLocation(); //得到拐点的坐标
int index = request.getIndex(); //得到拐点的顺序
Transition tran = (Transition)getHost().getModel();//得到要增加拐点的转移
//创建一个增加拐点的命令,给这命令设置相应的参数
AbstractBendpointCommand cmd = new CreateBendpointCommand();
cmd.setIndex(index);
cmd.setPoint(point);
cmd.setTran(tran);
return cmd;
}
/**删除拐点 */
protected Command getDeleteBendpointCommand(BendpointRequest request) {
int index = request.getIndex();//得到拐点的顺序
Transition tran = (Transition)getHost().getModel();//得到要删除拐点的转移
//创建一个删除拐点的命令,给这命令设置相应的参数
AbstractBendpointCommand cmd = new DeleteBendpointCommand();
cmd.setIndex(index);
cmd.setTran(tran);
return cmd;
}
/**移动拐点 */
protected Command getMoveBendpointCommand(BendpointRequest request) {
int index = request.getIndex();//得到拐点的顺序
Point point = request.getLocation(); //得到拐点的坐标
Transition tran = (Transition)getHost().getModel();//得到要移动拐点的转移
//创建一个移动拐点的命令,给这命令设置相应的参数
AbstractBendpointCommand cmd = new MoveBendpointCommand();
cmd.setIndex(index);
cmd.setPoint(point);
cmd.setTran(tran);
return cmd;
}
}
在上面的策略类中,我们覆盖了父类的三个方法,在这三个方法中,我们分别新建了CreateBendpointCommand,DeleteBendpointCommand,MoveBendpointCommand命令,由于这三个类有一些公共属性和方法,因此我们进行了抽象,把公共属性和方法抽象到父类中,这几个命令的代码如下:
父类:
package com.example.workflow.commands;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.commands.Command;
import com.example.workflow.model.Transition;
public class AbstractBendpointCommand extends Command{
protected int index;//拐点的次序
protected Transition tran;//转移对象
protected Point point;//拐点的绝对位置
//命令的重做方法
public void redo(){
execute();
}
public void setPoint(Point point) {
this.point = point;
}
public void setIndex(int index) {
this.index = index;
}
public void setTran(Transition tran) {
this.tran = tran;
}
}
新建拐点命令
[align=left]package com.example.workflow.commands;[/align]
[align=left] [/align]
[align=left]/**createabendpointforthetransition*/[/align]
[align=left]publicclass CreateBendpointCommand extends AbstractBendpointCommand{ [/align]
[align=left]//如果转移对象或者拐点的坐标为空,不能执行这个命令[/align]
[align=left] publicboolean canExecute() { [/align]
[align=left] return (tran != null) && (point != null);[/align]
[align=left] }[/align]
[align=left]//命令的执行方法,在转移维护的拐点列表中增加拐点信息,拐点位置作为索引,拐点坐标作//为值[/align]
[align=left] publicvoid execute() {[/align]
[align=left] tran.addBendPoint(index, point); [/align]
[align=left] }[/align]
[align=left]//命令的撤销,从在转移维护的拐点列表中删除指定位置的拐点[/align]
[align=left] publicvoid undo() {[/align]
[align=left] tran.removeBendPoint(index);[/align]
[align=left] }[/align]
[align=left]//标志执行命令的名称[/align]
[align=left] public String getLabel() { [/align]
[align=left] return"create bendpoint";[/align]
[align=left] } [/align]
[align=left] [/align]
}
删除拐点的命令
[align=left]package com.example.workflow.commands;[/align]
[align=left] [/align]
[align=left]import org.eclipse.draw2d.geometry.Point;[/align]
[align=left] [/align]
[align=left]/**deleteabendpointforthetransition*/[/align]
[align=left]publicclass DeleteBendpointCommand extends AbstractBendpointCommand{[/align]
[align=left] //如果转移对象为空,不能执行这个命令[/align]
[align=left] publicboolean canExecute() { [/align]
[align=left] return (tran != null);[/align]
[align=left] }[/align]
[align=left]//首先取出要删除拐点的坐标,以备撤销操作时使用,然后再从列表中删除指定位置的拐点[/align]
[align=left] publicvoid execute() {[/align]
[align=left] point = (Point)tran.getBendPoints().get(index);[/align]
[align=left] tran.removeBendPoint(index);[/align]
[align=left] }[/align]
[align=left]//撤销操作,在列表的指定位置,增加刚才删除的拐点[/align]
[align=left] publicvoid undo() {[/align]
[align=left] tran.addBendPoint(index, point);[/align]
[align=left] } [/align]
[align=left] //标志执行命令的名称[/align]
[align=left] public String getLabel() { [/align]
[align=left] return"delete bendpoint";[/align]
[align=left] } [/align]
}
移动拐点的命令
[align=left]package com.example.workflow.commands;[/align]
[align=left] [/align]
[align=left]import org.eclipse.draw2d.geometry.Point;[/align]
[align=left] [/align]
[align=left]/**deleteabendpointforthetransition*/[/align]
[align=left]publicclass MoveBendpointCommand extends AbstractBendpointCommand{[/align]
[align=left] //移动之前拐点的坐标[/align]
[align=left] private Point oldPoint = null;[/align]
[align=left]//如果转移对象或者拐点的坐标为空,不能执行这个命令[/align]
[align=left] publicboolean canExecute() { [/align]
[align=left] return (tran != null) && (point != null);[/align]
[align=left] }[/align]
[align=left]//首先得到移动之前的拐点的坐标,以备撤销操作使用[/align]
[align=left]//然后再删除这个拐点[/align]
[align=left]//最后再增加新的拐点[/align]
[align=left] publicvoid execute() {[/align]
[align=left] oldPoint = (Point)tran.getBendPoints().get(index);[/align]
[align=left] tran.removeBendPoint(index);[/align]
[align=left] tran.addBendPoint(index, point);[/align]
[align=left] }[/align]
[align=left]//撤销操作,首先删除新的拐点,然后再增加上原来拐点[/align]
[align=left] publicvoid undo() {[/align]
[align=left] tran.removeBendPoint(index);[/align]
[align=left] tran.addBendPoint(index, oldPoint);[/align]
[align=left] } [/align]
[align=left] //标志执行命令的名称[/align]
[align=left] public String getLabel() { [/align]
[align=left] return"move bendpoint";[/align]
[align=left] } [/align]
}
以前我们新建转移时,都不用刷新转移的Figure,现在在转移上增加了拐点,要想显示出拐点的效果,就必须覆盖转移控制器的refreshVisuals方法,代码如下:
//因为在转移模型的addBendPoint和removeBendPoint方法中,都通知转移控制器
//转移的BENDPOINT_PROP属性发生变化,所以在这儿我们当
//变化属性的名称是BENDPOINT_PROP,我们刷新视图
public void propertyChange(PropertyChangeEvent evt) {
String prop = evt.getPropertyName();
if(Transition.BENDPOINT_PROP.equals(prop)){
refreshVisuals();
}
}
//刷新转移对应的视图,首先得到转移模型中的拐点列表,然后把每个拐点的坐标
//构造成AbsoluteBendpoint对象,放在一个新的列表中,然后设置转移图形的
//路由
protected void refreshVisuals() {
List constraint = new ArrayList();
List list = getCastedModel().getBendPoints();
for(int i=0;i<list.size();i++){
constraint.add(new AbsoluteBendpoint((Point)list.get(i)));
}
getConnectionFigure().setRoutingConstraint(constraint);
}
要想使转移视图展示出拐点,我们还必须修改createFigure方法,修改如下:
protected IFigure createFigure() {
PolylineConnection connection = (PolylineConnection) super.createFigure();
connection.setTargetDecoration(new PolygonDecoration()); // arrow at target endpoint
connection.setConnectionRouter(new BendpointConnectionRouter());//为了显示拐点,设置转移的路由
return connection;
}
这样,我们运行程序,就能看到转移上增加拐点的效果了,如图:
至此,拐点有关的内容,我们就介绍完了,下面我们介绍如何在为编辑器增加大纲视图。
public static final String BENDPOINT_PROP = "Transition.BendPoint";
private List bendPoints = new ArrayList();//存放转移上的所有拐点的坐标
//向转移上增加拐点(拐点在转移上是有顺序的)
//index 拐点的顺序
//point 观点的坐标
public void addBendPoint(int index,Point point){
if(point == null){
throw new IllegalArgumentException();
}
bendPoints.add(index,point);
//通知转移控制器,转移的拐点属性变化了,让它刷新视图
firePropertyChange(BENDPOINT_PROP, null, point);
}
//从转移上删除指定位置的拐点
public void removeBendPoint(int index){
if(index<0){
throw new IllegalArgumentException();
}
bendPoints.remove(index);
//通知转移控制器,转移的拐点属性变化了,让它刷新视图
firePropertyChange(BENDPOINT_PROP, null, null);
}
//得到转移上的拐点列表
public List getBendPoints() {
return new ArrayList(bendPoints);
}
要让转移控制器能接受增加拐点的请求,应该在转移的控制器上安装相应的策略,代码如下:
//add or remove or move the BendPoint
installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE,new TransitionBendpointEditPolicy());
在这里安装了TransitionBendpointEditPolicy策略,这个策略使的转移控制器能接受增加,删除和移动拐点的请求,这个类的代码如下:
package com.example.workflow.policy;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editpolicies.BendpointEditPolicy;
import org.eclipse.gef.requests.BendpointRequest;
import com.example.workflow.commands.AbstractBendpointCommand;
import com.example.workflow.commands.CreateBendpointCommand;
import com.example.workflow.commands.DeleteBendpointCommand;
import com.example.workflow.commands.MoveBendpointCommand;
import com.example.workflow.model.Transition;
/**
* EditPolicy for the BendPoint used by this edit part.
*/
public class TransitionBendpointEditPolicy extends BendpointEditPolicy{
/**新建拐点 */
protected Command getCreateBendpointCommand(BendpointRequest request) {
Point point = request.getLocation(); //得到拐点的坐标
int index = request.getIndex(); //得到拐点的顺序
Transition tran = (Transition)getHost().getModel();//得到要增加拐点的转移
//创建一个增加拐点的命令,给这命令设置相应的参数
AbstractBendpointCommand cmd = new CreateBendpointCommand();
cmd.setIndex(index);
cmd.setPoint(point);
cmd.setTran(tran);
return cmd;
}
/**删除拐点 */
protected Command getDeleteBendpointCommand(BendpointRequest request) {
int index = request.getIndex();//得到拐点的顺序
Transition tran = (Transition)getHost().getModel();//得到要删除拐点的转移
//创建一个删除拐点的命令,给这命令设置相应的参数
AbstractBendpointCommand cmd = new DeleteBendpointCommand();
cmd.setIndex(index);
cmd.setTran(tran);
return cmd;
}
/**移动拐点 */
protected Command getMoveBendpointCommand(BendpointRequest request) {
int index = request.getIndex();//得到拐点的顺序
Point point = request.getLocation(); //得到拐点的坐标
Transition tran = (Transition)getHost().getModel();//得到要移动拐点的转移
//创建一个移动拐点的命令,给这命令设置相应的参数
AbstractBendpointCommand cmd = new MoveBendpointCommand();
cmd.setIndex(index);
cmd.setPoint(point);
cmd.setTran(tran);
return cmd;
}
}
在上面的策略类中,我们覆盖了父类的三个方法,在这三个方法中,我们分别新建了CreateBendpointCommand,DeleteBendpointCommand,MoveBendpointCommand命令,由于这三个类有一些公共属性和方法,因此我们进行了抽象,把公共属性和方法抽象到父类中,这几个命令的代码如下:
父类:
package com.example.workflow.commands;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.commands.Command;
import com.example.workflow.model.Transition;
public class AbstractBendpointCommand extends Command{
protected int index;//拐点的次序
protected Transition tran;//转移对象
protected Point point;//拐点的绝对位置
//命令的重做方法
public void redo(){
execute();
}
public void setPoint(Point point) {
this.point = point;
}
public void setIndex(int index) {
this.index = index;
}
public void setTran(Transition tran) {
this.tran = tran;
}
}
新建拐点命令
[align=left]package com.example.workflow.commands;[/align]
[align=left] [/align]
[align=left]/**createabendpointforthetransition*/[/align]
[align=left]publicclass CreateBendpointCommand extends AbstractBendpointCommand{ [/align]
[align=left]//如果转移对象或者拐点的坐标为空,不能执行这个命令[/align]
[align=left] publicboolean canExecute() { [/align]
[align=left] return (tran != null) && (point != null);[/align]
[align=left] }[/align]
[align=left]//命令的执行方法,在转移维护的拐点列表中增加拐点信息,拐点位置作为索引,拐点坐标作//为值[/align]
[align=left] publicvoid execute() {[/align]
[align=left] tran.addBendPoint(index, point); [/align]
[align=left] }[/align]
[align=left]//命令的撤销,从在转移维护的拐点列表中删除指定位置的拐点[/align]
[align=left] publicvoid undo() {[/align]
[align=left] tran.removeBendPoint(index);[/align]
[align=left] }[/align]
[align=left]//标志执行命令的名称[/align]
[align=left] public String getLabel() { [/align]
[align=left] return"create bendpoint";[/align]
[align=left] } [/align]
[align=left] [/align]
}
删除拐点的命令
[align=left]package com.example.workflow.commands;[/align]
[align=left] [/align]
[align=left]import org.eclipse.draw2d.geometry.Point;[/align]
[align=left] [/align]
[align=left]/**deleteabendpointforthetransition*/[/align]
[align=left]publicclass DeleteBendpointCommand extends AbstractBendpointCommand{[/align]
[align=left] //如果转移对象为空,不能执行这个命令[/align]
[align=left] publicboolean canExecute() { [/align]
[align=left] return (tran != null);[/align]
[align=left] }[/align]
[align=left]//首先取出要删除拐点的坐标,以备撤销操作时使用,然后再从列表中删除指定位置的拐点[/align]
[align=left] publicvoid execute() {[/align]
[align=left] point = (Point)tran.getBendPoints().get(index);[/align]
[align=left] tran.removeBendPoint(index);[/align]
[align=left] }[/align]
[align=left]//撤销操作,在列表的指定位置,增加刚才删除的拐点[/align]
[align=left] publicvoid undo() {[/align]
[align=left] tran.addBendPoint(index, point);[/align]
[align=left] } [/align]
[align=left] //标志执行命令的名称[/align]
[align=left] public String getLabel() { [/align]
[align=left] return"delete bendpoint";[/align]
[align=left] } [/align]
}
移动拐点的命令
[align=left]package com.example.workflow.commands;[/align]
[align=left] [/align]
[align=left]import org.eclipse.draw2d.geometry.Point;[/align]
[align=left] [/align]
[align=left]/**deleteabendpointforthetransition*/[/align]
[align=left]publicclass MoveBendpointCommand extends AbstractBendpointCommand{[/align]
[align=left] //移动之前拐点的坐标[/align]
[align=left] private Point oldPoint = null;[/align]
[align=left]//如果转移对象或者拐点的坐标为空,不能执行这个命令[/align]
[align=left] publicboolean canExecute() { [/align]
[align=left] return (tran != null) && (point != null);[/align]
[align=left] }[/align]
[align=left]//首先得到移动之前的拐点的坐标,以备撤销操作使用[/align]
[align=left]//然后再删除这个拐点[/align]
[align=left]//最后再增加新的拐点[/align]
[align=left] publicvoid execute() {[/align]
[align=left] oldPoint = (Point)tran.getBendPoints().get(index);[/align]
[align=left] tran.removeBendPoint(index);[/align]
[align=left] tran.addBendPoint(index, point);[/align]
[align=left] }[/align]
[align=left]//撤销操作,首先删除新的拐点,然后再增加上原来拐点[/align]
[align=left] publicvoid undo() {[/align]
[align=left] tran.removeBendPoint(index);[/align]
[align=left] tran.addBendPoint(index, oldPoint);[/align]
[align=left] } [/align]
[align=left] //标志执行命令的名称[/align]
[align=left] public String getLabel() { [/align]
[align=left] return"move bendpoint";[/align]
[align=left] } [/align]
}
以前我们新建转移时,都不用刷新转移的Figure,现在在转移上增加了拐点,要想显示出拐点的效果,就必须覆盖转移控制器的refreshVisuals方法,代码如下:
//因为在转移模型的addBendPoint和removeBendPoint方法中,都通知转移控制器
//转移的BENDPOINT_PROP属性发生变化,所以在这儿我们当
//变化属性的名称是BENDPOINT_PROP,我们刷新视图
public void propertyChange(PropertyChangeEvent evt) {
String prop = evt.getPropertyName();
if(Transition.BENDPOINT_PROP.equals(prop)){
refreshVisuals();
}
}
//刷新转移对应的视图,首先得到转移模型中的拐点列表,然后把每个拐点的坐标
//构造成AbsoluteBendpoint对象,放在一个新的列表中,然后设置转移图形的
//路由
protected void refreshVisuals() {
List constraint = new ArrayList();
List list = getCastedModel().getBendPoints();
for(int i=0;i<list.size();i++){
constraint.add(new AbsoluteBendpoint((Point)list.get(i)));
}
getConnectionFigure().setRoutingConstraint(constraint);
}
要想使转移视图展示出拐点,我们还必须修改createFigure方法,修改如下:
protected IFigure createFigure() {
PolylineConnection connection = (PolylineConnection) super.createFigure();
connection.setTargetDecoration(new PolygonDecoration()); // arrow at target endpoint
connection.setConnectionRouter(new BendpointConnectionRouter());//为了显示拐点,设置转移的路由
return connection;
}
这样,我们运行程序,就能看到转移上增加拐点的效果了,如图:
至此,拐点有关的内容,我们就介绍完了,下面我们介绍如何在为编辑器增加大纲视图。
相关文章推荐
- 流程设计器开发三(策略和命令部分)
- 流程设计器开发四(改变活动的位置部分)
- 流程设计器开发五(转移的增加和删除部分)
- 流程设计器开发六(大纲视图部分)
- 流程设计器开发一(控制器和视图部分)
- 流程设计器开发七(属性页部分)
- 流程设计器开发一(模型部分)
- 流程设计器开发二(编辑器部分)
- 流程设计器开发八(新建向导部分)
- 《游戏脚本的设计与开发》-(RPG部分)3.2 地图遮挡和人物行走
- TYPESDK手游聚合SDK客户端设计思路与架构之四:unity开发平台部分结构设计和思路
- Java开发中的23个设计模式--第二部分:结构型模式
- Java开发中的23个设计模式--第三部分:行为型模式
- SharePoint无代码工作流设计开发实例——交通费报销流程(一)
- [设计理论] 开发iPhone软件界面流程
- 工作流管理系统开发之三 可视化流程设计器
- App项目设计开发完整流程
- Java开发时,如何设计Java类及业务流程
- SOA 术语概述,第 2 部分: 开发流程、模型和资产
- YARN应用程序开发和设计流程