michaelforrest-tidy 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest +87 -0
- data/README +5 -0
- data/Rakefile +14 -0
- data/bin/tidyproject +33 -0
- data/lib/aslibs/as3/lbi/com/lbi/animation/animator/Animator.as +86 -0
- data/lib/aslibs/as3/lbi/com/lbi/animation/animator/Transition.as +142 -0
- data/lib/aslibs/as3/lbi/com/lbi/animation/group/Parallel.as +28 -0
- data/lib/aslibs/as3/lbi/com/lbi/animation/group/Queue.as +93 -0
- data/lib/aslibs/as3/lbi/com/lbi/animation/group/Sequence.as +28 -0
- data/lib/aslibs/as3/lbi/com/lbi/animation/group/Set.as +82 -0
- data/lib/aslibs/as3/lbi/com/lbi/animation/group/Stack.as +30 -0
- data/lib/aslibs/as3/lbi/com/lbi/animation/single/Animation.as +173 -0
- data/lib/aslibs/as3/lbi/com/lbi/animation/single/Message.as +36 -0
- data/lib/aslibs/as3/lbi/com/lbi/animation/single/MethodWithCompleteEvent.as +75 -0
- data/lib/aslibs/as3/lbi/com/lbi/animation/single/OrphanEvent.as +78 -0
- data/lib/aslibs/as3/lbi/com/lbi/animation/single/Pause.as +35 -0
- data/lib/aslibs/as3/lbi/com/lbi/animation/single/Tween.as +73 -0
- data/lib/aslibs/as3/lbi/com/lbi/animation/util/Easing.as +158 -0
- data/lib/aslibs/as3/lbi/com/lbi/animation/util/Engine.as +35 -0
- data/lib/aslibs/as3/lbi/com/lbi/animation/util/GroupCommon.as +62 -0
- data/lib/aslibs/as3/lbi/com/lbi/animation/util/IAnimation.as +30 -0
- data/lib/aslibs/as3/lbi/com/lbi/debug/DraggyClip.as +96 -0
- data/lib/aslibs/as3/lbi/com/lbi/debug/FPSView.as +48 -0
- data/lib/aslibs/as3/lbi/com/lbi/debug/KeySequenceTrigger.as +60 -0
- data/lib/aslibs/as3/lbi/com/lbi/debug/Log.as +168 -0
- data/lib/aslibs/as3/lbi/com/lbi/debug/LogItemType.as +23 -0
- data/lib/aslibs/as3/lbi/com/lbi/debug/LogType.as +31 -0
- data/lib/aslibs/as3/lbi/com/lbi/debug/ViewAnalysis.as +24 -0
- data/lib/aslibs/as3/lbi/com/lbi/media/IBufferable.as +16 -0
- data/lib/aslibs/as3/lbi/com/lbi/media/ITransportControllable.as +11 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/collection/Collection.as +296 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/collection/ISearchable.as +10 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/collection/ISelectable.as +10 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/collection/Matchable.as +9 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/collection/Searchable.as +56 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/collection/Selectable.as +49 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/helper/Cloner.as +15 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/helper/TypographyBase.as +194 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/helper/preloading/LoadProgressEvent.as +18 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/model/Application.as +45 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/model/ConcurrentDependencyLoader.as +27 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/model/EventMapper.as +85 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/model/Hyperlink.as +36 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/model/IEventMapper.as +10 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/model/Merge.as +14 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/model/SequentialDependencyLoader.as +43 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/model/StringFormatting.as +142 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/model/XMLListLoader.as +98 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/model/XMLListLoaderDispatcher.as +52 -0
- data/lib/aslibs/as3/lbi/com/lbi/mvc/view/ViewBase.as +323 -0
- data/lib/aslibs/as3/lbi/com/quasimondo/geom/ColorMatrix.as +682 -0
- data/lib/script/as2/lib/as2_class.rb +37 -0
- data/lib/script/as2/lib/test/SampleClass.as +34 -0
- data/lib/script/as2/lib/test/as2_class_test.rb +15 -0
- data/lib/script/as2/navigation/bin/xml/__model.xml +7 -0
- data/lib/script/as2/navigation/navigation.rb +44 -0
- data/lib/script/as2/navigation/src/app/models/App.as +14 -0
- data/lib/script/as2/navigation/src/app/models/__Model.as +42 -0
- data/lib/script/as2/navigation/src/app/views/__model/__ModelView.as +61 -0
- data/lib/script/as2/navigation/src/app/views/__model/__ModelsView.as +33 -0
- data/lib/script/as2/project/project.rb +7 -0
- data/lib/script/as2/project/src/app/helpers/Colours.as +1 -0
- data/lib/script/as2/project/src/app/helpers/Typography.as +1 -0
- data/lib/script/as2/project/src/app/models/App.as +22 -0
- data/lib/script/as2/project/src/app/models/FlashVars.as +1 -0
- data/lib/script/as2/project/src/app/models/Linkages.as +8 -0
- data/lib/script/as2/project/src/app/views/AppView.as +21 -0
- data/lib/script/as3/project/project.rb +10 -0
- data/lib/script/as3/project/src/app/helpers/Colours.as +1 -0
- data/lib/script/as3/project/src/app/helpers/Typography.as +1 -0
- data/lib/script/as3/project/src/app/models/App.as +21 -0
- data/lib/script/as3/project/src/app/models/FlashVars.as +1 -0
- data/lib/script/as3/project/src/app/views/AppView.as +27 -0
- data/lib/script/as3/scaffold/bin/xml/__model.xml +0 -0
- data/lib/script/as3/scaffold/scaffold.rb +41 -0
- data/lib/script/as3/scaffold/src/models/__Model.as +11 -0
- data/lib/script/as3/scaffold/src/views/__model/__ModelDetailView.as +0 -0
- data/lib/script/as3/scaffold/src/views/__model/__ModelListItemView.as +0 -0
- data/lib/script/as3/scaffold/src/views/__model/__ModelListView.as +0 -0
- data/lib/script/bwlimit.rb +305 -0
- data/lib/script/generate +117 -0
- data/lib/script/server +4 -0
- data/lib/script/server.rb +20 -0
- data/lib/tidy_project.rb +19 -0
- data/tasks/build.rake +4 -0
- data/tasks/release.rake +8 -0
- data/test/test_tidy_project.rb +22 -0
- data/tidy.gemspec +33 -0
- metadata +229 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
package com.lbi.mvc.model {
|
2
|
+
import flash.events.Event;
|
3
|
+
import flash.events.EventDispatcher;
|
4
|
+
|
5
|
+
import com.lbi.animation.group.Stack;
|
6
|
+
/**
|
7
|
+
* @author michaelforrest
|
8
|
+
*/
|
9
|
+
public class ConcurrentDependencyLoader extends EventDispatcher {
|
10
|
+
public static var READY : String = "ready";
|
11
|
+
public function dispatchReady():void {dispatchEvent(new Event(READY));
|
12
|
+
}
|
13
|
+
public function ConcurrentDependencyLoader(dependencies : Array) {
|
14
|
+
var stack : Stack = new Stack();
|
15
|
+
for (var i : Number = 0;i < dependencies.length; i++) {
|
16
|
+
var d : EventDispatcher = dependencies[i];
|
17
|
+
stack.addMethod(d, null, Event.COMPLETE);
|
18
|
+
}
|
19
|
+
stack.addEventListener(Event.COMPLETE, onReady,false,0,true);
|
20
|
+
stack.go();
|
21
|
+
}
|
22
|
+
|
23
|
+
private function onReady(event : Event) : void {
|
24
|
+
dispatchReady();
|
25
|
+
}
|
26
|
+
}
|
27
|
+
}
|
@@ -0,0 +1,85 @@
|
|
1
|
+
package com.lbi.mvc.model {
|
2
|
+
import flash.events.Event;
|
3
|
+
|
4
|
+
import com.lbi.mvc.collection.Collection;
|
5
|
+
|
6
|
+
import flash.events.EventDispatcher;
|
7
|
+
import flash.utils.getQualifiedClassName;
|
8
|
+
/**
|
9
|
+
* @author michaelforrest
|
10
|
+
*/
|
11
|
+
public class EventMapper extends EventDispatcher implements IEventMapper {
|
12
|
+
private var listeners : Collection;
|
13
|
+
|
14
|
+
/**
|
15
|
+
* Use registerEvents to automatically wire up controller events to which this view must respond.
|
16
|
+
* So, if you do registerEvents(["complete","ready","pressed"]); you would then need to implement methods
|
17
|
+
* onComplete(e:Event), onReady(e:Event), onPressed(e:Event)
|
18
|
+
* @param events = an array of event names dispatched by the controller
|
19
|
+
*/
|
20
|
+
public function registerEvents(view : Object,events : Array) : void {
|
21
|
+
for (var i : Number = 0; i < events.length; i++) {
|
22
|
+
var event:String = events[i];
|
23
|
+
var method_name:String = eventToMethodName(event);
|
24
|
+
var responding_method:Function = view[method_name];
|
25
|
+
if( responding_method === null ) {
|
26
|
+
var msg:String ="Error - view class "+ getQualifiedClassName(view) + " does not implement " + method_name;
|
27
|
+
throw new Error(msg);
|
28
|
+
}
|
29
|
+
addEventListener(event, responding_method,false,0,true);
|
30
|
+
trackListener(view);
|
31
|
+
}
|
32
|
+
}
|
33
|
+
|
34
|
+
|
35
|
+
public function getListeners() : Collection {
|
36
|
+
return listeners;
|
37
|
+
}
|
38
|
+
|
39
|
+
public function unregisterEvents(view : Object, events : Array) : void {
|
40
|
+
if(!events) return;
|
41
|
+
for (var i : Number = 0; i < events.length; i++) {
|
42
|
+
var event:String = events[i];
|
43
|
+
removeEventListener(event, view[eventToMethodName(event)]);
|
44
|
+
}
|
45
|
+
untrackListener(view);
|
46
|
+
}
|
47
|
+
|
48
|
+
public static function eventToMethodName(event : String) : String {
|
49
|
+
return "on" +StringFormatting.pascalize(event);
|
50
|
+
}
|
51
|
+
|
52
|
+
private function trackListener(view : Object) : void {
|
53
|
+
if(!listeners) listeners = new Collection();
|
54
|
+
if(listeners.find(view)) return;
|
55
|
+
listeners.add(view);
|
56
|
+
}
|
57
|
+
|
58
|
+
private function untrackListener(view : Object) : void {
|
59
|
+
listeners.remove(view);
|
60
|
+
//TODO: think about this properly. This doesn't make sense does it. Necessarily.
|
61
|
+
}
|
62
|
+
|
63
|
+
|
64
|
+
/**
|
65
|
+
* Override this method to return an array of strings that can be registered as events.
|
66
|
+
* This is useful if you want to dynamically generate event names (e.g. with keyboard controllers)
|
67
|
+
*/
|
68
|
+
private function getPossibleEvents():Array{
|
69
|
+
return null;
|
70
|
+
}
|
71
|
+
private function eventIsPossible(event_name : String) : Boolean {
|
72
|
+
var possible_events:Array = getPossibleEvents();
|
73
|
+
for (var i : Number = 0; i < possible_events.length; i++) {
|
74
|
+
var e:String = possible_events[i];
|
75
|
+
if (e==event_name) return true;
|
76
|
+
}
|
77
|
+
return false;
|
78
|
+
}
|
79
|
+
|
80
|
+
protected function getAllListeners() : void {
|
81
|
+
|
82
|
+
}
|
83
|
+
|
84
|
+
}
|
85
|
+
}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
package com.lbi.mvc.model {
|
2
|
+
import flash.events.Event;
|
3
|
+
import flash.net.URLRequest;
|
4
|
+
import flash.net.navigateToURL;
|
5
|
+
/**
|
6
|
+
* @author michaelforrest
|
7
|
+
*/
|
8
|
+
public class Hyperlink {
|
9
|
+
public static var BLANK : String = "_blank";
|
10
|
+
public static var SELF : String = "_self";
|
11
|
+
public static var PARENT : String = "_parent";
|
12
|
+
public static var TOP : String = "_top";
|
13
|
+
|
14
|
+
public var text : String;
|
15
|
+
public var href : String;
|
16
|
+
public var target : String;
|
17
|
+
/**
|
18
|
+
* optionally supply an object literal with
|
19
|
+
* {text:'text',href:'http://href',target:'_blank'} (target is optional)
|
20
|
+
*/
|
21
|
+
public function Hyperlink(xml : XML) {
|
22
|
+
text = xml.toString();
|
23
|
+
href = xml.@href;
|
24
|
+
target = xml.@target;
|
25
|
+
}
|
26
|
+
|
27
|
+
public function follow(e :Event = null) : void{
|
28
|
+
var request : URLRequest = new URLRequest(href);
|
29
|
+
navigateToURL(request, target);
|
30
|
+
}
|
31
|
+
public function toString() : String{
|
32
|
+
return "[Hyperlink text=" + text + ", href=" + href+ ", target=" + target + "]";
|
33
|
+
}
|
34
|
+
|
35
|
+
}
|
36
|
+
}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
package com.lbi.mvc.model {
|
2
|
+
import flash.events.IEventDispatcher;
|
3
|
+
/**
|
4
|
+
* @author michaelforrest
|
5
|
+
*/
|
6
|
+
public interface IEventMapper extends IEventDispatcher {
|
7
|
+
function registerEvents(view : Object,events : Array):void;
|
8
|
+
function unregisterEvents(view : Object, events : Array) : void;
|
9
|
+
}
|
10
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
package com.lbi.mvc.model {
|
2
|
+
|
3
|
+
/**
|
4
|
+
* @author michaelforrest
|
5
|
+
*/
|
6
|
+
public class Merge {
|
7
|
+
public static function objects(extra : Object, original : Object) : Object {
|
8
|
+
for (var i : String in extra) {
|
9
|
+
original[i] = extra[i];
|
10
|
+
}
|
11
|
+
return original;
|
12
|
+
}
|
13
|
+
}
|
14
|
+
}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
package com.lbi.mvc.model {
|
2
|
+
import com.lbi.animation.group.Queue;
|
3
|
+
|
4
|
+
import flash.events.Event;
|
5
|
+
import flash.events.EventDispatcher;
|
6
|
+
/**
|
7
|
+
* @author michaelforrest
|
8
|
+
*/
|
9
|
+
public class SequentialDependencyLoader extends EventDispatcher {
|
10
|
+
public static var READY : String = "ready";
|
11
|
+
public var loaded : Number = 0;
|
12
|
+
private var queue : Queue;
|
13
|
+
private var bytesLoaded : uint;
|
14
|
+
|
15
|
+
public function dispatchReady():void {dispatchEvent(new Event(READY));
|
16
|
+
}
|
17
|
+
|
18
|
+
public function SequentialDependencyLoader(dependencies : Array) {
|
19
|
+
queue = new Queue();
|
20
|
+
for (var i : Number = 0;i < dependencies.length; i++) {
|
21
|
+
var klass : Class = dependencies[i];
|
22
|
+
var loaderDispatcher : XMLListLoaderDispatcher = new XMLListLoaderDispatcher(klass);
|
23
|
+
queue.addMethod(loaderDispatcher, loaderDispatcher.start, XMLListLoaderDispatcher.READY);
|
24
|
+
//queue.addMessage("loaded xml for " + getQualifiedClassName(klass));
|
25
|
+
}
|
26
|
+
queue.addEventListener(Event.COMPLETE, onReady,false,0,true);
|
27
|
+
queue.go();
|
28
|
+
}
|
29
|
+
|
30
|
+
private function onReady(event : Event) : void {
|
31
|
+
dispatchReady();
|
32
|
+
}
|
33
|
+
|
34
|
+
public function getBytesLoaded() : Number {
|
35
|
+
return bytesLoaded;
|
36
|
+
}
|
37
|
+
|
38
|
+
// public function getBytesTotal() : Number {
|
39
|
+
// trace("warning - SequentialDependencyLoader.getBytesTotal() is not defined")
|
40
|
+
// return null;
|
41
|
+
// }
|
42
|
+
}
|
43
|
+
}
|
@@ -0,0 +1,142 @@
|
|
1
|
+
package com.lbi.mvc.model {
|
2
|
+
/**
|
3
|
+
* @author michaelforrest
|
4
|
+
*/
|
5
|
+
public class StringFormatting {
|
6
|
+
public static function formatTimeInCentiseconds(t : Number) : String {
|
7
|
+
var seconds:Number = Math.floor(t % 60);
|
8
|
+
var minutes:Number = Math.floor((t - seconds)/ 60 );
|
9
|
+
var centiseconds:Number = Math.floor(( t-Math.floor(t) ) * 100);
|
10
|
+
return pad(minutes) + ":" + pad(seconds) + ":" + pad(centiseconds);
|
11
|
+
}
|
12
|
+
public static function formatTimeInSeconds(t : Number) : String {
|
13
|
+
var seconds:Number = Math.floor(t % 60);
|
14
|
+
var minutes:Number = Math.floor((t - seconds)/ 60 );
|
15
|
+
return pad(minutes) + ":" + pad(seconds) ;
|
16
|
+
}
|
17
|
+
|
18
|
+
private static function pad(n : Number) : String {
|
19
|
+
var s:String = n.toString();
|
20
|
+
if(s.length==1) s = "0" + s;
|
21
|
+
return s;
|
22
|
+
}
|
23
|
+
/**
|
24
|
+
* converts string from underscore_lower_case to camelCase
|
25
|
+
* Utterly untested.
|
26
|
+
*/
|
27
|
+
public static function camelize($s:String):String{
|
28
|
+
var s_arr:Array = $s.split('_');
|
29
|
+
if (s_arr.length == 1) return s_arr[0];
|
30
|
+
|
31
|
+
var camelizedString:String = $s.indexOf('_') == 0
|
32
|
+
? s_arr[0].charAt(0).toUpperCase() + s_arr[0].substring(1)
|
33
|
+
: s_arr[0];
|
34
|
+
|
35
|
+
for (var i:Number = 1, len:Number = s_arr.length; i < len; i++) {
|
36
|
+
var s:String = s_arr[i];
|
37
|
+
camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
|
38
|
+
}
|
39
|
+
|
40
|
+
return camelizedString;
|
41
|
+
}
|
42
|
+
/**
|
43
|
+
* converts any string into a valid variable name
|
44
|
+
* See tests [aslibs_framafabTest ->StringFormattingTest] for behaviour expectations
|
45
|
+
*/
|
46
|
+
public static function variablify(string:String):String{
|
47
|
+
string = string.split(".").join("_");
|
48
|
+
string = string.split(" ").join("_");
|
49
|
+
string = string.split("-").join("_");
|
50
|
+
return string;
|
51
|
+
}
|
52
|
+
/**
|
53
|
+
* ThisIsPascalCase
|
54
|
+
*/
|
55
|
+
public static function pascalize(underscore_separated : String) : String {
|
56
|
+
var s:String = camelize(underscore_separated.toLowerCase());
|
57
|
+
var pascalized:String = s.charAt(0).toUpperCase() + s.substr(1,s.length-1);
|
58
|
+
return pascalized;
|
59
|
+
}
|
60
|
+
|
61
|
+
public static function underscore(string : String) : String {
|
62
|
+
var alphabet : String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
63
|
+
for (var i : Number = 0; i < alphabet.length; i++) {
|
64
|
+
var letter:String = alphabet.charAt(i);
|
65
|
+
string = string.split(letter).join("_" + letter.toLowerCase());
|
66
|
+
if(string.charAt(0)=="_") string = string.substr(1,string.length);
|
67
|
+
}
|
68
|
+
return string;
|
69
|
+
}
|
70
|
+
/**
|
71
|
+
* Trim functions from as2lib
|
72
|
+
*/
|
73
|
+
|
74
|
+
public static function trim(string:String):String {
|
75
|
+
return leftTrim(rightTrim(string));
|
76
|
+
}
|
77
|
+
|
78
|
+
public static function leftTrim(string:String):String {
|
79
|
+
return leftTrimForChars(string, "\n\t\n ");
|
80
|
+
}
|
81
|
+
|
82
|
+
public static function rightTrim(string:String):String {
|
83
|
+
return rightTrimForChars(string, "\n\t\n ");
|
84
|
+
}
|
85
|
+
|
86
|
+
public static function leftTrimForChars(string:String, chars:String):String {
|
87
|
+
var from:Number = 0;
|
88
|
+
var to:Number = string.length;
|
89
|
+
while (from < to && chars.indexOf(string.charAt(from)) >= 0){
|
90
|
+
from++;
|
91
|
+
}
|
92
|
+
return (from > 0 ? string.substr(from, to) : string);
|
93
|
+
}
|
94
|
+
|
95
|
+
public static function rightTrimForChars(string:String, chars:String):String {
|
96
|
+
var from:Number = 0;
|
97
|
+
var to:Number = string.length - 1;
|
98
|
+
while (from < to && chars.indexOf(string.charAt(to)) >= 0) {
|
99
|
+
to--;
|
100
|
+
}
|
101
|
+
return (to >= 0 ? string.substr(from, to+1) : string);
|
102
|
+
}
|
103
|
+
|
104
|
+
public static function leftTrimForChar(string:String, char:String):String {
|
105
|
+
return leftTrimForChars(string, char.charAt(0));
|
106
|
+
}
|
107
|
+
|
108
|
+
public static function rightTrimForChar(string:String, char:String):String {
|
109
|
+
return rightTrimForChars(string, char.charAt(0));
|
110
|
+
}
|
111
|
+
|
112
|
+
private static var LINES_DELIMETERS : Array = ["\r\n", "\n\r", "\r", "\n"];
|
113
|
+
|
114
|
+
public static function stripInLines ( s : String ) : Array
|
115
|
+
{
|
116
|
+
var res : Array = [];
|
117
|
+
var delimeter_index : Number = 0;
|
118
|
+
var delimeter : String;
|
119
|
+
while(res.length<2 && delimeter_index<LINES_DELIMETERS.length){
|
120
|
+
delimeter = LINES_DELIMETERS[delimeter_index];
|
121
|
+
res = s.split(delimeter);
|
122
|
+
delimeter_index++;
|
123
|
+
}
|
124
|
+
return res;
|
125
|
+
}
|
126
|
+
|
127
|
+
|
128
|
+
public static function collectionize(class_name : String) : String {
|
129
|
+
return underscore(class_name).toLowerCase() + "s"; ;
|
130
|
+
}
|
131
|
+
|
132
|
+
public static function sentenceCase(underscored : String) : String {
|
133
|
+
var words : Array = underscored.split("_");
|
134
|
+
var first_word : String = words[0];
|
135
|
+
words[0] = words[0].charAt(0).toUpperCase() + words[0].substr(1,words[0].length-1);
|
136
|
+
for (var i : Number = 0; i < words.length; i++) {
|
137
|
+
if(words[i] == "and") words[i] = "&";
|
138
|
+
}
|
139
|
+
return words.join(' ');
|
140
|
+
}
|
141
|
+
}
|
142
|
+
}
|
@@ -0,0 +1,98 @@
|
|
1
|
+
package com.lbi.mvc.model {
|
2
|
+
import flash.events.Event;
|
3
|
+
import flash.events.EventDispatcher;
|
4
|
+
import flash.events.IOErrorEvent;
|
5
|
+
import flash.events.ProgressEvent;
|
6
|
+
import flash.net.URLLoader;
|
7
|
+
import flash.net.URLRequest;
|
8
|
+
|
9
|
+
import com.lbi.debug.Log;
|
10
|
+
import com.lbi.mvc.collection.Collection;
|
11
|
+
import flash.utils.getQualifiedClassName; /**
|
12
|
+
* @author michaelforrest
|
13
|
+
*/
|
14
|
+
public class XMLListLoader extends EventDispatcher {
|
15
|
+
|
16
|
+
private static var loaders : Object = {};
|
17
|
+
|
18
|
+
private var url : String;
|
19
|
+
private var item_class : Class;
|
20
|
+
private var path_to_items : String;
|
21
|
+
|
22
|
+
private var collection : Collection;
|
23
|
+
private static const READY : String = "ready";
|
24
|
+
private var loader : URLLoader;
|
25
|
+
public function XMLListLoader($url : String,$item_class : Class, $path_to_items : String) {
|
26
|
+
super();
|
27
|
+
url = $url;
|
28
|
+
item_class = $item_class;
|
29
|
+
path_to_items = $path_to_items;
|
30
|
+
loadOrAttachToLoaderInProgress();
|
31
|
+
loadXML();
|
32
|
+
}
|
33
|
+
|
34
|
+
private function loadOrAttachToLoaderInProgress() : void {
|
35
|
+
// if(loaders[url]!=null) {
|
36
|
+
// trace("retrieving ")
|
37
|
+
// loader = loaders[url];
|
38
|
+
// }else{
|
39
|
+
loader = new URLLoader();
|
40
|
+
loaders[url] = loader;
|
41
|
+
// }
|
42
|
+
}
|
43
|
+
|
44
|
+
private function loadXML() : void {
|
45
|
+
var xml_request : URLRequest = new URLRequest(url);
|
46
|
+
loader.load(xml_request);
|
47
|
+
loader.addEventListener(Event.COMPLETE, onLoad,false,0,true);
|
48
|
+
loader.addEventListener(ProgressEvent.PROGRESS, onProgress,false,0,true);
|
49
|
+
loader.addEventListener(IOErrorEvent.IO_ERROR, onError,false,0,true);
|
50
|
+
|
51
|
+
}
|
52
|
+
private function onError(event : IOErrorEvent) : void {
|
53
|
+
trace("failed to load " + url);
|
54
|
+
}
|
55
|
+
private function onProgress(event : ProgressEvent) : void {
|
56
|
+
dispatchEvent(event);
|
57
|
+
}
|
58
|
+
|
59
|
+
private function onLoad(event : Event = null) : void {
|
60
|
+
var xml : XML = new XML(loader.data);
|
61
|
+
//trace("DATA FOUND FOR " + url + "? " +(loader.data != null).toString().toUpperCase());
|
62
|
+
prepare(xml);
|
63
|
+
dispatchEvent(new Event(READY));
|
64
|
+
}
|
65
|
+
private function prepare(xml:XML) : void {
|
66
|
+
collection = new Collection();
|
67
|
+
|
68
|
+
var models:XMLList = xml.descendants(path_to_items);
|
69
|
+
if(models.length() == 0){
|
70
|
+
Log.warn("No '" + path_to_items + "' nodes found in " + url);
|
71
|
+
Log.debug("xml:" + xml);
|
72
|
+
}
|
73
|
+
for (var i : Number = 0;i < models.length(); i++) {
|
74
|
+
var model : XML = models[i];
|
75
|
+
var parsed_model : Object = new item_class(model);
|
76
|
+
collection.AS3::push(parsed_model);
|
77
|
+
}
|
78
|
+
}
|
79
|
+
public function getItems() : Array {
|
80
|
+
return collection;
|
81
|
+
}
|
82
|
+
public static function initialize($class : Class, $collection_name : String, $xml_url : String, $path_to_items : String) : XMLListLoaderDispatcher {
|
83
|
+
var events : XMLListLoaderDispatcher = new XMLListLoaderDispatcher($class);
|
84
|
+
var xmlListLoader : XMLListLoader = new XMLListLoader($xml_url, $class, $path_to_items);
|
85
|
+
var callback : Function = function() : void {
|
86
|
+
$class[$collection_name] = xmlListLoader.getItems();
|
87
|
+
trace("Loaded ", $class[$collection_name].length, "instances into", getQualifiedClassName($class) + "." +$collection_name, "from", $xml_url);
|
88
|
+
events.dispatchEvent(new Event(Event.COMPLETE));
|
89
|
+
};
|
90
|
+
xmlListLoader.addEventListener(READY, callback,false,0,true);
|
91
|
+
var progressCallback : Function = function(e:ProgressEvent) : void{
|
92
|
+
events.dispatchEvent(e);
|
93
|
+
}
|
94
|
+
xmlListLoader.addEventListener(ProgressEvent.PROGRESS, progressCallback,false,0,true);
|
95
|
+
return events;
|
96
|
+
}
|
97
|
+
}
|
98
|
+
}
|
@@ -0,0 +1,52 @@
|
|
1
|
+
package com.lbi.mvc.model {
|
2
|
+
import flash.events.ProgressEvent;
|
3
|
+
import flash.events.Event;
|
4
|
+
import flash.events.EventDispatcher;
|
5
|
+
import flash.utils.getQualifiedClassName;
|
6
|
+
/**
|
7
|
+
* @author michaelforrest
|
8
|
+
* Yep sorry, actually two of these classes are used in the course of the autopopulation process now... (the other place is XMLListloader.prepare() for some reason.)
|
9
|
+
* Since it works, I am not looking at it any more....
|
10
|
+
*/
|
11
|
+
public class XMLListLoaderDispatcher extends EventDispatcher {
|
12
|
+
private var klass : *;
|
13
|
+
private var events : EventDispatcher;
|
14
|
+
public static const READY : String= "ready";
|
15
|
+
|
16
|
+
public function XMLListLoaderDispatcher($class : Class) {
|
17
|
+
super();
|
18
|
+
klass = $class;
|
19
|
+
}
|
20
|
+
|
21
|
+
public function getClass() : String {
|
22
|
+
return getQualifiedClassName(klass);
|
23
|
+
}
|
24
|
+
|
25
|
+
public function start() : void {
|
26
|
+
checkClassHasWhatIsNeeded();
|
27
|
+
events = klass.prepare();
|
28
|
+
if(!events) {
|
29
|
+
onOtherDispatcherReady();
|
30
|
+
}else{
|
31
|
+
events.addEventListener(ProgressEvent.PROGRESS, onProgress,false,0,true);
|
32
|
+
events.addEventListener(Event.COMPLETE, onOtherDispatcherReady,false,0,true);
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
36
|
+
private function checkClassHasWhatIsNeeded() : void {
|
37
|
+
if(!klass) throw new Error("No class provided!");
|
38
|
+
if(!klass.prepare) {
|
39
|
+
throw new Error("Please create a prepare() : EventDispatcher {} event on class " + getQualifiedClassName(klass));
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
private function onProgress(event : ProgressEvent) : void {
|
44
|
+
dispatchEvent(event);
|
45
|
+
}
|
46
|
+
|
47
|
+
private function onOtherDispatcherReady(event : Event = null) : void {
|
48
|
+
checkClassHasWhatIsNeeded();
|
49
|
+
dispatchEvent(new Event(READY));
|
50
|
+
}
|
51
|
+
}
|
52
|
+
}
|