/controls/RadioButton.as

http://flash-ui-framework.googlecode.com/ · ActionScript · 513 lines · 298 code · 46 blank · 169 comment · 41 complexity · bbda7faa271b8285375d15ae5bb786e1 MD5 · raw file

  1. package slw.controls
  2. {
  3. import flash.display.DisplayObject;
  4. import flash.display.GradientType;
  5. import flash.display.MovieClip;
  6. import flash.display.Shape;
  7. import flash.display.Sprite;
  8. import flash.events.MouseEvent;
  9. import flash.geom.Matrix;
  10. import flash.text.TextField;
  11. import flash.text.TextFieldAutoSize;
  12. import flash.text.TextFormat;
  13. import slw.events.LabelButtonEvent;
  14. /**
  15. * RadioButton
  16. * ?????,??????CheckBox?????????CheckBox??
  17. * @author ddx<br/>
  18. * 2011-7-30
  19. *
  20. */
  21. public class RadioButton extends LabelButton
  22. {
  23. //?????????????????,?????????
  24. private var _boxWidth:int=14;
  25. private var _boxHeight:int=14;
  26. private var _innerWidth:int=10;
  27. private var _innerHeight:int=10;
  28. private var _innerGap:int=4;
  29. //???????
  30. private var _tickColor:uint=0x0099CC;
  31. private var _tickContainer:Shape;
  32. //??????
  33. private var _selected:Boolean;
  34. //??????????????
  35. private var _toggle:Boolean;
  36. //????
  37. private var _format:TextFormat;
  38. /**
  39. * ????
  40. * @param label:String="Label" ????
  41. *
  42. */
  43. public function RadioButton(label:String="Label")
  44. {
  45. super(label);
  46. this.listName="RadioButton";
  47. init();
  48. this.round=0;
  49. this.padding=0;
  50. this.displayStates=buildDefaultStates();
  51. this.toggle=true;
  52. this.autoSize=true;
  53. }
  54. /*
  55. -----------------------------------
  56. setters getters
  57. -----------------------------------
  58. */
  59. //
  60. /**
  61. * ????(????)????:0x0099CC
  62. * @param value:uint
  63. *
  64. */
  65. public function set tickColor(value:uint):void{
  66. if(_tickColor==value) return;
  67. _tickColor=value;
  68. drawTick(_tickContainer,_tickColor,_innerWidth-_innerGap,_innerHeight-_innerGap);
  69. }
  70. //
  71. /**
  72. * ????(????)????:0x0099CC
  73. * @param value:uint
  74. *
  75. */
  76. public function get tickColor():uint{
  77. return _tickColor;
  78. }
  79. //
  80. /**
  81. * ????????:"Label"
  82. * @param value:String
  83. *
  84. */
  85. override public function set label(value:String):void{
  86. if(this.label==value) return;
  87. super.label=value;
  88. updateDisplayList();
  89. }
  90. //
  91. /**
  92. * ???????????????????toggle=true???????,???:false
  93. * @param value:Boolean
  94. *
  95. */
  96. override public function set selected(value:Boolean):void{
  97. if(_selected==value) return;
  98. _selected=value;
  99. showTick(_selected);
  100. this.dispatchEvent(new LabelButtonEvent(LabelButtonEvent.SELECTED_CHANGE,true,true,_selected,this.data));
  101. }
  102. //
  103. /**
  104. * ???????????????????toggle=true???????,???:false
  105. * @param value:Boolean
  106. *
  107. */
  108. override public function get selected():Boolean{
  109. return _selected;
  110. }
  111. //
  112. /**
  113. * ???????????:5px
  114. * @param value:Number
  115. *
  116. */
  117. override public function set gap(value:Number):void{
  118. if(this.gap==value) return;
  119. super.gap=value;
  120. updateDisplayList();
  121. }
  122. /**
  123. * autoSize=true?????????????,???:5px, autoSize=false??????
  124. * @param value:Number
  125. *
  126. */
  127. override public function set padding(value:Number):void{
  128. if(this.padding==value) return;
  129. super.padding=value;
  130. updateDisplayList();
  131. }
  132. //
  133. /**
  134. * ?????????:LabelButton.LEFT,?????:<br/>
  135. * <ul>
  136. * <li>LabelButton.TOP ????????<br/>
  137. * <li>LabelButton.BOTTOM ????????<br/>
  138. * <li>LabelButton.LEFT ????????<br/>
  139. * <li>LabelButton.RIGHT ????????<br/>
  140. * </ul>
  141. * @param value:String
  142. *
  143. */
  144. override public function set position(value:String):void{
  145. if(this.position==value) return;
  146. super.position=value;
  147. updateDisplayList();
  148. }
  149. //
  150. /**
  151. * ???????????????????????:true
  152. * @param value:Boolean
  153. *
  154. */
  155. override public function set autoSize(value:Boolean):void{
  156. if(this.autoSize==value) return;
  157. super.autoSize=true;
  158. updateDisplayList();
  159. }
  160. //
  161. /**
  162. * ????????????????????????????:true
  163. * @param value:Boolean
  164. *
  165. */
  166. override public function set toggle(value:Boolean):void{
  167. if(_toggle==value) return;
  168. _toggle=true;
  169. addListeners();
  170. }
  171. //
  172. /**
  173. * ????????????????????:false
  174. * @param value:Boolean
  175. *
  176. */
  177. override public function get toggle():Boolean{
  178. return _toggle;
  179. }
  180. //
  181. /**
  182. * ????????TextField.defaultTextFormat
  183. * @param value:TextFormat
  184. *
  185. */
  186. override public function set defaultTextFormat(value:TextFormat):void{
  187. if(this.defaultTextFormat==value){
  188. return;
  189. }
  190. super.defaultTextFormat=value;
  191. if(this.textField!=null)
  192. this.textField.defaultTextFormat=super.defaultTextFormat;
  193. _format=null;
  194. updateDisplayList();
  195. }
  196. //
  197. /**
  198. * ????????????????:null
  199. * @param value:*
  200. *
  201. */
  202. override public function set icon(value:*):void{
  203. }
  204. //
  205. /**
  206. * ?????????????????????????:[mc1,mc2,mc3,mc4],["mc1","mc2","mc3","mc4"]?0-4???????????????4?????????????4????????:[]
  207. * @param value:Array
  208. *
  209. */
  210. override public function set displayStates(value:Array):void{
  211. if(this.displayStates==value) return;
  212. super.displayStates=value;
  213. updateDisplayList();
  214. }
  215. //
  216. /**
  217. * ??????,??????????????(?:["Skin1","Skin2"]),????????????????,??0?????????,
  218. * ?skin???[]?null????
  219. * @param value:Array
  220. *
  221. */
  222. override public function set skin(value:Array):void{
  223. if(this.skin==value) return;
  224. super.skin=value;
  225. updateDisplayList();
  226. }
  227. /*
  228. -----------------------------------
  229. public methods
  230. -----------------------------------
  231. */
  232. //
  233. /**
  234. * ????????
  235. * @param format:TextFormat
  236. *
  237. */
  238. override public function setTextFormat(format:TextFormat):void{
  239. _format=format;
  240. updateDisplayList();
  241. }
  242. //
  243. override public function destroy():void{
  244. removeListeners();
  245. super.destroy();
  246. }
  247. /*
  248. -----------------------------------
  249. protected methods
  250. -----------------------------------
  251. */
  252. //????
  253. override protected function showState(index:int):void{
  254. super.showState(index);
  255. checkoutSize();
  256. var $state:DisplayObject;
  257. if(this.skinTargets!=null){
  258. for(var i:int=0;i<this.skinTargets.length;i++){
  259. if(this.skinTargets[i] is MovieClip)
  260. MovieClip(this.skinTargets[i]).gotoAndStop(index+1);
  261. setWH(this.skinTargets[i]);
  262. }
  263. }
  264. if(this.displayStates!=null){
  265. $state=this.displayStates[index];
  266. setWH($state);
  267. }
  268. if(_tickContainer!=null)
  269. this.buildContainer.setChildIndex(_tickContainer,this.buildContainer.numChildren-1);
  270. }
  271. /*
  272. -----------------------------------
  273. private methods
  274. -----------------------------------
  275. */
  276. //???
  277. private function init():void{
  278. _tickContainer=new Shape();
  279. this.buildContainer.addChild(_tickContainer);
  280. drawTick(_tickContainer,_tickColor,_innerWidth-_innerGap,_innerHeight-_innerGap);
  281. showTick(false);
  282. }
  283. //????
  284. private function addListeners():void{
  285. this.addEventListener(MouseEvent.CLICK,thisClick);
  286. }
  287. //????
  288. private function removeListeners():void{
  289. this.removeEventListener(MouseEvent.CLICK,thisClick);
  290. }
  291. //??
  292. private function thisClick(e:MouseEvent):void{
  293. this.selected=!_selected;
  294. }
  295. //????
  296. private function updateDisplayList():void{
  297. if(this.textField!=null){
  298. this.textField.text=this.label==null?"":this.label;
  299. if(_format!=null)
  300. this.textField.setTextFormat(_format);
  301. }
  302. checkoutSize();
  303. if(this.textField!=null){
  304. this.textField.x=this.padding;
  305. this.textField.y=this.padding;
  306. }
  307. if(this.stateContainer!=null){
  308. this.stateContainer.x=this.padding;
  309. this.stateContainer.y=this.padding;
  310. }
  311. var $target:DisplayObject;
  312. if(this.stateContainer!=null){
  313. $target=this.stateContainer;
  314. }else{
  315. $target=getState(0x0,[0xffffff,0xffffff],_boxWidth,_boxHeight,this.round);
  316. }
  317. if(this.textField!=null&&$target){
  318. switch(this.position){
  319. case LabelButton.TOP:
  320. this.textField.y=$target.y+$target.height+this.gap;
  321. layoutX(this.textField,$target);
  322. break;
  323. case LabelButton.BOTTOM:
  324. $target.y=this.textField.y+this.textField.height+this.gap;
  325. layoutX(this.textField,$target);
  326. break;
  327. case LabelButton.LEFT:
  328. this.textField.x=$target.x+$target.width+this.gap;
  329. layoutY(this.textField,$target);
  330. break;
  331. case LabelButton.RIGHT:
  332. $target.x=this.textField.x+this.textField.width+this.gap;
  333. layoutY(this.textField,$target);
  334. break;
  335. }
  336. }
  337. if(_tickContainer!=null&&$target!=null){
  338. _tickContainer.x=$target.x+(_boxWidth-_innerWidth)/2+(_innerGap)/2+0.5;
  339. _tickContainer.y=$target.y+(_boxHeight-_innerHeight)/2+(_innerGap)/2;
  340. if(this.skinContainer!=null){
  341. this.skinContainer.x=$target.x;
  342. this.skinContainer.y=$target.y;
  343. }
  344. }
  345. this.setState(this.state);
  346. }
  347. //??????
  348. private function buildDefaultStates():Array{
  349. var $states:Array=[];
  350. var $borderColors:Array=[0x999999,0x0099CC,0x009999,0x999999];
  351. var $colors:Array=[[0xffffff,0xdddddd],[0xffffff,0x85C9E0],[0x85C9E0,0xffffff],[0xdddddd,0xffffff]];
  352. for(var i:int=0;i<4;i++){
  353. $states.push(getState($borderColors[i],$colors[i],_boxWidth,_boxHeight,this.round));
  354. }
  355. return $states;
  356. }
  357. //????
  358. private function getState(borderColor:uint,colors:Array,width:Number,height:Number,round:Number):DisplayObject{
  359. var $matrix:Matrix=new Matrix();
  360. $matrix.createGradientBox(width,height,Math.PI/2);
  361. var $shape:Shape=new Shape();
  362. $shape.graphics.lineStyle(0,borderColor,1,true,"none","round");
  363. $shape.graphics.beginGradientFill(GradientType.RADIAL,colors,[1,1],[0,0xff],$matrix);
  364. $shape.graphics.drawCircle(width/2,width/2,width/2);
  365. $shape.graphics.endFill();
  366. /*var $ori:Number=width/2;
  367. var $gapX:Number=(_boxWidth-_innerWidth)/2;
  368. var $gapY:Number=(_boxHeight-_innerHeight)/2;
  369. width-=$gapX*2;
  370. height-=$gapY*2;
  371. $matrix=new Matrix();
  372. $matrix.createGradientBox(width,height,Math.PI/2);
  373. $shape.graphics.lineStyle(0,borderColor,0.5,true,"none","round");
  374. $shape.graphics.beginFill(0xffffff,1);
  375. $shape.graphics.drawCircle($ori+0.1,$ori+0.1,width/2);
  376. $shape.graphics.endFill();*/
  377. return $shape;
  378. }
  379. //????
  380. private function drawTick(target:Shape,color:uint,drawWidth:Number,drawHeight:Number):void{
  381. target.graphics.clear();
  382. target.graphics.beginFill(color,1);
  383. target.graphics.drawCircle(drawWidth/2,drawWidth/2,drawWidth/2);
  384. target.graphics.endFill();
  385. }
  386. //??????
  387. private function showTick(visible:Boolean):void{
  388. _tickContainer.visible=visible;
  389. }
  390. //x???,?????x????
  391. private function layoutX(...args):void{
  392. for(var i:int=0;i<args.length;i++){
  393. if(args[i].width<this.width){
  394. args[i].x=(this.width-args[i].width)/2;
  395. }
  396. }
  397. }
  398. //y???,?????y????
  399. private function layoutY(...args):void{
  400. for(var i:int=0;i<args.length;i++){
  401. if(args[i].height<this.height){
  402. args[i].y=(this.height-args[i].height)/2;
  403. }
  404. }
  405. }
  406. //y???,?????????????????y????
  407. private function layoutYAsOne(...args):void{
  408. var $height:Number=0;
  409. for(var i:int=0;i<args.length;i++){
  410. $height+=DisplayObject(args[i]).height+this.gap;
  411. }
  412. if(args.length>0) $height-=this.gap;
  413. if(args[0]!=null) DisplayObject(args[0]).y=(this.height-$height)/2;
  414. for(var j:int=1;j<args.length;j++){
  415. DisplayObject(args[j]).y=DisplayObject(args[j-1]).y+DisplayObject(args[j-1]).height+this.gap;
  416. }
  417. }
  418. //x???,?????????????????y????
  419. private function layoutXAsOne(...args):void{
  420. var $width:Number=0;
  421. for(var i:int=0;i<args.length;i++){
  422. $width+=DisplayObject(args[i]).width+this.gap;
  423. }
  424. if(args.length>0) $width-=this.gap;
  425. if(args[0]!=null) DisplayObject(args[0]).x=(this.width-$width)/2;
  426. for(var j:int=1;j<args.length;j++){
  427. DisplayObject(args[j]).x=DisplayObject(args[j-1]).x+DisplayObject(args[j-1]).width+this.gap;
  428. }
  429. }
  430. //????
  431. private function setWH(target:DisplayObject):void{
  432. if(target!=null){
  433. target.width=_boxWidth;
  434. target.height=_boxHeight;
  435. }
  436. }
  437. //????
  438. private function checkoutSize():void{
  439. var $width:Number=this.padding*2;
  440. var $height:Number=this.padding*2;
  441. if(this.textField!=null){
  442. switch(this.position){
  443. case LabelButton.TOP:
  444. case LabelButton.BOTTOM:
  445. $width+=Math.max(_boxWidth,this.textField.width);
  446. $height+=_boxHeight+this.gap+this.textField.height;
  447. break;
  448. case LabelButton.LEFT:
  449. case LabelButton.RIGHT:
  450. $width+=_boxWidth+this.gap+this.textField.width;
  451. $height+=Math.max(_boxHeight,this.textField.height);
  452. break;
  453. }
  454. }else if(this.textField!=null){
  455. $width+=this.textField.width;
  456. $height+=this.textField.height;
  457. }else{
  458. $width+=_boxWidth;
  459. $height+=_boxHeight;
  460. }
  461. this.width=$width;
  462. this.height=$height;
  463. }
  464. }
  465. }