1 package net.systemeD.halcyon.connection {
3 public class Relation extends Entity {
4 private var members:Array;
5 public static var entity_type:String = 'relation';
7 public function Relation(id:Number, version:uint, tags:Object, loaded:Boolean, members:Array) {
8 super(id, version, tags, loaded);
9 this.members = members;
10 for each (var member:RelationMember in members)
11 member.entity.addParent(this);
14 public function update(version:uint, tags:Object, loaded:Boolean, members:Array):void {
15 var member:RelationMember;
16 for each (member in this.members)
17 member.entity.removeParent(this);
19 updateEntityProperties(version,tags,loaded);
21 for each (member in members)
22 member.entity.addParent(this);
25 public function get length():uint {
26 return members.length;
29 public function findEntityMemberIndex(entity:Entity):int {
30 for (var index:uint = 0; index < members.length; index++) {
31 var member:RelationMember = members[index];
32 if ( member.entity == entity )
38 public function findEntityMemberIndexes(entity:Entity):Array {
39 var indexes:Array = [];
40 for (var index:uint = 0; index < members.length; index++) {
41 var member:RelationMember = members[index];
42 if ( member.entity == entity )
48 public function getMember(index:uint):RelationMember {
49 return members[index];
52 public function setMember(index:uint, member:RelationMember):void {
53 var oldMember:RelationMember = getMember(index);
55 members.splice(index, 1, member);
56 oldMember.entity.removeParent(this);
57 member.entity.addParent(this);
61 public function insertMember(index:uint, member:RelationMember):void {
62 members.splice(index, 0, member);
63 member.entity.addParent(this);
66 dispatchEvent(new RelationMemberEvent(Connection.RELATION_MEMBER_ADDED, member.entity, this, index));
69 public function appendMember(member:RelationMember):uint {
71 member.entity.addParent(this);
74 dispatchEvent(new RelationMemberEvent(Connection.RELATION_MEMBER_ADDED, member.entity, this, members.length-1));
75 return members.length;
78 public function removeMember(entity:Entity):void {
80 var lastRemoved:int = -1;
81 while ((i=findEntityMemberIndex(entity))>-1) {
85 entity.removeParent(this);
88 if ( lastRemoved >= 0 )
89 dispatchEvent(new RelationMemberEvent(Connection.RELATION_MEMBER_REMOVED, entity, this, lastRemoved));
92 public function removeMemberByIndex(index:uint):void {
93 var removed:Array=members.splice(index, 1);
94 var entity:Entity=removed[0].entity;
96 // only remove as parent if this was only reference
97 if (findEntityMemberIndex(entity)==-1)
98 entity.removeParent(this);
101 dispatchEvent(new RelationMemberEvent(Connection.RELATION_MEMBER_REMOVED, entity, this, index));
104 public override function remove():void {
106 for each (var member:RelationMember in members) { member.entity.removeParent(this); }
109 dispatchEvent(new EntityEvent(Connection.RELATION_DELETED, this));
112 internal override function isEmpty():Boolean {
113 return (deleted || (members.length==0));
116 public function getDescription():String {
117 var desc:String = "";
118 var relTags:Object = getTagsHash();
119 if ( relTags["type"] ) {
120 desc = relTags["type"];
122 desc += " " + relTags[desc];
124 if ( relTags["ref"] )
125 desc += " " + relTags["ref"];
126 if ( relTags["name"] )
127 desc += " " + relTags["name"];
131 public override function getType():String {
135 public override function toString():String {
136 return "Relation("+id+"@"+version+"): "+members.length+" members "+getTagList();