PageRenderTime 51ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 1ms

/DreamYourGameSDK/src/gui/menu/MenuItem.hx

https://code.google.com/p/dreamyour2dgame/
Haxe | 559 lines | 412 code | 78 blank | 69 comment | 88 complexity | 433d859206f885bce25934956f2954af MD5 | raw file
  1. package gui.menu;
  2. import flash.display.Bitmap;
  3. import flash.display.BitmapData;
  4. import flash.display.BlendMode;
  5. import flash.display.MovieClip;
  6. import flash.display.Shape;
  7. import flash.display.Sprite;
  8. import flash.events.MouseEvent;
  9. import flash.events.TimerEvent;
  10. import flash.geom.ColorTransform;
  11. import flash.geom.Matrix;
  12. import flash.geom.Point;
  13. import flash.geom.Rectangle;
  14. import flash.Lib;
  15. import flash.text.TextField;
  16. import flash.text.TextFieldAutoSize;
  17. import flash.text.TextFormat;
  18. import flash.text.TextFormatAlign;
  19. import flash.utils.Timer;
  20. import gui.menu.MainMenuItem;
  21. import gui.menu.MenuItemType;
  22. import gui.menu.MenuItemContainerStyle;
  23. /**
  24. * ...
  25. * @author Damien Mabin & Birdy
  26. */
  27. class MenuItem extends Sprite
  28. {
  29. public static var MAXMENUHEIGHT : Float = Lib.current.stage.stageHeight;
  30. public var m_Type : MenuItemType;
  31. public var m_Key : String;
  32. public var m_Father : MenuItem;
  33. public var m_Collapse(default, null) : Bool;
  34. public var m_SaveExtendedState(default, null) : Bool;
  35. public var m_Style : { backgroundColor : UInt, backgroundAlpha : Float, borderColor : UInt, borderAlpha : Float, foregroundColor : UInt, foregroundAlpha : Float};
  36. public var m_TextFormat : TextFormat;
  37. public var m_IsExtendableArrow : BitmapData;
  38. public var m_HaveMoreChild : Sprite;
  39. public var m_ContainerStyle : MenuItemContainerStyle;
  40. private var m_MainBackground : Sprite;
  41. private var m_Label : TextField;
  42. private var m_SeparatorLine : Bitmap;
  43. private var m_Child : Array<MenuItem>;
  44. private var m_FirstChildDisplayed : Int; //Identifiant dans le tableau des enfant, du premier élément affiché dans le conteneur. 0 Tant que le conteneur affiche tout ses enfants.
  45. private var m_TimerForItemMove : Timer;
  46. private var m_CurrentArrow : Sprite;
  47. private var m_ChildContainer : Sprite;
  48. private var m_HaveMoreChildUp : Sprite;
  49. private var m_HaveMoreChildDown : Sprite;
  50. private var m_OverFG : Bitmap;
  51. private var m_IsExtendedFG : Bitmap;
  52. // ----------------------------------------------------------------------------------------------------------------------------------------
  53. // PUBLIC FUNCTIONS
  54. public function new(?f_Type : MenuItemType, ?f_Key : String)
  55. {
  56. super();
  57. m_Type = ((f_Type == null) ? CLASSIC : f_Type);
  58. m_Father = null;
  59. m_Key = f_Key;
  60. m_MainBackground = new Sprite();
  61. m_TextFormat = new TextFormat();
  62. m_TimerForItemMove = new Timer(0);
  63. m_Child = new Array<MenuItem>();
  64. m_SaveExtendedState = false;
  65. m_Style = MainMenuItem.DEFAULT_STYLE;
  66. m_ContainerStyle = CASCADE;
  67. m_FirstChildDisplayed = 0;
  68. m_ChildContainer = new Sprite();
  69. this.addChild(m_ChildContainer);
  70. switch(f_Type)
  71. {
  72. case CLASSIC :
  73. m_ChildContainer.visible = false;
  74. m_ChildContainer.x = MainMenuItem.TREEITEMWIDTH;
  75. m_Collapse = true;
  76. // Zone affichée quand on a la souris sur le MenuItem
  77. m_OverFG = new Bitmap(new BitmapData(MainMenuItem.TREEITEMWIDTH - 2 * MainMenuItem.PADDINGSIZE, MainMenuItem.TREEITEMHEIGHT - 2 * MainMenuItem.PADDINGSIZE, false, m_Style.foregroundColor));
  78. m_OverFG.alpha = m_Style.foregroundAlpha;
  79. m_OverFG.x = MainMenuItem.PADDINGSIZE;
  80. m_OverFG.y = MainMenuItem.PADDINGSIZE;
  81. m_OverFG.visible = false;
  82. this.addChild(m_OverFG);
  83. // Zone affichée quand le MenuItem est extended (dans le cas ou les ChildContainer ne sont pas placés en cascade)
  84. m_IsExtendedFG = new Bitmap(new BitmapData(MainMenuItem.TREEITEMWIDTH - 2 * MainMenuItem.PADDINGSIZE, MainMenuItem.TREEITEMHEIGHT - 2 * MainMenuItem.PADDINGSIZE, false, m_Style.foregroundColor));
  85. m_IsExtendedFG.alpha = m_Style.foregroundAlpha;
  86. m_IsExtendedFG.x = MainMenuItem.PADDINGSIZE;
  87. m_IsExtendedFG.y = MainMenuItem.PADDINGSIZE;
  88. m_IsExtendedFG.visible = false;
  89. this.addChild(m_IsExtendedFG);
  90. // Contenu, texte :
  91. m_Label = new TextField();
  92. m_Label.selectable = false;
  93. m_Label.autoSize = TextFieldAutoSize.LEFT;
  94. m_Label.text = f_Key;
  95. m_Label.setTextFormat(m_TextFormat);
  96. m_Label.y = (MainMenuItem.TREEITEMHEIGHT / 2) - (m_Label.height / 2);
  97. m_Label.x = MainMenuItem.PADDINGSIZE;
  98. this.addChild(m_Label);
  99. // Zone de fond :
  100. m_MainBackground.addChild(new Bitmap(new BitmapData(MainMenuItem.TREEITEMWIDTH, MainMenuItem.TREEITEMHEIGHT, true, 0x00000000)));
  101. this.addChild(m_MainBackground);
  102. // Ajout des listener
  103. m_MainBackground.addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
  104. m_MainBackground.addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);
  105. m_MainBackground.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
  106. case MAIN :
  107. case SEPARATOR :
  108. // Zone de fond :
  109. UpdateStyle();
  110. this.addChild(m_MainBackground);
  111. }
  112. }
  113. // Ajoute un fils ŕ l'élément
  114. public function AddItem(f_ChildItem : MenuItem)
  115. {
  116. if (Type.enumEq(m_Type, SEPARATOR))
  117. throw "YOU CAN'T ADD A CHILD TO A SEPARATOR";
  118. f_ChildItem.y = this.y;
  119. f_ChildItem.m_Father = this;
  120. f_ChildItem.m_TextFormat = this.m_TextFormat;
  121. f_ChildItem.m_Style = this.m_Style;
  122. f_ChildItem.m_IsExtendableArrow = this.m_IsExtendableArrow;
  123. f_ChildItem.m_HaveMoreChild = this.m_HaveMoreChild;
  124. f_ChildItem.m_SaveExtendedState = this.m_SaveExtendedState;
  125. f_ChildItem.m_ContainerStyle = this.m_ContainerStyle;
  126. f_ChildItem.UpdateStyle();
  127. // Si c'est le premier enfant qu'on ajoute alors on dessine la petite flčche pour dire qu'il y a des enfants et seulement si l'élément est un élément normal (pas pour le mainMenuItem)
  128. if ((m_Child.length == 0) && Type.enumEq(m_Type, CLASSIC))
  129. {
  130. if ((m_CurrentArrow != null) && this.contains(m_CurrentArrow)) // On supprimer l'ancienne flčche si elle avait déjŕ été dessinée
  131. this.removeChild(m_CurrentArrow);
  132. m_CurrentArrow = new Sprite();
  133. m_CurrentArrow.addChild(new Bitmap(m_IsExtendableArrow));
  134. m_CurrentArrow.x = m_MainBackground.width - (m_IsExtendableArrow.width + MainMenuItem.PADDINGSIZE);
  135. m_CurrentArrow.y = (m_MainBackground.height / 2) - (m_IsExtendableArrow.height / 2);
  136. this.addChild(m_CurrentArrow);
  137. }
  138. // Ajoute le treeItem ŕ la liste des enfants
  139. m_Child.push(f_ChildItem);
  140. // La position de l'élément dans le conteneur est donnée par la position du précédent dans le ChildContainer (0 s'il n'a pas de précédent)
  141. f_ChildItem.y = (m_Child.length > 1) ? (m_Child[m_Child.length - 2].y + m_Child[m_Child.length - 2].m_MainBackground.height) : 0;
  142. // On update le ChildContainer
  143. UpdateChildContainer();
  144. }
  145. // Supprime le MenuItem
  146. public function RemoveItem()
  147. {
  148. if (m_Father != null)
  149. {
  150. m_Father.m_Child.remove(this);
  151. if (m_Father.m_ChildContainer.contains(this))
  152. m_Father.m_ChildContainer.removeChild(this);
  153. // Met ŕ jour l'affichage du pčre (le conteneur doit avoir réduit sa taille)
  154. m_Father.UpdateStyle();
  155. }
  156. for (i in 0...(this.numChildren))
  157. removeChild(this.getChildAt(0));
  158. Lambda.iter(m_Child, function(son : MenuItem) { son.RemoveItem(); } );
  159. }
  160. public function UpdateStyle()
  161. {
  162. if (Type.enumEq(m_Type, CLASSIC) || Type.enumEq(m_Type, MAIN))
  163. {
  164. if (Type.enumEq(m_Type, CLASSIC))
  165. {
  166. m_Label.setTextFormat(m_TextFormat);
  167. var labelIsTooBig = (m_Label.textWidth > MainMenuItem.LABELWIDTH - 6); //6 <~=> "...".width
  168. while (m_Label.textWidth > MainMenuItem.LABELWIDTH - 6)
  169. {
  170. m_Label.text = m_Label.text.substr(0, m_Label.text.length - 1);
  171. m_Label.setTextFormat(m_TextFormat);
  172. }
  173. if (labelIsTooBig)
  174. m_Label.appendText("...");
  175. // On redessine le foreground pour le mouse over et le foreground qui indique si l'item est extended
  176. m_OverFG.bitmapData = new BitmapData(cast m_OverFG.width, cast m_OverFG.height, false, m_Style.foregroundColor);
  177. m_OverFG.alpha = m_Style.foregroundAlpha;
  178. m_IsExtendedFG.bitmapData = new BitmapData(cast m_IsExtendedFG.width, cast m_IsExtendedFG.height, false, m_Style.foregroundColor);
  179. m_IsExtendedFG.alpha = m_Style.foregroundAlpha;
  180. if (m_Child.length > 0)
  181. {
  182. // On supprimer l'ancienne flčche si elle avait déjŕ été dessinée
  183. if ((m_CurrentArrow != null) && this.contains(m_CurrentArrow))
  184. this.removeChild(m_CurrentArrow);
  185. m_CurrentArrow = new Sprite();
  186. m_CurrentArrow.addChild(new Bitmap(m_IsExtendableArrow));
  187. m_CurrentArrow.x = m_MainBackground.width - (m_IsExtendableArrow.width + MainMenuItem.PADDINGSIZE);
  188. m_CurrentArrow.y = (m_MainBackground.height / 2) - (m_IsExtendableArrow.height / 2);
  189. this.addChild(m_CurrentArrow);
  190. }
  191. }
  192. UpdateChildContainer();
  193. if ((m_ChildContainer.numChildren == m_Child.length) && (m_HaveMoreChildDown != null) && (m_HaveMoreChildUp != null))
  194. {
  195. // Le conteneur est assez grand pour afficher tous les enfants or les Sprite pour scroller sont toujours présents. Il faut donc les enlever et supprimer les listener de scroll.
  196. this.removeChild(m_HaveMoreChildDown);
  197. m_HaveMoreChildDown.removeEventListener(MouseEvent.MOUSE_MOVE, ScrollChildContainer);
  198. m_HaveMoreChildDown = null;
  199. this.removeChild(m_HaveMoreChildUp);
  200. m_HaveMoreChildUp.removeEventListener(MouseEvent.MOUSE_MOVE, ScrollChildContainer);
  201. m_HaveMoreChildUp = null;
  202. m_ChildContainer.removeEventListener(MouseEvent.MOUSE_MOVE, ScrollChildContainer);
  203. }
  204. }
  205. else if (Type.enumEq(m_Type, SEPARATOR))
  206. {
  207. //Enlčve le bitmap contenant la ligne si il existe
  208. if (m_MainBackground.numChildren > 0)
  209. m_MainBackground.removeChild(m_SeparatorLine);
  210. var lineFond = new BitmapData(MainMenuItem.TREEITEMWIDTH, MainMenuItem.SEPARATORHEIGHT, true, m_Style.backgroundColor); //BitmapData contenant la ligne
  211. var line = new Shape();
  212. line.graphics.beginFill(m_Style.backgroundColor, m_Style.backgroundAlpha);
  213. line.graphics.lineStyle(1, m_Style.borderColor, m_Style.borderAlpha); //Donne ŕ la ligne le męme style que celui de la bordure des conteneurs
  214. line.graphics.moveTo(MainMenuItem.PADDINGSIZE * 2, (MainMenuItem.SEPARATORHEIGHT / 2));
  215. line.graphics.lineTo(MainMenuItem.TREEITEMWIDTH - (MainMenuItem.PADDINGSIZE * 4), (MainMenuItem.SEPARATORHEIGHT / 2));
  216. //Dessine la ligne dans le BitmapData
  217. lineFond.draw(line);
  218. m_SeparatorLine = new Bitmap(lineFond);
  219. m_MainBackground.addChild(m_SeparatorLine); //Ajoute la ligne au background du TreeElem
  220. }
  221. for (child in m_Child)
  222. {
  223. child.m_Style = this.m_Style;
  224. child.UpdateStyle();
  225. }
  226. }
  227. public function Expand() : Void
  228. {
  229. if (m_Collapse)
  230. {
  231. // Collapse l'ensemble des frčres de l'élément
  232. if (m_Father != null)
  233. {
  234. for (i in 0 ... m_Father.m_Child.length)
  235. {
  236. if (m_Father.m_Child[i] != this)
  237. {
  238. m_Father.m_Child[i].Collapse();
  239. }
  240. }
  241. }
  242. m_ChildContainer.visible = true;
  243. if ((m_HaveMoreChildDown != null) && (m_HaveMoreChildUp != null))
  244. m_HaveMoreChildDown.visible = m_HaveMoreChildUp.visible = true;
  245. m_Collapse = false;
  246. // On marque que l'item est extended
  247. if (Type.enumEq(m_ContainerStyle, FIXED_ONTOP) && Type.enumEq(m_Type, CLASSIC))
  248. m_IsExtendedFG.visible = true;
  249. }
  250. }
  251. public function Collapse() : Void
  252. {
  253. if (!m_Collapse)
  254. {
  255. if (!m_SaveExtendedState)
  256. {
  257. //Collapse les fils de l'élément
  258. for (i in 0 ... m_Child.length)
  259. {
  260. m_Child[i].Collapse();
  261. }
  262. }
  263. m_ChildContainer.visible = false;
  264. if ((m_HaveMoreChildDown != null) && (m_HaveMoreChildUp != null))
  265. m_HaveMoreChildDown.visible = m_HaveMoreChildUp.visible = false;
  266. m_Collapse = true;
  267. if (Type.enumEq(m_ContainerStyle, FIXED_ONTOP) && Type.enumEq(m_Type, CLASSIC) && m_IsExtendedFG.visible)
  268. m_IsExtendedFG.visible = false;
  269. }
  270. }
  271. // Retourne le nom complet de l'élément soit la concaténation des m_Key de tous ses ancętres (séparés par des .)
  272. public function GetFullKey() : String
  273. {
  274. if (m_Father == null)
  275. return m_Key;
  276. else
  277. return m_Father.GetFullKey() + "." + m_Key;
  278. }
  279. // ----------------------------------------------------------------------------------------------------------------------------------------
  280. // PRIVATE FUNCTIONS
  281. private function mouseOverHandler(f_ME : MouseEvent) : Void
  282. {
  283. m_OverFG.visible = true;
  284. }
  285. private function mouseOutHandler(f_ME : MouseEvent) : Void
  286. {
  287. m_OverFG.visible = false;
  288. }
  289. private function mouseDownHandler(f_ME : MouseEvent) : Void
  290. {
  291. if (m_Child.length > 0)
  292. {
  293. if (m_Collapse)
  294. {
  295. Expand();
  296. }
  297. else
  298. {
  299. Collapse();
  300. }
  301. }
  302. }
  303. // Update l'affichage du conteneur d'enfants
  304. private function UpdateChildContainer()
  305. {
  306. if (m_Child.length > 0)
  307. {
  308. // Place le conteneur au bon endroit
  309. if (Type.enumEq(m_ContainerStyle, CASCADE))
  310. m_ChildContainer.y = 0 + (((m_HaveMoreChildDown == null) && (m_HaveMoreChildUp == null)) ? 0 : m_HaveMoreChild.height - 1);
  311. else
  312. m_ChildContainer.y = -this.y + (((m_HaveMoreChildDown == null) && (m_HaveMoreChildUp == null)) ? 0 : m_HaveMoreChild.height - 1);
  313. // La hauteur maximum est donnée par MAXMENUHEIGHT, moins les hauteurs des 2 Sprites indiquant la présence d'enfant cachés, moins l'emplacement ou se situe l'origine dans le stage du menuItem
  314. var maxHeight = MAXMENUHEIGHT - 2 * m_HaveMoreChild.height - this.localToGlobal(new Point()).y;
  315. var lastChild = m_Child[m_Child.length - 1];
  316. var lastChildHeight = Std.int(m_ChildContainer.localToGlobal(new Point(0, lastChild.y)).y + lastChild.m_MainBackground.height);
  317. // Update l'affichage de l'ExpendShadow si on est sur le MainMenuItem
  318. if (Type.enumEq(m_Type, MAIN))
  319. {
  320. if (cast(this, MainMenuItem).m_ExpendShadow != null) // Si on n'a pas voulu gérer la m_ExpendShadow, celle-ci est encore null
  321. {
  322. var shadowHeight = Std.int(lastChild.y + lastChild.m_MainBackground.height);
  323. cast(this, MainMenuItem).m_ExpendShadow.bitmapData = new BitmapData(cast cast(this, MainMenuItem).m_ExpendShadow.width, shadowHeight, false, 0x111111);
  324. }
  325. }
  326. if (lastChildHeight >= maxHeight) // L'item descend plus bas que la hauteur autorisée
  327. {
  328. //if ((m_ChildContainer.y - lastChild.m_MainBackground.height) < m_HaveMoreChild.height) // Le ChildContainer est trop grand męme si on l'allonge vers le haut
  329. //{
  330. if ((m_HaveMoreChildDown == null) && (m_HaveMoreChildUp == null))
  331. {
  332. m_ChildContainer.y += m_HaveMoreChild.height - 1;
  333. // On n'a pas encore dessiné les shapes indiquant la présence de plus d'éléments que l'on ne peut en afficher
  334. var imgCartridge = new BitmapData(cast m_HaveMoreChild.width, cast m_HaveMoreChild.height, true, 0x000000);
  335. imgCartridge.draw(m_HaveMoreChild);
  336. m_HaveMoreChildUp = new Sprite();
  337. m_HaveMoreChildUp.addChild(new Bitmap(imgCartridge));
  338. m_HaveMoreChildUp.rotation = 180;
  339. m_HaveMoreChildUp.x = m_ChildContainer.x + m_HaveMoreChild.width; // La rotation décale le bitmap d'une largeur vers la gauche
  340. m_HaveMoreChildUp.y = m_ChildContainer.y + 1;
  341. m_HaveMoreChildUp.addEventListener(MouseEvent.MOUSE_MOVE, ScrollChildContainer);
  342. m_HaveMoreChildUp.visible = false;
  343. this.addChild(m_HaveMoreChildUp);
  344. m_HaveMoreChildDown = new Sprite();
  345. m_HaveMoreChildDown.addChild(new Bitmap(imgCartridge));
  346. m_HaveMoreChildDown.x = m_ChildContainer.x;
  347. m_HaveMoreChildDown.y = m_ChildContainer.y + (m_Child[m_Child.length - 2].y + m_Child[m_Child.length - 2].m_MainBackground.height);
  348. m_HaveMoreChildDown.addEventListener(MouseEvent.MOUSE_MOVE, ScrollChildContainer);
  349. m_HaveMoreChildDown.visible = false;
  350. this.addChild(m_HaveMoreChildDown);
  351. }
  352. // Listener pour le déroulement des enfants
  353. m_ChildContainer.addEventListener(MouseEvent.MOUSE_MOVE, ScrollChildContainer);
  354. //}
  355. /*else // On remonte vers le haut le ChildContainer, de la hauteur du nouvel élément
  356. {
  357. m_ChildContainer.y -= lastChild.m_MainBackground.height;
  358. m_ChildContainer.addChild(lastChild);
  359. // Redessine le fond du conteneur des enfants
  360. m_ChildContainer.graphics.clear();
  361. m_ChildContainer.graphics.beginFill(m_Style.backgroundColor, m_Style.backgroundAlpha);
  362. m_ChildContainer.graphics.lineStyle(1, m_Style.borderColor, m_Style.borderAlpha);
  363. m_ChildContainer.graphics.drawRect(0, 0, MainMenuItem.TREEITEMWIDTH, (lastChild.y + lastChild.m_MainBackground.height));
  364. }*/
  365. }
  366. else
  367. {
  368. if(!m_ChildContainer.contains(lastChild))
  369. m_ChildContainer.addChild(lastChild);
  370. // Redessine le fond du conteneur des enfants
  371. m_ChildContainer.graphics.clear();
  372. m_ChildContainer.graphics.beginFill(m_Style.backgroundColor, m_Style.backgroundAlpha);
  373. m_ChildContainer.graphics.lineStyle(1, m_Style.borderColor, m_Style.borderAlpha);
  374. m_ChildContainer.graphics.drawRect(0, 0, MainMenuItem.TREEITEMWIDTH, (lastChild.y + lastChild.m_MainBackground.height));
  375. }
  376. // Réordonne les items dans le conteneur
  377. ReplaceAllItemInChildContainer();
  378. }
  379. else
  380. {
  381. m_ChildContainer.graphics.clear();
  382. }
  383. }
  384. // Au passage du curseur sur un ChildContainer (ou sur un Sprite HaveMoreChild), pour effecter le scroll des enfants dans le conteneur
  385. private function ScrollChildContainer(?f_ME : MouseEvent)
  386. {
  387. m_TimerForItemMove.reset();
  388. var current = (m_ChildContainer.mouseY - (m_ChildContainer.height / 2)) / (m_ChildContainer.height / 2);
  389. if (current >= 1)
  390. {
  391. //Si la souris est située sur le m_HaveMoreChildDown
  392. m_TimerForItemMove = new Timer(10);
  393. m_TimerForItemMove.start();
  394. m_TimerForItemMove.addEventListener(TimerEvent.TIMER, GoChildContainerItemDown);
  395. }
  396. else if (current >= (3 / 4))
  397. {
  398. //Si la souris est située dans le quart bas du ChildContainer
  399. m_TimerForItemMove = new Timer(30);
  400. m_TimerForItemMove.start();
  401. m_TimerForItemMove.addEventListener(TimerEvent.TIMER, GoChildContainerItemDown);
  402. }
  403. else if (current >= (2 / 3))
  404. {
  405. //Si la souris est située dans le tiers bas du ChildContainer
  406. m_TimerForItemMove = new Timer(120);
  407. m_TimerForItemMove.start();
  408. m_TimerForItemMove.addEventListener(TimerEvent.TIMER, GoChildContainerItemDown);
  409. }
  410. else if (current <= -1)
  411. {
  412. //Si la souris est située sur le m_HaveMoreChildUp
  413. m_TimerForItemMove = new Timer(10);
  414. m_TimerForItemMove.start();
  415. m_TimerForItemMove.addEventListener(TimerEvent.TIMER, GoChildContainerItemUp);
  416. }
  417. else if (current <= -(3 / 4))
  418. {
  419. //Si la souris est située dans le quart haut du ChildContainer
  420. m_TimerForItemMove = new Timer(30);
  421. m_TimerForItemMove.start();
  422. m_TimerForItemMove.addEventListener(TimerEvent.TIMER, GoChildContainerItemUp);
  423. }
  424. else if (current <= -(2 / 3))
  425. {
  426. //Si la souris est située dans le tiers haut du ChildContainer
  427. m_TimerForItemMove = new Timer(120);
  428. m_TimerForItemMove.start();
  429. m_TimerForItemMove.addEventListener(TimerEvent.TIMER, GoChildContainerItemUp);
  430. }
  431. else
  432. {
  433. m_TimerForItemMove.stop();
  434. }
  435. }
  436. // Effectue le scroll des MenuItem vers le bas dans le ChildContainer
  437. private function GoChildContainerItemDown(f_te : TimerEvent)
  438. {
  439. m_TimerForItemMove.reset();
  440. m_TimerForItemMove.removeEventListener(TimerEvent.TIMER, GoChildContainerItemDown);
  441. //On vérifie que l'on peut encore se déplacer dans le ChildContainer
  442. if ((m_FirstChildDisplayed + 1) <= (m_Child.length - m_ChildContainer.numChildren))
  443. {
  444. m_FirstChildDisplayed++;
  445. // On descend vers les items les plus en bas : on remove l'item tout en haut et on add l'item tout en bas
  446. m_ChildContainer.removeChild(m_Child[m_FirstChildDisplayed - 1]);
  447. m_ChildContainer.addChild(m_Child[(m_FirstChildDisplayed + m_ChildContainer.numChildren)]);
  448. ReplaceAllItemInChildContainer();
  449. // Relance la fonction qui gčre le scroll
  450. ScrollChildContainer();
  451. }
  452. }
  453. // Effectue le scroll des MenuItem vers le haut dans le ChildContainer
  454. private function GoChildContainerItemUp(f_te : TimerEvent)
  455. {
  456. m_TimerForItemMove.reset();
  457. m_TimerForItemMove.removeEventListener(TimerEvent.TIMER, GoChildContainerItemUp);
  458. //On vérifie que l'on peut encore se déplacer dans le ChildContainer
  459. if ((m_FirstChildDisplayed - 1) >= 0)
  460. {
  461. m_FirstChildDisplayed--;
  462. // On monte vers les items les plus en haut : on remove l'item tout en bas et on add l'item tout en haut
  463. m_ChildContainer.removeChild(m_Child[m_FirstChildDisplayed + m_ChildContainer.numChildren]);
  464. m_ChildContainer.addChild(m_Child[m_FirstChildDisplayed]);
  465. ReplaceAllItemInChildContainer();
  466. // Relance la fonction qui gčre le scroll
  467. ScrollChildContainer();
  468. }
  469. }
  470. // Repositionne les items du childContainer les uns sous les autres en plaçant le FirstDisplay tout en haut
  471. private function ReplaceAllItemInChildContainer()
  472. {
  473. m_Child[m_FirstChildDisplayed].y = 0;
  474. for (i in (m_FirstChildDisplayed + 1)...(m_FirstChildDisplayed + m_ChildContainer.numChildren))
  475. {
  476. m_Child[i].y = m_Child[i - 1].y + m_Child[i - 1].m_MainBackground.height;
  477. }
  478. }
  479. }