/////////////////////////////////////////////////////////////////////////// // 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', 'dojo/Evented', 'dojo/_base/lang', 'dojo/_base/html', 'dojo/_base/array', 'dojo/on', 'dojo/query', 'dijit/TooltipDialog', 'dijit/popup', 'dijit/registry', 'jimu/dijit/SymbolChooser', 'jimu/symbolUtils' ], function(declare, _WidgetBase, _TemplatedMixin, Evented, lang, html, array, on, query, TooltipDialog, dojoPopup, registry, SymbolChooser, jimuSymUtils) { return declare([_WidgetBase, _TemplatedMixin, Evented], { baseClass: 'jimu-symbol-picker', declaredClass: 'jimu.dijit.SymbolPicker', templateString: '
' + '
' + '
' + '
' + '
', tooltipDialog: null, _isTooltipDialogOpened: false, //options: //you must set symbol or type symbol: null, //optional type: null, //optional, available values:marker,line,fill,text cropImage: false, //optional customZIndex: null, //optional //public methods: //reset //showBySymbol //showByType //getSymbol //events: //change postCreate: function() { this.inherited(arguments); this._createTooltipDialog(); this._hideTooltipDialog(); var symbol = this.symbolChooser.getSymbol(); if(symbol){ this._drawSymbol(symbol); } }, destroy: function(){ this._hideTooltipDialog(); if(this.symbolChooser){ this.symbolChooser.destroy(); } this.symbolChooser = null; this.inherited(arguments); }, _createTooltipDialog: function() { var ttdContent = html.create("div"); this.tooltipDialog = new TooltipDialog({ content: ttdContent }); this.symbolChooser = new SymbolChooser({ cropImage: this.cropImage, customZIndex: this.customZIndex, symbol: this.symbol, type: this.type }); this.symbolChooser.placeAt(ttdContent); this.symbolChooser.startup(); this.own(on(this.symbolChooser, 'change', lang.hitch(this, function(newSymbol){ this._drawSymbol(newSymbol); this.emit('change', newSymbol); }))); this.own(on(this.domNode, 'click', lang.hitch(this, function(event){ event.stopPropagation(); event.preventDefault(); if(this._isTooltipDialogOpened){ this._hideTooltipDialog(); }else{ this._showTooltipDialog(); } }))); this.own(on(document.body, 'click', lang.hitch(this, function(event){ var target = event.target || event.srcElement; var colorPickers = this._getColorPickers(); if(colorPickers.length > 0){ var isClickColorPicker = array.some(colorPickers, function(colorPicker){ return colorPicker.isPartOfPopup(target); }); if(isClickColorPicker){ return; } } var node = this.tooltipDialog.domNode; var isInternal = target === node || html.isDescendant(target, node); //custom & cropImage=true if(this.cropImage){ var ifCustomOption = this.symbolChooser._isCustomImageOptionSelected(); if(ifCustomOption){ var _imageChooser = this.symbolChooser.imageChooser; var isCropOpen = _imageChooser.cropPopupOpen; var isMsgOpen = _imageChooser.msgPopupOpen; if(!isCropOpen && !isMsgOpen){ if(!isInternal){ this._hideTooltipDialog(); } } if(!(_imageChooser.cropPopup && _imageChooser.cropPopup.domNode)){ _imageChooser.cropPopupOpen = false; } if(!(_imageChooser.msgPopup && _imageChooser.msgPopup.domNode)){ _imageChooser.msgPopupOpen = false; } return; } } //custom & cropImage=false if(!isInternal){ this._hideTooltipDialog(); } }))); this.own(on(this.symbolChooser, 'resize', lang.hitch(this, function(){ if(this._isTooltipDialogOpened){ this._hideTooltipDialog(); this._showTooltipDialog(); } }))); }, _getColorPickers: function(){ var doms = query('.jimu-color-picker', this.symbolChooser.domNode); var colorPickers = array.map(doms, lang.hitch(this, function(dom){ return registry.byNode(dom); })); return colorPickers; }, reset: function(){ this.type = null; this.symbol = null; html.empty(this.symbolNode); this.symbolChooser.reset(); }, showBySymbol: function(symbol){ this.reset(); if(symbol){ this._drawSymbol(symbol); this.symbolChooser.showBySymbol(symbol); } }, showByType: function(type){ this.reset(); this.symbolChooser.showByType(type); var symbol = this.symbolChooser.getSymbol(); if (symbol) { this._drawSymbol(symbol); } }, getSymbol: function(){ return this.symbolChooser.getSymbol(); }, _drawSymbol: function(symbol) { html.empty(this.symbolNode); if (symbol) { var symbolDom = jimuSymUtils.createSymbolNode(symbol, { width: 16, height: 16 }); if (symbolDom) { html.place(symbolDom, this.symbolNode); } } }, _showTooltipDialog: function(){ if(this.tooltipDialog){ dojoPopup.open({ parent: this.getParent(), popup: this.tooltipDialog, around: this.domNode }); this._isTooltipDialogOpened = true; } }, _hideTooltipDialog: function(){ if(this.tooltipDialog){ dojoPopup.close(this.tooltipDialog); this._isTooltipDialogOpened = false; } } }); });