    001    /* ===========================================================
    002     * JFreeChart : a free chart library for the Java(tm) platform
    003     * ===========================================================
    004     *
    005     * (C) Copyright 2000-2007, 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, 2007, 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    }