1 package net.systemeD.halcyon {
3 import flash.display.Sprite;
4 import flash.display.DisplayObject;
5 import net.systemeD.halcyon.NodeUI;
6 import net.systemeD.halcyon.WayUI;
7 import net.systemeD.halcyon.connection.Node;
8 import net.systemeD.halcyon.connection.Way;
9 import net.systemeD.halcyon.styleparser.RuleSet;
10 import net.systemeD.halcyon.vectorlayers.VectorLayer;
11 import net.systemeD.halcyon.Globals;
13 public class MapPaint extends Sprite {
16 public var minlayer:int;
17 public var maxlayer:int;
18 public var ruleset:RuleSet; // rules
19 public var wayuis:Object=new Object(); // sprites for ways and (POI/tagged) nodes
20 public var nodeuis:Object=new Object(); // |
21 public var isBackground:Boolean = true; // is it a background layer or the core paint object?
22 private var sublayerIndex:Object={}; // hash of index->position
24 private const VERYBIG:Number=Math.pow(2,16);
28 // [layer][2][sublayer] - stroke
29 // [layer][1] - casing
32 public function MapPaint(map:Map,minlayer:int,maxlayer:int) {
34 this.minlayer=minlayer;
35 this.maxlayer=maxlayer;
38 for (var l:int=minlayer; l<=maxlayer; l++) { // each layer (10 is +5, 0 is -5)
39 var s:Sprite = getHitSprite(); // |
40 s.addChild(getPaintSprite()); // | 0 fill
41 s.addChild(getPaintSprite()); // | 1 casing
42 var t:Sprite = getPaintSprite(); // | 2 stroke
43 t.addChild(getPaintSprite()); // | | sublayer
45 s.addChild(getPaintSprite()); // | 3 names
46 s.addChild(getPaintSprite()); // | 4 nodes
47 s.addChild(getHitSprite()); // | 5 entity hit tests
50 addChild(getPaintSprite()); // name sprite
53 public function get ready():Boolean {
54 if (!ruleset) { return false; }
55 if (!ruleset.loaded) { return false; }
59 public function sublayer(layer:int,sublayer:Number):Sprite {
62 var index:String, ix:Number;
63 if (!sublayerIndex[sublayer]) {
64 // work out which position to add at
65 var lowestAbove:Number=VERYBIG;
66 var lowestAbovePos:int=-1;
67 var indexLength:uint=0;
68 for (index in sublayerIndex) {
70 if (ix>sublayer && ix<lowestAbove) {
72 lowestAbovePos=sublayerIndex[index];
76 if (lowestAbovePos==-1) { lowestAbovePos=indexLength; }
79 for (var i:int=minlayer; i<=maxlayer; i++) {
80 l=getChildAt(i-minlayer);
81 o=(l as Sprite).getChildAt(2);
82 (o as Sprite).addChildAt(getPaintSprite(),lowestAbovePos);
86 for (index in sublayerIndex) {
88 if (ix>sublayer) { sublayerIndex[index]++; }
90 sublayerIndex[sublayer]=lowestAbovePos;
93 l=getChildAt(layer-minlayer);
94 o=(l as Sprite).getChildAt(2);
95 return ((o as Sprite).getChildAt(sublayerIndex[sublayer]) as Sprite);
98 public function updateEntityUIs(o:Object, redraw:Boolean, remove:Boolean):void {
99 var way:Way, node:Node;
101 for each (way in o.waysInside) {
102 if (!wayuis[way.id]) { createWayUI(way); }
103 else if (redraw) { wayuis[way.id].recalculate(); wayuis[way.id].redraw(); }
106 for each (way in o.waysOutside) { deleteWayUI(way); }
109 for each (node in o.poisInside) {
110 if (!nodeuis[node.id]) { createNodeUI(node); }
111 else if (redraw) { nodeuis[node.id].redraw(); }
114 for each (node in o.poisOutside) { deleteNodeUI(node); }
118 public function createWayUI(way:Way):WayUI {
119 if (!wayuis[way.id]) { wayuis[way.id]=new WayUI(way,this,false); }
120 return wayuis[way.id];
123 public function createNodeUI(node:Node):NodeUI {
124 if (!nodeuis[node.id]) { nodeuis[node.id]=new NodeUI(node,this,0,false); }
125 return nodeuis[node.id];
128 public function deleteWayUI(way:Way):void {
129 if (!wayuis[way.id]) { return; }
130 wayuis[way.id].removeSprites();
131 delete wayuis[way.id];
134 public function deleteNodeUI(node:Node):void {
135 if (!nodeuis[node.id]) { return; }
136 nodeuis[node.id].removeSprites();
137 delete nodeuis[node.id];
140 public function renumberWayUI(way:Way,oldID:Number):void {
141 if (!wayuis[oldID]) { return; }
142 wayuis[way.id]=wayuis[oldID];
143 delete wayuis[oldID];
146 public function renumberNodeUI(node:Node,oldID:Number):void {
147 if (!nodeuis[oldID]) { return; }
148 nodeuis[node.id]=nodeuis[oldID];
149 delete nodeuis[oldID];
152 private function getPaintSprite():Sprite {
153 var s:Sprite = new Sprite();
154 s.mouseEnabled = false;
155 s.mouseChildren = false;
159 private function getHitSprite():Sprite {
160 var s:Sprite = new Sprite();
164 public function redraw():void {
165 for each (var w:WayUI in wayuis) { w.recalculate(); w.redraw(); }
166 for each (var p:NodeUI in nodeuis) { p.redraw(); }
169 public function redrawPOIs():void {
170 for each (var p:NodeUI in nodeuis) { p.redraw(); }
173 public function findSource():VectorLayer {
175 for each (v in map.vectorlayers) {
176 if (v.paint==this) { return v; }