1 package net.systemeD.potlatch2.controller {
3 import flash.ui.Keyboard;
4 import net.systemeD.potlatch2.EditController;
5 import net.systemeD.halcyon.connection.*;
6 import net.systemeD.halcyon.connection.actions.*;
7 import net.systemeD.halcyon.Globals;
9 public class SelectedWayNode extends SelectedWay {
10 protected var initNode:Node;
12 public function SelectedWayNode(way:Way,node:Node) {
17 protected function selectNode(way:Way,node:Node):void {
18 if ( way == selectedWay && node == selectedNode )
22 controller.setSelectedEntity(node);
23 controller.map.setHighlight(way, { showNodes: true, nodeSelected: node.id });
24 selectedWay = way; initWay = way;
25 selectedNode = node; initNode = node;
28 override protected function clearSelection():void {
29 if ( selectedNode != null ) {
30 controller.map.setHighlight(selectedWay, { selected: false, showNodes: false, nodeSelected: null });
31 controller.setSelectedEntity(null);
37 override public function processMouseEvent(event:MouseEvent, entity:Entity):ControllerState {
38 if (event.type==MouseEvent.MOUSE_MOVE || event.type==MouseEvent.ROLL_OVER || event.type==MouseEvent.MOUSE_OUT) { return this; }
39 var focus:Entity = getTopLevelFocusEntity(entity);
41 if ( event.type == MouseEvent.MOUSE_UP && entity is Node && event.shiftKey ) {
43 var way:Way = controller.connection.createWay({}, [entity],
44 MainUndoStack.getGlobalStack().addAction);
45 return new DrawWay(way, true, false);
46 } else if ( event.type == MouseEvent.MOUSE_UP && entity is Node && focus == selectedWay ) {
47 // select node within way
48 return selectOrEdit(selectedWay, Node(entity));
49 } else if ( event.type == MouseEvent.MOUSE_DOWN && entity is Way && focus==selectedWay && event.shiftKey) {
50 // insert node within way (shift-click)
51 var d:DragWayNode=new DragWayNode(selectedWay, addNode(event), event, true);
55 var cs:ControllerState = sharedMouseEvents(event, entity);
60 override public function processKeyboardEvent(event:KeyboardEvent):ControllerState {
61 switch (event.keyCode) {
62 case 88: return splitWay();
63 case Keyboard.BACKSPACE: return deleteNode();
64 case Keyboard.DELETE: return deleteNode();
69 override public function enterState():void {
70 selectNode(initWay,initNode);
71 Globals.vars.root.addDebug("**** -> "+this);
73 override public function exitState():void {
75 Globals.vars.root.addDebug("**** <- "+this);
78 override public function toString():String {
79 return "SelectedWayNode";
82 public static function selectOrEdit(selectedWay:Way, entity:Node):ControllerState {
83 var isFirst:Boolean = false;
84 var isLast:Boolean = false;
85 isFirst = selectedWay.getNode(0) == entity;
86 isLast = selectedWay.getNode(selectedWay.length - 1) == entity;
87 if ( isFirst == isLast ) // both == looped, none == central node
88 return new SelectedWayNode(selectedWay, entity);
90 return new DrawWay(selectedWay, isLast, true);
93 public function splitWay():ControllerState {
94 // abort if start or end
95 if (selectedWay.getNode(0 ) == selectedNode) { return this; }
96 if (selectedWay.getNode(selectedWay.length-1) == selectedNode) { return this; }
98 MainUndoStack.getGlobalStack().addAction(new SplitWayAction(selectedWay, selectedNode));
100 return new SelectedWay(selectedWay);
103 public function deleteNode():ControllerState {
104 selectedNode.remove(MainUndoStack.getGlobalStack().addAction);
105 return new SelectedWay(selectedWay);