///////////////////////////////////////////////////////////////////////////
|
// Copyright © 2014 - 2018 Esri. All Rights Reserved.
|
//
|
// Licensed under the Apache License Version 2.0 (the "License");
|
// you may not use this file except in compliance with the License.
|
// You may obtain a copy of the License at
|
//
|
// http://www.apache.org/licenses/LICENSE-2.0
|
//
|
// Unless required by applicable law or agreed to in writing, software
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
// See the License for the specific language governing permissions and
|
// limitations under the License.
|
///////////////////////////////////////////////////////////////////////////
|
|
define([
|
'dojo/_base/declare',
|
'dijit/_WidgetBase',
|
'dijit/_TemplatedMixin',
|
'dijit/_WidgetsInTemplateMixin',
|
'dojo/text!./templates/SearchDistance.html',
|
'dojo/Evented',
|
'dojo/_base/lang',
|
'jimu/utils',
|
'jimu/dijit/CheckBox',
|
'esri/tasks/GeometryService',
|
'dijit/form/Select',
|
'dijit/form/NumberTextBox'
|
],
|
function(declare, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, template, Evented, lang,
|
jimuUtils, CheckBox, GeometryService) {
|
|
return declare([_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, Evented], {
|
baseClass: 'jimu-dijit-searchdistance',
|
templateString: template,
|
lastMeters: 0,//meters
|
|
//options:
|
tip: '',
|
distance: 0,
|
unit: '',
|
|
//methods:
|
//isEnabled
|
//reset
|
//setDistance
|
//setUnit
|
//getData
|
//getDistance
|
//getUnit
|
//getUnitToBuffer
|
//getStatus
|
|
//event:
|
//change
|
|
postMixInProperties:function(){
|
this.inherited(arguments);
|
this.nls = lang.clone(window.jimuNls.units);
|
if(!this.tip){
|
this.tip = window.jimuNls.searchDistance.applySearchDistance;
|
}
|
},
|
|
postCreate: function(){
|
this.inherited(arguments);
|
this.cbx = new CheckBox({
|
label: this.tip,
|
onChange: lang.hitch(this, this._onCbxChanged)
|
});
|
this.cbx.placeAt(this.cbxDiv);
|
this.reset();
|
this.setDistance(this.distance);
|
this.setUnit(this.unit);
|
this.lastMeters = this.getMeters();
|
},
|
|
enable: function(){
|
this.cbx.check();
|
},
|
|
disable: function(){
|
this.cbx.uncheck();
|
},
|
|
isEnabled: function(){
|
return this.cbx.getValue();
|
},
|
|
reset: function(){
|
// this.cbx.uncheck();
|
this.numberTextBox.set('value', 0);
|
this.unitSelect.set('value', "MILES");
|
},
|
|
getData: function(){
|
var data = {
|
status: this.getStatus(),
|
isEnabled: this.isEnabled(),
|
distance: this.getDistance(),
|
unit: this.getUnit(),
|
bufferUnit: this.getUnitToBuffer(),
|
meters: this.getMeters()
|
};
|
return data;
|
},
|
|
//-1 means SearchDistance is enabled with invalid distance number
|
//0 means SearchDistance is not enabled or enabled with distance 0
|
//1 means SearchDistance is enabled with valid distance number
|
getStatus: function(){
|
var status;
|
if(this.isEnabled()){
|
var distance = this.getDistance();
|
if (distance > 0) {
|
status = 1;
|
} else if (distance === 0) {
|
status = 0;
|
} else {
|
status = -1;
|
}
|
}else{
|
status = 0;
|
}
|
return status;
|
},
|
|
//if status < 0, returned value = -1
|
//if status == 0, returned value = 0
|
//if status > 0, returned value > 0
|
getMeters: function(){
|
var meters = 0;
|
var status = this.getStatus();
|
if(status > 0){
|
var distance = this.getDistance();
|
var unit = this.getUnit();
|
if(unit === 'MILES'){
|
meters = distance * 1609.344;
|
}else if(unit === 'KILOMETERS'){
|
meters = distance * 1000;
|
}else if(unit === 'FEET'){
|
meters = distance * 0.3048;
|
}else if(unit === 'METERS'){
|
meters = distance;
|
}else if(unit === 'YARDS'){
|
meters = distance * 0.9144;
|
}else if(unit === 'NAUTICAL_MILES'){
|
meters = distance * 1852;
|
}
|
meters = parseFloat(meters.toFixed(3));
|
}else if(status === 0){
|
meters = 0;
|
}else if(status < 0){
|
meters = -1;
|
}
|
return meters;
|
},
|
|
setDistance: function(distance){
|
if(typeof distance === 'number' && distance >= 0){
|
this.numberTextBox.set('value', distance);
|
}
|
},
|
|
setUnit: function(unit){
|
if(unit && typeof unit === 'string'){
|
this.unitSelect.set('value', unit);
|
}
|
},
|
|
tryShowValidationError: function(){
|
if(!this.numberTextBox.validate()){
|
jimuUtils.showValidationErrorTipForFormDijit(this.numberTextBox);
|
}
|
},
|
|
//always return a number
|
//if return -1, means user input a invalid value
|
getDistance: function(){
|
if(!this.numberTextBox.validate()){
|
jimuUtils.showValidationErrorTipForFormDijit(this.numberTextBox);
|
return -1;
|
}
|
return this.numberTextBox.get('value');
|
},
|
|
getUnit: function(){
|
return this.unitSelect.get('value');
|
},
|
|
getUnitToBuffer: function(){
|
var bufferUnit = '';
|
var unit = this.unitSelect.get('value');
|
switch(unit){
|
case 'MILES':
|
bufferUnit = GeometryService.UNIT_STATUTE_MILE;
|
break;
|
case 'KILOMETERS':
|
bufferUnit = GeometryService.UNIT_KILOMETER;
|
break;
|
case 'FEET':
|
bufferUnit = GeometryService.UNIT_FOOT;
|
break;
|
case 'METERS':
|
bufferUnit = GeometryService.UNIT_METER;
|
break;
|
case 'YARDS':
|
bufferUnit = GeometryService.UNIT_INTERNATIONAL_YARD;
|
break;
|
case 'NAUTICAL_MILES':
|
bufferUnit = GeometryService.UNIT_NAUTICAL_MILE;
|
break;
|
default:
|
break;
|
}
|
return bufferUnit;
|
},
|
|
_onCbxChanged: function(){
|
if(this.cbx.getValue()){
|
this.numberTextBox.set('disabled', false);
|
this.unitSelect.set('disabled', false);
|
}else{
|
this.numberTextBox.set('disabled', true);
|
this.unitSelect.set('disabled', true);
|
}
|
this._emitEvent();
|
},
|
|
_onNumberTextBoxChanged: function(){
|
this._emitEvent();
|
},
|
|
_onUnitSelectChanged: function(){
|
this._emitEvent();
|
},
|
|
_emitEvent: function(){
|
var data = this.getData();
|
if(data.meters !== this.lastMeters){
|
this.lastMeters = data.meters;
|
this.emit("change", data);
|
}
|
}
|
|
});
|
});
|