Frames | No Frames |
1: /* =========================================================== 2: * JFreeChart : a free chart library for the Java(tm) platform 3: * =========================================================== 4: * 5: * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors. 6: * 7: * Project Info: http://www.jfree.org/jfreechart/index.html 8: * 9: * This library is free software; you can redistribute it and/or modify it 10: * under the terms of the GNU Lesser General Public License as published by 11: * the Free Software Foundation; either version 2.1 of the License, or 12: * (at your option) any later version. 13: * 14: * This library is distributed in the hope that it will be useful, but 15: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 16: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 17: * License for more details. 18: * 19: * You should have received a copy of the GNU Lesser General Public 20: * License along with this library; if not, write to the Free Software 21: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 22: * USA. 23: * 24: * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 25: * in the United States and other countries.] 26: * 27: * ----------------------------------- 28: * MultipleXYSeriesLabelGenerator.java 29: * ----------------------------------- 30: * (C) Copyright 2004, 2005, 2007, by Object Refinery Limited. 31: * 32: * Original Author: David Gilbert (for Object Refinery Limited); 33: * Contributor(s): -; 34: * 35: * $Id: MultipleXYSeriesLabelGenerator.java,v 1.5.2.2 2007/02/20 15:32:06 mungady Exp $ 36: * 37: * Changes 38: * ------- 39: * 19-Nov-2004 : Version 1 (DG); 40: * 18-Apr-2005 : Use StringBuffer (DG); 41: * 20-Feb-2007 : Fixed for equals() and cloning() (DG); 42: * 43: */ 44: 45: package org.jfree.chart.labels; 46: 47: import java.io.Serializable; 48: import java.text.MessageFormat; 49: import java.util.HashMap; 50: import java.util.Iterator; 51: import java.util.List; 52: import java.util.Map; 53: import java.util.Set; 54: 55: import org.jfree.data.xy.XYDataset; 56: import org.jfree.util.PublicCloneable; 57: 58: /** 59: * A series label generator for plots that use data from 60: * an {@link org.jfree.data.xy.XYDataset}. 61: */ 62: public class MultipleXYSeriesLabelGenerator implements XYSeriesLabelGenerator, 63: Cloneable, PublicCloneable, Serializable { 64: 65: /** For serialization. */ 66: private static final long serialVersionUID = 138976236941898560L; 67: 68: /** The default item label format. */ 69: public static final String DEFAULT_LABEL_FORMAT = "{0}"; 70: 71: /** The format pattern for the initial part of the label. */ 72: private String formatPattern; 73: 74: /** The format pattern for additional labels. */ 75: private String additionalFormatPattern; 76: 77: /** Storage for the additional series labels. */ 78: private Map seriesLabelLists; 79: 80: /** 81: * Creates an item label generator using default number formatters. 82: */ 83: public MultipleXYSeriesLabelGenerator() { 84: this(DEFAULT_LABEL_FORMAT); 85: } 86: 87: /** 88: * Creates a new series label generator. 89: * 90: * @param format the format pattern (<code>null</code> not permitted). 91: */ 92: public MultipleXYSeriesLabelGenerator(String format) { 93: if (format == null) { 94: throw new IllegalArgumentException("Null 'format' argument."); 95: } 96: this.formatPattern = format; 97: this.additionalFormatPattern = "\n{0}"; 98: this.seriesLabelLists = new HashMap(); 99: } 100: 101: /** 102: * Adds an extra label for the specified series. 103: * 104: * @param series the series index. 105: * @param label the label. 106: */ 107: public void addSeriesLabel(int series, String label) { 108: Integer key = new Integer(series); 109: List labelList = (List) this.seriesLabelLists.get(key); 110: if (labelList == null) { 111: labelList = new java.util.ArrayList(); 112: this.seriesLabelLists.put(key, labelList); 113: } 114: labelList.add(label); 115: } 116: 117: /** 118: * Clears the extra labels for the specified series. 119: * 120: * @param series the series index. 121: */ 122: public void clearSeriesLabels(int series) { 123: Integer key = new Integer(series); 124: this.seriesLabelLists.put(key, null); 125: } 126: 127: /** 128: * Generates a label for the specified series. This label will be 129: * used for the chart legend. 130: * 131: * @param dataset the dataset (<code>null</code> not permitted). 132: * @param series the series. 133: * 134: * @return A series label. 135: */ 136: public String generateLabel(XYDataset dataset, int series) { 137: if (dataset == null) { 138: throw new IllegalArgumentException("Null 'dataset' argument."); 139: } 140: StringBuffer label = new StringBuffer(); 141: label.append(MessageFormat.format(this.formatPattern, 142: createItemArray(dataset, series))); 143: Integer key = new Integer(series); 144: List extraLabels = (List) this.seriesLabelLists.get(key); 145: if (extraLabels != null) { 146: Object[] temp = new Object[1]; 147: for (int i = 0; i < extraLabels.size(); i++) { 148: temp[0] = extraLabels.get(i); 149: String labelAddition = MessageFormat.format( 150: this.additionalFormatPattern, temp); 151: label.append(labelAddition); 152: } 153: } 154: return label.toString(); 155: } 156: 157: /** 158: * Creates the array of items that can be passed to the 159: * {@link MessageFormat} class for creating labels. 160: * 161: * @param dataset the dataset (<code>null</code> not permitted). 162: * @param series the series (zero-based index). 163: * 164: * @return The items (never <code>null</code>). 165: */ 166: protected Object[] createItemArray(XYDataset dataset, int series) { 167: Object[] result = new Object[1]; 168: result[0] = dataset.getSeriesKey(series).toString(); 169: return result; 170: } 171: 172: /** 173: * Returns an independent copy of the generator. 174: * 175: * @return A clone. 176: * 177: * @throws CloneNotSupportedException if cloning is not supported. 178: */ 179: public Object clone() throws CloneNotSupportedException { 180: MultipleXYSeriesLabelGenerator clone 181: = (MultipleXYSeriesLabelGenerator) super.clone(); 182: clone.seriesLabelLists = new HashMap(); 183: Set keys = this.seriesLabelLists.keySet(); 184: Iterator iterator = keys.iterator(); 185: while (iterator.hasNext()) { 186: Object key = iterator.next(); 187: Object entry = this.seriesLabelLists.get(key); 188: Object toAdd = entry; 189: if (entry instanceof PublicCloneable) { 190: PublicCloneable pc = (PublicCloneable) entry; 191: toAdd = pc.clone(); 192: } 193: clone.seriesLabelLists.put(key, toAdd); 194: } 195: return clone; 196: } 197: 198: /** 199: * Tests this object for equality with an arbitrary object. 200: * 201: * @param obj the other object (<code>null</code> permitted). 202: * 203: * @return A boolean. 204: */ 205: public boolean equals(Object obj) { 206: if (obj == this) { 207: return true; 208: } 209: if (!(obj instanceof MultipleXYSeriesLabelGenerator)) { 210: return false; 211: } 212: MultipleXYSeriesLabelGenerator that 213: = (MultipleXYSeriesLabelGenerator) obj; 214: if (!this.formatPattern.equals(that.formatPattern)) { 215: return false; 216: } 217: if (!this.additionalFormatPattern.equals( 218: that.additionalFormatPattern)) { 219: return false; 220: } 221: if (!this.seriesLabelLists.equals(that.seriesLabelLists)) { 222: return false; 223: } 224: return true; 225: } 226: 227: }