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.engine.base;
25
26 import java.awt.Color;
27 import java.io.Serializable;
28
29 import net.sf.jasperreports.engine.Deduplicable;
30 import net.sf.jasperreports.engine.JRBoxContainer;
31 import net.sf.jasperreports.engine.JRConstants;
32 import net.sf.jasperreports.engine.JRDefaultStyleProvider;
33 import net.sf.jasperreports.engine.JRLineBox;
34 import net.sf.jasperreports.engine.JRPen;
35 import net.sf.jasperreports.engine.JRRuntimeException;
36 import net.sf.jasperreports.engine.JRStyle;
37 import net.sf.jasperreports.engine.design.events.JRChangeEventsSupport;
38 import net.sf.jasperreports.engine.design.events.JRPropertyChangeSupport;
39 import net.sf.jasperreports.engine.util.ObjectUtils;
40 import net.sf.jasperreports.engine.util.StyleResolver;
41
42
43 /**
44  * This is useful for drawing borders around text elements and images. Boxes can have borders and paddings, which can
45  * have different width and colour on each side of the element.
46  * @author Teodor Danciu (teodord@users.sourceforge.net)
47  */

48 public class JRBaseLineBox implements JRLineBox, Serializable, Cloneable, JRChangeEventsSupport, Deduplicable
49 {
50
51
52     /**
53      *
54      */

55     private static final long serialVersionUID = JRConstants.SERIAL_VERSION_UID;
56     
57     public static final String PROPERTY_PADDING = "padding";
58     
59     public static final String PROPERTY_TOP_PADDING = "topPadding";
60     
61     public static final String PROPERTY_LEFT_PADDING = "leftPadding";
62     
63     public static final String PROPERTY_BOTTOM_PADDING = "bottomPadding";
64     
65     public static final String PROPERTY_RIGHT_PADDING = "rightPadding";
66     
67
68     protected JRBoxContainer boxContainer;
69
70     /**
71      *
72      */

73     protected JRBoxPen pen; 
74     protected JRBoxPen topPen;
75     protected JRBoxPen leftPen;
76     protected JRBoxPen bottomPen;
77     protected JRBoxPen rightPen;
78
79     protected Integer padding;
80     protected Integer topPadding;
81     protected Integer leftPadding;
82     protected Integer bottomPadding;
83     protected Integer rightPadding;
84
85     
86     /**
87      *
88      */

89     public JRBaseLineBox(JRBoxContainer boxContainer)
90     {
91         this.boxContainer = boxContainer;
92
93         pen = new JRBaseBoxPen(this);
94         topPen = new JRBaseBoxTopPen(this);
95         leftPen = new JRBaseBoxLeftPen(this);
96         bottomPen = new JRBaseBoxBottomPen(this);
97         rightPen = new JRBaseBoxRightPen(this);
98     }
99     
100     
101     @Override
102     public JRDefaultStyleProvider getDefaultStyleProvider() 
103     {
104         if (boxContainer != null)
105         {
106             return boxContainer.getDefaultStyleProvider();
107         }
108         return null;
109     }
110
111     /**
112      *
113      */

114     protected StyleResolver getStyleResolver() 
115     {
116         if (getDefaultStyleProvider() != null)
117         {
118             return getDefaultStyleProvider().getStyleResolver();
119         }
120         return StyleResolver.getInstance();
121     }
122
123     @Override
124     public JRStyle getStyle() 
125     {
126         if (boxContainer != null)
127         {
128             return boxContainer.getStyle();
129         }
130         return null;
131     }
132
133     @Override
134     public String getStyleNameReference()
135     {
136         if (boxContainer != null)
137         {
138             return boxContainer.getStyleNameReference();
139         }
140         return null;
141     }
142
143     @Override
144     public JRBoxContainer getBoxContainer()
145     {
146         return boxContainer;
147     }
148
149     @Override
150     public Float getDefaultLineWidth()
151     {
152         return JRPen.LINE_WIDTH_0;
153     }
154
155     @Override
156     public Color getDefaultLineColor()
157     {
158         if (boxContainer != null)
159         {
160             return boxContainer.getDefaultLineColor();
161         }
162         return Color.black;
163     }
164
165     @Override
166     public JRBoxPen getPen()
167     {
168         return pen;
169     }
170
171     @Override
172     public void copyPen(JRBoxPen pen)
173     {
174         this.pen = pen.clone(this);
175     }
176
177     @Override
178     public JRBoxPen getTopPen()
179     {
180         return topPen;
181     }
182
183     @Override
184     public void copyTopPen(JRBoxPen topPen)
185     {
186         this.topPen = topPen.clone(this);
187     }
188
189     @Override
190     public JRBoxPen getLeftPen()
191     {
192         return leftPen;
193     }
194
195     @Override
196     public void copyLeftPen(JRBoxPen leftPen)
197     {
198         this.leftPen = leftPen.clone(this);
199     }
200
201     @Override
202     public JRBoxPen getBottomPen()
203     {
204         return bottomPen;
205     }
206
207     @Override
208     public void copyBottomPen(JRBoxPen bottomPen)
209     {
210         this.bottomPen = bottomPen.clone(this);
211     }
212
213     @Override
214     public JRBoxPen getRightPen()
215     {
216         return rightPen;
217     }
218
219     @Override
220     public void copyRightPen(JRBoxPen rightPen)
221     {
222         this.rightPen = rightPen.clone(this);
223     }
224
225     @Override
226     public Integer getPadding()
227     {
228         return getStyleResolver().getPadding(this);
229     }
230
231     @Override
232     public Integer getOwnPadding()
233     {
234         return padding;
235     }
236     
237     /**
238      * @deprecated Replaced by {@link #setPadding(Integer)}.
239      */

240     @Override
241     public void setPadding(int padding)
242     {
243         setPadding((Integer)padding);
244     }
245
246     @Override
247     public void setPadding(Integer padding)
248     {
249         Object old = this.padding;
250         this.padding = padding;
251         getEventSupport().firePropertyChange(PROPERTY_PADDING, old, this.padding);
252     }
253
254     @Override
255     public Integer getTopPadding()
256     {
257         return getStyleResolver().getTopPadding(this);
258     }
259
260     @Override
261     public Integer getOwnTopPadding()
262     {
263         return topPadding;
264     }
265
266     /**
267      * @deprecated Replaced by {@link #setTopPadding(Integer)}.
268      */

269     @Override
270     public void setTopPadding(int topPadding)
271     {
272         setTopPadding((Integer)topPadding);
273     }
274
275     @Override
276     public void setTopPadding(Integer topPadding)
277     {
278         Object old = this.topPadding;
279         this.topPadding = topPadding;
280         getEventSupport().firePropertyChange(PROPERTY_TOP_PADDING, old, this.topPadding);
281     }
282
283     @Override
284     public Integer getLeftPadding()
285     {
286         return getStyleResolver().getLeftPadding(this);
287     }
288
289     @Override
290     public Integer getOwnLeftPadding()
291     {
292         return leftPadding;
293     }
294
295     /**
296      * @deprecated Replaced by {@link #setLeftPadding(Integer)}.
297      */

298     @Override
299     public void setLeftPadding(int leftPadding)
300     {
301         setLeftPadding((Integer)leftPadding);
302     }
303
304     @Override
305     public void setLeftPadding(Integer leftPadding)
306     {
307         Object old = this.leftPadding;
308         this.leftPadding = leftPadding;
309         getEventSupport().firePropertyChange(PROPERTY_LEFT_PADDING, old, this.leftPadding);
310     }
311
312     @Override
313     public Integer getBottomPadding()
314     {
315         return getStyleResolver().getBottomPadding(this);
316     }
317
318     @Override
319     public Integer getOwnBottomPadding()
320     {
321         return bottomPadding;
322     }
323
324     /**
325      * @deprecated Replaced by {@link #setBottomPadding(Integer)}.
326      */

327     @Override
328     public void setBottomPadding(int bottomPadding)
329     {
330         setBottomPadding((Integer)bottomPadding);
331     }
332
333     @Override
334     public void setBottomPadding(Integer bottomPadding)
335     {
336         Object old = this.bottomPadding;
337         this.bottomPadding = bottomPadding;
338         getEventSupport().firePropertyChange(PROPERTY_BOTTOM_PADDING, old, this.bottomPadding);
339     }
340
341     @Override
342     public Integer getRightPadding()
343     {
344         return getStyleResolver().getRightPadding(this);
345     }
346
347     @Override
348     public Integer getOwnRightPadding()
349     {
350         return rightPadding;
351     }
352
353     /**
354      * @deprecated Replaced by {@link #setRightPadding(Integer)}.
355      */

356     @Override
357     public void setRightPadding(int rightPadding)
358     {
359         setRightPadding((Integer)rightPadding);
360     }
361
362     @Override
363     public void setRightPadding(Integer rightPadding)
364     {
365         Object old = this.rightPadding;
366         this.rightPadding = rightPadding;
367         getEventSupport().firePropertyChange(PROPERTY_RIGHT_PADDING, old, this.rightPadding);
368     }
369
370
371     @Override
372     public JRLineBox clone(JRBoxContainer boxContainer)
373     {
374         JRBaseLineBox clone = null;
375         
376         try
377         {
378             clone = (JRBaseLineBox)super.clone();
379         }
380         catch(CloneNotSupportedException e)
381         {
382             throw new JRRuntimeException(e);
383         }
384         
385         clone.boxContainer = boxContainer;
386         
387         clone.pen = pen.clone(clone);
388         clone.topPen = topPen.clone(clone);
389         clone.leftPen = leftPen.clone(clone);
390         clone.bottomPen = bottomPen.clone(clone);
391         clone.rightPen = rightPen.clone(clone);
392         
393         clone.eventSupport = null;
394
395         return clone;
396     }
397     
398     private transient JRPropertyChangeSupport eventSupport;
399     
400     @Override
401     public JRPropertyChangeSupport getEventSupport()
402     {
403         synchronized (this)
404         {
405             if (eventSupport == null)
406             {
407                 eventSupport = new JRPropertyChangeSupport(this);
408             }
409         }
410         
411         return eventSupport;
412     }
413
414
415     @Override
416     public int getHashCode()
417     {
418         ObjectUtils.HashCode hash = ObjectUtils.hash();
419         hash.addIdentical(pen);
420         hash.addIdentical(topPen);
421         hash.addIdentical(leftPen);
422         hash.addIdentical(bottomPen);
423         hash.addIdentical(rightPen);
424         hash.add(padding);
425         hash.add(topPadding);
426         hash.add(leftPadding);
427         hash.add(bottomPadding);
428         hash.add(rightPadding);
429         return hash.getHashCode();
430     }
431
432     @Override
433     public boolean isIdentical(Object object)
434     {
435         if (this == object)
436         {
437             return true;
438         }
439         
440         if (!(object instanceof JRBaseLineBox))
441         {
442             return false;
443         }
444         
445         JRBaseLineBox box = (JRBaseLineBox) object;
446
447         return 
448                 ObjectUtils.identical(pen, box.pen)
449                 && ObjectUtils.identical(topPen, box.topPen)
450                 && ObjectUtils.identical(leftPen, box.leftPen)
451                 && ObjectUtils.identical(bottomPen, box.bottomPen)
452                 && ObjectUtils.identical(rightPen, box.rightPen)
453                 && ObjectUtils.equals(padding, box.padding)
454                 && ObjectUtils.equals(topPadding, box.topPadding)
455                 && ObjectUtils.equals(leftPadding, box.leftPadding)
456                 && ObjectUtils.equals(bottomPadding, box.bottomPadding)
457                 && ObjectUtils.equals(rightPadding, box.rightPadding);
458     }
459
460 }
461