///////////////////////////////////////////////////////////////////////////
|
// 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',
|
'dojo/_base/lang',
|
'dojo/_base/html',
|
'dojo/on',
|
'dojo/Evented',
|
'dojo/Deferred',
|
'dijit/popup',
|
'dijit/_WidgetBase',
|
'dijit/_TemplatedMixin',
|
'dojo/text!./templates/LayerChooserFromMapWithDropbox.html',
|
'jimu/LayerInfos/LayerInfos'
|
],
|
function(declare, lang, html, on, Evented, Deferred, dojoPopup, _WidgetBase, _TemplatedMixin, template, LayerInfos) {
|
|
return declare([_WidgetBase, _TemplatedMixin, Evented], {
|
templateString: template,
|
baseClass: 'jimu-layer-chooser-from-map-withdropbox',
|
declaredClass: 'jimu.dijit.LayerChooserFromMapWithDropbox',
|
_selectedItem: null,//{layerInfo,name,url}
|
_isLayerChooserShow: false,
|
layerInfosObj: null,
|
|
//options:
|
layerChooser: null,//instance of LayerChooserFromMap
|
|
//public methods:
|
//getLayerChooser
|
//getSelectedItem
|
//showLayerChooser
|
//hideLayerChooser
|
|
//events:
|
//selection-change
|
|
postCreate: function() {
|
this.inherited(arguments);
|
this.layerInfosObj = LayerInfos.getInstanceSync();
|
this.layerChooser.domNode.style.zIndex = 1;
|
this.layerChooser.tree.domNode.style.borderTop = "0";
|
this.layerChooser.tree.domNode.style.maxHeight = "290px";
|
this.own(on(this.layerChooser, 'tree-click', lang.hitch(this, this._onTreeClick)));
|
this.own(on(this.layerChooser, 'update', lang.hitch(this, this._onLayerChooserUpdate)));
|
this.own(on(document.body, 'click', lang.hitch(this, this._onBodyClicked)));
|
},
|
|
destroy: function(){
|
this.hideLayerChooser();
|
if(this.layerChooser){
|
this.layerChooser.destroy();
|
}
|
this.layerChooser = null;
|
this.inherited(arguments);
|
},
|
|
getLayerChooser: function(){
|
return this.layerChooser;
|
},
|
|
//if resolves true, means we use the layer as the selected layer successfully
|
setSelectedLayer: function(layer){
|
var def = new Deferred();
|
if (layer) {
|
var layerInfo = this.layerInfosObj.getLayerInfoById(layer.id);
|
if (layerInfo) {
|
this.layerChooser.filter(layerInfo).then(lang.hitch(this, function(success){
|
if(success){
|
var item = {
|
layerInfo: layerInfo,
|
name: layerInfo.title,
|
url: layer.url
|
};
|
this._onSelectNewItem(item);
|
def.resolve(true);
|
}else{
|
def.resolve(false);
|
}
|
}), lang.hitch(this, function(){
|
def.resolve(false);
|
}));
|
} else {
|
def.resolve(false);
|
}
|
}else{
|
this._onSelectNewItem(null);
|
def.resolve(true);
|
}
|
|
return def;
|
},
|
|
getSelectedItem: function(){
|
return this._selectedItem;
|
},
|
|
getSelectedItems: function(){
|
return [this._selectedItem];
|
},
|
|
_onBodyClicked: function(evt){
|
var target = evt.target || evt.srcElement;
|
if(target === this.domNode || html.isDescendant(target, this.domNode)){
|
return;
|
}
|
if(target === this.layerChooser.domNode || html.isDescendant(target, this.layerChooser.domNode)){
|
return;
|
}
|
this.hideLayerChooser();
|
},
|
|
_onDropDownClick: function(evt) {
|
evt.stopPropagation();
|
evt.preventDefault();
|
if(this._isLayerChooserShow){
|
this.hideLayerChooser();
|
}else{
|
this.showLayerChooser();
|
}
|
},
|
|
_getSelectedItems: function(){
|
var items = this.layerChooser.getSelectedItems();
|
return items;
|
},
|
|
showLayerChooser: function() {
|
var width = this.domNode.clientWidth;
|
// if (width < 200) {
|
// width = 200;
|
// }
|
this.layerChooser.domNode.style.minWidth = width + 2 + "px";
|
|
dojoPopup.open({
|
parent: this,
|
popup: this.layerChooser,
|
around: this.domNode
|
});
|
|
var popupDom = this.layerChooser.domNode.parentNode;
|
if (popupDom) {
|
html.addClass(popupDom, 'jimu-layer-chooser-from-map-withdropbox-popup');
|
}
|
this._isLayerChooserShow = true;
|
},
|
|
hideLayerChooser: function() {
|
dojoPopup.close(this.layerChooser);
|
this._isLayerChooserShow = false;
|
},
|
|
_onLayerChooserUpdate: function(){
|
if(this._selectedItem && this.layerChooser.onlyShowVisible){
|
var layerInfo = this._selectedItem.layerInfo;
|
if(!layerInfo.isShowInMap()){
|
this._selectedItem = null;
|
this.emit('selection-change', []);
|
}
|
}
|
},
|
|
_onSelectNewItem: function(newSelectedItem){
|
var oldSelectedItem = this._selectedItem;
|
var oldSelectedItemId = lang.getObject("layerInfo.id", false, oldSelectedItem) || -1;
|
var newSelectedItemId = lang.getObject("layerInfo.id", false, newSelectedItem) || -1;
|
|
var isChanged = oldSelectedItemId !== newSelectedItemId;
|
this._selectedItem = newSelectedItem;
|
this.hideLayerChooser();
|
var title = lang.getObject("layerInfo.title", false, this._selectedItem) || "";
|
this.layerNameNode.innerHTML = title;
|
html.setAttr(this.layerNameNode, 'title', title);
|
var layer = lang.getObject("layerInfo.layerObject", false, this._selectedItem);
|
|
if(isChanged){
|
this.emit('selection-change', [layer]);
|
}
|
},
|
|
_onTreeClick: function() {
|
var selectedItems = this._getSelectedItems();
|
var selectedItem = selectedItems.length > 0 ? selectedItems[0] : null;
|
this._onSelectNewItem(selectedItem);
|
}
|
});
|
});
|