define([ "dojo/Evented", "dojo/on", "dojo/dom", "dojo/_base/declare", "dojo/dom-construct", "dojo/dom-style", "dojo/_base/lang", "dojo/dom-class", "esri/domUtils", "esri/InfoWindowBase", "base/utils/GeometryUtil", "controls/Queryinfowindow/InfoTemplate" ], function( Evented, on, dom, declare, domConstruct, domStyle, lang, domClass, domUtils, InfoWindowBase, GeometryUtil, InfoTemplate ) { return declare([InfoWindowBase, Evented], { isContentShowing: false, _location: null, _pointerDiv: null, _items: [], _nextButton: null, _preButton: null, _countSpan: null, titleField: "title", contentField: "content", _currentGraphic: null, _currentIndex: 0, _correctButton: null, width: 355, height: 210, infoTemplate: null, constructor: function(parameters) { var csspath = require.toUrl("controls/Queryinfowindow/InfoWindow.css"); dojo.create("link", { href: csspath, type: 'text/css', rel: 'stylesheet' }, document.getElementsByTagName('head')[0]); lang.mixin(this, parameters); this.offsetX = 0; this.offsetX = 0; domClass.add(this.domNode, "custom-infoWindow"); this._controlbar = domConstruct.create("div", { "class": "custom-infoWindow-controlbar" }, this.domNode); this._title = domConstruct.create("span", { "class": "custom-infoWindow-title" }, this._controlbar); this._closeButton = domConstruct.create("span", { "class": "custom-infoWindow-closebutton", "title": "关闭" }, this._controlbar); domConstruct.create("span", { "class": "custom-infoWindow-split" }, this._controlbar); this._correctButton = domConstruct.create("span", { "class": "custom-infoWindow-correctbutton", "title": "纠错" }, this._controlbar); this._content = domConstruct.create("div", { "class": "custom-infoWindow-content" }, this.domNode); this._pointerDiv = domConstruct.create("div", { "class": "custom-infoWindow-pointer" }, this.domNode); this._nextButton = domConstruct.create("span", { "class": "custom-infoWindow-nextbutton", "title": "下一条" }, this._controlbar); this._countSpan = domConstruct.create("span", { "class": "custom-infoWindow-count", "innerHTML": "1/20" }, this._controlbar); this._preButton = domConstruct.create("span", { "class": "custom-infoWindow-prebutton", "title": "上一条" }, this._controlbar); on(this._closeButton, "click", lang.hitch(this, function() { this.hide(); })); on(this._preButton, "click", lang.hitch(this, function() { if (this._currentIndex > 0) { this._currentIndex--; this.showItem(this._items[this._currentIndex]); this._countSpan.innerHTML = (this._currentIndex + 1) + "/" + this._items.length; } })); on(this._nextButton, "click", lang.hitch(this, function() { if (this._currentIndex < this._items.length - 1) { this._currentIndex++; this.showItem(this._items[this._currentIndex]); this._countSpan.innerHTML = (this._currentIndex + 1) + "/" + this._items.length; } })); domUtils.hide(this.domNode); this.isShowing = false; this.setItems([]); this.resize(this.width, this.height); }, setMap: function(map) { this.inherited(arguments); if (!this.domNode.parentNode) { domConstruct.place(this.domNode, dom.byId(map.id)); } this.infoTemplate = new InfoTemplate(); domConstruct.place(this.infoTemplate.domNode, this._content); this.infoTemplate.startup(); map.on("pan-start", lang.hitch(this, function() { //this.hide(); })); map.on("zoom-start", lang.hitch(this, function() { //this.hide(); })); map.on("pan", lang.hitch(this, function(evt) { if (this.isShowing) { this._show(this._location, evt.delta.x, evt.delta.y); } })); map.on("pan-end", lang.hitch(this, function() { if (this.isShowing) { this._show(this._location); } })); map.on("zoom-end", lang.hitch(this, function() { if (this.isShowing) { this._show(this._location); } })); }, setTitle: function(title) { var thisWidth = domStyle.get(this.domNode, "width"); domStyle.set(this._title, "maxWidth", (thisWidth - 40).toString() + "px"); this.place(title, this._title); }, setContent: function(content, width, height) { this.infoTemplate.reset(); this.infoTemplate.setContent(content); if (width !== undefined && height !== undefined) { this.resize(width, height); } else { this.resize(355, 210); } }, setTitleAndContent: function(title, content, showTab, width, height) { //this.place(content, this._content); this.setContent(content, width, height); this.setTitle(title); if (showTab !== undefined) { if (!showTab) { this.infoTemplate.hideTab(); } } }, setTab: function(type) { this.infoTemplate.switchTab(type); }, setGraphic: function(graphic) { this.infoTemplate.setGraphic(graphic); }, getGraphic: function(graphic) { return this.infoTemplate.getGraphic(); }, show: function(location, offsexX, offsetY) { if (offsexX) this.offsetX = offsexX; else this.offsetX = 0; if (offsetY) this.offsetY = offsetY; else this.offsetY = 0; this._show(location); }, _show: function(location, dx, dy) { if (!location) { return; } if (location.type && location.type != "point") { location = GeometryUtil.getCenter(location); } this._location = location; if (location.spatialReference) { location = this.map.toScreen(location); } var position = this._getPosition(location.x, location.y) if (dx) { location.x = location.x + dx; } if (dy) { location.y = location.y + dy } location.x += this.offsetX; location.y += this.offsetY; this._positionWindow(position, location) //display the info window domUtils.show(this.domNode); this.isShowing = true; this.onShow(); }, hide: function() { domUtils.hide(this.domNode); this.isShowing = false; this.onHide(); }, resize: function(width, height) { this.width = width; this.height = height; if (!this.domNode) { return; } // domStyle.set(this._content,{ // "width": width + "px" // }); // domStyle.set(this._controlbar,{ // "width": width + "px" // }); domStyle.set(this.domNode, { "width": width + "px", "height": (height + 30).toString() + "px" }); if (this.isShowing) { this._show(this._location); } }, destroy: function() { domConstruct.destroy(this.domNode); this._closeButton = this._title = this._content = null; }, _positionWindow: function(arg, location) { var thisWidth = domStyle.get(this.domNode, "width"); var thisHeight = domStyle.get(this.domNode, "height"); domClass.remove(this._pointerDiv); domClass.add(this._pointerDiv, "custom-infoWindow-pointer"); switch (arg) { case "topLeft": domStyle.set(this.domNode, { "left": (location.x - 12) + "px", "top": location.y + 10 + "px" }); domClass.add(this._pointerDiv, "pointer-top"); domStyle.set(this._pointerDiv, { "left": "3px", "top": "-9px" }); break; case "topRight": domStyle.set(this.domNode, { "left": (location.x - thisWidth + 11) + "px", "top": location.y + 10 + "px" }); domClass.add(this._pointerDiv, "pointer-top"); domStyle.set(this._pointerDiv, { "left": (thisWidth - 19) + "px", "top": "-9px" }); break; case "top": domStyle.set(this.domNode, { "left": (location.x - thisWidth / 2) + "px", "top": location.y + 10 + "px" }); domClass.add(this._pointerDiv, "pointer-top"); domStyle.set(this._pointerDiv, { "left": (thisWidth / 2 - 8) + "px", "top": "-9px" }); break; case "left": domStyle.set(this.domNode, { "left": location.x + 12 + "px", "top": (location.y - thisHeight / 2 - 15) + "px" }); domClass.add(this._pointerDiv, "pointer-left"); domStyle.set(this._pointerDiv, { "left": "-10px", "top": (thisHeight / 2 + 5) + "px" }); break; case "right": domStyle.set(this.domNode, { "left": (location.x - (thisWidth + 12)) + "px", "top": (location.y - thisHeight / 2 - 15) + "px" }); domClass.add(this._pointerDiv, "pointer-right"); domStyle.set(this._pointerDiv, { "left": (thisWidth - 8) + "px", "top": (thisHeight / 2 + 5) + "px" }); break; case "bottomLeft": domStyle.set(this.domNode, { "left": (location.x - 12) + "px", "top": (location.y - thisHeight - 12) + "px" }); domClass.add(this._pointerDiv, "pointer-bottom"); domStyle.set(this._pointerDiv, { "left": "3px", "top": (thisHeight - 8) + "px" }); break; case "bottomRight": domStyle.set(this.domNode, { "left": (location.x - thisWidth + 11) + "px", "top": (location.y - thisHeight - 12) + "px" }); domClass.add(this._pointerDiv, "pointer-bottom"); domStyle.set(this._pointerDiv, { "left": (thisWidth - 20) + "px", "top": (thisHeight - 8) + "px" }); break; // case "bottom": // break; default: //默认pointer显示在下面 domStyle.set(this.domNode, { "left": (location.x - thisWidth / 2) + "px", "top": (location.y - thisHeight - 12) + "px" }); domClass.add(this._pointerDiv, "pointer-bottom"); domStyle.set(this._pointerDiv, { "left": (thisWidth / 2 - 10) + "px", "top": (thisHeight - 8) + "px" }); break; } }, /** * 计算pointer处于的方位,左上、上、右上、左、默认、右、左下、下、右下 * @param x * @param y */ _getPosition: function(x, y) { var widthPer = this.map.width / 4 var heightPer = this.map.height / 4 if (y < heightPer) { if (x < widthPer) { return "topLeft"; } else if (x > widthPer * 3) { return "topRight"; } else { return "top"; } } if (y >= heightPer && y < heightPer * 3) { if (x < widthPer) { return "left"; } else if (x > widthPer * 3) { return "right"; } else { return "default"; } } if (y > heightPer * 3) { if (x < widthPer) { return "bottomLeft"; } else if (x > widthPer * 3) { return "bottomRight"; } else { return "bottom"; } } else { return "default"; } }, setItems: function(items) { this._items = items; if (!this.domNode) return; var thisWidth = domStyle.get(this.domNode, "width"); if (!items || items.length <= 1) { //domStyle.set(this._content,"bottom","20px"); //domStyle.set(this._pageDiv,"display","none"); domStyle.set(this._title, "maxWidth", (thisWidth - 40).toString() + "px"); domStyle.set(this._nextButton, "display", "none"); domStyle.set(this._countSpan, "display", "none"); domStyle.set(this._preButton, "display", "none"); _currentIndex = 0; } else { //有多个graphics domStyle.set(this._title, "maxWidth", (thisWidth - 135).toString() + "px"); this.showItem(items[0]); domStyle.set(this._nextButton, "display", "inline-block"); domStyle.set(this._countSpan, "display", "inline-block"); domStyle.set(this._preButton, "display", "inline-block"); this._countSpan.innerHTML = "1/" + this._items.length; _currentIndex = 0; return; } if (items.length == 1) { //如果只有一个graphic this.showItem(items[_currentIndex]); } }, showItem: function(item) { if (item) { if (item[this.titleField]) { this._title.innerHTML = item[this.titleField]; } else { this._title.innerHTML = "无标题"; } if (item[this.contentField]) { this.setContent(item[this.contentField]); } else { this.setContent(""); } } this._location = item.geometry; if (this.isShowing) { this._show(this._location); } // var maxWidth = domStyle.get(this._title,"maxWidth"); // if(maxWidth