基于easyui开发Web版Activiti流程定制器详解(六)——Draw2d的扩展(一)



题外话:

       最近在忙公司的云项目空闲时间不是很多,所以很久没来更新,今天补上一篇!

回顾:

       前几篇介绍了一下设计器的界面和Draw2d基础知识,这篇讲解一下本设计器如何扩展Draw2d。

 

进入主题:

       先看一下扩展的类图:

 其中有颜色标注的类即是扩展类,其中Node、Port、InputPort、OutputPort是Draw2d提供的类,其余都是扩展类。

 这里重点介绍几个核心类以及相关重要的方法,如下:


上图中黄色部分负责生成Activiti流程文件中Task对应的XML片段,所以对于不同类型Task需要实现的方法,例如UserTask,代码如下:

 

Js代码 复制代码 收藏代码
  1. draw2d.UserTask=function(configPropCallback){  
  2.     draw2d.Task.call(this,configPropCallback);  
  3.     this.performerType=null;  
  4.     this.dueDate=null;  
  5.     this.priority=null;  
  6.     this.formKey = null;  
  7.     this.expression=null;  
  8.     this.isUseExpression=null;  
  9.     this.assignee=null;  
  10.     this.candidateUsers=new draw2d.ArrayList();  
  11.     this.candidateGroups=new draw2d.ArrayList();  
  12.     this.formProperties=new draw2d.ArrayList();  
  13.     this.taskListeners=new draw2d.ArrayList();  
  14.     this.setTitle("User Task");  
  15. };  
  16. draw2d.UserTask.prototype=new draw2d.Task();  
  17. draw2d.UserTask.prototype.type="draw2d.UserTask";  
  18. draw2d.UserTask.newInstance=function(userTaskXMLNode){  
  19.     var task = new draw2d.UserTask();  
  20.     task.id=userTaskXMLNode.attr('id');  
  21.     task.taskId=userTaskXMLNode.attr('id');  
  22.     task.taskName=userTaskXMLNode.attr('name');  
  23.     task.setContent(userTaskXMLNode.attr('name'));  
  24.     return task;  
  25. };  
  26. draw2d.UserTask.prototype.getIconClassName = function(){  
  27.     return "user-task-icon";  
  28. };  
  29. draw2d.UserTask.prototype.getStartElementXML=function(){  
  30.     var xml='<userTask ';  
  31.     xml=xml+this.getGeneralXML();  
  32.     xml=xml+this.getPerformersXML();  
  33.     xml=xml+'>\n';  
  34.     return xml;  
  35. };  
  36. draw2d.UserTask.prototype.getEndElementXML=function(){  
  37.     var xml = '</userTask>\n';  
  38.     return xml;  
  39. };  
  40. draw2d.UserTask.prototype.getDocumentationXML=function(){  
  41.     if(this.documentation==null||this.documentation=='')return '';  
  42.     var xml='<documentation>';  
  43.     xml=xml+this.documentation;  
  44.     xml=xml+'</documentation>';  
  45.     return xml;  
  46. };  
  47. draw2d.UserTask.prototype.getPerformersXML=function(){  
  48.     var xml='';  
  49.     if(this.isUseExpression){  
  50.         if(this.expression!=null&&this.expression!=''){  
  51.             if(this.performerType=='assignee'){  
  52.                 xml=xml+'activiti:assignee="'+this.expression+'" ';  
  53.             }else if(this.performerType=='candidateUsers'){  
  54.                 xml=xml+'activiti:candidateUsers="'+this.expression+'" ';  
  55.             }else if(this.performerType=='candidateGroups'){  
  56.                 xml=xml+'activiti:candidateGroups="'+this.expression+'" ';  
  57.             }  
  58.         }  
  59.     }else{  
  60.         if(this.performerType=='assignee'){  
  61.             if(this.assignee!=null&&this.assignee!='')  
  62.                 xml=xml+this.assignee;  
  63.         }else if(this.performerType=='candidateUsers'){  
  64.             for(var i=0;i<this.candidateUsers.getSize();i++){  
  65.                 var user = this.candidateUsers.get(i);  
  66.                 xml=xml+user.sso+',';  
  67.             }  
  68.         }else if(this.performerType=='candidateGroups'){  
  69.             for(var i=0;i<this.candidateGroups.getSize();i++){  
  70.                 var group = this.candidateGroups.get(i);  
  71.                 xml=xml+group+',';  
  72.             }  
  73.         }  
  74.     }  
  75.     if(this.dueDate!=null&&this.dueDate!=''){  
  76.         xml=xml+'activiti:dueDate="'+this.dueDate+'" '  
  77.     }  
  78.     if(this.formKey != null && this.formKey != ""){  
  79.         xml=xml+'activiti:formKey="'+this.formKey+'" ';  
  80.     }  
  81.     if(this.priority!=null&&this.priority!=''){  
  82.         xml=xml+'activiti:priority="'+this.priority+'" '  
  83.     }  
  84.       
  85.     return xml;  
  86. };  
  87. draw2d.UserTask.prototype.getExtensionElementsXML=function(){  
  88.     if(this.listeners.getSize()==0&&this.formProperties.getSize()==0)return '';  
  89.     var xml = '<extensionElements>\n';  
  90.     xml=xml+this.getFormPropertiesXML();  
  91.     xml=xml+this.getListenersXML();  
  92.     xml=xml+'</extensionElements>\n';  
  93.     return xml;  
  94. };  
  95. draw2d.UserTask.prototype.getListenersXML=function(){  
  96.     var xml = draw2d.Task.prototype.getListenersXML.call(this);  
  97.     for(var i=0;i<this.taskListeners.getSize();i++){  
  98.         var listener = this.taskListeners.get(i);  
  99.         xml=xml+listener.toXML();  
  100.     }  
  101.     return xml;  
  102. };  
  103. draw2d.UserTask.prototype.getFormPropertiesXML=function(){  
  104.     var xml = '';  
  105.     for(var i=0;i<this.formProperties.getSize();i++){  
  106.         var formProperty = this.formProperties.get(i);  
  107.         xml=xml+formProperty.toXML();  
  108.     }  
  109.     return xml;  
  110. };  
  111. draw2d.UserTask.prototype.toXML=function(){  
  112.     var xml=this.getStartElementXML();  
  113.     xml=xml+this.getDocumentationXML();  
  114.     xml=xml+this.getExtensionElementsXML();  
  115.     xml=xml+this.getMultiInstanceXML();  
  116.     xml=xml+this.getEndElementXML();  
  117.     return xml;  
  118. }  
  119. draw2d.UserTask.prototype.getCandidateUser=function(sso){  
  120.     for(var i=0;i<this.candidateUsers.getSize();i++){  
  121.         var candidate = this.candidateUsers.get(i);  
  122.         if(candidate.sso===sso){  
  123.             return candidate;  
  124.         }  
  125.     }  
  126.     return null;  
  127. };  
  128. draw2d.UserTask.prototype.deleteCandidateUser=function(sso){  
  129.     var candidate = this.getCandidateUser(sso);  
  130.     this.candidateUsers.remove(candidate);  
  131. };  
  132. draw2d.UserTask.prototype.addCandidateUser=function(user){  
  133.     if(this.getCandidateUser(user.sso)==null)  
  134.         this.candidateUsers.add(user);  
  135. };  
  136. draw2d.UserTask.prototype.getCandidateGroup=function(name){  
  137.     for(var i=0;i<this.candidateGroups.getSize();i++){  
  138.         var candidate = this.candidateGroups.get(i);  
  139.         if(candidate===name){  
  140.             return candidate;  
  141.         }  
  142.     }  
  143.     return null;  
  144. };  
  145. draw2d.UserTask.prototype.deleteCandidateGroup=function(name){  
  146.     var candidate = this.getCandidateGroup(name);  
  147.     this.candidateGroups.remove(candidate);  
  148. };  
  149. draw2d.UserTask.prototype.addCandidateGroup=function(name){  
  150.     if(!this.candidateGroups.contains(name))  
  151.         this.candidateGroups.add(name);  
  152. };  
  153. draw2d.UserTask.prototype.getTaskListener=function(id){  
  154.     for(var i=0;i<this.taskListeners.getSize();i++){  
  155.         var listener = this.taskListeners.get(i);  
  156.         if(listener.getId()=== id){  
  157.             return listener;  
  158.         }  
  159.     }  
  160. };  
  161. draw2d.UserTask.prototype.deleteTaskListener=function(id){  
  162.     var listener = this.getTaskListener(id);  
  163.     this.taskListeners.remove(listener);  
  164. };  
  165. draw2d.UserTask.prototype.addTaskListener=function(listener){  
  166.     this.taskListeners.add(listener);  
  167. };  
  168. draw2d.UserTask.prototype.setTaskListeners=function(listeners){  
  169.     this.taskListeners = listeners;  
  170. };  
  171. draw2d.UserTask.prototype.getFormProperties=function(id){  
  172.     for(var i=0;i<this.formProperties.getSize();i++){  
  173.         var prop = this.formProperties.get(i);  
  174.         if(prop.id== id){  
  175.             return prop;  
  176.         }  
  177.     }  
  178. };  
  179. draw2d.UserTask.prototype.deleteFormProperties=function(id){  
  180.     var prop = this.getFormProperties(id);  
  181.     this.formProperties.remove(prop);  
  182. };  
  183. draw2d.UserTask.prototype.addFormProperties=function(prop){  
  184.     this.formProperties.add(prop);  
  185. };  
  186. draw2d.UserTask.prototype.setFormProperties=function(props){  
  187.     this.formProperties = props;  
  188. };  

 
 请注意代码中toXML方法,这个方法负责产生UserTask节点的XML代码片段,它调用了其他几个方法:getStartElementXML、getDocumentationXML、getExtensionElementsXML、getMultiInstanceXML、getEndElementXML,不同类型的Task可能不需要调用所以这些方法,可以根据需要选择性调用(当然这取决于Activiti流程文件的规范),当然对于不同类型的Task你也可以添加一些自定义的方法,如:生成操作人的方法(代码中getPerformersXML方法)等等。

