1 package net.systemeD.halcyon {
3 import flash.display.*;
4 import flash.geom.Matrix;
5 import flash.geom.Point;
6 import flash.geom.Rectangle;
7 import flash.text.AntiAliasType;
8 import flash.text.GridFitType;
9 import flash.text.TextField;
10 import flash.text.TextFormat;
11 import flash.events.*;
12 import net.systemeD.halcyon.styleparser.*;
13 import net.systemeD.halcyon.connection.*;
15 /** The elastic is a visual indication of a way that the user is currently in the process of drawing. */
16 public class Elastic {
18 public var map:Map; // reference to parent map
19 public var sprites:Array=new Array(); // instances in display list
20 private var editableLayer:MapPaint;
21 private var _start:Point;
22 private var _end:Point;
24 /** Create and draw the elastic. */
25 public function Elastic(map:Map, start:Point, end:Point) {
27 editableLayer = map.editableLayer;
33 public function set start(start:Point):void {
38 public function set end(end:Point):void {
43 public function get start():Point {
47 public function get end():Point {
51 /** Remove all currently existing sprites */
52 public function removeSprites():void {
54 while (sprites.length>0) {
55 var d:DisplayObject=sprites.pop(); d.parent.removeChild(d);
59 /** Draws the elastic - a dashed line on the highest paint layer. */
60 public function redraw():void {
63 // Create stroke object
64 var stroke:Shape = new Shape();
65 stroke.graphics.lineStyle(1, 0xff0000, 1, false, "normal", CapsStyle.ROUND, JointStyle.ROUND);
67 var l:DisplayObject=editableLayer.getPaintSpriteAt(editableLayer.maxlayer);
68 var o:DisplayObject=Sprite(l).getChildAt(3); // names layer
69 (o as Sprite).addChild(stroke);
72 dashedLine(stroke.graphics, [2,2]);
77 // ------------------------------------------------------------------------------------------
78 // Drawing support functions
80 // Draw dashed polyline
82 private function dashedLine(g:Graphics,dashes:Array):void {
83 var draw:Boolean=false, dashleft:Number=0, dc:Array=new Array();
84 var a:Number, xc:Number, yc:Number;
85 var curx:Number, cury:Number;
86 var dx:Number, dy:Number, segleft:Number=0;
91 g.moveTo(map.lon2coord(p0.x), map.latp2coord(p0.y));
92 while (i < 1 || segleft>0) {
93 if (dashleft<=0) { // should be ==0
94 if (dc.length==0) { dc=dashes.slice(0); }
98 if (segleft<=0) { // should be ==0
99 curx=map.lon2coord(p0.x);
100 dx=map.lon2coord(p1.x)-curx;
101 cury=map.latp2coord(p0.y);
102 dy=map.latp2coord(p1.y)-cury;
103 a=Math.atan2(dy,dx); xc=Math.cos(a); yc=Math.sin(a);
104 segleft=Math.sqrt(dx*dx+dy*dy);
108 if (segleft<=dashleft) {
109 // the path segment is shorter than the dash
111 moveLine(g,curx,cury,draw);
112 dashleft-=segleft; segleft=0;
114 // the path segment is longer than the dash
115 curx+=dashleft*xc; dx-=dashleft*xc;
116 cury+=dashleft*yc; dy-=dashleft*yc;
117 moveLine(g,curx,cury,draw);
118 segleft-=dashleft; dashleft=0;
123 private function moveLine(g:Graphics,x:Number,y:Number,draw:Boolean):void {
124 if (draw) { g.lineTo(x,y); }
125 else { g.moveTo(x,y); }