src/it/ht/rcs/console/entities/view/components/PositionEditor.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:maps="it.ht.rcs.console.maps.*"
width="440"
horizontalAlign="center"
addedToStage="reset()"
>
<fx:Declarations>
<s:RadioButtonGroup id="mode"
itemClick="onModeChange()"/>
</fx:Declarations>
<fx:Script>
<![CDATA[
import it.ht.rcs.console.entities.model.Entity;
import locale.R;
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.rpc.events.ResultEvent;
[Bindable]
private var inputMode:String;
public var position:Object={latitude:0, longitude:0, accuracy:100}
private var defaultAccuracy:Number=100;
private const ADDRESS:String="address";
private const COORDINATES:String="coordinates";
public function reset():void
{
defaultAccuracy=0.1
inputMode=ADDRESS;
if (resultBox)
resultBox.visible=false;
if (addressRb)
addressRb.selected=true;
if (coordinatesRb)
coordinatesRb.selected=false;
if (addressTxt)
addressTxt.text="";
if (latTxt)
latTxt.text="0";
if (longTxt)
longTxt.text="0";
if (accuracyTxt)
accuracyTxt.text=String(defaultAccuracy*1000);
if(mapViewer)
{
var marker:Object=new Object()
marker.position=new ArrayCollection();
marker.position.addItem(0); //long
marker.position.addItem(0); //lat
marker.radius=defaultAccuracy;
marker.draggable=true;
mapViewer.positions=new Vector.<Object>();
mapViewer.positions.push(marker);
mapViewer.update();
position.latitude=0;
position.longitude=0;
position.accuracy=defaultAccuracy;
positionTxt.text="Latitude: "+int(position.latitude*10000)/10000+", Longitude: "+int(position.longitude*10000)/10000+", Accuracy: "+position.accuracy
}
}
public function set(entity:Entity):void
{
defaultAccuracy=Number(entity.position_attr.accuracy)
inputMode=ADDRESS;
if (resultBox)
resultBox.visible=false;
if (addressRb)
addressRb.selected=true;
if (coordinatesRb)
coordinatesRb.selected=false;
if (addressTxt)
addressTxt.text="";
if (latTxt)
latTxt.text=String(entity.position.latitude);
if (longTxt)
longTxt.text=String(entity.position.longitude);
if (accuracyTxt)
accuracyTxt.text=String(defaultAccuracy);
if(mapViewer)
{
var marker:Object=new Object();
marker.position=new ArrayCollection();
marker.position.addItem(entity.position.longitude); //long
marker.position.addItem(entity.position.latitude); //lat
marker.radius=entity.position_attr.accuracy; //???
marker.draggable=true;
mapViewer.positions=new Vector.<Object>();
mapViewer.positions.push(marker);
mapViewer.update();
position.latitude=entity.position.latitude;
position.longitude=entity.position.longitude;
position.accuracy=defaultAccuracy;
positionTxt.text="Latitude: "+int(position.latitude*10000)/10000+", Longitude: "+int(position.longitude*10000)/10000+", Accuracy: "+position.accuracy
}
}
private function drawAccuracy():void
{
if(accuracyTxt)
defaultAccuracy=Number(accuracyTxt.text);
position.accuracy=defaultAccuracy;
positionTxt.text="Latitude: "+int(position.latitude*10000)/10000+", Longitude: "+int(position.longitude*10000)/10000+", Accuracy: "+position.accuracy
if(mapViewer)
{
mapViewer.setAccuracy(Number(accuracyTxt.text))
}
}
private function onModeChange():void
{
defaultAccuracy=0.1;
inputMode=String(mode.selectedValue)
if(mapViewer)
{
var marker:Object=new Object()
marker.position=new ArrayCollection();
marker.position.addItem(0); //long
marker.position.addItem(0); //lat
marker.radius=100;
marker.draggable=true;
mapViewer.positions=new Vector.<Object>();
mapViewer.positions.push(marker);
mapViewer.update();
position.latitude=0;
position.longitude=0;
position.accuracy=defaultAccuracy;
positionTxt.text="Latitude: "+int(position.latitude*10000)/10000+", Longitude: "+int(position.longitude*10000)/10000+", Accuracy: "+position.accuracy
}
if (inputMode == COORDINATES)
{
resultBox.visible=false;
placemarksList.dataProvider=null;
if (addressTxt)
addressTxt.text="";
if (latTxt)
latTxt.text="0";
if (longTxt)
longTxt.text="0";
}
if (inputMode == ADDRESS)
{
resultBox.visible=false;
placemarksList.dataProvider=null;
if (addressTxt)
addressTxt.text="";
if (latTxt)
latTxt.text="";
if (longTxt)
longTxt.text="";
}
String(defaultAccuracy)
if (accuracyTxt)
accuracyTxt.text=String(defaultAccuracy*1000);
position.latitude=0;
position.longitude=0;
position.accuracy=defaultAccuracy;
positionTxt.text="Latitude: "+int(position.latitude*10000)/10000+", Longitude: "+int(position.longitude*10000)/10000+", Accuracy: "+position.accuracy
//redraw circle
}
private function resolveByAddress():void
{
if (addressTxt.text.length > 0)
{
mapViewer.codeAddress(addressTxt.text);
}
}
private function resolveByCoordinates():void
{
var latitude:Number=Number(latTxt.text);
var longitude:Number=Number(longTxt.text);
if (latTxt.text.length > 0 && longTxt.text.length>0)
{
if(latitude > 90 || latitude < -90)
{
Alert.show("Invalid latitude! Value must be between -90 and 90.", "Error!")
return;
}
if(longitude > 180 || longitude < -180)
{
Alert.show("Invalid longitude! Value must be between -180 and 180.", "Error!")
return;
}
if(mapViewer)
{
var marker:Object=new Object();
marker.position=new ArrayCollection();
marker.position.addItem(longitude); //long
marker.position.addItem(latitude); //lat
marker.radius=50; //???
marker.draggable=true;
mapViewer.positions=new Vector.<Object>();
mapViewer.positions.push(marker);
mapViewer.update();
position.latitude=latitude;
position.longitude=longitude;
position.accuracy=defaultAccuracy; //????
positionTxt.text="Latitude: "+int(position.latitude*10000)/10000+", Longitude: "+int(position.longitude*10000)/10000+", Accuracy: "+position.accuracy
}
}
}
private function selectPlacemark():void
{
if (placemarksList.selectedItem != null)
{
resultBox.visible=false;
var p:Object=placemarksList.selectedItem;
trace(p.geometry.location.lat());
trace(p.geometry.location.lng());
if(mapViewer)
{
var marker:Object=new Object();
marker.position=new ArrayCollection();
marker.position.addItem(p.geometry.location.lng()); //long
marker.position.addItem(p.geometry.location.lat()); //lat
marker.radius=50; //???
marker.draggable=true;
mapViewer.positions=new Vector.<Object>();
mapViewer.positions.push(marker);
mapViewer.update();
position.latitude=p.geometry.location.lat();
position.longitude=p.geometry.location.lng();
position.accuracy=defaultAccuracy; //????
positionTxt.text="Latitude: "+int(position.latitude*10000)/10000+", Longitude: "+int(position.longitude*10000)/10000+", Accuracy: "+position.accuracy;
}
positionTxt.text="Latitude: "+int(position.latitude*10000)/10000+", Longitude: "+int(position.longitude*10000)/10000+", Accuracy: "+position.accuracy;
}
}
private function onMarkerDrag(e:ResultEvent):void
{
latTxt.text=String(e.result.lat)
longTxt.text=String(e.result.lng)
position.latitude=e.result.lat
position.longitude=e.result.lng
position.accuracy=defaultAccuracy;
positionTxt.text="Latitude: "+int(position.latitude*10000)/10000+", Longitude: "+int(position.longitude*10000)/10000+", Accuracy: "+position.accuracy
//drawAccuracy();
}
protected function onAddressResult(event:ResultEvent):void
{
trace("solved")
var placemarks:Array=event.result as Array;
if (placemarks.length < 1)
{
trace("no result, search again")
}
else if (placemarks.length == 1)
{
trace("only 1 result, show directly on map")
resultBox.visible=false;
placemarksList.dataProvider=new ArrayCollection(placemarks)
placemarksList.selectedIndex=0;
selectPlacemark()
}
else if (placemarks.length > 1)
{
resultBox.visible=true;
placemarksList.dataProvider=new ArrayCollection(placemarks)
}
}
]]>
</fx:Script>
<s:HGroup width="100%"
paddingLeft="20"
paddingRight="20"
paddingBottom="4">
<s:RadioButton label="find by address"
group="{mode}"
id="addressRb"
value="{ADDRESS}"/>
<s:RadioButton label="find by cordinates"
group="{mode}"
id="coordinatesRb"
value="{COORDINATES}"/>
</s:HGroup>
<s:BorderContainer width="400"
height="300"
borderAlpha="1"
borderColor="0x666666"
backgroundColor="0xCCCCCC"
backgroundAlpha="0.3">
<maps:MapViewer width="100%"
height="100%"
id="mapViewer"
drag="onMarkerDrag(event)"
codeAddressResult="onAddressResult(event)"/>
<s:BorderContainer id="resultBox"
width="100%"
height="100%"
backgroundColor="0xFFFFFF"
backgroundAlpha="1"
borderAlpha="0">
<s:VGroup width="100%"
height="100%"
paddingBottom="10"
paddingLeft="10"
paddingRight="10"
paddingTop="10"
horizontalAlign="center">
<s:Label text="More than one result match you query. Please select one frome the list below or refine your search."
width="380"/>
<s:List width="100%"
height="100%"
id="placemarksList"
alpha="1"
labelField="formatted_address"
doubleClickEnabled="true"
doubleClick="selectPlacemark()"/>
<s:Button label="OK"
enabled="{placemarksList.selectedItem!=null}"
click="selectPlacemark()"/>
</s:VGroup>
</s:BorderContainer>
</s:BorderContainer>
<s:HGroup width="100%"
paddingLeft="20"
paddingRight="20"
visible="{inputMode==ADDRESS}"
includeInLayout="{inputMode==ADDRESS}"
horizontalAlign="left"
verticalAlign="middle"
paddingBottom="4"
paddingTop="4">
<s:Label text="{R.get('ADDRESS')}"
fontWeight="bold"
width="60"/>
<s:TextInput id="addressTxt"
width="250"
enter="resolveByAddress()"/>
<s:Spacer width="100%"/>
<s:Button label="Search"
click="resolveByAddress()"
enabled="{addressTxt.text.length>0}"/>
</s:HGroup>
<s:HGroup width="100%"
paddingLeft="20"
paddingRight="20"
paddingTop="4"
visible="{inputMode==COORDINATES}"
includeInLayout="{inputMode==COORDINATES}"
horizontalAlign="left"
verticalAlign="middle"
paddingBottom="4">
<s:Label text="{R.get('LATITUDE')}"
fontWeight="bold"
width="60"/>
<s:TextInput id="latTxt"
width="90"
restrict="[0-9].\-" />
<s:Label text="{R.get('LONGITUDE')}"
fontWeight="bold"
width="60"/>
<s:TextInput id="longTxt"
width="90"
restrict="[0-9].\-" />
<s:Spacer width="100%"/>
<s:Button label="Search"
click="resolveByCoordinates()"
enabled="{latTxt.text.length>0 && longTxt.text.length>0}"/>
</s:HGroup>
<s:HGroup width="100%"
paddingLeft="20"
paddingRight="20"
paddingBottom="4"
horizontalAlign="left"
verticalAlign="middle">
<s:Label text="Accuracy"
fontWeight="bold"
width="60"/>
<s:TextInput id="accuracyTxt"
width="50" restrict="[0-9]" change="drawAccuracy()"/>
<s:Label text="mt"
fontWeight="bold"
width="60"/>
</s:HGroup>
<s:HGroup width="100%"
paddingLeft="20"
paddingRight="20"
paddingTop="10"
horizontalAlign="center"
verticalAlign="middle">
<s:Label
fontWeight="bold" id="positionTxt" />
</s:HGroup>
</s:VGroup>