PageRenderTime 72ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/runway/trunk/src/as/org/simileWidgets/runway/RunwayWidget.as

http://simile-widgets.googlecode.com/
ActionScript | 321 lines | 289 code | 28 blank | 4 comment | 59 complexity | c1d29eec32f2bcb06b53883cb0420e18 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. package org.simileWidgets.runway {
  2. import flash.external.ExternalInterface;
  3. import flash.system.Security;
  4. import flash.display.Sprite;
  5. import flash.display.StageQuality;
  6. import flash.events.*;
  7. [SWF(frameRate="30")]
  8. public class RunwayWidget extends Sprite {
  9. private var _runway:Runway;
  10. public function RunwayWidget() {
  11. stage.frameRate = 24;
  12. stage.quality = StageQuality.BEST;
  13. stage.scaleMode = flash.display.StageScaleMode.NO_SCALE;
  14. stage.align = flash.display.StageAlign.TOP_LEFT;
  15. stage.addEventListener(Event.RESIZE, resizeListener);
  16. var fixedSlideSize:Boolean = true;
  17. /* TODO: I haven't figured out how to do the reflections properly
  18. if the size keeps changing.
  19. ("fixedSlideSize" in root.loaderInfo.parameters) ?
  20. (root.loaderInfo.parameters["fixedSlideSize"] == "true") : true; */
  21. var slideSize:Number = ("slideSize" in root.loaderInfo.parameters) ?
  22. Number(root.loaderInfo.parameters["slideSize"]) : 0;
  23. var theme:Theme = ("theme" in root.loaderInfo.parameters) ?
  24. new Theme(root.loaderInfo.parameters["theme"]) : new Theme(null);
  25. var geometry:Geometry =
  26. new Geometry(fixedSlideSize, slideSize);
  27. _runway = new Runway(stage.stageWidth, stage.stageHeight, theme, geometry);
  28. addChild(_runway);
  29. for (var n:String in root.loaderInfo.parameters) {
  30. switch (n) {
  31. case "onSelect":
  32. case "onReady":
  33. case "onZoom":
  34. case "onTitleClick":
  35. case "onTitleMouseOver":
  36. case "onTitleMouseOut":
  37. case "onSubtitleClick":
  38. case "onSubtitleMouseOver":
  39. case "onSubtitleMouseOut":
  40. case "onSideSlideMouseOver":
  41. case "onSideSlideMouseOut":
  42. case "theme":
  43. case "fixedSlideSize":
  44. case "slideSize":
  45. continue;
  46. }
  47. setProperty(n, root.loaderInfo.parameters[n]);
  48. }
  49. if (ExternalInterface.available) {
  50. Security.allowDomain('*'); // This allows Javascript from any web page to call us.
  51. setupCallbacks();
  52. if (root.loaderInfo.parameters.hasOwnProperty("onSelect")) {
  53. _runway.addEventListener(
  54. "select",
  55. function(e:Event):void {
  56. ExternalInterface.call(root.loaderInfo.parameters["onSelect"], _runway.selectedIndex, _runway.selectedID);
  57. }
  58. );
  59. }
  60. if (root.loaderInfo.parameters.hasOwnProperty("onZoom")) {
  61. _runway.addEventListener(
  62. "zoom",
  63. function(e:Event):void {
  64. ExternalInterface.call(root.loaderInfo.parameters["onZoom"], _runway.selectedIndex, _runway.selectedID);
  65. }
  66. );
  67. }
  68. if (root.loaderInfo.parameters.hasOwnProperty("onSideSlideMouseOver")) {
  69. _runway.addEventListener(
  70. "sideSlideMouseOver",
  71. function(e:SlideEvent):void {
  72. ExternalInterface.call(root.loaderInfo.parameters["onSideSlideMouseOver"], e.index, e.slide.id);
  73. }
  74. );
  75. }
  76. if (root.loaderInfo.parameters.hasOwnProperty("onSideSlideMouseOut")) {
  77. _runway.addEventListener(
  78. "sideSlideMouseOut",
  79. function(e:SlideEvent):void {
  80. ExternalInterface.call(root.loaderInfo.parameters["onSideSlideMouseOut"], e.index, e.slide.id);
  81. }
  82. );
  83. }
  84. if (root.loaderInfo.parameters.hasOwnProperty("onTitleClick")) {
  85. _runway.titleTextField.addEventListener(
  86. MouseEvent.CLICK,
  87. function(e:MouseEvent):void {
  88. ExternalInterface.call(root.loaderInfo.parameters["onTitleClick"], _runway.selectedIndex, _runway.selectedID);
  89. }
  90. );
  91. }
  92. if (root.loaderInfo.parameters.hasOwnProperty("onTitleMouseOver")) {
  93. _runway.titleTextField.addEventListener(
  94. MouseEvent.MOUSE_OVER,
  95. function(e:MouseEvent):void {
  96. ExternalInterface.call(root.loaderInfo.parameters["onTitleMouseOver"], _runway.selectedIndex, _runway.selectedID);
  97. }
  98. );
  99. }
  100. if (root.loaderInfo.parameters.hasOwnProperty("onTitleMouseOut")) {
  101. _runway.titleTextField.addEventListener(
  102. MouseEvent.MOUSE_OUT,
  103. function(e:MouseEvent):void {
  104. ExternalInterface.call(root.loaderInfo.parameters["onTitleMouseOut"], _runway.selectedIndex, _runway.selectedID);
  105. }
  106. );
  107. }
  108. if (root.loaderInfo.parameters.hasOwnProperty("onSubtitleClick")) {
  109. _runway.subtitleTextField.addEventListener(
  110. MouseEvent.CLICK,
  111. function(e:MouseEvent):void {
  112. ExternalInterface.call(root.loaderInfo.parameters["onSubtitleClick"], _runway.selectedIndex, _runway.selectedID);
  113. }
  114. );
  115. }
  116. if (root.loaderInfo.parameters.hasOwnProperty("onSubtitleMouseOver")) {
  117. _runway.subtitleTextField.addEventListener(
  118. MouseEvent.MOUSE_OVER,
  119. function(e:MouseEvent):void {
  120. ExternalInterface.call(root.loaderInfo.parameters["onSubtitleMouseOver"], _runway.selectedIndex, _runway.selectedID);
  121. }
  122. );
  123. }
  124. if (root.loaderInfo.parameters.hasOwnProperty("onSubtitleMouseOut")) {
  125. _runway.subtitleTextField.addEventListener(
  126. MouseEvent.MOUSE_OUT,
  127. function(e:MouseEvent):void {
  128. ExternalInterface.call(root.loaderInfo.parameters["onSubtitleMouseOut"], _runway.selectedIndex, _runway.selectedID);
  129. }
  130. );
  131. }
  132. if (root.loaderInfo.parameters.hasOwnProperty("onReady")) {
  133. ExternalInterface.call(root.loaderInfo.parameters["onReady"]);
  134. }
  135. } else {
  136. trace("External interface is not available for this container.");
  137. }
  138. }
  139. private function resizeListener(e:Event):void {
  140. _runway.boundingWidth = stage.stageWidth;
  141. _runway.boundingHeight = stage.stageHeight;
  142. }
  143. private function setupCallbacks():void {
  144. try {
  145. ExternalInterface.addCallback("setThemeName", _runway.setThemeName);
  146. ExternalInterface.addCallback("setProperty", setProperty);
  147. ExternalInterface.addCallback("getProperty", getProperty);
  148. ExternalInterface.addCallback("clearRecords", _runway.clearRecords);
  149. ExternalInterface.addCallback("addRecords", _runway.addRecords);
  150. ExternalInterface.addCallback("setRecords", _runway.setRecords);
  151. ExternalInterface.addCallback("select", _runway.select);
  152. ExternalInterface.addCallback("getSelectedIndex", function():int { return _runway.selectedIndex; });
  153. ExternalInterface.addCallback("getSelectedID", function():String { return _runway.selectedID; });
  154. ExternalInterface.addCallback("getSlideCount", function():int { return _runway.slideCount; });
  155. } catch (e:Error) {
  156. trace("Error adding callbacks");
  157. }
  158. }
  159. private function getProperty(name:String):* {
  160. if (_isStringThemeProperty(name)) {
  161. return _runway.theme[name];
  162. } else if (_isColorThemeProperty(name)) {
  163. return _colorToString(_runway.theme[name]);
  164. } else if (_isBooleanThemeProperty(name)) {
  165. return _runway.theme[name];
  166. } else if (_isNumberThemeProperty(name)) {
  167. return _runway.theme[name];
  168. } else if (_isNumberGeometryProperty(name)) {
  169. return _runway.geometry[name];
  170. } else if (_isNumberRunwayProperty(name)) {
  171. return _runway[name];
  172. } else if (_isBooleanRunwayProperty(name)) {
  173. return _runway[name];
  174. }
  175. return undefined;
  176. }
  177. private function setProperty(name:String, value:*):void {
  178. if (_isStringThemeProperty(name)) {
  179. _runway.theme[name] = value;
  180. } else if (_isColorThemeProperty(name)) {
  181. _runway.theme[name] = _stringToColor(value);
  182. } else if (_isBooleanThemeProperty(name)) {
  183. _runway.theme[name] = (value is Boolean) ? value : (value == "true");
  184. } else if (_isNumberThemeProperty(name)) {
  185. _runway.theme[name] = (value is Number) ? value : Number(value);
  186. } else if (_isNumberGeometryProperty(name)) {
  187. _runway.geometry[name] = (value is Number) ? value : Number(value);
  188. } else if (_isNumberRunwayProperty(name)) {
  189. _runway[name] = (value is Number) ? value : Number(value);
  190. } else if (_isBooleanRunwayProperty(name)) {
  191. _runway[name] = (value is Boolean) ? value : (value == "true");
  192. }
  193. }
  194. private function _isNumberRunwayProperty(name:String):Boolean {
  195. switch (name) {
  196. case "mouseWheelIncrement":
  197. return true;
  198. }
  199. return false;
  200. }
  201. private function _isBooleanRunwayProperty(name:String):Boolean {
  202. switch (name) {
  203. case "showSideSlideTooltip":
  204. return true;
  205. }
  206. return false;
  207. }
  208. private function _isStringThemeProperty(name:String):Boolean {
  209. switch (name) {
  210. case "backgroundGradient" :
  211. case "backgroundImageURL" :
  212. case "backgroundImageAlign" :
  213. case "backgroundImageRepeat" :
  214. case "titleFontFamily" :
  215. case "subtitleFontFamily" :
  216. return true;
  217. }
  218. return false;
  219. }
  220. private function _isBooleanThemeProperty(name:String):Boolean {
  221. switch (name) {
  222. case "fixedSlideSize" :
  223. case "showTitle" :
  224. case "showSubtitle" :
  225. case "titleFontBold" :
  226. case "subtitleFontBold" :
  227. return true;
  228. }
  229. return false;
  230. }
  231. private function _isNumberThemeProperty(name:String):Boolean {
  232. switch (name) {
  233. case "reflectivity" :
  234. case "reflectionExtent" :
  235. case "backgroundImageOpacity" :
  236. case "titleFontSize" :
  237. case "subtitleFontSize" :
  238. return true;
  239. }
  240. return false;
  241. }
  242. private function _isColorThemeProperty(name:String):Boolean {
  243. switch (name) {
  244. case "backgroundColor" :
  245. case "backgroundColorTop" :
  246. case "backgroundColorMiddle" :
  247. case "backgroundColorBottom" :
  248. case "titleColor" :
  249. case "subtitleColor" :
  250. return true;
  251. }
  252. return false;
  253. }
  254. private function _isNumberGeometryProperty(name:String):Boolean {
  255. switch (name) {
  256. case "slideSize" :
  257. case "spread" :
  258. case "centerSpread" :
  259. case "recede" :
  260. case "tilt" :
  261. case "centerOffset" :
  262. case "fieldOfView" :
  263. return true;
  264. }
  265. return false;
  266. }
  267. private function _toHex2Digits(c:uint):String {
  268. var n:String = Number(c).toString(16);
  269. return (n.length == 2) ? n : "0" + n;
  270. }
  271. private function _stringToColor(value:String):uint {
  272. if (value.length >= 4 && value.charAt(0) == "#") {
  273. value = value.substr(1);
  274. var r:uint, g:uint, b:uint;
  275. if (value.length == 3) {
  276. r = parseInt(value.substr(0, 1), 16);
  277. g = parseInt(value.substr(1, 1), 16);
  278. b = parseInt(value.substr(2, 1), 16);
  279. return ((r + r * 16) << 16) | ((g + g * 16) << 8) | (b + b * 16);
  280. } else if (value.length == 6) {
  281. r = parseInt(value.substr(0, 2), 16);
  282. g = parseInt(value.substr(2, 2), 16);
  283. b = parseInt(value.substr(4, 2), 16);
  284. return (r << 16) | (g << 8) | b;
  285. }
  286. }
  287. return 0;
  288. }
  289. private function _colorToString(c:uint):String {
  290. return "#" + _toHex2Digits((c >> 16) & 0xFF) + _toHex2Digits((c >> 8) & 0xFF) + _toHex2Digits(c & 0xFF);
  291. }
  292. }
  293. }