/src/FMEContainer.as

https://github.com/niuliwei/FlashFormulaEditor · ActionScript · 224 lines · 222 code · 2 blank · 0 comment · 33 complexity · 922fd0ba422b5b80a99e81d0aed2e05f MD5 · raw file

  1. package
  2. {
  3. import flash.display.Sprite;
  4. public class FMEContainer extends Sprite
  5. {
  6. private var content:Array = new Array();
  7. private var box:boxClass = new boxClass();
  8. private var _level:int;
  9. private var _parent:FMEUnit;
  10. private var ignUpdate:Boolean = true;
  11. private var _leftc:FMEContainer = null;
  12. private var _rightc:FMEContainer = null;
  13. private var _upc:FMEContainer = null;
  14. private var _downc:FMEContainer = null;
  15. public function FMEContainer(parent:FMEUnit,level:int){
  16. _parent = parent;
  17. _level = level;
  18. updateBox();
  19. ignUpdate = false;
  20. }
  21. public function setLRUD(left:FMEContainer,right:FMEContainer,up:FMEContainer,down:FMEContainer):void{
  22. _leftc = left;
  23. _rightc = right;
  24. _upc = up;
  25. _downc = down;
  26. }
  27. public function cheight():Number{
  28. if(content.length==0)
  29. return boxClass.h/2;
  30. var maxcheight:Number = 0;
  31. content.forEach(function (item:FMEUnit,index:int,array:Array):void{
  32. if(item.cheight>maxcheight)
  33. maxcheight = item.cheight;
  34. });
  35. return maxcheight;
  36. }
  37. private function updateBox():void{
  38. if(content.length==0){
  39. if(_parent!=null)
  40. addChild(box);
  41. return;
  42. }
  43. if(contains(box))
  44. removeChild(box);
  45. }
  46. private function updateContent():void{
  47. var cx:Number = 0;
  48. for(var i:int=0;i<content.length;i++){
  49. (content[i] as FMEUnit).ax = cx;
  50. cx+=(content[i] as FMEUnit).awidth;
  51. }
  52. var ch:Number = cheight();
  53. content.forEach(function (item:FMEUnit,index:int,array:Array):void{
  54. item.cy = ch;
  55. item.index = index;
  56. });
  57. }
  58. public function ins(index:int,Latex:String):int{
  59. ignUpdate = true;
  60. var uarr:Array = FMELatexCompiler.compile(Latex,this);
  61. for each (var item:FMEUnit in uarr){
  62. content.splice(index,0,item);
  63. addChild(item);
  64. index++;
  65. }
  66. ignUpdate = false;
  67. update();
  68. return uarr.length;
  69. }
  70. public function del(start:int,end:int):void{
  71. ignUpdate = true;
  72. var darr:Array = content.splice(start,end-start);
  73. darr.forEach(function(item:FMEUnit,index:int,arr:Array):void{
  74. removeChild(item);
  75. });
  76. ignUpdate = false;
  77. update();
  78. }
  79. public function getLatex(start:int,end:int):String{
  80. var latex:String = new String();
  81. var prevlatex:String = null;
  82. var curlatex:String;
  83. for(;start<end;start++){
  84. curlatex = (content[start] as FMEUnit).Latex;
  85. if(prevlatex!=null&&prevlatex.length!=0){
  86. if(prevlatex.charAt(0)=="\\"&&prevlatex.charAt(prevlatex.length-1).match(/[a-zA-Z]/g).length>0
  87. &&curlatex.charAt(0).match(/[a-zA-Z]/g).length>0){
  88. latex += " ";
  89. }
  90. }
  91. latex += curlatex;;
  92. prevlatex = curlatex;
  93. }
  94. return latex;
  95. }
  96. public function ax(index:int):Number{
  97. if(index==0)
  98. return 0;
  99. else if(index==content.length){
  100. var ulast:FMEUnit = content[index-1] as FMEUnit;
  101. return ulast.ax + ulast.awidth;
  102. }else
  103. return (content[index] as FMEUnit).ax;
  104. }
  105. public function ay(start:int,end:int):Number{
  106. if(start==end){
  107. var len:int = content.length;
  108. if(len==0)
  109. return 0;
  110. else if(start==len)
  111. return (content[start-1] as FMEUnit).ay;
  112. else if(start==0)
  113. return (content[start] as FMEUnit).ay;
  114. else{
  115. var lay:Number = (content[start-1] as FMEUnit).ay;
  116. var ray:Number = (content[start] as FMEUnit).ay;
  117. return lay<ray?lay:ray;
  118. }
  119. }else{
  120. var min:Number = Number.MAX_VALUE;
  121. for(;start<end;start++){
  122. var cay:Number = (content[start] as FMEUnit).ay;
  123. if(cay<min)
  124. min = cay;
  125. }
  126. return min;
  127. }
  128. }
  129. public function awidth(start:int,end:int):Number{
  130. var w:Number = 0;
  131. for(;start<end;start++)
  132. w+=(content[start] as FMEUnit).awidth;
  133. return w;
  134. }
  135. public function aheight(start:int,end:int):Number{
  136. if(start==end){
  137. var len:int = content.length;
  138. if(len==0)
  139. return boxClass.h;
  140. else if(start==len)
  141. return (content[start-1] as FMEUnit).aheight;
  142. else if(start==0)
  143. return (content[start] as FMEUnit).aheight;
  144. else{
  145. var lady:Number = (content[start-1] as FMEUnit).y+(content[start-1] as FMEUnit).aheight;
  146. var rady:Number = (content[start] as FMEUnit).y+(content[start] as FMEUnit).aheight;
  147. return (lady>rady?lady:rady)-ay(start,end);
  148. }
  149. }else{
  150. var max:Number = 0;
  151. for(var s:int=start;s<end;s++){
  152. var cady:Number = (content[s] as FMEUnit).y + (content[s] as FMEUnit).aheight;
  153. if(cady>max)
  154. max = cady;
  155. }
  156. return max-ay(start,end);
  157. }
  158. }
  159. public function update():void{
  160. if(!ignUpdate){
  161. var cursor:FMECursor = FMEScreen.scr.cursor;
  162. if(contains(cursor))
  163. removeChild(cursor);
  164. updateContent();
  165. updateBox();
  166. if(_parent!=null)
  167. _parent.update();
  168. }
  169. }
  170. public function length():int{
  171. return content.length;
  172. }
  173. public function getUplvlC():FMEContainer{
  174. return getParent().getParent();
  175. }
  176. public function getParent():FMEUnit{
  177. return _parent;
  178. }
  179. public function get level():int{
  180. return _level;
  181. }
  182. public function get leftc():FMEContainer{
  183. return _leftc;
  184. }
  185. public function get rightc():FMEContainer{
  186. return _rightc;
  187. }
  188. public function get upc():FMEContainer{
  189. return _upc;
  190. }
  191. public function get downc():FMEContainer{
  192. return _downc;
  193. }
  194. }
  195. }
  196. import flash.display.Sprite;
  197. import flash.events.MouseEvent;
  198. class boxClass extends Sprite{
  199. public static const h:Number = 70;
  200. public static const lspace:Number = 5;
  201. [Embed(source="/svgs/box.svg")]
  202. private var svgBox:Class;
  203. private var svg:Sprite = new svgBox();
  204. public function boxClass(){
  205. svg.x = lspace;
  206. svg.y = h/2-svg.height/2;
  207. hitArea = new Sprite();
  208. hitArea.graphics.drawRect(0,0,lspace+svg.width,h);
  209. addChild(hitArea);
  210. addChild(svg);
  211. addEventListener(MouseEvent.MOUSE_DOWN,function(event:MouseEvent):void{
  212. FMEScreen.scr.cursor.setCursor((parent as FMEContainer),0,(parent as FMEContainer),0);
  213. event.stopPropagation();
  214. });
  215. addEventListener(MouseEvent.MOUSE_UP,function(event:MouseEvent):void{
  216. event.stopPropagation();
  217. });
  218. addEventListener(MouseEvent.MOUSE_MOVE,function(event:MouseEvent):void{
  219. event.stopPropagation();
  220. });
  221. }
  222. }