PageRenderTime 50ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/ZenCustomMap/darkemon/ui/ExtTabBar.as

https://code.google.com/p/zen-custom-map/
ActionScript | 308 lines | 216 code | 40 blank | 52 comment | 29 complexity | b96ef7d9b63f90909a307957fd4e87ef MD5 | raw file
Possible License(s): GPL-2.0
  1. /*
  2. This program is the add-on for a Zenoss monitoring system.
  3. Copyright (C) 2011 Krasotin Artem
  4. This program is free software; you can redistribute it and/or modify it under
  5. the terms of the GNU General Public License as published by the Free Software Foundation;
  6. either version 2 of the License, or (at your option) any later version.
  7. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
  8. without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9. See the GNU General Public License for more details.
  10. You should have received a copy of the GNU General Public License along with this program;
  11. if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  12. */
  13. package darkemon.ui {
  14. import darkemon.events.TabBarEvent;
  15. import darkemon.skins.ExtTabBarSkin;
  16. import darkemon.skins.TabBarButtonAddSkin;
  17. import flash.display.Sprite;
  18. import flash.events.Event;
  19. import flash.events.MouseEvent;
  20. import flash.geom.Rectangle;
  21. import mx.collections.ArrayCollection;
  22. import mx.controls.Alert;
  23. import mx.core.UIComponent;
  24. import mx.events.CloseEvent;
  25. import spark.components.Button;
  26. import spark.components.DataGroup;
  27. import spark.components.Group;
  28. import spark.components.HGroup;
  29. import spark.components.Scroller;
  30. import spark.components.TabBar;
  31. import spark.core.NavigationUnit;
  32. import spark.effects.Animate;
  33. import spark.effects.animation.MotionPath;
  34. import spark.effects.animation.SimpleMotionPath;
  35. import spark.events.IndexChangeEvent;
  36. import spark.skins.spark.ScrollBarLeftButtonSkin;
  37. import spark.skins.spark.ScrollBarRightButtonSkin;
  38. public class ExtTabBar extends Group {
  39. //--------------------------------------
  40. // Properties
  41. //--------------------------------------
  42. private var tabBar:TabBar = new TabBar();
  43. private var backBtn:Button = new Button();
  44. private var nextBtn:Button = new Button();
  45. private var addBtn:Button = new Button();
  46. private var scroller:Scroller = new Scroller();
  47. private var scrollContainer:HGroup = new HGroup();
  48. private var anim:Animate = new Animate();
  49. private var path:SimpleMotionPath = new SimpleMotionPath();
  50. private var tabUIDs:Array = new Array();
  51. //--------------------------------------
  52. // Constructor
  53. //--------------------------------------
  54. public function ExtTabBar() {
  55. super();
  56. width = 150;
  57. height = 24;
  58. addBtn.toolTip = "Add new map";
  59. backBtn.setStyle("skinClass", Class(spark.skins.spark.ScrollBarLeftButtonSkin));
  60. nextBtn.setStyle("skinClass", Class(spark.skins.spark.ScrollBarRightButtonSkin));
  61. addBtn.setStyle("skinClass", Class(darkemon.skins.TabBarButtonAddSkin));
  62. tabBar.setStyle("skinClass", Class(darkemon.skins.ExtTabBarSkin));
  63. tabBar.setStyle("cornerRadius", 1);
  64. scroller.setStyle("horizontalScrollPolicy", "off");
  65. addBtn.width = backBtn.width = nextBtn.width = 24;
  66. scroller.height = tabBar.height = backBtn.height =
  67. nextBtn.height = addBtn.height = 24;
  68. scrollContainer.addElement(tabBar);
  69. scroller.viewport = scrollContainer;
  70. // Add animation.
  71. var v:Vector.<MotionPath> = new Vector.<MotionPath>();
  72. v.push(path);
  73. path.property = "horizontalScrollPosition";
  74. anim.duration = 500;
  75. anim.motionPaths = v;
  76. anim.target = scrollContainer;
  77. addElement(backBtn);
  78. addElement(scroller);
  79. addElement(nextBtn);
  80. addElement(addBtn);
  81. backBtn.setConstraintValue("left", 0);
  82. backBtn.setConstraintValue("top", 0);
  83. backBtn.setConstraintValue("bottom", 0);
  84. scroller.setConstraintValue("left", backBtn.width);
  85. scroller.setConstraintValue("right", backBtn.width+addBtn.width);
  86. scroller.setConstraintValue("top", 0);
  87. scroller.setConstraintValue("bottom", 0);
  88. nextBtn.setConstraintValue("right", addBtn.width);
  89. nextBtn.setConstraintValue("top", 0);
  90. nextBtn.setConstraintValue("bottom", 0);
  91. addBtn.setConstraintValue("right", 0);
  92. addBtn.setConstraintValue("top", 0);
  93. addBtn.setConstraintValue("bottom", 0);
  94. backBtn.addEventListener(MouseEvent.CLICK, leftScrollHandler);
  95. nextBtn.addEventListener(MouseEvent.CLICK, rightScrollHandler);
  96. addBtn.addEventListener(MouseEvent.CLICK, addButtonHandler);
  97. tabBar.addEventListener(IndexChangeEvent.CHANGE, selectTabHandler);
  98. tabBar.addEventListener(TabBarEvent.CHANGE_LABEL, tabEventListener);
  99. tabBar.addEventListener(TabBarEvent.CLOSE_TAB, tabEventListener);
  100. }
  101. //--------------------------------------
  102. // Public Methods
  103. //--------------------------------------
  104. public function get dataProvider():ArrayCollection {
  105. return ArrayCollection(tabBar.dataProvider);
  106. }
  107. public function set dataProvider(dp:ArrayCollection):void {
  108. tabUIDs = new Array();
  109. for(var i:int=0; i<dp.length; i++) {
  110. var item:Object = dp.getItemAt(i);
  111. if(!(item.uid is int)) {
  112. throw Error("ExtTabBar::dataProvider\nTab uid not integer!");
  113. }
  114. if(tabUIDs[item.uid] == 1) {
  115. throw Error("ExtTabBar::dataProvider\nDuplicate tab uid!");
  116. } else {
  117. tabUIDs[item.uid] = 1;
  118. }
  119. }
  120. tabBar.dataProvider = dp;
  121. if(dp.length > 0) dispatchEvent(
  122. new TabBarEvent(TabBarEvent.SELECT_TAB, dp[0].label, dp[0].uid));
  123. }
  124. public function getLabelByUid(uid:int):String {
  125. for each(var item:Object in tabBar.dataProvider) {
  126. if(item.uid == uid) return item.label;
  127. }
  128. return "";
  129. }
  130. public function get selectedTabUid():int {
  131. if(length == 0) return -1;
  132. else return tabBar.selectedItem.uid;
  133. }
  134. public function set selectedTabUid(uid:int):void {
  135. for(var i:int=0; i<tabBar.dataProvider.length; i++) {
  136. if(tabBar.dataProvider.getItemAt(i).uid == uid)
  137. {
  138. tabBar.selectedIndex = i;
  139. dispatchEvent(new TabBarEvent(TabBarEvent.SELECT_TAB,
  140. tabBar.selectedItem.label, tabBar.selectedItem.uid));
  141. break;
  142. }
  143. }
  144. }
  145. public function get length():uint {
  146. return tabBar.dataProvider.length;
  147. }
  148. public function hasTabUid(uid:int):Boolean {
  149. for each(var item:Object in tabBar.dataProvider) {
  150. if(item.uid == uid) return true;
  151. }
  152. return false;
  153. }
  154. /*
  155. override public function set height(w:Number):void {
  156. throw Error("Property height is only for read.");
  157. }
  158. override public function get height():Number {
  159. return 24;
  160. }
  161. override public function set width(w:Number):void {
  162. var widthBtns:Number = backBtn.width+nextBtn.width+addBtn.width;
  163. if(w < widthBtns) { scroller.width = 0; }
  164. else { scroller.width = w - widthBtns; }
  165. }
  166. override public function get width():Number {
  167. return scroller.width+backBtn.width+nextBtn.width+addBtn.width;
  168. }
  169. */
  170. //--------------------------------------
  171. // Private Methods
  172. //--------------------------------------
  173. private function getTabUid():int
  174. {
  175. for(var i:int=0; i<=tabBar.dataProvider.length; i++) {
  176. if(tabUIDs[i] == undefined) return i;
  177. }
  178. return -1;
  179. }
  180. //--------------------------------------
  181. // Handlers
  182. //--------------------------------------
  183. private function leftScrollHandler(e:MouseEvent):void {
  184. path.valueBy = -120;
  185. anim.play();
  186. }
  187. private function rightScrollHandler(e:MouseEvent):void {
  188. path.valueBy = 120;
  189. anim.play();
  190. }
  191. private function addButtonHandler(e:MouseEvent):void {
  192. var newItem:Object = new Object;
  193. newItem.label = "";
  194. newItem.uid = getTabUid();
  195. tabUIDs[newItem.uid] = 1;
  196. // Add new item and select new tab.
  197. tabBar.dataProvider.addItem(newItem);
  198. tabBar.selectedIndex = tabBar.dataProvider.length - 1;
  199. // Move to new tab.
  200. if(tabBar.dataProvider.length > 1) {
  201. var tab:UIComponent =
  202. tabBar.dataGroup.getElementAt(tabBar.selectedIndex-1) as UIComponent;
  203. path.valueBy = scrollContainer.getHorizontalScrollPositionDelta(
  204. NavigationUnit.END) + tab.width;
  205. anim.play();
  206. }
  207. dispatchEvent(new TabBarEvent(TabBarEvent.ADD_TAB, newItem.label,
  208. newItem.uid));
  209. }
  210. // Animation moving tabs.
  211. private function selectTabHandler(e:Event):void
  212. {
  213. var tabObject:Object = tabBar.selectedItem;
  214. var tab:UIComponent = tabBar.dataGroup.getElementAt(tabBar.selectedIndex)
  215. as UIComponent;
  216. var tabRect:Rectangle = tab.getRect(this);
  217. if(nextBtn.hitTestObject(tab)) {
  218. path.valueBy = tab.width - Math.abs(nextBtn.x - tabRect.x);
  219. anim.play();
  220. }
  221. if(backBtn.hitTestObject(tab)) {
  222. path.valueBy = -(Math.abs((backBtn.x+backBtn.width+1) - tabRect.x));
  223. anim.play();
  224. }
  225. dispatchEvent(new TabBarEvent(TabBarEvent.SELECT_TAB,
  226. tabObject.label, tabObject.uid));
  227. }
  228. private function tabEventListener(e:TabBarEvent):void {
  229. e.stopImmediatePropagation();
  230. switch(e.type) {
  231. case TabBarEvent.CHANGE_LABEL:
  232. var item:Object = tabBar.selectedItem;
  233. item.label = e.tabLabel;
  234. tabBar.dataProvider.setItemAt(item, tabBar.selectedIndex);
  235. dispatchEvent(new TabBarEvent(TabBarEvent.CHANGE_LABEL,
  236. item.label, item.uid));
  237. break;
  238. case TabBarEvent.CLOSE_TAB:
  239. Alert.show("Delete this map?", "Warning",
  240. Alert.YES|Alert.NO, null, alertListener);
  241. break;
  242. }
  243. function alertListener(ev:CloseEvent):void {
  244. if(ev.detail == Alert.YES) {
  245. var evt:TabBarEvent = new TabBarEvent(TabBarEvent.CLOSE_TAB,
  246. tabBar.selectedItem.label, tabBar.selectedItem.uid);
  247. tabUIDs[tabBar.selectedItem.uid] = undefined;
  248. tabBar.dataProvider.removeItemAt(tabBar.selectedIndex);
  249. dispatchEvent(evt);
  250. if(tabBar.dataProvider.length == 0) {
  251. dataProvider = new ArrayCollection([{"label":"untitled", "uid":0}]);
  252. } else {
  253. dispatchEvent(new TabBarEvent(TabBarEvent.SELECT_TAB,
  254. tabBar.selectedItem.label, tabBar.selectedItem.uid));
  255. }
  256. path.valueBy = scrollContainer.getHorizontalScrollPositionDelta(
  257. NavigationUnit.HOME);
  258. anim.play();
  259. }
  260. }
  261. }
  262. }
  263. }