/as3/src/com/unsafemethods/view/View.as

https://github.com/krilo/YM-Videoplayer
ActionScript | 231 lines | 161 code | 63 blank | 7 comment | 32 complexity | d6b46049029916504b79b6197c9ad203 MD5 | raw file
  1. package com.unsafemethods.view {
  2. import flash.utils.Dictionary;
  3. import com.unsafemethods.state.StateMachine;
  4. import com.unsafemethods.state.StateMachineListener;
  5. import com.unsafemethods.state.State;
  6. import flash.display.Sprite;
  7. /**
  8. * @author jonathanpetersson
  9. */
  10. public class View extends Sprite implements StateMachineListener {
  11. private static var IDList :Dictionary;
  12. public static const STATE_OPENED :State = new State();
  13. public static const STATE_CLOSED :State = new State();
  14. private var id :String;
  15. private var sm :VSM;
  16. private var listeners :Dictionary;
  17. private var parentView :View;
  18. private var children :Dictionary;
  19. private var onClosedAction :Action = null;
  20. private var onOpenedAction :Action = null;
  21. private var defaultChild :View;
  22. public function View() {
  23. sm = new VSM();
  24. sm.addListener(this);
  25. listeners = new Dictionary();
  26. children = new Dictionary();
  27. }
  28. public function prepare():void {
  29. }
  30. public function setId(id:String):void {
  31. if(!IDList) IDList = new Dictionary();
  32. if(id != null && IDList[id]) throw new ViewError(ViewError.ID_CONFLICT);
  33. if(id != null) IDList[id] = true;
  34. this.id = id;
  35. }
  36. public function addListener(listener:ViewListener):void {
  37. listeners[listener] = true;
  38. }
  39. public function removeListener(listener:ViewListener):void {
  40. if(listeners[listener]) delete listeners[listener];
  41. }
  42. public function addView(child:View, isDefaultView:Boolean=false):void {
  43. children[child] = true;
  44. child.setParent(this);
  45. if(isDefaultView) setDefaultChild(child);
  46. }
  47. public function removeView(child:View):void {
  48. if(children[child]) {
  49. delete children[child];
  50. }
  51. }
  52. private function setDefaultChild(defaultChild:View):void {
  53. this.defaultChild = defaultChild;
  54. }
  55. public function setParent(parentView:View):void {
  56. this.parentView = parentView;
  57. }
  58. public function toState(state:State):Boolean {
  59. if(sm.activate(state)) {
  60. return true;
  61. }
  62. return false;
  63. }
  64. public function open():Boolean {
  65. return ViewHelper.open(this);
  66. }
  67. public function close():Boolean {
  68. return ViewHelper.close(this);
  69. }
  70. public function toggle():Boolean {
  71. return ViewHelper.toggle(this);
  72. }
  73. protected function doOpen():void {
  74. }
  75. protected function doClose():void {
  76. }
  77. protected function onOpened():void {
  78. sm.onTransitionComplete();
  79. ViewHelper.onViewOpened(this);
  80. onOpenedAction = null;
  81. for(var o:Object in listeners) (o as ViewListener).onViewOpened(this);
  82. }
  83. protected function onClosed():void {
  84. sm.onTransitionComplete();
  85. ViewHelper.onViewClosed(this);
  86. onClosedAction = null;
  87. for(var o:Object in listeners) (o as ViewListener).onViewClosed(this);
  88. }
  89. //StateMachineListener
  90. public function transition(sm:StateMachine, from:State, to:State):void {
  91. if(sm === this.sm) {
  92. if(to === View.STATE_OPENED) {
  93. doOpen();
  94. }else if(to === View.STATE_CLOSED) {
  95. doClose();
  96. }
  97. }
  98. }
  99. //Conditions
  100. public function isOpened():Boolean {
  101. return sm.getCurrentState() === View.STATE_OPENED && sm.getNextState() == null;
  102. }
  103. public function isTransitioning():Boolean {
  104. return sm.getNextState() != null;
  105. }
  106. public function isBusy():Boolean {
  107. if(isTransitioning()) return true;
  108. for(var o:Object in children) {
  109. var child:View = o as View;
  110. if(child.isBusy()) return true;
  111. }
  112. if(onOpenedAction) return true;
  113. if(onClosedAction) return true;
  114. return false;
  115. }
  116. //Fields
  117. public function getId():String {
  118. return id;
  119. }
  120. public function getChildren():Dictionary {
  121. return children;
  122. }
  123. public function getChildById(id:String):View {
  124. for(var o:Object in children) if((o as View).getId() == id) return o as View;
  125. return null;
  126. }
  127. public function getDescendantById(id:String):View {
  128. var child:View = getChildById(id);
  129. if(child) {
  130. return child;
  131. }
  132. for(var o:Object in children) {
  133. var descendant:View = (o as View).getDescendantById(id);
  134. if(descendant) return descendant;
  135. }
  136. return null;
  137. }
  138. public function getParent():View {
  139. return parentView;
  140. }
  141. public function setOnClosedAction(action:Action):void {
  142. onClosedAction = action;
  143. }
  144. public function getOnClosedAction():Action {
  145. return onClosedAction;
  146. }
  147. public function setOnOpenedAction(action:Action):void {
  148. onOpenedAction = action;
  149. }
  150. public function getOnOpenedAction():Action {
  151. return onOpenedAction;
  152. }
  153. public function resize(w:Number, h:Number):void {
  154. if(sm.getNextState() == View.STATE_OPENED || isOpened()) doResize(w, h);
  155. }
  156. protected function doResize(w:Number, h:Number):void {
  157. }
  158. }
  159. }
  160. import com.unsafemethods.state.StateMachine;
  161. import com.unsafemethods.view.View;
  162. //ViewStateMachine
  163. class VSM extends StateMachine {
  164. function VSM() {
  165. addState(View.STATE_CLOSED, StateMachine.INITIAL_STATE);
  166. addState(View.STATE_OPENED);
  167. }
  168. }