    001/* ===========================================================
    002 * JFreeChart : a free chart library for the Java(tm) platform
    003 * ===========================================================
    004 *
    005 * (C) Copyright 2000-2011, 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 * [Oracle and Java are registered trademarks of Oracle and/or its affiliates.
    025 * Other names may be trademarks of their respective owners.]
    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
    043package org.jfree.chart.plot;
    044
    045import java.io.Serializable;
    046
    047import org.jfree.text.TextBox;
    048
    049/**
    050 * A structure that retains information about the label for a section in a pie
    051 * chart.
    052 */
    053public 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}