///////////////////////////////////////////////////////////////////////////
// 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/SymbolChooser.html',
'dojo/Evented',
'dojo/_base/lang',
'dojo/_base/html',
'dojo/_base/array',
'dojo/on',
'dojo/sniff',
'dojo/query',
'dojo/request/xhr',
'dojo/Deferred',
'dojox/gfx',
'dojo/promise/all',
'jimu/utils',
'jimu/symbolUtils',
'jimu/portalUrlUtils',
'esri/symbols/jsonUtils',
'esri/symbols/SimpleMarkerSymbol',
'esri/symbols/PictureMarkerSymbol',
'esri/symbols/SimpleLineSymbol',
'esri/symbols/SimpleFillSymbol',
'esri/symbols/TextSymbol',
'esri/symbols/Font',
'esri/arcgis/Portal',
'esri/request',
'jimu/dijit/ImageChooser',
'jimu/dijit/ColorPicker',
'jimu/dijit/_Transparency',
'jimu/dijit/LoadingIndicator',
'dijit/form/Select',
'dijit/form/NumberSpinner'
],
function(declare, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin,
template, Evented, lang, html, array, on, has, query, xhr, Deferred, gfx, all,
jimuUtils, jimuSymUtils, portalUrlUtils, esriSymJsonUtils, SimpleMarkerSymbol, PictureMarkerSymbol,
SimpleLineSymbol, SimpleFillSymbol, TextSymbol, Font, Portal, request, ImageChooser) {
return declare([_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, Evented], {
templateString:template,
baseClass: 'jimu-symbol-chooser',
declaredClass: 'jimu.dijit.SymbolChooser',
nls: null,
_pointEventsBinded: false,
_lineEventBinded: false,
_fillEventBinded: false,
_textEventBinded: false,
_invokeSymbolChangeEvent: true,
_customPictureMarkerSymbol: null,
//options:
//you must set symbol or type
symbol: null,//optional
type: null,//optional, available values:marker,line,fill,text
DEFAULT_PORTAL_URL: "//arcgis.com/",
_portalLoadTimeoutInMs: 3000,
_isOnline: true,
// Do not change the order of `_localTypes`, it matches local symbol data
_localTypes: [
'basic',
'A-Z',
'arrows',
'business',
'cartographic',
'nationalParkService',
'outdoorRecreation',
'peoplePlaces',
'safetyHealth',
'shapes',
'transportation',
'damage',
'disasters',
'emergencyManagement',
'generalInfrastructure',
'localGovernment',
'numbers',
'pointsOfInterest',
'stateGovernment',
'FireFly'
],
cropImage: false, //optional
//public methods:
//reset
//showBySymbol
//showByType
//getValidSymbol: Return a valid symbol. Return null if UI parameter is invalid.
//getSymbol: This method is deprecated. Pleause use getValidSymbol instead.
//events:
//change
//resize
postMixInProperties:function(){
this.nls = window.jimuNls.symbolChooser;
this._setTemplateNls();
},
postCreate:function(){
this.inherited(arguments);
this._initImageChooser();
this.own(on(document.body, 'click', lang.hitch(this, this._onBodyClicked)));
this._isIE8 = has('ie') === 8;
if(this._isIE8){
html.addClass(this.domNode, 'ie8');
}
if(this.symbol){
this.showBySymbol(this.symbol);
}
else if(this.type){
this.showByType(this.type);
}
},
reset: function(){
this.type = null;
this.symbol = null;
this._hideAllSections();
},
showBySymbol:function(symbol){
this.reset();
var declaredClass = symbol && symbol.declaredClass;
var isValid = declaredClass && typeof declaredClass === 'string' &&
declaredClass.indexOf('esri.symbol') >= 0;
if (!isValid) {
return;
}
this.symbol = this._cloneSymbol(symbol);
if(this.isSimpleMarkerSymbol(this.symbol) || this.isPictureMarkerSymbol(this.symbol)){
this.type = 'marker';
this._initPointSection();
}
else if(this.isSimpleLineSymbol(this.symbol)){
this.type = 'line';
this._initLineSection();
}
else if(this._isSimpleFillSymbol(this.symbol)){
this.type = 'fill';
this._initFillSection();
}
else if(this._isTextSymbol(this.symbol)){
this.type = 'text';
this._initTextSection();
}
},
showByType:function(type){
this.reset();
if(type === 'marker' || type === 'line' || type === 'fill' || type === 'text'){
this.type = type;
}
else{
return;
}
if(this.type === 'marker'){
this._initPointSection();
}
else if(this.type === 'line'){
this._initLineSection();
}
else if(this.type === 'fill'){
this._initFillSection();
}
else if(this.type === 'text'){
this._initTextSection();
}
},
getSymbol: function(){
return this._getSymbol(false);
},
getValidSymbol: function(){
return this._getSymbol(true);
},
_getSymbol:function(/*optional*/ checkValidity){
var symbol = null;
if(this.type === 'marker'){
symbol = this._getPointSymbolBySetting(checkValidity);
}
else if(this.type === 'line'){
symbol = this._getLineSymbolBySetting(checkValidity);
}
else if(this.type === 'fill'){
symbol = this._getFillSymbolBySetting(checkValidity);
}
else if(this.type === 'text'){
symbol = this._getTextSymbolBySetting(checkValidity);
}
var result = null;
if(symbol){
result = this._cloneSymbol(symbol);
}
return result;
},
hideColorPicker: function () {
var colorPickers = ["pointColor", "pointOutlineColor", "lineColor",
"fillColor", "fillOutlineColor", "textColor"];
for (var i = 0, len = colorPickers.length; i < len; i++) {
var colorPickerName = colorPickers[i];
if (this[colorPickerName]) {
this[colorPickerName].hideTooltipDialog();
}
}
},
_onBodyClicked: function(event){
var target = event.target || event.srcElement;
this._tryHideDropDownOfSelectDijit(target, this.pointSymClassSelect);
this._tryHideDropDownOfSelectDijit(target, this.lineStylesSelect);
},
_tryHideDropDownOfSelectDijit: function(target, selectDijit){
var d = selectDijit.domNode;
var d2 = selectDijit.dropDown.domNode;
var isClickSelectDitjit = target === d || html.isDescendant(target, d);
var isClickDropDown = target === d2 || html.isDescendant(target, d2);
if(!isClickSelectDitjit && !isClickDropDown){
selectDijit.dropDown.onCancel();
}
},
_onChange:function(newSymbol){
var cloneSym = this._cloneSymbol(newSymbol);
this.emit('change', cloneSym);
},
_hideAllSections: function(){
query('.symbol-section', this.domNode).style('display', 'none');
},
_showSection:function(type){
this._hideAllSections();
var s = '.' + type + '-symbol-section';
query(s, this.domNode).style('display', 'block');
},
_getAncestor:function(dom, checkFunc, maxLoop){
return jimuUtils.getAncestorDom(dom, checkFunc, maxLoop);
},
_getAbsoluteUrl:function(moduleName){
return window.location.protocol + "//" + window.location.host + require.toUrl(moduleName);
},
_cloneSymbol:function(symbol){
if(!symbol){
return null;
}
var clone = symbol;
try{
var jsonSym = symbol.toJson();
clone = esriSymJsonUtils.fromJson(jsonSym);
}
catch(e){
console.error(e);
}
return clone;
},
_createSymbolIconTable: function(fileName, jsonSyms, type) {
var countPerRow = 8;
var class0 = 'icon-table';
var class1 = this.type + "-icon-table";
var class2 = class1 + "-" + fileName;
var className = class0 + " " + class1 + " " + class2;
var table = html.toDom('
');
var tbody = query('tbody', table)[0];
var rowCount = Math.ceil(jsonSyms.length / countPerRow);
for (var i = 0; i < rowCount; i++) {
html.create('tr', {}, tbody);
}
var trs = query('tr', table);
array.forEach(jsonSyms, lang.hitch(this, function(jsonSym, index) {
var jsonSymClone = lang.clone(jsonSym);
var sym = esriSymJsonUtils.fromJson(jsonSym);
var rowIndex = Math.floor(index / countPerRow);
var tr = trs[rowIndex];
var td = html.create('td', {}, tr);
html.addClass(td, 'symbol-td-item');
var symNode = this._createSymbolNode(sym);
html.addClass(symNode, 'symbol-div-item');
var svgNode = symNode.firstChild;
html.addClass(svgNode, 'svg-node');
if (this._isIE8) {
if (type === 'point') {
if (window.isRTL) {
if (jsonSym.name === 'Cross' || jsonSym.name === 'X') {
html.setStyle(svgNode, 'right', '-20px');
html.setStyle(symNode, 'marginTop', '20px');
}
} else {
if (jsonSym.name === 'Cross' || jsonSym.name === 'X') {
html.setStyle(symNode, 'marginTop', '20px');
}
}
}
}
symNode.symbol = jsonSymClone;
html.place(symNode, td);
}));
return table;
},
_updatePreview:function(previewNode){
var node = previewNode;
var symbol = this._cloneSymbol(this.symbol);
html.empty(node);
var symbolNode = jimuSymUtils.createSymbolNode(symbol);
if (!symbolNode){
symbolNode = html.create('div');
}
html.place(symbolNode, previewNode);
},
_createSymbolNode:function(symbol){
var surfaceSize = {
width: 36,
height: 36
};
var symbolNode = jimuSymUtils.createSymbolNode(symbol, surfaceSize);
if (!symbolNode){
symbolNode = html.create('div');
}
html.setStyle(symbolNode, {
width: '36px',
height: '36px'
});
return symbolNode;
},
_getLineShapeDesc:function(symbol){
var result = null;
if (this.isSimpleLineSymbol(symbol) || this.isCartographicLineSymbol(symbol)) {
// we want a longer line
var shape = {
type: "path",
path: "M -90,0 L 90,0 E"
};
result = {
defaultShape: shape,
fill: null,
stroke: symbol.getStroke()
};
}
return result;
},
/* point section */
_initPointSection:function(){
this._showSection('point');
if (!this._pointEventsBinded) {
this._pointEventsBinded = true;
this._bindPointEvents();
this._onPointSymClassSelectChange();
}
if(this.isPictureMarkerSymbol(this.symbol)){
this._showBuildInPictureMarkerSymSettings();
}else if(this.isSimpleMarkerSymbol(this.symbol)){
this._showSimpleMarkerSymSettings();
}else{
var args = {
"style": "esriSMSCircle",
"color": [0, 0, 128, 128],
"name": "Circle",
"outline": {
"color": [0, 0, 128, 255],
"width": 1
},
"type": "esriSMS",
"size": 18
};
this.symbol = new SimpleMarkerSymbol(args);
this._showSimpleMarkerSymSettings();
}
this._initPointSettings(this.symbol);
this._getPointSymbolBySetting();
},
_bindPointEvents:function(){
this.own(on(this.pointIconTables, '.symbol-div-item:click', lang.hitch(this, this._onPointSymIconItemClick)));
this.own(on(this.pointSymClassSelect, 'change', lang.hitch(this, this._onPointSymClassSelectChange)));
this.own(on(this.pointSize, 'change', lang.hitch(this, this._onPointSymbolChange)));
this.own(on(this.pointColor, 'change', lang.hitch(this, this._onPointSymbolChange)));
this.own(on(this.pointAlpha, 'change', lang.hitch(this, this._onPointSymbolChange)));
this.own(on(this.pointOutlineColor, 'change', lang.hitch(this, this._onPointSymbolChange)));
this.own(on(this.pointOutlineWidth, 'change', lang.hitch(this, this._onPointSymbolChange)));
},
_onPointSymbolChange:function(){
if(this._invokeSymbolChangeEvent){
this._getPointSymbolBySetting();
this._onChange(this.symbol);
}
},
_initPointSettings:function(symbol){
if(!symbol){
return;
}
this._invokeSymbolChangeEvent = false;
if(this.isSimpleMarkerSymbol(symbol)){
this.pointSize.set('value', symbol.size);
this.pointColor.setColor(symbol.color);
this.pointAlpha.setAlpha(parseFloat(symbol.color.a.toFixed(2)));
//this.pointAlpha.set('value',parseFloat(symbol.color.a.toFixed(2)));
var outlineSymbol = symbol.outline;
if(outlineSymbol){
this.pointOutlineColor.setColor(outlineSymbol.color);
this.pointOutlineWidth.set('value', parseFloat(outlineSymbol.width.toFixed(0)));
}
}else if(this.isPictureMarkerSymbol(symbol)){
this.pointSize.set('value', symbol.width);
}
this._invokeSymbolChangeEvent = true;
},
isSimpleMarkerSymbol: function(symbol){
return symbol && symbol.declaredClass === 'esri.symbol.SimpleMarkerSymbol';
},
isPictureMarkerSymbol: function(symbol){
return symbol && symbol.declaredClass === 'esri.symbol.PictureMarkerSymbol';
},
_isCustomImageOptionSelected: function(){
return this.pointSymClassSelect.get('value') === 'custom';
},
_onPointSymClassSelectChange:function(){
if(this._isCustomImageOptionSelected()){
this._showCustomPictureMarkerSymSettings();
if(this._customPictureMarkerSymbol){
this.symbol = this._customPictureMarkerSymbol;
this._onPointSymbolChange();
}
}else{
this._showSimpleMarkerSymSettings();
this._showSelectedPointSymIconTable();
var fileName = this.pointSymClassSelect.get('value');
var defName = 'def' + fileName;
var def = this.pointSymClassSelect[defName];
if (!def) {
this._requestPointSymJson(fileName);
}else{
var option = this.pointSymClassSelect.getOptions(fileName);
var label = option ? option.label : "";
this.pointSymClassSelect.domNode.title = label;
}
}
},
_hideAllPointSymIconTable: function(){
query('.marker-icon-table', this.pointIconTables).style('display', 'none');
},
_showSelectedPointSymIconTable:function(){
this._hideAllPointSymIconTable();
var fileName = this.pointSymClassSelect.get('value');
var tables = query('.marker-icon-table-' + fileName, this.pointIconTables);
if (tables.length > 0) {
tables.style('display', 'table');
}
},
_getLocalSymbols: function(name){
var fileName = name || this.pointSymClassSelect.get('value');
var module = "jimu/dijit/SymbolsInfo/" + fileName + ".json";
var url = this._getAbsoluteUrl(module);
return xhr(url, {
handleAs: 'json'
});
},
_getPortalSymbolsByType: function(fileName){
var typeId = fileName;
var def = new Deferred();
if(typeId){
// fetch symbols from portal
this._fetchSymbols(typeId)
.then(lang.hitch(this, function(symbols){
def.resolve(symbols);
}), lang.hitch(this, function(err){
def.reject(err);
}));
}else{
def.reject(null);
}
return def;
},
_requestPointSymJson:function(fileName){
var defName = 'def' + fileName;
var def = this.pointSymClassSelect[defName];
if (def) {
return;
}
this.loadingShelter.show();
if(!this._isOnline && window.isXT){
this._offLineGetSymbols(fileName);
return;
}
if(!this._symbolTypes){
// fetch symbol types from portal
this._initPortal()
.then(lang.hitch(this, this._fetchSymbolTypes))
.then(lang.hitch(this, function(types){
// create options
this._clearOptions();
this._createOptions(types);
// fetch symbols from portal
this._handleGetPointSymbols(lang.hitch(this, this._getPortalSymbolsByType), fileName);
}), lang.hitch(this, function(err){
if(window.isXT){
this._offLineGetSymbols(fileName);
}else{
this.loadingShelter.hide();
console.error('Fetching symbols failed', err);
}
}));
}else{
// fetch symbols from portal
this._handleGetPointSymbols(lang.hitch(this, this._getPortalSymbolsByType), fileName);
}
},
_offLineGetSymbols: function(fileName){
this._isOnline = false;
if(this.pointSymClassSelect.options.length === 0){
var localTypes = [];
array.forEach(this._localTypes, lang.hitch(this, function(t, i){
localTypes.push({
id: i,
title: this.nls[t] || t
});
}));
this._clearOptions();
this._createOptions(localTypes);
}
this._handleGetPointSymbols(lang.hitch(this, this._getLocalSymbols), fileName);
},
_clearOptions: function(){
if(!this.pointSymClassSelect){
return;
}
var options = this.pointSymClassSelect.options;
this.pointSymClassSelect.removeOption(options);
},
_createOptions: function(types){
if(!this.pointSymClassSelect){
return;
}
var template = [];
var optionText = '';
var isSelected = false;
if(Object.prototype.toString.call(types) === '[object Array]' && types.length > 0){
array.forEach(types, lang.hitch(this, function(t){
optionText = t.title || t.name;
isSelected = optionText === this.nls.basic ? true : false;
if( optionText && (t.id || t.id === 0) ){
template.push({
label: optionText,
value: t.id,
selected: isSelected
});
}
}));
}
template.push({
label: this.nls.customImage,
value: 'custom'
});
this.pointSymClassSelect.addOption(template);
},
_initPortal: function(){
var deferred = new Deferred();
if(this._portal){
deferred.resolve();
}else{
var portalUrl = portalUrlUtils.getStandardPortalUrl(window.portalUrl);
var portal = portalUrl ? portalUrl : this.DEFAULT_PORTAL_URL;
var portalInstance = new Portal.Portal(portal);
if (portalInstance.loaded) {
this._portal = portalInstance;
deferred.resolve();
return deferred.promise;
}
this.own(
portalInstance.on("load", lang.hitch(this, function() {
this._portal = portalInstance;
deferred.resolve();
}))
);
setTimeout(function() {
deferred.reject();
}, this._portalLoadTimeoutInMs);
}
return deferred;
},
_handleGetPointSymbols: function(getFunc, name){
if(!this.pointSymClassSelect){
return;
}
var fileName = name || this.pointSymClassSelect.get('value');
var defName = 'def' + fileName;
var def = getFunc(fileName);
this.pointSymClassSelect[defName] = def;
def.then(lang.hitch(this, function(jsonSyms) {
this.loadingShelter.hide();
this._getPointSymbolsSucess(fileName, jsonSyms);
}), lang.hitch(this, function(error) {
this.loadingShelter.hide();
console.error('Fetching symbols failed', error);
}));
},
_getPointSymbolsSucess: function(fileName, jsonSyms){
if(!this.domNode){
return;
}
var option = this.pointSymClassSelect.getOptions(fileName);
var label = option ? option.label : "";
this.pointSymClassSelect.domNode.title = label;
var table = this._createSymbolIconTable(fileName, jsonSyms, 'point');
html.place(table, this.pointIconTables);
this._showSelectedPointSymIconTable();
},
_fetchSymbols: function (id) {
var symbolItemTypes = [];
var def = new Deferred();
symbolItemTypes = this._symbolTypes.filter(function(type){
return type.id === id;
});
this._getSymbolListData(symbolItemTypes)
.then(lang.hitch(this, function (symbolItems) {
def.resolve(symbolItems);
}), lang.hitch(this, function(err){
console.warn('fetch symbols failed', err);
def.reject(err);
}));
return def;
},
_getSymbolListData: function (items) {
var xhrItems = array.filter(items, function(item) {
return item.dataUrl;
});
var itemDataPromises = array.map(xhrItems, function (item) {
return request({ url: item.dataUrl }).promise;
});
return all(itemDataPromises).then(function (data) {
return data[0];
});
},
_fetchSymbolTypes: function(){
var def = new Deferred();
if(this._symbolTypes){
def.resolve(this._symbolTypes);
}else{
this._getSymbolListGroupId()
.then(lang.hitch(this, this._getSymbolListItems))
.then(lang.hitch(this, function(symbolTypes){
this._symbolTypes = symbolTypes;
def.resolve(symbolTypes);
}), lang.hitch(this, function(err){
console.warn('fetch symbol types failed', err);
def.reject(err);
}));
}
return def;
},
_getSymbolListGroupId: function () {
var deferred = new Deferred();
if(!this._portal){
deferred.reject('no portal');
}
this._portal.queryGroups({
q: this._portal.symbolSetsGroupQuery
})
.then(function (groups) {
var firstGroup = groups.results[0];
deferred.resolve(firstGroup.id);
}, lang.hitch(this, function(err){
console.warn('get symbol list group id failed', err);
deferred.reject(err);
}));
return deferred;
},
_getSymbolListItems: function (groupId) {
var deferred = new Deferred(),
portal = this._portal,
query = "group:" + groupId + " AND type:\"Symbol Set\"",
symbolItems = [];
if(!this._portal){
deferred.reject('no portal');
}
if (gfx.renderer === "vml") {
query += " AND -typekeywords:\"by value\"";
}
else {
query += " AND (typekeywords:\"by value\" AND typekeywords:\"marker\")";
}
portal.queryItems({
q: query,
num: 20,
sortField: "title"
}).then(lang.hitch(this, function (items) {
var listItems = items.results,
typeKeywords,
title,
symbolItem,
isDefaultType;
array.forEach(listItems, function (item) {
typeKeywords = item.typeKeywords.join(" ");
if (typeKeywords.indexOf("marker") > -1) {
title = item.title;
symbolItem = {
name: title,
id: item.id,
title: item.title,
keywords: typeKeywords,
dataUrl: item.itemDataUrl
};
isDefaultType = typeKeywords.indexOf("default") > -1;
if (isDefaultType) {
symbolItem.defaultType = true;
symbolItems.unshift(symbolItem);
}
else {
symbolItems.push(symbolItem);
}
}
}, this);
if (symbolItems.length > 0) {
deferred.resolve(symbolItems);
}
else {
deferred.reject();
}
}),
function () {
deferred.reject();
});
return deferred;
},
_onPointSymIconItemClick:function(event){
var target = event.target || event.srcElement;
var symDivItem = this._getAncestor(target, function(dom){
return html.hasClass(dom, 'symbol-div-item');
}, 5);
if(!symDivItem){
return;
}
var td = symDivItem.parentNode;
var tr = td.parentNode;
var tbody = tr.parentNode;
query('.selected-symbol-div-item', tbody).removeClass('selected-symbol-div-item');
html.addClass(symDivItem, 'selected-symbol-div-item');
var jsonSym = symDivItem.symbol;
if(!jsonSym){
return;
}
this.symbol = esriSymJsonUtils.fromJson(jsonSym);
var oldColorTrDisplay = html.getStyle(this.pointColorTr, 'display');
if(this.isSimpleMarkerSymbol(this.symbol)){
this._showSimpleMarkerSymSettings();
}else{
this._showBuildInPictureMarkerSymSettings();
}
this._onPointSymbolChange();
var newColorTrDisplay = html.getStyle(this.pointColorTr, 'display');
if(oldColorTrDisplay !== newColorTrDisplay){
this.emit('resize');
}
},
_showSimpleMarkerSymSettings:function(){
html.addClass(this.pointCustomImageTr, 'hidden');
html.removeClass(this.pointIconTablesTr, 'hidden');
html.removeClass(this.pointColorTr, 'hidden');
html.removeClass(this.pointOpacityTr, 'hidden');
html.removeClass(this.pointOutlineColorTr, 'hidden');
html.removeClass(this.pointOulineWidthTr, 'hidden');
},
_showBuildInPictureMarkerSymSettings:function(){
html.addClass(this.pointCustomImageTr, 'hidden');
html.removeClass(this.pointIconTablesTr, 'hidden');
html.addClass(this.pointColorTr, 'hidden');
html.addClass(this.pointOpacityTr, 'hidden');
html.addClass(this.pointOutlineColorTr, 'hidden');
html.addClass(this.pointOulineWidthTr, 'hidden');
},
_showCustomPictureMarkerSymSettings: function(){
html.removeClass(this.pointCustomImageTr, 'hidden');
html.addClass(this.pointIconTablesTr, 'hidden');
html.addClass(this.pointColorTr, 'hidden');
html.addClass(this.pointOpacityTr, 'hidden');
html.addClass(this.pointOutlineColorTr, 'hidden');
html.addClass(this.pointOulineWidthTr, 'hidden');
},
_getPointSymbolBySetting:function(checkValidity){
if(!this.symbol){
return null;
}
if(checkValidity){
if(!this.pointSize.validate()){
return null;
}
}
var size = parseFloat(this.pointSize.get('value'));
if(this.isSimpleMarkerSymbol(this.symbol)){
if(checkValidity){
if(!this.pointOutlineWidth.validate()){
return null;
}
}
this.symbol.setSize(size);
var color = this.pointColor.getColor();
var opacity = this.pointAlpha.getAlpha(); //parseFloat(this.pointAlpha.get('value'));
color.a = opacity;
this.symbol.setColor(color);
var outlineColor = this.pointOutlineColor.getColor();
var outlineWidth = parseFloat(this.pointOutlineWidth.get('value'));
var outlineSym = new SimpleLineSymbol();
outlineSym.setStyle(SimpleLineSymbol.STYLE_SOLID);
outlineSym.setColor(outlineColor);
outlineSym.setWidth(outlineWidth);
this.symbol.setOutline(outlineSym);
}
else if(this.isPictureMarkerSymbol(this.symbol)){
this.symbol.setWidth(size);
this.symbol.setHeight(size);
}
this._updatePreview(this.pointSymPreview);
return this.symbol;
},
_initImageChooser: function(){
this.imageChooser = new ImageChooser({
cropImage: this.cropImage,
customZIndex: this.customZIndex,
showSelfImg: false,
goldenWidth: 16,
goldenHeight: 16,
format: ['image/gif','image/png','image/jpeg'],
label: this.nls.chooseFile
});
html.addClass(this.imageChooser.domNode, 'custom-image-chooser');
this.own(on(this.imageChooser, 'change', lang.hitch(this, this._onImageChange)));
this.imageChooser.placeAt(this.customImageTd, "first");
},
_onImageChange: function(imageData, fileProperty){
this.imageNameNode.innerHTML = fileProperty.fileName;
imageData = imageData.replace(/^data:image\/.*;base64,/,"");
var size = parseFloat(this.pointSize.get('value'));
var args = {
"type" : "esriPMS",
"url" : null,
"imageData" : imageData,
"contentType" : "image/png",
"color" : null,
"width" : size,
"height" : size,
"angle" : 0,
"xoffset" : 0,
"yoffset" : 0
};
this.symbol = new PictureMarkerSymbol(args);
this._customPictureMarkerSymbol = this.symbol;
this._onPointSymbolChange();
},
/* line section */
_initLineSection:function(){
this._showSection('line');
if (!this._lineEventBinded) {
this._lineEventBinded = true;
this._bindLineEvents();
this._requestLineSymJson('line');
}
this._initLineSettings(this.symbol);
this._getLineSymbolBySetting();
},
_bindLineEvents:function(){
this.own(
on(this.lineIconTables,
'.symbol-div-item:click',
lang.hitch(this, this._onLineSymIconItemClick))
);
this.own(on(this.lineColor, 'change', lang.hitch(this, this._onLineSymbolChange)));
this.own(on(this.lineStylesSelect, 'change', lang.hitch(this, this._onLineSymbolChange)));
this.own(on(this.lineAlpha, 'change', lang.hitch(this, this._onLineSymbolChange)));
this.own(on(this.lineWidth, 'change', lang.hitch(this, this._onLineSymbolChange)));
},
_onLineSymbolChange:function(){
if(this._invokeSymbolChangeEvent){
this._getLineSymbolBySetting();
this._onChange(this.symbol);
}
},
_initLineSettings:function(symbol){
if(!symbol){
return;
}
this._invokeSymbolChangeEvent = false;
this.lineColor.setColor(symbol.color);
this.lineAlpha.setAlpha(parseFloat(symbol.color.a.toFixed(2)));
//this.lineAlpha.set('value',parseFloat(symbol.color.a.toFixed(2)));
this.lineWidth.set('value', parseFloat(symbol.width.toFixed(0)));
this.lineStylesSelect.set('value', symbol.style);
this._invokeSymbolChangeEvent = true;
},
isSimpleLineSymbol: function(symbol){
return symbol && symbol.declaredClass === 'esri.symbol.SimpleLineSymbol';
},
isCartographicLineSymbol: function(symbol){
return symbol && symbol.declaredClass === 'esri.symbol.CartographicLineSymbol';
},
_requestLineSymJson:function(fileName){
var module = "jimu/dijit/SymbolsInfo/" + fileName + ".json";
var url = this._getAbsoluteUrl(module);
var def = xhr(url, {
handleAs:'json'
});
def.then(lang.hitch(this, function(jsonSyms){
if(!this.domNode){
return;
}
var table = this._createSymbolIconTable(fileName, jsonSyms, 'line');
html.place(table, this.lineIconTables);
}), lang.hitch(this, function(error){
console.error('get line symbol failed', error);
}));
},
_onLineSymIconItemClick:function(event){
var target = event.target || event.srcElement;
var symDivItem = this._getAncestor(target, function(dom){
return html.hasClass(dom, 'symbol-div-item');
}, 5);
if(!symDivItem){
return;
}
var td = symDivItem.parentNode;
var tr = td.parentNode;
var tbody = tr.parentNode;
query('.selected-symbol-div-item', tbody).removeClass('selected-symbol-div-item');
html.addClass(symDivItem, 'selected-symbol-div-item');
var jsonSym = symDivItem.symbol;
if(!jsonSym){
return;
}
var symbol = esriSymJsonUtils.fromJson(jsonSym);
this._initLineSettings(symbol);
this._onLineSymbolChange();
},
_getLineSymbolBySetting:function(checkValidity){
if(checkValidity){
if(!this.lineWidth.validate()){
return null;
}
}
this.symbol = new SimpleLineSymbol();
var color = this.lineColor.getColor();
var style = this.lineStylesSelect.get('value');
color.a = this.lineAlpha.getAlpha();
//color.a = parseFloat(this.lineAlpha.get('value'));
var width = parseFloat(this.lineWidth.get('value'));
this.symbol.setStyle(style);
this.symbol.setColor(color);
this.symbol.setWidth(width);
this._updatePreview(this.lineSymPreview);
return this.symbol;
},
/* fill section */
_initFillSection:function(){
this._showSection('fill');
if(!this._fillEventBinded){
this._fillEventBinded = true;
this._bindFillEvents();
this._requestFillSymJson('fill');
}
this._initFillSettings(this.symbol);
this._getFillSymbolBySetting();
},
_bindFillEvents:function(){
this.own(
on(this.fillIconTables,
'.symbol-div-item:click',
lang.hitch(this, this._onFillSymIconItemClick))
);
this.own(on(this.fillColor, 'change', lang.hitch(this, this._onFillSymbolChange)));
this.own(on(this.fillAlpha, 'change', lang.hitch(this, this._onFillSymbolChange)));
this.own(on(this.fillOutlineColor, 'change', lang.hitch(this, this._onFillSymbolChange)));
this.own(on(this.fillOutlineWidth, 'change', lang.hitch(this, this._onFillSymbolChange)));
},
_onFillSymbolChange:function(){
if(this._invokeSymbolChangeEvent){
this._getFillSymbolBySetting();
this._onChange(this.symbol);
}
},
_initFillSettings:function(symbol){
if(!symbol){
return;
}
this._invokeSymbolChangeEvent = false;
this.fillColor.setColor(symbol.color);
this.fillAlpha.setAlpha(parseFloat(symbol.color.a.toFixed(2)));
//this.fillAlpha.set('value',parseFloat(symbol.color.a.toFixed(2)));
if(symbol.outline){
this.fillOutlineColor.setColor(symbol.outline.color);
this.fillOutlineWidth.set('value', parseInt(symbol.outline.width, 10));
}
this._invokeSymbolChangeEvent = true;
},
_isSimpleFillSymbol: function(symbol){
return symbol && symbol.declaredClass === 'esri.symbol.SimpleFillSymbol';
},
_requestFillSymJson:function(fileName){
var module = "jimu/dijit/SymbolsInfo/" + fileName + ".json";
var url = this._getAbsoluteUrl(module);
var def = xhr(url, {
handleAs: 'json'
});
def.then(lang.hitch(this, function(jsonSyms) {
if(!this.domNode){
return;
}
var table = this._createSymbolIconTable(fileName, jsonSyms, 'fill');
html.place(table, this.fillIconTables);
}), lang.hitch(this, function(error) {
console.error('get fill symbol failed', error);
}));
},
_onFillSymIconItemClick:function(event){
var target = event.target || event.srcElement;
var symDivItem = this._getAncestor(target, function(dom) {
return html.hasClass(dom, 'symbol-div-item');
}, 5);
if (!symDivItem) {
return;
}
var td = symDivItem.parentNode;
var tr = td.parentNode;
var tbody = tr.parentNode;
query('.selected-symbol-div-item', tbody).removeClass('selected-symbol-div-item');
html.addClass(symDivItem, 'selected-symbol-div-item');
var jsonSym = symDivItem.symbol;
if(!jsonSym){
return;
}
var symbol = esriSymJsonUtils.fromJson(jsonSym);
this._initFillSettings(symbol);
this._onFillSymbolChange();
},
_getFillSymbolBySetting:function(checkValidity){
if(checkValidity){
if(!this.fillOutlineWidth.validate()){
return null;
}
}
this.symbol = new SimpleFillSymbol();
var color = this.fillColor.getColor();
color.a = this.fillAlpha.getAlpha();//parseFloat(this.fillAlpha.get('value').toFixed(2));
var outlineColor = this.fillOutlineColor.getColor();
var outlineWidth = parseInt(this.fillOutlineWidth.get('value'), 10);
this.symbol.setColor(color);
this.symbol.setStyle(SimpleFillSymbol.STYLE_SOLID);
var outlineSym = new SimpleLineSymbol();
outlineSym.setStyle(SimpleLineSymbol.STYLE_SOLID);
outlineSym.setColor(outlineColor);
outlineSym.setWidth(outlineWidth);
this.symbol.setOutline(outlineSym);
this._updatePreview(this.fillSymPreview);
return this.symbol;
},
/* text section */
_initTextSection:function(){
this._showSection('text');
if(!this._textEventBinded){
this._textEventBinded = true;
this._bindTextEvents();
}
this._initTextSettings();
this._getTextSymbolBySetting();
},
_bindTextEvents:function(){
this.own(on(this.inputText, 'change', lang.hitch(this, this._onTextSymbolChange)));
this.own(on(this.textColor, 'change', lang.hitch(this, this._onTextSymbolChange)));
this.own(on(this.textFontSize, 'change', lang.hitch(this, this._onTextSymbolChange)));
},
_onTextSymbolChange:function(){
if (this._invokeSymbolChangeEvent) {
this._getTextSymbolBySetting();
this._onChange(this.symbol);
}
},
_initTextSettings:function(symbol){
if(!symbol){
return;
}
this._invokeSymbolChangeEvent = false;
this.inputText.value = symbol.text;
this.textColor.setColor(symbol.color);
var size = parseInt(symbol.font.size, 10);
this.textFontSize.set('value', size);
this._invokeSymbolChangeEvent = true;
},
_isTextSymbol: function(symbol){
return symbol && symbol.declaredClass === 'esri.symbol.TextSymbol';
},
_updateTextPreview:function(fontFamily){
var colorHex = this.textColor.getColor().toHex();
var size = parseInt(this.textFontSize.get('value'), 10) + 'px';
html.setStyle(this.textPreview, {
color: colorHex,
fontSize: size,
fontFamily: fontFamily
});
this.textPreview.innerHTML = this.inputText.value;
},
_getTextSymbolBySetting:function(checkValidity){
if(checkValidity){
if(!this.textFontSize.validate()){
return null;
}
}
this.symbol = new TextSymbol();
var text = this.inputText.value;
var color = this.textColor.getColor();
var size = parseInt(this.textFontSize.get('value'), 10);
var font = new Font();// Default font family : Serif
font.setSize(size);
this.symbol.setText(text);
this.symbol.setColor(color);
this.symbol.setFont(font);
this._updateTextPreview(font.family);
return this.symbol;
},
_setTemplateNls: function () {
//TODO should be delete when nls added
if ("undefined" === typeof this.nls.damage) {
this.nls.damage = "Damage";
}
if ("undefined" === typeof this.nls.disasters) {
this.nls.disasters = "Disasters";
}
if ("undefined" === typeof this.nls.emergencyManagement) {
this.nls.emergencyManagement = "Emergency Management";
}
if ("undefined" === typeof this.nls.generalInfrastructure) {
this.nls.generalInfrastructure = "General Infrastructure";
}
if ("undefined" === typeof this.nls.localGovernment) {
this.nls.localGovernment = "Local Government";
}
if ("undefined" === typeof this.nls.numbers) {
this.nls.numbers = "Numbers";
}
if ("undefined" === typeof this.nls.pointsOfInterest) {
this.nls.pointsOfInterest = "Points of Interest";
}
if ("undefined" === typeof this.nls.stateGovernment) {
this.nls.stateGovernment = "State Government";
}
}
});
});