///////////////////////////////////////////////////////////////////////////
// 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*/
}
});
});