基于easyui开发Web版Activiti流程定制器详解(六)——Draw2d的扩展(三)
题外话:
最近在忙公司的云项目空闲时间不是很多,所以很久没来更新,今天补上一篇!
回顾:
前几篇介绍了一下设计器的界面和Draw2d基础知识,这篇讲解一下本设计器如何扩展Draw2d。
进入主题:
先看一下扩展的类图:
其中有颜色标注的类即是扩展类,其中Node、Port、InputPort、OutputPort是Draw2d提供的类,其余都是扩展类。
这里重点介绍几个核心类以及相关重要的方法,如下:

上图中黄色部分负责生成Activiti流程文件中Task对应的XML片段,所以对于不同类型Task需要实现的方法,例如UserTask,代码如下:
- draw2d.UserTask=function(configPropCallback){
- draw2d.Task.call(this,configPropCallback);
- this.performerType=null;
- this.dueDate=null;
- this.priority=null;
- this.formKey = null;
- this.expression=null;
- this.isUseExpression=null;
- this.assignee=null;
- this.candidateUsers=new draw2d.ArrayList();
- this.candidateGroups=new draw2d.ArrayList();
- this.formProperties=new draw2d.ArrayList();
- this.taskListeners=new draw2d.ArrayList();
- this.setTitle("User Task");
- };
- draw2d.UserTask.prototype=new draw2d.Task();
- draw2d.UserTask.prototype.type="draw2d.UserTask";
- draw2d.UserTask.newInstance=function(userTaskXMLNode){
- var task = new draw2d.UserTask();
- task.id=userTaskXMLNode.attr('id');
- task.taskId=userTaskXMLNode.attr('id');
- task.taskName=userTaskXMLNode.attr('name');
- task.setContent(userTaskXMLNode.attr('name'));
- return task;
- };
- draw2d.UserTask.prototype.getIconClassName = function(){
- return "user-task-icon";
- };
- draw2d.UserTask.prototype.getStartElementXML=function(){
- var xml='<userTask ';
- xml=xml+this.getGeneralXML();
- xml=xml+this.getPerformersXML();
- xml=xml+'>\n';
- return xml;
- };
- draw2d.UserTask.prototype.getEndElementXML=function(){
- var xml = '</userTask>\n';
- return xml;
- };
- draw2d.UserTask.prototype.getDocumentationXML=function(){
- if(this.documentation==null||this.documentation=='')return '';
- var xml='<documentation>';
- xml=xml+this.documentation;
- xml=xml+'</documentation>';
- return xml;
- };
- draw2d.UserTask.prototype.getPerformersXML=function(){
- var xml='';
- if(this.isUseExpression){
- if(this.expression!=null&&this.expression!=''){
- if(this.performerType=='assignee'){
- xml=xml+'activiti:assignee="'+this.expression+'" ';
- }else if(this.performerType=='candidateUsers'){
- xml=xml+'activiti:candidateUsers="'+this.expression+'" ';
- }else if(this.performerType=='candidateGroups'){
- xml=xml+'activiti:candidateGroups="'+this.expression+'" ';
- }
- }
- }else{
- if(this.performerType=='assignee'){
- if(this.assignee!=null&&this.assignee!='')
- xml=xml+this.assignee;
- }else if(this.performerType=='candidateUsers'){
- for(var i=0;i<this.candidateUsers.getSize();i++){
- var user = this.candidateUsers.get(i);
- xml=xml+user.sso+',';
- }
- }else if(this.performerType=='candidateGroups'){
- for(var i=0;i<this.candidateGroups.getSize();i++){
- var group = this.candidateGroups.get(i);
- xml=xml+group+',';
- }
- }
- }
- if(this.dueDate!=null&&this.dueDate!=''){
- xml=xml+'activiti:dueDate="'+this.dueDate+'" '
- }
- if(this.formKey != null && this.formKey != ""){
- xml=xml+'activiti:formKey="'+this.formKey+'" ';
- }
- if(this.priority!=null&&this.priority!=''){
- xml=xml+'activiti:priority="'+this.priority+'" '
- }
- return xml;
- };
- draw2d.UserTask.prototype.getExtensionElementsXML=function(){
- if(this.listeners.getSize()==0&&this.formProperties.getSize()==0)return '';
- var xml = '<extensionElements>\n';
- xml=xml+this.getFormPropertiesXML();
- xml=xml+this.getListenersXML();
- xml=xml+'</extensionElements>\n';
- return xml;
- };
- draw2d.UserTask.prototype.getListenersXML=function(){
- var xml = draw2d.Task.prototype.getListenersXML.call(this);
- for(var i=0;i<this.taskListeners.getSize();i++){
- var listener = this.taskListeners.get(i);
- xml=xml+listener.toXML();
- }
- return xml;
- };
- draw2d.UserTask.prototype.getFormPropertiesXML=function(){
- var xml = '';
- for(var i=0;i<this.formProperties.getSize();i++){
- var formProperty = this.formProperties.get(i);
- xml=xml+formProperty.toXML();
- }
- return xml;
- };
- draw2d.UserTask.prototype.toXML=function(){
- var xml=this.getStartElementXML();
- xml=xml+this.getDocumentationXML();
- xml=xml+this.getExtensionElementsXML();
- xml=xml+this.getMultiInstanceXML();
- xml=xml+this.getEndElementXML();
- return xml;
- }
- draw2d.UserTask.prototype.getCandidateUser=function(sso){
- for(var i=0;i<this.candidateUsers.getSize();i++){
- var candidate = this.candidateUsers.get(i);
- if(candidate.sso===sso){
- return candidate;
- }
- }
- return null;
- };
- draw2d.UserTask.prototype.deleteCandidateUser=function(sso){
- var candidate = this.getCandidateUser(sso);
- this.candidateUsers.remove(candidate);
- };
- draw2d.UserTask.prototype.addCandidateUser=function(user){
- if(this.getCandidateUser(user.sso)==null)
- this.candidateUsers.add(user);
- };
- draw2d.UserTask.prototype.getCandidateGroup=function(name){
- for(var i=0;i<this.candidateGroups.getSize();i++){
- var candidate = this.candidateGroups.get(i);
- if(candidate===name){
- return candidate;
- }
- }
- return null;
- };
- draw2d.UserTask.prototype.deleteCandidateGroup=function(name){
- var candidate = this.getCandidateGroup(name);
- this.candidateGroups.remove(candidate);
- };
- draw2d.UserTask.prototype.addCandidateGroup=function(name){
- if(!this.candidateGroups.contains(name))
- this.candidateGroups.add(name);
- };
- draw2d.UserTask.prototype.getTaskListener=function(id){
- for(var i=0;i<this.taskListeners.getSize();i++){
- var listener = this.taskListeners.get(i);
- if(listener.getId()=== id){
- return listener;
- }
- }
- };
- draw2d.UserTask.prototype.deleteTaskListener=function(id){
- var listener = this.getTaskListener(id);
- this.taskListeners.remove(listener);
- };
- draw2d.UserTask.prototype.addTaskListener=function(listener){
- this.taskListeners.add(listener);
- };
- draw2d.UserTask.prototype.setTaskListeners=function(listeners){
- this.taskListeners = listeners;
- };
- draw2d.UserTask.prototype.getFormProperties=function(id){
- for(var i=0;i<this.formProperties.getSize();i++){
- var prop = this.formProperties.get(i);
- if(prop.id== id){
- return prop;
- }
- }
- };
- draw2d.UserTask.prototype.deleteFormProperties=function(id){
- var prop = this.getFormProperties(id);
- this.formProperties.remove(prop);
- };
- draw2d.UserTask.prototype.addFormProperties=function(prop){
- this.formProperties.add(prop);
- };
- draw2d.UserTask.prototype.setFormProperties=function(props){
- this.formProperties = props;
- };
请注意代码中toXML方法,这个方法负责产生UserTask节点的XML代码片段,它调用了其他几个方法:getStartElementXML、getDocumentationXML、getExtensionElementsXML、getMultiInstanceXML、getEndElementXML,不同类型的Task可能不需要调用所以这些方法,可以根据需要选择性调用(当然这取决于Activiti流程文件的规范),当然对于不同类型的Task你也可以添加一些自定义的方法,如:生成操作人的方法(代码中getPerformersXML方法)等等。
由于Activiti设计的Task类型比较多,这里就不一一介绍了有兴趣可以去查看一下源代码还是很好理解的,有问题可以给我留言!
时间有限就先写到这吧!下一篇介绍一下其他扩展类,敬请关注。。。。。。
http://lisonghua2010.iteye.com/admin/blogs/1490165
为了大家下载方便,最近开通的Github下载地址:
https://github.com/lisonghua/activiti-designer
Activit官方文档地址
http://activiti.org/userguide/index.html
-------------------------------------------------华丽分割线---------------------------------------------------------------------
温馨提示,下面是广告时间(不喜请绕行)
推广一下本人的小店:
http://tianya-zahuopu.taobao.com/
基于easyui开发Web版Activiti流程定制器详解(六)——Draw2d的扩展(三)的更多相关文章
- 【转】基于easyui开发Web版Activiti流程定制器详解(一)——目录结构
题外话(可略过): 前一段时间(要是没记错的话应该是3个月以前)发布了一个更新版本,很多人说没有文档看着比较困难,所以打算拿点时间出来详细给大家讲解一下,由于本人平时要工作还要陪老婆和孩子而且还经营着 ...
- 基于easyui开发Web版Activiti流程定制器详解(五)——Draw2d详解(一)
背景: 小弟工作已有十年有余,期间接触了不少工作流产品,个人比较喜欢的还是JBPM,因为出自名门Jboss所以备受推崇,但是现在JBPM版本已经与自己当年使用的版本(3.X)大相径庭,想升级也不太容易 ...
- 基于easyui开发Web版Activiti流程定制器详解(三)——页面结构(上)
上一篇介绍了定制器相关的文件,这篇我们来看看整个定制器的界面部分,了解了页面结构有助于更好的理解定制器的实现,那么现在开始吧! 首先,我们来看看整体的结构: 整体结构比较简单,主要包括三个部分: 1. ...
- 基于easyui开发Web版Activiti流程定制器详解(四)——页面结构(下)
题外话: 这两天周末在家陪老婆和儿子没上来更新请大家见谅!上一篇介绍了调色板和画布区的页面结构,这篇讲解一下属性区的结构也是定制器最重要的一个页面. 属性区整体页面结构如图: 在这个区域可以定义工作 ...
- 基于easyui开发Web版Activiti流程定制器详解(六)——Draw2d详解(二)
回顾: 上一篇我们介绍了Draw2d整体结构,展示了组件类关系图,其中比较重要的类有Node.Canvas.Command.Port.Connection等,这篇将进一步介绍Draw2d如何使用以及如 ...
- 基于easyui开发Web版Activiti流程定制器详解(二)——文件列表
上一篇我们介绍了目录结构,这篇给大家整理一个文件列表以及详细说明,方便大家查找文件. 由于设计器文件主要保存在wf/designer和js/designer目录下,所以主要针对这两个目录进行详细说明. ...
- SAE上传web应用(包括使用数据库)教程详解及问题解惑
转自:http://blog.csdn.net/baiyuliang2013/article/details/24725995 SAE上传web应用(包括使用数据库)教程详解及问题解惑: 最近由于工作 ...
- Java web 入门知识 及HTTP协议详解
Java web 入门知识 及HTTP协议详解 WEB入门 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资 ...
- 转:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权
原文地址:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法.shiro认证与shiro授权 以下是部分内容,具体见原文. shiro介绍 什么是shiro shiro是Apache ...
随机推荐
- 浅谈angular2与angularJS的区别
简介 大家好,今天给大家介绍一下angular,相信做过前端的小伙伴们都知道angular的大名,angularJS自2012年发布起就受到了大家的广泛关注.他首次提出了双向绑定概念让所有人都耳目一新 ...
- win10 uwp 商业游戏
本文告诉大家去做一个商业游戏,游戏很简单,几乎没有什么技术 游戏的开始,需要添加框架库,于是引用我自己写的库. 首先是创建一个启动页面,这个页面是显示启动的. 在显示启动的时候,是需要加载游戏需要使用 ...
- 使用CSS进行定位
CSS中通过使用position属性,有4种不同类型的定位方式,这会影响元素框生成的方式. position属性值的含义: static:静态定位 元素框正常生成.块级元素生成一个矩形框,作为文档流的 ...
- 【清北学堂 】Day 4 总结
忙(tui)了这么多天,终于有时间认(sui)真(bian)做做总结了 随便开始:(反正也没听 一:读入输出优化 1 输入优化 <1>快读 废话不多说上代码 inline int r ...
- [日常] Linux使用diff来比较目录
Linux diff比较两个目录的不同: diff dir1 dir2 -urNaq -a --text Treat all files as text. -u -U NUM --unifi ...
- Java基础教程(9)--流程控制
一.分支结构 1.if语句 if语句会与其后的第一条语句或代码块结合,且只有当判断条件为true时才执行语句或代码块.例如,自行车只有在运动的时候才可以减速,就像下面这样: void applyB ...
- 使用mybatis-generator生成自动代码
2019-02-22 配置文件: pom.xml 添加 dependency plugin 基于mybatis-plus <dependency> <groupId>o ...
- 去除底部“自豪地采用 WordPress”版权信息----最后附最新版的删除方法!!
footer.php get_template_part( 'template-parts/footer/site', 'info' );
- CentOS 7 防火墙端口配置
CentOS 7 防火墙端口配置查看防火墙是否开启systemctl status firewalld 若没有开启则开启systemctl start firewalld 查看所有开启的端口firew ...
- 使用display:none和visibility:hidden隐藏的区别
今天做毕设时遇到了一个小问题,我做了一个tab导航栏,点击一个tab页其它tab页隐藏,这时候第一想法是使用display:none来控制显示隐藏,写了之后发现使用display会有一个问题,就是第二 ...