    001    /* ===========================================================
    002     * JFreeChart : a free chart library for the Java(tm) platform
    003     * ===========================================================
    004     *
    005     * (C) Copyright 2000-2006, by Object Refinery Limited and Contributors.
    006     *
    007     * Project Info:  http://www.jfree.org/jfreechart/index.html
    008     *
    009     * This library is free software; you can redistribute it and/or modify it
    010     * under the terms of the GNU Lesser General Public License as published by
    011     * the Free Software Foundation; either version 2.1 of the License, or
    012     * (at your option) any later version.
    013     *
    014     * This library is distributed in the hope that it will be useful, but
    015     * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
    016     * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
    017     * License for more details.
    018     *
    019     * You should have received a copy of the GNU Lesser General Public
    020     * License along with this library; if not, write to the Free Software
    021     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
    022     * USA.
    023     *
    024     * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
    025     * in the United States and other countries.]
    026     *
    027     * ---------------
    028     * LegendItem.java
    029     * ---------------
    030     * (C) Copyright 2000-2006, by Object Refinery Limited and Contributors.
    031     *
    032     * Original Author:  David Gilbert (for Object Refinery Limited);
    033     * Contributor(s):   Andrzej Porebski;
    034     *                   David Li;
    035     *                   Wolfgang Irler;
    036     *                   Luke Quinane;
    037     *
    038     * $Id: LegendItem.java,v 1.9.2.6 2006/12/13 11:23:38 mungady Exp $
    039     *
    040     * Changes (from 2-Oct-2002)
    041     * -------------------------
    042     * 02-Oct-2002 : Fixed errors reported by Checkstyle (DG);
    043     * 17-Jan-2003 : Dropped outlineStroke attribute (DG);
    044     * 08-Oct-2003 : Applied patch for displaying series line style, contributed by
    045     *               Luke Quinane (DG);
    046     * 21-Jan-2004 : Added the shapeFilled flag (DG);
    047     * 04-Jun-2004 : Added equals() method, implemented Serializable (DG);
    048     * 25-Nov-2004 : Changes required by new LegendTitle implementation (DG);
    049     * 11-Jan-2005 : Removed deprecated code in preparation for the 1.0.0
    050     *               release (DG);
    051     * 20-Apr-2005 : Added tooltip and URL text (DG);
    052     * 28-Nov-2005 : Separated constructors for AttributedString labels (DG);
    053     * 10-Dec-2005 : Fixed serialization bug (1377239) (DG);
    054     * ------------- JFREECHART 1.0.x ---------------------------------------------
    055     * 20-Jul-2006 : Added dataset and series index fields (DG);
    056     * 13-Dec-2006 : Added fillPaintTransformer attribute (DG);
    057     *
    058     */
    059
    060    package org.jfree.chart;
    061
    062    import java.awt.BasicStroke;
    063    import java.awt.Color;
    064    import java.awt.Paint;
    065    import java.awt.Shape;
    066    import java.awt.Stroke;
    067    import java.awt.geom.Line2D;
    068    import java.io.IOException;
    069    import java.io.ObjectInputStream;
    070    import java.io.ObjectOutputStream;
    071    import java.io.Serializable;
    072    import java.text.AttributedString;
    073    import java.text.CharacterIterator;
    074
    075    import org.jfree.io.SerialUtilities;
    076    import org.jfree.ui.GradientPaintTransformer;
    077    import org.jfree.ui.StandardGradientPaintTransformer;
    078    import org.jfree.util.AttributedStringUtilities;
    079    import org.jfree.util.ObjectUtilities;
    080    import org.jfree.util.ShapeUtilities;
    081
    082    /**
    083     * A temporary storage object for recording the properties of a legend item,
    084     * without any consideration for layout issues.
    085     */
    086    public class LegendItem implements Serializable {
    087
    088        /** For serialization. */
    089        private static final long serialVersionUID = -797214582948827144L;
    090
    091        /** The dataset index. */
    092        private int datasetIndex;
    093
    094        /** The series index. */
    095        private int series;
    096
    097        /** The label. */
    098        private String label;
    099
    100        /** The attributed label (if null, fall back to the regular label). */
    101        private transient AttributedString attributedLabel;
    102
    103        /**
    104         * The description (not currently used - could be displayed as a tool tip).
    105         */
    106        private String description;
    107
    108        /** The tool tip text. */
    109        private String toolTipText;
    110
    111        /** The url text. */
    112        private String urlText;
    113
    114        /** A flag that controls whether or not the shape is visible. */
    115        private boolean shapeVisible;
    116
    117        /** The shape. */
    118        private transient Shape shape;
    119
    120        /** A flag that controls whether or not the shape is filled. */
    121        private boolean shapeFilled;
    122
    123        /** The paint. */
    124        private transient Paint fillPaint;
    125
    126        /**
    127         * A gradient paint transformer.
    128         *
    129         * @since 1.0.4
    130         */
    131        private GradientPaintTransformer fillPaintTransformer;
    132
    133        /** A flag that controls whether or not the shape outline is visible. */
    134        private boolean shapeOutlineVisible;
    135
    136        /** The outline paint. */
    137        private transient Paint outlinePaint;
    138
    139        /** The outline stroke. */
    140        private transient Stroke outlineStroke;
    141
    142        /** A flag that controls whether or not the line is visible. */
    143        private boolean lineVisible;
    144
    145        /** The line. */
    146        private transient Shape line;
    147
    148        /** The stroke. */
    149        private transient Stroke lineStroke;
    150
    151        /** The line paint. */
    152        private transient Paint linePaint;
    153
    154        /**
    155         * The shape must be non-null for a LegendItem - if no shape is required,
    156         * use this.
    157         */
    158        private static final Shape UNUSED_SHAPE = new Line2D.Float();
    159
    160        /**
    161         * The stroke must be non-null for a LegendItem - if no stroke is required,
    162         * use this.
    163         */
    164        private static final Stroke UNUSED_STROKE = new BasicStroke(0.0f);
    165
    166        /**
    167         * Creates a legend item with a filled shape.  The shape is not outlined,
    168         * and no line is visible.
    169         *
    170         * @param label  the label (<code>null</code> not permitted).
    171         * @param description  the description (<code>null</code> permitted).
    172         * @param toolTipText  the tool tip text (<code>null</code> permitted).
    173         * @param urlText  the URL text (<code>null</code> permitted).
    174         * @param shape  the shape (<code>null</code> not permitted).
    175         * @param fillPaint  the paint used to fill the shape (<code>null</code>
    176         *                   not permitted).
    177         */
    178        public LegendItem(String label, String description,
    179                          String toolTipText, String urlText,
    180                          Shape shape, Paint fillPaint) {
    181
    182            this(label, description, toolTipText, urlText,
    183                    /* shape visible = */ true, shape,
    184                    /* shape filled = */ true, fillPaint,
    185                    /* shape outlined */ false, Color.black, UNUSED_STROKE,
    186                    /* line visible */ false, UNUSED_SHAPE, UNUSED_STROKE,
    187                    Color.black);
    188
    189        }
    190
    191        /**
    192         * Creates a legend item with a filled and outlined shape.
    193         *
    194         * @param label  the label (<code>null</code> not permitted).
    195         * @param description  the description (<code>null</code> permitted).
    196         * @param toolTipText  the tool tip text (<code>null</code> permitted).
    197         * @param urlText  the URL text (<code>null</code> permitted).
    198         * @param shape  the shape (<code>null</code> not permitted).
    199         * @param fillPaint  the paint used to fill the shape (<code>null</code>
    200         *                   not permitted).
    201         * @param outlineStroke  the outline stroke (<code>null</code> not
    202         *                       permitted).
    203         * @param outlinePaint  the outline paint (<code>null</code> not
    204         *                      permitted).
    205         */
    206        public LegendItem(String label, String description,
    207                          String toolTipText, String urlText,
    208                          Shape shape, Paint fillPaint,
    209                          Stroke outlineStroke, Paint outlinePaint) {
    210
    211            this(label, description, toolTipText, urlText,
    212                    /* shape visible = */ true, shape,
    213                    /* shape filled = */ true, fillPaint,
    214                    /* shape outlined = */ true, outlinePaint, outlineStroke,
    215                    /* line visible */ false, UNUSED_SHAPE, UNUSED_STROKE,
    216                    Color.black);
    217
    218        }
    219
    220        /**
    221         * Creates a legend item using a line.
    222         *
    223         * @param label  the label (<code>null</code> not permitted).
    224         * @param description  the description (<code>null</code> permitted).
    225         * @param toolTipText  the tool tip text (<code>null</code> permitted).
    226         * @param urlText  the URL text (<code>null</code> permitted).
    227         * @param line  the line (<code>null</code> not permitted).
    228         * @param lineStroke  the line stroke (<code>null</code> not permitted).
    229         * @param linePaint  the line paint (<code>null</code> not permitted).
    230         */
    231        public LegendItem(String label, String description,
    232                          String toolTipText, String urlText,
    233                          Shape line, Stroke lineStroke, Paint linePaint) {
    234
    235            this(label, description, toolTipText, urlText,
    236                    /* shape visible = */ false, UNUSED_SHAPE,
    237                    /* shape filled = */ false, Color.black,
    238                    /* shape outlined = */ false, Color.black, UNUSED_STROKE,
    239                    /* line visible = */ true, line, lineStroke, linePaint);
    240        }
    241
    242        /**
    243         * Creates a new legend item.
    244         *
    245         * @param label  the label (<code>null</code> not permitted).
    246         * @param description  the description (not currently used,
    247         *        <code>null</code> permitted).
    248         * @param toolTipText  the tool tip text (<code>null</code> permitted).
    249         * @param urlText  the URL text (<code>null</code> permitted).
    250         * @param shapeVisible  a flag that controls whether or not the shape is
    251         *                      displayed.
    252         * @param shape  the shape (<code>null</code> permitted).
    253         * @param shapeFilled  a flag that controls whether or not the shape is
    254         *                     filled.
    255         * @param fillPaint  the fill paint (<code>null</code> not permitted).
    256         * @param shapeOutlineVisible  a flag that controls whether or not the
    257         *                             shape is outlined.
    258         * @param outlinePaint  the outline paint (<code>null</code> not permitted).
    259         * @param outlineStroke  the outline stroke (<code>null</code> not
    260         *                       permitted).
    261         * @param lineVisible  a flag that controls whether or not the line is
    262         *                     visible.
    263         * @param line  the line.
    264         * @param lineStroke  the stroke (<code>null</code> not permitted).
    265         * @param linePaint  the line paint (<code>null</code> not permitted).
    266         */
    267        public LegendItem(String label, String description,
    268                          String toolTipText, String urlText,
    269                          boolean shapeVisible, Shape shape,
    270                          boolean shapeFilled, Paint fillPaint,
    271                          boolean shapeOutlineVisible, Paint outlinePaint,
    272                          Stroke outlineStroke,
    273                          boolean lineVisible, Shape line,
    274                          Stroke lineStroke, Paint linePaint) {
    275
    276            if (label == null) {
    277                throw new IllegalArgumentException("Null 'label' argument.");
    278            }
    279            if (fillPaint == null) {
    280                throw new IllegalArgumentException("Null 'fillPaint' argument.");
    281            }
    282            if (lineStroke == null) {
    283                throw new IllegalArgumentException("Null 'lineStroke' argument.");
    284            }
    285            if (outlinePaint == null) {
    286                throw new IllegalArgumentException("Null 'outlinePaint' argument.");
    287            }
    288            if (outlineStroke == null) {
    289                throw new IllegalArgumentException(
    290                        "Null 'outlineStroke' argument.");
    291            }
    292            this.label = label;
    293            this.attributedLabel = null;
    294            this.description = description;
    295            this.shapeVisible = shapeVisible;
    296            this.shape = shape;
    297            this.shapeFilled = shapeFilled;
    298            this.fillPaint = fillPaint;
    299            this.fillPaintTransformer = new StandardGradientPaintTransformer();
    300            this.shapeOutlineVisible = shapeOutlineVisible;
    301            this.outlinePaint = outlinePaint;
    302            this.outlineStroke = outlineStroke;
    303            this.lineVisible = lineVisible;
    304            this.line = line;
    305            this.lineStroke = lineStroke;
    306            this.linePaint = linePaint;
    307            this.toolTipText = toolTipText;
    308            this.urlText = urlText;
    309        }
    310
    311        /**
    312         * Creates a legend item with a filled shape.  The shape is not outlined,
    313         * and no line is visible.
    314         *
    315         * @param label  the label (<code>null</code> not permitted).
    316         * @param description  the description (<code>null</code> permitted).
    317         * @param toolTipText  the tool tip text (<code>null</code> permitted).
    318         * @param urlText  the URL text (<code>null</code> permitted).
    319         * @param shape  the shape (<code>null</code> not permitted).
    320         * @param fillPaint  the paint used to fill the shape (<code>null</code>
    321         *                   not permitted).
    322         */
    323        public LegendItem(AttributedString label, String description,
    324                          String toolTipText, String urlText,
    325                          Shape shape, Paint fillPaint) {
    326
    327            this(label, description, toolTipText, urlText,
    328                    /* shape visible = */ true, shape,
    329                    /* shape filled = */ true, fillPaint,
    330                    /* shape outlined = */ false, Color.black, UNUSED_STROKE,
    331                    /* line visible = */ false, UNUSED_SHAPE, UNUSED_STROKE,
    332                    Color.black);
    333
    334        }
    335
    336        /**
    337         * Creates a legend item with a filled and outlined shape.
    338         *
    339         * @param label  the label (<code>null</code> not permitted).
    340         * @param description  the description (<code>null</code> permitted).
    341         * @param toolTipText  the tool tip text (<code>null</code> permitted).
    342         * @param urlText  the URL text (<code>null</code> permitted).
    343         * @param shape  the shape (<code>null</code> not permitted).
    344         * @param fillPaint  the paint used to fill the shape (<code>null</code>
    345         *                   not permitted).
    346         * @param outlineStroke  the outline stroke (<code>null</code> not
    347         *                       permitted).
    348         * @param outlinePaint  the outline paint (<code>null</code> not
    349         *                      permitted).
    350         */
    351        public LegendItem(AttributedString label, String description,
    352                          String toolTipText, String urlText,
    353                          Shape shape, Paint fillPaint,
    354                          Stroke outlineStroke, Paint outlinePaint) {
    355
    356            this(label, description, toolTipText, urlText,
    357                    /* shape visible = */ true, shape,
    358                    /* shape filled = */ true, fillPaint,
    359                    /* shape outlined = */ true, outlinePaint, outlineStroke,
    360                    /* line visible = */ false, UNUSED_SHAPE, UNUSED_STROKE,
    361                    Color.black);
    362        }
    363
    364        /**
    365         * Creates a legend item using a line.
    366         *
    367         * @param label  the label (<code>null</code> not permitted).
    368         * @param description  the description (<code>null</code> permitted).
    369         * @param toolTipText  the tool tip text (<code>null</code> permitted).
    370         * @param urlText  the URL text (<code>null</code> permitted).
    371         * @param line  the line (<code>null</code> not permitted).
    372         * @param lineStroke  the line stroke (<code>null</code> not permitted).
    373         * @param linePaint  the line paint (<code>null</code> not permitted).
    374         */
    375        public LegendItem(AttributedString label, String description,
    376                          String toolTipText, String urlText,
    377                          Shape line, Stroke lineStroke, Paint linePaint) {
    378
    379            this(label, description, toolTipText, urlText,
    380                    /* shape visible = */ false, UNUSED_SHAPE,
    381                    /* shape filled = */ false, Color.black,
    382                    /* shape outlined = */ false, Color.black, UNUSED_STROKE,
    383                    /* line visible = */ true, line, lineStroke, linePaint
    384            );
    385        }
    386
    387        /**
    388         * Creates a new legend item.
    389         *
    390         * @param label  the label (<code>null</code> not permitted).
    391         * @param description  the description (not currently used,
    392         *        <code>null</code> permitted).
    393         * @param toolTipText  the tool tip text (<code>null</code> permitted).
    394         * @param urlText  the URL text (<code>null</code> permitted).
    395         * @param shapeVisible  a flag that controls whether or not the shape is
    396         *                      displayed.
    397         * @param shape  the shape (<code>null</code> permitted).
    398         * @param shapeFilled  a flag that controls whether or not the shape is
    399         *                     filled.
    400         * @param fillPaint  the fill paint (<code>null</code> not permitted).
    401         * @param shapeOutlineVisible  a flag that controls whether or not the
    402         *                             shape is outlined.
    403         * @param outlinePaint  the outline paint (<code>null</code> not permitted).
    404         * @param outlineStroke  the outline stroke (<code>null</code> not
    405         *                       permitted).
    406         * @param lineVisible  a flag that controls whether or not the line is
    407         *                     visible.
    408         * @param line  the line.
    409         * @param lineStroke  the stroke (<code>null</code> not permitted).
    410         * @param linePaint  the line paint (<code>null</code> not permitted).
    411         */
    412        public LegendItem(AttributedString label, String description,
    413                          String toolTipText, String urlText,
    414                          boolean shapeVisible, Shape shape,
    415                          boolean shapeFilled, Paint fillPaint,
    416                          boolean shapeOutlineVisible, Paint outlinePaint,
    417                          Stroke outlineStroke,
    418                          boolean lineVisible, Shape line, Stroke lineStroke,
    419                          Paint linePaint) {
    420
    421            if (label == null) {
    422                throw new IllegalArgumentException("Null 'label' argument.");
    423            }
    424            if (fillPaint == null) {
    425                throw new IllegalArgumentException("Null 'fillPaint' argument.");
    426            }
    427            if (lineStroke == null) {
    428                throw new IllegalArgumentException("Null 'lineStroke' argument.");
    429            }
    430            if (outlinePaint == null) {
    431                throw new IllegalArgumentException("Null 'outlinePaint' argument.");
    432            }
    433            if (outlineStroke == null) {
    434                throw new IllegalArgumentException(
    435                    "Null 'outlineStroke' argument.");
    436            }
    437            this.label = characterIteratorToString(label.getIterator());
    438            this.attributedLabel = label;
    439            this.description = description;
    440            this.shapeVisible = shapeVisible;
    441            this.shape = shape;
    442            this.shapeFilled = shapeFilled;
    443            this.fillPaint = fillPaint;
    444            this.shapeOutlineVisible = shapeOutlineVisible;
    445            this.outlinePaint = outlinePaint;
    446            this.outlineStroke = outlineStroke;
    447            this.lineVisible = lineVisible;
    448            this.line = line;
    449            this.lineStroke = lineStroke;
    450            this.linePaint = linePaint;
    451            this.toolTipText = toolTipText;
    452            this.urlText = urlText;
    453        }
    454
    455        /**
    456         * Returns a string containing the characters from the given iterator.
    457         *
    458         * @param iterator  the iterator (<code>null</code> not permitted).
    459         *
    460         * @return A string.
    461         */
    462        private String characterIteratorToString(CharacterIterator iterator) {
    463            int endIndex = iterator.getEndIndex();
    464            int beginIndex = iterator.getBeginIndex();
    465            int count = endIndex - beginIndex;
    466            if (count <= 0) {
    467                return "";
    468            }
    469            char[] chars = new char[count];
    470            int i = 0;
    471            char c = iterator.first();
    472            while (c != CharacterIterator.DONE) {
    473                chars[i] = c;
    474                i++;
    475                c = iterator.next();
    476            }
    477            return new String(chars);
    478        }
    479
    480        /**
    481         * Returns the dataset index for this legend item.
    482         *
    483         * @return The dataset index.
    484         *
    485         * @since 1.0.2
    486         */
    487        public int getDatasetIndex() {
    488            return this.datasetIndex;
    489        }
    490
    491        /**
    492         * Sets the dataset index for this legend item.
    493         *
    494         * @param index  the index.
    495         *
    496         * @since 1.0.2
    497         */
    498        public void setDatasetIndex(int index) {
    499            this.datasetIndex = index;
    500        }
    501
    502        /**
    503         * Returns the series index for this legend item.
    504         *
    505         * @return The series index.
    506         *
    507         * @since 1.0.2
    508         */
    509        public int getSeriesIndex() {
    510            return this.series;
    511        }
    512
    513        /**
    514         * Sets the series index for this legend item.
    515         *
    516         * @param index  the index.
    517         *
    518         * @since 1.0.2
    519         */
    520        public void setSeriesIndex(int index) {
    521            this.series = index;
    522        }
    523
    524        /**
    525         * Returns the label.
    526         *
    527         * @return The label (never <code>null</code>).
    528         */
    529        public String getLabel() {
    530            return this.label;
    531        }
    532
    533        /**
    534         * Returns the attributed label.
    535         *
    536         * @return The attributed label (possibly <code>null</code>).
    537         */
    538        public AttributedString getAttributedLabel() {
    539            return this.attributedLabel;
    540        }
    541
    542        /**
    543         * Returns the description for the legend item.
    544         *
    545         * @return The description.
    546         */
    547        public String getDescription() {
    548            return this.description;
    549        }
    550
    551        /**
    552         * Returns the tool tip text.
    553         *
    554         * @return The tool tip text (possibly <code>null</code>).
    555         */
    556        public String getToolTipText() {
    557            return this.toolTipText;
    558        }
    559
    560        /**
    561         * Returns the URL text.
    562         *
    563         * @return The URL text (possibly <code>null</code>).
    564         */
    565        public String getURLText() {
    566            return this.urlText;
    567        }
    568
    569        /**
    570         * Returns a flag that indicates whether or not the shape is visible.
    571         *
    572         * @return A boolean.
    573         */
    574        public boolean isShapeVisible() {
    575            return this.shapeVisible;
    576        }
    577
    578        /**
    579         * Returns the shape used to label the series represented by this legend
    580         * item.
    581         *
    582         * @return The shape (never <code>null</code>).
    583         */
    584        public Shape getShape() {
    585            return this.shape;
    586        }
    587
    588        /**
    589         * Returns a flag that controls whether or not the shape is filled.
    590         *
    591         * @return A boolean.
    592         */
    593        public boolean isShapeFilled() {
    594            return this.shapeFilled;
    595        }
    596
    597        /**
    598         * Returns the fill paint.
    599         *
    600         * @return The fill paint (never <code>null</code>).
    601         */
    602        public Paint getFillPaint() {
    603            return this.fillPaint;
    604        }
    605
    606        /**
    607         * Returns the flag that controls whether or not the shape outline
    608         * is visible.
    609         *
    610         * @return A boolean.
    611         */
    612        public boolean isShapeOutlineVisible() {
    613            return this.shapeOutlineVisible;
    614        }
    615
    616        /**
    617         * Returns the line stroke for the series.
    618         *
    619         * @return The stroke (never <code>null</code>).
    620         */
    621        public Stroke getLineStroke() {
    622            return this.lineStroke;
    623        }
    624
    625        /**
    626         * Returns the paint used for lines.
    627         *
    628         * @return The paint.
    629         */
    630        public Paint getLinePaint() {
    631            return this.linePaint;
    632        }
    633
    634        /**
    635         * Returns the outline paint.
    636         *
    637         * @return The outline paint (never <code>null</code>).
    638         */
    639        public Paint getOutlinePaint() {
    640            return this.outlinePaint;
    641        }
    642
    643        /**
    644         * Returns the outline stroke.
    645         *
    646         * @return The outline stroke (never <code>null</code>).
    647         */
    648        public Stroke getOutlineStroke() {
    649            return this.outlineStroke;
    650        }
    651
    652        /**
    653         * Returns a flag that indicates whether or not the line is visible.
    654         *
    655         * @return A boolean.
    656         */
    657        public boolean isLineVisible() {
    658            return this.lineVisible;
    659        }
    660
    661        /**
    662         * Returns the line.
    663         *
    664         * @return The line.
    665         */
    666        public Shape getLine() {
    667            return this.line;
    668        }
    669
    670        /**
    671         * Returns the transformer used when the fill paint is an instance of
    672         * <code>GradientPaint</code>.
    673         *
    674         * @return The transformer (never <code>null</code>).
    675         *
    676         * @since 1.0.4
    677         *
    678         * @see #setFillPaintTransformer(GradientPaintTransformer)
    679         */
    680        public GradientPaintTransformer getFillPaintTransformer() {
    681            return this.fillPaintTransformer;
    682        }
    683
    684        /**
    685         * Sets the transformer used when the fill paint is an instance of
    686         * <code>GradientPaint</code>.
    687         *
    688         * @param transformer  the transformer (<code>null</code> not permitted).
    689         *
    690         * @since 1.0.4
    691         *
    692         * @see #getFillPaintTransformer()
    693         */
    694        public void setFillPaintTransformer(GradientPaintTransformer transformer) {
    695            if (transformer == null) {
    696                throw new IllegalArgumentException("Null 'transformer' attribute.");
    697            }
    698            this.fillPaintTransformer = transformer;
    699        }
    700
    701        /**
    702         * Tests this item for equality with an arbitrary object.
    703         *
    704         * @param obj  the object (<code>null</code> permitted).
    705         *
    706         * @return A boolean.
    707         */
    708        public boolean equals(Object obj) {
    709            if (obj == this) {
    710                return true;
    711            }
    712            if (!(obj instanceof LegendItem)) {
    713                    return false;
    714            }
    715            LegendItem that = (LegendItem) obj;
    716            if (this.datasetIndex != that.datasetIndex) {
    717                return false;
    718            }
    719            if (this.series != that.series) {
    720                return false;
    721            }
    722            if (!this.label.equals(that.label)) {
    723                return false;
    724            }
    725            if (!AttributedStringUtilities.equal(this.attributedLabel,
    726                    that.attributedLabel)) {
    727                return false;
    728            }
    729            if (!ObjectUtilities.equal(this.description, that.description)) {
    730                return false;
    731            }
    732            if (this.shapeVisible != that.shapeVisible) {
    733                return false;
    734            }
    735            if (!ShapeUtilities.equal(this.shape, that.shape)) {
    736                return false;
    737            }
    738            if (this.shapeFilled != that.shapeFilled) {
    739                return false;
    740            }
    741            if (!this.fillPaint.equals(that.fillPaint)) {
    742                return false;
    743            }
    744            if (!ObjectUtilities.equal(this.fillPaintTransformer,
    745                    that.fillPaintTransformer)) {
    746                return false;
    747            }
    748            if (this.shapeOutlineVisible != that.shapeOutlineVisible) {
    749                return false;
    750            }
    751            if (!this.outlineStroke.equals(that.outlineStroke)) {
    752                return false;
    753            }
    754            if (!this.outlinePaint.equals(that.outlinePaint)) {
    755                return false;
    756            }
    757            if (!this.lineVisible == that.lineVisible) {
    758                return false;
    759            }
    760            if (!ShapeUtilities.equal(this.line, that.line)) {
    761                return false;
    762            }
    763            if (!this.lineStroke.equals(that.lineStroke)) {
    764                return false;
    765            }
    766            if (!this.linePaint.equals(that.linePaint)) {
    767                return false;
    768            }
    769            return true;
    770        }
    771
    772        /**
    773         * Provides serialization support.
    774         *
    775         * @param stream  the output stream (<code>null</code> not permitted).
    776         *
    777         * @throws IOException  if there is an I/O error.
    778         */
    779        private void writeObject(ObjectOutputStream stream) throws IOException {
    780            stream.defaultWriteObject();
    781            SerialUtilities.writeAttributedString(this.attributedLabel, stream);
    782            SerialUtilities.writeShape(this.shape, stream);
    783            SerialUtilities.writePaint(this.fillPaint, stream);
    784            SerialUtilities.writeStroke(this.outlineStroke, stream);
    785            SerialUtilities.writePaint(this.outlinePaint, stream);
    786            SerialUtilities.writeShape(this.line, stream);
    787            SerialUtilities.writeStroke(this.lineStroke, stream);
    788            SerialUtilities.writePaint(this.linePaint, stream);
    789        }
    790
    791        /**
    792         * Provides serialization support.
    793         *
    794         * @param stream  the input stream (<code>null</code> not permitted).
    795         *
    796         * @throws IOException  if there is an I/O error.
    797         * @throws ClassNotFoundException  if there is a classpath problem.
    798         */
    799        private void readObject(ObjectInputStream stream)
    800            throws IOException, ClassNotFoundException {
    801            stream.defaultReadObject();
    802            this.attributedLabel = SerialUtilities.readAttributedString(stream);
    803            this.shape = SerialUtilities.readShape(stream);
    804            this.fillPaint = SerialUtilities.readPaint(stream);
    805            this.outlineStroke = SerialUtilities.readStroke(stream);
    806            this.outlinePaint = SerialUtilities.readPaint(stream);
    807            this.line = SerialUtilities.readShape(stream);
    808            this.lineStroke = SerialUtilities.readStroke(stream);
    809            this.linePaint = SerialUtilities.readPaint(stream);
    810        }
    811
    812    }