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:
@@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user