package net.systemeD.halcyon.connection {
import flash.events.EventDispatcher;
+ import flash.utils.Dictionary;
public class Entity extends EventDispatcher {
private var _id:Number;
private var _version:uint;
private var tags:Object = {};
private var modified:Boolean = false;
+ private var parents:Dictionary = new Dictionary();
public function Entity(id:Number, version:uint, tags:Object) {
this._id = id;
return _version;
}
+ // Tag-handling methods
+
public function hasTags():Boolean {
for (var key:String in tags)
return true;
return copy;
}
+ public function getTagsHash():Object {
+ // hm, not sure we should be doing this, but for read-only purposes
+ // it's faster than using getTagsCopy
+ return tags;
+ }
+
public function getTagArray():Array {
var copy:Array = [];
for (var key:String in tags )
return copy;
}
+ // Clean/dirty methods
+
public function get isDirty():Boolean {
return modified;
}
modified = true;
}
+ // Parent handling
+
+ public function addParent(parent:Entity):void {
+ parents[parent]=true;
+ }
+
+ public function removeParent(parent:Entity):void {
+ delete parents[parent];
+ }
+
+ public function get parentWays():Array {
+ var a:Array=[];
+ for (var o:Object in parents) {
+ if (o is Way) { a.push(o); }
+ }
+ return a;
+ }
+
+ public function get parentRelations():Array {
+ var a:Array=[];
+ for (var o:Object in parents) {
+ if (o is Relation) { a.push(o); }
+ }
+ return a;
+ }
+
+ public function get parentObjects():Array {
+ var a:Array=[];
+ for (var o:Object in parents) { a.push(o); }
+ return a;
+ }
+
+ // To be overridden
+
public function getType():String {
return '';
}
private var _lat:Number;
private var _latproj:Number;
private var _lon:Number;
- private var _ways:Array = new Array();
public function Node(id:Number, version:uint, tags:Object, lat:Number, lon:Number) {
super(id, version, tags);
return 180/Math.PI * (2 * Math.atan(Math.exp(a*Math.PI/180)) - Math.PI/2);
}
- public function get ways():Array {
- return _ways;
- }
-
- public function registerAddedToWay(way:Way):void {
- if ( _ways.indexOf(way) < 0 )
- _ways.push(way);
- }
-
- public function registerRemovedFromWay(way:Way):void {
- var i:int = _ways.indexOf(way);
- if ( i >= 0 )
- _ways.splice(i, 1);
- }
-
public override function getType():String {
return 'node';
}
public function Relation(id:Number, version:uint, tags:Object, members:Array) {
super(id, version, tags);
this.members = members;
+ for each (var member:RelationMember in members) { member.entity.addParent(this); }
}
public function get length():uint {
}
public function setMember(index:uint, member:RelationMember):void {
- members.splice(index, 1, member);
+ member.entity.addParent(this);
+ members.splice(index, 1, member);
}
public function insertMember(index:uint, member:RelationMember):void {
+ member.entity.addParent(this);
members.splice(index, 0, member);
}
public function appendMember(member:RelationMember):uint {
+ member.entity.addParent(this);
members.push(member);
return members.length;
}
public function removeMember(index:uint):void {
- members.splice(index, 1);
+ var removed:Array=members.splice(index, 1);
+ removed[0].entity.removeParent(this);
}
public override function getType():String {
public function Way(id:Number, version:uint, tags:Object, nodes:Array) {
super(id, version, tags);
this.nodes = nodes;
- for each(var node:Node in nodes)
- node.registerAddedToWay(this);
+ for each (var node:Node in nodes) { node.addParent(this); }
}
public function get length():uint {
}
public function insertNode(index:uint, node:Node):void {
+ node.addParent(this);
nodes.splice(index, 0, node);
- node.registerAddedToWay(this);
}
public function appendNode(node:Node):uint {
+ node.addParent(this);
nodes.push(node);
- node.registerAddedToWay(this);
return nodes.length;
}
public function removeNode(index:uint):void {
- var splicedNodes:Array = nodes.splice(index, 1);
- splicedNodes[0].registerRemovedFromWay(this);
+ var removed:Array=nodes.splice(index, 1);
+ removed[0].removeParent(this);
}
public override function toString():String {