由于Activiti设计的Task类型比较多,这里就不一一介绍了有兴趣可以去查看一下源代码还是很好理解的,有问题可以给我留言!

时间有限就先写到这吧!下一篇介绍一下其他扩展类,敬请关注。。。。。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习网络总结

1.Siamese network Siamese [saiə mi:z] 孪生 左图的孪生网络是指两个网络通过共享权值实现对输入的输出&#xff0c;右图的伪孪生网络则不共享权值(pseudo-siamese network)。 孪生神经网络是用来衡量两个输入的相似度&#xff0c;可以用来人脸验证、语义相似度分析、QA匹配…

异常检测时间序列_时间序列的无监督异常检测

异常检测时间序列To understand the normal behaviour of any flow on time axis and detect anomaly situations is one of the prominent fields in data driven studies. These studies are mostly conducted in unsupervised manner, since labelling the data in real lif…

python设计模式(七):组合模式

组合&#xff0c;将对象组合成树状结构&#xff0c;来表示业务逻辑上的[部分-整体]层次&#xff0c;这种组合使单个对象和组合对象的使用方法一样。 如描述一家公司的层次结构&#xff0c;那么我们用办公室来表示节点&#xff0c;则总经理办公司是根节点&#xff0c;下面分别由…

Django框架是什麼?

