/////////////////////////////////////////////////////////////////////////// // 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/_base/lang', 'dojo/_base/html', 'dojo/on', 'dojo/_base/Color', 'dijit/TooltipDialog', 'dijit/popup', "jimu/dijit/ColorSelector" ], function(declare, _WidgetBase, _TemplatedMixin, lang, html, on, Color, TooltipDialog, dojoPopup, ColorSelector) { return declare([_WidgetBase, _TemplatedMixin], { baseClass: 'jimu-color-picker-btn', declaredClass: 'jimu.dijit.ColorPickerButton', templateString: '
' + '
' + '
' + '
' + '
', _isTooltipDialogOpened: false, //options: color: null, //dojo.Color or hex string showHex: true, showHsv: true, showRgb: true, ensureMode: false, //public methods: //setColor //getColor //isPartOfPopup //events: //change postMixInProperties: function() { this.nls = window.jimuNls.common; }, postCreate: function() { this.inherited(arguments); if (this.color) { if (!(this.color instanceof Color)) { this.color = new Color(this.color); } } else { this.color = new Color('#ccc'); } html.setStyle(this.colorNode, 'backgroundColor', this.color.toHex()); this.colorNode.title = this.color.toHex(); if (this.showLabel) { this._changeLabel(this.color); } this._createTooltipDialog(this.domNode); this._hideTooltipDialog(); this.own(on(this.colorNode, 'click', lang.hitch(this, this._onNodeClick))); this.own(on(this.actionNode, 'click', lang.hitch(this, this._onNodeClick))); this.own(on(document.body, 'click', lang.hitch(this, function(event) { var target = event.target || event.srcElement; if (!this.isPartOfPopup(target)) { this._hideTooltipDialog(); } }))); }, _onNodeClick: function(event) { event.stopPropagation(); event.preventDefault(); if (this._isTooltipDialogOpened) { this._hideTooltipDialog(); } else { this._showTooltipDialog(); } }, destroy: function() { dojoPopup.close(this.tooltipDialog); this.picker.destroy(); this.tooltipDialog.destroy(); this.inherited(arguments); }, isPartOfPopup: function(target) { var node = this.tooltipDialog.domNode; var isInternal = target === node || html.isDescendant(target, node); return isInternal; }, hideTooltipDialog: function() { this._hideTooltipDialog(); }, _showTooltipDialog: function() { dojoPopup.open({ parent: this.getParent(), popup: this.tooltipDialog, around: this.domNode }); this._isTooltipDialogOpened = true; }, _hideTooltipDialog: function() { dojoPopup.close(this.tooltipDialog); this._isTooltipDialogOpened = false; }, _createTooltipDialog: function() { var ttdContent = html.create("div"); this.tooltipDialog = new TooltipDialog({ content: ttdContent }); html.addClass(this.tooltipDialog.domNode, 'jimu-color-picker-dialog'); this.picker = new ColorSelector({ showHex: this.showHex, showRgb: this.showRgb, showHsv: this.showHsv, value: this.color.toHex(), onChange: lang.hitch(this, function(newHex) { if (!this.ensureMode) { var color = new Color(newHex); this.setColor(color); } }) }); this.picker.placeAt(ttdContent); this.picker.startup(); if (this.ensureMode) { var cancel = html.create('div', { 'class': 'jimu-btn jimu-btn-vacation jimu-float-trailing jimu-leading-margin1', 'title': this.nls.cancel, 'innerHTML': this.nls.cancel }, ttdContent); this.own(on(cancel, 'click', lang.hitch(this, function() { this._hideTooltipDialog(); }))); var ok = html.create('div', { 'class': 'jimu-btn jimu-float-trailing jimu-leading-margin1', 'title': this.nls.ok, 'innerHTML': this.nls.ok }, ttdContent); this.own(on(ok, 'click', lang.hitch(this, function() { var c = this.picker.get('value'); this.setColor(new Color(c)); this._hideTooltipDialog(); }))); var apply = html.create('div', { 'class': 'jimu-btn jimu-float-trailing jimu-leading-margin1', 'title': this.nls.apply, 'innerHTML': this.nls.apply }, ttdContent); this.own(on(apply, 'click', lang.hitch(this, function() { var c = this.picker.get('value'); this.setColor(new Color(c)); }))); } }, setColor: function(newColor) { if (!(newColor instanceof Color)) { return; } var oldColor = this.color; var oldHex = ''; if (oldColor) { oldHex = oldColor.toHex(); } var newHex = newColor.toHex(); this.color = newColor; html.setStyle(this.colorNode, 'backgroundColor', newHex); if (oldHex !== newHex) { this.picker.set('value', newHex); this.onChange(new Color(newHex)); } }, getColor: function() { return this.color; }, onChange: function(newColor) { /*jshint unused: false*/ } }); });