Source: widgets/PEPUPrinter.js

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