├── 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 |
18 |
19 |
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 = " "+ 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)+" ";
57 | }else{
58 | keyTxt.htmlText = "no fps input ";
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 += " | ";
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 ";
64 | }else{
65 | keyTxt.htmlText = "no mem input ";
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; i";
101 | for(var j:uint = i;j>0;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 += " 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 | [](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 | [](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
--------------------------------------------------------------------------------