Table.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. MWF.xApplication.process.FormDesigner.Module = MWF.xApplication.process.FormDesigner.Module || {};
  2. MWF.xDesktop.requireApp("process.FormDesigner", "Module.$Component", null, false);
  3. MWF.xDesktop.requireApp("process.FormDesigner", "Module.Table$Td", null, false);
  4. MWF.xApplication.process.FormDesigner.Module.Table = MWF.FCTable = new Class({
  5. Extends: MWF.FC$Component,
  6. Implements: [Options, Events],
  7. options: {
  8. "style": "default",
  9. "propertyPath": "/x_component_process_FormDesigner/Module/Table/table.html",
  10. "propertyMultiPath": "/x_component_process_FormDesigner/Module/Table$Td/table$tdMulti.html",
  11. "multiActions": [
  12. {
  13. "name": "mergerCell",
  14. "icon": "mergerCell.png",
  15. "event": "click",
  16. "action": "mergerCell",
  17. "title": MWF.APPFD.LP.formAction.mergerCell
  18. }
  19. ]
  20. },
  21. initialize: function(form, options){
  22. this.setOptions(options);
  23. this.path = "/x_component_process_FormDesigner/Module/Table/";
  24. this.cssPath = "/x_component_process_FormDesigner/Module/Table/"+this.options.style+"/css.wcss";
  25. this._loadCss();
  26. this.moduleType = "component";
  27. this.moduleName = "table";
  28. this.form = form;
  29. this.container = null;
  30. this.containerNode = null;
  31. this.containers = [];
  32. this.elements = [];
  33. this.selectedMultiTds = [];
  34. },
  35. clearTemplateStyles: function(styles){
  36. if (styles){
  37. if (styles.styles) this.removeStyles(styles.styles, "styles");
  38. if (styles.properties) this.removeStyles(styles.properties, "properties");
  39. if (styles.titleStyles) this.removeStyles(styles.titleStyles, "titleTdStyles");
  40. if (styles.contentStyles) this.removeStyles(styles.contentStyles, "contentTdStyles");
  41. if (styles.layoutStyles) this.removeStyles(styles.layoutStyles, "layoutTdStyles");
  42. }
  43. },
  44. setTemplateStyles: function(styles){
  45. if (styles.styles) this.copyStyles(styles.styles, "styles");
  46. if (styles.properties) this.copyStyles(styles.properties, "properties");
  47. if (styles.titleStyles) this.copyStyles(styles.titleStyles, "titleTdStyles");
  48. if (styles.contentStyles) this.copyStyles(styles.contentStyles, "contentTdStyles");
  49. if (styles.layoutStyles) this.copyStyles(styles.layoutStyles, "layoutTdStyles");
  50. },
  51. _createMoveNode: function(){
  52. var tableHTML = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"2\" width=\"100%\" align=\"center\">";
  53. tableHTML += "<tr><td></td><td></td><td></td></tr>";
  54. tableHTML += "<tr><td></td><td></td><td></td></tr>";
  55. tableHTML += "<tr><td></td><td></td><td></td></tr>";
  56. tableHTML += "</table>";
  57. this.moveNode = new Element("div", {
  58. "html": tableHTML
  59. }).inject(this.form.container);
  60. // this.moveNode = divNode.getFirst();
  61. // this.moveNode.inject(divNode, "after");
  62. // divNode.destroy();
  63. this.moveNode.setStyles(this.css.moduleNodeMove);
  64. this._setTableStyle();
  65. },
  66. _setTableStyle: function(){
  67. var tds = this.moveNode.getElements("td");
  68. //var tds = this._getTds(this.moveNode);
  69. tds.setStyles({
  70. "border": "1px dashed #999",
  71. "height": "20px"
  72. });
  73. },
  74. _getTds: function(node){
  75. tds = [];
  76. var table = (node || this.node).getElement("table");
  77. var rows = table.rows;
  78. for (var i=0; i<rows.length; i++){
  79. var row = rows[i];
  80. for (var j=0; j<row.cells.length; j++){
  81. tds.push(row.cells[j]);
  82. }
  83. }
  84. return tds;
  85. },
  86. _checkSelectedTds: function(sp, ep){
  87. this.selectedMultiTds = [];
  88. //var tds = this.node.getElements("td");
  89. var tds = this._getTds();
  90. // var tmpSelectedTds = [];
  91. // var startXList = [];
  92. // var startYList = [];
  93. // var endXList = [];
  94. // var endYList = [];
  95. var sx = sp.x, sy = sp.y, ex = ep.x, ey = ep.y;
  96. while (true){
  97. var tmpsx = sp.x, tmpsy = sp.y, tmpex = ep.x, tmpey = ep.y;
  98. tds.each(function(td){
  99. if (td.isInPointInRect(sx, sy, ex, ey)){
  100. var position = td.getPosition();
  101. var size = td.getSize();
  102. if (!tmpsx || position.x<tmpsx) tmpsx = position.x;
  103. if (!tmpsy || position.y<tmpsy) tmpsy = position.y;
  104. if (!tmpex || position.x+size.x>tmpex) tmpex = position.x+size.x;
  105. if (!tmpey || position.y+size.y>tmpey) tmpey = position.y+size.y;
  106. }
  107. }.bind(this));
  108. if (sx==tmpsx && sy==tmpsy && ex==tmpex && ey==tmpey) break;
  109. sx = tmpsx, sy = tmpsy, ex = tmpex, ey = tmpey;
  110. }
  111. tds.each(function(td){
  112. var module = td.retrieve("module");
  113. if (td.isInPointInRect(sx, sy, ex, ey)){
  114. module.selectedMulti();
  115. }else{
  116. module.unSelectedMulti();
  117. }
  118. }.bind(this));
  119. },
  120. _setOtherNodeEvent: function(){
  121. this.dragInfor = {};
  122. this.tdDragSelect = new Drag(this.node, {
  123. "stopPropagation": true,
  124. "preventDefault": true,
  125. "onStart": function(el, e){
  126. this.form._beginSelectMulti();
  127. var position = e.event.target.getPosition();
  128. this.dragInfor.start = {"x": e.event.offsetX+position.x, "y": e.event.offsetY+position.y};
  129. }.bind(this),
  130. "onDrag": function(el, e){
  131. var position = e.event.target.getPosition();
  132. var p = {"x": e.event.offsetX+position.x, "y": e.event.offsetY+position.y};
  133. this._checkSelectedTds(this.dragInfor.start, p);
  134. e.stopPropagation();
  135. }.bind(this),
  136. "onComplete": function(el, e){
  137. var position = e.event.target.getPosition();
  138. var p = {"x": e.event.offsetX+position.x, "y": e.event.offsetY+position.y};
  139. this._checkSelectedTds(this.dragInfor.start, p);
  140. this.form._completeSelectMulti();
  141. this._createMultiSelectedActions();
  142. this.showMultiProperty();
  143. e.stopPropagation();
  144. e.preventDefault();
  145. }.bind(this)
  146. });
  147. },
  148. showMultiProperty: function(){
  149. if (this.form.propertyMultiTd){
  150. this.form.propertyMultiTd.hide();
  151. this.form.propertyMultiTd = null;
  152. }
  153. this.form.propertyMultiTd = new MWF.xApplication.process.FormDesigner.PropertyMulti(this.form, this.form.selectedModules, this.form.designer.propertyContentArea, this.form.designer, {
  154. "path": this.options.propertyMultiPath,
  155. "onPostLoad": function(){
  156. this.show();
  157. }
  158. });
  159. this.form.propertyMultiTd.load();
  160. },
  161. _createMultiSelectedActions: function(){
  162. if (this.form.selectedModules.length>1){
  163. if (this.form.multimoduleActionsArea){
  164. this.form.multimoduleActionsArea.empty();
  165. this.options.multiActions.each(function(action){
  166. var actionNode = new Element("div", {
  167. "styles": this.options.actionNodeStyles,
  168. "title": action.title
  169. }).inject(this.form.multimoduleActionsArea);
  170. actionNode.setStyle("background", "url("+this.path+this.options.style+"/icon/"+action.icon+") no-repeat left center");
  171. actionNode.addEvent(action.event, function(e){
  172. this[action.action](e);
  173. }.bind(this));
  174. }.bind(this));
  175. this.form.multimoduleActionsArea.setStyle("width", 18*this.options.multiActions.length);
  176. }
  177. }else{
  178. this.form.multimoduleActionsArea.setStyle("display", "none");
  179. }
  180. },
  181. mergerCell: function(){
  182. if (this.form.selectedModules.length>1){
  183. var firstModuleObj = this.form._getFirstMultiSelectedModule();
  184. var firstModule = firstModuleObj.module;
  185. // var n=0;
  186. var td = firstModule.node;
  187. var colspan = 0;
  188. while (td && this.form.selectedModules.indexOf(td.retrieve("module"))!=-1 ){
  189. var tmpColspan = td.get("colspan").toInt() || 1;
  190. colspan = colspan+tmpColspan;
  191. td = td.getNext("td");
  192. }
  193. var maxRowIndex = Number.NEGATIVE_INFINITY;
  194. var minRowIndex = Number.POSITIVE_INFINITY;
  195. this.form.selectedModules.each(function(module, idx){
  196. var rIdx = module.node.getParent("tr").rowIndex;
  197. var tmpRowspan = module.node.get("rowspan").toInt() || 1;
  198. var rows = rIdx+tmpRowspan-1;
  199. maxRowIndex = Math.max(maxRowIndex, rows);
  200. minRowIndex = Math.min(minRowIndex, rows);
  201. }.bind(this));
  202. var rowspan = maxRowIndex-minRowIndex+1;
  203. if (colspan>1){
  204. firstModule.node.set("colspan", colspan);
  205. firstModule.json.properties.colspan = colspan;
  206. }else{
  207. firstModule.node.set("colspan", 1);
  208. delete firstModule.node.colspan;
  209. delete firstModule.json.properties.colspan;
  210. }
  211. if (rowspan>1){
  212. firstModule.node.set("rowspan", rowspan);
  213. firstModule.json.properties.rowspan = rowspan;
  214. }else{
  215. firstModule.node.set("rowspan", 1);
  216. delete firstModule.node.rowspan;
  217. delete firstModule.json.properties.rowspan;
  218. }
  219. while (this.form.selectedModules.length){
  220. var module = this.form.selectedModules[0];
  221. this.form.selectedModules.erase(module);
  222. if (module!==firstModule){
  223. var modules = module._getSubModule();
  224. modules.each(function(module){
  225. module._moveTo(firstModule);
  226. });
  227. this.containers.erase(module);
  228. module.destroy();
  229. }
  230. }
  231. firstModule.selected();
  232. }
  233. },
  234. _getContainers: function(){
  235. //var tds = this.node.getElements("td");
  236. var tds = this._getTds();
  237. this.form.getTemplateData("Table$Td", function(data){
  238. tds.each(function(td){
  239. var json = this.form.getDomjson(td);
  240. var tdContainer = null;
  241. if (!json){
  242. var moduleData = Object.clone(data);
  243. tdContainer = new MWF.FCTable$Td(this.form);
  244. tdContainer.table = this;
  245. tdContainer.load(moduleData, td, this);
  246. }else{
  247. tdContainer = new MWF.FCTable$Td(this.form);
  248. tdContainer.table = this;
  249. tdContainer.load(json, td, this);
  250. }
  251. this.containers.push(tdContainer);
  252. }.bind(this));
  253. }.bind(this));
  254. },
  255. _getElements: function(){
  256. // this.elements.push(this);
  257. },
  258. _createNode: function(callback){
  259. var module = this;
  260. var url = this.path+"tableCreate.html";
  261. MWF.require("MWF.widget.Dialog", function(){
  262. var size = $(document.body).getSize();
  263. var x = size.x/2-180;
  264. var y = size.y/2-130;
  265. var dlg = new MWF.DL({
  266. "title": "Create Table",
  267. "style": "property",
  268. "top": y,
  269. "left": x-40,
  270. "fromTop":size.y/2-65,
  271. "fromLeft": size.x/2,
  272. "width": 360,
  273. "height": 260,
  274. "url": url,
  275. "buttonList": [
  276. {
  277. "text": MWF.APPFD.LP.button.ok,
  278. "action": function(){
  279. module._createTableNode();
  280. callback();
  281. this.close();
  282. }
  283. }
  284. ]
  285. });
  286. dlg.show();
  287. }.bind(this));
  288. },
  289. _createTableNode: function(){
  290. var rows = $("MWFNewTableLine").get("value");
  291. var cols = $("MWFNewTableColumn").get("value");
  292. var width = $("MWFNewTableWidth").get("value");
  293. var widthUnitNode = $("MWFNewTableWidthUnit");
  294. var widthUnit = widthUnitNode.options[widthUnitNode.selectedIndex].value;
  295. var border = $("MWFNewTableBorder").get("value");
  296. var cellpadding = $("MWFNewTableCellpadding").get("value");
  297. var cellspacing = $("MWFNewTableCellspacing").get("value");
  298. var w = "";
  299. if (widthUnit=="percent"){
  300. w = width+"%";
  301. }else{
  302. w = width+"px";
  303. }
  304. this.json.properties.width = w;
  305. this.json.properties.border = border;
  306. this.json.properties.cellpadding = cellpadding;
  307. this.json.properties.cellspacing = cellspacing;
  308. var tableHTML = "<table border=\""+border+"\" cellpadding=\""+cellpadding+"\" cellspacing=\""+cellspacing+"\" width=\""+w+"\" align=\"center\">";
  309. for (var i=0; i<rows.toInt(); i++){
  310. tableHTML += "<tr>";
  311. for (var j=0; j<cols.toInt(); j++){
  312. tableHTML += "<td></td>";
  313. }
  314. tableHTML += "</tr>";
  315. }
  316. tableHTML += "</table>";
  317. this.node = this.node = new Element("div", {
  318. "id": this.json.id,
  319. "MWFType": "table",
  320. "html": tableHTML,
  321. "styles": this.css.moduleNode,
  322. "events": {
  323. "selectstart": function(e){
  324. e.preventDefault();
  325. }
  326. }
  327. }).inject(this.form.node);
  328. //if (w!="100%"){
  329. // this.node.setStyle("width", w);
  330. //}
  331. },
  332. _dragComplete: function(){
  333. if (!this.node){
  334. this._createNode(function(){
  335. this._dragMoveComplete();
  336. }.bind(this));
  337. }else{
  338. this._dragMoveComplete();
  339. }
  340. },
  341. _dragMoveComplete: function(){
  342. this._resetTreeNode();
  343. this.node.inject(this.copyNode, "before");
  344. this._initModule();
  345. var thisDisplay = this.node.retrieve("thisDisplay");
  346. if (thisDisplay){
  347. this.node.setStyle("display", thisDisplay);
  348. }
  349. if (this.copyNode) this.copyNode.destroy();
  350. if (this.moveNode) this.moveNode.destroy();
  351. this.moveNode = null;
  352. this.copyNode = null;
  353. this.nextModule = null;
  354. this.form.moveModule = null;
  355. this.form.json.moduleList[this.json.id] = this.json;
  356. this.selected();
  357. },
  358. setPropertiesOrStyles: function(name){
  359. if (name=="styles"){
  360. var border = this.node.getStyle("border");
  361. this.node.clearStyles();
  362. this.node.setStyles(this.css.moduleNode);
  363. this.node.setStyle("border", border);
  364. Object.each(this.json.styles, function(value, key){
  365. var reg = /^border\w*/ig;
  366. if (!key.test(reg)){
  367. this.node.setStyle(key, value);
  368. }
  369. }.bind(this));
  370. }
  371. if (name=="properties"){
  372. this.node.getFirst().setProperties(this.json.properties);
  373. //if (this.json.properties.width){
  374. // if (this.json.properties.width!="100%"){
  375. // this.node.setStyle("width", this.json.properties.width);
  376. // }
  377. //}
  378. }
  379. },
  380. _setEditStyle_custom: function(name, obj, oldValue){
  381. if (name=="id"){
  382. if (name!=oldValue){
  383. var reg = new RegExp("^"+oldValue, "i");
  384. this.containers.each(function(container){
  385. var id = container.json.id;
  386. var newId = id.replace(reg, this.json.id);
  387. container.json.id = newId;
  388. delete this.form.json.moduleList[id];
  389. this.form.json.moduleList[newId] = container.json;
  390. container._setEditStyle("id");
  391. }.bind(this));
  392. }
  393. }
  394. if (name=="titleTdStyles") this.setTabStyles();
  395. if (name=="contentTdStyles") this.setTabStyles();
  396. if (name=="layoutTdStyles") this.setTabStyles();
  397. },
  398. setTabStyles: function(){
  399. this.containers.each(function(module){
  400. //if (module.json.cellType=="title"){
  401. //
  402. //}
  403. //if (module.json.cellType=="content"){
  404. //
  405. //}
  406. //if (module.json.cellType=="layout"){
  407. //
  408. //}
  409. module.setCustomStyles();
  410. }.bind(this));
  411. },
  412. setAllStyles: function(){
  413. this.setPropertiesOrStyles("styles");
  414. this.setPropertiesOrStyles("properties");
  415. this.setTabStyles();
  416. this.reloadMaplist();
  417. },
  418. copyComponentJsonData: function(newNode, pid){
  419. //var tds = newNode.getElements("td");
  420. var tds = this._getTds(newNode);
  421. // this.form.getTemplateData("Table$Td", function(data){
  422. tds.each(function(td, idx){
  423. var newContainerJson = Object.clone(this.containers[idx].json);
  424. newContainerJson.id = this.containers[idx]._getNewId(pid);
  425. this.form.json.moduleList[newContainerJson.id] = newContainerJson;
  426. td.set("id", newContainerJson.id);
  427. }.bind(this));
  428. // }.bind(this));
  429. },
  430. // setOtherNodeEvent: function(){
  431. //// var tds = this.node.getElements("td");
  432. //// tds.addEvent("click", function(e){
  433. //// this.selectedTd(e.target);
  434. //// }.bind(this));
  435. // },
  436. //
  437. // selectedTd: function(td){
  438. // if (this.currentSelectedTd){
  439. // if (this.currentSelectedTd==td){
  440. // return true;
  441. // }else{
  442. // this.unSelectedTd(this.currentSelectedTd);
  443. // }
  444. // }
  445. //
  446. // var top = td.getStyle("border-top");
  447. // var left = td.getStyle("border-left");
  448. // var bottom = td.getStyle("border-bottom");
  449. // var right = td.getStyle("border-right");
  450. // td.store("thisborder", {"top": top, "left": left, "bottom": bottom, "right": right});
  451. //
  452. // td.setStyles({
  453. // "border": "1px dashed #ff6b49"
  454. // });
  455. // this.currentSelectedTd = td;
  456. // },
  457. // unSelectedTd: function(td){
  458. // var border = td.retrieve("thisborder");
  459. // if (border) {
  460. // td.setStyles({
  461. // "border-top": border.top,
  462. // "border-left": border.left,
  463. // "border-bottom": border.bottom,
  464. // "border-right": border.right
  465. // });
  466. // }
  467. // this.currentSelectedTd = null;
  468. // },
  469. getContainerNodes: function(){
  470. //return this.node.getElements("td");
  471. return this._getTds();
  472. }
  473. });