001    /* ===========================================================
002     * JFreeChart : a free chart library for the Java(tm) platform
003     * ===========================================================
004     *
005     * (C) Copyright 2000-2008, 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     * StandardXYSeriesLabelGenerator.java
029     * -----------------------------------
030     * (C) Copyright 2004-2008, by Object Refinery Limited.
031     *
032     * Original Author:  David Gilbert (for Object Refinery Limited);
033     * Contributor(s):   -;
034     *
035     * Changes
036     * -------
037     * 16-Nov-2004 : Version 1 (DG);
038     * ------------- JFREECHART 1.0.x ---------------------------------------------
039     * 24-Nov-2006 : Fixed equals() method and updated API docs (DG);
040     * 31-Mar-2008 : Added hashCode() method to appease FindBugs (DG);
041     *
042     */
043    
044    package org.jfree.chart.labels;
045    
046    import java.io.Serializable;
047    import java.text.MessageFormat;
048    
049    import org.jfree.chart.HashUtilities;
050    import org.jfree.data.xy.XYDataset;
051    import org.jfree.util.PublicCloneable;
052    
053    /**
054     * A standard series label generator for plots that use data from
055     * an {@link org.jfree.data.xy.XYDataset}.
056     * <br><br>
057     * This class implements <code>PublicCloneable</code> by mistake but we retain
058     * this for the sake of backward compatibility.
059     */
060    public class StandardXYSeriesLabelGenerator implements XYSeriesLabelGenerator,
061            Cloneable, PublicCloneable, Serializable {
062    
063        /** For serialization. */
064        private static final long serialVersionUID = 1916017081848400024L;
065    
066        /** The default item label format. */
067        public static final String DEFAULT_LABEL_FORMAT = "{0}";
068    
069        /** The format pattern. */
070        private String formatPattern;
071    
072        /**
073         * Creates a default series label generator (uses
074         * {@link #DEFAULT_LABEL_FORMAT}).
075         */
076        public StandardXYSeriesLabelGenerator() {
077            this(DEFAULT_LABEL_FORMAT);
078        }
079    
080        /**
081         * Creates a new series label generator.
082         *
083         * @param format  the format pattern (<code>null</code> not permitted).
084         */
085        public StandardXYSeriesLabelGenerator(String format) {
086            if (format == null) {
087                throw new IllegalArgumentException("Null 'format' argument.");
088            }
089            this.formatPattern = format;
090        }
091    
092        /**
093         * Generates a label for the specified series.  This label will be
094         * used for the chart legend.
095         *
096         * @param dataset  the dataset (<code>null</code> not permitted).
097         * @param series  the series.
098         *
099         * @return A series label.
100         */
101        public String generateLabel(XYDataset dataset, int series) {
102            if (dataset == null) {
103                throw new IllegalArgumentException("Null 'dataset' argument.");
104            }
105            String label = MessageFormat.format(
106                this.formatPattern, createItemArray(dataset, series)
107            );
108            return label;
109        }
110    
111        /**
112         * Creates the array of items that can be passed to the
113         * {@link MessageFormat} class for creating labels.
114         *
115         * @param dataset  the dataset (<code>null</code> not permitted).
116         * @param series  the series (zero-based index).
117         *
118         * @return The items (never <code>null</code>).
119         */
120        protected Object[] createItemArray(XYDataset dataset, int series) {
121            Object[] result = new Object[1];
122            result[0] = dataset.getSeriesKey(series).toString();
123            return result;
124        }
125    
126        /**
127         * Returns an independent copy of the generator.  This is unnecessary,
128         * because instances are immutable anyway, but we retain this
129         * behaviour for backwards compatibility.
130         *
131         * @return A clone.
132         *
133         * @throws CloneNotSupportedException if cloning is not supported.
134         */
135        public Object clone() throws CloneNotSupportedException {
136            return super.clone();
137        }
138    
139        /**
140         * Tests this object for equality with an arbitrary object.
141         *
142         * @param obj  the other object (<code>null</code> permitted).
143         *
144         * @return A boolean.
145         */
146        public boolean equals(Object obj) {
147            if (obj == this) {
148                return true;
149            }
150            if (!(obj instanceof StandardXYSeriesLabelGenerator)) {
151                return false;
152            }
153            StandardXYSeriesLabelGenerator that
154                    = (StandardXYSeriesLabelGenerator) obj;
155            if (!this.formatPattern.equals(that.formatPattern)) {
156                return false;
157            }
158            return true;
159        }
160    
161        /**
162         * Returns a hash code for this instance.
163         *
164         * @return A hash code.
165         */
166        public int hashCode() {
167            int result = 127;
168            result = HashUtilities.hashCode(result, this.formatPattern);
169            return result;
170        }
171    
172    }