|  | @@ -0,0 +1,148 @@
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Created by Tony on 2017/7/3.
 | 
	
		
			
				|  |  | + * 报表模板预览工具类
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +let preview_util = {
 | 
	
		
			
				|  |  | +    offsetX: 0,
 | 
	
		
			
				|  |  | +    offsetY: 0,
 | 
	
		
			
				|  |  | +    drawBorder: function (canvas) {
 | 
	
		
			
				|  |  | +        let me = this;
 | 
	
		
			
				|  |  | +        if (canvas) {
 | 
	
		
			
				|  |  | +            let size = [];
 | 
	
		
			
				|  |  | +            size[0] = canvas.width - 1;
 | 
	
		
			
				|  |  | +            size[1] = canvas.height - 1;
 | 
	
		
			
				|  |  | +            let ctx = canvas.getContext("2d");
 | 
	
		
			
				|  |  | +            ctx.save();
 | 
	
		
			
				|  |  | +            ctx.beginPath();
 | 
	
		
			
				|  |  | +            ctx.translate(0.5,0.5);
 | 
	
		
			
				|  |  | +            ctx.lineWidth = 1;
 | 
	
		
			
				|  |  | +            ctx.moveTo(me.offsetX, me.offsetY);
 | 
	
		
			
				|  |  | +            ctx.lineTo(size[0] + me.offsetX, me.offsetY);
 | 
	
		
			
				|  |  | +            ctx.lineTo(size[0] + me.offsetX, size[1] + me.offsetY);
 | 
	
		
			
				|  |  | +            ctx.lineTo(me.offsetX, size[1] + me.offsetY);
 | 
	
		
			
				|  |  | +            ctx.lineTo(me.offsetX, me.offsetY);
 | 
	
		
			
				|  |  | +            ctx.stroke();
 | 
	
		
			
				|  |  | +            ctx.restore();
 | 
	
		
			
				|  |  | +            ctx.fillStyle="black";
 | 
	
		
			
				|  |  | +            ctx.fillRect(size[0] + me.offsetX,10 + me.offsetY,10,size[1]);
 | 
	
		
			
				|  |  | +            ctx.fillRect(10 + me.offsetX,size[1] + me.offsetY,size[0],10);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    preview: function(canvas, rptTpl) {
 | 
	
		
			
				|  |  | +        let me = this, resolution= [96,96], size = null, shrinkFactor = 1;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (!(rptTpl)) return;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        let ctx = canvas.getContext("2d");
 | 
	
		
			
				|  |  | +        let pageSize = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE];
 | 
	
		
			
				|  |  | +        let sizeIdx = JV.PAGES_SIZE_STR.indexOf(pageSize);
 | 
	
		
			
				|  |  | +        if (sizeIdx >= 0) {
 | 
	
		
			
				|  |  | +            size = JV.PAGES_SIZE[sizeIdx];
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            size = JV.PAGES_SIZE[0];
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_LANDSCAPE || rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_LANDSCAPE_CHN) {
 | 
	
		
			
				|  |  | +            let ts = size[0];
 | 
	
		
			
				|  |  | +            size[0] = size[1];
 | 
	
		
			
				|  |  | +            size[1] = ts;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (size[0] > size[1]) {
 | 
	
		
			
				|  |  | +            shrinkFactor = 1.0 * canvas.width / (size[0] * resolution[0]);
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            shrinkFactor = 1.0 * canvas.height / (size[1] * resolution[1]);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        let private_translateUnit = function(unitStr) {
 | 
	
		
			
				|  |  | +            let me = this, rst = 1.0;
 | 
	
		
			
				|  |  | +            if (unitStr) {
 | 
	
		
			
				|  |  | +                if (JV.MEASUREMENT.PIXEL.indexOf(unitStr) >= 0) {
 | 
	
		
			
				|  |  | +                    rst = 1.0;
 | 
	
		
			
				|  |  | +                } else if (JV.MEASUREMENT.CM.indexOf(unitStr) >= 0) {
 | 
	
		
			
				|  |  | +                    rst = 1.0 * resolution[0] / 2.54;
 | 
	
		
			
				|  |  | +                } else if (JV.MEASUREMENT.INCH.indexOf(unitStr) >= 0) {
 | 
	
		
			
				|  |  | +                    rst = 1.0 * resolution[0];
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            return rst;
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        let private_getReportArea = function(rptTpl, unitFactor) {
 | 
	
		
			
				|  |  | +            let rst = [];
 | 
	
		
			
				|  |  | +            rst.push(unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]);
 | 
	
		
			
				|  |  | +            rst.push(unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_TOP]);
 | 
	
		
			
				|  |  | +            rst.push(size[0] * resolution[0] - unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT]);
 | 
	
		
			
				|  |  | +            rst.push(size[1] * resolution[0] - unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM]);
 | 
	
		
			
				|  |  | +            return rst;
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        let private_setupBandArea = function(band, parentArea) {
 | 
	
		
			
				|  |  | +            let rstArea = [].concat(parentArea);
 | 
	
		
			
				|  |  | +            switch (JV.LAYOUT.indexOf(band[JV.BAND_PROP_ALIGNMENT])) {
 | 
	
		
			
				|  |  | +                case JV.LAYOUT_TOP:
 | 
	
		
			
				|  |  | +                    if (band[JV.PROP_CALCULATION] == JV.CAL_TYPE_ABSTRACT) {
 | 
	
		
			
				|  |  | +                        rstArea[JV.IDX_BOTTOM] = rstArea[JV.IDX_TOP] + unitFactor * parseFloat(band[JV.BAND_PROP_HEIGHT]);
 | 
	
		
			
				|  |  | +                    } else {
 | 
	
		
			
				|  |  | +                        rstArea[JV.IDX_BOTTOM] = rstArea[JV.IDX_TOP] + (rstArea[JV.IDX_BOTTOM] - rstArea[JV.IDX_TOP]) * parseFloat(band[JV.BAND_PROP_HEIGHT]) / 100;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    parentArea[JV.IDX_TOP] = rstArea[JV.IDX_BOTTOM];
 | 
	
		
			
				|  |  | +                    break;
 | 
	
		
			
				|  |  | +                case JV.LAYOUT_BOTTOM:
 | 
	
		
			
				|  |  | +                    if (band[JV.PROP_CALCULATION] == JV.CAL_TYPE_ABSTRACT) {
 | 
	
		
			
				|  |  | +                        rstArea[JV.IDX_TOP] = rstArea[JV.IDX_BOTTOM] - unitFactor * parseFloat(band[JV.BAND_PROP_HEIGHT]);
 | 
	
		
			
				|  |  | +                    } else {
 | 
	
		
			
				|  |  | +                        rstArea[JV.IDX_TOP] = rstArea[JV.IDX_BOTTOM] - (rstArea[JV.IDX_BOTTOM] - rstArea[JV.IDX_TOP]) * parseFloat(band[JV.BAND_PROP_HEIGHT]) / 100;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    parentArea[JV.IDX_BOTTOM] = rstArea[JV.IDX_TOP];
 | 
	
		
			
				|  |  | +                    break;
 | 
	
		
			
				|  |  | +                case JV.LAYOUT_LEFT:
 | 
	
		
			
				|  |  | +                    if (band[JV.PROP_CALCULATION] == JV.CAL_TYPE_ABSTRACT) {
 | 
	
		
			
				|  |  | +                        rstArea[JV.IDX_RIGHT] = rstArea[JV.IDX_LEFT] + unitFactor * parseFloat(band[JV.BAND_PROP_WIDTH]);
 | 
	
		
			
				|  |  | +                    } else {
 | 
	
		
			
				|  |  | +                        rstArea[JV.IDX_RIGHT] = rstArea[JV.IDX_LEFT] + (rstArea[JV.IDX_RIGHT] - rstArea[JV.IDX_LEFT]) * parseFloat(band[JV.BAND_PROP_WIDTH]) / 100;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    parentArea[JV.IDX_LEFT] = rstArea[JV.IDX_RIGHT];
 | 
	
		
			
				|  |  | +                    break;
 | 
	
		
			
				|  |  | +                case JV.LAYOUT_RIGHT:
 | 
	
		
			
				|  |  | +                    if (band[JV.PROP_CALCULATION] == JV.CAL_TYPE_ABSTRACT) {
 | 
	
		
			
				|  |  | +                        rstArea[JV.IDX_LEFT] = rstArea[JV.IDX_RIGHT] - unitFactor * parseFloat(band[JV.BAND_PROP_WIDTH]);
 | 
	
		
			
				|  |  | +                    } else {
 | 
	
		
			
				|  |  | +                        rstArea[JV.IDX_LEFT] = rstArea[JV.IDX_RIGHT] - (rstArea[JV.IDX_RIGHT] - rstArea[JV.IDX_LEFT]) * parseFloat(band[JV.BAND_PROP_WIDTH]) / 100;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    parentArea[JV.IDX_RIGHT] = rstArea[JV.IDX_LEFT];
 | 
	
		
			
				|  |  | +                    break;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            return rstArea;
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +        let private_showBand = function (band, myArea) {
 | 
	
		
			
				|  |  | +            //1. draw band border
 | 
	
		
			
				|  |  | +            ctx.save();
 | 
	
		
			
				|  |  | +            ctx.beginPath();
 | 
	
		
			
				|  |  | +            ctx.translate(0.5,0.5);
 | 
	
		
			
				|  |  | +            ctx.lineWidth = 1;
 | 
	
		
			
				|  |  | +            ctx.setLineDash([3, 6]);
 | 
	
		
			
				|  |  | +            ctx.moveTo((me.offsetX + myArea[JV.IDX_LEFT]) * shrinkFactor, (me.offsetY + myArea[JV.IDX_TOP]) * shrinkFactor );
 | 
	
		
			
				|  |  | +            ctx.lineTo((me.offsetX + myArea[JV.IDX_RIGHT]) * shrinkFactor, (me.offsetY + myArea[JV.IDX_TOP]) * shrinkFactor);
 | 
	
		
			
				|  |  | +            ctx.lineTo((me.offsetX + myArea[JV.IDX_RIGHT]) * shrinkFactor, (me.offsetY + myArea[JV.IDX_BOTTOM]) * shrinkFactor);
 | 
	
		
			
				|  |  | +            ctx.lineTo((me.offsetX + myArea[JV.IDX_LEFT]) * shrinkFactor, (me.offsetY + myArea[JV.IDX_BOTTOM]) * shrinkFactor);
 | 
	
		
			
				|  |  | +            ctx.lineTo((me.offsetX + myArea[JV.IDX_LEFT]) * shrinkFactor, (me.offsetY + myArea[JV.IDX_TOP]) * shrinkFactor);
 | 
	
		
			
				|  |  | +            ctx.stroke();
 | 
	
		
			
				|  |  | +            ctx.restore();
 | 
	
		
			
				|  |  | +            //2. then draw sub bands border if have.
 | 
	
		
			
				|  |  | +            if (band[JV.BAND_PROP_SUB_BANDS]) {
 | 
	
		
			
				|  |  | +                for (let subBand of band[JV.BAND_PROP_SUB_BANDS]) {
 | 
	
		
			
				|  |  | +                    if (!(subBand[JV.PROP_CALCULATION])) subBand[JV.PROP_CALCULATION] = JV.CAL_TYPE_ABSTRACT;
 | 
	
		
			
				|  |  | +                    let area = private_setupBandArea(band, myArea);
 | 
	
		
			
				|  |  | +                    private_showBand(subBand, area);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +        let unitFactor = private_translateUnit(rptTpl[JV.NODE_MAIN_INFO][JV.PROP_UNITS]),
 | 
	
		
			
				|  |  | +            orgArea = private_getReportArea(rptTpl, unitFactor);
 | 
	
		
			
				|  |  | +        for (let band of rptTpl[JV.NODE_BAND_COLLECTION]) {
 | 
	
		
			
				|  |  | +            if (!(band[JV.PROP_CALCULATION])) band[JV.PROP_CALCULATION] = JV.CAL_TYPE_ABSTRACT;
 | 
	
		
			
				|  |  | +            let area = private_setupBandArea(band, orgArea);
 | 
	
		
			
				|  |  | +            private_showBand(band, area);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |