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     * StandardTickUnitSource.java
029     * ---------------------------
030     * (C) Copyright 2003-2008, by Object Refinery Limited.
031     *
032     * Original Author:  David Gilbert (for Object Refinery Limited);
033     * Contributor(s):   -;
034     *
035     * Changes
036     * -------
037     * 23-Sep-2003 : Version 1 (DG);
038     * 25-Oct-2007 : Implemented Serializable and equals() method (DG);
039     *
040     */
041    
042    package org.jfree.chart.axis;
043    
044    import java.io.Serializable;
045    import java.text.DecimalFormat;
046    
047    /**
048     * A source that can used by the {@link NumberAxis} class to obtain a
049     * suitable {@link TickUnit}.  Instances of this class are {@link Serializable}
050     * from version 1.0.7 onwards.  Cloning is not supported, because instances
051     * are immutable.
052     */
053    public class StandardTickUnitSource implements TickUnitSource, Serializable {
054    
055        /** Constant for log(10.0). */
056        private static final double LOG_10_VALUE = Math.log(10.0);
057    
058        /**
059         * Default constructor.
060         */
061        public StandardTickUnitSource() {
062            super();
063        }
064    
065        /**
066         * Returns a tick unit that is larger than the supplied unit.
067         *
068         * @param unit  the unit (<code>null</code> not permitted).
069         *
070         * @return A tick unit that is larger than the supplied unit.
071         */
072        public TickUnit getLargerTickUnit(TickUnit unit) {
073            double x = unit.getSize();
074            double log = Math.log(x) / LOG_10_VALUE;
075            double higher = Math.ceil(log);
076            return new NumberTickUnit(Math.pow(10, higher),
077                    new DecimalFormat("0.0E0"));
078        }
079    
080        /**
081         * Returns the tick unit in the collection that is greater than or equal
082         * to (in size) the specified unit.
083         *
084         * @param unit  the unit (<code>null</code> not permitted).
085         *
086         * @return A unit from the collection.
087         */
088        public TickUnit getCeilingTickUnit(TickUnit unit) {
089            return getLargerTickUnit(unit);
090        }
091    
092        /**
093         * Returns the tick unit in the collection that is greater than or equal
094         * to the specified size.
095         *
096         * @param size  the size.
097         *
098         * @return A unit from the collection.
099         */
100        public TickUnit getCeilingTickUnit(double size) {
101            double log = Math.log(size) / LOG_10_VALUE;
102            double higher = Math.ceil(log);
103            return new NumberTickUnit(Math.pow(10, higher),
104                    new DecimalFormat("0.0E0"));
105        }
106    
107        /**
108         * Tests this instance for equality with an arbitrary object.
109         *
110         * @param obj  the object (<code>null</code> permitted).
111         *
112         * @return A boolean.
113         */
114        public boolean equals(Object obj) {
115            if (obj == this) {
116                return true;
117            }
118            return (obj instanceof StandardTickUnitSource);
119        }
120    
121        /**
122         * Returns a hash code for this instance.
123         *
124         * @return A hash code.
125         */
126        public int hashCode() {
127            return 0;
128        }
129    
130    }