题外话:

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

回顾:

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

进入主题:

先看一下扩展的类图:

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

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

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

  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. return xml;
  85. };
  86. draw2d.UserTask.prototype.getExtensionElementsXML=function(){
  87. if(this.listeners.getSize()==0&&this.formProperties.getSize()==0)return '';
  88. var xml = '<extensionElements>\n';
  89. xml=xml+this.getFormPropertiesXML();
  90. xml=xml+this.getListenersXML();
  91. xml=xml+'</extensionElements>\n';
  92. return xml;
  93. };
  94. draw2d.UserTask.prototype.getListenersXML=function(){
  95. var xml = draw2d.Task.prototype.getListenersXML.call(this);
  96. for(var i=0;i<this.taskListeners.getSize();i++){
  97. var listener = this.taskListeners.get(i);
  98. xml=xml+listener.toXML();
  99. }
  100. return xml;
  101. };
  102. draw2d.UserTask.prototype.getFormPropertiesXML=function(){
  103. var xml = '';
  104. for(var i=0;i<this.formProperties.getSize();i++){
  105. var formProperty = this.formProperties.get(i);
  106. xml=xml+formProperty.toXML();
  107. }
  108. return xml;
  109. };
  110. draw2d.UserTask.prototype.toXML=function(){
  111. var xml=this.getStartElementXML();
  112. xml=xml+this.getDocumentationXML();
  113. xml=xml+this.getExtensionElementsXML();
  114. xml=xml+this.getMultiInstanceXML();
  115. xml=xml+this.getEndElementXML();
  116. return xml;
  117. }
  118. draw2d.UserTask.prototype.getCandidateUser=function(sso){
  119. for(var i=0;i<this.candidateUsers.getSize();i++){
  120. var candidate = this.candidateUsers.get(i);
  121. if(candidate.sso===sso){
  122. return candidate;
  123. }
  124. }
  125. return null;
  126. };
  127. draw2d.UserTask.prototype.deleteCandidateUser=function(sso){
  128. var candidate = this.getCandidateUser(sso);
  129. this.candidateUsers.remove(candidate);
  130. };
  131. draw2d.UserTask.prototype.addCandidateUser=function(user){
  132. if(this.getCandidateUser(user.sso)==null)
  133. this.candidateUsers.add(user);
  134. };
  135. draw2d.UserTask.prototype.getCandidateGroup=function(name){
  136. for(var i=0;i<this.candidateGroups.getSize();i++){
  137. var candidate = this.candidateGroups.get(i);
  138. if(candidate===name){
  139. return candidate;
  140. }
  141. }
  142. return null;
  143. };
  144. draw2d.UserTask.prototype.deleteCandidateGroup=function(name){
  145. var candidate = this.getCandidateGroup(name);
  146. this.candidateGroups.remove(candidate);
  147. };
  148. draw2d.UserTask.prototype.addCandidateGroup=function(name){
  149. if(!this.candidateGroups.contains(name))
  150. this.candidateGroups.add(name);
  151. };
  152. draw2d.UserTask.prototype.getTaskListener=function(id){
  153. for(var i=0;i<this.taskListeners.getSize();i++){
  154. var listener = this.taskListeners.get(i);
  155. if(listener.getId()=== id){
  156. return listener;
  157. }
  158. }
  159. };
  160. draw2d.UserTask.prototype.deleteTaskListener=function(id){
  161. var listener = this.getTaskListener(id);
  162. this.taskListeners.remove(listener);
  163. };
  164. draw2d.UserTask.prototype.addTaskListener=function(listener){
  165. this.taskListeners.add(listener);
  166. };
  167. draw2d.UserTask.prototype.setTaskListeners=function(listeners){
  168. this.taskListeners = listeners;
  169. };
  170. draw2d.UserTask.prototype.getFormProperties=function(id){
  171. for(var i=0;i<this.formProperties.getSize();i++){
  172. var prop = this.formProperties.get(i);
  173. if(prop.id== id){
  174. return prop;
  175. }
  176. }
  177. };
  178. draw2d.UserTask.prototype.deleteFormProperties=function(id){
  179. var prop = this.getFormProperties(id);
  180. this.formProperties.remove(prop);
  181. };
  182. draw2d.UserTask.prototype.addFormProperties=function(prop){
  183. this.formProperties.add(prop);
  184. };
  185. draw2d.UserTask.prototype.setFormProperties=function(props){
  186. this.formProperties = props;
  187. };

