├── AIR ├── AIR.iml ├── Main-app.xml ├── assets │ └── com_doitflash_barcode_beep.mp3 ├── icons │ ├── Assets.car │ └── icons │ │ ├── icon_1024.png │ │ ├── icon_144.png │ │ ├── icon_192.png │ │ ├── icon_36.png │ │ ├── icon_48.png │ │ ├── icon_512.png │ │ ├── icon_72.png │ │ └── icon_96.png ├── lib │ └── README.md └── src │ ├── MainFinal.as │ └── com │ ├── doitflash │ ├── consts │ │ ├── CartUpdateType.as │ │ ├── Direction.as │ │ ├── Ease.as │ │ ├── Easing.as │ │ ├── FontStyle.as │ │ ├── LangDirection.as │ │ ├── Orientation.as │ │ ├── Position.as │ │ ├── ScrollConst.as │ │ └── Youtube.as │ ├── events │ │ └── ListEvent.as │ ├── mobileProject │ │ └── commonCpuSrc │ │ │ └── DeviceInfo.as │ ├── starling │ │ └── utils │ │ │ └── list │ │ │ └── List.as │ ├── text │ │ └── modules │ │ │ ├── MyMovieClip.as │ │ │ ├── MySprite.as │ │ │ └── TextModule.as │ └── tools │ │ └── DynamicFunc.as │ └── luaye │ ├── console │ ├── C.as │ ├── Ch.as │ ├── Console.as │ ├── core │ │ ├── CommandLine.as │ │ ├── CommandTools.as │ │ ├── Log.as │ │ ├── Logs.as │ │ ├── MemoryMonitor.as │ │ └── Remoting.as │ ├── utils │ │ ├── Utils.as │ │ ├── WeakObject.as │ │ └── WeakRef.as │ └── view │ │ ├── AbstractPanel.as │ │ ├── ChannelsPanel.as │ │ ├── FPSPanel.as │ │ ├── GraphingPanel.as │ │ ├── MainPanel.as │ │ ├── MemoryPanel.as │ │ ├── PanelsManager.as │ │ ├── RollerPanel.as │ │ ├── Ruler.as │ │ └── Style.as │ └── utils │ ├── bitmapMovieClip │ ├── BitmapMovieClip.as │ ├── BitmapMovieClipData.as │ └── sample │ │ ├── example.fla │ │ └── example.swf │ └── thread │ ├── Thread.as │ └── link.txt ├── ChangeLog.md ├── README.md └── barcodes ├── Aztec.jpg ├── CODE128.jpg ├── CODE39.jpg ├── EAN13.jpg ├── EAN8.jpg ├── ITF14.jpg ├── PDF417.jpg ├── UPCE.jpg ├── dataMatrix.jpg └── qr.jpg /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 | 62 | -------------------------------------------------------------------------------- /AIR/Main-app.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | com.doitflash.exBarcode 4 | 4.0.1 5 | mobileDevice 6 | exBarcode 7 | QR Code 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 52 | 53 | 54 | 56 | 57 | 58 | ]]> 59 | 60 | 61 | 64 | MinimumOSVersion 65 | 10.0 66 | 67 | 68 | NSCameraUsageDescription 69 | My description about why I need this feature in my app 70 | 71 | UIStatusBarStyle 72 | UIStatusBarStyleBlackOpaque 73 | 74 | UIRequiresPersistentWiFi 75 | NO 76 | 77 | UIDeviceFamily 78 | 79 | 1 80 | 2 81 | 82 | 83 | ]]> 84 | high 85 | 86 | 87 | 88 | exBarcode 89 | ex.swf 90 | true 91 | true 92 | true 93 | 94 | auto 95 | 96 | 97 | standard 98 | 99 | 100 | icons/icon_36.png 101 | icons/icon_48.png 102 | icons/icon_72.png 103 | icons/icon_96.png 104 | icons/icon_144.png 105 | icons/icon_192.png 106 | icons/icon_512.png 107 | icons/icon_1024.png 108 | 109 | 110 | 111 | com.myflashlab.air.extensions.barcode 112 | com.myflashlab.air.extensions.permissionCheck 113 | 114 | 115 | com.myflashlab.air.extensions.dependency.overrideAir 116 | com.myflashlab.air.extensions.dependency.androidx.core 117 | 118 | 119 | 120 | -------------------------------------------------------------------------------- /AIR/assets/com_doitflash_barcode_beep.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/AIR/assets/com_doitflash_barcode_beep.mp3 -------------------------------------------------------------------------------- /AIR/icons/Assets.car: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/AIR/icons/Assets.car -------------------------------------------------------------------------------- /AIR/icons/icons/icon_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/AIR/icons/icons/icon_1024.png -------------------------------------------------------------------------------- /AIR/icons/icons/icon_144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/AIR/icons/icons/icon_144.png -------------------------------------------------------------------------------- /AIR/icons/icons/icon_192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/AIR/icons/icons/icon_192.png -------------------------------------------------------------------------------- /AIR/icons/icons/icon_36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/AIR/icons/icons/icon_36.png -------------------------------------------------------------------------------- /AIR/icons/icons/icon_48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/AIR/icons/icons/icon_48.png -------------------------------------------------------------------------------- /AIR/icons/icons/icon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/AIR/icons/icons/icon_512.png -------------------------------------------------------------------------------- /AIR/icons/icons/icon_72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/AIR/icons/icons/icon_72.png -------------------------------------------------------------------------------- /AIR/icons/icons/icon_96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/AIR/icons/icons/icon_96.png -------------------------------------------------------------------------------- /AIR/lib/README.md: -------------------------------------------------------------------------------- 1 | Copy the purchased [barcode.ane](https://www.myflashlabs.com/product/qr-code-ane-adobe-air-native-extension/) here along with the following dependency ANEs: 2 | 3 | 1. permissionCheck.ane - [Download from here](https://github.com/myflashlab/PermissionCheck-ANE/) 4 | 1. androidx_core.ane 5 | 1. overrideAir.ane 6 | 7 | Download dependency ANEs from here: https://github.com/myflashlab/common-dependencies-ANE 8 | -------------------------------------------------------------------------------- /AIR/src/MainFinal.as: -------------------------------------------------------------------------------- 1 | package 2 | { 3 | import com.myflashlab.air.extensions.barcode.*; 4 | import com.myflashlab.air.extensions.nativePermissions.PermissionCheck; 5 | import com.myflashlab.air.extensions.dependency.OverrideAir; 6 | 7 | import com.doitflash.consts.Direction; 8 | import com.doitflash.consts.Orientation; 9 | import com.doitflash.starling.utils.list.List; 10 | import com.doitflash.text.modules.MySprite; 11 | import com.luaye.console.C; 12 | import flash.desktop.NativeApplication; 13 | import flash.desktop.SystemIdleMode; 14 | import flash.display.Sprite; 15 | import flash.display.StageAlign; 16 | import flash.display.StageScaleMode; 17 | import flash.events.Event; 18 | import flash.events.InvokeEvent; 19 | import flash.events.MouseEvent; 20 | import flash.events.StageOrientationEvent; 21 | import flash.filesystem.File; 22 | import flash.text.AntiAliasType; 23 | import flash.text.TextField; 24 | import flash.text.TextFieldAutoSize; 25 | import flash.text.TextFormat; 26 | import flash.text.TextFormatAlign; 27 | import flash.ui.Multitouch; 28 | import flash.ui.MultitouchInputMode; 29 | import flash.ui.Keyboard; 30 | import flash.events.KeyboardEvent; 31 | import com.doitflash.mobileProject.commonCpuSrc.DeviceInfo; 32 | import flash.utils.setTimeout; 33 | 34 | /** 35 | * ... 36 | * @author Hadi Tavakoli - 10/22/2014 12:10 PM 37 | */ 38 | public class MainFinal extends Sprite 39 | { 40 | private var _ex:Barcode; 41 | 42 | private const BTN_WIDTH:Number = 150; 43 | private const BTN_HEIGHT:Number = 60; 44 | private const BTN_SPACE:Number = 2; 45 | private var _txt:TextField; 46 | private var _body:Sprite; 47 | private var _list:List; 48 | private var _numRows:int = 1; 49 | 50 | public function MainFinal():void 51 | { 52 | Multitouch.inputMode = MultitouchInputMode.GESTURE; 53 | NativeApplication.nativeApplication.addEventListener(Event.ACTIVATE, handleActivate, false, 0, true); 54 | NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, handleDeactivate, false, 0, true); 55 | NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvoke, false, 0, true); 56 | NativeApplication.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN, handleKeys, false, 0, true); 57 | 58 | stage.addEventListener(Event.RESIZE, onResize); 59 | stage.scaleMode = StageScaleMode.NO_SCALE; 60 | stage.align = StageAlign.TOP_LEFT; 61 | 62 | C.startOnStage(this, "`"); 63 | C.commandLine = false; 64 | C.commandLineAllowed = false; 65 | C.x = 100; 66 | C.width = 500; 67 | C.height = 250; 68 | C.strongRef = true; 69 | C.visible = true; 70 | C.scaleX = C.scaleY = DeviceInfo.dpiScaleMultiplier; 71 | 72 | _txt = new TextField(); 73 | _txt.autoSize = TextFieldAutoSize.LEFT; 74 | _txt.antiAliasType = AntiAliasType.ADVANCED; 75 | _txt.multiline = true; 76 | _txt.wordWrap = true; 77 | _txt.embedFonts = false; 78 | _txt.htmlText = "QR Scanner ANE for iOS and Android V"+Barcode.VERSION+""; 79 | _txt.scaleX = _txt.scaleY = DeviceInfo.dpiScaleMultiplier; 80 | this.addChild(_txt); 81 | 82 | _body = new Sprite(); 83 | this.addChild(_body); 84 | 85 | _list = new List(); 86 | _list.holder = _body; 87 | _list.itemsHolder = new Sprite(); 88 | _list.orientation = Orientation.VERTICAL; 89 | _list.hDirection = Direction.LEFT_TO_RIGHT; 90 | _list.vDirection = Direction.TOP_TO_BOTTOM; 91 | _list.space = BTN_SPACE; 92 | 93 | // Remove OverrideAir debugger in production builds 94 | OverrideAir.enableDebugger(function ($ane:String, $class:String, $msg:String):void 95 | { 96 | trace($ane+" ("+$class+") "+$msg); 97 | }); 98 | 99 | checkPermissions(); 100 | } 101 | 102 | private function onInvoke(e:InvokeEvent):void 103 | { 104 | NativeApplication.nativeApplication.removeEventListener(InvokeEvent.INVOKE, onInvoke); 105 | } 106 | 107 | private function closeApp(e:MouseEvent):void 108 | { 109 | NativeApplication.nativeApplication.exit(); 110 | } 111 | 112 | private function handleActivate(e:Event):void 113 | { 114 | NativeApplication.nativeApplication.systemIdleMode = SystemIdleMode.KEEP_AWAKE; 115 | } 116 | 117 | private function handleDeactivate(e:Event):void 118 | { 119 | NativeApplication.nativeApplication.systemIdleMode = SystemIdleMode.NORMAL; 120 | } 121 | 122 | private function handleKeys(e:KeyboardEvent):void 123 | { 124 | if(e.keyCode == Keyboard.BACK) 125 | { 126 | e.preventDefault(); 127 | NativeApplication.nativeApplication.exit(); 128 | } 129 | } 130 | 131 | private function onResize(e:*=null):void 132 | { 133 | if (_txt) 134 | { 135 | _txt.y = 150 * (1 / DeviceInfo.dpiScaleMultiplier); 136 | _txt.width = stage.stageWidth * (1 / DeviceInfo.dpiScaleMultiplier); 137 | 138 | C.x = 0; 139 | C.y = _txt.y + _txt.height + 0; 140 | C.width = stage.stageWidth * (1 / DeviceInfo.dpiScaleMultiplier); 141 | C.height = 300 * (1 / DeviceInfo.dpiScaleMultiplier); 142 | } 143 | 144 | if (_list) 145 | { 146 | _numRows = Math.floor(stage.stageWidth / (BTN_WIDTH * DeviceInfo.dpiScaleMultiplier + BTN_SPACE)); 147 | _list.row = _numRows; 148 | _list.itemArrange(); 149 | } 150 | 151 | if (_body) 152 | { 153 | _body.y = stage.stageHeight - _body.height; 154 | } 155 | } 156 | 157 | private function checkPermissions():void 158 | { 159 | // first you need to make sure you have access to the Camera if you are on Android? 160 | var permissionState:int = PermissionCheck.check(PermissionCheck.SOURCE_CAMERA); 161 | 162 | if (permissionState == PermissionCheck.PERMISSION_UNKNOWN || permissionState == PermissionCheck.PERMISSION_DENIED) 163 | { 164 | PermissionCheck.request(PermissionCheck.SOURCE_CAMERA, onRequestResult); 165 | } 166 | else 167 | { 168 | init(); 169 | } 170 | 171 | function onRequestResult($obj:Object):void 172 | { 173 | if ($obj.state != PermissionCheck.PERMISSION_GRANTED) 174 | { 175 | C.log("You did not allow the app the required permissions!"); 176 | } 177 | else 178 | { 179 | init(); 180 | } 181 | } 182 | } 183 | 184 | private function init():void 185 | { 186 | // initialize the extension 187 | _ex = new Barcode(); 188 | _ex.addEventListener(BarcodeEvent.RESULT, onResult); 189 | _ex.addEventListener(BarcodeEvent.CANCEL, onCancel); 190 | 191 | if(OverrideAir.os == OverrideAir.ANDROID) 192 | { 193 | var btn0:MySprite = createBtn("warmup"); 194 | btn0.addEventListener(MouseEvent.CLICK, warmup); 195 | _list.add(btn0); 196 | } 197 | 198 | function warmup(e:MouseEvent):void 199 | { 200 | // to speed up the launch time on Android, you may call the warmup method when 201 | // it is appropriate in your application. This may be needed if you are using the 202 | // full version of AndroidSupport dependency. 203 | 204 | C.log("the first time you call the warmup method, your app will freeze for a few seconds..."); 205 | setTimeout(_ex.warmup,500); 206 | } 207 | 208 | var btn1:MySprite = createBtn("open Scanner"); 209 | btn1.addEventListener(MouseEvent.CLICK, open); 210 | _list.add(btn1); 211 | 212 | function open(e:MouseEvent):void 213 | { 214 | if (_ex.isSupported()) 215 | { 216 | C.log("Please wait..."); 217 | 218 | // TODO: Known bug on ios: the beep mp3 file must be in the same folder where the main Adobe Air .swf file is. 219 | 220 | 221 | 222 | // to read only the selected barcode types. use an array to read one or more barcodes 223 | //_ex.open([Barcode.QR], File.applicationDirectory.resolvePath("com_doitflash_barcode_beep.mp3"), true, "back to The Air APP! :D"); 224 | 225 | // to read all barcodes supported by the extension. read documentations to know which barcodes are supported. 226 | _ex.open(null, File.applicationDirectory.resolvePath("com_doitflash_barcode_beep.mp3"), true, "back to The Air APP! :D"); 227 | } 228 | else 229 | { 230 | C.log("isSupported: ", _ex.isSupported()); 231 | } 232 | } 233 | 234 | onResize(); 235 | } 236 | 237 | private function onCancel(e:BarcodeEvent):void 238 | { 239 | C.log("scan canceled") 240 | } 241 | 242 | private function onResult(e:BarcodeEvent):void 243 | { 244 | C.log("type is: ", e.param.type); 245 | C.log("data is: ", e.param.data); 246 | 247 | trace("type is: ", e.param.type); 248 | trace("data is: ", e.param.data); 249 | } 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | private function createBtn($str:String):MySprite 283 | { 284 | var sp:MySprite = new MySprite(); 285 | sp.addEventListener(MouseEvent.MOUSE_OVER, onOver); 286 | sp.addEventListener(MouseEvent.MOUSE_OUT, onOut); 287 | sp.addEventListener(MouseEvent.CLICK, onOut); 288 | sp.bgAlpha = 1; 289 | sp.bgColor = 0xDFE4FF; 290 | sp.drawBg(); 291 | sp.width = BTN_WIDTH * DeviceInfo.dpiScaleMultiplier; 292 | sp.height = BTN_HEIGHT * DeviceInfo.dpiScaleMultiplier; 293 | 294 | function onOver(e:MouseEvent):void 295 | { 296 | sp.bgAlpha = 1; 297 | sp.bgColor = 0xFFDB48; 298 | sp.drawBg(); 299 | } 300 | 301 | function onOut(e:MouseEvent):void 302 | { 303 | sp.bgAlpha = 1; 304 | sp.bgColor = 0xDFE4FF; 305 | sp.drawBg(); 306 | } 307 | 308 | var format:TextFormat = new TextFormat("Arimo", 16, 0x666666, null, null, null, null, null, TextFormatAlign.CENTER); 309 | 310 | var txt:TextField = new TextField(); 311 | txt.autoSize = TextFieldAutoSize.LEFT; 312 | txt.antiAliasType = AntiAliasType.ADVANCED; 313 | txt.mouseEnabled = false; 314 | txt.multiline = true; 315 | txt.wordWrap = true; 316 | txt.scaleX = txt.scaleY = DeviceInfo.dpiScaleMultiplier; 317 | txt.width = sp.width * (1 / DeviceInfo.dpiScaleMultiplier); 318 | txt.defaultTextFormat = format; 319 | txt.text = $str; 320 | 321 | txt.y = sp.height - txt.height >> 1; 322 | sp.addChild(txt); 323 | 324 | return sp; 325 | } 326 | } 327 | 328 | } -------------------------------------------------------------------------------- /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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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 | } -------------------------------------------------------------------------------- /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/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/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 | -------------------------------------------------------------------------------- /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/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/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/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/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/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/src/com/luaye/console/view/GraphingPanel.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.Shape; 30 | import flash.events.Event; 31 | import flash.events.TextEvent; 32 | import flash.text.TextField; 33 | 34 | public class GraphingPanel extends AbstractPanel { 35 | private var _interests:Array = []; 36 | private var _updatedFrame:uint = 0; 37 | private var _drawnFrame:uint = 0; 38 | private var _needRedraw:Boolean; 39 | private var _isRunning:Boolean; 40 | protected var _history:Array = []; 41 | // 42 | protected var fixed:Boolean; 43 | protected var graph:Shape; 44 | protected var lowTxt:TextField; 45 | protected var highTxt:TextField; 46 | protected var keyTxt:TextField; 47 | // 48 | public var updateEvery:uint = 1; 49 | public var drawEvery:uint = 1; 50 | public var lowest:Number; 51 | public var highest:Number; 52 | public var averaging:uint; 53 | public var inverse:Boolean; 54 | // 55 | public function GraphingPanel(m:Console, W:int = 0, H:int = 0, resizable:Boolean = true) { 56 | super(m); 57 | registerDragger(bg); 58 | minimumHeight = 26; 59 | // 60 | lowTxt = new TextField(); 61 | lowTxt.name = "lowestField"; 62 | lowTxt.mouseEnabled = false; 63 | lowTxt.styleSheet = style.css; 64 | lowTxt.height = 14; 65 | addChild(lowTxt); 66 | highTxt = new TextField(); 67 | highTxt.name = "highestField"; 68 | highTxt.mouseEnabled = false; 69 | highTxt.styleSheet = style.css; 70 | highTxt.height = 14; 71 | highTxt.y = 6; 72 | addChild(highTxt); 73 | // 74 | keyTxt = new TextField(); 75 | keyTxt.name = "menuField"; 76 | keyTxt.styleSheet = style.css; 77 | keyTxt.height = 16; 78 | keyTxt.y = -3; 79 | keyTxt.addEventListener(TextEvent.LINK, linkHandler, false, 0, true); 80 | registerRollOverTextField(keyTxt); 81 | keyTxt.addEventListener(AbstractPanel.TEXT_LINK, onMenuRollOver, false, 0, true); 82 | registerDragger(keyTxt); // so that we can still drag from textfield 83 | addChild(keyTxt); 84 | // 85 | graph = new Shape(); 86 | graph.name = "graph"; 87 | graph.y = 10; 88 | addChild(graph); 89 | // 90 | init(W?W:100,H?H:80,resizable); 91 | } 92 | 93 | public function get rand():Number{ 94 | return Math.random(); 95 | } 96 | public function add(obj:Object, prop:String, col:Number = -1, key:String=null):void{ 97 | var cur:Number = obj[prop]; 98 | if(!isNaN(cur)){ 99 | if(isNaN(lowest)) lowest = cur; 100 | if(isNaN(highest)) highest = cur; 101 | } 102 | if(isNaN(col) || col<0) col = Math.random()*0xFFFFFF; 103 | if(key == null) key = prop; 104 | _interests.push(new Interest(obj, prop, col, key)); 105 | updateKeyText(); 106 | // 107 | start(); 108 | } 109 | public function remove(obj:Object = null, prop:String = null):void{ 110 | for(var X:String in _interests){ 111 | var interest:Interest = _interests[X]; 112 | if(interest && (interest.obj == null || interest.obj == obj) && (interest.prop == null || interest.prop == prop)){ 113 | _interests.splice(int(X), 1); 114 | } 115 | } 116 | if(_interests.length==0){ 117 | close(); 118 | }else{ 119 | updateKeyText(); 120 | } 121 | } 122 | /*public function mark(col:Number = -1, v:Number = NaN):void{ 123 | if(_history.length==0) return; 124 | var interests:Array = _history[_history.length-1]; 125 | interests.push([col, v]); 126 | }*/ 127 | public function start():void{ 128 | _isRunning = true; 129 | // Note that if it has already started, it won't add another listener on top. 130 | addEventListener(Event.ENTER_FRAME, onFrame, false, 0, true); 131 | } 132 | public function stop():void { 133 | _isRunning = false; 134 | removeEventListener(Event.ENTER_FRAME, onFrame); 135 | } 136 | public function get numInterests():int{ 137 | return _interests.length; 138 | } 139 | override public function close():void { 140 | stop(); 141 | super.close(); 142 | } 143 | public function reset():void{ 144 | if(!fixed){ 145 | lowest = NaN; 146 | highest = NaN; 147 | } 148 | _history = []; 149 | graph.graphics.clear(); 150 | } 151 | public function get running():Boolean { 152 | return _isRunning; 153 | } 154 | public function fixRange(low:Number,high:Number):void{ 155 | if(isNaN(low) || isNaN(high)) { 156 | fixed = false; 157 | return; 158 | } 159 | fixed = true; 160 | lowest = low; 161 | highest = high; 162 | } 163 | public function set showKeyText(b:Boolean):void{ 164 | keyTxt.visible = b; 165 | } 166 | public function get showKeyText():Boolean{ 167 | return keyTxt.visible; 168 | } 169 | public function set showBoundsText(b:Boolean):void{ 170 | lowTxt.visible = b; 171 | highTxt.visible = b; 172 | } 173 | public function get showBoundsText():Boolean{ 174 | return lowTxt.visible; 175 | } 176 | override public function set height(n:Number):void{ 177 | super.height = n; 178 | lowTxt.y = n-13; 179 | _needRedraw = true; 180 | } 181 | override public function set width(n:Number):void{ 182 | super.width = n; 183 | lowTxt.width = n; 184 | highTxt.width = n; 185 | keyTxt.width = n; 186 | graphics.clear(); 187 | graphics.lineStyle(1,0xAAAAAA, 1); 188 | graphics.moveTo(0, graph.y); 189 | graphics.lineTo(n, graph.y); 190 | _needRedraw = true; 191 | } 192 | protected function getCurrentOf(i:int):Number{ 193 | var values:Array = _history[_history.length-1]; 194 | return values?values[i]:0; 195 | } 196 | protected function getAverageOf(i:int):Number{ 197 | var interest:Interest = _interests[i]; 198 | return interest?interest.avg:0; 199 | } 200 | // 201 | // 202 | // 203 | protected function onFrame(e:Event):Boolean{ 204 | var ok:Boolean = (master.visible && master.enabled && !master.paused); 205 | if(ok) { 206 | updateData(); 207 | } 208 | if(ok || _needRedraw){ 209 | drawGraph(); 210 | } 211 | return ok; 212 | } 213 | protected function updateData():void{ 214 | _updatedFrame++; 215 | if(_updatedFrame < updateEvery) return; 216 | _updatedFrame= 0; 217 | var values:Array = []; 218 | for each(var interest:Interest in _interests){ 219 | var obj:Object = interest.obj; 220 | if(obj){ 221 | var v:Number = obj[interest.prop]; 222 | if(isNaN(v)){ 223 | v = 0; 224 | }else{ 225 | if(isNaN(lowest)) lowest = v; 226 | if(isNaN(highest)) highest = v; 227 | } 228 | values.push(v); 229 | if(averaging>0){ 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/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/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;i"; 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/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/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/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/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/luaye/utils/bitmapMovieClip/sample/example.fla: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/AIR/src/com/luaye/utils/bitmapMovieClip/sample/example.fla -------------------------------------------------------------------------------- /AIR/src/com/luaye/utils/bitmapMovieClip/sample/example.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/AIR/src/com/luaye/utils/bitmapMovieClip/sample/example.swf -------------------------------------------------------------------------------- /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/thread/link.txt: -------------------------------------------------------------------------------- 1 | http://www.luaye.com/blog/index.php?action=read&id=58 -------------------------------------------------------------------------------- /ChangeLog.md: -------------------------------------------------------------------------------- 1 | Barcode Scanner Adobe AIR Native Extension 2 | 3 | *Aug 04, 2020 - v5.0.0* 4 | - Upgrade dependencies to the latest version. 5 | - Fixed and improve some minor issues and refactor native codes. 6 | 7 | *Apr 04, 2020 - V4.0.1* 8 | - Add androidx libraries instead of android support 9 | 10 | *Aug 02, 2019 - V3.4.71* 11 | * Added support for Android 64-bit 12 | * Removed **.os** property, use `OverrideAir.os` instead. 13 | 14 | *Nov 17, 2018 - V3.4.7* 15 | * Works with OverrideAir ANE V5.6.1 or higher 16 | * Works with ANELAB V1.1.26 or higher 17 | 18 | *Sep 10, 2018 - 3.4.6* 19 | * Removed androidSupport dependeny. 20 | 21 | *Feb 7, 2018 - 3.4.5* 22 | * Fixed [issue 53](https://github.com/myflashlab/barcode-ANE/issues/53) 23 | 24 | *Dec 15, 2017 - 3.4.4* 25 | * Optimized for [ANE-LAB software](https://github.com/myflashlab/ANE-LAB/). 26 | 27 | *Aug 24, 2017 - 3.4.0* 28 | * Updated to the latest version of zxing library. 29 | * Added method `warmup()` for Android to speedup the camera launch time if you are using the full version of the [androidSupport](https://github.com/myflashlab/common-dependencies-ANE/tree/master/androidSupport) 30 | 31 | *Mar 17, 2017 - 3.3.0* 32 | * Fixed [issue 34](https://github.com/myflashlab/barcode-ANE/issues/34) 33 | * Updated with the new OverrideAir ANE. 34 | * Even if you are building for iOS only, you still need to add the OverrideAir dependency. 35 | 36 | *Nov 11, 2016 - 3.2.0* 37 | * Optimized for Android manual permissions if you are targeting AIR SDK 24+ 38 | * From now on, this ANE will depend on androidSupport.ane and overrideAir.ane on the Android side 39 | * 40 | 41 | *Mar 28, 2016 - 3.1.1* 42 | * Fixed a bug related to wrongly showing a broken menu on Android devices with a hardware menu key. 43 | 44 | 45 | *Jan 20, 2016 - 3.1.0* 46 | * 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 47 | 48 | 49 | *Dec 29, 2015 - 3.0.0* 50 | * added optional beep sound and vibration when a barcode is detected 51 | * Added support for almost all barcodes including: UPCE, CODE39, EAN13, EAN8, CODE128, PDF417, QR, AZTEC, ITF14, DATAMATRIX 52 | 53 | 54 | *Dec 20, 2015 - 2.9.1* 55 | * minor bug fixes 56 | 57 | 58 | *Nov 02, 2015 - V2.9* 59 | * doitflash devs merged into MyFLashLab Team. 60 | 61 | 62 | *May 16, 2015 - V2.1* 63 | * removed android-support-v4.jar dependency 64 | 65 | 66 | *Jan 28, 2015 - V2.0* 67 | * added support for iOS devices including 64-bit arch 68 | 69 | 70 | *Mar 03, 2013 - V1.1* 71 | * there was a bug when compiling with Flex SDK 4.6 which is now fixed 72 | 73 | 74 | *Jan 31, 2013 - V1.0* 75 | * beginning of the journey! 76 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Barcode ANE (Android+iOS) 2 | This ANE enables AS3 AIR developers, to easily use the native camera on device and scan for almost all different barcodes and get the result to their AIR project. 3 | 4 | ## Supported barcodes: 5 | * UPCE 6 | * CODE39 7 | * EAN13 8 | * EAN8 9 | * CODE128 10 | * PDF417 11 | * QR 12 | * AZTEC 13 | * ITF14 14 | * DATAMATRIX 15 | 16 | [find the latest **asdoc** for this ANE here.](http://myflashlab.github.io/asdoc/com/myflashlab/air/extensions/barcode/package-detail.html) 17 | 18 | # AIR Usage 19 | For the complete AS3 code usage, see the [demo project here](https://github.com/myflashlab/barcode-ANE/blob/master/AIR/src/MainFinal.as). 20 | 21 | ```actionscript 22 | import com.myflashlab.air.extensions.barcode.*; 23 | 24 | var _ex:Barcode = new Barcode(); 25 | _ex.addEventListener(BarcodeEvent.RESULT, onResult); 26 | _ex.addEventListener(BarcodeEvent.CANCEL, onCancel); 27 | 28 | if(OverrideAir.os == OverrideAir.ANDROID) 29 | { 30 | // to speed up the launch time on Android, you may call the warmup method when 31 | // it is appropriate in your application. This may be needed if you are using the 32 | // full version of AndroidSupport dependency. 33 | // the first time you call the warmup method, your app will freeze for a few seconds... 34 | _ex.warmup(); 35 | } 36 | 37 | if (_ex.isSupported()) 38 | { 39 | trace("Please wait..."); 40 | 41 | // to read only the selected barcode types. use an array to read one or more barcodes 42 | //_ex.open([Barcode.QR], File.applicationDirectory.resolvePath("com_doitflash_barcode_beep.mp3"), true, "Cancel"); 43 | 44 | // to read all barcodes supported by the extension. read documentations to know which barcodes are supported. 45 | _ex.open(null, File.applicationDirectory.resolvePath("com_doitflash_barcode_beep.mp3"), true, "Cancel"); 46 | } 47 | else 48 | { 49 | trace("isSupported: ", _ex.isSupported()); 50 | } 51 | 52 | function onCancel(e:BarcodeEvent):void 53 | { 54 | trace("scan canceled") 55 | } 56 | 57 | function onResult(e:BarcodeEvent):void 58 | { 59 | trace("type is: ", e.param.type) 60 | trace("data is: ", e.param.data); 61 | } 62 | ``` 63 | 64 | # AIR .xml manifest 65 | ```xml 66 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 109 | 110 | 111 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 126 | 127 | 128 | 129 | MinimumOSVersion 130 | 10.0 131 | 132 | 133 | NSCameraUsageDescription 134 | My description about why I need this feature in my app 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 146 | 147 | 148 | com.myflashlab.air.extensions.barcode 149 | 150 | 151 | com.myflashlab.air.extensions.permissionCheck 152 | 153 | 154 | com.myflashlab.air.extensions.dependency.overrideAir 155 | com.myflashlab.air.extensions.dependency.androidx.core 156 | 157 | 158 | ``` 159 | 160 | # Requirements 161 | * This ANE is dependent on **permissionCheck**. Download it from [here](http://www.myflashlabs.com/product/native-access-permission-check-settings-menu-air-native-extension/). 162 | * AIR SDK 30+ 163 | * Android 19+ 164 | * iOS 10.0+ 165 | 166 | # Permissions 167 | Below are the list of Permissions this ANE might require. Check out the demo project available at this repository to see how we have used the [PermissionCheck ANE](http://www.myflashlabs.com/product/native-access-permission-check-settings-menu-air-native-extension/) to ask for the permissions. 168 | 169 | Necessary | Optional 170 | --------------------------- | --------------------------- 171 | [SOURCE_CAMERA](https://myflashlab.github.io/asdoc/com/myflashlab/air/extensions/nativePermissions/PermissionCheck.html#SOURCE_CAMERA) | NONE 172 | 173 | # Commercial Version 174 | https://www.myflashlabs.com/product/qr-code-ane-adobe-air-native-extension/ 175 | 176 | [![Barcode code scanner ANE](https://www.myflashlabs.com/wp-content/uploads/2015/11/product_adobe-air-ane-extension-qr-code-2018-595x738.jpg)](https://www.myflashlabs.com/product/qr-code-ane-adobe-air-native-extension/) 177 | 178 | # Tutorials 179 | [How to embed ANEs into **FlashBuilder**, **FlashCC** and **FlashDevelop**](https://www.youtube.com/watch?v=Oubsb_3F3ec&list=PL_mmSjScdnxnSDTMYb1iDX4LemhIJrt1O) 180 | 181 | # Premium Support # 182 | [![Premium Support package](https://www.myflashlabs.com/wp-content/uploads/2016/06/professional-support.jpg)](https://www.myflashlabs.com/product/myflashlabs-support/) 183 | 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/). -------------------------------------------------------------------------------- /barcodes/Aztec.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/barcodes/Aztec.jpg -------------------------------------------------------------------------------- /barcodes/CODE128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/barcodes/CODE128.jpg -------------------------------------------------------------------------------- /barcodes/CODE39.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/barcodes/CODE39.jpg -------------------------------------------------------------------------------- /barcodes/EAN13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/barcodes/EAN13.jpg -------------------------------------------------------------------------------- /barcodes/EAN8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/barcodes/EAN8.jpg -------------------------------------------------------------------------------- /barcodes/ITF14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/barcodes/ITF14.jpg -------------------------------------------------------------------------------- /barcodes/PDF417.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/barcodes/PDF417.jpg -------------------------------------------------------------------------------- /barcodes/UPCE.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/barcodes/UPCE.jpg -------------------------------------------------------------------------------- /barcodes/dataMatrix.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/barcodes/dataMatrix.jpg -------------------------------------------------------------------------------- /barcodes/qr.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/myflashlab/barcode-ANE/0794de90ae92d30d1240e7e0549290fc347c1aaa/barcodes/qr.jpg --------------------------------------------------------------------------------