00001 import gugga.collections.ArrayList;
00002 import gugga.debug.Assertion;
00003 import gugga.events.EventDispatcher;
00004 import gugga.collections.IIterable;
00005 import gugga.collections.IIterator;
00006 import gugga.collections.ArrayListIterator;
00007
00008 [Event("completed")]
00009
00047 class gugga.collections.CheckList
00048 extends EventDispatcher implements IIterable
00049 {
00050 private var mRegisteredObjects:ArrayList;
00051 private var mCheckedObjects:ArrayList;
00052
00053 public function get RegisteredObjects() : ArrayList
00054 {
00055 return mRegisteredObjects.clone();
00056 }
00057
00058 public function get CheckedObjects() : ArrayList
00059 {
00060 return mCheckedObjects.clone();
00061 }
00062
00063 public function get UncheckedObjects() : ArrayList
00064 {
00065 var result : ArrayList = new ArrayList();
00066 for (var i : Number = 0; i < mRegisteredObjects.length; i++)
00067 {
00068 var item : Object = mRegisteredObjects[i];
00069 if(!isObjectChecked(item))
00070 {
00071 result.addItem(item);
00072 }
00073 }
00074
00075 return result;
00076 }
00077
00078 public function CheckList()
00079 {
00080 mRegisteredObjects = new ArrayList();
00081 mCheckedObjects = new ArrayList();
00082 }
00083
00084 public function add(aObject:Object):Void
00085 {
00086 Assertion.failIfReturnsTrue(
00087 this, isObjectRegistered, [aObject],
00088 "Object already added", this, arguments);
00089
00090 mRegisteredObjects.push(aObject);
00091 }
00092
00093 public function remove(aObject : Object) : Void
00094 {
00095 mRegisteredObjects.removeItem(aObject);
00096 mCheckedObjects.removeItem(aObject);
00097 }
00098
00099 public function check(aObject:Object):Void
00100 {
00101 Assertion.failIfReturnsFalse(
00102 this, isObjectRegistered, [aObject],
00103 "Trying to check unregistered object", this, arguments);
00104
00105 if(!isObjectChecked(aObject))
00106 {
00107 mCheckedObjects.push(aObject);
00108
00109
00110 if(isCompleted())
00111 {
00112 dispatchEvent({type: "completed", target: this});
00113 }
00114 }
00115 }
00116
00117 public function reset():Void
00118 {
00119 mCheckedObjects = new ArrayList();
00120 }
00121
00122 public function isObjectRegistered(aObject:Object):Boolean
00123 {
00124 var isRegistered:Boolean = mRegisteredObjects.containsItem(aObject);
00125 return isRegistered;
00126 }
00127
00128 public function isObjectChecked(aObject:Object):Boolean
00129 {
00130 var isChecked:Boolean = mCheckedObjects.containsItem(aObject);
00131 return isChecked;
00132 }
00133
00134 public function isCompleted():Boolean
00135 {
00136 if(mCheckedObjects.length == mRegisteredObjects.length)
00137 {
00138 return true;
00139 }
00140 else
00141 {
00142 return false;
00143 }
00144 }
00145
00149 public function getIterator () : IIterator
00150 {
00151 return new ArrayListIterator(this.RegisteredObjects);
00152 }
00153
00157 public function getCheckedObjectsIterator () : IIterator
00158 {
00159 return new ArrayListIterator(this.CheckedObjects);
00160 }
00161
00165 public function getUncheckedObjectsIterator () : IIterator
00166 {
00167 return new ArrayListIterator(this.UncheckedObjects);
00168 }
00169 }