1 package net.systemeD.potlatch2.controller {
4 import net.systemeD.potlatch2.EditController;
5 import net.systemeD.halcyon.connection.*;
6 import net.systemeD.halcyon.Elastic;
7 import net.systemeD.halcyon.Globals;
9 public class DrawWay extends SelectedWay {
10 private var elastic:Elastic;
11 private var editEnd:Boolean;
13 public function DrawWay(way:Way, editEnd:Boolean) {
15 this.editEnd = editEnd;
18 override public function processMouseEvent(event:MouseEvent, entity:Entity):ControllerState {
21 var focus:Entity = NoSelection.getTopLevelFocusEntity(entity);
23 if ( event.type == MouseEvent.MOUSE_UP ) {
24 if ( entity == null ) {
25 node = createAndAddNode(event);
27 } else if ( entity is Node ) {
28 appendNode(entity as Node);
29 controller.map.setHighlight(focus, { showNodesHover: false });
30 controller.map.setHighlight(selectedWay, { showNodes: true });
31 resetElastic(entity as Node);
32 } else if ( entity is Way ) {
33 node = createAndAddNode(event);
34 Way(entity).insertNodeAtClosestPosition(node, true);
37 } else if ( event.type == MouseEvent.MOUSE_MOVE ) {
39 controller.map.coord2lon(event.localX),
40 controller.map.coord2latp(event.localY));
42 } else if ( event.type == MouseEvent.MOUSE_OVER && focus!=selectedWay) {
43 controller.map.setHighlight(focus, { showNodesHover: true });
44 } else if ( event.type == MouseEvent.MOUSE_OUT && focus!=selectedWay) {
45 controller.map.setHighlight(focus, { showNodesHover: false });
46 controller.map.setHighlight(selectedWay, { showNodes: true });
47 // ** this call to setHighlight(selectedWay) is necessary in case the hovered way (blue nodes)
48 // shares any nodes with the selected way (red nodes): if they do, they'll be wiped out by the
50 // Ultimately we should fix this by referring to 'way :selected nodes' instead of 'nodes :selectedway'.
51 // But this will do for now.
52 // We could do with an optional way of calling WayUI.redraw to only do the nodes, which would be a
53 // useful optimisation.
59 protected function resetElastic(node:Node):void {
60 var mouse:Point = new Point(node.lon, node.latp);
61 elastic.start = mouse;
65 override public function processKeyboardEvent(event:KeyboardEvent):ControllerState {
66 if ( event.keyCode == 13 || event.keyCode == 27 )
67 return new SelectedWay(selectedWay);
71 public function createAndAddNode(event:MouseEvent):Node {
72 var lat:Number = controller.map.coord2lat(event.localY);
73 var lon:Number = controller.map.coord2lon(event.localX);
74 var node:Node = controller.connection.createNode({}, lat, lon);
79 protected function appendNode(node:Node):void {
81 selectedWay.appendNode(node);
83 selectedWay.insertNode(0, node);
86 override public function enterState():void {
89 var node:Node = selectedWay.getNode(editEnd ? selectedWay.length - 1 : 0);
90 var start:Point = new Point(node.lon, node.latp);
91 elastic = new Elastic(controller.map, start, start);
92 Globals.vars.root.addDebug("**** -> "+this);
94 override public function exitState():void {
96 elastic.removeSprites();
98 Globals.vars.root.addDebug("**** <- "+this);
100 override public function toString():String {