1
24 package net.sf.jasperreports.components.barbecue;
25
26 import java.util.HashMap;
27 import java.util.Map;
28
29 import net.sf.jasperreports.engine.JRComponentElement;
30 import net.sf.jasperreports.engine.JRException;
31 import net.sf.jasperreports.engine.JRPrintElement;
32 import net.sf.jasperreports.engine.JRStyle;
33 import net.sf.jasperreports.engine.component.BaseFillComponent;
34 import net.sf.jasperreports.engine.component.FillPrepareResult;
35 import net.sf.jasperreports.engine.fill.JRTemplateImage;
36 import net.sf.jasperreports.engine.fill.JRTemplatePrintImage;
37 import net.sf.jasperreports.engine.type.EvaluationTimeEnum;
38 import net.sf.jasperreports.engine.type.ScaleImageEnum;
39 import net.sf.jasperreports.engine.util.JRStringUtil;
40 import net.sourceforge.barbecue.Barcode;
41
42
46 public class BarbecueFillComponent extends BaseFillComponent
47 {
48
49 private final BarbecueComponent barcodeComponent;
50
51 private final Map<JRStyle, JRTemplateImage> printTemplates = new HashMap<JRStyle, JRTemplateImage>();
52
53 private String code;
54 private String applicationIdentifier;
55
56 public BarbecueFillComponent(BarbecueComponent barcode)
57 {
58 this.barcodeComponent = barcode;
59 }
60
61 protected BarbecueComponent getBarcode()
62 {
63 return barcodeComponent;
64 }
65
66 @Override
67 public void evaluate(byte evaluation) throws JRException
68 {
69 if (isEvaluateNow())
70 {
71 evaluateBarcode(evaluation);
72 }
73 }
74
75 protected void evaluateBarcode(byte evaluation) throws JRException
76 {
77 code = JRStringUtil.getString(fillContext.evaluate(barcodeComponent.getCodeExpression(), evaluation));
78
79 applicationIdentifier = JRStringUtil.getString(fillContext.evaluate(barcodeComponent.getApplicationIdentifierExpression(), evaluation));
80 }
81
82 protected boolean isEvaluateNow()
83 {
84 return barcodeComponent.getEvaluationTimeValue() == EvaluationTimeEnum.NOW;
85 }
86
87 @Override
88 public FillPrepareResult prepare(int availableHeight)
89 {
90
91 return isEvaluateNow() && code == null
92 ? FillPrepareResult.NO_PRINT_NO_OVERFLOW
93 : FillPrepareResult.PRINT_NO_STRETCH;
94 }
95
96 @Override
97 public JRPrintElement fill()
98 {
99 JRTemplateImage templateImage = getTemplateImage();
100
101 JRTemplatePrintImage image = new JRTemplatePrintImage(templateImage, printElementOriginator);
102 JRComponentElement element = fillContext.getComponentElement();
103 image.setUUID(element.getUUID());
104 image.setX(element.getX());
105 image.setY(fillContext.getElementPrintY());
106 image.setWidth(element.getWidth());
107 image.setHeight(element.getHeight());
108
109 if (isEvaluateNow())
110 {
111 setBarcodeImage(image);
112 }
113 else
114 {
115 fillContext.registerDelayedEvaluation(image,
116 barcodeComponent.getEvaluationTimeValue(),
117 barcodeComponent.getEvaluationGroup());
118 }
119
120 return image;
121 }
122
123 @Override
124 public void evaluateDelayedElement(JRPrintElement element, byte evaluation)
125 throws JRException
126 {
127 evaluateBarcode(evaluation);
128 setBarcodeImage((JRTemplatePrintImage) element);
129 }
130
131 protected void setBarcodeImage(JRTemplatePrintImage image)
132 {
133 BarcodeInfo barcodeInfo = new BarcodeInfo();
134 barcodeInfo.setType(barcodeComponent.getType());
135 barcodeInfo.setCode(code);
136 barcodeInfo.setApplicationIdentifier(applicationIdentifier);
137 barcodeInfo.setDrawText(barcodeComponent.isDrawText());
138 barcodeInfo.setRequiresChecksum(barcodeComponent.isChecksumRequired());
139 barcodeInfo.setBarWidth(barcodeComponent.getBarWidth());
140 barcodeInfo.setBarHeight(barcodeComponent.getBarHeight());
141
142 Barcode barcode = BarcodeProviders.createBarcode(barcodeInfo);
143 BarbecueRendererImpl renderer = new BarbecueRendererImpl(barcode);
144 renderer.setRotation(BarbecueStyleResolver.getRotationValue(fillContext.getComponentElement()));
145
146 image.setRenderer(renderer);
147 }
148
149 protected JRTemplateImage getTemplateImage()
150 {
151 JRStyle elementStyle = fillContext.getElementStyle();
152 JRTemplateImage templateImage = printTemplates.get(elementStyle);
153 if (templateImage == null)
154 {
155 templateImage = new JRTemplateImage(
156 fillContext.getElementOrigin(),
157 fillContext.getDefaultStyleProvider());
158 templateImage.setStyle(elementStyle);
159 templateImage.setScaleImage(ScaleImageEnum.RETAIN_SHAPE);
160 templateImage.setUsingCache(false);
161
162 templateImage = deduplicate(templateImage);
163 printTemplates.put(elementStyle, templateImage);
164 }
165 return templateImage;
166 }
167
168 }
169