217 lines
6.5 KiB
JavaScript
217 lines
6.5 KiB
JavaScript
import ol_control_PrintDialog from "./PrintDialog"
|
|
import ol_control_Print from './Print.js'
|
|
import ol_ext_element from "../util/element"
|
|
|
|
/** Print control to get an image of the map
|
|
* @constructor
|
|
* @fire show
|
|
* @fire print
|
|
* @fire error
|
|
* @fire printing
|
|
* @extends {ol_control_PrintDialog}
|
|
*/
|
|
var ol_control_PrintDialog2x = class olcontrolPrintDialog2x extends ol_control_PrintDialog {
|
|
constructor(options) {
|
|
options = options || {}
|
|
|
|
super(options);
|
|
this._printDialog.element.classList.add('ol-ext-print-dialog2x')
|
|
|
|
// Add printmap
|
|
var printMap = ol_ext_element.create('DIV', {
|
|
className: 'ol-map2',
|
|
parent: this._pages[0]
|
|
})
|
|
|
|
// Print control
|
|
var printCtrl2 = this._printCtrl2 = new ol_control_Print(options)
|
|
printCtrl2.on(['print', 'error', 'printing'], function (e) {
|
|
if (e.type === 'print') {
|
|
var canvas = document.createElement('canvas');
|
|
// Get clipping (ol/control/SwipeMap or ol/control/ClipMap)
|
|
var clipDiv = printMap.querySelector('.ol-layers');
|
|
var clip = clipDiv.style.clipPath || clipDiv.style.clip
|
|
// Print in canvas
|
|
if (clip) {
|
|
var param = clip.replace(/^(.*)\((.*)\)/, '$2');
|
|
clip = {
|
|
type: clip.replace(/^(.*)\(.*/, '$1'),
|
|
}
|
|
switch(clip.type) {
|
|
case 'circle': {
|
|
param = param.split(' ')
|
|
clip.radius = parseFloat(param[0]);
|
|
clip.x = parseFloat(param[2]);
|
|
clip.y = parseFloat(param[3]);
|
|
break;
|
|
}
|
|
case 'rect': {
|
|
param = param.split(',')
|
|
clip.top = parseFloat(param[0]);
|
|
clip.right = parseFloat(param[1]);
|
|
clip.bottom = parseFloat(param[2]);
|
|
clip.left = parseFloat(param[3]);
|
|
break;
|
|
}
|
|
default: {
|
|
console.warn('no clip (' + clip.type + ')')
|
|
break;
|
|
}
|
|
}
|
|
canvas.width = this._canvas1.width;
|
|
canvas.height = this._canvas1.height;
|
|
} else if (this.getOrientation() === 'landscape') {
|
|
canvas.width = this._canvas1.width + e.canvas.width;
|
|
canvas.height = this._canvas1.height;
|
|
} else {
|
|
canvas.width = this._canvas1.width;
|
|
canvas.height = this._canvas1.height + e.canvas.height;
|
|
}
|
|
var ctx = canvas.getContext('2d');
|
|
ctx.drawImage(this._canvas1, 0, 0);
|
|
if (clip) {
|
|
ctx.save()
|
|
switch (clip.type) {
|
|
case 'rect': {
|
|
ctx.beginPath();
|
|
ctx.rect(clip.left, clip.top, clip.right - clip.left, clip.bottom - clip.top)
|
|
break;
|
|
}
|
|
case 'circle': {
|
|
ctx.beginPath();
|
|
ctx.arc(clip.x, clip.y, clip.radius, 0, Math.PI * 2);
|
|
break;
|
|
}
|
|
}
|
|
ctx.clip()
|
|
ctx.drawImage(e.canvas, 0, 0);
|
|
ctx.restore()
|
|
} else {
|
|
ctx.drawImage(e.canvas,
|
|
(this.getOrientation() === 'landscape' ? this._canvas1.width : 0),
|
|
(this.getOrientation() !== 'landscape' ? this._canvas1.height : 0)
|
|
);
|
|
}
|
|
e.canvas = canvas;
|
|
e.image = canvas.toDataURL(e.imageType, e.quality);
|
|
var w = canvas.width / 96 * 25.4
|
|
var h = canvas.height / 96 * 25.4
|
|
var size = e.print.size
|
|
if (this.getOrientation() === 'landscape') size = [size[1], size[0]]
|
|
e.print.position = [
|
|
(size[0] - w) / 2,
|
|
(size[1] - h) / 2
|
|
]
|
|
e.print.imageWidth = w;
|
|
e.print.imageHeight = h;
|
|
}
|
|
if (this._clipboard) {
|
|
try {
|
|
e.canvas.toBlob(function (blob) {
|
|
try {
|
|
navigator.clipboard.write([
|
|
new window.ClipboardItem(
|
|
Object.defineProperty({}, blob.type, {
|
|
value: blob,
|
|
enumerable: true
|
|
})
|
|
)
|
|
]);
|
|
//this.dispatchEvent(e)
|
|
// Show copy
|
|
var copied = this._printDialog.element.querySelector('.ol-clipboard-copy')
|
|
copied.classList.add('visible')
|
|
setTimeout(function () { copied.classList.remove('visible') }, 1000)
|
|
// OK
|
|
} catch (err) {
|
|
// this.dispatchEvent(e)
|
|
}
|
|
}.bind(this));
|
|
} catch (err) {
|
|
// this.dispatchEvent(e)
|
|
}
|
|
} else {
|
|
this.dispatchEvent(e)
|
|
}
|
|
}.bind(this))
|
|
|
|
// Show map 2
|
|
var originalTarget
|
|
this._printDialog.on('show', function() {
|
|
if (this.getMap2()) {
|
|
originalTarget = this.getMap2().getTargetElement()
|
|
this.getMap2().setTarget(printMap)
|
|
if (originalTarget.dataset.swipeOrientation) {
|
|
this._printDialog.element.dataset.swipeOrientation = originalTarget.dataset.swipeOrientation
|
|
}
|
|
if (originalTarget.dataset.clipMap) {
|
|
this._printDialog.element.dataset.clipMap = originalTarget.dataset.clipMap
|
|
}
|
|
}
|
|
}.bind(this))
|
|
this._printDialog.on('hide', function () {
|
|
delete this._printDialog.element.dataset.swipeOrientation
|
|
delete this._printDialog.element.dataset.clipMap
|
|
if (!originalTarget) return
|
|
if (this.getMap2()) {
|
|
this.getMap2().setTarget(originalTarget)
|
|
|
|
}
|
|
originalTarget = null
|
|
}.bind(this))
|
|
|
|
// Add second map
|
|
if (options.map2) this.setMap2(options.map2)
|
|
}
|
|
/** Set the second map to print
|
|
* @param {ol.Map} map
|
|
* @API
|
|
*/
|
|
setMap2(map) {
|
|
if (this.getMap2()) {
|
|
this.getMap2().removeControl(this._printCtrl2)
|
|
}
|
|
this._map2 = map;
|
|
if (map) {
|
|
this.getMap2().addControl(this._printCtrl2)
|
|
}
|
|
}
|
|
/** Set the second map to print
|
|
* @returns {ol.Map}
|
|
* @API
|
|
*/
|
|
getMap2() {
|
|
return this._map2;
|
|
}
|
|
/** First map printing
|
|
* @private
|
|
*/
|
|
_printing(e) {
|
|
this._printDialog.getContentElement().dataset.status = e.type
|
|
if (e.type === 'print') {
|
|
this._canvas1 = e.canvas
|
|
this._clipboard = e.clipboard
|
|
this._printCtrl2.print({
|
|
format: e.print.format,
|
|
imageType: e.imageType,
|
|
margin: e.margin,
|
|
pdf: e.pdf,
|
|
orient: e.print.orientation,
|
|
quality: e.quality,
|
|
size: e.print.size,
|
|
title: e.title
|
|
})
|
|
} else if (!e.clipboard) {
|
|
this.dispatchEvent(e)
|
|
}
|
|
}
|
|
/** Prevent first copy
|
|
* @private
|
|
*/
|
|
_copyMap(/* format */) {
|
|
/* prevent first copy */
|
|
return false
|
|
}
|
|
}
|
|
|
|
export default ol_control_PrintDialog2x |