hackedteam/rcs-console

View on GitHub
src/it/ht/rcs/console/entities/view/components/PositionEditor.mxml

Summary

Maintainability
Test Coverage
<?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 &amp;&amp; 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>