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 * PieLabelRecord.java 029 * ------------------- 030 * (C) Copyright 2004-2008, by Object Refinery Limited and Contributors. 031 * 032 * Original Author: David Gilbert (for Object Refinery Limited); 033 * Contributor(s): -; 034 * 035 * Changes 036 * ------- 037 * 08-Mar-2004 : Version 1 (DG); 038 * 14-Jun-2007 : Implemented Serializable, updated API docs (DG); 039 * 21-Nov-2007 : Implemented equals() to shut up FindBugs (DG); 040 * 041 */ 042 043 package org.jfree.chart.plot; 044 045 import java.io.Serializable; 046 047 import org.jfree.text.TextBox; 048 049 /** 050 * A structure that retains information about the label for a section in a pie 051 * chart. 052 */ 053 public class PieLabelRecord implements Comparable, Serializable { 054 055 /** The section key. */ 056 private Comparable key; 057 058 /** The angle of the centre of the section (in radians). */ 059 private double angle; 060 061 /** The base y-coordinate. */ 062 private double baseY; 063 064 /** The allocated y-coordinate. */ 065 private double allocatedY; 066 067 /** The label. */ 068 private TextBox label; 069 070 /** The label height. */ 071 private double labelHeight; 072 073 /** The gap. */ 074 private double gap; 075 076 /** The link percent. */ 077 private double linkPercent; 078 079 /** 080 * Creates a new record. 081 * 082 * @param key the section key. 083 * @param angle the angle to the middle of the section (in radians). 084 * @param baseY the base y-coordinate. 085 * @param label the section label. 086 * @param labelHeight the label height (in Java2D units). 087 * @param gap the offset to the left. 088 * @param linkPercent the link percent. 089 */ 090 public PieLabelRecord(Comparable key, double angle, double baseY, 091 TextBox label, double labelHeight, double gap, 092 double linkPercent) { 093 this.key = key; 094 this.angle = angle; 095 this.baseY = baseY; 096 this.allocatedY = baseY; 097 this.label = label; 098 this.labelHeight = labelHeight; 099 this.gap = gap; 100 this.linkPercent = linkPercent; 101 } 102 103 /** 104 * Returns the base y-coordinate. This is where the label will appear if 105 * there is no overlapping of labels. 106 * 107 * @return The base y-coordinate. 108 */ 109 public double getBaseY() { 110 return this.baseY; 111 } 112 113 /** 114 * Sets the base y-coordinate. 115 * 116 * @param base the base y-coordinate. 117 */ 118 public void setBaseY(double base) { 119 this.baseY = base; 120 } 121 122 /** 123 * Returns the lower bound of the label. 124 * 125 * @return The lower bound. 126 */ 127 public double getLowerY() { 128 return this.allocatedY - this.labelHeight / 2.0; 129 } 130 131 /** 132 * Returns the upper bound of the label. 133 * 134 * @return The upper bound. 135 */ 136 public double getUpperY() { 137 return this.allocatedY + this.labelHeight / 2.0; 138 } 139 140 /** 141 * Returns the angle of the middle of the section, in radians. 142 * 143 * @return The angle, in radians. 144 */ 145 public double getAngle() { 146 return this.angle; 147 } 148 149 /** 150 * Returns the key for the section that the label applies to. 151 * 152 * @return The key. 153 */ 154 public Comparable getKey() { 155 return this.key; 156 } 157 158 /** 159 * Returns the label. 160 * 161 * @return The label. 162 */ 163 public TextBox getLabel() { 164 return this.label; 165 } 166 167 /** 168 * Returns the label height (you could derive this from the label itself, 169 * but we cache the value so it can be retrieved quickly). 170 * 171 * @return The label height (in Java2D units). 172 */ 173 public double getLabelHeight() { 174 return this.labelHeight; 175 } 176 177 /** 178 * Returns the allocated y-coordinate. 179 * 180 * @return The allocated y-coordinate. 181 */ 182 public double getAllocatedY() { 183 return this.allocatedY; 184 } 185 186 /** 187 * Sets the allocated y-coordinate. 188 * 189 * @param y the y-coordinate. 190 */ 191 public void setAllocatedY(double y) { 192 this.allocatedY = y; 193 } 194 195 /** 196 * Returns the gap. 197 * 198 * @return The gap. 199 */ 200 public double getGap() { 201 return this.gap; 202 } 203 204 /** 205 * Returns the link percent. 206 * 207 * @return The link percent. 208 */ 209 public double getLinkPercent() { 210 return this.linkPercent; 211 } 212 213 /** 214 * Compares this object to an arbitrary object. 215 * 216 * @param obj the object to compare against. 217 * 218 * @return An integer that specifies the relative order of the two objects. 219 */ 220 public int compareTo(Object obj) { 221 int result = 0; 222 if (obj instanceof PieLabelRecord) { 223 PieLabelRecord plr = (PieLabelRecord) obj; 224 if (this.baseY < plr.baseY) { 225 result = -1; 226 } 227 else if (this.baseY > plr.baseY) { 228 result = 1; 229 } 230 } 231 return result; 232 } 233 234 /** 235 * Tests this record for equality with an arbitrary object. 236 * 237 * @param obj the object (<code>null</code> permitted). 238 * 239 * @return A boolean. 240 */ 241 public boolean equals(Object obj) { 242 if (obj == this) { 243 return true; 244 } 245 if (!(obj instanceof PieLabelRecord)) { 246 return false; 247 } 248 PieLabelRecord that = (PieLabelRecord) obj; 249 if (!this.key.equals(that.key)) { 250 return false; 251 } 252 if (this.angle != that.angle) { 253 return false; 254 } 255 if (this.gap != that.gap) { 256 return false; 257 } 258 if (this.allocatedY != that.allocatedY) { 259 return false; 260 } 261 if (this.baseY != that.baseY) { 262 return false; 263 } 264 if (this.labelHeight != that.labelHeight) { 265 return false; 266 } 267 if (this.linkPercent != that.linkPercent) { 268 return false; 269 } 270 if (!this.label.equals(that.label)) { 271 return false; 272 } 273 return true; 274 } 275 276 /** 277 * Returns a string describing the object. This is used for debugging only. 278 * 279 * @return A string. 280 */ 281 public String toString() { 282 return this.baseY + ", " + this.key.toString(); 283 } 284 }