1 package net.systemeD.potlatch2.controller {
3 import flash.display.DisplayObject;
4 import flash.ui.Keyboard;
5 import net.systemeD.potlatch2.EditController;
6 import net.systemeD.potlatch2.tools.Parallelise;
7 import net.systemeD.potlatch2.tools.Simplify;
8 import net.systemeD.halcyon.connection.*;
9 import net.systemeD.halcyon.MapPaint;
10 import net.systemeD.halcyon.WayUI;
11 import net.systemeD.halcyon.Globals;
13 public class SelectedWay extends ControllerState {
14 protected var initWay:Way;
16 public function SelectedWay(way:Way) {
20 protected function selectWay(way:Way):void {
21 if ( firstSelected is Way && Way(firstSelected)==way )
25 controller.map.setHighlight(way, { selected: true, hover: false });
26 controller.map.setHighlightOnNodes(way, { selectedway: true });
28 controller.updateSelectionUI();
32 protected function clearSelection(newState:ControllerState):void {
34 controller.map.setHighlight(firstSelected, { selected: false, hover: false });
35 controller.map.setHighlightOnNodes(firstSelected as Way, { selectedway: false });
37 if (!newState.isSelectionState()) { controller.updateSelectionUI(); }
41 override public function processMouseEvent(event:MouseEvent, entity:Entity):ControllerState {
42 if (event.type==MouseEvent.MOUSE_MOVE || event.type==MouseEvent.ROLL_OVER || event.type==MouseEvent.MOUSE_OUT) { return this; }
43 var focus:Entity = getTopLevelFocusEntity(entity);
45 if ( event.type == MouseEvent.MOUSE_UP && entity is Node && event.shiftKey ) {
47 var way:Way = controller.connection.createWay({}, [entity], MainUndoStack.getGlobalStack().addAction);
48 return new DrawWay(way, true, false);
49 } else if ( event.type == MouseEvent.MOUSE_DOWN && entity is Way && focus==firstSelected && event.shiftKey) {
50 // insert node within way (shift-click)
51 var d:DragWayNode=new DragWayNode(firstSelected as Way, -1, event, true);
54 } else if ( event.type == MouseEvent.MOUSE_DOWN && entity is Way && event.shiftKey ) {
56 return mergeWith(entity as Way);
57 } else if ( event.type == MouseEvent.MOUSE_DOWN && event.ctrlKey && entity!=firstSelected) {
59 return new SelectedMultiple([firstSelected,entity]);
61 var cs:ControllerState = sharedMouseEvents(event, entity);
62 return cs ? cs : this;
65 override public function processKeyboardEvent(event:KeyboardEvent):ControllerState {
66 switch (event.keyCode) {
67 case 80: return new SelectedParallelWay(firstSelected as Way);
68 case 82: repeatTags(firstSelected); return this;
69 case 86: Way(firstSelected).reverseNodes(MainUndoStack.getGlobalStack().addAction); return this;
70 case 89: Simplify.simplify(firstSelected as Way, controller.map, true); return this;
71 case Keyboard.BACKSPACE: if (event.shiftKey) { return deleteWay(); } break;
72 case Keyboard.DELETE: if (event.shiftKey) { return deleteWay(); } break;
74 var cs:ControllerState = sharedKeyboardEvents(event);
75 return cs ? cs : this;
78 protected function mergeWith(otherWay:Way):ControllerState {
81 if ( firstSelected.id < otherWay.id && firstSelected.id >= 0 ) {
82 way1 = firstSelected as Way;
86 way2 = firstSelected as Way;
89 var undo:Function = MainUndoStack.getGlobalStack().addAction;
92 if (way1 == way2) { return this; }
93 if (way1.getNode(0) ==way2.getNode(0) ) { way1.mergeWith(way2,0,0,undo); }
94 else if (way1.getNode(0) ==way2.getLastNode()) { way1.mergeWith(way2,0,way2.length-1,undo); }
95 else if (way1.getLastNode()==way2.getNode(0) ) { way1.mergeWith(way2,way1.length-1,0,undo); }
96 else if (way1.getLastNode()==way2.getLastNode()) { way1.mergeWith(way2,way1.length-1,way2.length-1,undo); }
97 return new SelectedWay(way1);
100 public function deleteWay():ControllerState {
101 controller.map.setHighlightOnNodes(firstSelected as Way, {selectedway: false});
102 selectedWay.remove(MainUndoStack.getGlobalStack().addAction);
103 return new NoSelection();
106 override public function enterState():void {
108 controller.map.setPurgable(selection,false);
109 Globals.vars.root.addDebug("**** -> "+this+" "+firstSelected.id);
111 override public function exitState(newState:ControllerState):void {
112 controller.clipboards['way']=firstSelected.getTagsCopy();
113 controller.map.setPurgable(selection,true);
114 clearSelection(newState);
115 Globals.vars.root.addDebug("**** <- "+this);
118 override public function toString():String {
119 return "SelectedWay";