designer.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613
  1. var DefaultModelTypeEnum=[
  2. draw2d.Start.prototype.type,
  3. draw2d.End.prototype.type,
  4. draw2d.UserTask.prototype.type,
  5. draw2d.ManualTask.prototype.type,
  6. draw2d.ServiceTask.prototype.type,
  7. draw2d.DecoratedConnection.prototype.type,
  8. draw2d.ExclusiveGateway.prototype.type,
  9. draw2d.ParallelGateway.prototype.type,
  10. draw2d.TimerBoundary.prototype.type,
  11. draw2d.ErrorBoundary.prototype.type,
  12. draw2d.CallActivity.prototype.type,
  13. draw2d.ScriptTask.prototype.type,
  14. draw2d.MailTask.prototype.type,
  15. draw2d.BusinessRuleTask.prototype.type,
  16. draw2d.ReceiveTask.prototype.type
  17. ];
  18. draw2d.Random=function(){};
  19. draw2d.Random.create=function () {
  20. /*
  21. var len = 10;
  22. var seed = new Array
  23. (
  24. 'abcdefghijklmnopqrstuvwxyz',
  25. 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
  26. '1234567890'
  27. );
  28. var idd, i;
  29. var result = '';
  30. for (i = 0; i < len; i++) {
  31. idd = Math.floor(Math.random() * seed.length);
  32. result += seed[idd].substr(Math.floor(Math.random() * (seed[idd].length)), 1);
  33. }
  34. return result;
  35. */
  36. return new Date().getTime();
  37. };
  38. //Sequence=draw2d.UUID;
  39. Sequence=draw2d.Random;
  40. //designer base objects definition
  41. /**
  42. * 流程对象定义
  43. */
  44. draw2d.Process=function(){
  45. this.id=null;//流程ID
  46. this.name=null;//流程名称
  47. this.category=null;//命名空间
  48. this.documentation=null;//描述
  49. this.forms=new draw2d.ArrayList();//流程表单集合
  50. this.listeners=new draw2d.ArrayList();//流程监听集合
  51. this.variables=new draw2d.ArrayList();//流程变量集合
  52. };
  53. draw2d.Process.prototype.getForm=function(id){
  54. for(var i=0;i<this.forms.getSize();i++){
  55. var form = this.forms.get(i);
  56. if(form.getId()=== id){
  57. return form;
  58. }
  59. }
  60. };
  61. draw2d.Process.prototype.deleteForm=function(id){
  62. var form = this.getForm(id);
  63. this.forms.remove(form);
  64. };
  65. draw2d.Process.prototype.addForm=function(form){
  66. this.forms.add(form);
  67. };
  68. draw2d.Process.prototype.setForms=function(forms){
  69. this.forms = forms;
  70. };
  71. draw2d.Process.prototype.getListener=function(id){
  72. for(var i=0;i<this.listeners.getSize();i++){
  73. var listener = this.listeners.get(i);
  74. if(listener.getId()=== id){
  75. return listener;
  76. }
  77. }
  78. };
  79. draw2d.Process.prototype.deleteListener=function(id){
  80. var listener = this.getListener(id);
  81. this.listeners.remove(listener);
  82. };
  83. draw2d.Process.prototype.addListener=function(listener){
  84. this.listeners.add(listener);
  85. };
  86. draw2d.Process.prototype.setListeners=function(listeners){
  87. this.listeners = listeners;
  88. };
  89. draw2d.Process.prototype.getVariable=function(id){
  90. for(var i=0;i<this.variables.getSize();i++){
  91. var variable = this.variables.get(i);
  92. if(variable.id=== id){
  93. return variable;
  94. }
  95. }
  96. };
  97. draw2d.Process.prototype.deleteVariable=function(id){
  98. var variable = this.getVariable(id);
  99. this.variables.remove(variable);
  100. };
  101. draw2d.Process.prototype.addVariable=function(variable){
  102. this.variables.add(variable);
  103. };
  104. draw2d.Process.prototype.getVariablesJSONObject=function(){
  105. return JSON.stringify(this.variables.data);
  106. };
  107. draw2d.Process.prototype.getListenersXML=function(){
  108. var xml = '';
  109. for(var i=0;i<this.listeners.getSize();i++){
  110. var listener = this.listeners.get(i);
  111. xml=xml+listener.toXML();
  112. }
  113. return xml;
  114. };
  115. draw2d.Process.prototype.getFormsXML=function(){
  116. var xml = '';
  117. for(var i=0;i<this.forms.getSize();i++){
  118. var form = this.forms.get(i);
  119. xml=xml+form.toXML();
  120. }
  121. return xml;
  122. };
  123. draw2d.Process.prototype.getExtensionElementsXML=function(){
  124. if(this.listeners.getSize()==0&&this.forms.getSize()==0)return '';
  125. var xml = '<extensionElements>\n';
  126. xml=xml+this.getFormsXML();
  127. xml=xml+this.getListenersXML();
  128. xml=xml+'</extensionElements>\n';
  129. return xml;
  130. };
  131. draw2d.Process.prototype.getDocumentationXML=function(){
  132. var documentation = trim(this.documentation);
  133. if(documentation==null||documentation=='')return '';
  134. var xml='<documentation>';
  135. xml=xml+this.documentation;
  136. xml=xml+'</documentation>';
  137. return xml;
  138. };
  139. draw2d.Process.variable=function(){
  140. this.id=draw2d.UUID.create();
  141. this.name=null;
  142. this.type=null;
  143. this.scope=null;
  144. this.defaultValue=null;
  145. this.remark=null;
  146. };
  147. draw2d.Process.Form=function(){
  148. this.id=draw2d.UUID.create();
  149. this.name=null;//名称
  150. this.type=null;//类型
  151. this.value=null;//值
  152. this.exp=null;//表达式
  153. this.remark=null;//描述
  154. };
  155. draw2d.Process.Form.prototype.setId=function(id){
  156. this.id=id;
  157. };
  158. draw2d.Process.Form.prototype.getId=function(){
  159. return this.id;
  160. };
  161. draw2d.Process.Form.prototype.setName=function(name){
  162. this.name=name;
  163. };
  164. draw2d.Process.Form.prototype.getName=function(){
  165. return this.name;
  166. };
  167. draw2d.Process.Form.prototype.setType=function(type){
  168. this.type=type;
  169. };
  170. draw2d.Process.Form.prototype.getType=function(){
  171. return this.type;
  172. };
  173. draw2d.Process.Form.prototype.setValue=function(value){
  174. this.value=value;
  175. };
  176. draw2d.Process.Form.prototype.getValue=function(){
  177. return this.value;
  178. };
  179. draw2d.Process.Listener=function(){
  180. this.id=draw2d.UUID.create();
  181. this.event=null;
  182. this.serviceType=null;
  183. this.serviceClass=null;
  184. this.serviceExpression=null;
  185. this.fields=new draw2d.ArrayList();
  186. };
  187. draw2d.Process.Listener.prototype.setId=function(id){
  188. this.id=id;
  189. };
  190. draw2d.Process.Listener.prototype.getId=function(){
  191. return this.id;
  192. };
  193. draw2d.Process.Listener.prototype.setField=function(field){
  194. this.fields.add(field);
  195. };
  196. draw2d.Process.Listener.prototype.getField=function(id){
  197. for(var i=0;i<this.fields.getSize();i++ ){
  198. var field = this.fields.get(i);
  199. if(field.id == id){
  200. return field;
  201. }
  202. }
  203. };
  204. draw2d.Process.Listener.prototype.deleteField=function(id){
  205. var field = this.getField(id);
  206. this.fields.remove(field);
  207. };
  208. draw2d.Process.Listener.prototype.getServiceImplementation=function(){
  209. if(this.serviceType=='javaClass')
  210. return this.serviceClass;
  211. else if(this.serviceType=='expression')
  212. return this.serviceExpression;
  213. };
  214. draw2d.Process.Listener.prototype.getFieldsString=function(){
  215. var f = '';
  216. var v = '';
  217. for(var i=0;i<this.fields.getSize();i++){
  218. var field = this.fields.get(i);
  219. f=f+field.name+":"+field.value+",";
  220. }
  221. return f;
  222. };
  223. draw2d.Process.Listener.prototype.toJSON=function(){
  224. var json={
  225. id:this.id,
  226. event:this.event,
  227. serviceType:this.serviceType,
  228. serviceClass:this.serviceClass,
  229. serviceExpression:this.serviceExpression,
  230. fields:this.fields.data
  231. };
  232. return JSON.stringify(json);
  233. };
  234. draw2d.Process.Listener.prototype.parseJSON=function(){
  235. var jsonString = this.toJSON();
  236. return JSON.parse(jsonString);
  237. };
  238. draw2d.Process.Listener.prototype.getFieldsXML=function(){
  239. var xml = "";
  240. for(var i=0;i<this.fields.getSize();i++){
  241. var field = this.fields.get(i);
  242. xml=xml+field.toXML();
  243. }
  244. return xml;
  245. };
  246. draw2d.Process.Listener.prototype.toXML=function(){
  247. var xml = '<activiti:executionListener id="'+this.id+'" event="'+this.event+'" ';
  248. if(this.serviceType=='javaClass'){
  249. xml=xml+'class="'+this.serviceClass+'" ';
  250. }else if(this.serviceType=='expression'){
  251. xml=xml+'expression="'+this.serviceExpression+'" ';
  252. }
  253. xml=xml+'>\n';
  254. xml=xml+this.getFieldsXML();
  255. xml=xml+'</activiti:executionListener>\n';
  256. return xml;
  257. };
  258. /**
  259. * 流程监听字段对象
  260. */
  261. draw2d.Process.Listener.Field=function(){
  262. this.id=draw2d.UUID.create();
  263. this.name=null;
  264. this.type=null;
  265. this.value=null;
  266. };
  267. draw2d.Process.Listener.Field.prototype.toJSON=function(){
  268. var json = {
  269. id:this.id,
  270. name:this.name,
  271. type:this.type,
  272. value:this.value
  273. };
  274. return JSON.stringify(json);
  275. };
  276. draw2d.Process.Listener.Field.prototype.toXML=function(){
  277. var xml = '<activiti:field name="'+this.name+'">\n';
  278. if(this.type=='string'){
  279. xml=xml+'<activiti:string>'+this.value+'</activiti:string>\n';
  280. }else if(this.type='expression'){
  281. xml=xml+'<activiti:expression>'+this.value+'</activiti:expression>\n';
  282. }
  283. xml=xml+'</activiti:field>\n';
  284. return xml
  285. };
  286. /**
  287. * Task form object definition
  288. */
  289. /**
  290. * Process field object
  291. */
  292. draw2d.Task.Form=function(){
  293. draw2d.Process.Form.call(this);
  294. };
  295. draw2d.Task.Form.prototype=new draw2d.Process.Form();
  296. draw2d.Task.Form.prototype.toXML=function(){
  297. var xml = '<activiti:formProperty id="'+this.id+'" name="'+
  298. this.name+'" type="'+this.type+'" value="'+this.value+'" exp="'+
  299. this.exp+'" remark="'+this.remark+'" ';
  300. xml=xml+'>\n';
  301. xml=xml+'</activiti:formProperty>\n'
  302. return xml;
  303. };
  304. /**
  305. * 任务监听对象
  306. */
  307. draw2d.Task.Listener=function(){
  308. draw2d.Process.Listener.call(this);
  309. };
  310. draw2d.Task.Listener.prototype=new draw2d.Process.Listener();
  311. draw2d.Task.Listener.prototype.toXML=function(){
  312. var xml = '<activiti:taskListener id="'+this.id+'" event="'+this.event+'" ';
  313. if(this.serviceType=='javaClass'){
  314. xml=xml+'class="'+this.serviceClass+'" ';
  315. }else if(this.serviceType=='expression'){
  316. xml=xml+'delegateExpression="'+this.serviceExpression+'" ';
  317. }
  318. xml=xml+'>\n';
  319. xml=xml+this.getFieldsXML();
  320. xml=xml+'</activiti:taskListener>\n';
  321. return xml;
  322. };
  323. /**
  324. *流程监听字段对象定义
  325. */
  326. draw2d.Task.Listener.Field=function(){
  327. draw2d.Process.Listener.Field.call(this);
  328. };
  329. draw2d.Task.Listener.Field.prototype=new draw2d.Process.Listener.Field();
  330. /**
  331. * Line listener object definition
  332. */
  333. draw2d.DecoratedConnection.Listener=function(){
  334. draw2d.Process.Listener.call(this);
  335. };
  336. draw2d.DecoratedConnection.Listener.prototype=new draw2d.Process.Listener();
  337. draw2d.DecoratedConnection.Listener.prototype.toXML=function(){
  338. var xml = '<activiti:executionListener id="'+this.id+'" ';
  339. if(this.serviceType=='javaClass'){
  340. xml=xml+'class="'+this.serviceClass+'" ';
  341. }else if(this.serviceType=='expression'){
  342. xml=xml+'expression="'+this.serviceExpression+'" ';
  343. }
  344. xml=xml+'>\n';
  345. xml=xml+this.getFieldsXML();
  346. xml=xml+'</activiti:executionListener>\n';
  347. return xml;
  348. };
  349. /**
  350. * Line listener field object definition
  351. */
  352. draw2d.DecoratedConnection.Listener.Field=function(){
  353. draw2d.Process.Listener.Field.call(this);
  354. };
  355. draw2d.DecoratedConnection.Listener.Field.prototype=new draw2d.Process.Listener.Field();
  356. /**
  357. * designer UI objects definition
  358. */
  359. draw2d.ContextMenu=function(w,h){
  360. draw2d.Menu.call(this);
  361. this.setDimension(w,h);
  362. this.item = null;
  363. this.width = w;
  364. this.height = h;
  365. };
  366. draw2d.ContextMenu.prototype = new draw2d.Menu();
  367. draw2d.ContextMenu.prototype.type = "draw2d.ContextMenu";
  368. draw2d.ContextMenu.prototype.setDimension=function(w,h){
  369. //draw2d.Menu.prototype.setDimension.call(this,w,h);
  370. this.item.style.width = w+"px";
  371. this.item.style.height = h+"px";
  372. /*
  373. this.shadow.css( {
  374. display : "block",
  375. zIndex : this.getZOrder()-1,
  376. left : this.menu.css("left"),
  377. top : this.menu.css("top"),
  378. width : w+3,
  379. height : h+3
  380. });
  381. */
  382. };
  383. draw2d.ContextMenu.prototype.createHTMLElement = function() {
  384. this.item = document.createElement("div");
  385. this.item.style.left = this.x + "px";
  386. this.item.style.top = this.y + "px";
  387. this.item.style.cursor = "pointer";
  388. this.item.style.width = this.width+"px";
  389. this.item.style.height = this.height+"px";
  390. this.item.className = "context-menu";
  391. return this.item;
  392. };
  393. draw2d.ContextMenu.prototype.createList = function() {
  394. this.dirty = false;
  395. this.html.innerHTML = "";
  396. var oThis = this;
  397. for ( var i = 0; i < this.menuItems.getSize(); i++) {
  398. var item = this.menuItems.get(i);
  399. var li = document.createElement("div");
  400. li.className = "context-menu-item";
  401. var mtext = document.createElement("div");
  402. mtext.innerHTML = item.getLabel();
  403. mtext.className="context-menu-text";
  404. li.appendChild(mtext);
  405. var micon = document.createElement("div");
  406. micon.className = "context-menu-icon "+item.iconCls;
  407. li.appendChild(micon);
  408. li.menuItem = item;
  409. this.html.appendChild(li);
  410. if (li.addEventListener) {
  411. li.addEventListener("click", function(event) {
  412. var _508f = arguments[0] || window.event;
  413. _508f.cancelBubble = true;
  414. _508f.returnValue = false;
  415. var diffX = _508f.clientX;
  416. var diffY = _508f.clientY;
  417. var _5092 = document.body.parentNode.scrollLeft;
  418. var _5093 = document.body.parentNode.scrollTop;
  419. var target=event.srcElement ? event.srcElement : event.target;
  420. if(target.className.indexOf("context-menu-item")!=-1){
  421. target.menuItem.execute(diffX + _5092, diffY
  422. + _5093);
  423. }else{
  424. target.parentNode.menuItem.execute(diffX + _5092, diffY
  425. + _5093);
  426. }
  427. }, false);
  428. li.addEventListener("mouseup", function(event) {
  429. //alert("mouseup");
  430. event.cancelBubble = true;
  431. event.returnValue = false;
  432. }, false);
  433. li.addEventListener("mousedown", function(event) {
  434. //alert("mousedown");
  435. event.cancelBubble = true;
  436. event.returnValue = false;
  437. }, false);
  438. li.addEventListener("mouseover", function(event) {
  439. var target=event.srcElement ? event.srcElement : event.target;
  440. if(target.className.indexOf("context-menu-item")!=-1)
  441. target.className="context-menu-item context-menu-active";
  442. else
  443. target.parentNode.className="context-menu-item context-menu-active";
  444. }, false);
  445. li.addEventListener("mouseout", function(event) {
  446. var target=event.srcElement ? event.srcElement : event.target;
  447. if(target.className.indexOf("context-menu-active")!=-1)
  448. target.className="context-menu-item";
  449. else
  450. target.parentNode.className="context-menu-item";
  451. }, false);
  452. } else {
  453. if (li.attachEvent) {
  454. li.attachEvent("onclick", function(event) {
  455. var _5099 = arguments[0] || window.event;
  456. _5099.cancelBubble = true;
  457. _5099.returnValue = false;
  458. var diffX = _5099.clientX;
  459. var diffY = _5099.clientY;
  460. var _509c = document.body.parentNode.scrollLeft;
  461. var _509d = document.body.parentNode.scrollTop;
  462. var target=event.srcElement ? event.srcElement : event.target;
  463. if(target.className.indexOf("context-menu-item")!=-1)
  464. target.menuItem.execute(diffX + _509c, diffY
  465. + _509d);
  466. else
  467. target.parentNode.menuItem.execute(diffX + _509c, diffY
  468. + _509d);
  469. });
  470. li.attachEvent("onmousedown", function(event) {
  471. event.cancelBubble = true;
  472. event.returnValue = false;
  473. });
  474. li.attachEvent("onmouseup", function(event) {
  475. event.cancelBubble = true;
  476. event.returnValue = false;
  477. });
  478. li.attachEvent("onmouseover", function(event) {
  479. var target=event.srcElement ? event.srcElement : event.target;
  480. if(target.className.indexOf("context-menu-item")!=-1)
  481. target.className="context-menu-item context-menu-active";
  482. else
  483. target.parentNode.className="context-menu-item context-menu-active";
  484. });
  485. li.attachEvent("onmouseout", function(event) {
  486. var target=event.srcElement ? event.srcElement : event.target;
  487. if(target.className.indexOf("context-menu-active")!=-1)
  488. target.className="context-menu-item";
  489. else
  490. target.parentNode.className="context-menu-item";
  491. });
  492. }
  493. }
  494. }
  495. };
  496. draw2d.ContextMenuItem=function(label, iconCls, data ,action){
  497. draw2d.MenuItem.call(this,label,"",action);
  498. this.data = data;
  499. this.iconCls = iconCls;
  500. };
  501. draw2d.ContextMenuItem.prototype = new draw2d.MenuItem();
  502. draw2d.ContextMenuItem.prototype.type = "draw2d.ContextMenuItem";
  503. draw2d.ContextMenuItem.prototype.setIconCls=function(iconCls){
  504. this.iconCls = iconCls;
  505. };
  506. draw2d.ContextMenuItem.prototype.setData=function(data){
  507. this.data = data;
  508. };
  509. draw2d.ContextMenuItem.prototype.getData=function(){
  510. return this.data;
  511. };
  512. draw2d.ContextMenuItem.prototype.execute = function(x, y,f) {
  513. this.parentMenu.workflow.showMenu(null);
  514. this.action(x, y,f);
  515. };
  516. String.prototype.removeLineEnd = function()
  517. {
  518. return this.replace(/(<.+?\s+?)(?:\n\s*?(.+?=".*?"))/g,'$1 $2')
  519. };
  520. function formatXml(text)
  521. {
  522. //去掉多余的空格
  523. text = '\n' + text.replace(/(<\w+)(\s.*?>)/g,function($0, name, props)
  524. {
  525. return name + ' ' + props.replace(/\s+(\w+=)/g," $1");
  526. }).replace(/>\s*?</g,">\n<");
  527. //把注释编码
  528. text = text.replace(/\n/g,'\r').replace(/<!--(.+?)-->/g,function($0, text)
  529. {
  530. var ret = '<!--' + escape(text) + '-->';
  531. //alert(ret);
  532. return ret;
  533. }).replace(/\r/g,'\n');
  534. //调整格式
  535. var rgx = /\n(<(([^\?]).+?)(?:\s|\s*?>|\s*?(\/)>)(?:.*?(?:(?:(\/)>)|(?:<(\/)\2>)))?)/mg;
  536. var nodeStack = [];
  537. var output = text.replace(rgx,function($0,all,name,isBegin,isCloseFull1,isCloseFull2 ,isFull1,isFull2){
  538. var isClosed = (isCloseFull1 == '/') || (isCloseFull2 == '/' ) || (isFull1 == '/') || (isFull2 == '/');
  539. //alert([all,isClosed].join('='));
  540. var prefix = '';
  541. if(isBegin == '!')
  542. {
  543. prefix = getPrefix(nodeStack.length);
  544. }
  545. else
  546. {
  547. if(isBegin != '/')
  548. {
  549. prefix = getPrefix(nodeStack.length);
  550. if(!isClosed)
  551. {
  552. nodeStack.push(name);
  553. }
  554. }
  555. else
  556. {
  557. nodeStack.pop();
  558. prefix = getPrefix(nodeStack.length);
  559. }
  560. }
  561. var ret = '\n' + prefix + all;
  562. return ret;
  563. });
  564. var prefixSpace = -1;
  565. var outputText = output.substring(1);
  566. //把注释还原并解码,调格式
  567. outputText = outputText.replace(/\n/g,'\r').replace(/(\s*)<!--(.+?)-->/g,function($0, prefix, text)
  568. {
  569. //alert(['[',prefix,']=',prefix.length].join(''));
  570. if(prefix.charAt(0) == '\r')
  571. prefix = prefix.substring(1);
  572. text = unescape(text).replace(/\r/g,'\n');
  573. var ret = '\n' + prefix + '<!--' + text.replace(/^\s*/mg, prefix ) + '-->';
  574. //alert(ret);
  575. return ret;
  576. });
  577. return outputText.replace(/\s+$/g,'').replace(/\r/g,'\r\n');
  578. }
  579. function getPrefix(prefixIndex)
  580. {
  581. var span = ' ';
  582. var output = [];
  583. for(var i = 0 ; i < prefixIndex; ++i)
  584. {
  585. output.push(span);
  586. }
  587. return output.join('');
  588. }