Retour à la documentation
define([
//mapped libs
"dojo/_base/declare", "spw/api/Printer", "dojo/_base/array", "dojo/_base/lang",
"spw/api/SpwViewer", "dojo/query", "dojo/dom-style", "dojo/dom-geometry",
"dojo/dom-construct", "dojo/dom-attr", "spw/api/MessageManager", "esri/tasks/PrintTask",
"esri/tasks/PrintTemplate", "esri/tasks/PrintParameters", "dojo/Deferred", "esri/geometry/Point", "dojo/on", "esri/geometry/Extent",
"dojo/_base/config", "spw/api/ProjectionManager","dojo/dom",
//unmapped libs
"spw/libs/html2canvas", "spw/libs/rgbcolor","spw/libs/StackBlur",
"spw/libs/canvg", "dojo/NodeList-traverse"],
function (declare, _WidgetBase, array, lang, SpwViewer, query, domStyle, geom,
domConstruct, domAttr, MessageManager, PrintTask, PrintTemplate, PrintParameters,
Deferred, Point, on, Extent, dojoConfig, ProjectionManager, dom) {
var Printer = declare("spw.api.Printer", [_WidgetBase], /** @lends spw.api.Printer */{
getImage: function(domToPrint, imageWidth, imageHeight, crop, extent, successHandler, rosaceUrl, printComesFromIdentify) {
this.extentToReach = extent;
var templateItem = {imageWidth: imageWidth, imageHeight: imageHeight};
if(rosaceUrl == null){
rosaceUrl = "images/templates/rosaces.png";
}
this.stylesToReset.length = 0;
// compatibilité ?
this.oldExtent = SpwViewer.getInstance().get('spwMap').getCurrentExtent();
if (successHandler == null && typeof(extent) === 'function') {
successHandler = extent;
extent = null;
}
if(successHandler){
this.successHandler = successHandler;
} else {
console.error("No print callback. Printing is cancelled.");
return;
}
if(domToPrint){
this.domToPrint = domToPrint;
}
if(imageWidth){
this.imageWidth = imageWidth;
}
if(imageHeight){
this.imageHeight = imageHeight;
}
this.crop = crop;
if(printComesFromIdentify){
MessageManager.getInstance().displayModalMessage("Nous préparons votre rapport.<br>Cela peut prendre quelques secondes…");
}else{
MessageManager.getInstance().displayModalMessage("Nous préparons votre carte.<br>Cela peut prendre quelques secondes…");
}
if(!this.crop){
this.renderMapCanvas(null, rosaceUrl, templateItem);
} else {
var spwMap = SpwViewer.getInstance().get('spwMap');
this.recalculateMap().then(lang.hitch(this, function(domItemOverflowed) {
if (spwMap.isUpdating()) {
var mapUpdateEndHandler = spwMap.on(spwMap.events.MapUpdateEnd, lang.hitch(this, function(){
if (!spwMap.isUpdating()) {
domStyle.set(SpwViewer.getInstance().get('spwMap').domNode, {
top: 0,
left: 0
});
this.renderMapCanvas(domItemOverflowed, rosaceUrl, templateItem).then(lang.hitch(this, function(canvas) {
MessageManager.getInstance().hideModalMessage();
successHandler(canvas);
}));
mapUpdateEndHandler.remove();
}
}));
}
else {
domStyle.set(SpwViewer.getInstance().get('spwMap').domNode, {
top: 0,
left: 0
});
this.renderMapCanvas(domItemOverflowed, rosaceUrl,templateItem).then(lang.hitch(this, function(canvas) {
MessageManager.getInstance().hideModalMessage();
successHandler(canvas);
}));
}
}));
}
},
recalculateMap: function() {
var spwMap = SpwViewer.getInstance().get('spwMap');
var overflowW = this.imageWidth - spwMap.getWidth();
var overflowH = this.imageHeight - spwMap.getHeight();
var node = spwMap.domNode;
var absoluteXY = {
x: 0,
y: 0
};
if (overflowW < 0) {
overflowW = 0;
}
if (overflowH < 0) {
overflowH = 0;
}
this.stylesToReset.push({
node: node,
style: {
position: domStyle.get(node, 'position'),
left: domStyle.get(node, 'left') + 'px',
top: domStyle.get(node, 'top') + 'px',
width: domStyle.get(node, 'width') + 'px',
height: domStyle.get(node, 'height') + 'px'
}
});
domStyle.set(node, {
position: 'absolute',
left: absoluteXY.x + 'px',
top: absoluteXY.y + 'px',
width: spwMap.getWidth() + overflowW + 'px',
height: spwMap.getHeight() + overflowH + 'px'
});
var domItemOverflowed = new Array();
query(SpwViewer.getInstance().get('spwMap').domNode).parents().forEach(function(item){
var overflowProp = domStyle.get(item, "overflow");
if(overflowProp == "hidden"){
domItemOverflowed.push([item, overflowProp]);
domStyle.set(item, "overflow", "visible");
}
});
var def = new Deferred();
spwMap.esriMap._decr();
var isUpdated= false;
on.once(spwMap.esriMap,'update-start',lang.hitch(this,function(){
isUpdated=true;
on.once(spwMap.esriMap, 'update-end', lang.hitch(this, function() {
this.resizeAndCenterMap(def, spwMap, overflowW, overflowH, domItemOverflowed);
}));
}))
spwMap.resize();
spwMap.esriMap.resize(true);
spwMap.esriMap.reposition();
spwMap.esriMap.setExtent(this.oldExtent, true);
if(!isUpdated){
this.resizeAndCenterMap(def, spwMap, overflowW, overflowH,domItemOverflowed);
}
return def;
},
resizeAndCenterMap: function(def, spwMap, overflowW, overflowH, domItemOverflowed) {
var centerMap = this.oldCenterMap = this.extentToReach.getCenter();
var centerScreenPt = spwMap.toScreenPoint(centerMap.x, centerMap.y);
var container = dom.byId('geoviewer-panel');
if(container){
container.style.overflow = 'visible';
}
centerScreenPt.x -= (overflowW / 2);
centerScreenPt.y -= (overflowH / 2);
var newCenterMap = spwMap.toMapPoint(centerScreenPt.x, centerScreenPt.y);
this.oldExtent;
var extentToReach = this.extentToReach;
spwMap.get('esriMap').setExtent(this.extentToReach, true).then(function(){
spwMap.get('esriMap').centerAt(extentToReach.getCenter()).then(function(){
def.resolve(domItemOverflowed);
});
});
},
/**
* Rétablit les dimensions de la carte telles qu'avant son redimensionnement.
* @param domItemOverflowed
*/
resetMap: function(domItemOverflowed){
this.inherited(arguments);
var oldCenterMap = this.oldCenterMap;
SpwViewer.getInstance().get('spwMap').esriMap.setExtent(this.extentToReach, true).then(function(){
SpwViewer.getInstance().get('spwMap').centerAt(oldCenterMap.x, oldCenterMap.y);
})
}
});
return Printer;
});