PageRenderTime 55ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/cutload/CutLoad/components/CComboBox.as

http://cutload.googlecode.com/
ActionScript | 386 lines | 255 code | 7 blank | 124 comment | 27 complexity | 116ab073c47816d21b0d1740e46df420 MD5 | raw file
  1. package CutLoad.components
  2. {
  3. import CutLoad.*;
  4. import CutLoad.cookies.Fun;
  5. import flash.display.Graphics;
  6. import flash.display.Sprite;
  7. import flash.events.Event;
  8. import flash.events.MouseEvent;
  9. import flash.geom.Rectangle;
  10. /**
  11. * ????
  12. * @author smallerbird mail:smallerbird@gmail.com site:www.mkigm.com QQ?:49983196
  13. *
  14. */
  15. public class CComboBox extends Base
  16. {
  17. //??????
  18. private var isSetKin:Boolean=false;
  19. //??
  20. private var strTip:String;
  21. //?????????????
  22. private var btnCombo_leftWidth:Number
  23. //????
  24. private var btnCombo:CButton;
  25. //
  26. private var arrData:Array;
  27. //??
  28. private var maxWidth:Number=0
  29. //????????????
  30. private var isOpen:Boolean=false
  31. //
  32. private var funClickItem:Function
  33. private var spBtnsParent:Sprite;
  34. //?????
  35. private var downType:uint
  36. //?????
  37. private var mouseOpenArea:Rectangle;
  38. //????Sprite
  39. private var spViewArea:Sprite=null
  40. //??????????????????
  41. private var spBtns:Sprite;
  42. //???????
  43. private var currentObj:Object=null;
  44. //
  45. /**
  46. * ???????CComboBox??
  47. * @param parent
  48. * @param downType
  49. * @param tip
  50. * @param clickItem
  51. * @return
  52. *
  53. */
  54. public static function getSimple(parent:Sprite,downType:uint=0,tip:String="???..",clickItem:Function=null):CComboBox{
  55. var cb:CComboBox=new CComboBox();
  56. cb.init(parent,downType,tip,clickItem);
  57. return cb;
  58. }
  59. public function CComboBox()
  60. {
  61. }
  62. /**
  63. * ???
  64. * @param parent ????????????,????????????????????????
  65. * @param downType ?????????:0 ?? 1?? 2?????? 3??????
  66. * @param tip ????????
  67. * @param clickItem ???????????? function(obj:Object) obj????{label:label,data:data}
  68. *
  69. */
  70. public function init(parent:Sprite,downType:uint=0,tip:String="???..",clickItem:Function=null):void{
  71. if(downType<0||downType>3) throw new Error("????????????:0 ?? 1?? 2?????? 3??????");
  72. strTip=tip;
  73. spBtnsParent=parent;
  74. spBtns=new Sprite();
  75. //
  76. spBtnsParent.addChild(spBtns);
  77. this.downType=downType;
  78. mouseOpenArea=new Rectangle();
  79. //
  80. this.funClickItem=clickItem
  81. arrData=new Array();
  82. //
  83. btnCombo_leftWidth=16
  84. if(!isSetKin){
  85. var sysKinTem:Array=Skin.getInstance().getSkin(3);
  86. btnCombo_leftWidth=sysKinTem[1][0]
  87. setSkin(sysKinTem)
  88. }
  89. }
  90. /**
  91. * ????
  92. * @param arrClasname
  93. * @return
  94. *
  95. */
  96. public function setSkin(arrClasname:Array):CComboBox{
  97. btnCombo=new CButton();
  98. btnCombo.setSkin(arrClasname[0],strTip);
  99. btnCombo.init(strTip,true,true,false);
  100. btnCombo.addEventListener(MouseEvent.CLICK,btnCombo_click);
  101. this.addChild(btnCombo);
  102. //
  103. isSetKin=true;
  104. return this;
  105. }
  106. /**
  107. * ?? ????????????
  108. * @param clickItem ??? function(obj:Object) obj????{label:label,data:data}
  109. * @return
  110. *
  111. */
  112. public function setFunClickItem(clickItem:Function):void{
  113. this.funClickItem=clickItem;
  114. }
  115. private function btnCombo_click(e:MouseEvent):void{
  116. if(!this.isOpen){
  117. this.open()
  118. }else{
  119. this.close();
  120. }
  121. }
  122. private function addCheckMouseOnMe():void{
  123. if(!this.hasEventListener(Event.ENTER_FRAME)){
  124. this.addEventListener(Event.ENTER_FRAME,CheckMouseOnMe_fun);
  125. //trace("addd......")
  126. }
  127. }
  128. //?????????????????????
  129. private function CheckMouseOnMe_fun(e:Event):void{
  130. //
  131. var mousexx:Number=this.spBtnsParent.mouseX;
  132. var mouseyy:Number=this.spBtnsParent.mouseY;
  133. var x1:Number=mouseOpenArea.x;
  134. var x2:Number=mouseOpenArea.x+mouseOpenArea.width;
  135. var y1:Number=mouseOpenArea.y;
  136. var y2:Number=mouseOpenArea.y+mouseOpenArea.height;
  137. if(mousexx>=x1&&mousexx<=x2&&mouseyy>=y1&&mouseyy<=y2){
  138. if(this.downType==2||this.downType==3){
  139. x1=this.x+this.btnCombo.getShowWidth();
  140. y1=this.y
  141. y2=this.y+this.btnCombo.getShowHeight();
  142. //
  143. /*var ggg:Graphics=spBtnsParent.graphics;
  144. ggg.clear()
  145. ggg.beginFill(0x0000ff,0.3);
  146. ggg.drawRect(x1,y1,Math.abs(x2-x1),Math.abs(y2-y1));
  147. ggg.endFill()*/
  148. if(mousexx>=x1&&mousexx<=x2&&mouseyy>=y1&&mouseyy<=y2){
  149. this.close();
  150. }
  151. }
  152. }else{
  153. this.close();
  154. }
  155. }
  156. private function removeCheckMouseOnMe():void{
  157. if(this.hasEventListener(Event.ENTER_FRAME)){
  158. //trace("close..")
  159. this.removeEventListener(Event.ENTER_FRAME,CheckMouseOnMe_fun);
  160. }
  161. }
  162. /**
  163. * ?????????
  164. * @return object??????{label:label,data:data}
  165. *
  166. */
  167. public function get value():Object{
  168. return currentObj;
  169. }
  170. /**
  171. * ??????,????????????????? {label:????,data:????,btn:?????}
  172. * @return
  173. *
  174. */
  175. public function getData():Array{
  176. return this.arrData;
  177. }
  178. /**
  179. * ?????? ?????????????{label:????,data:????} ???label????
  180. * @param label ??
  181. * @param data ??
  182. * @return
  183. *
  184. */
  185. public function addItem(label:String,data:String=null):CComboBox{
  186. var item:Object={label:label,data:data};
  187. if(item.label==null) throw new Error("???????????{label:????,data:????} ???label????");
  188. //????data?????????
  189. if(item.data==null) item.data=item.label;
  190. //
  191. var itemBtn:CButton=new CButton();
  192. itemBtn.init(label,true,true,false,true);
  193. itemBtn.setOtherInfo(item);
  194. item.btn=itemBtn;
  195. //????????
  196. setMaxWidth(itemBtn)
  197. //
  198. var parentR:Rectangle=this.getRect(spBtnsParent);
  199. //
  200. switch(downType){
  201. case 1:
  202. itemBtn.x=parentR.x;
  203. if(this.arrData.length!=0){
  204. itemBtn.y=this.arrData[this.arrData.length-1].btn.y-itemBtn.getShowHeight();
  205. }else{
  206. itemBtn.y=btnCombo.y+parentR.y-itemBtn.getShowHeight();
  207. }
  208. mouseOpenArea.x=itemBtn.x;
  209. mouseOpenArea.y=itemBtn.y;
  210. mouseOpenArea.width=maxWidth;
  211. mouseOpenArea.height=btnCombo.getShowHeight()+Math.abs(itemBtn.y-parentR.y);
  212. break;
  213. case 2:
  214. case 3:
  215. if(downType==2){
  216. itemBtn.y=btnCombo.y+itemBtn.getShowHeight()+parentR.y
  217. }else{
  218. itemBtn.y=btnCombo.y-itemBtn.getShowHeight()+parentR.y
  219. }
  220. if(this.arrData.length!=0){
  221. itemBtn.x=this.arrData[this.arrData.length-1].btn.getXYRightUp().x;
  222. }else{
  223. itemBtn.x=parentR.x;
  224. }
  225. if(downType==2){
  226. mouseOpenArea.x=parentR.x;
  227. mouseOpenArea.y=parentR.y;
  228. }else{
  229. if(this.arrData.length==0){
  230. mouseOpenArea.x=itemBtn.x;
  231. mouseOpenArea.y=itemBtn.y;
  232. }else{
  233. mouseOpenArea.x=this.arrData[0].btn.x;
  234. mouseOpenArea.y=this.arrData[0].btn.y;
  235. }
  236. }
  237. mouseOpenArea.width=itemBtn.getXYRightUp().x-parentR.x;
  238. mouseOpenArea.height=itemBtn.getShowHeight()+btnCombo.getShowHeight();
  239. break;
  240. default:
  241. itemBtn.x=parentR.x;
  242. if(this.arrData.length!=0){
  243. itemBtn.y=this.arrData[this.arrData.length-1].btn.getXYRightDown().y;
  244. }else{
  245. itemBtn.y=btnCombo.getXYRightDown().y+parentR.y;
  246. }
  247. mouseOpenArea.x=parentR.x;
  248. mouseOpenArea.y=parentR.y;
  249. mouseOpenArea.width=maxWidth;
  250. mouseOpenArea.height=itemBtn.getXYRightDown().y-parentR.y
  251. break;
  252. }
  253. //
  254. itemBtn.addEventListener(MouseEvent.CLICK,itemBtn_ClickItem);
  255. //
  256. itemBtn.show(spBtns);
  257. //itemBtn.printInfon();
  258. itemBtn.visible=this.isOpen;
  259. //
  260. this.arrData.push(item);
  261. //showGuide()
  262. return this
  263. }
  264. /**
  265. * ??????
  266. *
  267. */
  268. public function showGuide():void{
  269. if(spViewArea!=null) spBtnsParent.removeChild(spViewArea);
  270. spViewArea=new Sprite();
  271. spViewArea.buttonMode=false;
  272. this.spBtnsParent.addChild(spViewArea);
  273. var ggg:Graphics=spViewArea.graphics;
  274. ggg.lineStyle(1,0xff0000,1);
  275. ggg.beginFill(0xff0000,0);
  276. ggg.drawRect(mouseOpenArea.x,mouseOpenArea.y,mouseOpenArea.width,mouseOpenArea.height);
  277. ggg.endFill()
  278. }
  279. private function itemBtn_ClickItem(e:MouseEvent):void{
  280. var btn:CButton=e.target as CButton;
  281. this.btnCombo.label=btn.label;
  282. //
  283. var objTem:Object=btn.getOtherInfo();
  284. currentObj={label:objTem.label,data:objTem.data};
  285. if(this.funClickItem!=null) funClickItem(btn.getOtherInfo());
  286. }
  287. /**
  288. * ?????????????????????????? {label:????,data:????},???label????")
  289. * @param arr ????
  290. * @return
  291. *
  292. */
  293. public function addSomeItem(arr:Array):CComboBox{
  294. for(var i:Number=0;i<arr.length;i++){
  295. addItem(arr[i].label,arr[i].data);
  296. }
  297. return this;
  298. }
  299. /**
  300. * ??????
  301. * @return
  302. *
  303. */
  304. public function open():CComboBox{
  305. if(!this.isOpen){
  306. var arrClone:Array=new Array();
  307. for(var i:Number=0;i<arrData.length;i++){
  308. var item:Object=arrData[i];
  309. arrClone.push({label:item.label,data:item.data});
  310. }
  311. spBtnsParent.removeChild(spBtns);
  312. init(spBtnsParent,downType,strTip,funClickItem);
  313. this.addSomeItem(arrClone);
  314. SH(true)
  315. this.addCheckMouseOnMe();
  316. //Fun.setTopDepath(spBtns);
  317. }
  318. return this;
  319. }
  320. /**
  321. * ???? ??
  322. * @return
  323. *
  324. */
  325. public function close():CComboBox{
  326. if(this.isOpen) {
  327. SH(false)
  328. this.removeCheckMouseOnMe()
  329. }
  330. return this;
  331. }
  332. //???????????
  333. private function SH(isOk:Boolean):void{
  334. //
  335. isOpen=isOk;
  336. //???????
  337. if(isOpen){
  338. var spTop:Sprite=new Sprite();
  339. spBtnsParent.addChild(spTop);
  340. spBtnsParent.swapChildren(spTop,spBtns);
  341. spBtnsParent.removeChild(spTop);
  342. }
  343. for(var i:Number=0;i<arrData.length;i++){
  344. var btnTem:CButton=arrData[i].btn;
  345. btnTem.visible=isOk
  346. }
  347. //
  348. }
  349. //?????
  350. private function setMaxWidth(btn:CButton):void{
  351. if(maxWidth<btn.getShowWidth()){
  352. maxWidth=btn.getShowWidth();
  353. //????????
  354. maxWidth+=btnCombo_leftWidth
  355. btnCombo.AutoResizeWidth=false;
  356. btnCombo.setWH(maxWidth,btnCombo.getShowHeight());
  357. //
  358. for(var i:Number=0;i<arrData.length;i++){
  359. var btnTem:CButton=arrData[i].btn;
  360. btnTem.AutoResizeWidth=false;
  361. btnTem.setWH(maxWidth,btnTem.getShowHeight());
  362. }
  363. btn.AutoResizeWidth=false;
  364. btn.setWH(maxWidth,btn.getShowHeight());
  365. }else if(maxWidth>btn.getShowWidth()){
  366. btn.AutoResizeWidth=false;
  367. btn.setWH(maxWidth,btn.getShowHeight());
  368. }
  369. }
  370. /**
  371. * ?????
  372. * @param w
  373. * @param h
  374. *
  375. */
  376. override public function setWH(w:Number=0, h:Number=0):void{
  377. }
  378. }
  379. }