Table.js 15 KB

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