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<this._title.offsetWidth)
|
// {
|
// this._title.title = graphic.attributes[this.titleField];
|
// }
|
// else
|
// {
|
// this._title.title = "";
|
// }
|
}
|
|
});
|
|
});
|