Let's use presents.dobj.EventListener (and expose a public function- oh well)

and just handle all events in one place, greatly reducing line count
and at the same time handling changes other than AttributeChangedEvents
to the "refreshFields".


git-svn-id: svn+ssh://src.earth.threerings.net/nenya/trunk@792 ed5b42cb-e716-0410-a449-f6a68f950b19
This commit is contained in:
Ray Greenwell
2009-03-24 21:39:41 +00:00
parent daa4dab352
commit 0a4a690728
+34 -58
View File
@@ -14,19 +14,21 @@ import mx.controls.List;
import com.threerings.util.Util; import com.threerings.util.Util;
import com.threerings.presents.dobj.AttributeChangedEvent; import com.threerings.presents.dobj.AttributeChangedEvent;
import com.threerings.presents.dobj.AttributeChangeAdapter; import com.threerings.presents.dobj.DEvent;
import com.threerings.presents.dobj.DObject; import com.threerings.presents.dobj.DObject;
import com.threerings.presents.dobj.DSet; import com.threerings.presents.dobj.DSet;
import com.threerings.presents.dobj.DSet_Entry; import com.threerings.presents.dobj.DSet_Entry;
import com.threerings.presents.dobj.EntryAddedEvent; import com.threerings.presents.dobj.EntryAddedEvent;
import com.threerings.presents.dobj.EntryUpdatedEvent; import com.threerings.presents.dobj.EntryUpdatedEvent;
import com.threerings.presents.dobj.EntryRemovedEvent; import com.threerings.presents.dobj.EntryRemovedEvent;
import com.threerings.presents.dobj.SetAdapter; import com.threerings.presents.dobj.EventListener;
import com.threerings.presents.dobj.NamedEvent;
/** /**
* A list that renders the contents of a DSet. * A list that renders the contents of a DSet.
*/ */
public class DSetList extends List public class DSetList extends List
implements EventListener
{ {
public function DSetList ( public function DSetList (
renderer :IFactory, sortFn :Function = null, filterFn :Function = null) renderer :IFactory, sortFn :Function = null, filterFn :Function = null)
@@ -79,10 +81,7 @@ public class DSetList extends List
_object = object; _object = object;
_field = field; _field = field;
_refreshFields = refreshFields; _refreshFields = refreshFields;
_attrListener = new AttributeChangeAdapter(attrChanged); _object.addListener(this);
_setListener = new SetAdapter(entryAdded, entryUpdated, entryRemoved);
_object.addListener(_attrListener);
_object.addListener(_setListener);
setEntries(_object[_field] as DSet); setEntries(_object[_field] as DSet);
} }
@@ -92,11 +91,8 @@ public class DSetList extends List
*/ */
public function shutdown () :void public function shutdown () :void
{ {
if (_attrListener != null) { if (_object != null) {
_object.removeListener(_attrListener); _object.removeListener(this);
_object.removeListener(_setListener);
_attrListener = null;
_setListener = null;
_object = null; _object = null;
_field = null; _field = null;
_refreshFields = null; _refreshFields = null;
@@ -113,58 +109,42 @@ public class DSetList extends List
} }
/** /**
* Handle a change to the entire set. * From com.threerings.presents.dobj.EventListener. Not actually part of the public API.
*/ */
protected function attrChanged (event :AttributeChangedEvent) :void public function eventReceived (event :DEvent) :void
{ {
var name :String = event.getName(); if (!(event is NamedEvent)) {
return;
}
var name :String = NamedEvent(event).getName();
if (name == _field) { if (name == _field) {
setEntries(event.getValue() as DSet); if (event is EntryAddedEvent) {
_data.list.addItem(EntryAddedEvent(event).getEntry());
} else if (_refreshFields.indexOf(name) != -1) { } else if (event is EntryUpdatedEvent) {
refresh(); var entry :DSet_Entry = EntryUpdatedEvent(event).getEntry();
} var upIdx :int = findKeyIndex(entry.getKey());
} if (upIdx != -1) {
_data.list.setItemAt(entry, upIdx);
}
/** } else if (event is EntryRemovedEvent) {
* Handle an addition to the set. var remIdx :int = findKeyIndex(EntryRemovedEvent(event).getKey());
*/ if (remIdx != -1) {
protected function entryAdded (event :EntryAddedEvent) :void _data.list.removeItemAt(remIdx);
{ }
if (event.getName() == _field) {
_data.list.addItem(event.getEntry());
refresh();
}
}
/** } else if (event is AttributeChangedEvent) {
* Handle an update to the set. setEntries(AttributeChangedEvent(event).getValue() as DSet);
*/ return; // skip the full refresh
protected function entryUpdated (event :EntryUpdatedEvent) :void
{
if (event.getName() == _field) {
var entry :DSet_Entry = event.getEntry();
var idx :int = findKeyIndex(entry.getKey());
if (idx == -1) {
throw new Error();
} }
_data.list.setItemAt(entry, idx);
refresh();
}
}
/** } else if (-1 == _refreshFields.indexOf(name)) {
* Handle a removal from the set. return; // this name is not our concern: do nothing
*/
protected function entryRemoved (event :EntryRemovedEvent) :void
{
if (event.getName() == _field) {
var idx :int = findKeyIndex(event.getKey());
if (idx != -1) {
_data.list.removeItemAt(idx);
refresh();
}
} }
// we reach this line if the event was for a _refreshField, or a Set event on _field
refresh();
} }
/** /**
@@ -192,9 +172,5 @@ public class DSetList extends List
/** Fields on which to watch for updates and call refresh(). */ /** Fields on which to watch for updates and call refresh(). */
protected var _refreshFields :Array; protected var _refreshFields :Array;
/** Our listeners, so that we don't junk-up our public interface. */
protected var _attrListener :AttributeChangeAdapter;
protected var _setListener :SetAdapter;
} }
} }