rpt_tpl_preview_util.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /**
  2. * Created by Tony on 2017/7/3.
  3. * 报表模板预览工具类
  4. */
  5. let preview_util = {
  6. offsetX: 0,
  7. offsetY: 0,
  8. drawBorder: function (canvas) {
  9. let me = this;
  10. if (canvas) {
  11. let size = [];
  12. size[0] = canvas.width - 1;
  13. size[1] = canvas.height - 1;
  14. let ctx = canvas.getContext("2d");
  15. ctx.save();
  16. ctx.beginPath();
  17. ctx.translate(0.5,0.5);
  18. ctx.lineWidth = 1;
  19. ctx.moveTo(me.offsetX, me.offsetY);
  20. ctx.lineTo(size[0] + me.offsetX, me.offsetY);
  21. ctx.lineTo(size[0] + me.offsetX, size[1] + me.offsetY);
  22. ctx.lineTo(me.offsetX, size[1] + me.offsetY);
  23. ctx.lineTo(me.offsetX, me.offsetY);
  24. ctx.stroke();
  25. ctx.restore();
  26. ctx.fillStyle="black";
  27. ctx.fillRect(size[0] + me.offsetX,10 + me.offsetY,10,size[1]);
  28. ctx.fillRect(10 + me.offsetX,size[1] + me.offsetY,size[0],10);
  29. }
  30. },
  31. preview: function(canvas, rptTpl) {
  32. let me = this, resolution= [96,96], size = null, shrinkFactor = 1;
  33. if (!(rptTpl)) return;
  34. let ctx = canvas.getContext("2d");
  35. let pageSize = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE];
  36. let sizeIdx = JV.PAGES_SIZE_STR.indexOf(pageSize);
  37. if (sizeIdx >= 0) {
  38. size = JV.PAGES_SIZE[sizeIdx];
  39. } else {
  40. size = JV.PAGES_SIZE[0];
  41. }
  42. 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) {
  43. let ts = size[0];
  44. size[0] = size[1];
  45. size[1] = ts;
  46. }
  47. if (size[0] > size[1]) {
  48. shrinkFactor = 1.0 * canvas.width / (size[0] * resolution[0]);
  49. } else {
  50. shrinkFactor = 1.0 * canvas.height / (size[1] * resolution[1]);
  51. }
  52. let private_translateUnit = function(unitStr) {
  53. let me = this, rst = 1.0;
  54. if (unitStr) {
  55. if (JV.MEASUREMENT.PIXEL.indexOf(unitStr) >= 0) {
  56. rst = 1.0;
  57. } else if (JV.MEASUREMENT.CM.indexOf(unitStr) >= 0) {
  58. rst = 1.0 * resolution[0] / 2.54;
  59. } else if (JV.MEASUREMENT.INCH.indexOf(unitStr) >= 0) {
  60. rst = 1.0 * resolution[0];
  61. }
  62. }
  63. return rst;
  64. };
  65. let private_getReportArea = function(rptTpl, unitFactor) {
  66. let rst = [];
  67. rst.push(unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]);
  68. rst.push(unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_TOP]);
  69. rst.push(size[0] * resolution[0] - unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT]);
  70. rst.push(size[1] * resolution[0] - unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM]);
  71. return rst;
  72. };
  73. let private_setupBandArea = function(band, parentArea) {
  74. let rstArea = [].concat(parentArea);
  75. switch (JV.LAYOUT.indexOf(band[JV.BAND_PROP_ALIGNMENT])) {
  76. case JV.LAYOUT_TOP:
  77. if (band[JV.PROP_CALCULATION] == JV.CAL_TYPE_ABSTRACT) {
  78. rstArea[JV.IDX_BOTTOM] = rstArea[JV.IDX_TOP] + unitFactor * parseFloat(band[JV.BAND_PROP_HEIGHT]);
  79. } else {
  80. rstArea[JV.IDX_BOTTOM] = rstArea[JV.IDX_TOP] + (rstArea[JV.IDX_BOTTOM] - rstArea[JV.IDX_TOP]) * parseFloat(band[JV.BAND_PROP_HEIGHT]) / 100;
  81. }
  82. parentArea[JV.IDX_TOP] = rstArea[JV.IDX_BOTTOM];
  83. break;
  84. case JV.LAYOUT_BOTTOM:
  85. if (band[JV.PROP_CALCULATION] == JV.CAL_TYPE_ABSTRACT) {
  86. rstArea[JV.IDX_TOP] = rstArea[JV.IDX_BOTTOM] - unitFactor * parseFloat(band[JV.BAND_PROP_HEIGHT]);
  87. } else {
  88. rstArea[JV.IDX_TOP] = rstArea[JV.IDX_BOTTOM] - (rstArea[JV.IDX_BOTTOM] - rstArea[JV.IDX_TOP]) * parseFloat(band[JV.BAND_PROP_HEIGHT]) / 100;
  89. }
  90. parentArea[JV.IDX_BOTTOM] = rstArea[JV.IDX_TOP];
  91. break;
  92. case JV.LAYOUT_LEFT:
  93. if (band[JV.PROP_CALCULATION] == JV.CAL_TYPE_ABSTRACT) {
  94. rstArea[JV.IDX_RIGHT] = rstArea[JV.IDX_LEFT] + unitFactor * parseFloat(band[JV.BAND_PROP_WIDTH]);
  95. } else {
  96. rstArea[JV.IDX_RIGHT] = rstArea[JV.IDX_LEFT] + (rstArea[JV.IDX_RIGHT] - rstArea[JV.IDX_LEFT]) * parseFloat(band[JV.BAND_PROP_WIDTH]) / 100;
  97. }
  98. parentArea[JV.IDX_LEFT] = rstArea[JV.IDX_RIGHT];
  99. break;
  100. case JV.LAYOUT_RIGHT:
  101. if (band[JV.PROP_CALCULATION] == JV.CAL_TYPE_ABSTRACT) {
  102. rstArea[JV.IDX_LEFT] = rstArea[JV.IDX_RIGHT] - unitFactor * parseFloat(band[JV.BAND_PROP_WIDTH]);
  103. } else {
  104. rstArea[JV.IDX_LEFT] = rstArea[JV.IDX_RIGHT] - (rstArea[JV.IDX_RIGHT] - rstArea[JV.IDX_LEFT]) * parseFloat(band[JV.BAND_PROP_WIDTH]) / 100;
  105. }
  106. parentArea[JV.IDX_RIGHT] = rstArea[JV.IDX_LEFT];
  107. break;
  108. }
  109. return rstArea;
  110. };
  111. let private_showBand = function (band, myArea) {
  112. //1. draw band border
  113. ctx.save();
  114. ctx.beginPath();
  115. ctx.translate(0.5,0.5);
  116. ctx.lineWidth = 1;
  117. ctx.setLineDash([3, 6]);
  118. ctx.moveTo((me.offsetX + myArea[JV.IDX_LEFT]) * shrinkFactor, (me.offsetY + myArea[JV.IDX_TOP]) * shrinkFactor );
  119. ctx.lineTo((me.offsetX + myArea[JV.IDX_RIGHT]) * shrinkFactor, (me.offsetY + myArea[JV.IDX_TOP]) * shrinkFactor);
  120. ctx.lineTo((me.offsetX + myArea[JV.IDX_RIGHT]) * shrinkFactor, (me.offsetY + myArea[JV.IDX_BOTTOM]) * shrinkFactor);
  121. ctx.lineTo((me.offsetX + myArea[JV.IDX_LEFT]) * shrinkFactor, (me.offsetY + myArea[JV.IDX_BOTTOM]) * shrinkFactor);
  122. ctx.lineTo((me.offsetX + myArea[JV.IDX_LEFT]) * shrinkFactor, (me.offsetY + myArea[JV.IDX_TOP]) * shrinkFactor);
  123. ctx.stroke();
  124. ctx.restore();
  125. //2. then draw sub bands border if have.
  126. if (band[JV.BAND_PROP_SUB_BANDS]) {
  127. for (let subBand of band[JV.BAND_PROP_SUB_BANDS]) {
  128. if (!(subBand[JV.PROP_CALCULATION])) subBand[JV.PROP_CALCULATION] = JV.CAL_TYPE_ABSTRACT;
  129. let area = private_setupBandArea(band, myArea);
  130. private_showBand(subBand, area);
  131. }
  132. }
  133. };
  134. let unitFactor = private_translateUnit(rptTpl[JV.NODE_MAIN_INFO][JV.PROP_UNITS]),
  135. orgArea = private_getReportArea(rptTpl, unitFactor);
  136. for (let band of rptTpl[JV.NODE_BAND_COLLECTION]) {
  137. if (!(band[JV.PROP_CALCULATION])) band[JV.PROP_CALCULATION] = JV.CAL_TYPE_ABSTRACT;
  138. let area = private_setupBandArea(band, orgArea);
  139. private_showBand(band, area);
  140. }
  141. }
  142. }