请注意代码中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的扩展(三)的更多相关文章

  1. 【转】基于easyui开发Web版Activiti流程定制器详解(一)——目录结构

    题外话(可略过): 前一段时间(要是没记错的话应该是3个月以前)发布了一个更新版本,很多人说没有文档看着比较困难,所以打算拿点时间出来详细给大家讲解一下,由于本人平时要工作还要陪老婆和孩子而且还经营着 ...

  2. 基于easyui开发Web版Activiti流程定制器详解(五)——Draw2d详解(一)

    背景: 小弟工作已有十年有余,期间接触了不少工作流产品,个人比较喜欢的还是JBPM,因为出自名门Jboss所以备受推崇,但是现在JBPM版本已经与自己当年使用的版本(3.X)大相径庭,想升级也不太容易 ...

  3. 基于easyui开发Web版Activiti流程定制器详解(三)——页面结构(上)

    上一篇介绍了定制器相关的文件,这篇我们来看看整个定制器的界面部分,了解了页面结构有助于更好的理解定制器的实现,那么现在开始吧! 首先,我们来看看整体的结构: 整体结构比较简单,主要包括三个部分: 1. ...

  4. 基于easyui开发Web版Activiti流程定制器详解(四)——页面结构(下)

    题外话: 这两天周末在家陪老婆和儿子没上来更新请大家见谅!上一篇介绍了调色板和画布区的页面结构,这篇讲解一下属性区的结构也是定制器最重要的一个页面. 属性区整体页面结构如图:  在这个区域可以定义工作 ...

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

    回顾: 上一篇我们介绍了Draw2d整体结构,展示了组件类关系图,其中比较重要的类有Node.Canvas.Command.Port.Connection等,这篇将进一步介绍Draw2d如何使用以及如 ...

  6. 基于easyui开发Web版Activiti流程定制器详解(二)——文件列表

    上一篇我们介绍了目录结构,这篇给大家整理一个文件列表以及详细说明,方便大家查找文件. 由于设计器文件主要保存在wf/designer和js/designer目录下,所以主要针对这两个目录进行详细说明. ...

  7. SAE上传web应用(包括使用数据库)教程详解及问题解惑

    转自:http://blog.csdn.net/baiyuliang2013/article/details/24725995 SAE上传web应用(包括使用数据库)教程详解及问题解惑: 最近由于工作 ...

  8. Java web 入门知识 及HTTP协议详解

     Java  web  入门知识 及HTTP协议详解 WEB入门 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资 ...

  9. 转:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权

    原文地址:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法.shiro认证与shiro授权 以下是部分内容,具体见原文. shiro介绍 什么是shiro shiro是Apache ...

随机推荐

  1. JavaScript 正则表达式RegExp 和字符串本身的正则表达式

    JavaScript 正则表达式 正则表达式(英语:Regular Expression,在代码中常简写为regex.regexp或RE)使用单个字符串来描述.匹配一系列符合某个句法规则的字符串搜索模 ...

  2. FineUI表格、窗体、按钮组及事件

    //表格 @(F.Grid().IsFluid(true).CssClass("blockpanel").Title("表格").ShowHeader(true ...

  3. graphviz 的绘图布局

          graphviz是贝尔实验室开发的一个开源的工具包,它使用一个特定的DSL(领域特定语言):dot作为脚本语言,然后使用布局引擎来解析此脚本,并完成自动布局. graphviz中包含了众多 ...

  4. Java springmvc 统一异常处理的方案

    前言:为什么要统一异常处理?经常在项目中需要统一处理异常,将异常封装转给前端.也有时需要在项目中统一处理异常后,记录异常日志,做一下统一处理. Springmvc 异常统一处理的方式有三种. 一.使用 ...

  5. K:图的存储结构

      常用的图的存储结构主要有两种,一种是采用数组链表(邻接表)的方式,一种是采用邻接矩阵的方式.当然,图也可以采用十字链表或者边集数组的方式来进行表示,但由于不常用,为此,本博文不对其进行介绍. 邻接 ...

  6. mysql行转列,列转行

    行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现.用传统的方法,比较好理解.层次清 ...

  7. VSCode环境

    PythonPython for VSCode Language Support for Java(TM) by Red HatJava Language SupportJava DebuggerJa ...

  8. Android网络请求库RetrofitUtils

    RetrofitUtils GitHub地址,帮忙给个Star 项目介绍 Retrofit+Okhttp辅助类的简单封装,vesion 1.0.X 实现了Get,Post-Form.Post-Json ...

  9. mysql navicat 及命令行 创建、删除数据库

    1.命令行创建数据库 create database mybatis default character set utf8 collate utf8_general_ci; drop database ...

  10. Django html标签make_safe

    from django.utils.safestring import mark_safe a = mark_safe("<a href='#'>test</a>&q ...