├── AIR ├── src │ ├── com │ │ ├── luaye │ │ │ ├── utils │ │ │ │ ├── thread │ │ │ │ │ ├── link.txt │ │ │ │ │ └── Thread.as │ │ │ │ └── bitmapMovieClip │ │ │ │ │ ├── sample │ │ │ │ │ ├── example.fla │ │ │ │ │ └── example.swf │ │ │ │ │ ├── BitmapMovieClipData.as │ │ │ │ │ └── BitmapMovieClip.as │ │ │ └── console │ │ │ │ ├── core │ │ │ │ ├── Log.as │ │ │ │ ├── Logs.as │ │ │ │ ├── MemoryMonitor.as │ │ │ │ ├── Remoting.as │ │ │ │ └── CommandTools.as │ │ │ │ ├── utils │ │ │ │ ├── WeakRef.as │ │ │ │ ├── WeakObject.as │ │ │ │ └── Utils.as │ │ │ │ ├── Ch.as │ │ │ │ └── view │ │ │ │ ├── MemoryPanel.as │ │ │ │ ├── ChannelsPanel.as │ │ │ │ ├── FPSPanel.as │ │ │ │ ├── RollerPanel.as │ │ │ │ ├── Style.as │ │ │ │ ├── Ruler.as │ │ │ │ ├── PanelsManager.as │ │ │ │ ├── GraphingPanel.as │ │ │ │ └── AbstractPanel.as │ │ └── doitflash │ │ │ ├── consts │ │ │ ├── CartUpdateType.as │ │ │ ├── LangDirection.as │ │ │ ├── Orientation.as │ │ │ ├── ScrollConst.as │ │ │ ├── FontStyle.as │ │ │ ├── Direction.as │ │ │ ├── Position.as │ │ │ ├── Youtube.as │ │ │ ├── Ease.as │ │ │ └── Easing.as │ │ │ ├── events │ │ │ └── ListEvent.as │ │ │ ├── tools │ │ │ └── DynamicFunc.as │ │ │ ├── mobileProject │ │ │ └── commonCpuSrc │ │ │ │ └── DeviceInfo.as │ │ │ └── text │ │ │ └── modules │ │ │ ├── MyMovieClip.as │ │ │ ├── MySprite.as │ │ │ └── TextModule.as │ └── MainFinal.as ├── icons │ ├── Assets.car │ ├── icons │ │ ├── icon_144.png │ │ ├── icon_192.png │ │ ├── icon_36.png │ │ ├── icon_48.png │ │ ├── icon_512.png │ │ ├── icon_72.png │ │ ├── icon_96.png │ │ └── icon_1024.png │ └── LaunchScreen.storyboardc │ │ ├── Info.plist │ │ ├── 01J-lp-oVM-view-Ze5-6b-2t3.nib │ │ └── UIViewController-01J-lp-oVM.nib ├── assets │ └── movie01.mp4 ├── lib │ └── README.md ├── AIR.iml └── Main-app.xml ├── ChangeLog.md └── README.md /AIR/src/com/luaye/utils/thread/link.txt: -------------------------------------------------------------------------------- 1 | http://www.luaye.com/blog/index.php?action=read&id=58 -------------------------------------------------------------------------------- /AIR/icons/Assets.car: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/videoPlayer-ANE/HEAD/AIR/icons/Assets.car -------------------------------------------------------------------------------- /AIR/assets/movie01.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/videoPlayer-ANE/HEAD/AIR/assets/movie01.mp4 -------------------------------------------------------------------------------- /AIR/icons/icons/icon_144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/videoPlayer-ANE/HEAD/AIR/icons/icons/icon_144.png -------------------------------------------------------------------------------- /AIR/icons/icons/icon_192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/videoPlayer-ANE/HEAD/AIR/icons/icons/icon_192.png -------------------------------------------------------------------------------- /AIR/icons/icons/icon_36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/videoPlayer-ANE/HEAD/AIR/icons/icons/icon_36.png -------------------------------------------------------------------------------- /AIR/icons/icons/icon_48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/videoPlayer-ANE/HEAD/AIR/icons/icons/icon_48.png -------------------------------------------------------------------------------- /AIR/icons/icons/icon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/videoPlayer-ANE/HEAD/AIR/icons/icons/icon_512.png -------------------------------------------------------------------------------- /AIR/icons/icons/icon_72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/videoPlayer-ANE/HEAD/AIR/icons/icons/icon_72.png -------------------------------------------------------------------------------- /AIR/icons/icons/icon_96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/videoPlayer-ANE/HEAD/AIR/icons/icons/icon_96.png -------------------------------------------------------------------------------- /AIR/icons/icons/icon_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/videoPlayer-ANE/HEAD/AIR/icons/icons/icon_1024.png -------------------------------------------------------------------------------- /AIR/icons/LaunchScreen.storyboardc/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/videoPlayer-ANE/HEAD/AIR/icons/LaunchScreen.storyboardc/Info.plist -------------------------------------------------------------------------------- /AIR/src/com/luaye/utils/bitmapMovieClip/sample/example.fla: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/videoPlayer-ANE/HEAD/AIR/src/com/luaye/utils/bitmapMovieClip/sample/example.fla -------------------------------------------------------------------------------- /AIR/src/com/luaye/utils/bitmapMovieClip/sample/example.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/videoPlayer-ANE/HEAD/AIR/src/com/luaye/utils/bitmapMovieClip/sample/example.swf -------------------------------------------------------------------------------- /AIR/icons/LaunchScreen.storyboardc/01J-lp-oVM-view-Ze5-6b-2t3.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/videoPlayer-ANE/HEAD/AIR/icons/LaunchScreen.storyboardc/01J-lp-oVM-view-Ze5-6b-2t3.nib -------------------------------------------------------------------------------- /AIR/icons/LaunchScreen.storyboardc/UIViewController-01J-lp-oVM.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/videoPlayer-ANE/HEAD/AIR/icons/LaunchScreen.storyboardc/UIViewController-01J-lp-oVM.nib -------------------------------------------------------------------------------- /AIR/lib/README.md: -------------------------------------------------------------------------------- 1 | Copy the purchased [videoPlayerExtension.ane](https://www.myflashlabs.com/product/video-player-ane-adobe-air-native-extension/) here along with the following dependency ANEs: 2 | 3 | 1. androidx_core.ane 4 | 1. androidx_lifecycle.ane 5 | 1. overrideAir.ane 6 | 7 | Download dependency ANEs from here: https://github.com/myflashlab/common-dependencies-ANE 8 | -------------------------------------------------------------------------------- /AIR/src/com/doitflash/consts/CartUpdateType.as: -------------------------------------------------------------------------------- 1 | package com.doitflash.consts 2 | { 3 | 4 | /** 5 | * ... 6 | * @author Hadi Tavakoli - 8/22/2010 7:08 AM 7 | */ 8 | public class CartUpdateType 9 | { 10 | 11 | public static const QUANTITY_CHANGE:String = "quantityChange"; 12 | public static const ADDED:String = "itemAdded"; 13 | public static const REMOVED:String = "itemRemoved"; 14 | } 15 | 16 | } -------------------------------------------------------------------------------- /AIR/src/com/doitflash/consts/LangDirection.as: -------------------------------------------------------------------------------- 1 | package com.doitflash.consts 2 | { 3 | 4 | /** 5 | * LangDirection class indicates the direction of diffrent languages. wether left to right or right to left language script. 6 | * @author Hadi Tavakoli 7 | */ 8 | public class LangDirection 9 | { 10 | /** 11 | * Left to right language script 12 | */ 13 | public static const LTR:String = "ltr"; 14 | 15 | /** 16 | * Right to left language script 17 | */ 18 | public static const RTL:String = "rtl"; 19 | } 20 | 21 | } -------------------------------------------------------------------------------- /AIR/src/com/doitflash/consts/Orientation.as: -------------------------------------------------------------------------------- 1 | package com.doitflash.consts 2 | { 3 | /** 4 | * Orientation class indicates different kind of orientation. 5 | * @author Ali Tavakoli 6 | */ 7 | public class Orientation 8 | { 9 | /** 10 | * vertical orientation 11 | */ 12 | public static const VERTICAL:String = "myVertical"; 13 | /** 14 | * horizontal orientation 15 | */ 16 | public static const HORIZONTAL:String = "myHorizontal"; 17 | /** 18 | * indicates whether we need vertical, horizontal or both 19 | */ 20 | public static const AUTO:String = "myAuto"; 21 | } 22 | } -------------------------------------------------------------------------------- /AIR/src/com/doitflash/consts/ScrollConst.as: -------------------------------------------------------------------------------- 1 | package com.doitflash.consts 2 | { 3 | /** 4 | * ScrollConst class indicates the scroll consts. 5 | * @author Ali Tavakoli 6 | */ 7 | public class ScrollConst 8 | { 9 | public static const STRONG:String = "strong"; 10 | public static const NORMAL:String = "normal"; 11 | public static const WEAK:String = "weak"; 12 | 13 | /** 14 | * indicates the minimum value(20) that you can set as the mask width 15 | */ 16 | public static const MASK_MIN_WIDTH:Number = 20; 17 | /** 18 | * indicates the minimum value(20) that you can set as the mask height 19 | */ 20 | public static const MASK_MIN_HEIGHT:Number = 20; 21 | } 22 | } -------------------------------------------------------------------------------- /AIR/src/com/luaye/utils/bitmapMovieClip/BitmapMovieClipData.as: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Lu Aye Oo | www.luaye.com 3 | * 4 | * BitmapMovieClipData 5 | * 6 | * This is an info class for use with BitmapMovieClip. 7 | * See BitmapMovieClip for details. 8 | * 9 | */ 10 | 11 | package com.luaye.utils.bitmapMovieClip { 12 | 13 | public class BitmapMovieClipData{ 14 | 15 | public var frames:Array; 16 | public var labels:Object; 17 | 18 | public function BitmapMovieClipData(frames:Array,labels:Object = null){ 19 | this.frames = frames; 20 | if(labels){ 21 | this.labels = labels; 22 | }else{ 23 | this.labels = new Object(); 24 | } 25 | } 26 | 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /AIR/src/com/doitflash/consts/FontStyle.as: -------------------------------------------------------------------------------- 1 | package com.doitflash.consts 2 | { 3 | 4 | /** 5 | * FontStyle class includes different font styles. which are either regular, bold, italic or bold-italic 6 | * @author Hadi Tavakoli 7 | */ 8 | public class FontStyle 9 | { 10 | /** 11 | * Regular font type. 12 | */ 13 | public static const REGULAR:String = "regular"; 14 | 15 | /** 16 | * Bold font type. 17 | */ 18 | public static const BOLD:String = "bold"; 19 | 20 | /** 21 | * Italic font type. 22 | */ 23 | public static const ITALIC:String = "italic"; 24 | 25 | /** 26 | * Bold-Italic font type. 27 | */ 28 | public static const BOLD_ITALIC:String = "boldItalic"; 29 | } 30 | 31 | } -------------------------------------------------------------------------------- /AIR/src/com/doitflash/consts/Direction.as: -------------------------------------------------------------------------------- 1 | package com.doitflash.consts 2 | { 3 | 4 | /** 5 | * Direction class indicates the direction of items. 6 | * @author Ali Tavakoli - 3/1/2010 12:27 PM 7 | */ 8 | public class Direction 9 | { 10 | /** 11 | * Left to right direction 12 | */ 13 | public static const LEFT_TO_RIGHT:String = "myLeftToRight"; 14 | 15 | /** 16 | * Right to left direction 17 | */ 18 | public static const RIGHT_TO_LEFT:String = "myRightToLeft"; 19 | 20 | /** 21 | * Top to bottom direction 22 | */ 23 | public static const TOP_TO_BOTTOM:String = "myTopToBottom"; 24 | 25 | /** 26 | * bottom to top direction 27 | */ 28 | public static const BOTTOM_TO_TOP:String = "myBottomToTop"; 29 | } 30 | 31 | } -------------------------------------------------------------------------------- /AIR/src/com/doitflash/events/ListEvent.as: -------------------------------------------------------------------------------- 1 | package com.doitflash.events 2 | { 3 | import flash.events.Event; 4 | 5 | /** 6 | * 7 | * @author Hadi Tavakoli - 3/18/2010 5:39 PM 8 | */ 9 | public class ListEvent extends Event 10 | { 11 | /** 12 | * @private 13 | */ 14 | public static const RESIZE:String = "onListResize"; 15 | public static const ITEM_ADDED:String = "onItemAdded"; 16 | 17 | private var _param:*; 18 | 19 | /** 20 | * 21 | */ 22 | public function ListEvent(type:String, data:*=null, bubbles:Boolean=false, cancelable:Boolean=false):void 23 | { 24 | _param = data; 25 | super(type, bubbles, cancelable); 26 | } 27 | 28 | /** 29 | * @private 30 | */ 31 | public function get param():* 32 | { 33 | return _param; 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /AIR/src/com/doitflash/consts/Position.as: -------------------------------------------------------------------------------- 1 | package com.doitflash.consts 2 | { 3 | 4 | /** 5 | * Indicates the position of items. 6 | * @author Hadi Tavakoli - 8/5/2010 9:06 PM 7 | */ 8 | public class Position 9 | { 10 | /** 11 | * Left position 12 | */ 13 | public static const LEFT:String = "Left"; 14 | 15 | /** 16 | * Right position 17 | */ 18 | public static const RIGHT:String = "Right"; 19 | 20 | /** 21 | * Left position 22 | */ 23 | public static const CENTER:String = "Center"; 24 | 25 | 26 | 27 | 28 | /** 29 | * Top position 30 | */ 31 | public static const TOP:String = "Top"; 32 | 33 | /** 34 | * bottom position 35 | */ 36 | public static const BOTTOM:String = "Bottom"; 37 | 38 | /** 39 | * middle position 40 | */ 41 | public static const MIDDLE:String = "Middle"; 42 | } 43 | 44 | } -------------------------------------------------------------------------------- /AIR/src/com/doitflash/consts/Youtube.as: -------------------------------------------------------------------------------- 1 | package com.doitflash.consts 2 | { 3 | 4 | /** 5 | * Direction class indicates the direction of items. 6 | * @author Ali Tavakoli - 3/1/2010 12:27 PM 7 | */ 8 | public class Youtube 9 | { 10 | /** 11 | * playback small quality 12 | */ 13 | public static const QUALITY_SMALL:String = "small"; 14 | 15 | /** 16 | * playback medium quality 17 | */ 18 | public static const QUALITY_MEDIUM:String = "medium"; 19 | 20 | /** 21 | * playback large quality 22 | */ 23 | public static const QUALITY_LARGE:String = "large"; 24 | 25 | /** 26 | * playback hd720 quality 27 | */ 28 | public static const QUALITY_HD720:String = "hd720"; 29 | 30 | /** 31 | * playback hd1080 quality 32 | */ 33 | public static const QUALITY_HD1080:String = "hd1080"; 34 | 35 | /** 36 | * playback highres quality 37 | */ 38 | public static const QUALITY_HIGHRES:String = "highres"; 39 | 40 | /** 41 | * playback default quality 42 | */ 43 | public static const QUALITY_DEFAULT:String = "default"; 44 | 45 | /** 46 | * wrapper height 47 | */ 48 | public static const WRAPPER_HEIGHT:Number = 40; 49 | } 50 | 51 | } -------------------------------------------------------------------------------- /AIR/src/com/luaye/console/core/Log.as: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2008-2009 Lu Aye Oo 4 | * 5 | * @author Lu Aye Oo 6 | * 7 | * http://code.google.com/p/flash-console/ 8 | * 9 | * 10 | * This software is provided 'as-is', without any express or implied 11 | * warranty. In no event will the authors be held liable for any damages 12 | * arising from the use of this software. 13 | * Permission is granted to anyone to use this software for any purpose, 14 | * including commercial applications, and to alter it and redistribute it 15 | * freely, subject to the following restrictions: 16 | * 1. The origin of this software must not be misrepresented; you must not 17 | * claim that you wrote the original software. If you use this software 18 | * in a product, an acknowledgment in the product documentation would be 19 | * appreciated but is not required. 20 | * 2. Altered source versions must be plainly marked as such, and must not be 21 | * misrepresented as being the original software. 22 | * 3. This notice may not be removed or altered from any source distribution. 23 | * 24 | */ 25 | package com.luaye.console.core { 26 | 27 | public class Log{ 28 | public var text:String; 29 | public var c:String; 30 | public var p:int; 31 | public var r:Boolean; 32 | public var s:Boolean; 33 | // 34 | public var next:Log; 35 | public var prev:Log; 36 | // 37 | public function Log(t:String, ch:String, pr:int, repeating:Boolean = false, skipSafe:Boolean = false){ 38 | text = t; 39 | c = ch; 40 | p = pr; 41 | r = repeating; 42 | s = skipSafe; 43 | } 44 | public function toObject():Object{ 45 | return {text:text, c:c, p:p, r:r, s:s}; 46 | } 47 | public function toString():String{ 48 | return "["+c+"] " + text; 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /AIR/src/com/doitflash/consts/Ease.as: -------------------------------------------------------------------------------- 1 | package com.doitflash.consts 2 | { 3 | /** 4 | * Ease class indicates different kinds of easing functions. 5 | * @author Ali Tavakoli 6 | */ 7 | public class Ease 8 | { 9 | public static const Regular_easeOut:String = "Regular_easeOut"; 10 | 11 | public static const Back_easeOut:String = "Back_easeOut"; 12 | 13 | public static const Bounce_easeOut:String = "Bounce_easeOut"; 14 | public static const Bounce_easeIn:String = "Bounce_easeIn"; 15 | public static const Bounce_easeInOut:String = "Bounce_easeInOut"; 16 | 17 | public static const Circ_easeOut:String = "Circ_easeOut"; 18 | public static const Circ_easeIn:String = "Circ_easeIn"; 19 | public static const Circ_easeInOut:String = "Circ_easeInOut"; 20 | 21 | public static const Cubic_easeOut:String = "Cubic_easeOut"; 22 | public static const Cubic_easeIn:String = "Cubic_easeIn"; 23 | public static const Cubic_easeInOut:String = "Cubic_easeInOut"; 24 | 25 | public static const Elastic_easeOut:String = "Elastic_easeOut"; 26 | public static const Elastic_easeIn:String = "Elastic_easeIn"; 27 | public static const Elastic_easeInOut:String = "Elastic_easeInOut"; 28 | 29 | public static const Expo_easeOut:String = "Expo_easeOut"; 30 | public static const Expo_easeIn:String = "Expo_easeIn"; 31 | public static const Expo_easeInOut:String = "Expo_easeInOut"; 32 | 33 | public static const Linear_easeNone:String = "Linear_easeNone"; 34 | 35 | public static const Quad_easeOut:String = "Quad_easeOut"; 36 | public static const Quad_easeIn:String = "Quad_easeIn"; 37 | public static const Quad_easeInOut:String = "Quad_easeInOut"; 38 | 39 | public static const Quart_easeOut:String = "Quart_easeOut"; 40 | public static const Quart_easeIn:String = "Quart_easeIn"; 41 | public static const Quart_easeInOut:String = "Quart_easeInOut"; 42 | 43 | public static const Quint_easeOut:String = "Quint_easeOut"; 44 | public static const Quint_easeIn:String = "Quint_easeIn"; 45 | public static const Quint_easeInOut:String = "Quint_easeInOut"; 46 | 47 | public static const Sine_easeOut:String = "Sine_easeOut"; 48 | public static const Sine_easeIn:String = "Sine_easeIn"; 49 | public static const Sine_easeInOut:String = "Sine_easeInOut"; 50 | } 51 | } -------------------------------------------------------------------------------- /AIR/src/com/luaye/console/core/Logs.as: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2008-2009 Lu Aye Oo 4 | * 5 | * @author Lu Aye Oo 6 | * 7 | * http://code.google.com/p/flash-console/ 8 | * 9 | * 10 | * This software is provided 'as-is', without any express or implied 11 | * warranty. In no event will the authors be held liable for any damages 12 | * arising from the use of this software. 13 | * Permission is granted to anyone to use this software for any purpose, 14 | * including commercial applications, and to alter it and redistribute it 15 | * freely, subject to the following restrictions: 16 | * 1. The origin of this software must not be misrepresented; you must not 17 | * claim that you wrote the original software. If you use this software 18 | * in a product, an acknowledgment in the product documentation would be 19 | * appreciated but is not required. 20 | * 2. Altered source versions must be plainly marked as such, and must not be 21 | * misrepresented as being the original software. 22 | * 3. This notice may not be removed or altered from any source distribution. 23 | * 24 | */ 25 | package com.luaye.console.core { 26 | public class Logs{ 27 | 28 | public var first:Log; 29 | public var last:Log; 30 | 31 | private var _length:uint; 32 | 33 | public function clear():void{ 34 | first = null; 35 | last = null; 36 | _length = 0; 37 | } 38 | 39 | public function get length():uint{ 40 | return _length; 41 | } 42 | // add to the last of chain 43 | public function push(v:Log):void{ 44 | if(last==null) { 45 | first = v; 46 | }else{ 47 | last.next = v; 48 | v.prev = last; 49 | } 50 | last = v; 51 | _length++; 52 | } 53 | // remove last item of chain 54 | public function pop():void{ 55 | if(last) { 56 | last = last.prev; 57 | _length--; 58 | } 59 | } 60 | // remove first item of chain 61 | public function shift(count:uint = 1):void{ 62 | while(first != null && count>0){ 63 | first = first.next; 64 | count--; 65 | _length--; 66 | } 67 | } 68 | public function remove(log:Log):void{ 69 | if(first == log) first = log.next; 70 | if(last == log) last = log.prev; 71 | if(log.next != null) log.next.prev = log.prev; 72 | if(log.prev != null) log.prev.next = log.next; 73 | _length--; 74 | } 75 | } 76 | } -------------------------------------------------------------------------------- /AIR/src/com/luaye/console/utils/WeakRef.as: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2008-2009 Lu Aye Oo 4 | * 5 | * @author Lu Aye Oo 6 | * 7 | * http://code.google.com/p/flash-console/ 8 | * 9 | * 10 | * This software is provided 'as-is', without any express or implied 11 | * warranty. In no event will the authors be held liable for any damages 12 | * arising from the use of this software. 13 | * Permission is granted to anyone to use this software for any purpose, 14 | * including commercial applications, and to alter it and redistribute it 15 | * freely, subject to the following restrictions: 16 | * 1. The origin of this software must not be misrepresented; you must not 17 | * claim that you wrote the original software. If you use this software 18 | * in a product, an acknowledgment in the product documentation would be 19 | * appreciated but is not required. 20 | * 2. Altered source versions must be plainly marked as such, and must not be 21 | * misrepresented as being the original software. 22 | * 3. This notice may not be removed or altered from any source distribution. 23 | * 24 | */ 25 | package com.luaye.console.utils { 26 | import flash.utils.Dictionary; 27 | 28 | public class WeakRef{ 29 | 30 | private var _val:*; 31 | private var _strong:Boolean; 32 | 33 | // 34 | // There is abilty to use strong reference incase you need to mix - 35 | // weak and strong references together somewhere 36 | public function WeakRef(ref:*, strong:Boolean = false) { 37 | if(ref is Function) strong = true; // Function must be strong ref, for now :/ 38 | _strong = strong; 39 | reference = ref; 40 | } 41 | // 42 | // 43 | // 44 | public function get reference():*{ 45 | if(_strong){ 46 | return _val; 47 | }else{ 48 | //there should be only 1 key in it anyway 49 | for(var X:* in _val){ 50 | return X; 51 | } 52 | } 53 | return null; 54 | } 55 | public function set reference(ref:*):void{ 56 | if(_strong){ 57 | _val = ref; 58 | }else{ 59 | _val = new Dictionary(true); 60 | _val[ref] = null; 61 | } 62 | } 63 | // 64 | // 65 | // 66 | public function get strong():Boolean{ 67 | return _strong; 68 | } 69 | public function set strong(b:Boolean):void{ 70 | if(_strong != b){ 71 | var ref:* = reference; 72 | _strong = b; 73 | reference = ref; 74 | } 75 | } 76 | } 77 | } -------------------------------------------------------------------------------- /AIR/src/com/doitflash/consts/Easing.as: -------------------------------------------------------------------------------- 1 | package com.doitflash.consts 2 | { 3 | /** 4 | * Easing class indicates different kinds of easing functions. 5 | * @author Ali Tavakoli - 6/27/2010 3:49 PM 6 | */ 7 | public class Easing 8 | { 9 | public static const Regular_easeOut:String = "Regular.easeOut"; 10 | 11 | public static const Back_easeOut:String = "Back.easeOut"; 12 | 13 | public static const Bounce_easeOut:String = "Bounce.easeOut"; 14 | public static const Bounce_easeIn:String = "Bounce.easeIn"; 15 | public static const Bounce_easeInOut:String = "Bounce.easeInOut"; 16 | 17 | public static const Circ_easeOut:String = "Circ.easeOut"; 18 | public static const Circ_easeIn:String = "Circ.easeIn"; 19 | public static const Circ_easeInOut:String = "Circ.easeInOut"; 20 | 21 | public static const Cubic_easeOut:String = "Cubic.easeOut"; 22 | public static const Cubic_easeIn:String = "Cubic.easeIn"; 23 | public static const Cubic_easeInOut:String = "Cubic.easeInOut"; 24 | 25 | public static const Elastic_easeOut:String = "Elastic.easeOut"; 26 | public static const Elastic_easeIn:String = "Elastic.easeIn"; 27 | public static const Elastic_easeInOut:String = "Elastic.easeInOut"; 28 | 29 | public static const Expo_easeOut:String = "Expo.easeOut"; 30 | public static const Expo_easeIn:String = "Expo.easeIn"; 31 | public static const Expo_easeInOut:String = "Expo.easeInOut"; 32 | 33 | public static const Linear_easeNone:String = "Linear.easeNone"; 34 | 35 | public static const Quad_easeOut:String = "Quad.easeOut"; 36 | public static const Quad_easeIn:String = "Quad.easeIn"; 37 | public static const Quad_easeInOut:String = "Quad.easeInOut"; 38 | 39 | public static const Quart_easeOut:String = "Quart.easeOut"; 40 | public static const Quart_easeIn:String = "Quart.easeIn"; 41 | public static const Quart_easeInOut:String = "Quart.easeInOut"; 42 | 43 | public static const Quint_easeOut:String = "Quint.easeOut"; 44 | public static const Quint_easeIn:String = "Quint.easeIn"; 45 | public static const Quint_easeInOut:String = "Quint.easeInOut"; 46 | 47 | public static const Sine_easeOut:String = "Sine.easeOut"; 48 | public static const Sine_easeIn:String = "Sine.easeIn"; 49 | public static const Sine_easeInOut:String = "Sine.easeInOut"; 50 | 51 | public static const Strong_easeOut:String = "Strong.easeOut"; 52 | public static const Strong_easeIn:String = "Strong.easeIn"; 53 | public static const Strong_easeInOut:String = "Strong.easeInOut"; 54 | } 55 | } -------------------------------------------------------------------------------- /AIR/src/com/luaye/console/utils/WeakObject.as: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2008-2009 Lu Aye Oo 4 | * 5 | * @author Lu Aye Oo 6 | * 7 | * http://code.google.com/p/flash-console/ 8 | * 9 | * 10 | * This software is provided 'as-is', without any express or implied 11 | * warranty. In no event will the authors be held liable for any damages 12 | * arising from the use of this software. 13 | * Permission is granted to anyone to use this software for any purpose, 14 | * including commercial applications, and to alter it and redistribute it 15 | * freely, subject to the following restrictions: 16 | * 1. The origin of this software must not be misrepresented; you must not 17 | * claim that you wrote the original software. If you use this software 18 | * in a product, an acknowledgment in the product documentation would be 19 | * appreciated but is not required. 20 | * 2. Altered source versions must be plainly marked as such, and must not be 21 | * misrepresented as being the original software. 22 | * 3. This notice may not be removed or altered from any source distribution. 23 | * 24 | */ 25 | package com.luaye.console.utils { 26 | import flash.utils.Proxy; 27 | import flash.utils.flash_proxy; 28 | 29 | public class WeakObject extends Proxy{ 30 | 31 | private var _item:Array; // array of object's properties 32 | private var _dir:Object; 33 | 34 | public function WeakObject() { 35 | _dir = new Object(); 36 | } 37 | 38 | 39 | public function set(n:String,obj:Object, strong:Boolean = false):void{ 40 | if(obj == null){ 41 | return; 42 | } 43 | _dir[n] = new WeakRef(obj, strong); 44 | } 45 | public function get(n:String):Object{ 46 | if(_dir[n]){ 47 | return _dir[n].reference; 48 | } 49 | return null; 50 | } 51 | // 52 | // PROXY 53 | // 54 | override flash_proxy function getProperty(n:*):* { 55 | return get(n); 56 | } 57 | override flash_proxy function callProperty(n:*, ... rest):* { 58 | var o:Object = get(n); 59 | if(o is Function){ 60 | return (o as Function).apply(this, rest); 61 | } 62 | return null; 63 | } 64 | override flash_proxy function setProperty(n:*, v:*):void { 65 | set(n,v); 66 | } 67 | override flash_proxy function nextNameIndex (index:int):int { 68 | // initial call 69 | if (index == 0) { 70 | _item = new Array(); 71 | for (var x:* in _dir) { 72 | _item.push(x); 73 | } 74 | } 75 | if (index < _item.length) { 76 | return index + 1; 77 | } else { 78 | return 0; 79 | } 80 | } 81 | override flash_proxy function nextName(index:int):String { 82 | return _item[index - 1]; 83 | } 84 | public function toString():String{ 85 | return "[WeakObject]"; 86 | } 87 | } 88 | } -------------------------------------------------------------------------------- /AIR/src/com/luaye/console/Ch.as: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2008-2009 Lu Aye Oo 4 | * 5 | * @author Lu Aye Oo 6 | * 7 | * http://code.google.com/p/flash-console/ 8 | * 9 | * 10 | * This software is provided 'as-is', without any express or implied 11 | * warranty. In no event will the authors be held liable for any damages 12 | * arising from the use of this software. 13 | * Permission is granted to anyone to use this software for any purpose, 14 | * including commercial applications, and to alter it and redistribute it 15 | * freely, subject to the following restrictions: 16 | * 1. The origin of this software must not be misrepresented; you must not 17 | * claim that you wrote the original software. If you use this software 18 | * in a product, an acknowledgment in the product documentation would be 19 | * appreciated but is not required. 20 | * 2. Altered source versions must be plainly marked as such, and must not be 21 | * misrepresented as being the original software. 22 | * 3. This notice may not be removed or altered from any source distribution. 23 | * 24 | */ 25 | 26 | package com.luaye.console { 27 | /** 28 | * @author Lu 29 | */ 30 | public class Ch { 31 | 32 | private var _c:*; // because it could be Console or C 33 | public var name:String; 34 | 35 | public function Ch(n:String = null, c:Console = null){ 36 | name = n; 37 | // allowed to pass in Console here incase you want to use a different console instance from whats used in C 38 | _c = c?c:C; 39 | } 40 | public function add(str:*, priority:Number = 2, isRepeating:Boolean = false):void{ 41 | _c.ch(name, str, priority, isRepeating); 42 | } 43 | public function log(...args):void{ 44 | _c.logch.apply(null, [name].concat(args)); 45 | } 46 | public function info(...args):void{ 47 | _c.infoch.apply(null, [name].concat(args)); 48 | } 49 | public function debug(...args):void{ 50 | _c.debugch.apply(null, [name].concat(args)); 51 | } 52 | public function warn(...args):void{ 53 | _c.warnch.apply(null, [name].concat(args)); 54 | } 55 | public function error(...args):void{ 56 | _c.errorch.apply(null, [name].concat(args)); 57 | } 58 | public function fatal(...args):void{ 59 | _c.fatalch.apply(null, [name].concat(args)); 60 | } 61 | /* 62 | not worth using... 63 | public function set tracing(v:Boolean):void{ 64 | var chs:Array = _c.tracingChannels; 65 | var i:int = chs.indexOf(name); 66 | if(v){ 67 | _c.tracing = true; 68 | if(i<0){ 69 | chs.push(name); 70 | } 71 | }else if(i>=0){ 72 | chs.splice(i,1); 73 | } 74 | } 75 | public function get tracing():Boolean{ 76 | if(!_c.tracing) return false; 77 | var chs:Array = _c.tracingChannels; 78 | if(chs.length==0) return true; 79 | // 80 | var i:int = chs.indexOf(name); 81 | if(i<0) return false; 82 | return true; 83 | }*/ 84 | 85 | /** 86 | * Clear channel 87 | */ 88 | public function clear():void{ 89 | _c.clear(name); 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /AIR/src/com/luaye/console/view/MemoryPanel.as: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2008-2009 Lu Aye Oo 4 | * 5 | * @author Lu Aye Oo 6 | * 7 | * http://code.google.com/p/flash-console/ 8 | * 9 | * 10 | * This software is provided 'as-is', without any express or implied 11 | * warranty. In no event will the authors be held liable for any damages 12 | * arising from the use of this software. 13 | * Permission is granted to anyone to use this software for any purpose, 14 | * including commercial applications, and to alter it and redistribute it 15 | * freely, subject to the following restrictions: 16 | * 1. The origin of this software must not be misrepresented; you must not 17 | * claim that you wrote the original software. If you use this software 18 | * in a product, an acknowledgment in the product documentation would be 19 | * appreciated but is not required. 20 | * 2. Altered source versions must be plainly marked as such, and must not be 21 | * misrepresented as being the original software. 22 | * 3. This notice may not be removed or altered from any source distribution. 23 | * 24 | */ 25 | 26 | package com.luaye.console.view { 27 | import com.luaye.console.Console; 28 | 29 | import flash.events.Event; 30 | import flash.events.TextEvent; 31 | 32 | public class MemoryPanel extends GraphingPanel { 33 | 34 | // 35 | public function MemoryPanel(m:Console) { 36 | super(m, 80,40); 37 | name = Console.PANEL_MEMORY; 38 | updateEvery = 5; 39 | drawEvery = 5; 40 | minimumWidth = 32; 41 | //master.mm.addEventListener(MemoryMonitor.GARBAGE_COLLECTED, onGC, false, 0, true); 42 | //master.mm.notifyGC = !m.isRemote; 43 | add(this, "current", 0x5060FF, "Memory"); 44 | } 45 | public override function close():void { 46 | super.close(); 47 | master.panels.updateMenu(); // should be black boxed :/ 48 | } 49 | public function get current():Number{ 50 | // in MB, up to 2 decimal 51 | return Math.round(master.currentMemory/10485.76)/100; 52 | } 53 | protected override function onFrame(e:Event):Boolean{ 54 | if(super.onFrame(e)){ 55 | updateKeyText(); 56 | return true; 57 | } 58 | return false; 59 | } 60 | public override function updateKeyText():void{ 61 | var mem:Number = getCurrentOf(0); 62 | if(mem>0){ 63 | keyTxt.htmlText = ""+mem.toFixed(2)+"mb G R X"; 64 | }else{ 65 | keyTxt.htmlText = "no mem input X"; 66 | } 67 | } 68 | protected override function linkHandler(e:TextEvent):void{ 69 | if(e.text == "gc"){ 70 | master.gc(); 71 | } 72 | super.linkHandler(e); 73 | } 74 | // 75 | 76 | protected override function onMenuRollOver(e:TextEvent):void{ 77 | var txt:String = e.text?e.text.replace("event:",""):null; 78 | if(txt == "gc"){ 79 | txt = "Garbage collect::Requires debugger version of flash player"; 80 | } 81 | master.panels.tooltip(txt, this); 82 | } 83 | /*private function onGC(e:Event):void{ 84 | mark(0xFF000000); 85 | }*/ 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /AIR/src/com/luaye/console/view/ChannelsPanel.as: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2008-2009 Lu Aye Oo 4 | * 5 | * @author Lu Aye Oo 6 | * 7 | * http://code.google.com/p/flash-console/ 8 | * 9 | * 10 | * This software is provided 'as-is', without any express or implied 11 | * warranty. In no event will the authors be held liable for any damages 12 | * arising from the use of this software. 13 | * Permission is granted to anyone to use this software for any purpose, 14 | * including commercial applications, and to alter it and redistribute it 15 | * freely, subject to the following restrictions: 16 | * 1. The origin of this software must not be misrepresented; you must not 17 | * claim that you wrote the original software. If you use this software 18 | * in a product, an acknowledgment in the product documentation would be 19 | * appreciated but is not required. 20 | * 2. Altered source versions must be plainly marked as such, and must not be 21 | * misrepresented as being the original software. 22 | * 3. This notice may not be removed or altered from any source distribution. 23 | * 24 | */ 25 | package com.luaye.console.view { 26 | import com.luaye.console.Console; 27 | 28 | import flash.events.TextEvent; 29 | import flash.text.TextField; 30 | import flash.text.TextFieldAutoSize; 31 | 32 | public class ChannelsPanel extends AbstractPanel{ 33 | 34 | private var _txtField:TextField; 35 | 36 | private var _channels:Array; 37 | 38 | public function ChannelsPanel(m:Console) { 39 | super(m); 40 | name = Console.PANEL_CHANNELS; 41 | init(10,10,false); 42 | _txtField = new TextField(); 43 | _txtField.name = "channelsField"; 44 | _txtField.wordWrap = true; 45 | _txtField.width = 160; 46 | _txtField.multiline = true; 47 | _txtField.autoSize = TextFieldAutoSize.LEFT; 48 | _txtField.styleSheet = style.css; 49 | _txtField.addEventListener(TextEvent.LINK, linkHandler, false, 0, true); 50 | registerRollOverTextField(_txtField); 51 | _txtField.addEventListener(AbstractPanel.TEXT_LINK, onMenuRollOver, false, 0, true); 52 | registerDragger(_txtField); 53 | addChild(_txtField); 54 | } 55 | public function start(channels:Array):void{ 56 | _channels = channels; 57 | update(); 58 | } 59 | public function update():void{ 60 | _txtField.wordWrap = false; 61 | _txtField.width = 80; 62 | var str:String = " X "+ master.panels.mainPanel.getChannelsLink(); 63 | _txtField.htmlText = str+""; 64 | if(_txtField.width>160){ 65 | _txtField.wordWrap = true; 66 | _txtField.width = 160; 67 | } 68 | width = _txtField.width+4; 69 | height = _txtField.height; 70 | } 71 | private function onMenuRollOver(e:TextEvent):void{ 72 | master.panels.mainPanel.onMenuRollOver(e, this); 73 | } 74 | protected function linkHandler(e:TextEvent):void{ 75 | _txtField.setSelection(0, 0); 76 | if(e.text == "close"){ 77 | master.channelsPanel = false; 78 | }else if(e.text.substring(0,8) == "channel_"){ 79 | master.panels.mainPanel.onChannelPressed(e.text.substring(8)); 80 | } 81 | _txtField.setSelection(0, 0); 82 | e.stopPropagation(); 83 | } 84 | } 85 | } -------------------------------------------------------------------------------- /AIR/src/com/luaye/console/view/FPSPanel.as: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2008-2009 Lu Aye Oo 4 | * 5 | * @author Lu Aye Oo 6 | * 7 | * http://code.google.com/p/flash-console/ 8 | * 9 | * 10 | * This software is provided 'as-is', without any express or implied 11 | * warranty. In no event will the authors be held liable for any damages 12 | * arising from the use of this software. 13 | * Permission is granted to anyone to use this software for any purpose, 14 | * including commercial applications, and to alter it and redistribute it 15 | * freely, subject to the following restrictions: 16 | * 1. The origin of this software must not be misrepresented; you must not 17 | * claim that you wrote the original software. If you use this software 18 | * in a product, an acknowledgment in the product documentation would be 19 | * appreciated but is not required. 20 | * 2. Altered source versions must be plainly marked as such, and must not be 21 | * misrepresented as being the original software. 22 | * 3. This notice may not be removed or altered from any source distribution. 23 | * 24 | */ 25 | package com.luaye.console.view { 26 | import com.luaye.console.Console; 27 | import com.luaye.console.view.GraphingPanel; 28 | 29 | import flash.events.Event; 30 | 31 | public class FPSPanel extends GraphingPanel { 32 | // 33 | private var _cachedCurrent:Number; 34 | // 35 | public function FPSPanel(m:Console) { 36 | super(m, 80,40); 37 | name = Console.PANEL_FPS; 38 | lowest = 0; 39 | minimumWidth = 32; 40 | add(this, "current", 0xFF3333, "FPS"); 41 | } 42 | public override function close():void { 43 | super.close(); 44 | master.panels.updateMenu(); // should be black boxed :/ 45 | } 46 | //public override function reset():void { 47 | // //lowest = NaN; 48 | // super.reset(); 49 | //} 50 | public override function stop():void { 51 | super.stop(); 52 | reset(); 53 | } 54 | public override function updateKeyText():void{ 55 | if(_history.length>0){ 56 | keyTxt.htmlText = ""+master.fps.toFixed(1)+" | "+getAverageOf(0).toFixed(1)+" R X"; 57 | }else{ 58 | keyTxt.htmlText = "no fps input X"; 59 | } 60 | } 61 | public function get current():Number{ 62 | if(isNaN(_cachedCurrent)) 63 | return master.fps; 64 | var mspf:Number = _cachedCurrent; 65 | _cachedCurrent = NaN; 66 | return mspf; 67 | } 68 | public function addCurrent(n:Number):void{ 69 | _cachedCurrent = n; 70 | updateData(); 71 | } 72 | protected override function onFrame(e:Event):Boolean{ 73 | if(master.remote) return false; 74 | var mspf:Number = master.mspf; 75 | if (!isNaN(mspf)) { 76 | if(super.onFrame(e)){ 77 | updateKeyText(); 78 | if(stage){ 79 | fixed = true; 80 | averaging = stage.frameRate; 81 | highest = averaging; 82 | var frames:int = Math.floor(mspf/(1000/highest)); 83 | // this is to try add the frames that have been lagged 84 | if(frames>Console.FPS_MAX_LAG_FRAMES) frames = Console.FPS_MAX_LAG_FRAMES; // Don't add too many 85 | while(frames>1){ 86 | updateData(); 87 | frames--; 88 | } 89 | } 90 | return true; 91 | } 92 | } 93 | return false; 94 | } 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /AIR/AIR.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /AIR/src/com/luaye/console/utils/Utils.as: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2008-2009 Lu Aye Oo 4 | * 5 | * @author Lu Aye Oo 6 | * 7 | * http://code.google.com/p/flash-console/ 8 | * 9 | * 10 | * This software is provided 'as-is', without any express or implied 11 | * warranty. In no event will the authors be held liable for any damages 12 | * arising from the use of this software. 13 | * Permission is granted to anyone to use this software for any purpose, 14 | * including commercial applications, and to alter it and redistribute it 15 | * freely, subject to the following restrictions: 16 | * 1. The origin of this software must not be misrepresented; you must not 17 | * claim that you wrote the original software. If you use this software 18 | * in a product, an acknowledgment in the product documentation would be 19 | * appreciated but is not required. 20 | * 2. Altered source versions must be plainly marked as such, and must not be 21 | * misrepresented as being the original software. 22 | * 3. This notice may not be removed or altered from any source distribution. 23 | * 24 | */ 25 | package com.luaye.console.utils { 26 | import flash.utils.getQualifiedClassName; 27 | import flash.display.Graphics; 28 | import flash.geom.Point; 29 | 30 | public class Utils { 31 | 32 | public static function round(n:Number, d:uint):Number{ 33 | return Math.round(n*d)/d; 34 | } 35 | public static function angle(srcP:Point, point:Point):Number { 36 | var X: Number = point.x - srcP.x; 37 | var Y: Number = point.y - srcP.y; 38 | var a:Number = Math.atan2(Y , X)/Math.PI * 180; 39 | a +=90; 40 | if(a>180){ 41 | a -= 360; 42 | } 43 | return a; 44 | } 45 | public static function drawCircleSegment(g:Graphics, radius:Number,pos:Point = null, deg:Number = 180, startDeg:Number = 0):Point 46 | { 47 | if(!pos) pos = new Point(); 48 | var reversed:Boolean = false; 49 | if(deg<0){ 50 | reversed = true; 51 | deg = Math.abs(deg); 52 | } 53 | var rad:Number = (deg*Math.PI)/180; 54 | var rad2:Number = (startDeg*Math.PI)/180; 55 | var p:Point = getPointOnCircle(radius, rad2); 56 | p.offset(pos.x,pos.y); 57 | g.moveTo(p.x,p.y); 58 | var pra:Number = 0; 59 | for (var i:int = 1; i<=(rad+1); i++) { 60 | var ra:Number = i<=rad?i:rad; 61 | var diffr:Number = ra-pra; 62 | var offr:Number = 1+(0.12*diffr*diffr); 63 | var ap:Point = getPointOnCircle(radius*offr, ((ra-(diffr/2))*(reversed?-1:1))+rad2); 64 | ap.offset(pos.x,pos.y); 65 | p = getPointOnCircle(radius, (ra*(reversed?-1:1))+rad2); 66 | p.offset(pos.x,pos.y); 67 | g.curveTo(ap.x,ap.y, p.x,p.y); 68 | pra = ra; 69 | } 70 | return p; 71 | } 72 | public static function getPointOnCircle(radius:Number, rad:Number):Point { 73 | return new Point(radius * Math.cos(rad),radius * Math.sin(rad)); 74 | } 75 | // 76 | 77 | public static function averageOut(current:Number, addition:Number, over:Number):Number { 78 | // this does not output an absolute average - you would need a history of values for this 79 | // This way is more light weight but not as accurate. 80 | return current+((addition-current)/over); 81 | } 82 | public static function replaceByIndexes(str:String, replace:String, start:int, end:int):String { 83 | return str.substring(0,start)+replace+str.substring(end); 84 | } 85 | 86 | public static function shortClassName(cls:Object):String{ 87 | var str:String = getQualifiedClassName(cls); 88 | var ind:int = str.lastIndexOf("::"); 89 | return str.substring(ind>=0?(ind+2):0); 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /AIR/src/com/luaye/console/core/MemoryMonitor.as: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2008-2009 Lu Aye Oo 4 | * 5 | * @author Lu Aye Oo 6 | * 7 | * http://code.google.com/p/flash-console/ 8 | * 9 | * 10 | * This software is provided 'as-is', without any express or implied 11 | * warranty. In no event will the authors be held liable for any damages 12 | * arising from the use of this software. 13 | * Permission is granted to anyone to use this software for any purpose, 14 | * including commercial applications, and to alter it and redistribute it 15 | * freely, subject to the following restrictions: 16 | * 1. The origin of this software must not be misrepresented; you must not 17 | * claim that you wrote the original software. If you use this software 18 | * in a product, an acknowledgment in the product documentation would be 19 | * appreciated but is not required. 20 | * 2. Altered source versions must be plainly marked as such, and must not be 21 | * misrepresented as being the original software. 22 | * 3. This notice may not be removed or altered from any source distribution. 23 | * 24 | */ 25 | package com.luaye.console.core { 26 | import flash.events.EventDispatcher; 27 | import flash.system.System; 28 | import flash.utils.Dictionary; 29 | import flash.utils.getTimer; 30 | 31 | public class MemoryMonitor extends EventDispatcher{ 32 | 33 | //public static const GARBAGE_COLLECTED:String = "garbageCollected"; 34 | //private static const DUMMY_GARBAGE:String = "_memoryMonitor_dummy_garbage"; 35 | 36 | private var _namesList:Object; 37 | private var _objectsList:Dictionary; 38 | //private var _notifyGC:Boolean; 39 | // 40 | // 41 | public function MemoryMonitor() { 42 | _namesList = new Object(); 43 | _objectsList = new Dictionary(true); 44 | } 45 | public function watch(obj:Object, n:String):String{ 46 | if(_objectsList[obj]){ 47 | if(_namesList[_objectsList[obj]]){ 48 | unwatch(_objectsList[obj]); 49 | } 50 | } 51 | if(_namesList[n] && _objectsList[obj] != n){ 52 | var nn:String = n+"@"+getTimer()+"_"+Math.floor(Math.random()*100); 53 | n = nn; 54 | } 55 | _namesList[n] = true; 56 | _objectsList[obj] = n; 57 | return n; 58 | } 59 | public function unwatch(n:String):void{ 60 | for (var X:Object in _objectsList) { 61 | if(_objectsList[X] == n){ 62 | delete _objectsList[X]; 63 | } 64 | } 65 | delete _namesList[n]; 66 | } 67 | // 68 | // 69 | // 70 | public function update():Array { 71 | var arr:Array = new Array(); 72 | var o:Object = new Object(); 73 | for (var X:Object in _objectsList) { 74 | o[_objectsList[X]] = true; 75 | } 76 | for(var Y:String in _namesList){ 77 | if(!o[Y]){ 78 | arr.push(Y); 79 | delete _namesList[Y]; 80 | } 81 | } 82 | return arr; 83 | } 84 | /*private function seedGCDummy():void{ 85 | if(!_namesList[DUMMY_GARBAGE]){ 86 | // using MovieClip as dummy garbate as it doenst get collected straight away like others 87 | watch(new MovieClip(), DUMMY_GARBAGE); 88 | } 89 | } 90 | public function set notifyGC(b:Boolean):void{ 91 | if(_notifyGC != b){ 92 | _notifyGC = b; 93 | if(b){ 94 | seedGCDummy(); 95 | }else if(!b){ 96 | unwatch(DUMMY_GARBAGE); 97 | } 98 | } 99 | } 100 | public function get notifyGC():Boolean{ 101 | return _notifyGC; 102 | }*/ 103 | // 104 | // only works in debugger player version 105 | // 106 | public function gc():Boolean { 107 | if(System["gc"] != null){ 108 | System["gc"](); 109 | return true; 110 | } 111 | return false; 112 | } 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /ChangeLog.md: -------------------------------------------------------------------------------- 1 | # Video Player Adobe Air Native Extension (Android + iOS) 2 | 3 | *Jul 29, 2020 - v5.0.0* 4 | - Upgrade dependencies to the latest versions. 5 | - Fixed some minor issues and refactor native codes. 6 | 7 | *Apr 05, 2020 - V4.0.0* 8 | - Added androidx dependencies instead of android support 9 | 10 | *Aug 4, 2019 - V3.2.41* 11 | * Added Android 64-bit support 12 | * Supports iOS 10+ 13 | 14 | *Nov 18, 2018 - V3.2.3* 15 | * Works with OverrideAir ANE V5.6.1 or higher 16 | * Works with ANELAB V1.1.26 or higher 17 | 18 | *Sep 24, 2018 - V3.2.2* 19 | * Removed androidSupport dependency then added *androidSupport-core.ane* and *androidSupport-v4.ane* 20 | 21 | *Jul 18, 2018 - V3.2.1* 22 | * Removed the PermissionCheck ANE prerequisite from setup manifest used by [ANELAB sofwate](https://github.com/myflashlab/ANE-LAB/) 23 | 24 | *Jul 17, 2018 - V3.2.0* 25 | * On Android, supporting targetSdkVersion is now 26 like below. Lower versions work also but you are recommended to use V26 26 | ```xml 27 | 28 | ``` 29 | * The [permission ANE](https://github.com/myflashlab/PermissionCheck-ANE/) is no longer requierd and you no longer need to ask for external access. **Remove** the following tag from your manifest: `` 30 | * On Android, video files must be copied to `File.cacheDirectory` from now on. make sure you are updating your AS3 code. 31 | * On Android, you must add the following `` tag under the `` tag. 32 | ```xml 33 | 38 | 41 | 42 | ``` 43 | 44 | *Apr 30, 2018 - V3.1.0* 45 | * Updated core video player in iOS side to make sure it works with latest iOS versions also. 46 | * Added listener `VideoPlayerEvent.DISMISSED` to know when the player is dismissed on the **iOS side**. 47 | 48 | *Dec 15, 2017 - V3.0.3* 49 | * optimized for [ANE-LAB sofwate](https://github.com/myflashlab/ANE-LAB). 50 | 51 | *Mar 30, 2017 - V3.0.1* 52 | * Updated the ANE with the latest version overrideAir. Even if you are building for iOS, you need to include this dependency. 53 | * Min iOS version to support this ANE is 8.0 from now on. 54 | * Include `NSAppTransportSecurity` in the manifest if you are trying to play videos on **http** addresses on the iOS side. 55 | 56 | *Nov 08, 2016 - V3.0.0* 57 | * Optimized for Android manual permissions if you are targeting AIR SDK 24+ 58 | * From now on, this ANE will depend on androidSupport.ane and overrideAir.ane on the Android side 59 | 60 | *Jan 20, 2016 - V2.9.2* 61 | * bypassing xCode 7.2 bug causing iOS conflict when compiling with AirSDK 20 without waiting on Adobe or Apple to fix the problem. This is a must have upgrade for your app to make sure you can compile multiple ANEs in your project with AirSDK 20 or greater. https://forums.adobe.com/thread/2055508 https://forums.adobe.com/message/8294948 62 | 63 | *Dec 20, 2015 - V2.9.1* 64 | * minor bug fixes 65 | 66 | *Nov 03, 2015 - V2.9* 67 | * doitflash devs merged into MyFLashLab Team 68 | 69 | *Apr 21, 2015 - V2.2* 70 | * removed android-support-v4.jar dependency in the android side 71 | 72 | *Jan 27, 2015 - V2.1* 73 | * added support for iOS 64-bit 74 | 75 | *Nov 10, 2014 - V2.0* 76 | * Added online video playback for iOS 77 | * Supports youtube playback 78 | 79 | *Nov 04, 2014 - V1.0* 80 | * beginning of the journey! 81 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Video Player ANE (Android+iOS) 2 | video player ANE supported on Android and iOS, lets you play video files in android or iOS players. your videos can be locally availble on your device or they can be online. in the sample codes we have also used our YouTube link parser found here: https://github.com/myflashlab/AS3-youtube-parser-video-link/ and with that you can easily play YouTube videos too. 3 | 4 | [find the latest **asdoc** for this ANE here.](http://myflashlab.github.io/asdoc/com/myflashlab/air/extensions/player/package-detail.html) 5 | 6 | # AIR Usage 7 | For the complete AS3 code usage, see the [demo project here](https://github.com/myflashlab/videoPlayer-ANE/blob/master/AIR/src/MainFinal.as). 8 | 9 | ```actionscript 10 | import com.myflashlab.air.extensions.player.*; 11 | 12 | var _ex:VideoPlayer = new VideoPlayer(); 13 | 14 | // on Android, local videos must be in File.cacheDirectory. on iOS, they can be anywhere. 15 | var vid:File = File.cacheDirectory.resolvePath("exVideoPlayer.mp4"); 16 | _ex.play(vid.nativePath, VideoType.LOCAL); 17 | 18 | // or play online 19 | _ex.play("https://myflashlabs.com/showcase/Bully_Scholarship_Edition_Trailer.mp4", VideoType.ONLINE); 20 | 21 | // you can also play YouTube videos! please see the sample usage code for YouTube in the sample project 22 | ``` 23 | 24 | # AIR .xml manifest 25 | ```xml 26 | 29 | 30 | 31 | 32 | 35 | 40 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 64 | 65 | NSAppTransportSecurity 66 | 67 | NSAllowsArbitraryLoads 68 | 69 | 70 | 71 | 72 | 73 | 76 | 77 | com.myflashlab.air.extensions.videoPlayer 78 | 79 | 80 | com.myflashlab.air.extensions.dependency.androidx.core 81 | com.myflashlab.air.extensions.dependency.androidx.lifecycle 82 | com.myflashlab.air.extensions.dependency.overrideAir 83 | 84 | ``` 85 | 86 | # Requirements 87 | * Android SDK 19+ 88 | * iOS 10.0+ 89 | * AIR SDK 33+ 90 | 91 | # Commercial Version 92 | https://www.myflashlabs.com/product/video-player-ane-adobe-air-native-extension/ 93 | 94 | [![Video Player ANE](https://www.myflashlabs.com/wp-content/uploads/2015/11/product_adobe-air-ane-extension-video-player-2018-595x738.jpg)](https://www.myflashlabs.com/product/video-player-ane-adobe-air-native-extension/) 95 | 96 | # Tutorials 97 | [How to embed ANEs into **FlashBuilder**, **FlashCC** and **FlashDevelop**](https://www.youtube.com/watch?v=Oubsb_3F3ec&list=PL_mmSjScdnxnSDTMYb1iDX4LemhIJrt1O) 98 | 99 | # Premium Support # 100 | [![Premium Support package](https://www.myflashlabs.com/wp-content/uploads/2016/06/professional-support.jpg)](https://www.myflashlabs.com/product/myflashlabs-support/) 101 | If you are an [active MyFlashLabs club member](https://www.myflashlabs.com/product/myflashlabs-club-membership/), you will have access to our private and secure support ticket system for all our ANEs. Even if you are not a member, you can still receive premium help if you purchase the [premium support package](https://www.myflashlabs.com/product/myflashlabs-support/). -------------------------------------------------------------------------------- /AIR/Main-app.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | com.doitflash.exVideoPlayer 4 | 4.0.0 5 | mobileDevice 6 | exVideoPlayer 7 | Video Player 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 38 | 43 | 46 | 47 | 48 | 49 | ]]> 50 | 51 | 52 | 53 | 54 | UIStatusBarStyle 55 | UIStatusBarStyleBlackOpaque 56 | UIRequiresPersistentWiFi 57 | NO 58 | UIPrerenderedIcon 59 | 60 | UIApplicationExitsOnSuspend 61 | 62 | 63 | 64 | NSAppTransportSecurity 65 | 66 | NSAllowsArbitraryLoads 67 | 68 | 69 | 70 | UILaunchStoryboardName 71 | LaunchScreen 72 | 73 | UIDeviceFamily 74 | 75 | 76 | 1 77 | 78 | 2 79 | ]]> 80 | 81 | high 82 | 83 | 84 | exVideoPlayer 85 | ex.swf 86 | true 87 | true 88 | false 89 | portrait 90 | gpu 91 | 92 | 93 | standard 94 | 95 | 96 | icons/icon_36.png 97 | icons/icon_48.png 98 | icons/icon_72.png 99 | icons/icon_96.png 100 | icons/icon_144.png 101 | icons/icon_192.png 102 | icons/icon_512.png 103 | icons/icon_1024.png 104 | 105 | 106 | 107 | com.myflashlab.air.extensions.videoPlayer 108 | 109 | 110 | com.myflashlab.air.extensions.dependency.androidx.core 111 | com.myflashlab.air.extensions.dependency.androidx.lifecycle 112 | com.myflashlab.air.extensions.dependency.overrideAir 113 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /AIR/src/com/luaye/console/view/RollerPanel.as: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2008-2009 Lu Aye Oo 4 | * 5 | * @author Lu Aye Oo 6 | * 7 | * http://code.google.com/p/flash-console/ 8 | * 9 | * 10 | * This software is provided 'as-is', without any express or implied 11 | * warranty. In no event will the authors be held liable for any damages 12 | * arising from the use of this software. 13 | * Permission is granted to anyone to use this software for any purpose, 14 | * including commercial applications, and to alter it and redistribute it 15 | * freely, subject to the following restrictions: 16 | * 1. The origin of this software must not be misrepresented; you must not 17 | * claim that you wrote the original software. If you use this software 18 | * in a product, an acknowledgment in the product documentation would be 19 | * appreciated but is not required. 20 | * 2. Altered source versions must be plainly marked as such, and must not be 21 | * misrepresented as being the original software. 22 | * 3. This notice may not be removed or altered from any source distribution. 23 | * 24 | */ 25 | package com.luaye.console.view { 26 | import com.luaye.console.Console; 27 | import com.luaye.console.utils.Utils; 28 | 29 | import flash.display.DisplayObject; 30 | import flash.display.DisplayObjectContainer; 31 | import flash.display.Stage; 32 | import flash.events.Event; 33 | import flash.events.TextEvent; 34 | import flash.geom.Point; 35 | import flash.text.TextField; 36 | import flash.text.TextFieldAutoSize; 37 | import flash.utils.Dictionary; 38 | 39 | public class RollerPanel extends AbstractPanel{ 40 | 41 | private var _txtField:TextField; 42 | private var _base:DisplayObjectContainer; 43 | 44 | public function RollerPanel(m:Console) { 45 | super(m); 46 | name = Console.PANEL_ROLLER; 47 | init(60,100,false); 48 | _txtField = new TextField(); 49 | _txtField.name = "rollerprints"; 50 | _txtField.multiline = true; 51 | _txtField.autoSize = TextFieldAutoSize.LEFT; 52 | _txtField.styleSheet = style.css; 53 | _txtField.addEventListener(TextEvent.LINK, linkHandler, false, 0, true); 54 | registerRollOverTextField(_txtField); 55 | _txtField.addEventListener(AbstractPanel.TEXT_LINK, onMenuRollOver, false, 0, true); 56 | registerDragger(_txtField); 57 | addChild(_txtField); 58 | } 59 | public function start(base:DisplayObjectContainer):void{ 60 | _base = base; 61 | addEventListener(Event.ENTER_FRAME, _onFrame, false, 0, true); 62 | } 63 | public function capture():String{ 64 | return getMapString(true); 65 | } 66 | private function onMenuRollOver(e:TextEvent):void{ 67 | master.panels.tooltip(e.text?"Close":null, this); 68 | } 69 | private function _onFrame(e:Event):void{ 70 | if(!_base.stage){ 71 | close(); 72 | return; 73 | } 74 | _txtField.htmlText = ""+getMapString()+""; 75 | _txtField.autoSize = TextFieldAutoSize.LEFT; 76 | _txtField.setSelection(0, 0); 77 | width = _txtField.width+4; 78 | height = _txtField.height; 79 | } 80 | private function getMapString(dolink:Boolean = false):String{ 81 | var stg:Stage = _base.stage; 82 | var str:String = ""; 83 | var objs:Array = stg.getObjectsUnderPoint(new Point(stg.mouseX, stg.mouseY)); 84 | var stepMap:Dictionary = new Dictionary(true); 85 | if(objs.length == 0){ 86 | objs.push(stg);// if nothing at least have stage. 87 | } 88 | for each(var child:DisplayObject in objs){ 89 | var chain:Array = new Array(child); 90 | var par:DisplayObjectContainer = child.parent; 91 | while(par){ 92 | chain.unshift(par); 93 | par = par.parent; 94 | } 95 | var len:uint = chain.length; 96 | for (var i:uint=0; i0;j--){ 102 | str += j==1?" ∟":" -"; 103 | } 104 | if(dolink){ 105 | if(obj == stg){ 106 | str += "Stage ["+stg.mouseX+","+stg.mouseY+"]"; 107 | }else if(i == len-1){ 108 | str += ""+obj.name+"("+Utils.shortClassName(obj)+")"; 109 | }else { 110 | str += ""+obj.name+"("+Utils.shortClassName(obj)+")"; 111 | } 112 | }else{ 113 | if(obj == stg){ 114 | str += " X Stage ["+stg.mouseX+","+stg.mouseY+"]
"; 115 | }else if(i == len-1){ 116 | str += ""+obj.name+"("+Utils.shortClassName(obj)+")"; 117 | }else { 118 | str += ""+obj.name+"("+Utils.shortClassName(obj)+")
"; 119 | } 120 | } 121 | } 122 | } 123 | } 124 | return str; 125 | } 126 | private function mapUpward(mc:DisplayObject):String{ 127 | var arr:Array = [mc.name]; 128 | mc = mc.parent; 129 | while(mc && mc!=mc.stage){ 130 | arr.push(mc.name); 131 | mc = mc.parent; 132 | } 133 | return arr.reverse().join(Console.MAPPING_SPLITTER); 134 | } 135 | public override function close():void { 136 | removeEventListener(Event.ENTER_FRAME, _onFrame); 137 | _base = null; 138 | super.close(); 139 | master.panels.updateMenu(); // should be black boxed :/ 140 | } 141 | protected function linkHandler(e:TextEvent):void{ 142 | TextField(e.currentTarget).setSelection(0, 0); 143 | if(e.text == "close"){ 144 | close(); 145 | } 146 | e.stopPropagation(); 147 | } 148 | } 149 | } -------------------------------------------------------------------------------- /AIR/src/com/luaye/console/view/Style.as: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2008-2009 Lu Aye Oo 4 | * 5 | * @author Lu Aye Oo 6 | * 7 | * http://code.google.com/p/flash-console/ 8 | * 9 | * 10 | * This software is provided 'as-is', without any express or implied 11 | * warranty. In no event will the authors be held liable for any damages 12 | * arising from the use of this software. 13 | * Permission is granted to anyone to use this software for any purpose, 14 | * including commercial applications, and to alter it and redistribute it 15 | * freely, subject to the following restrictions: 16 | * 1. The origin of this software must not be misrepresented; you must not 17 | * claim that you wrote the original software. If you use this software 18 | * in a product, an acknowledgment in the product documentation would be 19 | * appreciated but is not required. 20 | * 2. Altered source versions must be plainly marked as such, and must not be 21 | * misrepresented as being the original software. 22 | * 3. This notice may not be removed or altered from any source distribution. 23 | * 24 | */ 25 | package com.luaye.console.view { 26 | import flash.text.TextFormat; 27 | import flash.text.StyleSheet; 28 | 29 | public class Style { 30 | 31 | private var _preset:int = 0; 32 | 33 | public var css:StyleSheet; 34 | public var panelBackgroundColor:int; 35 | public var panelBackgroundAlpha:Number; 36 | public var panelScalerColor:Number; 37 | public var commandLineColor:Number; 38 | public var bottomLineColor:Number; 39 | public var textFormat:TextFormat; 40 | 41 | public function Style(uiset:int = 1) { 42 | css = new StyleSheet(); 43 | preset = uiset; 44 | if(_preset<=0){ 45 | preset = 1; 46 | } 47 | } 48 | 49 | public function set preset(num:int):void{ 50 | if(hasOwnProperty(["preset"+num])){ 51 | this["preset"+num](); 52 | _preset = num; 53 | } 54 | } 55 | public function get preset():int{ 56 | return _preset; 57 | } 58 | public function preset1():void{ 59 | panelBackgroundColor = 0; 60 | panelScalerColor = 0x880000; 61 | commandLineColor = 0x10AA00; 62 | bottomLineColor = 0xFF0000; 63 | panelBackgroundAlpha = 0.8; 64 | textFormat = new TextFormat('Arial', 12, 0xFFFFFF); 65 | // 66 | css.setStyle("r",{textAlign:'right', display:'inline'}); 67 | css.setStyle("w",{color:'#FFFFFF', fontFamily:'Arial', fontSize:'12', display:'inline'}); 68 | css.setStyle("s",{color:'#CCCCCC', fontFamily:'Arial', fontSize:'10', display:'inline'}); 69 | css.setStyle("y",{color:'#DD5500', display:'inline'}); 70 | css.setStyle("ro",{color:'#DD5500', fontFamily:'Arial', fontSize:'11', display:'inline'}); 71 | css.setStyle("roBold",{color:'#EE6611', fontWeight:'bold'}); 72 | css.setStyle("menu",{color:'#FF8800', display:'inline'}); 73 | css.setStyle("chs",{color:'#FFFFFF', fontSize:'11', leading:'2', display:'inline'}); 74 | css.setStyle("ch",{color:'#0099CC', display:'inline'}); 75 | css.setStyle("tooltip",{color:'#DD5500',fontFamily:'Arial', textAlign:'center'}); 76 | // 77 | css.setStyle("p",{fontFamily:'Verdana', fontSize:'11'}); 78 | css.setStyle("l1",{color:'#0099CC'}); 79 | css.setStyle("l2",{color:'#FF8800'}); 80 | css.setStyle("p0",{color:'#336633', display:'inline'}); 81 | css.setStyle("p1",{color:'#33AA33', display:'inline'}); 82 | css.setStyle("p2",{color:'#77D077', display:'inline'}); 83 | css.setStyle("p3",{color:'#AAEEAA', display:'inline'}); 84 | css.setStyle("p4",{color:'#D6FFD6', display:'inline'}); 85 | css.setStyle("p5",{color:'#E6E6E6', display:'inline'}); 86 | css.setStyle("p6",{color:'#FFD6D6', display:'inline'}); 87 | css.setStyle("p7",{color:'#FFAAAA', display:'inline'}); 88 | css.setStyle("p8",{color:'#FF7777', display:'inline'}); 89 | css.setStyle("p9",{color:'#FF2222', display:'inline'}); 90 | css.setStyle("p10",{color:'#FF2222', display:'inline'}); 91 | css.setStyle("p100",{color:'#FF0000', fontWeight:'bold', display:'inline'}); 92 | css.setStyle("p-1",{color:'#0099CC', display:'inline'}); 93 | css.setStyle("p-2",{color:'#FF8800', display:'inline'}); 94 | } 95 | 96 | public function preset2():void{ 97 | panelBackgroundColor = 0xFFFFFF; 98 | panelScalerColor = 0xFF0000; 99 | commandLineColor = 0x66CC00; 100 | bottomLineColor = 0xFF0000; 101 | panelBackgroundAlpha = 0.8; 102 | textFormat = new TextFormat('Arial', 12, 0); 103 | // 104 | css.setStyle("r",{textAlign:'right', display:'inline'}); 105 | css.setStyle("w",{color:'#000000', fontFamily:'Arial', fontSize:'12', display:'inline'}); 106 | css.setStyle("s",{color:'#333333', fontFamily:'Arial', fontSize:'10', display:'inline'}); 107 | css.setStyle("y",{color:'#881100', display:'inline'}); 108 | css.setStyle("ro",{color:'#661100', fontFamily:'Arial', fontSize:'11', display:'inline'}); 109 | css.setStyle("roBold",{color:'#AA4400', fontWeight:'bold'}); 110 | css.setStyle("menu",{color:'#CC1100', display:'inline'}); 111 | css.setStyle("chs",{color:'#000000', fontSize:'11', leading:'2', display:'inline'}); 112 | css.setStyle("ch",{color:'#0066AA', display:'inline'}); 113 | css.setStyle("tooltip",{color:'#AA3300',fontFamily:'Arial', textAlign:'center'}); 114 | // 115 | css.setStyle("p",{fontFamily:'Verdana', fontSize:'11'}); 116 | css.setStyle("l1",{color:'#0099CC'}); 117 | css.setStyle("l2",{color:'#FF8800'}); 118 | css.setStyle("p0",{color:'#666666', display:'inline'}); 119 | css.setStyle("p1",{color:'#339033', display:'inline'}); 120 | css.setStyle("p2",{color:'#227722', display:'inline'}); 121 | css.setStyle("p3",{color:'#115511', display:'inline'}); 122 | css.setStyle("p4",{color:'#003300', display:'inline'}); 123 | css.setStyle("p5",{color:'#000000', display:'inline'}); 124 | css.setStyle("p6",{color:'#660000', display:'inline'}); 125 | css.setStyle("p7",{color:'#990000', display:'inline'}); 126 | css.setStyle("p8",{color:'#BB0000', display:'inline'}); 127 | css.setStyle("p9",{color:'#DD0000', display:'inline'}); 128 | css.setStyle("p10",{color:'#FF0000', display:'inline'}); 129 | css.setStyle("p100",{color:'#FF0000', fontWeight:'bold', display:'inline'}); 130 | css.setStyle("p-1",{color:'#0099CC', display:'inline'}); 131 | css.setStyle("p-2",{color:'#FF6600', display:'inline'}); 132 | } 133 | public function preset3():void{ 134 | preset1(); 135 | panelBackgroundAlpha = 1; 136 | } 137 | public function preset4():void{ 138 | preset2(); 139 | panelBackgroundAlpha = 1; 140 | } 141 | public function preset951():void{ 142 | // USED BY AIR Remote 143 | preset1(); 144 | panelBackgroundAlpha = 0.55; 145 | } 146 | } 147 | } -------------------------------------------------------------------------------- /AIR/src/com/doitflash/tools/DynamicFunc.as: -------------------------------------------------------------------------------- 1 | package com.doitflash.tools 2 | { 3 | //import com.luaye.console.C; 4 | /** 5 | * With the help of this class you can convert strings into function calls. 6 | * your string must be in the following format, as you can see, we have the function name as myFunc 7 | * and you may optionally send different styles of arguments to that function, it supports arguments in form of 8 | * simple strings, arrays or objects. 9 | * myFunc(val1,val2,[arr1,arr2,arr3],{var1:value1,var2:value2,var3:value3}) 10 | * 11 | * 12 | * function myFunc($str1:String, $str2:String, $arr:Array, $obj:Object):void 13 | * { 14 | * trace($str1); 15 | * trace($str2); 16 | * trace($arr); 17 | * trace($obj); 18 | * } 19 | * 20 | * 21 | * @author Hadi Tavakoli - 9/11/2010 1:32 PM 22 | * @author Hadi Tavakoli - Modified - 5/14/2011 5:34 PM 23 | * @author Hadi Tavakoli - Modified - 8/30/2011 6:56 PM 24 | * @example The following example shows how a string is converted to an actuall function call. 25 | * 26 | * 27 | * var myString:String = "myFunc(value,value2,[arr1,arr2,arr3],{var1:value1,var2:value2,var3:value3})"; 28 | * var df:DynamicFunc = new DynamicFunc(myString); 29 | * this[df.funcName].apply(null, df.inputs); 30 | * 31 | * function myFunc($str1:String, $str2:String, $arr:Array, $obj:Object):void 32 | * { 33 | * trace($str1); 34 | * trace($str2); 35 | * trace($arr); 36 | * trace($obj); 37 | * } 38 | * 39 | */ 40 | public class DynamicFunc 41 | { 42 | private var _funcName:String; 43 | private var _inputs:Array = []; 44 | 45 | public static const OBJECT_PATTERN:RegExp = /[\w_!.@\$\?%]+:[\w_!.@\$\?%\s\/\[\]]+/g; 46 | public static const STRING_PATTERN_FOR_OBJECT:RegExp = /[\w_!.@\$\?%\s\/\[\]]+/g; 47 | public static const STRING_PATTERN:RegExp = /[\w_!:.@\$\?%\s\/\(\)'-]+/g; 48 | 49 | /** 50 | * initialize the class and send your string to be converted to a function call. 51 | * @param $str 52 | * 53 | * @see #funcName 54 | * @see #inputs 55 | */ 56 | public function DynamicFunc($str:String):void 57 | { 58 | //required patterns for analyzing the string 59 | var funcPattern:RegExp = /[\w_]+/; 60 | var valuePattern:RegExp = /\[?\{?((([\w_!.@\$\?%]+):?([\w_!.@\$\?%\s\/]+)?),?\s?)+\}?\]?/g; 61 | //var stringPattern:RegExp = /[\w_!:.@\$\?%\s\/]+/g; 62 | //var stringPatternForObject:RegExp = /[\w_!.@\$\?%\s\/]+/g; 63 | //var objectPattern:RegExp = /[\w_!.@\$\?%]+:[\w_!.@\$\?%\s\/]+/g; 64 | 65 | // save the function name in string 66 | _funcName = $str.match(funcPattern)[0]; 67 | 68 | // overwrite the raw string and remove the function name from the beggining 69 | $str = $str.replace(_funcName, ""); 70 | 71 | // identify different kinds of inputs and save them in an array 72 | var rawValues:Array = $str.match(valuePattern); 73 | 74 | for (var i:int = 0; i < rawValues.length; i++ ) 75 | { 76 | var curr:String = rawValues[i]; 77 | 78 | if (curr.charAt(0) == "[") 79 | { 80 | // save the input as an array 81 | _inputs.push(curr.match(DynamicFunc.STRING_PATTERN)); 82 | } 83 | else if (curr.charAt(0) == "{") 84 | { 85 | // save the input as an object 86 | var finalObject:Object = {}; 87 | var objMatchArray:Array = curr.match(DynamicFunc.OBJECT_PATTERN); 88 | for (var k:int = 0; k < objMatchArray.length; k++ ) 89 | { 90 | var eachPair:Array = objMatchArray[k].match(DynamicFunc.STRING_PATTERN_FOR_OBJECT); 91 | finalObject[eachPair[0]] = eachPair[1]; 92 | } 93 | _inputs.push(finalObject); 94 | } 95 | else 96 | { 97 | // save the input as a string 98 | var curStringArr:Array = curr.match(DynamicFunc.STRING_PATTERN); 99 | for (var j:int = 0; j < curStringArr.length; j++ ) 100 | { 101 | _inputs.push(curStringArr[j]); 102 | } 103 | } 104 | } 105 | } 106 | 107 | /** 108 | * returns the function name in string type 109 | */ 110 | public function get funcName():String 111 | { 112 | return _funcName; 113 | } 114 | 115 | /** 116 | * returns all arguments, if any, for the function. 117 | */ 118 | public function get inputs():Array 119 | { 120 | return _inputs; 121 | } 122 | 123 | public static function getObject($str:String):Object 124 | { 125 | var finalObject:Object = {}; 126 | var objMatchArray:Array = $str.match(DynamicFunc.OBJECT_PATTERN); 127 | for (var k:int = 0; k < objMatchArray.length; k++ ) 128 | { 129 | var eachPair:Array = objMatchArray[k].match(DynamicFunc.STRING_PATTERN_FOR_OBJECT); 130 | finalObject[eachPair[0]] = eachPair[1]; 131 | } 132 | 133 | return finalObject; 134 | } 135 | 136 | public static function getArray($str:String):Array 137 | { 138 | return $str.match(DynamicFunc.STRING_PATTERN); 139 | } 140 | 141 | public static function run($delegate:*, $stringFunc:String):void 142 | { 143 | var inputs:Array = []; 144 | 145 | var funcPattern:RegExp = /[\w_]+/; 146 | var valuePattern:RegExp = /\[?\{?((([\w_!.@\$\?%]+):?([\w_!.@\$\?%\s\/'-]+)?),?\s?)+\}?\]?/g; 147 | 148 | // save the function name in string 149 | var funcName:String = $stringFunc.match(funcPattern)[0]; 150 | 151 | // overwrite the raw string and remove the function name from the beggining 152 | $stringFunc = $stringFunc.replace(funcName, ""); 153 | 154 | // identify different kinds of inputs and save them in an array 155 | var rawValues:Array = $stringFunc.match(valuePattern); 156 | 157 | var curr:String; 158 | for (var i:int = 0; i < rawValues.length; i++ ) 159 | { 160 | curr = rawValues[i]; 161 | 162 | if (curr.charAt(0) == "[") 163 | { 164 | // save the input as an array 165 | inputs.push(curr.match(DynamicFunc.STRING_PATTERN)); 166 | } 167 | else if (curr.charAt(0) == "{") 168 | { 169 | // save the input as an object 170 | var finalObject:Object = {}; 171 | var objMatchArray:Array = curr.match(DynamicFunc.OBJECT_PATTERN); 172 | 173 | for (var k:int = 0; k < objMatchArray.length; k++ ) 174 | { 175 | var eachPair:Array = objMatchArray[k].match(DynamicFunc.STRING_PATTERN_FOR_OBJECT); 176 | finalObject[eachPair[0]] = eachPair[1]; 177 | } 178 | 179 | inputs.push(finalObject); 180 | } 181 | else 182 | { 183 | // save the input as a string 184 | var curStringArr:Array = curr.match(DynamicFunc.STRING_PATTERN); 185 | for (var j:int = 0; j < curStringArr.length; j++ ) 186 | { 187 | if (curStringArr[j] == "true") 188 | { 189 | inputs.push(true); 190 | } 191 | else if (curStringArr[j] == "false") 192 | { 193 | inputs.push(false); 194 | } 195 | else 196 | { 197 | inputs.push(curStringArr[j]); 198 | } 199 | } 200 | } 201 | } 202 | 203 | $delegate[funcName].apply(null, inputs); 204 | } 205 | } 206 | 207 | } -------------------------------------------------------------------------------- /AIR/src/com/doitflash/mobileProject/commonCpuSrc/DeviceInfo.as: -------------------------------------------------------------------------------- 1 | package com.doitflash.mobileProject.commonCpuSrc 2 | { 3 | import flash.system.Capabilities; 4 | import flash.system.TouchscreenType; 5 | import flash.ui.Multitouch; 6 | import flash.ui.KeyboardType; 7 | import flash.ui.Keyboard; 8 | import flash.ui.Mouse; 9 | import flash.ui.MultitouchInputMode; 10 | 11 | import flash.sensors.Accelerometer; 12 | import flash.sensors.Geolocation; 13 | 14 | import flash.media.CameraUI; 15 | import flash.media.Camera; 16 | import flash.media.Microphone; 17 | import flash.media.StageWebView; 18 | 19 | 20 | /** 21 | * ... 22 | * @author Hadi Tavakoli - 3/3/2012 6:38 PM 23 | */ 24 | public class DeviceInfo 25 | { 26 | public static const LDPI:String = "ldpi"; 27 | public static const MDPI:String = "mdpi"; 28 | public static const HDPI:String = "hdpi"; 29 | public static const XHDPI:String = "xhdpi"; 30 | 31 | public function DeviceInfo():void 32 | { 33 | 34 | } 35 | 36 | // ----------------------------------------------------------------------------------------------------------------------- Privates 37 | 38 | 39 | 40 | // ----------------------------------------------------------------------------------------------------------------------- Methods 41 | 42 | 43 | 44 | // ----------------------------------------------------------------------------------------------------------------------- Properties 45 | 46 | public static function get info():String 47 | { 48 | var info:String; 49 | 50 | info = "touchscreenType = " + DeviceInfo.touchscreenType + "\n"; 51 | info += "supportsCursor = " + DeviceInfo.supportsCursor + "\n"; 52 | info += "physicalKeyboardType = " + DeviceInfo.physicalKeyboardType + "\n"; 53 | info += "hasVirtualKeyboard = " + DeviceInfo.hasVirtualKeyboard + "\n"; 54 | info += "supportsGestureEvents = " + DeviceInfo.supportsGestureEvents + "\n"; 55 | info += "supportsTouchEvents = " + DeviceInfo.supportsTouchEvents + "\n"; 56 | info += "supportsGestures = " + DeviceInfo.supportsGestures + "\n"; 57 | info += "supportedGestures = " + DeviceInfo.supportedGestures + "\n"; 58 | info += "supportsAccelerometer = " + DeviceInfo.supportsAccelerometer + "\n"; 59 | info += "supportsGeolocation = " + DeviceInfo.supportsGeolocation + "\n"; 60 | info += "supportsCameraUI = " + DeviceInfo.supportsCameraUI + "\n"; 61 | info += "supportsCamera = " + DeviceInfo.supportsCamera + "\n"; 62 | info += "supportsMicrophone = " + DeviceInfo.supportsMicrophone + "\n"; 63 | info += "pixelAspectRatio = " + DeviceInfo.pixelAspectRatio + "\n"; 64 | info += "dpi = " + DeviceInfo.dpi + "\n"; 65 | info += "dpiCategory = " + DeviceInfo.dpiCategory + "\n"; 66 | info += "dpiScaleMultiplier = " + DeviceInfo.dpiScaleMultiplier + "\n"; 67 | info += "screenResolutionX = " + DeviceInfo.screenResolutionX + "\n"; 68 | info += "screenResolutionY = " + DeviceInfo.screenResolutionY + "\n"; 69 | info += "cpuArchitecture = " + DeviceInfo.cpuArchitecture + "\n"; 70 | info += "supportsStageWebView = " + DeviceInfo.supportsStageWebView + "\n"; 71 | 72 | return info; 73 | } 74 | 75 | 76 | 77 | public static function get touchscreenType():String 78 | { 79 | return Capabilities.touchscreenType; 80 | } 81 | 82 | public static function get supportsCursor():Boolean 83 | { 84 | return Mouse.supportsCursor; 85 | } 86 | 87 | public static function get physicalKeyboardType():String 88 | { 89 | return Keyboard.physicalKeyboardType; 90 | } 91 | 92 | public static function get hasVirtualKeyboard():Boolean 93 | { 94 | return Keyboard.hasVirtualKeyboard; 95 | } 96 | 97 | public static function get supportsGestureEvents():Boolean 98 | { 99 | return Multitouch.supportsGestureEvents; 100 | } 101 | 102 | public static function get supportsTouchEvents():Boolean 103 | { 104 | return Multitouch.supportsTouchEvents; 105 | } 106 | 107 | public static function get supportsGestures():Boolean 108 | { 109 | Multitouch.inputMode = MultitouchInputMode.GESTURE; 110 | if (Multitouch.supportedGestures) return true; 111 | 112 | return false; 113 | } 114 | 115 | public static function get supportedGestures():Vector. 116 | { 117 | Multitouch.inputMode = MultitouchInputMode.GESTURE; 118 | if (Multitouch.supportedGestures) return Multitouch.supportedGestures; 119 | 120 | return null; 121 | } 122 | 123 | public static function get supportsAccelerometer():Boolean 124 | { 125 | return Accelerometer.isSupported; 126 | } 127 | 128 | public static function get supportsGeolocation():Boolean 129 | { 130 | return Geolocation.isSupported; 131 | } 132 | 133 | public static function get supportsCameraUI():Boolean 134 | { 135 | return CameraUI.isSupported; 136 | } 137 | 138 | public static function get supportsCamera():Boolean 139 | { 140 | return Camera.isSupported; 141 | } 142 | 143 | public static function get supportsMicrophone():Boolean 144 | { 145 | return Microphone.isSupported; 146 | } 147 | 148 | public static function get pixelAspectRatio():Number 149 | { 150 | return Capabilities.pixelAspectRatio; 151 | } 152 | 153 | public static function get dpi():Number 154 | { 155 | return Capabilities.screenDPI; 156 | } 157 | 158 | public static function get dpiCategory():String 159 | { 160 | var currDpi:Number = Capabilities.screenDPI; 161 | var currDpiCat:String = DeviceInfo.MDPI; 162 | 163 | if (currDpi <= 140) 164 | { 165 | currDpiCat = DeviceInfo.LDPI; 166 | } 167 | else if (currDpi > 140 && currDpi <= 200) 168 | { 169 | currDpiCat = DeviceInfo.MDPI; 170 | } 171 | else if (currDpi > 200 && currDpi <= 280) 172 | { 173 | currDpiCat = DeviceInfo.HDPI; 174 | } 175 | else if (currDpi > 280) 176 | { 177 | currDpiCat = DeviceInfo.XHDPI; 178 | } 179 | 180 | return currDpiCat; 181 | } 182 | 183 | public static function get dpiScaleMultiplier():Number 184 | { 185 | var currDpi:Number = Capabilities.screenDPI; 186 | var multiplier:Number = 1; 187 | 188 | if (currDpi <= 140) 189 | { 190 | multiplier = 0.75; 191 | } 192 | else if (currDpi > 140 && currDpi <= 200) 193 | { 194 | multiplier = 1; 195 | } 196 | else if (currDpi > 200 && currDpi <= 280) 197 | { 198 | multiplier = 1.5; 199 | } 200 | else if (currDpi > 280) 201 | { 202 | multiplier = 2; 203 | } 204 | 205 | return multiplier; 206 | } 207 | 208 | public static function get screenResolutionX():Number 209 | { 210 | return Capabilities.screenResolutionX; 211 | } 212 | 213 | public static function get screenResolutionY():Number 214 | { 215 | return Capabilities.screenResolutionY; 216 | } 217 | 218 | public static function get cpuArchitecture():String 219 | { 220 | return Capabilities.cpuArchitecture; 221 | } 222 | 223 | public static function get supportsStageWebView():Boolean 224 | { 225 | return StageWebView.isSupported; 226 | } 227 | 228 | public static function get stageWebView():Class 229 | { 230 | return StageWebView; 231 | } 232 | } 233 | 234 | } -------------------------------------------------------------------------------- /AIR/src/com/luaye/utils/thread/Thread.as: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * @author Lu Aye Oo 4 | * 5 | * Thread. 6 | * 7 | * *What is it?*: 8 | * 9 | * Flash runs in a single thread. Which means if you execute an intensive script, 10 | * flash would lag/un-respond until your script finishes. 11 | * You would want to spread the process over a number of frames to avoid this lag. 12 | * 13 | * This class allows you to call a function over and over again while keeping the frameRate 14 | * and interface response fairly stable and also avoid falling into script timeout. 15 | * 16 | * 17 | * *Example use*: 18 | * 19 | * I used this for 'path finding' which can take between 10ms to 1000ms (depending on map size). 20 | * I don't want user to lag out everytime they choose a path. 21 | * instead I trade it off by taking 1-10 frames for path to be found. 22 | * 23 | * In an arcade style game, I needed to pre render the background + static objects into tiled bitmaps 24 | * Some long levels takes quite a long time to render so using Thread lets me spread the process and 25 | * have a smoother 'building' screen animation (rather than a stucked/lagged screen). 26 | * 27 | * 28 | * *When you shouldn't use*: 29 | * - If you want the outcome of the process straight away, this will not always delivery - 30 | * because it will spread your function calls over a number of frames if needed. 31 | * 32 | * 33 | * *To be careful*: 34 | * - This class DOES NOT stop the function from excuting half way through. 35 | * It only spreads the time between each function call (when needed). 36 | * - If your process is not only a 'loop' you could make a function that manage the sequence 37 | * in which it should excute by looking at 'steps' to know which step of thread you are on. 38 | * - You can call multiple Threads to execute at the same time - However each thread does not share 39 | * 'givenTime' with others so you will need to manage it for better processing spread. 40 | * 41 | * 42 | * *Example Code*: 43 | * 44 | * Example below is using Thread to increament an integer 'n' up to 500,000 45 | * giving 20 ms per frame to excute (it let go a frame when 20ms is passed). 46 | * Change countUpTo var if you are getting 1-2 frames/threadStep - your machine must be fast then! 47 | * 48 | 49 | import com.luaye.utils.thread.Thread; 50 | 51 | var countUpTo:int = 500000; 52 | var traceEvery:int = 20000; 53 | 54 | new Thread(stepFun, {n:0}, false, 20); 55 | 56 | function stepFun(thread:Thread):void{ 57 | var vars:Object = thread.vars; 58 | vars.n++; 59 | if(vars.n%traceEvery == 0){ 60 | trace("n = ", vars.n, ", threadStep = ", thread.threadSteps); 61 | } 62 | if(vars.n >= countUpTo){ 63 | // need to call end() to stop executing. 64 | thread.end(); 65 | trace("Ended process after "+thread.threadSteps+" frames/threadSteps"); 66 | } 67 | } 68 | 69 | * 70 | */ 71 | 72 | package com.luaye.utils.thread { 73 | import flash.display.Shape; 74 | import flash.events.Event; 75 | import flash.utils.getTimer; 76 | 77 | 78 | public class Thread { 79 | 80 | private static var _Threads:Array = []; 81 | // this is used to store the refernce to all threads (unless it was chosen to be 'weak') 82 | // Because threads without any reference elsewhere can get garbage collected before finishing. 83 | 84 | 85 | private var _maxTime:uint = 10; 86 | private var _steps:uint; 87 | private var _threadSteps:uint; 88 | private var _step:Function; 89 | private var _excuting:Boolean; 90 | private var _weak:Boolean; 91 | // uses Shape's enterFrame event to know the ticks... don't know other way - Timer doesnt work as good as this way... 92 | // Shape is more lightweight than Sprite, etc, I THINK 93 | private var _ticker:Shape; 94 | // 95 | 96 | public var vars:Object; 97 | 98 | 99 | /* 100 | * stepFun: Step function. example: function threadStep(thread:Thread):void {...} 101 | * vars: variables to keep with thread (optional) 102 | * m: manual control? if true, you need to call step() to execute each frame/step 103 | * maxt: maximum time given per step 104 | * weak: if true it can get garbage collected before function end unless you keep the Thread's reference. 105 | * (it is better practice to make it weak and keep the thread's reference in your code to prevent from 106 | * being garbage collected. This way, if the code that keeps the thread is garbage collected, the thread 107 | * will also go with it - rather than it keep holding on till it end for nothing. 108 | */ 109 | public function Thread(stepFun:Function, vrs:Object = null, m:Boolean = false, maxt:uint = 20, weak:Boolean = false){ 110 | if(stepFun == null){ 111 | throw new Error("Thread: step Function can not be null"); 112 | } 113 | _step = stepFun; 114 | vars = vrs; 115 | maxTime = maxt; 116 | manual = m; 117 | // 118 | _weak = weak; 119 | if(!weak){ 120 | _Threads.push(this); 121 | } 122 | } 123 | 124 | /* 125 | * Excute thread step 126 | * You can manually call this to force run the excutition. 127 | * You can not exactly control how many times you want to call your step function 128 | * It will keep calling till it run out of your 'givenTime' OR 'maxTime' OR when 'thread.end()' 129 | * leave param blank (or 0) to use default time. 130 | * 131 | */ 132 | public function step(givenTime:uint = 0):int{ 133 | if(_excuting || _step == null) return -1; 134 | if(givenTime == 0) givenTime = _maxTime; 135 | _excuting = true; 136 | _threadSteps++; 137 | var st:uint = getTimer(); 138 | var tt:uint = 0; 139 | do{ 140 | _steps++; 141 | try{ 142 | _step(this); 143 | } catch(e:Error){ 144 | throw new Error("Thread: There was a problem running the step function at step "+_step); 145 | } 146 | tt = getTimer()-st; 147 | }while(_step != null && tt < givenTime); 148 | _excuting = false; 149 | return tt; 150 | } 151 | /* 152 | * End excution 153 | * You need to call this when you no longer want to run the thread 154 | * This also cleans up it self so calling '.vars' OR '.step()' after ending will fail. 155 | */ 156 | public function end():void{ 157 | manual = true; 158 | vars = null; 159 | if(_step != null){ 160 | _step = null; 161 | if(!_weak){ 162 | var ind:int = _Threads.indexOf(this); 163 | if(ind>=0){ 164 | _Threads.splice(ind,1); 165 | } 166 | } 167 | } 168 | } 169 | public function get excuting():Boolean{ 170 | return _excuting; 171 | } 172 | // how many times it has called step() function 173 | public function get steps():uint{ 174 | return _steps; 175 | } 176 | // how many thread frames/steps it has passed 177 | public function get threadSteps():uint{ 178 | return _threadSteps; 179 | } 180 | public function get ended():Boolean{ 181 | return _step == null; 182 | } 183 | public function get weak():Boolean{ 184 | return _weak; 185 | } 186 | public function get maxTime():uint{ 187 | return _maxTime; 188 | } 189 | public function set maxTime(n:uint):void{ 190 | _maxTime = n<1?1:n; 191 | } 192 | // 193 | // Once set to manual, you have to call step() to excute manually 194 | public function set manual(b:Boolean):void{ 195 | if(b && _ticker){ 196 | _ticker.removeEventListener(Event.ENTER_FRAME, onTick); 197 | _ticker = null; 198 | }else if(!b && !_ticker){ 199 | _ticker = new Shape(); 200 | _ticker.addEventListener(Event.ENTER_FRAME, onTick, false, 0, true); 201 | } 202 | } 203 | public function get manual():Boolean{ 204 | return (_ticker==null); 205 | } 206 | 207 | 208 | private function onTick(e:Event):void{ 209 | step(); 210 | } 211 | } 212 | } 213 | -------------------------------------------------------------------------------- /AIR/src/com/luaye/utils/bitmapMovieClip/BitmapMovieClip.as: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Lu Aye Oo | www.luaye.com 3 | * 4 | * BitmapMovieClip. 5 | * 6 | * What is it?: 7 | * This class is essencially a Bitmap class that can hold sequence of BitmapData; 8 | * 9 | * Imagine you have a lot (say 100s) of non-interactive movieclip that have the same animation 10 | * (but not necerrially all show the same frame at the same time). 11 | * If you make new movieClips to accompany all clips it will be very slow to render the vectors 12 | * every frame... 13 | * with BitmapMovieClip, it caches all the frames in the movieclip in an array of BitmapData and 14 | * use the same bitmapData across all instances. Therefore it only need to store a sequence of 15 | * BitmapData for an animation and get reused. 16 | * 17 | * Advantages: 18 | * - Doesnt have to duplicate bitmaps for the number of movieclips you need. 19 | * - Very fast as it doesn't need to render vectors. 20 | * - It got most functionality (and more) of MovieClip, such as play()/stop()/gotoAndPlay() 21 | * - support labels 22 | * 23 | * When you shouldn't use: 24 | * - If your movieclip have simple vectors. There is no point to turn them into bitmapsData. 25 | * - If there is only 1 frame in movieclip, just use Bitmap class. 26 | * - Highly nested movieClips may not work as intended. 27 | * - Scaling will pixelate, you can pre scale before generating the clip tho. 28 | * 29 | * To be careful: 30 | * If you make changes to the bitmapData of a frame in the sequence, it will update in all clips. 31 | * 32 | * Example: 33 | import com.luaye.utils.bitmapMovieClip.*; 34 | 35 | var srcMC:MovieClip = new myClipFromLibrary(); 36 | 37 | var clipData:BitmapMovieClipData = BitmapMovieClip.generate(srcMC, 150, 150); 38 | 39 | var mc:BitmapMovieClip = new BitmapMovieClip(clipData); 40 | addChild(mc); 41 | 42 | mc = new BitmapMovieClip(clipData); 43 | mc.x = 150; 44 | mc.loop = true; 45 | addChild(mc); 46 | 47 | mc = new BitmapMovieClip(clipData); 48 | mc.x = 300; 49 | mc.play(3,10); 50 | addChild(mc); 51 | * 52 | */ 53 | 54 | package com.luaye.utils.bitmapMovieClip { 55 | import flash.geom.Rectangle; 56 | import flash.geom.Matrix; 57 | import flash.display.*; 58 | import flash.events.Event; 59 | 60 | public class BitmapMovieClip extends Bitmap { 61 | 62 | // If you want to know when movieclip reached end 63 | public static const ENDED:String = "reachedEnd"; 64 | 65 | private var _data:BitmapMovieClipData; 66 | private var _lastFrame:int = -1; 67 | private var _currentFrame:int = 0; 68 | private var _playing:Boolean = true; 69 | private var _manualUpdate:Boolean; 70 | 71 | // 72 | // 73 | // 74 | public var playingTo:int = 0; // playhead will stop on hitting this number, 0 = no stopping. 75 | public var useClone:Boolean; // if turned on, it will clone the BitmapData from original before updating 76 | public var loop:Boolean; // loop OR play once. 77 | 78 | 79 | // 80 | // This generates the BitmapMovieClipData required to run BitmapMovieClip 81 | // It captures all frames from the movieClip you pass in. 82 | // You may need to pass in matrix with x and y if your source clip's origin is not at the top left. 83 | // Similar to params from BitmapData.draw(); 84 | // 85 | public static function generate(mc:MovieClip, w:int = 0, h:int = 0, matrix:Matrix = null, clipRect:Rectangle = null):BitmapMovieClipData { 86 | if (w<=0) { 87 | w = mc.width; 88 | } 89 | if (h<=0) { 90 | h = mc.height; 91 | } 92 | var frames:Array = new Array(); 93 | var len:int = mc.totalFrames; 94 | for (var i:int = 0; i < len; i++) { 95 | var bmd:BitmapData = new BitmapData(w, h, true, 0); 96 | bmd.draw(mc, matrix, null, null, clipRect, true); 97 | frames.push(bmd); 98 | mc.nextFrame(); 99 | } 100 | var labels:Object = new Object(); 101 | var currentLabels:Array = mc.currentLabels; 102 | for each(var label:FrameLabel in currentLabels){ 103 | labels[label.name] = label.frame; 104 | } 105 | var data:BitmapMovieClipData = new BitmapMovieClipData(frames, labels); 106 | return data; 107 | } 108 | public function BitmapMovieClip(data:BitmapMovieClipData = null,clone:Boolean = false) { 109 | if (data) { 110 | setSource(data, clone); 111 | } else { 112 | _data = new BitmapMovieClipData([]); 113 | } 114 | } 115 | // 116 | // 117 | // Incase you want to change source BitmapMovieClipData on the fly. 118 | // 119 | public function setSource(data:BitmapMovieClipData,clone:Boolean = true):void { 120 | 121 | var frames:Array = data.frames; 122 | if (!frames || frames.length==0) { 123 | throw new Error("Requires an array of bitmaps to start BitmapMovieClip. Use BitmapMovieClip.generate(MovieClip) for ease of use."); 124 | } 125 | useClone = clone; 126 | _data = data; 127 | _lastFrame = -1; 128 | _currentFrame = _playing?-1:0; 129 | update(); 130 | if(_playing){ 131 | startUpdating(); 132 | } 133 | } 134 | public function getSource():BitmapMovieClipData { 135 | return _data; 136 | } 137 | public function get manualUpdate():Boolean{ 138 | return _manualUpdate; 139 | } 140 | // 141 | // If turned on, you need to call update() manually. 142 | // Which is useful for games and such where you need to sync frame rate. 143 | // 144 | public function set manualUpdate(b:Boolean):void{ 145 | if(_manualUpdate == b) return; 146 | _manualUpdate = b; 147 | if(b){ 148 | stopUpdating(); 149 | }else if(_playing){ 150 | startUpdating(); 151 | } 152 | } 153 | public function update(e:Event = null):void { 154 | if (_playing) { 155 | _currentFrame++; 156 | if (_currentFrame>=_data.frames.length) { 157 | if(loop){ 158 | _currentFrame = 0; 159 | }else{ 160 | _currentFrame--; 161 | dispatchEvent(new Event(ENDED)); 162 | stop(); 163 | return; 164 | } 165 | } 166 | } 167 | if (_currentFrame == (playingTo-1)) { 168 | _playing = false; 169 | playingTo = 0; 170 | stopUpdating(); 171 | } 172 | if (_lastFrame != _currentFrame) { 173 | if (useClone) { 174 | bitmapData = _data.frames[_currentFrame].clone(); 175 | } else { 176 | bitmapData = _data.frames[_currentFrame]; 177 | } 178 | _lastFrame = _currentFrame; 179 | } 180 | } 181 | private function startUpdating():void{ 182 | stopUpdating(); 183 | if(!_manualUpdate){ 184 | addEventListener(Event.ENTER_FRAME, update, false, 0 , true); 185 | } 186 | } 187 | private function stopUpdating():void{ 188 | removeEventListener(Event.ENTER_FRAME, update); 189 | } 190 | // label name or frame number 191 | public function play(frame:Object = 0, to:Object = 0):void { 192 | _playing = true; 193 | playingTo = getFrameFromLabel(to); 194 | var from:int = getFrameFromLabel(frame)-1; 195 | goto(from); 196 | startUpdating(); 197 | } 198 | // label name or frame number 199 | public function stop(frame:Object = 0):void { 200 | _playing = false; 201 | playingTo = 0; 202 | goto(getFrameFromLabel(frame)-1); 203 | stopUpdating(); 204 | update(); 205 | } 206 | public function get currentFrame():int { 207 | return _currentFrame - 1; 208 | } 209 | public function get totalFrames():int { 210 | return (_data&&_data.frames)?_data.frames.length:0; 211 | } 212 | public function get playing():Boolean { 213 | return _playing; 214 | } 215 | 216 | 217 | 218 | // 219 | private function goto(frame:int):void{ 220 | if (frame>=0) { 221 | var max:int = _data.frames.length-1; 222 | _currentFrame = frame>max?max:(frame<0?0:frame); 223 | } 224 | } 225 | // 226 | private function getFrameFromLabel(frame:Object = "0"):int{ 227 | var frameno:int = 0; 228 | if(isNaN(Number(frame))){ 229 | if(_data.labels[frame] != undefined){ 230 | frameno = _data.labels[frame]; 231 | } 232 | }else{ 233 | frameno = int(frame); 234 | } 235 | return frameno; 236 | } 237 | } 238 | } -------------------------------------------------------------------------------- /AIR/src/com/luaye/console/view/Ruler.as: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2008-2009 Lu Aye Oo 4 | * 5 | * @author Lu Aye Oo 6 | * 7 | * http://code.google.com/p/flash-console/ 8 | * 9 | * 10 | * This software is provided 'as-is', without any express or implied 11 | * warranty. In no event will the authors be held liable for any damages 12 | * arising from the use of this software. 13 | * Permission is granted to anyone to use this software for any purpose, 14 | * including commercial applications, and to alter it and redistribute it 15 | * freely, subject to the following restrictions: 16 | * 1. The origin of this software must not be misrepresented; you must not 17 | * claim that you wrote the original software. If you use this software 18 | * in a product, an acknowledgment in the product documentation would be 19 | * appreciated but is not required. 20 | * 2. Altered source versions must be plainly marked as such, and must not be 21 | * misrepresented as being the original software. 22 | * 3. This notice may not be removed or altered from any source distribution. 23 | * 24 | */ 25 | package com.luaye.console.view { 26 | import com.luaye.console.Console; 27 | import com.luaye.console.utils.Utils; 28 | 29 | import flash.display.BlendMode; 30 | import flash.display.Shape; 31 | import flash.display.Sprite; 32 | import flash.events.Event; 33 | import flash.events.MouseEvent; 34 | import flash.geom.Point; 35 | import flash.geom.Rectangle; 36 | import flash.text.TextField; 37 | import flash.text.TextFieldAutoSize; 38 | import flash.text.TextFormat; 39 | import flash.text.TextFormatAlign; 40 | import flash.ui.Mouse; 41 | 42 | public class Ruler extends Sprite{ 43 | public static const EXIT:String = "exit"; 44 | private static const POINTER_DISTANCE:int = 12; 45 | 46 | private var _master:Console; 47 | private var _area:Rectangle; 48 | private var _pointer:Shape; 49 | 50 | private var _posTxt:TextField; 51 | 52 | private var _points:Array; 53 | 54 | public function Ruler() { 55 | 56 | } 57 | public function start(console:Console):void{ 58 | _master = console; 59 | buttonMode = true; 60 | _points = new Array(); 61 | _pointer = new Shape(); 62 | addChild(_pointer); 63 | var p:Point = new Point(); 64 | p = globalToLocal(p); 65 | _area = new Rectangle(-stage.stageWidth*1.5+p.x, -stage.stageHeight*1.5+p.y, stage.stageWidth*3, stage.stageHeight*3); 66 | graphics.beginFill(0x000000, 0.1); 67 | graphics.drawRect(_area.x, _area.y, _area.width, _area.height); 68 | graphics.endFill(); 69 | // 70 | _posTxt = new TextField(); 71 | _posTxt.name = "positionText"; 72 | _posTxt.autoSize = TextFieldAutoSize.LEFT; 73 | _posTxt.background = true; 74 | _posTxt.backgroundColor = _master.style.panelBackgroundColor; 75 | _posTxt.styleSheet = console.style.css; 76 | _posTxt.mouseEnabled = false; 77 | addChild(_posTxt); 78 | // 79 | addEventListener(MouseEvent.CLICK, onMouseClick, false, 0, true); 80 | addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove, false, 0, true); 81 | onMouseMove(); 82 | if(_master.rulerHidesMouse) Mouse.hide(); 83 | _master.report("Ruler started. Click on two locations to measure.", -1); 84 | } 85 | private function onMouseMove(e:MouseEvent = null):void{ 86 | _pointer.graphics.clear(); 87 | _pointer.graphics.lineStyle(1, 0xAACC00, 1); 88 | _pointer.graphics.moveTo(_area.x, mouseY); 89 | _pointer.graphics.lineTo(_area.x+_area.width, mouseY); 90 | _pointer.graphics.moveTo(mouseX, _area.y); 91 | _pointer.graphics.lineTo(mouseX, _area.y+_area.height); 92 | _pointer.blendMode = BlendMode.INVERT; 93 | _posTxt.text = ""+mouseX+","+mouseY+""; 94 | // 95 | _posTxt.x = mouseX-_posTxt.width-POINTER_DISTANCE; 96 | _posTxt.y = mouseY-_posTxt.height-POINTER_DISTANCE; 97 | if(_posTxt.x < 0){ 98 | _posTxt.x = mouseX+POINTER_DISTANCE; 99 | } 100 | if(_posTxt.y < 0){ 101 | _posTxt.y = mouseY+POINTER_DISTANCE; 102 | } 103 | } 104 | private function onMouseClick(e:MouseEvent):void{ 105 | e.stopPropagation(); 106 | var p:Point; 107 | if(_points.length==0){ 108 | p = new Point(e.localX, e.localY); 109 | graphics.lineStyle(1, 0xFF0000); 110 | graphics.drawCircle(p.x, p.y, 3); 111 | _points.push(p); 112 | }else if(_points.length==1){ 113 | if(_master.rulerHidesMouse) Mouse.show(); 114 | removeChild(_pointer); 115 | removeChild(_posTxt); 116 | removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); 117 | p = _points[0]; 118 | var p2:Point = new Point(e.localX, e.localY); 119 | _points.push(p2); 120 | graphics.clear(); 121 | graphics.beginFill(0x000000, 0.4); 122 | graphics.drawRect(_area.x, _area.y, _area.width, _area.height); 123 | graphics.endFill(); 124 | graphics.lineStyle(1.5, 0xFF0000); 125 | graphics.drawCircle(p.x, p.y, 4); 126 | graphics.lineStyle(1.5, 0xFF9900); 127 | graphics.drawCircle(p2.x, p2.y, 4); 128 | var mp:Point = Point.interpolate(p, p2, 0.5); 129 | graphics.lineStyle(1, 0xAAAAAA); 130 | graphics.drawCircle(mp.x, mp.y, 4); 131 | // 132 | var xmin:Point = p; 133 | var xmax:Point = p2; 134 | if(p.x>p2.x){ 135 | xmin = p2; 136 | xmax = p; 137 | } 138 | var ymin:Point = p; 139 | var ymax:Point = p2; 140 | if(p.y>p2.y){ 141 | ymin = p2; 142 | ymax = p; 143 | } 144 | // 145 | var w:Number = xmax.x-xmin.x; 146 | var h:Number = ymax.y-ymin.y; 147 | var d:Number = Point.distance(p, p2); 148 | // 149 | var txt:TextField = makeTxtField(); 150 | txt.text = Utils.round(p.x,10)+","+ Utils.round(p.y,10); 151 | txt.x = p.x; 152 | txt.y = p.y-(ymin==p?14:0); 153 | addChild(txt); 154 | // 155 | txt = makeTxtField(); 156 | txt.text = Utils.round(p2.x,10)+","+ Utils.round(p2.y,10); 157 | txt.x = p2.x; 158 | txt.y = p2.y-(ymin==p2?14:0);; 159 | addChild(txt); 160 | // 161 | if(w>40 || h>25){ 162 | txt = makeTxtField(0x00AA00); 163 | txt.text = Utils.round(mp.x,10)+","+ Utils.round(mp.y,10); 164 | txt.x = mp.x; 165 | txt.y = mp.y; 166 | addChild(txt); 167 | /* 168 | txt = makeTxtField(0x00AA00, false); 169 | txt.text = xmin.x+","+ ymin.y; 170 | txt.x = xmin.x; 171 | txt.y = (xmin.y==ymin.y)?ymax.y:(ymin.y-14); 172 | addChild(txt); 173 | // 174 | txt = makeTxtField(0x00AA00, false); 175 | txt.text = xmax.x+","+ ymax.y; 176 | txt.x = xmax.x; 177 | txt.y = (xmax.y==ymax.y)?(ymin.y-14):ymax.y; 178 | addChild(txt); 179 | */ 180 | } 181 | // 182 | graphics.lineStyle(1, 0xAACC00, 0.5); 183 | graphics.moveTo(_area.x, ymin.y); 184 | graphics.lineTo(_area.x+_area.width, ymin.y); 185 | graphics.moveTo(_area.x, ymax.y); 186 | graphics.lineTo(_area.x+_area.width, ymax.y); 187 | graphics.moveTo(xmin.x, _area.y); 188 | graphics.lineTo(xmin.x, _area.y+_area.height); 189 | graphics.moveTo(xmax.x, _area.y); 190 | graphics.lineTo(xmax.x, _area.y+_area.height); 191 | // 192 | var a1:Number = Utils.round(Utils.angle(p,p2),100); 193 | var a2:Number = Utils.round(Utils.angle(p2,p),100); 194 | graphics.lineStyle(1, 0xAA0000, 0.8); 195 | Utils.drawCircleSegment(graphics, 10,p, a1, -90); 196 | graphics.lineStyle(1, 0xCC8800, 0.8); 197 | Utils.drawCircleSegment(graphics, 10,p2, a2, -90); 198 | // 199 | graphics.lineStyle(2, 0x00FF00, 0.7); 200 | graphics.moveTo(p.x, p.y); 201 | graphics.lineTo(p2.x, p2.y); 202 | // 203 | _master.report("Ruler results: (red) ["+p.x+","+p.y+"] to (orange) ["+p2.x+","+p2.y+"]", -2); 204 | _master.report("Distance: "+Utils.round(d,100) +"", -2); 205 | _master.report("Mid point: ["+mp.x+","+mp.y+"]", -2); 206 | _master.report("Width:"+w+", Height: "+h+"", -2); 207 | _master.report("Angle from first point (red): "+a1+"°", -2); 208 | _master.report("Angle from second point (orange): "+a2+"°", -2); 209 | }else{ 210 | exit(); 211 | } 212 | } 213 | public function exit():void{ 214 | _points = null; 215 | _master = null; 216 | dispatchEvent(new Event(EXIT)); 217 | } 218 | private function makeTxtField(col:Number = 0x00FF00, b:Boolean = true):TextField{ 219 | var format:TextFormat = new TextFormat("Arial", 11, col, b, true, null, null, TextFormatAlign.RIGHT); 220 | var txt:TextField = new TextField(); 221 | txt.autoSize = TextFieldAutoSize.RIGHT; 222 | txt.selectable = false; 223 | txt.defaultTextFormat = format; 224 | return txt; 225 | } 226 | } 227 | } -------------------------------------------------------------------------------- /AIR/src/com/doitflash/text/modules/MyMovieClip.as: -------------------------------------------------------------------------------- 1 | package com.doitflash.text.modules 2 | { 3 | import flash.display.Shape; 4 | import flash.display.MovieClip; 5 | 6 | /** 7 | * ... 8 | * 9 | * @author Hadi Tavakoli - 3/28/2011 3:21 PM 10 | */ 11 | public class MyMovieClip extends MovieClip 12 | { 13 | protected var _width:Number = 0; 14 | protected var _height:Number = 0; 15 | protected var _margin:Number = 0; 16 | protected var _marginX:Number = 0; 17 | protected var _marginY:Number = 0; 18 | 19 | protected var _embedFonts:Boolean; 20 | protected var _configXml:XML; 21 | protected var _xml:XML; 22 | protected var _data:Object = {}; 23 | protected var _id:int; 24 | 25 | protected var _base:Object; 26 | protected var _canvas:*; 27 | protected var _holder:Object; 28 | 29 | protected var _bg:Shape; 30 | protected var _bgColor:uint = 0x000000; 31 | protected var _bgAlpha:Number = 0; 32 | protected var _bgStrokeColor:uint = 0x990000; 33 | protected var _bgStrokeThickness:Number = 0; 34 | protected var _bgStrokeAlpha:Number = 0; 35 | protected var _bgTopLeftRadius:Number = 0; 36 | protected var _bgTopRightRadius:Number = 0; 37 | protected var _bgBottomLeftRadius:Number = 0; 38 | protected var _bgBottomRightRadius:Number = 0; 39 | 40 | protected var _serverPath:String = ""; 41 | protected var _flashVars:Object; 42 | 43 | private var _listenersArr:Array = []; 44 | 45 | public function MyMovieClip():void 46 | { 47 | 48 | } 49 | 50 | protected function onResize(e:*=null):void 51 | { 52 | if (_bg) drawBg(); 53 | } 54 | 55 | public function drawBg():void 56 | { 57 | if (!_bg) 58 | { 59 | _bg = new Shape(); 60 | this.addChildAt(_bg, 0); 61 | } 62 | 63 | _bg.graphics.clear(); 64 | _bg.graphics.beginFill(_bgColor, _bgAlpha); 65 | _bg.graphics.lineStyle(_bgStrokeThickness, _bgStrokeColor, _bgStrokeAlpha); 66 | _bg.graphics.drawRoundRectComplex(0, 0, _width, _height, _bgTopLeftRadius, _bgTopRightRadius, _bgBottomLeftRadius, _bgBottomRightRadius); 67 | _bg.graphics.endFill(); 68 | } 69 | 70 | protected function toBoolean(a:String):Boolean 71 | { 72 | if (a == "true") return true; 73 | 74 | return false; 75 | } 76 | 77 | protected function cleanUp($target:*, $freeMemory:Boolean = false):void 78 | { 79 | $target.graphics.clear(); 80 | 81 | for (var i:int = $target.numChildren-1; i >= 0; i--) 82 | { 83 | var child:* = $target.getChildAt(i); 84 | 85 | $target.removeChild(child); 86 | if ($freeMemory) child = null; 87 | } 88 | } 89 | 90 | public function clearEvents():void 91 | { 92 | if (!_listenersArr) return; 93 | 94 | for (var i:int = 0; i < _listenersArr.length; i++) 95 | { 96 | if (this.hasEventListener(_listenersArr[i].type)) 97 | { 98 | this.removeEventListener(_listenersArr[i].type, _listenersArr[i].listener); 99 | } 100 | } 101 | 102 | _listenersArr = null 103 | } 104 | 105 | override public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void 106 | { 107 | super.addEventListener(type, listener, useCapture, priority, useWeakReference); 108 | _listenersArr.push({type:type, listener:listener}); 109 | } 110 | 111 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 112 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Getter - Setter 113 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 114 | 115 | public function get base():Object 116 | { 117 | return _base; 118 | } 119 | 120 | public function set base(a:Object):void 121 | { 122 | _base = a; 123 | } 124 | 125 | public function get canvas():Object 126 | { 127 | return _canvas; 128 | } 129 | 130 | public function set canvas(a:Object):void 131 | { 132 | _canvas = a; 133 | } 134 | 135 | public function get holder():Object 136 | { 137 | return _holder; 138 | } 139 | 140 | public function set holder(a:Object):void 141 | { 142 | _holder = a; 143 | } 144 | 145 | override public function get width():Number 146 | { 147 | return _width; 148 | } 149 | 150 | override public function set width(a:Number):void 151 | { 152 | if (_width != a) 153 | { 154 | _width = a; 155 | onResize(); 156 | } 157 | } 158 | 159 | override public function get height():Number 160 | { 161 | return _height; 162 | } 163 | 164 | override public function set height(a:Number):void 165 | { 166 | if (_height != a) 167 | { 168 | _height = a; 169 | onResize(); 170 | } 171 | } 172 | 173 | public function get margin():Number 174 | { 175 | return _margin; 176 | } 177 | 178 | public function set margin(a:Number):void 179 | { 180 | _margin = a; 181 | } 182 | 183 | public function get marginX():Number 184 | { 185 | return _marginX; 186 | } 187 | 188 | public function set marginX(a:Number):void 189 | { 190 | _marginX = a; 191 | } 192 | 193 | public function get marginY():Number 194 | { 195 | return _marginY; 196 | } 197 | 198 | public function set marginY(a:Number):void 199 | { 200 | _marginY = a; 201 | } 202 | 203 | public function get embedFonts():Boolean 204 | { 205 | return _embedFonts; 206 | } 207 | 208 | public function set embedFonts(a:Boolean):void 209 | { 210 | _embedFonts = a; 211 | } 212 | 213 | public function get configXml():XML 214 | { 215 | return _configXml; 216 | } 217 | 218 | public function set configXml(a:XML):void 219 | { 220 | _configXml = a; 221 | } 222 | 223 | public function get xml():XML 224 | { 225 | return _xml; 226 | } 227 | 228 | public function set xml(a:XML):void 229 | { 230 | _xml = a; 231 | } 232 | 233 | public function get data():Object 234 | { 235 | return _data; 236 | } 237 | 238 | public function set data(a:Object):void 239 | { 240 | _data = a; 241 | } 242 | 243 | public function get id():int 244 | { 245 | return _id; 246 | } 247 | 248 | public function set id(a:int):void 249 | { 250 | _id = a; 251 | } 252 | 253 | public function get bgAlpha():Number 254 | { 255 | return _bgAlpha; 256 | } 257 | 258 | public function set bgAlpha(a:Number):void 259 | { 260 | _bgAlpha = a; 261 | } 262 | 263 | public function get bgStrokeAlpha():Number 264 | { 265 | return _bgStrokeAlpha; 266 | } 267 | 268 | public function set bgStrokeAlpha(a:Number):void 269 | { 270 | _bgStrokeAlpha = a; 271 | } 272 | 273 | public function get bgStrokeThickness():Number 274 | { 275 | return _bgStrokeThickness; 276 | } 277 | 278 | public function set bgStrokeThickness(a:Number):void 279 | { 280 | _bgStrokeThickness = a; 281 | } 282 | 283 | public function get bgColor():uint 284 | { 285 | return _bgColor; 286 | } 287 | 288 | public function set bgColor(a:uint):void 289 | { 290 | _bgColor = a; 291 | } 292 | 293 | public function get bgStrokeColor():uint 294 | { 295 | return _bgStrokeColor; 296 | } 297 | 298 | public function set bgStrokeColor(a:uint):void 299 | { 300 | _bgStrokeColor = a; 301 | } 302 | 303 | public function get bgTopLeftRadius():Number 304 | { 305 | return _bgTopLeftRadius; 306 | } 307 | 308 | public function set bgTopLeftRadius(a:Number):void 309 | { 310 | _bgTopLeftRadius = a; 311 | } 312 | 313 | public function get bgTopRightRadius():Number 314 | { 315 | return _bgTopRightRadius; 316 | } 317 | 318 | public function set bgTopRightRadius(a:Number):void 319 | { 320 | _bgTopRightRadius = a; 321 | } 322 | 323 | public function get bgBottomLeftRadius():Number 324 | { 325 | return _bgBottomLeftRadius; 326 | } 327 | 328 | public function set bgBottomLeftRadius(a:Number):void 329 | { 330 | _bgBottomLeftRadius = a; 331 | } 332 | 333 | public function get bgBottomRightRadius():Number 334 | { 335 | return _bgBottomRightRadius; 336 | } 337 | 338 | public function set bgBottomRightRadius(a:Number):void 339 | { 340 | _bgBottomRightRadius = a; 341 | } 342 | 343 | public function get serverPath():String 344 | { 345 | return _serverPath; 346 | } 347 | 348 | public function set serverPath(a:String):void 349 | { 350 | _serverPath = a; 351 | } 352 | 353 | public function get flashVars():Object 354 | { 355 | return _flashVars; 356 | } 357 | 358 | public function set flashVars(a:Object):void 359 | { 360 | _flashVars = a; 361 | } 362 | } 363 | 364 | } -------------------------------------------------------------------------------- /AIR/src/com/doitflash/text/modules/MySprite.as: -------------------------------------------------------------------------------- 1 | package com.doitflash.text.modules 2 | { 3 | import flash.display.Shape; 4 | import flash.display.Sprite; 5 | 6 | /** 7 | * ... 8 | * 9 | * @author Hadi Tavakoli - 3/28/2011 3:21 PM 10 | */ 11 | public class MySprite extends Sprite 12 | { 13 | protected var _width:Number = 0; 14 | protected var _height:Number = 0; 15 | protected var _margin:Number = 0; 16 | protected var _marginX:Number = 0; 17 | protected var _marginY:Number = 0; 18 | 19 | protected var _embedFonts:Boolean; 20 | protected var _configXml:XML; 21 | protected var _xml:XML; 22 | protected var _data:Object = {}; 23 | protected var _id:int; 24 | 25 | protected var _base:Object; 26 | protected var _canvas:*; 27 | protected var _holder:Object; 28 | 29 | protected var _bg:Shape; 30 | protected var _bgColor:uint = 0x000000; 31 | protected var _bgAlpha:Number = 0; 32 | protected var _bgStrokeColor:uint = 0x990000; 33 | protected var _bgStrokeThickness:Number = 0; 34 | protected var _bgStrokeAlpha:Number = 0; 35 | protected var _bgTopLeftRadius:Number = 0; 36 | protected var _bgTopRightRadius:Number = 0; 37 | protected var _bgBottomLeftRadius:Number = 0; 38 | protected var _bgBottomRightRadius:Number = 0; 39 | 40 | protected var _serverPath:String = ""; 41 | protected var _flashVars:Object; 42 | 43 | private var _listenersArr:Array = []; 44 | 45 | public function MySprite():void 46 | { 47 | 48 | } 49 | 50 | protected function onResize(e:*=null):void 51 | { 52 | if (_bg) drawBg(); 53 | } 54 | 55 | public function drawBg():void 56 | { 57 | if (!_bg) 58 | { 59 | _bg = new Shape(); 60 | this.addChildAt(_bg, 0); 61 | } 62 | 63 | _bg.graphics.clear(); 64 | _bg.graphics.beginFill(_bgColor, _bgAlpha); 65 | _bg.graphics.lineStyle(_bgStrokeThickness, _bgStrokeColor, _bgStrokeAlpha, true); 66 | _bg.graphics.drawRoundRectComplex(0, 0, _width, _height, _bgTopLeftRadius, _bgTopRightRadius, _bgBottomLeftRadius, _bgBottomRightRadius); 67 | _bg.graphics.endFill(); 68 | } 69 | 70 | protected function toBoolean(a:String):Boolean 71 | { 72 | if (a == "true") return true; 73 | 74 | return false; 75 | } 76 | 77 | protected function cleanUp($target:*, $freeMemory:Boolean = false):void 78 | { 79 | $target.graphics.clear(); 80 | 81 | for (var i:int = $target.numChildren-1; i >= 0; i--) 82 | { 83 | var child:* = $target.getChildAt(i); 84 | 85 | $target.removeChild(child); 86 | if ($freeMemory) child = null; 87 | } 88 | } 89 | 90 | public function clearEvents():void 91 | { 92 | if (!_listenersArr) return; 93 | 94 | for (var i:int = 0; i < _listenersArr.length; i++) 95 | { 96 | if (this.hasEventListener(_listenersArr[i].type)) 97 | { 98 | this.removeEventListener(_listenersArr[i].type, _listenersArr[i].listener); 99 | } 100 | } 101 | 102 | _listenersArr = null 103 | } 104 | 105 | override public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void 106 | { 107 | super.addEventListener(type, listener, useCapture, priority, useWeakReference); 108 | _listenersArr.push({type:type, listener:listener}); 109 | } 110 | 111 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 112 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Getter - Setter 113 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 114 | 115 | public function get base():Object 116 | { 117 | return _base; 118 | } 119 | 120 | public function set base(a:Object):void 121 | { 122 | _base = a; 123 | } 124 | 125 | public function get canvas():Object 126 | { 127 | return _canvas; 128 | } 129 | 130 | public function set canvas(a:Object):void 131 | { 132 | _canvas = a; 133 | } 134 | 135 | public function get holder():Object 136 | { 137 | return _holder; 138 | } 139 | 140 | public function set holder(a:Object):void 141 | { 142 | _holder = a; 143 | } 144 | 145 | override public function get width():Number 146 | { 147 | return _width; 148 | } 149 | 150 | override public function set width(a:Number):void 151 | { 152 | if (_width != a) 153 | { 154 | _width = a; 155 | onResize(); 156 | } 157 | } 158 | 159 | override public function get height():Number 160 | { 161 | return _height; 162 | } 163 | 164 | override public function set height(a:Number):void 165 | { 166 | if (_height != a) 167 | { 168 | _height = a; 169 | onResize(); 170 | } 171 | } 172 | 173 | public function get margin():Number 174 | { 175 | return _margin; 176 | } 177 | 178 | public function set margin(a:Number):void 179 | { 180 | _margin = a; 181 | } 182 | 183 | public function get marginX():Number 184 | { 185 | return _marginX; 186 | } 187 | 188 | public function set marginX(a:Number):void 189 | { 190 | _marginX = a; 191 | } 192 | 193 | public function get marginY():Number 194 | { 195 | return _marginY; 196 | } 197 | 198 | public function set marginY(a:Number):void 199 | { 200 | _marginY = a; 201 | } 202 | 203 | public function get embedFonts():Boolean 204 | { 205 | return _embedFonts; 206 | } 207 | 208 | public function set embedFonts(a:Boolean):void 209 | { 210 | _embedFonts = a; 211 | } 212 | 213 | public function get configXml():XML 214 | { 215 | return _configXml; 216 | } 217 | 218 | public function set configXml(a:XML):void 219 | { 220 | _configXml = a; 221 | } 222 | 223 | public function get xml():XML 224 | { 225 | return _xml; 226 | } 227 | 228 | public function set xml(a:XML):void 229 | { 230 | _xml = a; 231 | } 232 | 233 | public function get data():Object 234 | { 235 | return _data; 236 | } 237 | 238 | public function set data(a:Object):void 239 | { 240 | _data = a; 241 | } 242 | 243 | public function get id():int 244 | { 245 | return _id; 246 | } 247 | 248 | public function set id(a:int):void 249 | { 250 | _id = a; 251 | } 252 | 253 | public function get bgAlpha():Number 254 | { 255 | return _bgAlpha; 256 | } 257 | 258 | public function set bgAlpha(a:Number):void 259 | { 260 | _bgAlpha = a; 261 | } 262 | 263 | public function get bgStrokeAlpha():Number 264 | { 265 | return _bgStrokeAlpha; 266 | } 267 | 268 | public function set bgStrokeAlpha(a:Number):void 269 | { 270 | _bgStrokeAlpha = a; 271 | } 272 | 273 | public function get bgStrokeThickness():Number 274 | { 275 | return _bgStrokeThickness; 276 | } 277 | 278 | public function set bgStrokeThickness(a:Number):void 279 | { 280 | _bgStrokeThickness = a; 281 | } 282 | 283 | public function get bgColor():uint 284 | { 285 | return _bgColor; 286 | } 287 | 288 | public function set bgColor(a:uint):void 289 | { 290 | _bgColor = a; 291 | } 292 | 293 | public function get bgStrokeColor():uint 294 | { 295 | return _bgStrokeColor; 296 | } 297 | 298 | public function set bgStrokeColor(a:uint):void 299 | { 300 | _bgStrokeColor = a; 301 | } 302 | 303 | public function get bgTopLeftRadius():Number 304 | { 305 | return _bgTopLeftRadius; 306 | } 307 | 308 | public function set bgTopLeftRadius(a:Number):void 309 | { 310 | _bgTopLeftRadius = a; 311 | } 312 | 313 | public function get bgTopRightRadius():Number 314 | { 315 | return _bgTopRightRadius; 316 | } 317 | 318 | public function set bgTopRightRadius(a:Number):void 319 | { 320 | _bgTopRightRadius = a; 321 | } 322 | 323 | public function get bgBottomLeftRadius():Number 324 | { 325 | return _bgBottomLeftRadius; 326 | } 327 | 328 | public function set bgBottomLeftRadius(a:Number):void 329 | { 330 | _bgBottomLeftRadius = a; 331 | } 332 | 333 | public function get bgBottomRightRadius():Number 334 | { 335 | return _bgBottomRightRadius; 336 | } 337 | 338 | public function set bgBottomRightRadius(a:Number):void 339 | { 340 | _bgBottomRightRadius = a; 341 | } 342 | 343 | public function get serverPath():String 344 | { 345 | return _serverPath; 346 | } 347 | 348 | public function set serverPath(a:String):void 349 | { 350 | _serverPath = a; 351 | } 352 | 353 | public function get flashVars():Object 354 | { 355 | return _flashVars; 356 | } 357 | 358 | public function set flashVars(a:Object):void 359 | { 360 | _flashVars = a; 361 | } 362 | } 363 | 364 | } -------------------------------------------------------------------------------- /AIR/src/com/luaye/console/core/Remoting.as: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2008-2009 Lu Aye Oo 4 | * 5 | * @author Lu Aye Oo 6 | * 7 | * http://code.google.com/p/flash-console/ 8 | * 9 | * 10 | * This software is provided 'as-is', without any express or implied 11 | * warranty. In no event will the authors be held liable for any damages 12 | * arising from the use of this software. 13 | * Permission is granted to anyone to use this software for any purpose, 14 | * including commercial applications, and to alter it and redistribute it 15 | * freely, subject to the following restrictions: 16 | * 1. The origin of this software must not be misrepresented; you must not 17 | * claim that you wrote the original software. If you use this software 18 | * in a product, an acknowledgment in the product documentation would be 19 | * appreciated but is not required. 20 | * 2. Altered source versions must be plainly marked as such, and must not be 21 | * misrepresented as being the original software. 22 | * 3. This notice may not be removed or altered from any source distribution. 23 | * 24 | */ 25 | package com.luaye.console.core { 26 | import com.luaye.console.Console; 27 | 28 | import flash.events.EventDispatcher; 29 | import flash.events.SecurityErrorEvent; 30 | import flash.events.StatusEvent; 31 | import flash.net.LocalConnection; 32 | import flash.system.Security; 33 | 34 | public class Remoting extends EventDispatcher{ 35 | 36 | public static const REMOTE_PREFIX:String = "R"; 37 | public static const CLIENT_PREFIX:String = "C"; 38 | 39 | private var _master:Console; 40 | private var _logsend:Function; 41 | private var _isRemoting:Boolean; 42 | private var _isRemote:Boolean; 43 | private var _sharedConnection:LocalConnection; 44 | private var _remoteLinesQueue:Array; 45 | private var _mspfsForRemote:Array; 46 | private var _remoteDelayed:int; 47 | 48 | private var _lastLogin:String = ""; 49 | private var _loggedIn:Boolean; 50 | 51 | public var remoteMem:int; 52 | 53 | public function Remoting(m:Console, logsend:Function) { 54 | _master = m; 55 | _logsend = logsend; 56 | } 57 | public function addLineQueue(line:Log):void{ 58 | if(!_loggedIn) return; 59 | _remoteLinesQueue.push(line.toObject()); 60 | var maxlines:int = _master.maxLines; 61 | if(_remoteLinesQueue.length > maxlines && maxlines > 0 ){ 62 | _remoteLinesQueue.splice(0,1); 63 | } 64 | } 65 | public function update(mspf:Number, sFR:Number = NaN):void{ 66 | _remoteDelayed++; 67 | if(!_loggedIn) return; 68 | _mspfsForRemote.push(mspf); 69 | if(sFR){ 70 | // this is to try add the frames that have been lagged 71 | var frames:int = Math.floor(mspf/(1000/sFR)); 72 | if(frames>Console.FPS_MAX_LAG_FRAMES) frames = Console.FPS_MAX_LAG_FRAMES; 73 | while(frames>1){ 74 | _mspfsForRemote.push(mspf); 75 | frames--; 76 | } 77 | } 78 | if(_remoteDelayed >= _master.remoteDelay){ 79 | _remoteDelayed = 0; 80 | var newQueue:Array = new Array(); 81 | // don't send too many lines at once cause there is 50kb limit with LocalConnection.send 82 | // Buffer it... 83 | if(_remoteLinesQueue.length > 20){ 84 | newQueue = _remoteLinesQueue.splice(20); 85 | // to force update next farme 86 | _remoteDelayed = _master.remoteDelay; 87 | } 88 | send("logSend", [_remoteLinesQueue, _mspfsForRemote, _master.currentMemory, _master.cl.scopeString]); 89 | _remoteLinesQueue = newQueue; 90 | _mspfsForRemote = [sFR?sFR:30]; 91 | } 92 | } 93 | public function send(command:String, ...args):void{ 94 | var target:String = Console.REMOTING_CONN_NAME+(_isRemote?CLIENT_PREFIX:REMOTE_PREFIX); 95 | args = [target, command].concat(args); 96 | try{ 97 | _sharedConnection.send.apply(this, args); 98 | }catch(e:Error){ 99 | // don't care 100 | } 101 | } 102 | public function get remoting():Boolean{ 103 | return _isRemoting; 104 | } 105 | public function set remoting(newV:Boolean):void{ 106 | _remoteLinesQueue = null; 107 | _mspfsForRemote = null; 108 | if(newV){ 109 | _isRemote = false; 110 | _remoteDelayed = 0; 111 | _mspfsForRemote = [30]; 112 | _remoteLinesQueue = new Array(); 113 | startSharedConnection(); 114 | _sharedConnection.addEventListener(StatusEvent.STATUS, onRemotingStatus); 115 | _sharedConnection.addEventListener(SecurityErrorEvent.SECURITY_ERROR , onRemotingSecurityError); 116 | try{ 117 | _sharedConnection.connect(Console.REMOTING_CONN_NAME+CLIENT_PREFIX); 118 | _master.report("Remoting started. "+getInfo(),-1); 119 | _isRemoting = true; 120 | _loggedIn = _master.checkLogin(""); 121 | if(_loggedIn){ 122 | _remoteLinesQueue = _master.getLogsAsObjects(); 123 | send("loginSuccess"); 124 | }else{ 125 | send("requestLogin"); 126 | } 127 | }catch (error:Error){ 128 | _master.report("Could not create client service. You will not be able to control this console with remote.", 10); 129 | } 130 | }else{ 131 | _isRemoting = false; 132 | close(); 133 | } 134 | } 135 | private function onRemotingStatus(e:StatusEvent):void{ 136 | // this will get called quite often... 137 | } 138 | private function onRemotingSecurityError(e:SecurityErrorEvent):void{ 139 | _master.report("Sandbox security error.", 10); 140 | printHowToGlobalSetting(); 141 | } 142 | public function get isRemote():Boolean{ 143 | return _isRemote; 144 | } 145 | public function set isRemote(newV:Boolean):void{ 146 | _isRemote = newV ; 147 | if(newV){ 148 | _isRemoting = false; 149 | startSharedConnection(); 150 | _sharedConnection.addEventListener(StatusEvent.STATUS, onRemoteStatus); 151 | _sharedConnection.addEventListener(SecurityErrorEvent.SECURITY_ERROR , onRemotingSecurityError); 152 | try{ 153 | _sharedConnection.connect(Console.REMOTING_CONN_NAME+REMOTE_PREFIX); 154 | _master.report("Remote started. "+getInfo(),-1); 155 | var sdt:String = Security.sandboxType; 156 | if(sdt == Security.LOCAL_WITH_FILE || sdt == Security.LOCAL_WITH_NETWORK){ 157 | _master.report("Untrusted local sandbox. You may not be able to listen for logs properly.", 10); 158 | printHowToGlobalSetting(); 159 | } 160 | login(_lastLogin); 161 | }catch (error:Error){ 162 | _isRemoting = false; 163 | _master.report("Could not create remote service. You might have a console remote already running.", 10); 164 | } 165 | }else{ 166 | close(); 167 | } 168 | } 169 | private function onRemoteStatus(e:StatusEvent):void{ 170 | if(_isRemote && e.level=="error"){ 171 | _master.report("Problem communicating to client.", 10); 172 | } 173 | } 174 | private function getInfo():String{ 175 | return "channel:"+Console.REMOTING_CONN_NAME+" ("+Security.sandboxType+")"; 176 | } 177 | private function printHowToGlobalSetting():void{ 178 | _master.report("Make sure your flash file is 'trusted' in Global Security Settings.", -2); 179 | _master.report("Go to Settings Manager [click here] > 'Global Security Settings Panel' (on left) > add the location of the local flash (swf) file.", -2); 180 | } 181 | private function startSharedConnection():void{ 182 | close(); 183 | _sharedConnection = new LocalConnection(); 184 | _sharedConnection.allowDomain("*"); 185 | _sharedConnection.allowInsecureDomain("*"); 186 | // just for sort of security 187 | _sharedConnection.client = { 188 | login:login, requestLogin:requestLogin, loginFail:loginFail, loginSuccess:loginSuccess, 189 | logSend:_logsend, gc:_master.gc, runCommand:_master.runCommand 190 | }; 191 | } 192 | public function loginFail():void{ 193 | _master.report("Login Failed", 10); 194 | _master.panels.mainPanel.requestLogin(); 195 | } 196 | public function loginSuccess():void{ 197 | _master.report("Login Successful", -1); 198 | } 199 | public function requestLogin():void{ 200 | if(_lastLogin){ 201 | login(_lastLogin); 202 | }else{ 203 | _master.panels.mainPanel.requestLogin(); 204 | } 205 | } 206 | public function login(pass:String = null):void{ 207 | if(_isRemote){ 208 | _lastLogin = pass; 209 | _master.report("Attempting to login...", -1); 210 | send("login", pass); 211 | }else{ 212 | // once logged in, next login attempts will always be success 213 | if(_loggedIn || _master.checkLogin(pass)){ 214 | _loggedIn = true; 215 | _remoteLinesQueue = _master.getLogsAsObjects(); 216 | send("loginSuccess"); 217 | }else{ 218 | send("loginFail"); 219 | } 220 | } 221 | } 222 | public function close():void{ 223 | if(_sharedConnection){ 224 | try{ 225 | _sharedConnection.close(); 226 | }catch(error:Error){ 227 | _master.report("Remote.close: "+error, 10); 228 | } 229 | } 230 | _sharedConnection = null; 231 | } 232 | } 233 | } -------------------------------------------------------------------------------- /AIR/src/com/doitflash/text/modules/TextModule.as: -------------------------------------------------------------------------------- 1 | package com.doitflash.text.modules 2 | { 3 | import flash.geom.Point; 4 | import flash.display.Loader; 5 | import flash.display.LoaderInfo; 6 | import flash.display.Sprite; 7 | import flash.events.Event; 8 | import flash.utils.Timer; 9 | import flash.utils.setTimeout; 10 | import flash.events.TimerEvent; 11 | import flash.system.LoaderContext; 12 | import flash.system.Security; 13 | import flash.system.SecurityDomain; 14 | 15 | import com.doitflash.text.modules.MySprite; 16 | 17 | //import com.luaye.console.C; 18 | 19 | /** 20 | * ... 21 | * 22 | * Copyright 2011, DoItFlash. All rights reserved. This work is subject to the terms and software agreements in http://www.doitflash.com/. 23 | * 24 | * @author Hadi Tavakoli - 9/12/2010 2:38 PM 25 | */ 26 | public class TextModule extends MySprite 27 | { 28 | protected var _paramList:Object; // holds flashVars 29 | protected var _moduleId:String = ""; 30 | protected var _tagName:String = ""; 31 | protected var _assetsPath:String; 32 | protected var _swfPath:String; 33 | 34 | protected var _tooltip:Object; 35 | 36 | protected var _textArea:*; // a reference to the TextArea which has loaded this module 37 | protected var _loader:Loader; // a reference to the Loader which has loaded this module (adobe is scaling this Loader automatically!) 38 | 39 | private var _contentTimer:Timer; 40 | 41 | public function TextModule():void 42 | { 43 | _width = 100; 44 | _height = 100; 45 | 46 | this.addEventListener(Event.ADDED_TO_STAGE, stageAdded); 47 | 48 | // save flashVars 49 | _paramList = this.root.loaderInfo.parameters; 50 | 51 | this._xml = new XML(restorCDATA(unescape(decodeURIComponent(_paramList.config)))); 52 | this._serverPath = _paramList.serverPath; 53 | 54 | _assetsPath = _paramList.assetsPath; 55 | _swfPath = _paramList.swfPath; 56 | _moduleId = this._xml.@id; 57 | _tagName = this._xml.name(); 58 | } 59 | 60 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 61 | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Private Functions 62 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 63 | 64 | private function stageAdded(e:Event = null):void 65 | { 66 | this.removeEventListener(Event.ADDED_TO_STAGE, stageAdded); 67 | 68 | _loader = this.parent as Loader; 69 | 70 | /*var loaderInfo:LoaderInfo = _loader.contentLoaderInfo; 71 | setTimeout(tt, 500); 72 | 73 | function tt():void 74 | { 75 | 76 | for (var name:String in loaderInfo.parameters) 77 | { 78 | C.log(name + " = " + loaderInfo.parameters[name]) 79 | } 80 | }*/ 81 | 82 | /*_textArea = _loader.parent as Object; 83 | _embedFonts = _textArea.embedFonts; 84 | 85 | // connect to the tooltip 86 | //_tooltip = this.stage.getChildByName("myTooltip"); 87 | 88 | // save data from the TextArea 89 | if (_textArea.base) _base = _textArea.base; 90 | else _base = _textArea.holder; 91 | 92 | _holder = _textArea.holder; 93 | 94 | _contentTimer = new Timer(50); 95 | _contentTimer.addEventListener(TimerEvent.TIMER, checkContent); 96 | _contentTimer.start();*/ 97 | } 98 | 99 | public function construct($textArea:*):void 100 | { 101 | _textArea = $textArea; 102 | _embedFonts = _textArea.embedFonts; 103 | 104 | // connect to the tooltip 105 | //_tooltip = this.stage.getChildByName("myTooltip"); 106 | 107 | // save data from the TextArea 108 | if (_textArea.base) _base = _textArea.base; 109 | else _base = _textArea.holder; 110 | 111 | _holder = _textArea.holder; 112 | 113 | _contentTimer = new Timer(50); 114 | _contentTimer.addEventListener(TimerEvent.TIMER, checkContent); 115 | _contentTimer.start(); 116 | } 117 | 118 | private function checkContent(e:TimerEvent=null):void 119 | { 120 | if (_loader.width && _loader.height && _loader.width > 0, _loader.height > 0) 121 | { 122 | // stop the timer 123 | _contentTimer.stop(); 124 | _contentTimer.removeEventListener(TimerEvent.TIMER, checkContent); 125 | 126 | // save the width and height of the module based on the user input 127 | _width = this.root.loaderInfo.width * _loader.scaleX; 128 | _height = this.root.loaderInfo.height * _loader.scaleY; 129 | 130 | drawBg(); // draw the final background for the module 131 | 132 | // Adobe scales the module and we need to stop that! 133 | _loader.scaleX = 1; 134 | _loader.scaleY = 1; 135 | 136 | init(); 137 | 138 | // let TextArea know that this module is loaded and added to stage 139 | _textArea.onModuleLoaded(this); 140 | } 141 | } 142 | 143 | protected function init():void { } 144 | 145 | protected function restorCDATA($str:String):String 146 | { 147 | while ($str.indexOf("@![CDATA[") > -1) 148 | { 149 | $str = $str.replace("@![CDATA[", ""); 151 | } 152 | 153 | return $str; 154 | } 155 | 156 | protected function convertXmlToObject($config:XML):Object 157 | { 158 | var param:String; 159 | var value:String; 160 | var configVars:Object = { }; 161 | 162 | for (var i:int = 0; i < $config..@*.length(); i++) 163 | { 164 | param = $config..@ * [i].name(); 165 | value = $config..@ * [i]; 166 | 167 | configVars[param] = value; 168 | } 169 | 170 | for (var j:int = 0; j < $config.children().length(); j++) 171 | { 172 | var currNode:XML = new XML($config.children()[j]); 173 | 174 | for (var k:int = 0; k < currNode.children().length(); k++) 175 | { 176 | var currAttribute:XML = new XML(currNode.children()[k]); 177 | 178 | param = currAttribute.name(); 179 | value = currAttribute.text(); 180 | 181 | configVars[param] = value; 182 | } 183 | } 184 | 185 | return configVars; 186 | } 187 | 188 | protected function domainLock($Array:Array):Boolean 189 | { 190 | var domainLock:Boolean = true; 191 | 192 | var urlStart:int = root.loaderInfo.loaderURL.indexOf("://")+3; 193 | var urlEnd:int = root.loaderInfo.loaderURL.indexOf("/", urlStart); 194 | var domain:String = root.loaderInfo.loaderURL.substring(urlStart, urlEnd); 195 | var LastDot:int = domain.lastIndexOf(".")-1; 196 | var domEnd:int = domain.lastIndexOf(".", LastDot)+1; 197 | domain = domain.substring(domEnd, domain.length); 198 | 199 | for (var i:int = 0; i < $Array.length; i++) 200 | { 201 | if (domain == $Array[i]) 202 | { 203 | domainLock = false; 204 | break; 205 | } 206 | } 207 | 208 | if ($Array.length == 0) domainLock = false; // if the user didn't write any domain name, execute the movie freely 209 | if (domain == "") domainLock = false; // if the user is executing the movie from his/her computer offline 210 | if (domainLock) throw new Error("The movie can not be executed on this domain"); 211 | 212 | return domainLock; 213 | } 214 | 215 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 216 | //////////////////////////////////////////////////////////////////////////////////////////////////////////////// Helpful Private Functions 217 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 218 | 219 | 220 | 221 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 222 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Methods 223 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 224 | 225 | public function getLocation():Point 226 | { 227 | return new Point(_loader.x, _loader.y) 228 | } 229 | 230 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 231 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Getter - Setter 232 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 233 | 234 | public function get moduleId():String 235 | { 236 | return _moduleId; 237 | } 238 | 239 | public function get tagName():String 240 | { 241 | return _tagName; 242 | } 243 | 244 | } 245 | 246 | } -------------------------------------------------------------------------------- /AIR/src/com/luaye/console/view/PanelsManager.as: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2008-2009 Lu Aye Oo 4 | * 5 | * @author Lu Aye Oo 6 | * 7 | * http://code.google.com/p/flash-console/ 8 | * 9 | * 10 | * This software is provided 'as-is', without any express or implied 11 | * warranty. In no event will the authors be held liable for any damages 12 | * arising from the use of this software. 13 | * Permission is granted to anyone to use this software for any purpose, 14 | * including commercial applications, and to alter it and redistribute it 15 | * freely, subject to the following restrictions: 16 | * 1. The origin of this software must not be misrepresented; you must not 17 | * claim that you wrote the original software. If you use this software 18 | * in a product, an acknowledgment in the product documentation would be 19 | * appreciated but is not required. 20 | * 2. Altered source versions must be plainly marked as such, and must not be 21 | * misrepresented as being the original software. 22 | * 3. This notice may not be removed or altered from any source distribution. 23 | * 24 | */ 25 | package com.luaye.console.view { 26 | import com.luaye.console.Console; 27 | 28 | import flash.events.Event; 29 | import flash.geom.Rectangle; 30 | import flash.text.TextField; 31 | import flash.text.TextFieldAutoSize; 32 | 33 | public class PanelsManager{ 34 | 35 | 36 | private static const USER_GRAPH_PREFIX:String = "graph_"; 37 | 38 | private var _master:Console; 39 | private var _mainPanel:MainPanel; 40 | private var _ruler:Ruler; 41 | 42 | private var _tooltipField:TextField; 43 | 44 | public function PanelsManager(master:Console, mp:MainPanel) { 45 | _master = master; 46 | _tooltipField = new TextField(); 47 | _tooltipField.autoSize = TextFieldAutoSize.CENTER; 48 | _tooltipField.multiline = true; 49 | _tooltipField.background = true; 50 | _tooltipField.backgroundColor = _master.style.panelBackgroundColor; 51 | _tooltipField.styleSheet = _master.style.css; 52 | _tooltipField.mouseEnabled = false; 53 | _mainPanel = mp; 54 | addPanel(_mainPanel); 55 | } 56 | public function addPanel(panel:AbstractPanel):void{ 57 | if(_master.contains(_tooltipField)){ 58 | _master.addChildAt(panel, _master.getChildIndex(_tooltipField)); 59 | }else{ 60 | _master.addChild(panel); 61 | } 62 | panel.addEventListener(AbstractPanel.STARTED_DRAGGING, onPanelStartDragScale, false,0, true); 63 | panel.addEventListener(AbstractPanel.STARTED_SCALING, onPanelStartDragScale, false,0, true); 64 | } 65 | public function removePanel(n:String):void{ 66 | var panel:AbstractPanel = _master.getChildByName(n) as AbstractPanel; 67 | if(panel){ 68 | // this removes it self from parent. this way each individual panel can clean up before closing. 69 | panel.close(); 70 | } 71 | } 72 | public function getPanel(n:String):AbstractPanel{ 73 | return _master.getChildByName(n) as AbstractPanel; 74 | } 75 | public function get mainPanel():MainPanel{ 76 | return _mainPanel; 77 | } 78 | public function panelExists(n:String):Boolean{ 79 | return (_master.getChildByName(n) as AbstractPanel)?true:false; 80 | } 81 | public function setPanelArea(panelname:String, rect:Rectangle):void{ 82 | var panel:AbstractPanel = getPanel(panelname); 83 | if(panel){ 84 | if(rect.x) panel.x = rect.x; 85 | if(rect.y) panel.y = rect.y; 86 | if(rect.width) panel.width = rect.width; 87 | if(rect.height) panel.height = rect.height; 88 | } 89 | } 90 | // 91 | // 92 | // 93 | public function get channelsPanel():Boolean{ 94 | return (getPanel(Console.PANEL_CHANNELS) as ChannelsPanel)?true:false; 95 | } 96 | public function set channelsPanel(b:Boolean):void{ 97 | if(channelsPanel != b){ 98 | if(b){ 99 | var chpanel:ChannelsPanel = new ChannelsPanel(_master); 100 | chpanel.x = _mainPanel.x+_mainPanel.width-332; 101 | chpanel.y = _mainPanel.y-2; 102 | addPanel(chpanel); 103 | }else { 104 | removePanel(Console.PANEL_CHANNELS); 105 | updateMenu(); 106 | } 107 | } 108 | } 109 | public function updateMenu():void{ 110 | _mainPanel.updateMenu(); 111 | var chpanel:ChannelsPanel = getPanel(Console.PANEL_CHANNELS) as ChannelsPanel; 112 | if(chpanel){ 113 | chpanel.update(); 114 | } 115 | } 116 | // 117 | // 118 | // 119 | public function get displayRoller():Boolean{ 120 | return (getPanel(Console.PANEL_ROLLER) as RollerPanel)?true:false; 121 | } 122 | public function set displayRoller(n:Boolean):void{ 123 | if(displayRoller != n){ 124 | if(n){ 125 | var roller:RollerPanel = new RollerPanel(_master); 126 | roller.x = _mainPanel.x+_mainPanel.width-160; 127 | roller.y = _mainPanel.y+55; 128 | addPanel(roller); 129 | roller.start(_master); 130 | }else{ 131 | removePanel(Console.PANEL_ROLLER); 132 | } 133 | _mainPanel.updateMenu(); 134 | } 135 | } 136 | // 137 | // 138 | // 139 | public function get fpsMonitor():Boolean{ 140 | return (getPanel(Console.PANEL_FPS) as FPSPanel)!=null; 141 | } 142 | public function set fpsMonitor(b:Boolean):void{ 143 | if(fpsMonitor != b){ 144 | if(b){ 145 | var fps:FPSPanel = new FPSPanel(_master); 146 | fps.x = _mainPanel.x+_mainPanel.width-160; 147 | fps.y = _mainPanel.y+15; 148 | addPanel(fps); 149 | }else { 150 | removePanel(Console.PANEL_FPS); 151 | } 152 | _mainPanel.updateMenu(); 153 | } 154 | } 155 | // 156 | // 157 | // 158 | public function get memoryMonitor():Boolean{ 159 | return (getPanel(Console.PANEL_MEMORY) as MemoryPanel)!=null; 160 | } 161 | public function set memoryMonitor(b:Boolean):void{ 162 | if(memoryMonitor != b){ 163 | if(b){ 164 | var mp:MemoryPanel = new MemoryPanel(_master); 165 | mp.x = _mainPanel.x+_mainPanel.width-80; 166 | mp.y = _mainPanel.y+15; 167 | addPanel(mp); 168 | }else { 169 | removePanel(Console.PANEL_MEMORY); 170 | } 171 | _mainPanel.updateMenu(); 172 | } 173 | } 174 | // 175 | // 176 | // 177 | public function addGraph(n:String, obj:Object, prop:String, col:Number = -1, key:String = null, rect:Rectangle = null, inverse:Boolean = false):void{ 178 | n = USER_GRAPH_PREFIX+n; 179 | var graph:GraphingPanel = getPanel(n) as GraphingPanel; 180 | if(!graph){ 181 | graph = new GraphingPanel(_master, 100,100); 182 | graph.x = _mainPanel.x + 80; 183 | graph.y = _mainPanel.y + 20; 184 | graph.name = n; 185 | } 186 | if(rect){ 187 | graph.x = rect.x; 188 | graph.y = rect.y; 189 | if(rect.width>0) 190 | graph.width = rect.width; 191 | if(rect.height>0) 192 | graph.height = rect.height; 193 | } 194 | graph.inverse = inverse; 195 | graph.add(obj,prop,col, key); 196 | addPanel(graph); 197 | } 198 | public function fixGraphRange(n:String, min:Number = NaN, max:Number = NaN):void{ 199 | var graph:GraphingPanel = getPanel(USER_GRAPH_PREFIX+n) as GraphingPanel; 200 | if(graph){ 201 | graph.fixRange(min, max); 202 | } 203 | } 204 | public function removeGraph(n:String, obj:Object = null, prop:String = null):void{ 205 | var graph:GraphingPanel = getPanel(USER_GRAPH_PREFIX+n) as GraphingPanel; 206 | if(graph){ 207 | graph.remove(obj, prop); 208 | } 209 | } 210 | // 211 | // 212 | // 213 | public function tooltip(str:String = null, panel:AbstractPanel = null):void{ 214 | if(str && !rulerActive){ 215 | str = str.replace(/\:\:(.*)/, "
$1"); 216 | _master.addChild(_tooltipField); 217 | _tooltipField.wordWrap = false; 218 | _tooltipField.htmlText = ""+str+""; 219 | if(_tooltipField.width>120){ 220 | _tooltipField.width = 120; 221 | _tooltipField.wordWrap = true; 222 | } 223 | _tooltipField.x = _master.mouseX-(_tooltipField.width/2); 224 | _tooltipField.y = _master.mouseY+20; 225 | if(panel){ 226 | var txtRect:Rectangle = _tooltipField.getBounds(_master); 227 | var panRect:Rectangle = new Rectangle(panel.x,panel.y,panel.width,panel.height); 228 | var doff:Number = txtRect.bottom - panRect.bottom; 229 | if(doff>0){ 230 | if((_tooltipField.y - doff)>(_master.mouseY+15)){ 231 | _tooltipField.y -= doff; 232 | }else if(panRect.y<(_master.mouseY-24) && txtRect.y>panRect.bottom){ 233 | _tooltipField.y = _master.mouseY-_tooltipField.height-15; 234 | } 235 | } 236 | var loff:Number = txtRect.left - panRect.left; 237 | var roff:Number = txtRect.right - panRect.right; 238 | if(loff<0){ 239 | _tooltipField.x -= loff; 240 | }else if(roff>0){ 241 | _tooltipField.x -= roff; 242 | } 243 | } 244 | }else if(_master.contains(_tooltipField)){ 245 | _master.removeChild(_tooltipField); 246 | } 247 | } 248 | // 249 | // 250 | // 251 | public function startRuler():void{ 252 | if(rulerActive){ 253 | return; 254 | } 255 | _ruler = new Ruler(); 256 | _ruler.addEventListener(Ruler.EXIT, onRulerExit, false, 0, true); 257 | _master.addChild(_ruler); 258 | _ruler.start(_master); 259 | _mainPanel.updateMenu(); 260 | } 261 | public function get rulerActive():Boolean{ 262 | return (_ruler && _master.contains(_ruler))?true:false; 263 | } 264 | private function onRulerExit(e:Event):void{ 265 | if(_ruler && _master.contains(_ruler)){ 266 | _master.removeChild(_ruler); 267 | } 268 | _ruler = null; 269 | _mainPanel.updateMenu(); 270 | } 271 | // 272 | // 273 | // 274 | private function onPanelStartDragScale(e:Event):void{ 275 | var target:AbstractPanel = e.currentTarget as AbstractPanel; 276 | if(target.snapping){ 277 | var X:Array = [0]; 278 | var Y:Array = [0]; 279 | if(_master.stage){ 280 | // this will only work if stage size is not changed or top left aligned 281 | X.push(_master.stage.stageWidth); 282 | Y.push(_master.stage.stageHeight); 283 | } 284 | var numchildren:int = _master.numChildren; 285 | for(var i:int = 0;i0){ 230 | var avg:Number = interest.avg; 231 | if(isNaN(avg)) { 232 | interest.avg = v; 233 | }else{ 234 | interest.avg = Utils.averageOut(avg, v, averaging); 235 | } 236 | } 237 | if(!fixed){ 238 | if(v > highest) highest = v; 239 | if(v < lowest) lowest = v; 240 | } 241 | }else{ 242 | remove(obj, interest.prop); 243 | } 244 | } 245 | _history.push(values); 246 | // clean up off screen data 247 | var maxLen:int = Math.floor(width)+10; 248 | var len:uint = _history.length; 249 | if(len > maxLen){ 250 | _history.splice(0, (len-maxLen)); 251 | } 252 | } 253 | public function drawGraph():void{ 254 | _drawnFrame++; 255 | if(!_needRedraw && _drawnFrame < drawEvery) return; 256 | _needRedraw = false; 257 | _drawnFrame= 0; 258 | var W:Number = width; 259 | var H:Number = height-graph.y; 260 | graph.graphics.clear(); 261 | var diffGraph:Number = highest-lowest; 262 | var numInterests:int = _interests.length; 263 | var len:int = _history.length; 264 | for(var j:int = 0;jH)Y=H; 277 | graph.graphics[(first?"moveTo":"lineTo")]((W-i), Y); 278 | first = false; 279 | } 280 | if(averaging>0 && diffGraph){ 281 | Y = ((interest.avg-lowest)/diffGraph)*H; 282 | if(!inverse) Y = H-Y; 283 | if(Y<-1)Y=-1; 284 | if(Y>H)Y=H+1; 285 | graph.graphics.lineStyle(1,interest.col, 0.3); 286 | graph.graphics.moveTo(0, Y); 287 | graph.graphics.lineTo(W, Y); 288 | } 289 | } 290 | (inverse?highTxt:lowTxt).text = isNaN(lowest)?"":""+lowest+""; 291 | (inverse?lowTxt:highTxt).text = isNaN(highest)?"":""+highest+""; 292 | } 293 | public function updateKeyText():void{ 294 | var str:String = ""; 295 | for each(var interest:Interest in _interests){ 296 | str += " "+interest.key+""; 297 | } 298 | str += " | R X"; 299 | keyTxt.htmlText = str; 300 | } 301 | protected function linkHandler(e:TextEvent):void{ 302 | TextField(e.currentTarget).setSelection(0, 0); 303 | if(e.text == "reset"){ 304 | reset(); 305 | }else if(e.text == "close"){ 306 | close(); 307 | } 308 | e.stopPropagation(); 309 | } 310 | protected function onMenuRollOver(e:TextEvent):void{ 311 | master.panels.tooltip(e.text?e.text.replace("event:",""):null, this); 312 | } 313 | } 314 | } 315 | 316 | import com.luaye.console.utils.WeakRef; 317 | 318 | class Interest{ 319 | private var _ref:WeakRef; 320 | public var prop:String; 321 | public var col:Number; 322 | public var key:String; 323 | public var avg:Number; 324 | public function Interest(object:Object, property:String, color:Number, keystr:String):void{ 325 | _ref = new WeakRef(object); 326 | prop = property; 327 | col = color; 328 | key = keystr; 329 | } 330 | public function get obj():Object{ 331 | return _ref.reference; 332 | } 333 | } -------------------------------------------------------------------------------- /AIR/src/com/luaye/console/view/AbstractPanel.as: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2008-2009 Lu Aye Oo 4 | * 5 | * @author Lu Aye Oo 6 | * 7 | * http://code.google.com/p/flash-console/ 8 | * 9 | * 10 | * This software is provided 'as-is', without any express or implied 11 | * warranty. In no event will the authors be held liable for any damages 12 | * arising from the use of this software. 13 | * Permission is granted to anyone to use this software for any purpose, 14 | * including commercial applications, and to alter it and redistribute it 15 | * freely, subject to the following restrictions: 16 | * 1. The origin of this software must not be misrepresented; you must not 17 | * claim that you wrote the original software. If you use this software 18 | * in a product, an acknowledgment in the product documentation would be 19 | * appreciated but is not required. 20 | * 2. Altered source versions must be plainly marked as such, and must not be 21 | * misrepresented as being the original software. 22 | * 3. This notice may not be removed or altered from any source distribution. 23 | * 24 | */ 25 | package com.luaye.console.view { 26 | import flash.events.TextEvent; 27 | 28 | import com.luaye.console.Console; 29 | 30 | import flash.display.DisplayObject; 31 | import flash.display.Sprite; 32 | import flash.events.Event; 33 | import flash.events.MouseEvent; 34 | import flash.geom.Point; 35 | import flash.geom.Rectangle; 36 | import flash.text.TextField; 37 | import flash.text.TextFieldAutoSize; 38 | 39 | public class AbstractPanel extends Sprite { 40 | 41 | public static const STARTED_DRAGGING:String = "startedDragging"; 42 | public static const STARTED_SCALING:String = "startedScaling"; 43 | 44 | //event might be clearer to have it independent... 45 | //[Event(name="textLinkEvent", type="flash.events.TextEvent")] 46 | public static const TEXT_LINK:String = "textLinkEvent"; 47 | 48 | private var _snaps:Array; 49 | private var _dragOffset:Point; 50 | private var _resizeTxt:TextField; 51 | 52 | protected var master:Console; 53 | protected var style:Style; 54 | protected var bg:Sprite; 55 | protected var scaler:Sprite; 56 | protected var minimumWidth:int = 18; 57 | protected var minimumHeight:int = 18; 58 | 59 | public var moveable:Boolean = true; 60 | public var snapping:uint = 3; 61 | 62 | public function AbstractPanel(m:Console) { 63 | master = m; 64 | style = master.style; 65 | bg = new Sprite(); 66 | bg.name = "background"; 67 | addChild(bg); 68 | } 69 | protected function drawBG(col:Number = 0, a:Number = 0.6, rounding:int = 10):void{ 70 | bg.graphics.clear(); 71 | bg.graphics.beginFill(col, a); 72 | var size:int = 100; 73 | var roundSize:int = 100-(rounding*2); 74 | bg.graphics.drawRoundRect(0, 0, size, size,rounding,rounding); 75 | var grid:Rectangle = new Rectangle(rounding, rounding, roundSize, roundSize); 76 | bg.scale9Grid = grid; 77 | } 78 | public function init(w:Number,h:Number,resizable:Boolean = false, col:Number = -1, a:Number = -1, rounding:int = 10):void{ 79 | drawBG(col>=0?col:style.panelBackgroundColor, a>=0?a:style.panelBackgroundAlpha, rounding); 80 | scalable = resizable; 81 | width = w; 82 | height = h; 83 | } 84 | public function close():void { 85 | stopDragging(); 86 | master.panels.tooltip(); 87 | if(parent){ 88 | parent.removeChild(this); 89 | } 90 | //dispatchEvent(new Event(CLOSED)); 91 | } 92 | // 93 | // SIZE 94 | // 95 | override public function set width(n:Number):void{ 96 | if(n < minimumWidth) n = minimumWidth; 97 | if(scaler) scaler.x = n; 98 | bg.width = n; 99 | } 100 | override public function set height(n:Number):void{ 101 | if(n < minimumHeight) n = minimumHeight; 102 | if(scaler) scaler.y = n; 103 | bg.height = n; 104 | } 105 | override public function get width():Number{ 106 | return bg.width; 107 | } 108 | override public function get height():Number{ 109 | return bg.height; 110 | } 111 | // 112 | // MOVING 113 | // 114 | public function registerSnaps(X:Array, Y:Array):void{ 115 | _snaps = [X,Y]; 116 | } 117 | protected function registerDragger(mc:DisplayObject, dereg:Boolean = false):void{ 118 | if(dereg){ 119 | mc.removeEventListener(MouseEvent.MOUSE_DOWN, onDraggerMouseDown); 120 | }else{ 121 | mc.addEventListener(MouseEvent.MOUSE_DOWN, onDraggerMouseDown, false, 0, true); 122 | } 123 | } 124 | private function onDraggerMouseDown(e:MouseEvent):void{ 125 | if(!stage || !moveable) return; 126 | // 127 | _resizeTxt = new TextField(); 128 | _resizeTxt.name = "positioningField"; 129 | _resizeTxt.autoSize = TextFieldAutoSize.LEFT; 130 | formatText(_resizeTxt); 131 | addChild(_resizeTxt); 132 | updateDragText(); 133 | // 134 | _dragOffset = new Point(mouseX,mouseY); // using this way instead of startDrag, so that it can control snapping. 135 | _snaps = [[],[]]; 136 | dispatchEvent(new Event(STARTED_DRAGGING)); 137 | stage.addEventListener(MouseEvent.MOUSE_UP, onDraggerMouseUp, false, 0, true); 138 | stage.addEventListener(MouseEvent.MOUSE_MOVE, onDraggerMouseMove, false, 0, true); 139 | } 140 | private function onDraggerMouseMove(e:MouseEvent = null):void{ 141 | if(snapping==0) return; 142 | // YEE HA, SNAPPING! 143 | var p:Point = returnSnappedFor(parent.mouseX-_dragOffset.x, parent.mouseY-_dragOffset.y); 144 | x = p.x; 145 | y = p.y; 146 | updateDragText(); 147 | } 148 | private function updateDragText():void{ 149 | _resizeTxt.text = ""+x+","+y+""; 150 | } 151 | private function onDraggerMouseUp(e:MouseEvent):void{ 152 | stopDragging(); 153 | } 154 | private function stopDragging():void{ 155 | _snaps = null; 156 | if(stage){ 157 | stage.removeEventListener(MouseEvent.MOUSE_UP, onDraggerMouseUp); 158 | stage.removeEventListener(MouseEvent.MOUSE_MOVE, onDraggerMouseMove); 159 | } 160 | if(_resizeTxt && _resizeTxt.parent){ 161 | _resizeTxt.parent.removeChild(_resizeTxt); 162 | } 163 | _resizeTxt = null; 164 | } 165 | // 166 | // SCALING 167 | // 168 | public function get scalable():Boolean{ 169 | return scaler?true:false; 170 | } 171 | public function set scalable(b:Boolean):void{ 172 | if(b && !scaler){ 173 | scaler = new Sprite(); 174 | scaler.name = "scaler"; 175 | scaler.graphics.beginFill(style.panelScalerColor, style.panelBackgroundAlpha); 176 | scaler.graphics.lineTo(-10, 0); 177 | scaler.graphics.lineTo(0, -10); 178 | scaler.graphics.endFill(); 179 | scaler.buttonMode = true; 180 | scaler.doubleClickEnabled = true; 181 | scaler.addEventListener(MouseEvent.MOUSE_DOWN,onScalerMouseDown, false, 0, true); 182 | addChild(scaler); 183 | }else if(!b && scaler){ 184 | if(contains(scaler)){ 185 | removeChild(scaler); 186 | } 187 | scaler = null; 188 | } 189 | } 190 | private function onScalerMouseDown(e:Event):void{ 191 | _resizeTxt = new TextField(); 192 | _resizeTxt.name = "resizingField"; 193 | _resizeTxt.autoSize = TextFieldAutoSize.RIGHT; 194 | _resizeTxt.x = -4; 195 | _resizeTxt.y = -17; 196 | formatText(_resizeTxt); 197 | scaler.addChild(_resizeTxt); 198 | updateScaleText(); 199 | _dragOffset = new Point(scaler.mouseX,scaler.mouseY); // using this way instead of startDrag, so that it can control snapping. 200 | _snaps = [[],[]]; 201 | scaler.stage.addEventListener(MouseEvent.MOUSE_UP,onScalerMouseUp, false, 0, true); 202 | scaler.stage.addEventListener(MouseEvent.MOUSE_MOVE,updateScale, false, 0, true); 203 | dispatchEvent(new Event(STARTED_SCALING)); 204 | } 205 | private function updateScale(e:Event = null):void{ 206 | var p:Point = returnSnappedFor(x+mouseX-_dragOffset.x, y+mouseY-_dragOffset.x); 207 | p.x-=x; 208 | p.y-=y; 209 | width = p.x"; 215 | } 216 | public function stopScaling():void{ 217 | onScalerMouseUp(null); 218 | } 219 | private function onScalerMouseUp(e:Event):void{ 220 | scaler.stage.removeEventListener(MouseEvent.MOUSE_UP,onScalerMouseUp); 221 | scaler.stage.removeEventListener(MouseEvent.MOUSE_MOVE,updateScale); 222 | updateScale(); 223 | _snaps = null; 224 | if(_resizeTxt && _resizeTxt.parent){ 225 | _resizeTxt.parent.removeChild(_resizeTxt); 226 | } 227 | _resizeTxt = null; 228 | } 229 | // 230 | // 231 | // 232 | private function formatText(txt:TextField):void{ 233 | txt.background = true; 234 | txt.backgroundColor = style.panelBackgroundColor; 235 | txt.styleSheet = style.css; 236 | txt.mouseEnabled = false; 237 | } 238 | private function returnSnappedFor(X:Number,Y:Number):Point{ 239 | var ex:Number = X+width; 240 | var Xs:Array = _snaps[0]; 241 | for each(var Xi:Number in Xs){ 242 | if(Math.abs(Xi-X)0){ 279 | // kinda a hack really :( 280 | var scrollH:Number = field.scrollH; 281 | var w:Number = field.width; 282 | field.width = w+scrollH; 283 | index = field.getCharIndexAtPoint(field.mouseX+scrollH, field.mouseY); 284 | field.width = w; 285 | field.scrollH = scrollH; 286 | }else{ 287 | index = field.getCharIndexAtPoint(field.mouseX, field.mouseY); 288 | } 289 | var url:String = null; 290 | var txt:String = null; 291 | if(index>0){ 292 | // TextField.getXMLText(...) is not documented 293 | var X:XML = new XML(field.getXMLText(index,index+1)); 294 | if(X.hasOwnProperty("textformat")){ 295 | var txtformat:XML = X["textformat"][0] as XML; 296 | if(txtformat){ 297 | url = txtformat.@url; 298 | txt = txtformat.toString(); 299 | } 300 | } 301 | } 302 | field.dispatchEvent(new TextEvent(TEXT_LINK,false,false,url)); 303 | } 304 | } 305 | } -------------------------------------------------------------------------------- /AIR/src/MainFinal.as: -------------------------------------------------------------------------------- 1 | package 2 | { 3 | import com.myflashlab.air.extensions.dependency.OverrideAir; 4 | import com.myflashlab.air.extensions.player.VideoPlayerEvent; 5 | 6 | import flash.desktop.NativeApplication; 7 | import flash.desktop.SystemIdleMode; 8 | import flash.display.BitmapData; 9 | import flash.display.Sprite; 10 | import flash.display.StageAlign; 11 | import flash.display.StageScaleMode; 12 | import flash.events.Event; 13 | import flash.events.MouseEvent; 14 | import flash.text.AntiAliasType; 15 | import flash.text.TextField; 16 | import flash.text.TextFieldAutoSize; 17 | import flash.text.TextFormat; 18 | import flash.text.TextFormatAlign; 19 | import flash.ui.Multitouch; 20 | import flash.ui.MultitouchInputMode; 21 | import flash.ui.Keyboard; 22 | import flash.events.KeyboardEvent; 23 | import flash.events.InvokeEvent; 24 | import flash.filesystem.File; 25 | import flash.net.URLVariables; 26 | 27 | import com.myflashlab.air.extensions.player.VideoPlayer; 28 | import com.myflashlab.air.extensions.player.VideoType; 29 | import com.doitflash.text.modules.MySprite; 30 | import com.doitflash.starling.utils.list.List; 31 | import com.doitflash.consts.Direction; 32 | import com.doitflash.consts.Orientation; 33 | import com.doitflash.consts.Easing; 34 | import com.doitflash.mobileProject.commonCpuSrc.DeviceInfo; 35 | 36 | import com.doitflash.remote.youtube.YouTubeLinkParser; 37 | import com.doitflash.remote.youtube.YouTubeLinkParserEvent; 38 | import com.doitflash.remote.youtube.VideoType; 39 | import com.doitflash.remote.youtube.VideoQuality; 40 | 41 | import com.luaye.console.C; 42 | 43 | import flash.utils.setTimeout; 44 | 45 | /** 46 | * ... 47 | * @author Hadi Tavakoli - 11/4/2014 3:01 PM 48 | */ 49 | public class MainFinal extends Sprite 50 | { 51 | private var _ex:VideoPlayer; 52 | private var _ytParser:YouTubeLinkParser; 53 | 54 | private const BTN_WIDTH:Number = 150; 55 | private const BTN_HEIGHT:Number = 60; 56 | private const BTN_SPACE:Number = 2; 57 | private var _txt:TextField; 58 | private var _body:Sprite; 59 | private var _list:List; 60 | private var _numRows:int = 1; 61 | 62 | public function MainFinal():void 63 | { 64 | Multitouch.inputMode = MultitouchInputMode.GESTURE; 65 | NativeApplication.nativeApplication.addEventListener(Event.ACTIVATE, handleActivate, false, 0, true); 66 | NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvoke, false, 0, true); 67 | NativeApplication.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN, handleKeys, false, 0, true); 68 | 69 | stage.addEventListener(Event.RESIZE, onResize); 70 | stage.scaleMode = StageScaleMode.NO_SCALE; 71 | stage.align = StageAlign.TOP_LEFT; 72 | 73 | C.startOnStage(this, "`"); 74 | C.commandLine = false; 75 | C.commandLineAllowed = false; 76 | C.x = 100; 77 | C.width = 500; 78 | C.height = 250; 79 | C.strongRef = true; 80 | C.visible = true; 81 | C.scaleX = C.scaleY = DeviceInfo.dpiScaleMultiplier; 82 | 83 | _txt = new TextField(); 84 | _txt.autoSize = TextFieldAutoSize.LEFT; 85 | _txt.antiAliasType = AntiAliasType.ADVANCED; 86 | _txt.multiline = true; 87 | _txt.wordWrap = true; 88 | _txt.embedFonts = false; 89 | _txt.htmlText = "VideoPlayer Extension V"+ VideoPlayer.VERSION +" (iOS + Android)"; 90 | _txt.scaleX = _txt.scaleY = DeviceInfo.dpiScaleMultiplier; 91 | this.addChild(_txt); 92 | 93 | _body = new Sprite(); 94 | this.addChild(_body); 95 | 96 | _list = new List(); 97 | _list.holder = _body; 98 | _list.itemsHolder = new Sprite(); 99 | _list.orientation = Orientation.VERTICAL; 100 | _list.hDirection = Direction.LEFT_TO_RIGHT; 101 | _list.vDirection = Direction.TOP_TO_BOTTOM; 102 | _list.space = BTN_SPACE; 103 | 104 | init(); 105 | } 106 | 107 | private function onInvoke(e:InvokeEvent):void 108 | { 109 | NativeApplication.nativeApplication.removeEventListener(InvokeEvent.INVOKE, onInvoke); 110 | } 111 | 112 | private function handleActivate(e:Event):void 113 | { 114 | NativeApplication.nativeApplication.systemIdleMode = SystemIdleMode.KEEP_AWAKE; 115 | } 116 | 117 | private function handleKeys(e:KeyboardEvent):void 118 | { 119 | if(e.keyCode == Keyboard.BACK) 120 | { 121 | e.preventDefault(); 122 | NativeApplication.nativeApplication.exit(); 123 | } 124 | } 125 | 126 | private function onResize(e:*=null):void 127 | { 128 | if (_txt) 129 | { 130 | _txt.y = 150 * (1 / DeviceInfo.dpiScaleMultiplier); 131 | _txt.width = stage.stageWidth * (1 / DeviceInfo.dpiScaleMultiplier); 132 | 133 | C.x = 0; 134 | C.y = _txt.y + _txt.height + 0; 135 | C.width = stage.stageWidth * (1 / DeviceInfo.dpiScaleMultiplier); 136 | C.height = 300 * (1 / DeviceInfo.dpiScaleMultiplier); 137 | } 138 | 139 | if (_list) 140 | { 141 | _numRows = Math.floor(stage.stageWidth / (BTN_WIDTH * DeviceInfo.dpiScaleMultiplier + BTN_SPACE)); 142 | _list.row = _numRows; 143 | _list.itemArrange(); 144 | } 145 | 146 | if (_body) 147 | { 148 | _body.y = stage.stageHeight - _body.height; 149 | } 150 | } 151 | 152 | private function init():void 153 | { 154 | // Remove OverrideAir debugger in production builds 155 | OverrideAir.enableDebugger(function ($ane:String, $class:String, $msg:String):void 156 | { 157 | trace($ane+" ("+$class+") "+$msg); 158 | }); 159 | 160 | // initialize the extension 161 | _ex = new VideoPlayer(); 162 | 163 | /* 164 | The following listener works on iOS only. 165 | 166 | On Android, the ANE will check available players on your device and lets you play your content 167 | on each one you like. This means another third-party app will take care of playing your video. 168 | It is your job to check when your app gets activated when users cancels the video playback on 169 | the other app. You can do this with "Event.ACTIVATE" listener. 170 | 171 | On iOS, we are using the built-in AVPlayer class which means the video plays inside your app. 172 | Because of this, unlike Android, you will not receive any Event.ACTIVATE event simply because 173 | you have not left the app to begin with. To fix this problem on iOS, we will do this on the ANE 174 | side and as soon as the video player is dismissed, you will receive the event via the following 175 | listener: VideoPlayerEvent.DISMISSED 176 | */ 177 | if(OverrideAir.os == OverrideAir.IOS) _ex.addEventListener(VideoPlayerEvent.DISMISSED, onDismissed); 178 | 179 | // on Android, local videos must be in File.cacheDirectory. on iOS, they can be anywhere. 180 | var src:File = File.applicationDirectory.resolvePath("movie01.mp4"); 181 | var dis:File = File.cacheDirectory.resolvePath("exVideoPlayer.mp4"); 182 | if(!dis.exists) src.copyTo(dis); 183 | 184 | // ---------------------- 185 | var btn1:MySprite = createBtn("play on File.cacheDirectory"); 186 | btn1.addEventListener(MouseEvent.CLICK, playVideoOnCacheDirectory); 187 | _list.add(btn1); 188 | 189 | function playVideoOnCacheDirectory(e:MouseEvent):void 190 | { 191 | trace(dis.nativePath); 192 | _ex.play(dis.nativePath, com.myflashlab.air.extensions.player.VideoType.LOCAL); 193 | } 194 | 195 | // ---------------------- 196 | var btn2:MySprite = createBtn("play online"); 197 | btn2.addEventListener(MouseEvent.CLICK, toPlayVideoIntentOnline); 198 | _list.add(btn2); 199 | 200 | function toPlayVideoIntentOnline(e:MouseEvent):void 201 | { 202 | var address:String = "https://myflashlabs.com/showcase/Bully_Scholarship_Edition_Trailer.mp4"; 203 | _ex.play(address, com.myflashlab.air.extensions.player.VideoType.ONLINE); 204 | } 205 | // ---------------------- 206 | 207 | var btn3:MySprite = createBtn("play from YouTube"); 208 | btn3.addEventListener(MouseEvent.CLICK, toPlayVideoIntentYouTube); 209 | _list.add(btn3); 210 | 211 | function toPlayVideoIntentYouTube(e:MouseEvent):void 212 | { 213 | C.log("connecting to youtube..."); 214 | 215 | if(!_ytParser) _ytParser = new YouTubeLinkParser(); 216 | _ytParser.addEventListener(YouTubeLinkParserEvent.COMPLETE, onComplete); 217 | _ytParser.addEventListener(YouTubeLinkParserEvent.ERROR, onError); 218 | _ytParser.parse("https://www.youtube.com/watch?v=QowwaefoCec"); 219 | 220 | } 221 | 222 | function onError(e:YouTubeLinkParserEvent):void 223 | { 224 | _ytParser.removeEventListener(YouTubeLinkParserEvent.COMPLETE, onComplete); 225 | _ytParser.removeEventListener(YouTubeLinkParserEvent.ERROR, onError); 226 | 227 | C.log("Error: " + e.param.msg); 228 | } 229 | 230 | function onComplete(e:YouTubeLinkParserEvent):void 231 | { 232 | _ytParser.removeEventListener(YouTubeLinkParserEvent.COMPLETE, onComplete); 233 | _ytParser.removeEventListener(YouTubeLinkParserEvent.ERROR, onError); 234 | 235 | C.log("youTube parse completed..."); 236 | C.log("video thumb: " + _ytParser.thumb); 237 | C.log("video title: " + _ytParser.title); 238 | C.log("possible found videos: " + _ytParser.videoFormats.length); 239 | 240 | C.log("you can only access youtube public videos... no age restriction for example!"); 241 | C.log("some video formats may be null so you should check their availablily..."); 242 | C.log("to make your job easier, I built another method called getHeaders() which will load video headers for you! you can know the video size using these header information :) ") 243 | 244 | // let's find the VideoType.VIDEO_MP4 video format in VideoQuality.MEDIUM for this video 245 | // NOTICE: you should find your own way of selecting a video format! as different videos may not have all formats or qualities available! 246 | 247 | var chosenVideo:String; 248 | for (var i:int = 0; i < _ytParser.videoFormats.length; i++) 249 | { 250 | var currVideoData:Object = _ytParser.videoFormats[i]; 251 | if (currVideoData.mimeType.indexOf(com.doitflash.remote.youtube.VideoType.VIDEO_MP4) > -1 && currVideoData.quality == VideoQuality.MEDIUM) 252 | { 253 | chosenVideo = currVideoData.url; 254 | break; 255 | } 256 | } 257 | 258 | // optionally you may validate if the url is valid: 259 | //_ytParser.addEventListener(YouTubeLinkParserEvent.VIDEO_HEADER_RECEIVED, onHeadersReceived); 260 | //_ytParser.addEventListener(YouTubeLinkParserEvent.VIDEO_HEADER_ERROR, onHeadersError); 261 | //_ytParser.getHeaders(chosenVideo); 262 | 263 | _ex.play(chosenVideo, com.myflashlab.air.extensions.player.VideoType.ONLINE); 264 | } 265 | 266 | // ---------------------- 267 | 268 | 269 | 270 | // ---------------------- 271 | 272 | 273 | 274 | // ---------------------- 275 | 276 | 277 | 278 | // ---------------------- 279 | 280 | 281 | onResize(); 282 | } 283 | 284 | private function onDismissed(e:VideoPlayerEvent):void 285 | { 286 | trace("iOS video library dismissed!"); 287 | } 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | private function createBtn($str:String):MySprite 320 | { 321 | var sp:MySprite = new MySprite(); 322 | sp.addEventListener(MouseEvent.MOUSE_OVER, onOver); 323 | sp.addEventListener(MouseEvent.MOUSE_OUT, onOut); 324 | sp.addEventListener(MouseEvent.CLICK, onOut); 325 | sp.bgAlpha = 1; 326 | sp.bgColor = 0xDFE4FF; 327 | sp.drawBg(); 328 | sp.width = BTN_WIDTH * DeviceInfo.dpiScaleMultiplier; 329 | sp.height = BTN_HEIGHT * DeviceInfo.dpiScaleMultiplier; 330 | 331 | function onOver(e:MouseEvent):void 332 | { 333 | sp.bgAlpha = 1; 334 | sp.bgColor = 0xFFDB48; 335 | sp.drawBg(); 336 | } 337 | 338 | function onOut(e:MouseEvent):void 339 | { 340 | sp.bgAlpha = 1; 341 | sp.bgColor = 0xDFE4FF; 342 | sp.drawBg(); 343 | } 344 | 345 | var format:TextFormat = new TextFormat("Arimo", 16, 0x666666, null, null, null, null, null, TextFormatAlign.CENTER); 346 | 347 | var txt:TextField = new TextField(); 348 | txt.autoSize = TextFieldAutoSize.LEFT; 349 | txt.antiAliasType = AntiAliasType.ADVANCED; 350 | txt.mouseEnabled = false; 351 | txt.multiline = true; 352 | txt.wordWrap = true; 353 | txt.scaleX = txt.scaleY = DeviceInfo.dpiScaleMultiplier; 354 | txt.width = sp.width * (1 / DeviceInfo.dpiScaleMultiplier); 355 | txt.defaultTextFormat = format; 356 | txt.text = $str; 357 | 358 | txt.y = sp.height - txt.height >> 1; 359 | sp.addChild(txt); 360 | 361 | return sp; 362 | } 363 | } 364 | 365 | } -------------------------------------------------------------------------------- /AIR/src/com/luaye/console/core/CommandTools.as: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2008-2009 Lu Aye Oo 4 | * 5 | * @author Lu Aye Oo 6 | * 7 | * http://code.google.com/p/flash-console/ 8 | * 9 | * 10 | * This software is provided 'as-is', without any express or implied 11 | * warranty. In no event will the authors be held liable for any damages 12 | * arising from the use of this software. 13 | * Permission is granted to anyone to use this software for any purpose, 14 | * including commercial applications, and to alter it and redistribute it 15 | * freely, subject to the following restrictions: 16 | * 1. The origin of this software must not be misrepresented; you must not 17 | * claim that you wrote the original software. If you use this software 18 | * in a product, an acknowledgment in the product documentation would be 19 | * appreciated but is not required. 20 | * 2. Altered source versions must be plainly marked as such, and must not be 21 | * misrepresented as being the original software. 22 | * 3. This notice may not be removed or altered from any source distribution. 23 | * 24 | */ 25 | package com.luaye.console.core { 26 | import com.luaye.console.utils.WeakObject; 27 | import com.luaye.console.Console; 28 | 29 | import flash.display.DisplayObject; 30 | import flash.display.DisplayObjectContainer; 31 | import flash.utils.getQualifiedClassName; 32 | import flash.utils.describeType; 33 | 34 | public class CommandTools { 35 | 36 | private var _mapBases:WeakObject; 37 | private var _mapBaseIndex:uint = 1; 38 | private var _report:Function; 39 | 40 | public function CommandTools(f:Function) { 41 | _report = f; 42 | _mapBases = new WeakObject(); 43 | } 44 | public function report(obj:*,priority:Number = 1, skipSafe:Boolean = true):void{ 45 | _report(obj, priority, skipSafe); 46 | } 47 | public function inspect(obj:Object, viewAll:Boolean= true):void { 48 | // 49 | // Class extends... extendsClass 50 | // Class implements... implementsInterface 51 | // constant // statics 52 | // methods 53 | // accessors 54 | // varaibles 55 | // values 56 | // EVENTS .. metadata name="Event" 57 | // 58 | var V:XML = describeType(obj); 59 | var cls:Object = obj is Class?obj:obj.constructor; 60 | var clsV:XML = describeType(cls); 61 | var self:String = V.@name; 62 | var str:String = ""+self+""; 63 | var props:Array = []; 64 | var props2:Array = []; 65 | var staticPrefix:String = "[static]"; 66 | var nodes:XMLList; 67 | if(V.@isDynamic=="true"){ 68 | props.push("dynamic"); 69 | } 70 | if(V.@isFinal=="true"){ 71 | props.push("final"); 72 | } 73 | if(V.@isStatic=="true"){ 74 | props.push("static"); 75 | } 76 | if(props.length > 0){ 77 | str += " "+props.join(" | ")+""; 78 | } 79 | report(str+"
", -2); 80 | // 81 | // extends... 82 | // 83 | props = []; 84 | nodes = V.extendsClass; 85 | for each (var extendX:XML in nodes) { 86 | props.push(extendX.@type.toString()); 87 | if(!viewAll) break; 88 | } 89 | if(props.length){ 90 | report("Extends: "+props.join(" > ")+"
", 5); 91 | } 92 | // 93 | // implements... 94 | // 95 | props = []; 96 | nodes = V.implementsInterface; 97 | for each (var implementX:XML in nodes) { 98 | props.push(implementX.@type.toString()); 99 | } 100 | if(props.length){ 101 | report("Implements: "+props.join("; ")+"
", 5); 102 | } 103 | // 104 | // constants... 105 | // 106 | props = []; 107 | nodes = clsV..constant; 108 | for each (var constantX:XML in nodes) { 109 | props.push(constantX.@name+"("+constantX.@type+")"); 110 | } 111 | if(props.length){ 112 | report("Constants: "+props.join("; ")+"
", 5); 113 | } 114 | // 115 | // methods 116 | // 117 | props = []; 118 | props2 = []; 119 | nodes = clsV..method; // '..' to include from 120 | for each (var methodX:XML in nodes) { 121 | var mparamsList:XMLList = methodX.parameter; 122 | str = methodX.parent().name()=="factory"?"":staticPrefix; 123 | if(viewAll){ 124 | var params:Array = []; 125 | for each(var paraX:XML in mparamsList){ 126 | params.push(paraX.@optional=="true"?(""+paraX.@type+""):paraX.@type); 127 | } 128 | str += methodX.@name+"("+params.join(",")+"):"+methodX.@returnType+""; 129 | }else{ 130 | str += methodX.@name+"("+mparamsList.length()+"):"+methodX.@returnType+""; 131 | } 132 | arr = (self==methodX.@declaredBy?props:props2); 133 | arr.push(str); 134 | } 135 | makeInheritLine(props, props2, viewAll, "Methods", viewAll?"
":"; "); 136 | // 137 | // accessors 138 | // 139 | var arr:Array; 140 | props = []; 141 | props2 = []; 142 | nodes = clsV..accessor; // '..' to include from 143 | for each (var accessorX:XML in nodes) { 144 | str = accessorX.parent().name()=="factory"?"":staticPrefix; 145 | str += (accessorX.@access=="readonly"?(""+accessorX.@name+""):accessorX.@name)+"("+accessorX.@type+")"; 146 | arr = (self==accessorX.@declaredBy?props:props2); 147 | arr.push(str); 148 | } 149 | makeInheritLine(props, props2, viewAll, "Accessors", "; "); 150 | // 151 | // variables 152 | // 153 | props = []; 154 | nodes = clsV..variable; 155 | for each (var variableX:XML in nodes) { 156 | str = (variableX.parent().name()=="factory"?"":staticPrefix)+variableX.@name+"("+variableX.@type+")"; 157 | props.push(str); 158 | } 159 | if(props.length){ 160 | report("Variables: "+props.join("; ")+"
", 5); 161 | } 162 | // 163 | // dynamic values 164 | // 165 | props = []; 166 | for (var X:String in obj) { 167 | props.push(X+"("+getQualifiedClassName(obj[X])+")"); 168 | } 169 | if(props.length){ 170 | report("Values: "+props.join("; ")+"
", 5); 171 | } 172 | // 173 | // events 174 | // metadata name="Event" 175 | props = []; 176 | nodes = V.metadata; 177 | for each (var metadataX:XML in nodes) { 178 | if(metadataX.@name=="Event"){ 179 | var mn:XMLList = metadataX.arg; 180 | props.push(mn.(@key=="name").@value+"("+mn.(@key=="type").@value+")"); 181 | } 182 | } 183 | if(props.length){ 184 | report("Events: "+props.join("; ")+"
", 5); 185 | } 186 | // 187 | // display's parents and direct children 188 | // 189 | if (viewAll && obj is DisplayObjectContainer) { 190 | props = []; 191 | var mc:DisplayObjectContainer = obj as DisplayObjectContainer; 192 | var clen:int = mc.numChildren; 193 | for (var ci:int = 0; ci"+child.name+":("+ci+")"+getQualifiedClassName(child)); 196 | } 197 | if(props.length){ 198 | report("Children: "+props.join("; ")+"
", 5); 199 | } 200 | var theParent:DisplayObjectContainer = mc.parent; 201 | if (theParent) { 202 | props = ["("+theParent.getChildIndex(mc)+")"]; 203 | while (theParent) { 204 | var pr:DisplayObjectContainer = theParent; 205 | theParent = theParent.parent; 206 | props.push(""+pr.name+":("+(theParent?theParent.getChildIndex(pr):"")+")"+getQualifiedClassName(pr)); 207 | } 208 | if(props.length){ 209 | report("Parents: "+props.join("; ")+"
", 5); 210 | } 211 | } 212 | } 213 | if(!viewAll){ 214 | report("Tip: use /inspectfull to see full inspection with inheritance",-1); 215 | } 216 | } 217 | private function makeInheritLine(props:Array, props2:Array, viewAll:Boolean, type:String, breaker:String):void{ 218 | var str:String = ""; 219 | if(props.length || props2.length){ 220 | str += ""+type+": "+props.join(breaker); 221 | if(viewAll){ 222 | str += (props.length?breaker:"")+""+props2.join(breaker)+""; 223 | }else if(props2.length){ 224 | str += (props.length?breaker:"")+"+ "+props2.length+" inherited"; 225 | } 226 | report(str+"
", 5); 227 | } 228 | } 229 | public function map(base:DisplayObjectContainer, maxstep:uint = 0):void{ 230 | if(!base){ 231 | report("It is not a DisplayObjectContainer", 10); 232 | return; 233 | } 234 | _mapBases[_mapBaseIndex] = base; 235 | var basestr:String = _mapBaseIndex+Console.MAPPING_SPLITTER; 236 | 237 | var list:Array = new Array(); 238 | var index:int = 0; 239 | list.push(base); 240 | while(index0){ 269 | indexes.pop(); 270 | steps--; 271 | } 272 | if((lastmcDO as DisplayObjectContainer).contains(mcDO)){ 273 | steps++; 274 | indexes.push(mcDO.name); 275 | break; 276 | } 277 | } 278 | } 279 | } 280 | } 281 | var str:String = ""; 282 | for(i=0;i"+mcDO.name+""; 288 | if(mcDO is DisplayObjectContainer){ 289 | n = ""+n+""; 290 | }else{ 291 | n = ""+n+""; 292 | } 293 | str += n+" ("+getQualifiedClassName(mcDO)+")"; 294 | report(str,mcDO is DisplayObjectContainer?5:2); 295 | }else if(!wasHiding){ 296 | wasHiding = true; 297 | report(str+"...",5); 298 | } 299 | lastmcDO = mcDO; 300 | } 301 | _mapBaseIndex++; 302 | report(base.name+":"+getQualifiedClassName(base)+" has "+list.length+" children/sub-children.", 10); 303 | report("Click on the name to return a reference to the child clip.
Note that clip references will be broken when display list is changed",-2); 304 | } 305 | public function reMap(path:String, mc:DisplayObjectContainer):DisplayObject{ 306 | var pathArr:Array = path.split(Console.MAPPING_SPLITTER); 307 | var first:String = pathArr.shift(); 308 | if(first != "0") mc = _mapBases[first]; 309 | var child:DisplayObject = mc as DisplayObject; 310 | try{ 311 | for each(var nn:String in pathArr){ 312 | if(!nn) break; 313 | child = mc.getChildByName(nn); 314 | if(child is DisplayObjectContainer){ 315 | mc = child as DisplayObjectContainer;; 316 | }else{ 317 | // assume it reached to end since there can no longer be a child 318 | break; 319 | } 320 | } 321 | return child; 322 | } catch (e:Error) { 323 | report("Problem getting the clip reference. Display list must have changed since last map request",10); 324 | //debug(e.getStackTrace()); 325 | } 326 | return null; 327 | } 328 | public function printHelp():void { 329 | report("____Command Line Help___",10); 330 | report("/filter (text) = filter/search logs for matching text",5); 331 | report("// = return to previous scope",5); 332 | report("/base = return to base scope (same as typing $base)",5); 333 | report("/store (name) = store current scope to that name (default is weak reference). to call back: $(name)",5); 334 | report("/savestrong (name) = store current scope as strong reference",5); 335 | report("/stored = list all stored variables",5); 336 | report("/inspect = get info of your current scope.",5); 337 | report("/inspectfull = get more detailed info of your current scope.",5); 338 | report("/map = get the display list map starting from your current scope",5); 339 | report("/strong true = turn on strong referencing, you need to turn this on if you want to start manipulating with instances that are newly created.",5); 340 | report("/string = return the param of this command as a string. This is useful if you want to paste a block of text to use in commandline.",5); 341 | report("Press up/down arrow keys to recall previous commands",2); 342 | report("__Examples:",10); 343 | report("stage.width",5); 344 | report("stage.scaleMode = flash.display.StageScaleMode.NO_SCALE",5); 345 | report("stage.frameRate = 12",5); 346 | report("__________",10); 347 | } 348 | } 349 | } --------------------------------------------------------------------------------