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: * StandardPieSectionLabelGenerator.java 29: * ------------------------------------- 30: * (C) Copyright 2004-2007, by Object Refinery Limited. 31: * 32: * Original Author: David Gilbert (for Object Refinery Limited); 33: * Contributor(s): -; 34: * 35: * $Id: StandardPieSectionLabelGenerator.java,v 1.4.2.7 2007/01/16 11:45:36 mungady Exp $ 36: * 37: * Changes 38: * ------- 39: * 09-Nov-2004 : Version 1, derived from StandardPieItemLabelGenerator (DG); 40: * 29-Jul-2005 : Removed unused generateToolTip() method (DG); 41: * ------------- JFREECHART 1.0.x --------------------------------------------- 42: * 03-May-2006 : Modified DEFAULT_SECTION_LABEL_FORMAT (DG); 43: * 10-Jan-2007 : Include attributedLabels in equals() test (DG); 44: * 45: */ 46: 47: package org.jfree.chart.labels; 48: 49: import java.awt.Font; 50: import java.awt.Paint; 51: import java.awt.font.TextAttribute; 52: import java.io.Serializable; 53: import java.text.AttributedString; 54: import java.text.NumberFormat; 55: 56: import org.jfree.data.general.PieDataset; 57: import org.jfree.util.ObjectList; 58: 59: /** 60: * A standard item label generator for plots that use data from a 61: * {@link PieDataset}. 62: * <p> 63: * For the label format, use {0} where the pie section key should be inserted, 64: * {1} for the absolute section value and {2} for the percent amount of the pie 65: * section, e.g. <code>"{0} = {1} ({2})"</code> will display as 66: * <code>apple = 120 (5%)</code>. 67: */ 68: public class StandardPieSectionLabelGenerator 69: extends AbstractPieItemLabelGenerator 70: implements PieSectionLabelGenerator, Cloneable, Serializable { 71: 72: /** For serialization. */ 73: private static final long serialVersionUID = 3064190563760203668L; 74: 75: /** The default section label format. */ 76: public static final String DEFAULT_SECTION_LABEL_FORMAT = "{0}"; 77: 78: /** 79: * An optional list of attributed labels (instances of AttributedString). 80: */ 81: private ObjectList attributedLabels; 82: 83: /** 84: * Creates a new section label generator using 85: * {@link #DEFAULT_SECTION_LABEL_FORMAT} as the label format string, and 86: * platform default number and percentage formatters. 87: */ 88: public StandardPieSectionLabelGenerator() { 89: this(DEFAULT_SECTION_LABEL_FORMAT, NumberFormat.getNumberInstance(), 90: NumberFormat.getPercentInstance()); 91: } 92: 93: /** 94: * Creates a new section label generator using the specified label format 95: * string, and platform default number and percentage formatters. 96: * 97: * @param labelFormat the label format (<code>null</code> not permitted). 98: */ 99: public StandardPieSectionLabelGenerator(String labelFormat) { 100: this(labelFormat, NumberFormat.getNumberInstance(), 101: NumberFormat.getPercentInstance()); 102: } 103: 104: /** 105: * Creates an item label generator using the specified number formatters. 106: * 107: * @param labelFormat the label format string (<code>null</code> not 108: * permitted). 109: * @param numberFormat the format object for the values (<code>null</code> 110: * not permitted). 111: * @param percentFormat the format object for the percentages 112: * (<code>null</code> not permitted). 113: */ 114: public StandardPieSectionLabelGenerator(String labelFormat, 115: NumberFormat numberFormat, 116: NumberFormat percentFormat) { 117: 118: super(labelFormat, numberFormat, percentFormat); 119: this.attributedLabels = new ObjectList(); 120: 121: } 122: 123: /** 124: * Returns the attributed label for a section, or <code>null</code> if none 125: * is defined. 126: * 127: * @param section the section index. 128: * 129: * @return The attributed label. 130: */ 131: public AttributedString getAttributedLabel(int section) { 132: return (AttributedString) this.attributedLabels.get(section); 133: } 134: 135: /** 136: * Sets the attributed label for a section. 137: * 138: * @param section the section index. 139: * @param label the label (<code>null</code> permitted). 140: */ 141: public void setAttributedLabel(int section, AttributedString label) { 142: this.attributedLabels.set(section, label); 143: } 144: 145: /** 146: * Generates a label for a pie section. 147: * 148: * @param dataset the dataset (<code>null</code> not permitted). 149: * @param key the section key (<code>null</code> not permitted). 150: * 151: * @return The label (possibly <code>null</code>). 152: */ 153: public String generateSectionLabel(PieDataset dataset, Comparable key) { 154: return super.generateSectionLabel(dataset, key); 155: } 156: 157: /** 158: * Generates an attributed label for the specified series, or 159: * <code>null</code> if no attributed label is available (in which case, 160: * the string returned by 161: * {@link #generateSectionLabel(PieDataset, Comparable)} will 162: * provide the fallback). Only certain attributes are recognised by the 163: * code that ultimately displays the labels: 164: * <ul> 165: * <li>{@link TextAttribute#FONT}: will set the font;</li> 166: * <li>{@link TextAttribute#POSTURE}: a value of 167: * {@link TextAttribute#POSTURE_OBLIQUE} will add {@link Font#ITALIC} to 168: * the current font;</li> 169: * <li>{@link TextAttribute#WEIGHT}: a value of 170: * {@link TextAttribute#WEIGHT_BOLD} will add {@link Font#BOLD} to the 171: * current font;</li> 172: * <li>{@link TextAttribute#FOREGROUND}: this will set the {@link Paint} 173: * for the current</li> 174: * <li>{@link TextAttribute#SUPERSCRIPT}: the values 175: * {@link TextAttribute#SUPERSCRIPT_SUB} and 176: * {@link TextAttribute#SUPERSCRIPT_SUPER} are recognised.</li> 177: * </ul> 178: * 179: * @param dataset the dataset (<code>null</code> not permitted). 180: * @param key the key. 181: * 182: * @return An attributed label (possibly <code>null</code>). 183: */ 184: public AttributedString generateAttributedSectionLabel(PieDataset dataset, 185: Comparable key) { 186: return getAttributedLabel(dataset.getIndex(key)); 187: } 188: 189: /** 190: * Tests the generator for equality with an arbitrary object. 191: * 192: * @param obj the object to test against (<code>null</code> permitted). 193: * 194: * @return A boolean. 195: */ 196: public boolean equals(Object obj) { 197: if (obj == this) { 198: return true; 199: } 200: if (!(obj instanceof StandardPieSectionLabelGenerator)) { 201: return false; 202: } 203: StandardPieSectionLabelGenerator that 204: = (StandardPieSectionLabelGenerator) obj; 205: if (!this.attributedLabels.equals(that.attributedLabels)) { 206: return false; 207: } 208: if (!super.equals(obj)) { 209: return false; 210: } 211: return true; 212: } 213: 214: /** 215: * Returns an independent copy of the generator. 216: * 217: * @return A clone. 218: * 219: * @throws CloneNotSupportedException should not happen. 220: */ 221: public Object clone() throws CloneNotSupportedException { 222: return super.clone(); 223: } 224: 225: }