1 package net.systemeD.halcyon.connection {
3 import flash.events.EventDispatcher;
4 import flash.utils.Dictionary;
6 import net.systemeD.halcyon.connection.actions.*;
8 public class Entity extends EventDispatcher {
9 private var _id:Number;
10 private var _version:uint;
11 private var tags:Object = {};
12 private var modified:Boolean = false;
13 private var _loaded:Boolean = true;
14 private var parents:Dictionary = new Dictionary();
15 private var locked:Boolean = false;
16 public var deleted:Boolean = false;
18 public function Entity(id:Number, version:uint, tags:Object, loaded:Boolean) {
20 this._version = version;
22 this._loaded = loaded;
26 public function get id():Number {
30 public function get version():uint {
34 public function get loaded():Boolean {
38 public function updateEntityProperties(version:uint, tags:Object, loaded:Boolean):void {
39 _version=version; this.tags=tags; _loaded=loaded;
42 // Tag-handling methods
44 public function hasTags():Boolean {
45 for (var key:String in tags)
50 // ** we could do with hasInterestingTags - don't bother with source, created_by, any TIGER tags, etc.
52 public function getTag(key:String):String {
56 public function setTag(key:String, value:String, performAction:Function):void {
57 performAction(new SetTagAction(this, key, value));
60 public function renameTag(oldKey:String, newKey:String, performAction:Function):void {
61 performAction(new SetTagKeyAction(this, oldKey, newKey));
64 public function getTagList():TagList {
65 return new TagList(tags);
68 public function getTagsCopy():Object {
70 for (var key:String in tags )
71 copy[key] = tags[key];
75 public function getTagsHash():Object {
76 // hm, not sure we should be doing this, but for read-only purposes
77 // it's faster than using getTagsCopy
81 public function getTagArray():Array {
83 for (var key:String in tags )
84 copy.push(new Tag(this, key, tags[key]));
88 // Clean/dirty methods
90 public function get isDirty():Boolean {
94 public function markClean(newID:Number, newVersion:uint):void {
96 this._version = newVersion;
100 internal function markDirty():void {
106 public function remove(performAction:Function):void {
110 public function isDeleted():Boolean {
114 protected function setDeletedState(isDeleted:Boolean):void {
118 internal function isEmpty():Boolean {
119 return false; // to be overridden
122 public function removeFromParents(performAction:Function):void {
123 for (var o:Object in parents) {
124 if (o is Relation) { Relation(o).removeMember(this, performAction); }
125 else if (o is Way) { Way(o).removeNode(Node(this), performAction); }
126 if (o.isEmpty()) { o.remove(performAction); }
132 public function addParent(parent:Entity):void {
133 parents[parent]=true;
135 if ( parent is Relation )
136 dispatchEvent(new RelationMemberEvent(Connection.ADDED_TO_RELATION, this, parent as Relation, -1));
139 public function removeParent(parent:Entity):void {
140 delete parents[parent];
142 if ( parent is Relation )
143 dispatchEvent(new RelationMemberEvent(Connection.REMOVED_FROM_RELATION, this, parent as Relation, -1));
146 public function get parentWays():Array {
148 for (var o:Object in parents) {
149 if (o is Way) { a.push(o); }
154 public function get hasParents():Boolean {
155 for (var o:Object in parents) { return true; }
159 public function get hasParentWays():Boolean {
160 for (var o:Object in parents) {
161 if (o is Way) { return true; }
166 public function get numParentWays():uint {
168 for (var o:Object in parents) {
169 if (o is Way) { i++; }
174 public function get parentRelations():Array {
176 for (var o:Object in parents) {
177 if (o is Relation) { a.push(o); }
182 public function get parentObjects():Array {
184 for (var o:Object in parents) { a.push(o); }
188 public function hasParent(entity:Entity):Boolean {
189 return parents[entity] == true;
192 // Resume/suspend redraw
194 public function suspend():void {
195 dispatchEvent(new EntityEvent(Connection.SUSPEND_REDRAW, this));
198 public function resume():void {
199 dispatchEvent(new EntityEvent(Connection.RESUME_REDRAW, this));
204 public function getType():String {