/projects/jasperreports-3.7.4/src/net/sf/jasperreports/engine/export/draw/ElementDrawer.java

https://gitlab.com/essere.lab.public/qualitas.class-corpus · Java · 487 lines · 380 code · 49 blank · 58 comment · 24 complexity · c4c23877fe4f3a11e91c5a465c9e42f9 MD5 · raw file

  1. /*
  2. * JasperReports - Free Java Reporting Library.
  3. * Copyright (C) 2001 - 2009 Jaspersoft Corporation. All rights reserved.
  4. * http://www.jaspersoft.com
  5. *
  6. * Unless you have purchased a commercial license agreement from Jaspersoft,
  7. * the following license terms apply:
  8. *
  9. * This program is part of JasperReports.
  10. *
  11. * JasperReports is free software: you can redistribute it and/or modify
  12. * it under the terms of the GNU Lesser General Public License as published by
  13. * the Free Software Foundation, either version 3 of the License, or
  14. * (at your option) any later version.
  15. *
  16. * JasperReports is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU Lesser General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU Lesser General Public License
  22. * along with JasperReports. If not, see <http://www.gnu.org/licenses/>.
  23. */
  24. /*
  25. * Contributors:
  26. * Eugene D - eugenedruy@users.sourceforge.net
  27. * Adrian Jackson - iapetus@users.sourceforge.net
  28. * David Taylor - exodussystems@users.sourceforge.net
  29. * Lars Kristensen - llk@users.sourceforge.net
  30. */
  31. package net.sf.jasperreports.engine.export.draw;
  32. import java.awt.BasicStroke;
  33. import java.awt.Graphics2D;
  34. import java.awt.Stroke;
  35. import java.awt.geom.AffineTransform;
  36. import net.sf.jasperreports.engine.JRException;
  37. import net.sf.jasperreports.engine.JRLineBox;
  38. import net.sf.jasperreports.engine.JRPen;
  39. import net.sf.jasperreports.engine.JRPrintElement;
  40. import net.sf.jasperreports.engine.export.legacy.BorderOffset;
  41. import net.sf.jasperreports.engine.type.LineStyleEnum;
  42. import net.sf.jasperreports.engine.util.JRPenUtil;
  43. /**
  44. * @author Teodor Danciu (teodord@users.sourceforge.net)
  45. * @version $Id: ElementDrawer.java 3467 2010-02-23 13:11:13Z teodord $
  46. */
  47. public abstract class ElementDrawer
  48. {
  49. /**
  50. *
  51. */
  52. public abstract void draw(Graphics2D grx, JRPrintElement element, int offsetX, int offsetY) throws JRException;
  53. /**
  54. *
  55. */
  56. protected void drawBox(Graphics2D grx, JRLineBox box, JRPrintElement element, int offsetX, int offsetY)
  57. {
  58. drawTopPen(
  59. grx,
  60. box.getTopPen(),
  61. box.getLeftPen(),
  62. box.getRightPen(),
  63. element,
  64. offsetX,
  65. offsetY
  66. );
  67. drawLeftPen(
  68. grx,
  69. box.getTopPen(),
  70. box.getLeftPen(),
  71. box.getBottomPen(),
  72. element,
  73. offsetX,
  74. offsetY
  75. );
  76. drawBottomPen(
  77. grx,
  78. box.getLeftPen(),
  79. box.getBottomPen(),
  80. box.getRightPen(),
  81. element,
  82. offsetX,
  83. offsetY
  84. );
  85. drawRightPen(
  86. grx,
  87. box.getTopPen(),
  88. box.getBottomPen(),
  89. box.getRightPen(),
  90. element,
  91. offsetX,
  92. offsetY
  93. );
  94. }
  95. /**
  96. *
  97. */
  98. protected void drawPen(Graphics2D grx, JRPen pen, JRPrintElement element, int offsetX, int offsetY)
  99. {
  100. drawTopPen(grx, pen, pen, pen, element, offsetX, offsetY);
  101. drawLeftPen(grx, pen, pen, pen, element, offsetX, offsetY);
  102. drawBottomPen(grx, pen, pen, pen, element, offsetX, offsetY);
  103. drawRightPen(grx, pen, pen, pen, element, offsetX, offsetY);
  104. }
  105. /**
  106. *
  107. */
  108. protected void drawTopPen(
  109. Graphics2D grx,
  110. JRPen topPen,
  111. JRPen leftPen,
  112. JRPen rightPen,
  113. JRPrintElement element,
  114. int offsetX,
  115. int offsetY
  116. )
  117. {
  118. Stroke topStroke = JRPenUtil.getStroke(topPen, BasicStroke.CAP_BUTT);
  119. int width = element.getWidth();
  120. float leftOffset = leftPen.getLineWidth().floatValue() / 2 - BorderOffset.getOffset(leftPen);
  121. float rightOffset = rightPen.getLineWidth().floatValue() / 2 - BorderOffset.getOffset(rightPen);
  122. if (topStroke != null && width > 0)
  123. {
  124. grx.setStroke(topStroke);
  125. grx.setColor(topPen.getLineColor());
  126. AffineTransform oldTx = grx.getTransform();
  127. if (topPen.getLineStyleValue() == LineStyleEnum.DOUBLE)
  128. {
  129. float topPenWidth = topPen.getLineWidth().floatValue();
  130. grx.translate(
  131. element.getX() + offsetX - leftOffset,
  132. element.getY() + offsetY - topPenWidth / 3
  133. );
  134. grx.scale(
  135. (width + leftOffset + rightOffset)
  136. / width,
  137. 1
  138. );
  139. grx.drawLine(
  140. 0,
  141. 0,
  142. width,
  143. 0
  144. );
  145. grx.setTransform(oldTx);
  146. grx.translate(
  147. element.getX() + offsetX + leftOffset / 3,
  148. element.getY() + offsetY + topPenWidth / 3
  149. );
  150. if(width > (leftOffset + rightOffset) / 3)
  151. {
  152. grx.scale(
  153. (width - (leftOffset + rightOffset) / 3)
  154. / width,
  155. 1
  156. );
  157. }
  158. grx.drawLine(
  159. 0,
  160. 0,
  161. width,
  162. 0
  163. );
  164. }
  165. else
  166. {
  167. grx.translate(
  168. element.getX() + offsetX - leftOffset,
  169. element.getY() + offsetY + BorderOffset.getOffset(topPen)
  170. );
  171. grx.scale(
  172. (width + leftOffset + rightOffset)
  173. / width,
  174. 1
  175. );
  176. grx.drawLine(
  177. 0,
  178. 0,
  179. width,
  180. 0
  181. );
  182. }
  183. grx.setTransform(oldTx);
  184. }
  185. }
  186. /**
  187. *
  188. */
  189. protected void drawLeftPen(
  190. Graphics2D grx,
  191. JRPen topPen,
  192. JRPen leftPen,
  193. JRPen bottomPen,
  194. JRPrintElement element,
  195. int offsetX,
  196. int offsetY
  197. )
  198. {
  199. Stroke leftStroke = JRPenUtil.getStroke(leftPen, BasicStroke.CAP_BUTT);
  200. int height = element.getHeight();
  201. float topOffset = topPen.getLineWidth().floatValue() / 2 - BorderOffset.getOffset(topPen);
  202. float bottomOffset = bottomPen.getLineWidth().floatValue() / 2 - BorderOffset.getOffset(bottomPen);
  203. if (leftStroke != null && height > 0)
  204. {
  205. grx.setStroke(leftStroke);
  206. grx.setColor(leftPen.getLineColor());
  207. AffineTransform oldTx = grx.getTransform();
  208. if (leftPen.getLineStyleValue() == LineStyleEnum.DOUBLE)
  209. {
  210. float leftPenWidth = leftPen.getLineWidth().floatValue();
  211. grx.translate(
  212. element.getX() + offsetX - leftPenWidth / 3,
  213. element.getY() + offsetY - topOffset
  214. );
  215. grx.scale(
  216. 1,
  217. (height + (topOffset + bottomOffset))
  218. / height
  219. );
  220. grx.drawLine(
  221. 0,
  222. 0,
  223. 0,
  224. height
  225. );
  226. grx.setTransform(oldTx);
  227. grx.translate(
  228. element.getX() + offsetX + leftPenWidth / 3,
  229. element.getY() + offsetY + topOffset / 3
  230. );
  231. if(height > (topOffset + bottomOffset) / 3)
  232. {
  233. grx.scale(
  234. 1,
  235. (height - (topOffset + bottomOffset) / 3)
  236. / height
  237. );
  238. }
  239. grx.drawLine(
  240. 0,
  241. 0,
  242. 0,
  243. height
  244. );
  245. }
  246. else
  247. {
  248. grx.translate(
  249. element.getX() + offsetX + BorderOffset.getOffset(leftPen),
  250. element.getY() + offsetY - topOffset
  251. );
  252. grx.scale(
  253. 1,
  254. (height + topOffset + bottomOffset)
  255. / height
  256. );
  257. grx.drawLine(
  258. 0,
  259. 0,
  260. 0,
  261. height
  262. );
  263. }
  264. grx.setTransform(oldTx);
  265. }
  266. }
  267. /**
  268. *
  269. */
  270. protected void drawBottomPen(
  271. Graphics2D grx,
  272. JRPen leftPen,
  273. JRPen bottomPen,
  274. JRPen rightPen,
  275. JRPrintElement element,
  276. int offsetX,
  277. int offsetY
  278. )
  279. {
  280. Stroke bottomStroke = JRPenUtil.getStroke(bottomPen, BasicStroke.CAP_BUTT);
  281. int width = element.getWidth();
  282. int height = element.getHeight();
  283. float leftOffset = leftPen.getLineWidth().floatValue() / 2 - BorderOffset.getOffset(leftPen);
  284. float rightOffset = rightPen.getLineWidth().floatValue() / 2 - BorderOffset.getOffset(rightPen);
  285. if (bottomStroke != null && width > 0)
  286. {
  287. grx.setStroke(bottomStroke);
  288. grx.setColor(bottomPen.getLineColor());
  289. AffineTransform oldTx = grx.getTransform();
  290. if (bottomPen.getLineStyleValue() == LineStyleEnum.DOUBLE)
  291. {
  292. float bottomPenWidth = bottomPen.getLineWidth().floatValue();
  293. grx.translate(
  294. element.getX() + offsetX - leftOffset,
  295. element.getY() + offsetY + height + bottomPenWidth / 3
  296. );
  297. grx.scale(
  298. (width + leftOffset + rightOffset)
  299. / width,
  300. 1
  301. );
  302. grx.drawLine(
  303. 0,
  304. 0,
  305. width,
  306. 0
  307. );
  308. grx.setTransform(oldTx);
  309. grx.translate(
  310. element.getX() + offsetX + leftOffset / 3,
  311. element.getY() + offsetY + height - bottomPenWidth / 3
  312. );
  313. if(width > (leftOffset + rightOffset) / 3)
  314. {
  315. grx.scale(
  316. (width - (leftOffset + rightOffset) / 3)
  317. / width,
  318. 1
  319. );
  320. }
  321. grx.drawLine(
  322. 0,
  323. 0,
  324. width,
  325. 0
  326. );
  327. }
  328. else
  329. {
  330. grx.translate(
  331. element.getX() + offsetX - leftOffset,
  332. element.getY() + offsetY + height - BorderOffset.getOffset(bottomPen)
  333. );
  334. grx.scale(
  335. (width + leftOffset + rightOffset)
  336. / width,
  337. 1
  338. );
  339. grx.drawLine(
  340. 0,
  341. 0,
  342. width,
  343. 0
  344. );
  345. }
  346. grx.setTransform(oldTx);
  347. }
  348. }
  349. /**
  350. *
  351. */
  352. protected void drawRightPen(
  353. Graphics2D grx,
  354. JRPen topPen,
  355. JRPen bottomPen,
  356. JRPen rightPen,
  357. JRPrintElement element,
  358. int offsetX,
  359. int offsetY
  360. )
  361. {
  362. Stroke rightStroke = JRPenUtil.getStroke(rightPen, BasicStroke.CAP_BUTT);
  363. int height = element.getHeight();
  364. int width = element.getWidth();
  365. float topOffset = topPen.getLineWidth().floatValue() / 2 - BorderOffset.getOffset(topPen);
  366. float bottomOffset = bottomPen.getLineWidth().floatValue() / 2 - BorderOffset.getOffset(bottomPen);
  367. if (rightStroke != null && height > 0)
  368. {
  369. grx.setStroke(rightStroke);
  370. grx.setColor(rightPen.getLineColor());
  371. AffineTransform oldTx = grx.getTransform();
  372. if (rightPen.getLineStyleValue() == LineStyleEnum.DOUBLE)
  373. {
  374. float rightPenWidth = rightPen.getLineWidth().floatValue();
  375. grx.translate(
  376. element.getX() + offsetX + width + rightPenWidth / 3,
  377. element.getY() + offsetY - topOffset
  378. );
  379. grx.scale(
  380. 1,
  381. (height + topOffset + bottomOffset)
  382. / height
  383. );
  384. grx.drawLine(
  385. 0,
  386. 0,
  387. 0,
  388. height
  389. );
  390. grx.setTransform(oldTx);
  391. grx.translate(
  392. element.getX() + offsetX + width - rightPenWidth / 3,
  393. element.getY() + offsetY + topOffset / 3
  394. );
  395. if(height > (topOffset + bottomOffset) / 3)
  396. {
  397. grx.scale(
  398. 1,
  399. (height - (topOffset + bottomOffset) / 3)
  400. / height
  401. );
  402. }
  403. grx.drawLine(
  404. 0,
  405. 0,
  406. 0,
  407. height
  408. );
  409. }
  410. else
  411. {
  412. grx.translate(
  413. element.getX() + offsetX + width - BorderOffset.getOffset(rightPen),
  414. element.getY() + offsetY - topOffset
  415. );
  416. grx.scale(
  417. 1,
  418. (height + topOffset + bottomOffset)
  419. / height
  420. );
  421. grx.drawLine(
  422. 0,
  423. 0,
  424. 0,
  425. height
  426. );
  427. }
  428. grx.setTransform(oldTx);
  429. }
  430. }
  431. /**
  432. * @deprecated Replaced by {@link JRPenUtil#getStroke(JRPen, int)}
  433. */
  434. protected static Stroke getStroke(JRPen pen, int lineCap)
  435. {
  436. return JRPenUtil.getStroke(pen, lineCap);
  437. }
  438. }