import map.Layer;
import flash.geom.Point;
import flash.events.MouseEvent;
class InteractiveLayer extends Layer
{
var marks_lat:Array<Float>;
var marks_lng:Array<Float>;
var marks_xy:Array<Point>;
var marks_fixed:Array<Bool>;
var marks_count:Int;
var mark_id:Int;
public function new()
{
super();
marks_lat = new Array<Float>();
marks_lng = new Array<Float>();
marks_fixed = new Array<Bool>();
marks_xy = new Array<Point>();
marks_count = 0;
mouseEnabled = true;
buttonMode = false;
addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove2);
//test points
addMark(new LngLat(16.660036,49.487759), true, false);
addMark(new LngLat(16.663343,49.486342), false, false);
addMark(new LngLat(16.668463,49.484107), true, false);
addMark(new LngLat(16.672148,49.483342), false, false);
addMark(new LngLat(16.678405,49.482557), false, false);
addMark(new LngLat(16.685218,49.482312), false, false);
addMark(new LngLat(16.694393,49.477777), true, false);
addMark(new LngLat(16.710615,49.471790), false, false);
}
public function addMark(point:LngLat, fixed:Bool = false, update:Bool = true)
{
marks_lng.push(point.lng);
marks_lat.push(point.lat);
marks_fixed.push(fixed);
marks_count = marks_lng.length;
if (update)
updateContent(true);
}
/* mouse handling methods */
function hitTest(e:MouseEvent) : Int
{
var a:Point = getXY(globalToLocal(new Point(e.stageX, e.stageY)));
for (i in 0...marks_xy.length)
if ((Point.distance(marks_xy[i], a) < 8) && (!marks_fixed[i]))
return i;
return -1;
}
function onMouseDown(e:MouseEvent)
{
mark_id = hitTest(e);
if (mark_id != -1)
{
e.stopPropagation();
removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove2);
removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
flash.Lib.current.stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
flash.Lib.current.stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
}
}
function onMouseUp(e:MouseEvent)
{
flash.Lib.current.stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
flash.Lib.current.stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove2);
}
function onMouseMove2(e:MouseEvent)
{
buttonMode = false;
if (hitTest(e) != -1)
buttonMode = true;
}
function onMouseMove(e:MouseEvent)
{
if (mark_id > -1)
{
var p:LngLat = getLngLat(globalToLocal(new Point(e.stageX, e.stageY)));
marks_lng[mark_id] = p.lng;
marks_lat[mark_id] = p.lat;
updateContent(true);
}
}
/* drawing methods */
function drawMark(p:Point, color:Int)
{
var s = new flash.display.Shape();
s.graphics.lineStyle(3,0xFFFFFF);
s.graphics.beginFill(color);
s.graphics.drawCircle(20, 20, 7);
s.graphics.endFill();
s.filters = [new flash.filters.DropShadowFilter(3,145,0x000000, 0.5)];
var bd = new flash.display.BitmapData(Std.int(s.width + 20),
Std.int(s.height + 20),
true, 0x00FFFFFF); //w,h
bd.draw(s);
graphics.lineStyle(Math.NaN);
var matrix = new flash.geom.Matrix();
matrix.translate(p.x- bd.height / 2, p.y - bd.width / 2);
graphics.beginBitmapFill(bd, matrix, false);
graphics.drawRect(p.x - bd.height / 2, p.y - bd.width / 2, bd.height, bd.width);
graphics.endFill();
}
override function updateContent(forceUpdate:Bool=false)
{
if (!forceUpdate) return;
graphics.clear();
marks_xy = new Array<Point>();
var a:Point = getOriginXY();
var b:Point = null;
var zz = this.mapservice.zoom_def + zoom;
var ll = this.mapservice.lonlat2XY;
//draw path
graphics.lineStyle(6,0x004080, 0.9);
for (i in 0...marks_count)
{
if (b != null)
{
b = ll(marks_lng[i], marks_lat[i], zz);
b = b.subtract(a);
graphics.lineTo(b.x, b.y);
}
else
{
b = ll(marks_lng[i], marks_lat[i], zz);
b = b.subtract(a);
graphics.moveTo(b.x, b.y);
}
}
if (zoom < -2) return;
//draw marks
for (i in 0...marks_count)
{
b = ll(marks_lng[i], marks_lat[i], zz);
marks_xy.push(b);
b = b.subtract(a);
drawMark(b, (marks_fixed[i]) ? 0xFF0000 : 0x004080);
}
}
}