├── AIR
├── AIR.iml
├── Main-app.xml
├── assets
│ └── testVideoPlayerSurface.mp4
├── 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
│ ├── Main.as
│ ├── assets
│ ├── design.fla
│ ├── design.swc
│ └── design.swf
│ └── 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
/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 |
--------------------------------------------------------------------------------
/AIR/Main-app.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | com.doitflash.exVideoPlayerSurface
4 | 3.4.41
5 | mobileDevice
6 | exVideoPlayerSurface
7 | Surface Player
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 | ]]>
33 |
34 |
35 |
36 | MinimumOSVersion
37 | 10.0
38 |
39 | UIStatusBarStyle
40 | UIStatusBarStyleBlackOpaque
41 |
42 | UIRequiresPersistentWiFi
43 | NO
44 |
45 | UIFileSharingEnabled
46 | YES
47 |
48 | UIPrerenderedIcon
49 |
50 |
51 | UIDeviceFamily
52 |
53 | 1
54 | 2
55 | ]]>
56 |
57 | high
58 |
59 |
60 | exVideoPlayerSurface
61 | ex.swf
62 | true
63 | true
64 | true
65 |
66 | gpu
67 |
68 |
69 | standard
70 |
71 |
72 | icons/icon_36.png
73 | icons/icon_48.png
74 | icons/icon_72.png
75 | icons/icon_96.png
76 | icons/icon_144.png
77 | icons/icon_192.png
78 | icons/icon_512.png
79 | icons/icon_1024.png
80 |
81 |
82 |
83 | com.myflashlab.air.extensions.videoPlayerSurface
84 |
85 |
86 | com.myflashlab.air.extensions.dependency.overrideAir
87 |
88 |
89 |
90 |
--------------------------------------------------------------------------------
/AIR/assets/testVideoPlayerSurface.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myflashlab/surfaceVideoPlayer-ANE/d3253d9eed0593bad3a102419ce8c486751674ec/AIR/assets/testVideoPlayerSurface.mp4
--------------------------------------------------------------------------------
/AIR/icons/Assets.car:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myflashlab/surfaceVideoPlayer-ANE/d3253d9eed0593bad3a102419ce8c486751674ec/AIR/icons/Assets.car
--------------------------------------------------------------------------------
/AIR/icons/icons/icon_1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myflashlab/surfaceVideoPlayer-ANE/d3253d9eed0593bad3a102419ce8c486751674ec/AIR/icons/icons/icon_1024.png
--------------------------------------------------------------------------------
/AIR/icons/icons/icon_144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myflashlab/surfaceVideoPlayer-ANE/d3253d9eed0593bad3a102419ce8c486751674ec/AIR/icons/icons/icon_144.png
--------------------------------------------------------------------------------
/AIR/icons/icons/icon_192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myflashlab/surfaceVideoPlayer-ANE/d3253d9eed0593bad3a102419ce8c486751674ec/AIR/icons/icons/icon_192.png
--------------------------------------------------------------------------------
/AIR/icons/icons/icon_36.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myflashlab/surfaceVideoPlayer-ANE/d3253d9eed0593bad3a102419ce8c486751674ec/AIR/icons/icons/icon_36.png
--------------------------------------------------------------------------------
/AIR/icons/icons/icon_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myflashlab/surfaceVideoPlayer-ANE/d3253d9eed0593bad3a102419ce8c486751674ec/AIR/icons/icons/icon_48.png
--------------------------------------------------------------------------------
/AIR/icons/icons/icon_512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myflashlab/surfaceVideoPlayer-ANE/d3253d9eed0593bad3a102419ce8c486751674ec/AIR/icons/icons/icon_512.png
--------------------------------------------------------------------------------
/AIR/icons/icons/icon_72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myflashlab/surfaceVideoPlayer-ANE/d3253d9eed0593bad3a102419ce8c486751674ec/AIR/icons/icons/icon_72.png
--------------------------------------------------------------------------------
/AIR/icons/icons/icon_96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myflashlab/surfaceVideoPlayer-ANE/d3253d9eed0593bad3a102419ce8c486751674ec/AIR/icons/icons/icon_96.png
--------------------------------------------------------------------------------
/AIR/lib/README.md:
--------------------------------------------------------------------------------
1 | Copy the purchased [videoPlayerSurface.ane](https://www.myflashlabs.com/product/surface-embedded-video-player-ane/) here along with the following dependency ANEs:
2 |
3 | 1. overrideAir.ane
4 |
5 | Download dependency ANEs from here: https://github.com/myflashlab/common-dependencies-ANE
--------------------------------------------------------------------------------
/AIR/src/Main.as:
--------------------------------------------------------------------------------
1 | package
2 | {
3 | import flash.desktop.NativeApplication;
4 | import flash.desktop.SystemIdleMode;
5 | import flash.display.BitmapData;
6 | import flash.display.Sprite;
7 | import flash.display.StageAlign;
8 | import flash.display.StageScaleMode;
9 | import flash.events.Event;
10 | import flash.events.MouseEvent;
11 | import flash.geom.Point;
12 | import flash.text.AntiAliasType;
13 | import flash.text.TextField;
14 | import flash.text.TextFieldAutoSize;
15 | import flash.text.TextFormat;
16 | import flash.text.TextFormatAlign;
17 | import flash.ui.Multitouch;
18 | import flash.ui.MultitouchInputMode;
19 | import flash.ui.Keyboard;
20 | import flash.events.KeyboardEvent;
21 | import flash.events.InvokeEvent;
22 | import flash.filesystem.File;
23 | import com.doitflash.text.modules.MySprite;
24 | import com.doitflash.starling.utils.list.List;
25 | import com.doitflash.consts.Direction;
26 | import com.doitflash.consts.Orientation;
27 | import com.doitflash.consts.Easing;
28 | import flash.utils.Endian;
29 | import com.luaye.console.C;
30 | import com.doitflash.mobileProject.commonCpuSrc.DeviceInfo;
31 | import flash.utils.setTimeout;
32 |
33 | import com.myflashlab.air.extensions.player.surface.*;
34 | import com.myflashlab.air.extensions.dependency.OverrideAir;
35 |
36 | /**
37 | * ...
38 | * @author Hadi Tavakoli - 4/28/2015 8:57 AM
39 | */
40 | public class Main extends Sprite
41 | {
42 | private var _ex:SurfacePlayer;
43 | private var dragMe:MySprite;
44 | private var _videoWidth:int;
45 | private var _videoHeigh:int;
46 |
47 | private const BTN_WIDTH:Number = 110;
48 | private const BTN_HEIGHT:Number = 60;
49 | private const BTN_SPACE:Number = 2;
50 | private var _txt:TextField;
51 | private var _body:Sprite;
52 | private var _list:List;
53 | private var _numRows:int = 1;
54 |
55 | public function Main():void
56 | {
57 | Multitouch.inputMode = MultitouchInputMode.GESTURE;
58 | NativeApplication.nativeApplication.addEventListener(Event.ACTIVATE, handleActivate, false, 0, true);
59 | NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, handleDeactivate, false, 0, true);
60 | NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvoke, false, 0, true);
61 | NativeApplication.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN, handleKeys, false, 0, true);
62 |
63 | stage.addEventListener(Event.RESIZE, onResize);
64 | stage.scaleMode = StageScaleMode.NO_SCALE;
65 | stage.align = StageAlign.TOP_LEFT;
66 |
67 | C.startOnStage(this, "`");
68 | C.commandLine = false;
69 | C.commandLineAllowed = false;
70 | C.x = 100;
71 | C.width = 500;
72 | C.height = 250;
73 | C.strongRef = true;
74 | C.visible = false;
75 | C.scaleX = C.scaleY = DeviceInfo.dpiScaleMultiplier;
76 |
77 | _txt = new TextField();
78 | _txt.autoSize = TextFieldAutoSize.LEFT;
79 | _txt.antiAliasType = AntiAliasType.ADVANCED;
80 | _txt.multiline = true;
81 | _txt.wordWrap = true;
82 | _txt.embedFonts = false;
83 | _txt.htmlText = "Surface video player V" + SurfacePlayer.VERSION + " for Adobe Air";
84 | _txt.scaleX = _txt.scaleY = DeviceInfo.dpiScaleMultiplier;
85 | this.addChild(_txt);
86 |
87 | _body = new Sprite();
88 | this.addChild(_body);
89 |
90 | _list = new List();
91 | _list.holder = _body;
92 | _list.itemsHolder = new Sprite();
93 | _list.orientation = Orientation.VERTICAL;
94 | _list.hDirection = Direction.LEFT_TO_RIGHT;
95 | _list.vDirection = Direction.TOP_TO_BOTTOM;
96 | _list.space = BTN_SPACE;
97 |
98 | C.log("iOS is crazy with understanding stageWidth and stageHeight, you already now that :)");
99 | C.log("So, we should wait a couple of seconds before initializing the ANE to make sure the stage dimention is stable before passing it through the ANE.");
100 | setTimeout(init, 2000);
101 | }
102 |
103 | private function onInvoke(e:InvokeEvent):void
104 | {
105 | NativeApplication.nativeApplication.removeEventListener(InvokeEvent.INVOKE, onInvoke);
106 | }
107 |
108 | private function handleActivate(e:Event):void
109 | {
110 | NativeApplication.nativeApplication.systemIdleMode = SystemIdleMode.KEEP_AWAKE;
111 | }
112 |
113 | private function handleDeactivate(e:Event):void
114 | {
115 | NativeApplication.nativeApplication.systemIdleMode = SystemIdleMode.NORMAL;
116 | }
117 |
118 | private function handleKeys(e:KeyboardEvent):void
119 | {
120 | if (e.keyCode == Keyboard.BACK)
121 | {
122 | e.preventDefault();
123 |
124 | // when closing the app, we'll dispose the extension also
125 | if (_ex) _ex.dispose();
126 |
127 | NativeApplication.nativeApplication.exit();
128 | }
129 | }
130 |
131 | private function onResize(e:*=null):void
132 | {
133 | if (_txt)
134 | {
135 | _txt.width = stage.stageWidth * (1 / DeviceInfo.dpiScaleMultiplier);
136 |
137 | C.x = 0;
138 | C.y = _txt.y + _txt.height + 0;
139 | C.width = stage.stageWidth * (1 / DeviceInfo.dpiScaleMultiplier);
140 | C.height = 300 * (1 / DeviceInfo.dpiScaleMultiplier);
141 | }
142 |
143 | if (_list)
144 | {
145 | _numRows = Math.floor(stage.stageWidth / (BTN_WIDTH * DeviceInfo.dpiScaleMultiplier + BTN_SPACE));
146 | _list.row = _numRows;
147 | _list.itemArrange();
148 | }
149 |
150 | if (_body)
151 | {
152 | _body.y = stage.stageHeight - _body.height;
153 | }
154 |
155 |
156 | if (_ex)
157 | {
158 | _videoWidth = stage.stageWidth * 0.5;
159 | _videoHeigh = _videoWidth * 0.75;
160 | var x:int = stage.stageWidth * 0.5 - _videoWidth * 0.5;
161 | var y:int = stage.stageHeight * 0.5 - _videoHeigh * 0.5;
162 |
163 | if (dragMe)
164 | {
165 | dragMe.x = x + _videoWidth;
166 | dragMe.y = y + _videoHeigh;
167 | }
168 |
169 | _ex.setPosition(x, y, _videoWidth, _videoHeigh, true); // ratio can be true or false
170 | }
171 | }
172 |
173 | private function init():void
174 | {
175 | // Remove OverrideAir debugger in production builds
176 | OverrideAir.enableDebugger(function ($ane:String, $class:String, $msg:String):void
177 | {
178 | trace($ane+" ("+$class+") "+$msg);
179 | });
180 |
181 | // initialize the extension
182 | _ex = new SurfacePlayer(this.stage); // make sure the stage is available.
183 | _ex.addEventListener(SurfacePlayerEvent.ON_BACK_CLICKED, onBackClickedWhenSurfacePlayerIsAvailable);
184 | _ex.addEventListener(SurfacePlayerEvent.ON_COMPLETION_LISTENER, onVideoPlaybackCompleted);
185 | _ex.addEventListener(SurfacePlayerEvent.ON_FILE_AVAILABILITY, onTargetVideoAvailability);
186 | _ex.addEventListener(SurfacePlayerEvent.ON_MEDIA_STATUS_CHANGED, onMediaStatusChanged);
187 |
188 | // listeners for touch events over the native window.
189 | _ex.addEventListener(SurfacePlayerEvent.ON_TOUCH_DOWN, onNativeTouchDown);
190 | _ex.addEventListener(SurfacePlayerEvent.ON_TOUCH_MOVE, onNativeTouchMove);
191 | _ex.addEventListener(SurfacePlayerEvent.ON_TOUCH_UP, onNativeTouchUp);
192 |
193 | /**
194 | * NOTICE: you can't play a video from File.applicationDirectory because AdobeAir is compressing these files on Android
195 | * (we're not sure if this is a bug or Adobe is doing this on purpose. anyway, you can use applicationStorageDirectory instead)
196 | *
197 | * So you have to copy it to documentsDirectory OR applicationStorageDirectory
198 | */
199 | var src:File = File.applicationDirectory.resolvePath("testVideoPlayerSurface.mp4");
200 |
201 | //var dis:File = File.documentsDirectory.resolvePath(src.name);
202 | var dis:File = File.applicationStorageDirectory.resolvePath(src.name);
203 |
204 | trace("a demo video is copied to applicationStorageDirectory so we can play it back!");
205 | if (!dis.exists) src.copyTo(dis);
206 |
207 | trace("is supported? " + _ex.isSupported());
208 |
209 | _videoWidth = stage.stageWidth * 0.5;
210 | _videoHeigh = _videoWidth * 0.75;
211 | var x:int = stage.stageWidth * 0.5 - _videoWidth * 0.5;
212 | var y:int = stage.stageHeight * 0.5 - _videoHeigh * 0.5;
213 |
214 | // ratio can be true or false (you can change the position and dimension later using the setPosition command)
215 | _ex.init(x, y, _videoWidth, _videoHeigh, true);
216 |
217 | /**
218 | * choose SurfaceVideoLocation.ON_APP if your video is in File.applicationStorageDirectory
219 | * OR choose SurfaceVideoLocation.ON_SD_CARD if your video is in File.documentsDirectory
220 | *
221 | * NOTICE 1: When saying SurfaceVideoLocation.ON_SD_CARD we do NOT mean the actual mountable sdCard. we just mean File.documentsDirectory
222 | * FYI, on iOS, File.applicationStorageDirectory and File.documentsDirectory locations are basically the same!
223 | */
224 | _ex.attachVideo(dis, SurfaceVideoLocation.ON_APP);
225 |
226 | // create the dragMe button!
227 | dragMe = new MySprite();
228 | dragMe.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
229 | dragMe.width = 100;
230 | dragMe.height = 100;
231 | dragMe.bgColor = 0xFF9900;
232 | dragMe.bgAlpha = 1;
233 | dragMe.bgBottomLeftRadius = 10;
234 | dragMe.bgBottomRightRadius = 10;
235 | dragMe.bgTopRightRadius = 10;
236 | dragMe.drawBg();
237 | dragMe.x = x + _videoWidth;
238 | dragMe.y = y + _videoHeigh;
239 |
240 | var dragtxt:TextField = new TextField();
241 | dragtxt.selectable = false;
242 | dragtxt.mouseEnabled = false;
243 | dragtxt.autoSize = TextFieldAutoSize.LEFT;
244 | dragtxt.wordWrap = true;
245 | dragtxt.multiline = true;
246 | dragtxt.htmlText = "
DRAG ME
";
247 | dragtxt.width = dragMe.width;
248 | dragtxt.y = dragMe.height - dragtxt.height >> 1;
249 | dragMe.addChild(dragtxt);
250 |
251 | this.addChild(dragMe);
252 |
253 |
254 | /*var btn02:MySprite = createBtn("detachVideo!");
255 | btn02.addEventListener(MouseEvent.CLICK, detachVideo);
256 | _list.add(btn02);
257 |
258 | function detachVideo(e:MouseEvent):void
259 | {
260 | _ex.detachVideo();
261 | }*/
262 |
263 | var btn3:MySprite = createBtn("play");
264 | btn3.addEventListener(MouseEvent.CLICK, play);
265 | _list.add(btn3);
266 |
267 | function play(e:MouseEvent):void
268 | {
269 | _ex.play();
270 | }
271 |
272 | var btn5:MySprite = createBtn("pause");
273 | btn5.addEventListener(MouseEvent.CLICK, pause);
274 | _list.add(btn5);
275 |
276 | function pause(e:MouseEvent):void
277 | {
278 | _ex.pause();
279 | trace("pause at: " + _ex.position);
280 | trace("total length: " + _ex.duration);
281 | }
282 |
283 | var btn6:MySprite = createBtn("stop");
284 | btn6.addEventListener(MouseEvent.CLICK, stop);
285 | _list.add(btn6);
286 |
287 | function stop(e:MouseEvent):void
288 | {
289 | _ex.stop()
290 | }
291 |
292 | var btn7:MySprite = createBtn("seekTo (18619) miliSeconds");
293 | btn7.addEventListener(MouseEvent.CLICK, seekTo);
294 | _list.add(btn7);
295 |
296 | function seekTo(e:MouseEvent):void
297 | {
298 | _ex.seekTo(18619);
299 | }
300 |
301 | /*var btn10:MySprite = createBtn("is playing?");
302 | btn10.addEventListener(MouseEvent.CLICK, isPlaying);
303 | _list.add(btn10);
304 |
305 | function isPlaying(e:MouseEvent):void
306 | {
307 | trace("is playing? " + _ex.isPlaying);
308 | }*/
309 |
310 | var btn11:MySprite = createBtn("decrease volume");
311 | btn11.addEventListener(MouseEvent.CLICK, setVolumeLow);
312 | _list.add(btn11);
313 |
314 | function setVolumeLow(e:MouseEvent):void
315 | {
316 | _ex.volume = 5; // set volume range = 0, 100
317 | trace("volume = " + _ex.volume);
318 | }
319 |
320 | var btn12:MySprite = createBtn("increase volume");
321 | btn12.addEventListener(MouseEvent.CLICK, setVolumeHigh);
322 | _list.add(btn12);
323 |
324 | function setVolumeHigh(e:MouseEvent):void
325 | {
326 | _ex.volume = 100; // set volume range = 0, 100
327 | trace("volume = " + _ex.volume);
328 | }
329 |
330 | onResize();
331 | }
332 |
333 | private function onBackClickedWhenSurfacePlayerIsAvailable(e:SurfacePlayerEvent):void
334 | {
335 | _ex.dispose();
336 | NativeApplication.nativeApplication.exit();
337 | }
338 |
339 | private function onVideoPlaybackCompleted(e:SurfacePlayerEvent):void
340 | {
341 | trace("video playback finished");
342 | }
343 |
344 | private function onTargetVideoAvailability(e:SurfacePlayerEvent):void
345 | {
346 | // as soon as you attach a video to the extension
347 | // it will check if the target is available. you can play the
348 | // video only if the file is availble of course!
349 |
350 | if (e.param.isAvailable) trace("video file is availble :)");
351 | else trace("WRONG video file address!!! you can't play the video! " + e.param.address);
352 | }
353 |
354 | private function onMediaStatusChanged(e:SurfacePlayerEvent):void
355 | {
356 | trace(e.param);
357 | }
358 |
359 | private function onDown(e:MouseEvent):void
360 | {
361 | dragMe.addEventListener(MouseEvent.MOUSE_MOVE, onMove);
362 | stage.addEventListener(MouseEvent.MOUSE_UP, onUp);
363 | dragMe.startDrag();
364 | }
365 |
366 | private function onMove(e:MouseEvent):void
367 | {
368 | _ex.setPosition(dragMe.x - _videoWidth, dragMe.y - _videoHeigh, _videoWidth, _videoHeigh, true);
369 | }
370 |
371 | private function onUp(e:MouseEvent):void
372 | {
373 | dragMe.removeEventListener(MouseEvent.MOUSE_MOVE, onMove);
374 | stage.removeEventListener(MouseEvent.MOUSE_UP, onUp);
375 | dragMe.stopDrag();
376 | }
377 |
378 | private function onNativeTouchDown(e:SurfacePlayerEvent):void
379 | {
380 | var globalPosition:Point = e.param.global;
381 | var localPosition:Point = e.param.local;
382 |
383 | trace("----------------");
384 | trace("onNativeTouchDown");
385 | trace("global Position = " + globalPosition.x + "," + globalPosition.y);
386 | trace("local Position = " + localPosition.x + "," + localPosition.y);
387 | trace("----------------");
388 | }
389 |
390 | private function onNativeTouchMove(e:SurfacePlayerEvent):void
391 | {
392 | var globalPosition:Point = e.param.global;
393 | var localPosition:Point = e.param.local;
394 |
395 | trace("----------------");
396 | trace("onNativeTouchMove");
397 | trace("global Position = " + globalPosition.x + "," + globalPosition.y);
398 | trace("local Position = " + localPosition.x + "," + localPosition.y);
399 | trace("----------------");
400 | }
401 |
402 | private function onNativeTouchUp(e:SurfacePlayerEvent):void
403 | {
404 | var globalPosition:Point = e.param.global;
405 | var localPosition:Point = e.param.local;
406 |
407 | trace("----------------");
408 | trace("onNativeTouchUp");
409 | trace("global Position = " + globalPosition.x + "," + globalPosition.y);
410 | trace("local Position = " + localPosition.x + "," + localPosition.y);
411 | trace("----------------");
412 | }
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 |
422 |
423 |
424 |
425 |
426 |
427 |
428 |
429 |
430 | private function createBtn($str:String, $bgColor:uint=0xDFE4FF):MySprite
431 | {
432 | var sp:MySprite = new MySprite();
433 | sp.addEventListener(MouseEvent.MOUSE_OVER, onOver);
434 | sp.addEventListener(MouseEvent.MOUSE_OUT, onOut);
435 | //sp.addEventListener(MouseEvent.CLICK, onOut);
436 | sp.bgAlpha = 1;
437 | sp.bgColor = $bgColor;
438 | sp.drawBg();
439 | sp.width = BTN_WIDTH * DeviceInfo.dpiScaleMultiplier;
440 | sp.height = BTN_HEIGHT * DeviceInfo.dpiScaleMultiplier;
441 |
442 | function onOver(e:MouseEvent):void
443 | {
444 | if (!sp.hasEventListener(MouseEvent.CLICK)) return;
445 |
446 | sp.bgAlpha = 1;
447 | sp.bgColor = 0x000000;
448 | sp.drawBg();
449 | }
450 |
451 | function onOut(e:MouseEvent):void
452 | {
453 | if (!sp.hasEventListener(MouseEvent.CLICK)) return;
454 |
455 | sp.bgAlpha = 1;
456 | sp.bgColor = $bgColor;
457 | sp.drawBg();
458 | }
459 |
460 | var format:TextFormat = new TextFormat("Arimo", 16, 0x888888, null, null, null, null, null, TextFormatAlign.CENTER);
461 |
462 | var txt:TextField = new TextField();
463 | txt.autoSize = TextFieldAutoSize.LEFT;
464 | txt.antiAliasType = AntiAliasType.ADVANCED;
465 | txt.mouseEnabled = false;
466 | txt.multiline = true;
467 | txt.wordWrap = true;
468 | txt.scaleX = txt.scaleY = DeviceInfo.dpiScaleMultiplier;
469 | txt.width = sp.width * (1 / DeviceInfo.dpiScaleMultiplier);
470 | txt.defaultTextFormat = format;
471 | txt.text = $str;
472 |
473 | txt.y = sp.height - txt.height >> 1;
474 | sp.addChild(txt);
475 |
476 | return sp;
477 | }
478 | }
479 |
480 | }
--------------------------------------------------------------------------------
/AIR/src/assets/design.fla:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myflashlab/surfaceVideoPlayer-ANE/d3253d9eed0593bad3a102419ce8c486751674ec/AIR/src/assets/design.fla
--------------------------------------------------------------------------------
/AIR/src/assets/design.swc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myflashlab/surfaceVideoPlayer-ANE/d3253d9eed0593bad3a102419ce8c486751674ec/AIR/src/assets/design.swc
--------------------------------------------------------------------------------
/AIR/src/assets/design.swf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myflashlab/surfaceVideoPlayer-ANE/d3253d9eed0593bad3a102419ce8c486751674ec/AIR/src/assets/design.swf
--------------------------------------------------------------------------------
/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/surfaceVideoPlayer-ANE/d3253d9eed0593bad3a102419ce8c486751674ec/AIR/src/com/luaye/utils/bitmapMovieClip/sample/example.fla
--------------------------------------------------------------------------------
/AIR/src/com/luaye/utils/bitmapMovieClip/sample/example.swf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myflashlab/surfaceVideoPlayer-ANE/d3253d9eed0593bad3a102419ce8c486751674ec/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 | # Surface Video Player Adobe Air Native Extension
2 |
3 | *Aug 04, 2020 - v4.0.0*
4 | - Updgrade dependencies to the latest versions.
5 | - Fixed some minor issues and some refactoring on native codes.
6 |
7 | *Aug 4, 2019 - V3.4.41*
8 | * Added Android 64-bit support
9 | * Supports iOS 10+
10 |
11 | *Nov 18, 2018 - V3.4.4*
12 | * Works with OverrideAir ANE V5.6.1 or higher
13 | * Works with ANELAB V1.1.26 or higher
14 |
15 | *Sep 24, 2018 - V3.4.3*
16 | * Removed androidSupport dependency
17 |
18 | *Dec 15, 2017 - V3.4.2*
19 | * Optimized for [ANE-LAB software](https://github.com/myflashlab/ANE-LAB).
20 |
21 | *Mar 30, 2017 - V3.4.1*
22 | * Updated the ANE with the latest overrideAir and you will need this dependency for iOS builds also.
23 | * Min iOS version to support this ANE is 8.0 from now on.
24 | * Fixed Android 7 bug which was freezing the video playback when returning to the app from home screen.
25 |
26 | *Nov 08, 2016 - V3.4.0*
27 | * Optimized for Android manual permissions if you are targeting AIR SDK 24+
28 | * From now on, this ANE will depend on androidSupport.ane and overrideAir.ane on the Android side
29 |
30 |
31 | *Oct 22, 2016 - V3.3.0*
32 | * Added Touch events over the native player.
33 |
34 | *Jun 22, 2016 - V3.2.0*
35 | * Fixed video location when app auto rotate is on
36 | * Fixed the 'video not showing' problem happening on some older iOS devices
37 |
38 |
39 | *Jan 20, 2016 - V3.1.0*
40 | * 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
41 |
42 |
43 | *Jan 01, 2016 - V3.0.0*
44 | * in this version you can now also play videos from File.applicationStorageDirectory and you are no longer limited to File.applicationDirectory
45 | * when attaching a video, you need to specify its location like this: _ex.attachVideo(File.applicationStorageDirectory.resolvePath("video.mp4"), SurfaceVideoLocation.ON_APP);
46 |
47 |
48 | *Dec 20, 2015 - V2.9.1*
49 | * minor bug fixes
50 |
51 |
52 | *Nov 03, 2015 - V2.9.0*
53 | * doitflash devs merged into MyFLashLab Team
54 |
55 |
56 | *Jun 14, 2015 - V2.0.0*
57 | * added support for iOS
58 | * removed fullscreen option as it was adding confusion because of Android and iOS differences. for fullscreen, you can easily use http://myappsnippet.com/video-player-native-extension/
59 |
60 |
61 | *Apr 28, 2015 - V1.0.0*
62 | * beginning of the journey!
63 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Surface Video Player ANE (Android+iOS)
2 | SurfacePlayer extension lets you play video files inside your air mobile projects and you can control the position of the player by setting x, y, width and height parameters. if you need to play your videos in native players out of your app, please check out: https://github.com/myflashlab/videoPlayer-ANE. you may also use our YouTube link parser found here: https://github.com/myflashlab/AS3-youtube-parser-video-link/ and with that you can easily play YouTube videos too. but **please notice that this surface player can play local videos only**, so even if you wish to play a youtube video, you need to download it first and then play it back. If you want to stream an online video though, like a YouTube video, you can again use our other fullscreen player ANE mentioned above.
3 |
4 | [find the latest **asdoc** for this ANE here.](http://myflashlab.github.io/asdoc/com/myflashlab/air/extensions/player/surface/package-detail.html)
5 |
6 | # Demo Videos
7 | [YouTube demo of how the extension works](https://www.youtube.com/watch?v=HefrQwCSkKE)
8 |
9 | # AIR Usage
10 | For the complete AS3 code usage, see the [demo project here](https://github.com/myflashlab/surfaceVideoPlayer-ANE/blob/master/AIR/src/Demo.as).
11 |
12 | ```actionscript
13 | import com.myflashlab.air.extensions.player.surface.*;
14 |
15 | var _ex:SurfacePlayer = new SurfacePlayer(stage);
16 |
17 | // on Android, when the surface player is availble, it will hijack the device back button clicks! with the folloiwng listener you can listen to device's back button clicks
18 | _ex.addEventListener(SurfacePlayerEvent.ON_BACK_CLICKED, onBackClickedWhenSurfacePlayerIsAvailable);
19 |
20 | // dispatches when the video has reached end
21 | _ex.addEventListener(SurfacePlayerEvent.ON_COMPLETION_LISTENER, onVideoPlaybackCompleted);
22 |
23 | // when you attach a video file _ex.attachVideo(file); this listener will tell you if this file is availble or not. play your video only if it is availble
24 | _ex.addEventListener(SurfacePlayerEvent.ON_FILE_AVAILABILITY, onTargetVideoAvailability);
25 |
26 | // this listener will tell you different states that your Media is in. "STARTED", "PAUSED", "STOPPED"
27 | _ex.addEventListener(SurfacePlayerEvent.ON_MEDIA_STATUS_CHANGED, onMediaStatusChanged);
28 |
29 | // the first thing you should do is to initialize the extension with its initial parameters
30 | _ex.init(x, y, width, height, true); // the last parameter is the ratio for your video clip if false, the video will be stretched to fit your specified width and height
31 |
32 | // after initializing the extension, you need to attach a new video file to it
33 | _ex.attachVideo(File.applicationStorageDirectory.resolvePath("testVideoPlayerSurface.mp4"), SurfaceVideoLocation.ON_APP);
34 |
35 | // and finally play it! (it is important to play the video after the SurfacePlayerEvent.ON_FILE_AVAILABILITY event is dispatched)
36 | //_ex.play();
37 |
38 | // there are many other methods for you to control the video playback like pause, seek, fullscreen, set volume, etc. please study the sample demo project
39 | // coming with this extension to know how you can work with the other methods and when/how to dispose the extension properly.
40 | ```
41 |
42 | # Air .xml manifest
43 | ```xml
44 |
47 |
48 |
49 | com.myflashlab.air.extensions.videoPlayerSurface
50 |
51 |
52 | com.myflashlab.air.extensions.dependency.overrideAir
53 |
54 |
55 | -->
56 | ```
57 |
58 | # Requirements
59 | * Android SDK 15+
60 | * iOS 10.0+
61 | * AIR SDK 30+
62 |
63 | # Permissions
64 | 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.
65 |
66 | Necessary | Optional
67 | --------------------------- | ---------------------------
68 | . | [SOURCE_STORAGE](https://myflashlab.github.io/asdoc/com/myflashlab/air/extensions/nativePermissions/PermissionCheck.html#SOURCE_STORAGE)
69 |
70 | # Commercial Version
71 | https://www.myflashlabs.com/product/surface-embedded-video-player-ane/
72 |
73 | [](https://www.myflashlabs.com/product/surface-embedded-video-player-ane/)
74 |
75 | # Tutorials
76 | [How to embed ANEs into **FlashBuilder**, **FlashCC** and **FlashDevelop**](https://www.youtube.com/watch?v=Oubsb_3F3ec&list=PL_mmSjScdnxnSDTMYb1iDX4LemhIJrt1O)
77 |
78 | # Premium Support #
79 | [](https://www.myflashlabs.com/product/myflashlabs-support/)
80 | 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/).
--------------------------------------------------------------------------------