Editor.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. MWF.xDesktop.requireApp("ScriptEditor", "statement.Package", null, false);
  2. MWF.xDesktop.requireApp("ScriptEditor", "block.Package", null, false);
  3. MWF.xDesktop.requireApp("ScriptEditor", "ScriptArea", null, false);
  4. MWF.xApplication.ScriptEditor.Editor = new Class({
  5. Extends: MWF.widget.Common,
  6. Implements: [Options, Events],
  7. options: {
  8. "style": "default"
  9. },
  10. _loadPath: function(){
  11. this.path = "/x_component_ScriptEditor/$Editor/";
  12. this.cssPath = "/x_component_ScriptEditor/$Editor/"+this.options.style+"/css.wcss";
  13. },
  14. initialize: function(node, app, options){
  15. this.setOptions(options);
  16. this._loadPath();
  17. this._loadCss();
  18. this.node = $(node);
  19. this.app = app;
  20. this.moduleTypes = [];
  21. this.currentModuleType = null;
  22. },
  23. load: function(){
  24. this.moduleAreaNode = new Element("div", {"styles": this.css.moduleAreaNode}).inject(this.node);
  25. this.resizeAreaNode = new Element("div", {"styles": this.css.resizeAreaNode}).inject(this.node);
  26. this.scriptAreaNode = new Element("div", {"styles": this.css.scriptAreaNode}).inject(this.node);
  27. this.scriptArea = new MWF.xApplication.ScriptEditor.ScriptArea(this);
  28. this.moduleTypeAreaNode = new Element("div", {"styles": this.css.moduleTypeAreaNode}).inject(this.moduleAreaNode);
  29. this.moduleBlockAreaNode = new Element("div", {"styles": this.css.moduleBlockAreaNode}).inject(this.moduleAreaNode);
  30. // this.setAreaSizeFun = this.setAreaSize.bind(this);
  31. // this.app.addEvent("resize", this.setAreaSizeFun);
  32. // this.setAreaSize();
  33. this.getModule(function(){
  34. Object.each(this.json, function(v, k){
  35. v.name = k;
  36. this.createModuleType(v);
  37. }.bind(this));
  38. }.bind(this));
  39. },
  40. // setAreaSize: function(){
  41. // var size = this.moduleAreaNode.getSize();
  42. // var moduleTypeSize = this.moduleTypeAreaNode.getSize();
  43. // debugger;
  44. // var margin = this.moduleTypeAreaNode.getStyles("margin-top", "margin-bottom");
  45. // var y = size.y-moduleTypeSize.y-margin["margin-top"].toInt()-margin["margin-bottom"].toInt();
  46. // this.moduleBlockAreaNode.setStyle("height", ""+y+"px");
  47. // },
  48. getModule: function(callback){
  49. MWF.getJSON("/x_component_ScriptEditor/$Editor/block.json", function(json){
  50. this.json = json;
  51. if (callback) callback();
  52. }.bind(this));
  53. },
  54. createModuleType: function(data){
  55. this.moduleTypes.push(new MWF.xApplication.ScriptEditor.Editor.ModuleType(data, this));
  56. }
  57. });
  58. MWF.xApplication.ScriptEditor.Editor.ModuleType = new Class({
  59. initialize: function(data, editor){
  60. this.data = data;
  61. this.editor = editor;
  62. this.typeAreaNode = this.editor.moduleTypeAreaNode;
  63. this.blockAreaNode = this.editor.moduleBlockAreaNode;
  64. this.css = this.editor.css;
  65. this.blocks = [];
  66. this.load();
  67. },
  68. load: function(){
  69. this.node = new Element("div", {"styles": this.css.moduleTypeNode}).inject(this.typeAreaNode);
  70. this.colorNode = new Element("div", {"styles": this.css.moduleTypeColorNode}).inject(this.node);
  71. this.iconNode = new Element("div", {"styles": this.css.moduleTypeIconNode}).inject(this.colorNode);
  72. this.textNode = new Element("div", {"styles": this.css.moduleTypeTextNode}).inject(this.node);
  73. this.colorNode.setStyle("background-color", this.data.color);
  74. this.iconNode.setStyle("background-image", "url("+this.editor.path+this.editor.options.style+"/icon/"+this.data.icon+")");
  75. this.textNode.set("text", this.data.text);
  76. this.node.addEvent("click", function(){
  77. this.selected();
  78. }.bind(this));
  79. },
  80. selected: function(){
  81. if (this.editor.currentModuleType) this.editor.currentModuleType.unselected();
  82. this.node.setStyle("background", this.data.color);
  83. this.textNode.setStyle("color", "#ffffff");
  84. this.editor.currentModuleType = this;
  85. this.showBlockArea();
  86. },
  87. unselected: function(){
  88. if (this.editor.currentModuleType.data.name===this.data.name){
  89. this.node.setStyle("background", "transparent");
  90. this.textNode.setStyles(this.css.moduleTypeTextNode);
  91. this.editor.currentModuleType = null;
  92. this.hiddenBlockArea();
  93. }
  94. },
  95. showBlockArea: function(){
  96. if (!this.blocksNode) this.createBlocksNode();
  97. this.blocksNode.setStyle("display", "block");
  98. },
  99. createBlocksNode: function(){
  100. this.blocksNode = new Element("div", {"styles": this.css.moduleBlocksNode}).inject(this.blockAreaNode);
  101. if (this.data.blocks && this.data.blocks.length){
  102. this.data.blocks.each(function(block){
  103. this.createBlock(block);
  104. }.bind(this));
  105. }else if (this.data.blockLink){
  106. MWF.getJSON("/x_component_ScriptEditor/$Editor/"+this.data.blockLink, function(json){
  107. this.data.blocks = json;
  108. this.data.blocks.each(function(block){
  109. this.createBlock(block);
  110. }.bind(this));
  111. }.bind(this));
  112. }
  113. },
  114. createBlock: function(block){
  115. //this.blocks.push(new MWF.xApplication.ScriptEditor.Editor.Block(block, this));
  116. if (block.class){
  117. //MWF.xDesktop.requireApp("ScriptEditor", "block."+block.class, function(){
  118. var classPath = ("block."+block.class).split(".");
  119. var clazz = MWF.xApplication.ScriptEditor;
  120. classPath.each(function(p){ if (clazz){clazz = clazz[p];} }.bind(this));
  121. if (!clazz) clazz = this.createClazz(block);
  122. if (clazz) this.blocks.push(new clazz(block, this));
  123. //}.bind(this));
  124. }else if (block.type === "category"){
  125. var lineNode = new Element("div", {"styles": this.css.moduleBlocksSplitLineNode}).inject(this.blocksNode);
  126. var leftNode = new Element("div", {"styles": this.css.moduleBlocksSplitLineLeftNode}).inject(lineNode);
  127. var textNode = new Element("div", {"styles": this.css.moduleBlocksSplitLineTextNode}).inject(lineNode);
  128. var rightNode = new Element("div", {"styles": this.css.moduleBlocksSplitLineRightNode}).inject(lineNode);
  129. textNode.set("text", block.name);
  130. }
  131. },
  132. createClazz: function(block){
  133. var clazz = MWF.xApplication.ScriptEditor;
  134. var classPath = ("block."+block.class).split(".");
  135. classPath.each(function(p, i){
  136. if (i===(classPath.length-1)){
  137. clazz[p] = new Class({
  138. Extends: MWF.xApplication.ScriptEditor.block.$Block[block.extend]
  139. });
  140. clazz = clazz[p];
  141. }else{
  142. clazz = clazz[p];
  143. if (!clazz) clazz = {};
  144. }
  145. }.bind(this));
  146. return clazz;
  147. },
  148. hiddenBlockArea: function(){
  149. if (this.blocksNode) this.blocksNode.setStyle("display", "none");
  150. }
  151. });
  152. MWF.SES.zIndexPool = {
  153. zIndex: 200,
  154. apply: function(){
  155. var i = this.zIndex;
  156. this.zIndex = this.zIndex+1;
  157. return i;
  158. }
  159. };