/* ===========================================================
* JFreeChart : a free chart library for the Java(tm) platform
* ===========================================================
*
* (C) Copyright 2000-2013, by Object Refinery Limited and Contributors.
*
* Project Info: http://www.jfree.org/jfreechart/index.html
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
* [Oracle and Java are registered trademarks of Oracle and/or its affiliates.
* Other names may be trademarks of their respective owners.]
*
* ------------
* TextBox.java
* ------------
* (C) Copyright 2004-2013, by Object Refinery Limited and Contributors.
*
* Original Author: David Gilbert (for Object Refinery Limited);
* Contributor(s): -;
*
* Changes
* -------
* 09-Mar-2004 : Version 1 (DG);
* 22-Mar-2004 : Added equals() method and implemented Serializable (DG);
* 09-Nov-2004 : Renamed getAdjustedHeight() --> calculateExtendedHeight() in
* Spacer class (DG);
* 22-Feb-2005 : Replaced Spacer with RectangleInsets (DG);
* 14-Feb-2008 : Fixed alignment of text content with respect to insets (DG);
* 16-Jun-2012 : Moved from JCommon to JFreeChart (DG);
*
*/
package org.jfree.chart.text;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Stroke;
import java.awt.geom.Rectangle2D;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import org.jfree.chart.ui.RectangleAnchor;
import org.jfree.chart.ui.RectangleInsets;
import org.jfree.chart.ui.Size2D;
import org.jfree.chart.util.ObjectUtils;
import org.jfree.chart.util.SerialUtils;
/**
* A box containing a text block.
*/
public class TextBox implements Serializable {
/** For serialization. */
private static final long serialVersionUID = 3360220213180203706L;
/** The outline paint. */
private transient Paint outlinePaint;
/** The outline stroke. */
private transient Stroke outlineStroke;
/** The interior space. */
private RectangleInsets interiorGap;
/** The background paint. */
private transient Paint backgroundPaint;
/** The shadow paint. */
private transient Paint shadowPaint;
/** The shadow x-offset. */
private double shadowXOffset = 2.0;
/** The shadow y-offset. */
private double shadowYOffset = 2.0;
/** The text block. */
private TextBlock textBlock;
/**
* Creates an empty text box.
*/
public TextBox() {
this((TextBlock) null);
}
/**
* Creates a text box.
*
* @param text the text.
*/
public TextBox(String text) {
this((TextBlock) null);
if (text != null) {
this.textBlock = new TextBlock();
this.textBlock.addLine(text, new Font("SansSerif", Font.PLAIN, 10),
Color.BLACK);
}
}
/**
* Creates a new text box.
*
* @param block the text block.
*/
public TextBox(TextBlock block) {
this.outlinePaint = Color.BLACK;
this.outlineStroke = new BasicStroke(1.0f);
this.interiorGap = new RectangleInsets(1.0, 3.0, 1.0, 3.0);
this.backgroundPaint = new Color(255, 255, 192);
this.shadowPaint = Color.GRAY;
this.shadowXOffset = 2.0;
this.shadowYOffset = 2.0;
this.textBlock = block;
}
/**
* Returns the outline paint.
*
* @return The outline paint.
*/
public Paint getOutlinePaint() {
return this.outlinePaint;
}
/**
* Sets the outline paint.
*
* @param paint the paint.
*/
public void setOutlinePaint(Paint paint) {
this.outlinePaint = paint;
}
/**
* Returns the outline stroke.
*
* @return The outline stroke.
*/
public Stroke getOutlineStroke() {
return this.outlineStroke;
}
/**
* Sets the outline stroke.
*
* @param stroke the stroke.
*/
public void setOutlineStroke(Stroke stroke) {
this.outlineStroke = stroke;
}
/**
* Returns the interior gap.
*
* @return The interior gap.
*/
public RectangleInsets getInteriorGap() {
return this.interiorGap;
}
/**
* Sets the interior gap.
*
* @param gap the gap.
*/
public void setInteriorGap(RectangleInsets gap) {
this.interiorGap = gap;
}
/**
* Returns the background paint.
*
* @return The background paint.
*/
public Paint getBackgroundPaint() {
return this.backgroundPaint;
}
/**
* Sets the background paint.
*
* @param paint the paint.
*/
public void setBackgroundPaint(Paint paint) {
this.backgroundPaint = paint;
}
/**
* Returns the shadow paint.
*
* @return The shadow paint.
*/
public Paint getShadowPaint() {
return this.shadowPaint;
}
/**
* Sets the shadow paint.
*
* @param paint the paint.
*/
public void setShadowPaint(Paint paint) {
this.shadowPaint = paint;
}
/**
* Returns the x-offset for the shadow effect.
*
* @return The offset.
*/
public double getShadowXOffset() {
return this.shadowXOffset;
}
/**
* Sets the x-offset for the shadow effect.
*
* @param offset the offset (in Java2D units).
*/
public void setShadowXOffset(double offset) {
this.shadowXOffset = offset;
}
/**
* Returns the y-offset for the shadow effect.
*
* @return The offset.
*/
public double getShadowYOffset() {
return this.shadowYOffset;
}
/**
* Sets the y-offset for the shadow effect.
*
* @param offset the offset (in Java2D units).
*/
public void setShadowYOffset(double offset) {
this.shadowYOffset = offset;
}
/**
* Returns the text block.
*
* @return The text block.
*/
public TextBlock getTextBlock() {
return this.textBlock;
}
/**
* Sets the text block.
*
* @param block the block.
*/
public void setTextBlock(TextBlock block) {
this.textBlock = block;
}
/**
* Draws the text box.
*
* @param g2 the graphics device.
* @param x the x-coordinate.
* @param y the y-coordinate.
* @param anchor the anchor point.
*/
public void draw(Graphics2D g2, float x, float y, RectangleAnchor anchor) {
Size2D d1 = this.textBlock.calculateDimensions(g2);
double w = this.interiorGap.extendWidth(d1.getWidth());
double h = this.interiorGap.extendHeight(d1.getHeight());
Size2D d2 = new Size2D(w, h);
Rectangle2D bounds = RectangleAnchor.createRectangle(d2, x, y, anchor);
double xx = bounds.getX();
double yy = bounds.getY();
if (this.shadowPaint != null) {
Rectangle2D shadow = new Rectangle2D.Double(xx + this.shadowXOffset,
yy + this.shadowYOffset, bounds.getWidth(),
bounds.getHeight());
g2.setPaint(this.shadowPaint);
g2.fill(shadow);
}
if (this.backgroundPaint != null) {
g2.setPaint(this.backgroundPaint);
g2.fill(bounds);
}
if (this.outlinePaint != null && this.outlineStroke != null) {
g2.setPaint(this.outlinePaint);
g2.setStroke(this.outlineStroke);
g2.draw(bounds);
}
this.textBlock.draw(g2,
(float) (xx + this.interiorGap.calculateLeftInset(w)),
(float) (yy + this.interiorGap.calculateTopInset(h)),
TextBlockAnchor.TOP_LEFT);
}
/**
* Returns the height of the text box.
*
* @param g2 the graphics device.
*
* @return The height (in Java2D units).
*/
public double getHeight(Graphics2D g2) {
Size2D d = this.textBlock.calculateDimensions(g2);
return this.interiorGap.extendHeight(d.getHeight());
}
/**
* Tests this object for equality with an arbitrary object.
*
* @param obj the object to test against (<code>null</code> permitted).
*
* @return A boolean.
*/
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof TextBox)) {
return false;
}
TextBox that = (TextBox) obj;
if (!ObjectUtils.equal(this.outlinePaint, that.outlinePaint)) {
return false;
}
if (!ObjectUtils.equal(this.outlineStroke, that.outlineStroke)) {
return false;
}
if (!ObjectUtils.equal(this.interiorGap, that.interiorGap)) {
return false;
}
if (!ObjectUtils.equal(this.backgroundPaint,
that.backgroundPaint)) {
return false;
}
if (!ObjectUtils.equal(this.shadowPaint, that.shadowPaint)) {
return false;
}
if (this.shadowXOffset != that.shadowXOffset) {
return false;
}
if (this.shadowYOffset != that.shadowYOffset) {
return false;
}
if (!ObjectUtils.equal(this.textBlock, that.textBlock)) {
return false;
}
return true;
}
/**
* Returns a hash code for this object.
*
* @return A hash code.
*/
@Override
public int hashCode() {
int result;
long temp;
result = (this.outlinePaint != null ? this.outlinePaint.hashCode() : 0);
result = 29 * result + (this.outlineStroke != null
? this.outlineStroke.hashCode() : 0);
result = 29 * result + (this.interiorGap != null
? this.interiorGap.hashCode() : 0);
result = 29 * result + (this.backgroundPaint != null
? this.backgroundPaint.hashCode() : 0);
result = 29 * result + (this.shadowPaint != null
? this.shadowPaint.hashCode() : 0);
temp = this.shadowXOffset != +0.0d
? Double.doubleToLongBits(this.shadowXOffset) : 0L;
result = 29 * result + (int) (temp ^ (temp >>> 32));
temp = this.shadowYOffset != +0.0d
? Double.doubleToLongBits(this.shadowYOffset) : 0L;
result = 29 * result + (int) (temp ^ (temp >>> 32));
result = 29 * result + (this.textBlock != null
? this.textBlock.hashCode() : 0);
return result;
}
/**
* Provides serialization support.
*
* @param stream the output stream.
*
* @throws IOException if there is an I/O error.
*/
private void writeObject(ObjectOutputStream stream) throws IOException {
stream.defaultWriteObject();
SerialUtils.writePaint(this.outlinePaint, stream);
SerialUtils.writeStroke(this.outlineStroke, stream);
SerialUtils.writePaint(this.backgroundPaint, stream);
SerialUtils.writePaint(this.shadowPaint, stream);
}
/**
* Provides serialization support.
*
* @param stream the input stream.
*
* @throws IOException if there is an I/O error.
* @throws ClassNotFoundException if there is a classpath problem.
*/
private void readObject(ObjectInputStream stream) throws IOException,
ClassNotFoundException {
stream.defaultReadObject();
this.outlinePaint = SerialUtils.readPaint(stream);
this.outlineStroke = SerialUtils.readStroke(stream);
this.backgroundPaint = SerialUtils.readPaint(stream);
this.shadowPaint = SerialUtils.readPaint(stream);
}
}