package info.joshmcdonald.barra.utils { import flash.events.Event; import flash.events.EventDispatcher; import flash.events.IEventDispatcher; import mx.events.CollectionEvent; /** * Documented here: http://flex.joshmcdonald.info/2008/10/selecting-right-value-from-combobox-or.html */ public class FindIndex extends EventDispatcher { private var _source : Object; private var _keyField : String; private var _searchFor : Object; private var _idx : Number; private const UPDATED : String = "matchingIndexUpdated"; public function FindIndex() { } [Bindable] public function set keyField(value : String) : void { _keyField = value; doSearch(); dispatchEvent(new Event(UPDATED)); } public function get keyField() : String { return _keyField; } [Bindable] public function set source(value : Object) : void { if (_source == value) return; var ed : IEventDispatcher = _source as IEventDispatcher; if (ed) { ed.removeEventListener(CollectionEvent.COLLECTION_CHANGE, sourceUpdated); } _source = value; ed = _source as IEventDispatcher; if (ed) { ed.addEventListener(CollectionEvent.COLLECTION_CHANGE, sourceUpdated, false, 0, true); } doSearch(); dispatchEvent(new Event(UPDATED)); } public function get source() : Object { return _source; } [Bindable] public function set searchFor(value : Object) : void { if (_searchFor == value) return; _searchFor = value; doSearch(); dispatchEvent(new Event(UPDATED)); } public function get searchFor() : Object { return _searchFor; } [Bindable("matchingIndexUpdated")] public function get matchingIndex() : Number { return _idx; } private function sourceUpdated(event : CollectionEvent) : void { doSearch(); dispatchEvent(new Event(UPDATED)); } private function doSearch() : void { _idx = -1; var searching : Number = 0; if (searchFor && source && keyField/* && keyField in searchFor */) { for each (var obj : * in source) { if (obj == searchFor || (keyField in obj && obj[keyField] == searchFor) || (keyField in obj && keyField in searchFor && obj[keyField] == searchFor[keyField])) { _idx = searching; return; } searching++; } } } } }