Django在新一代的Web框架中非常出色,为什么这么说呢&#xff1f;为回答该问题,让我们考虑一下不使用框架设计Python网页应用程序的情形.贯穿整本书,我们多次展示不使用框架实现网站基本功能的方法,让读者认识到框架开发的方便,&#xff08;不使用框架,更多情况是没有合适的框架…

存款惊人_如何使您的图快速美丽惊人

存款惊人So, you just finished retrieving, processing, and analyzing your data. You grab your data and you decide to graph it so you can show others your findings. You click ‘graph’ and……因此&#xff0c;您刚刚完成了数据的检索&#xff0c;处理和分析。 您获…

pytest自动化6:pytest.mark.parametrize装饰器--测试用例参数化

前言&#xff1a;pytest.mark.parametrize装饰器可以实现测试用例参数化。 parametrizing 1. 下面是一个简单是实例&#xff0c;检查一定的输入和期望输出测试功能的典型例子 2. 标记单个测试实例为失败&#xff0c;例如使用内置的mark.xfail&#xff0c;则跳过该用例不执行直…

基于easyui开发Web版Activiti流程定制器详解(六)——Draw2d详解(二)

&#xfeff;&#xfeff;上一篇我们介绍了Draw2d整体结构&#xff0c;展示了组件类关系图&#xff0c;其中比较重要的类有Node、Canvas、Command、Port、Connection等&#xff0c;这篇将进一步介绍Draw2d如何使用以及如何扩展。 进入主题&#xff1a; 详细介绍一下Draw2d中几个…

c#中ReadLine,Read,ReadKey的区别

Console.Read()、Console.ReadLine() 相同点&#xff1a; 1.两者都是用于输入的函数。 不同点&#xff1a; 1. Read只能读取一个字符&#xff0c;ReadLine可以读取一个字符串 如 Read读取A和AASDGU的返回值都是一样的 都为A的ASCII值&#xff0c;对于后续的ASDGU不理会。 而Rea…

Ubuntu16.04 开启多个终端,一个终端多个小窗口

Ubuntu16.04 开启多个终端&#xff0c;一个终端多个小窗口 CtrlShift T,一个终端开启多个小终端 CtrlAlt T 开启多个终端 posted on 2019-03-15 11:26 _孤城 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/liuweijie/p/10535904.html

敏捷 橄榄球运动_澳大利亚橄榄球迷的研究声称南非裁判的偏见被证明是错误的

敏捷 橄榄球运动In February 2020, an Australian rugby fan produced a study, claiming to show how South African rugby referees were exhibiting favorable bias towards South African home teams. The study did not consider how other countries’ referees treat So…

activiti 部署流程图后中文乱码

Activiti工作流引擎使用 1.简单介工作流引擎与Activiti 对于工作流引擎的解释请参考百度百科&#xff1a;工作流引擎 1.1 我与工作流引擎 在第一家公司工作的时候主要任务就是开发OA系统&#xff0c;当然基本都是有工作流的支持&#xff0c;不过当时使用的工作流引擎是公司一些…

Luogu 4755 Beautiful Pair

分治 主席树。 设$solve(l, r)$表示当前处理到$[l, r]$区间的情况&#xff0c;我们可以找到$[l, r]$中最大的一个数的位置$mid$&#xff0c;然后扫一半区间计算一下这个区间的答案。 注意&#xff0c;这时候左半边是$[l, mid]$&#xff0c;而右区间是$[mid, r]$&#xff0c;我…

网络传播动力学_通过简单的规则传播动力

网络传播动力学When a single drop of paint is dropped on a surface the amount of space that the drop will cover depends both on time and space. A short amount of time will no be enough for the drop to cover a greater area, and a small surface will bound the…

【左偏树】【P3261】 [JLOI2015]城池攻占

Description 小铭铭最近获得了一副新的桌游&#xff0c;游戏中需要用 m 个骑士攻占 n 个城池。这 n 个城池用 1 到 n 的整数表示。除 1 号城池外&#xff0c;城池 i 会受到另一座城池 fi 的管辖&#xff0c;其中 fi <i。也就是说&#xff0c;所有城池构成了一棵有根树。这 m…

【原创】数据库中为什么不推荐使用外键约束

引言 其实这个话题是老生常谈&#xff0c;很多人在工作中确实也不会使用外键。包括在阿里的JAVA规范中也有下面这一条 【强制】不得使用外键与级联&#xff0c;一切外键概念必须在应用层解决。 但是呢&#xff0c;询问他们原因&#xff0c;大多是这么回答的 每次做DELETE 或者…

初识Activiti

http://wenku.baidu.com/view/bb7364ad4693daef5ff73d32.html 1. 初识Activiti 1.1. 工作流与工作流引擎 工作流&#xff08;workflow&#xff09;就是工作流程的计算模型&#xff0c;即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其…

开源软件 安全风险_3开源安全风险及其解决方法

开源软件 安全风险Open source software is very popular and makes up a significant portion of business applications. According to Synopsys, 99% of commercial databases contain at least one open source component, and nearly 75% of these codebases contain open…

React-Router 源码分析1

1、单页面应用的路由基本原理 demo1 router1.html 复制代码以 hash 形式为例。 1、init 监听浏览器 url hash 更新事件。 2、route 存储路由更新时的回调到回调数组routes中&#xff0c;回调函数将负责对页面的更新。 3、refresh 执行当前url对应的回调函数&#xff0c;更新页面…

linux安装日志切割程序

linux安装日志切割程序 安装 gcc&#xff08;1&#xff09; yum insatll gcc &#xff08;2&#xff09;# cd cronolog-1.6.2 4、运行安装 # ./configure# make# make install 5、查看cronolog安装后所在目录&#xff08;验证安装是否成功&#xff09; # which cronolog 一般情…

自助分析_为什么自助服务分析真的不是一回事

自助分析That title probably got your attention and now you think I have some explaining to do! The key word in the title is the word “A”. Self-service analytics isn’t a thing if “a thing” means a single, distinct corporate initiative or set of require…