1 /*
2  * JasperReports - Free Java Reporting Library.
3  * Copyright (C) 2001 - 2019 TIBCO Software Inc. 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 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 /**
43  * 
44  * @author Lucian Chirita (lucianc@users.sourceforge.net)
45  */

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         //FIXMENOW do like for map and spider chart, because it crashes with null code one evaluationTime != NOW; check barbecue too
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