1 package net.systemeD.halcyon {
3 import flash.display.*;
5 import flash.text.AntiAliasType;
6 import flash.text.GridFitType;
7 import flash.text.TextField;
8 import flash.text.TextFormat;
9 import flash.geom.Matrix;
10 import flash.geom.Point;
11 import net.systemeD.halcyon.connection.Node;
12 import net.systemeD.halcyon.connection.Connection;
13 import net.systemeD.halcyon.styleparser.*;
14 import net.systemeD.halcyon.Globals;
16 public class NodeUI extends EntityUI {
18 private var node:Node;
19 public var loaded:Boolean=false;
20 private var iconname:String=''; // name of icon
21 private var heading:Number=0; // heading within way
22 private var rotation:Number=0; // rotation applied to this POI
24 public function NodeUI(node:Node, map:Map, heading:Number=0) {
28 this.heading = heading;
29 node.addEventListener(Connection.NODE_MOVED, nodeMoved);
32 public function nodeMoved(event:Event):void {
36 public function redraw(sl:StyleList=null,forceDraw:Boolean=false):Boolean {
37 // *** forcedraw can be removed
39 var tags:Object = node.getTagsCopy();
42 if (!node.hasParentWays) { tags[':poi']='yes'; }
43 for (var stateKey:String in stateClasses) {
44 tags[":"+stateKey] = stateKey;
47 if (!sl) { sl=map.ruleset.getStyles(this.node,tags); }
49 var inWay:Boolean=node.hasParentWays;
50 var hasStyles:Boolean=sl.hasStyles();
52 removeSprites(); iconname='';
53 return renderFromStyle(sl,tags);
56 private function renderFromStyle(sl:StyleList,tags:Object):Boolean {
57 var r:Boolean=false; // ** rendered
61 for (var sublayer:int=10; sublayer>=0; sublayer--) {
63 if (sl.pointStyles[sublayer]) {
64 var s:PointStyle=sl.pointStyles[sublayer];
66 if (s.rotation) { rotation=s.rotation; }
68 if (s.icon_image!=iconname) {
69 if (s.icon_image=='square') {
72 addToLayer(icon,STROKESPRITE,sublayer);
73 w=styleIcon(icon,sl,sublayer);
74 icon.graphics.drawRect(0,0,w,w);
79 } else if (s.icon_image=='circle') {
82 addToLayer(icon,STROKESPRITE,sublayer);
83 w=styleIcon(icon,sl,sublayer);
84 icon.graphics.drawCircle(w,w,w);
89 } else if (map.ruleset.images[s.icon_image]) {
90 // 'load' icon (actually just from library)
91 var loader:Loader = new Loader();
92 loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event):void { loadedIcon(e,sublayer); } );
93 loader.loadBytes(map.ruleset.images[s.icon_image]);
94 iconname=s.icon_image;
97 // already loaded, so just reposition
103 var a:String, t:TextStyle;
104 if (sl.textStyles[sublayer]) {
105 t=sl.textStyles[sublayer];
110 var name:Sprite=new Sprite();
111 addToLayer(name,NAMESPRITE);
112 t.writeNameLabel(name,a,map.lon2coord(node.lon),map.latp2coord(node.latp));
119 private function styleIcon(icon:Sprite, sl:StyleList, sublayer:uint):Number {
123 if (sl.shapeStyles[sublayer]) {
124 var s:ShapeStyle=sl.shapeStyles[sublayer];
125 if (s.color) { icon.graphics.beginFill(s.color); }
126 if (s.casing_width || s.casing_color!=false) {
127 icon.graphics.lineStyle(s.casing_width ? s.casing_width : 1,
128 s.casing_color ? s.casing_color : 0,
129 s.casing_opacity ? s.casing_opacity : 1);
130 // ** this appears to give casing to things that shouldn't have it
131 // Globals.vars.root.addDebug("casing: "+(s.casing_width ? s.casing_width : 1)+","+(s.casing_color ? s.casing_color : 0)+","+(s.casing_opacity ? s.casing_opacity : 1));
136 return sl.pointStyles[sublayer].icon_width ? sl.pointStyles[sublayer].icon_width : 4;
139 private function addHitSprite(w:uint):void {
140 var hitzone:Sprite = new Sprite();
141 hitzone.graphics.lineStyle(4, 0x000000, 1, false, "normal", CapsStyle.ROUND, JointStyle.ROUND);
142 hitzone.graphics.beginFill(0);
143 hitzone.graphics.drawRect(0,0,w,w);
144 addToLayer(hitzone, CLICKSPRITE);
145 hitzone.visible = false;
146 createListenSprite(hitzone);
149 private function loadedIcon(event:Event,sublayer:uint):void {
150 var icon:Sprite=new Sprite();
151 addToLayer(icon,STROKESPRITE,sublayer);
152 icon.addChild(Bitmap(event.target.content));
153 addHitSprite(icon.width);
158 override protected function mouseEvent(event:MouseEvent):void {
159 map.entityMouseEvent(event, node);
162 private function updatePosition():void {
163 if (!loaded) { return; }
165 // ** this won't work with text objects. They have a different .x and .y
166 // and (obviously) don't need to be rotated. Needs fixing
167 for (var i:uint=0; i<sprites.length; i++) {
168 var d:DisplayObject=sprites[i];
169 d.x=0; d.y=0; d.rotation=0;
171 var m:Matrix=new Matrix();
172 m.translate(-d.width/2,-d.height/2);
174 m.translate(map.lon2coord(node.lon),map.latp2coord(node.latp));
175 d.transform.matrix=m;