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     * LogFormat.java
029     * --------------
030     * (C) Copyright 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     * 02-Aug-2007 : Version 1 (DG);
038     * 
039     */
040    
041    package org.jfree.chart.util;
042    
043    import java.text.DecimalFormat;
044    import java.text.FieldPosition;
045    import java.text.NumberFormat;
046    import java.text.ParsePosition;
047    
048    /**
049     * A number formatter for logarithmic values.  This formatter does not support
050     * parsing.
051     * 
052     * @since 1.0.7
053     */
054    public class LogFormat extends NumberFormat {
055        
056        /** The log base value. */
057        private double base;
058        
059        /** The natural logarithm of the base value. */
060        private double baseLog;
061        
062        /** The label for the log base (for example, "e"). */
063        private String baseLabel;
064        
065        /** A flag that controls whether or not the base is shown. */
066        private boolean showBase;
067        
068        /** The number formatter for the exponent. */
069        private NumberFormat formatter = new DecimalFormat("0.0");
070        
071        /**
072         * Creates a new instance.
073         * 
074         * @param base  the base.
075         * @param baseLabel  the base label.
076         * @param showBase  a flag that controls whether or not the base value is
077         *                  shown.
078         */
079        public LogFormat(double base, String baseLabel, boolean showBase) {
080            this.base = base;
081            this.baseLog = Math.log(this.base);
082            this.baseLabel = baseLabel;
083            this.showBase = showBase;
084        }
085        
086        /**
087         * Calculates the log of a given value.
088         * 
089         * @param value  the value.
090         * 
091         * @return The log of the value.
092         */
093        private double calculateLog(double value) {
094            return Math.log(value) / this.baseLog;
095        }
096        
097        /**
098         * Returns a formatted representation of the specified number.
099         * 
100         * @param number  the number.
101         * @param toAppendTo  the string buffer to append to.
102         * @param pos  the position.
103         * 
104         * @return A string buffer containing the formatted value.
105         */
106        public StringBuffer format(double number, StringBuffer toAppendTo,
107                FieldPosition pos) {
108            StringBuffer result = new StringBuffer();
109            if (this.showBase) {
110                result.append(this.baseLabel);
111                result.append("^");
112            }
113            result.append(this.formatter.format(calculateLog(number)));
114            return result;
115        }
116    
117        /**
118         * Formats the specified number as a hexadecimal string.  The decimal 
119         * fraction is ignored.
120         * 
121         * @param number  the number to format.
122         * @param toAppendTo  the buffer to append to (ignored here).
123         * @param pos  the field position (ignored here).
124         * 
125         * @return The string buffer.
126         */
127        public StringBuffer format(long number, StringBuffer toAppendTo, 
128                FieldPosition pos) {
129            StringBuffer result = new StringBuffer();
130            if (this.showBase) {
131                result.append(this.baseLabel);
132                result.append("^");
133            }
134            result.append(this.formatter.format(calculateLog(number)));
135            return result;
136        }
137    
138        /**
139         * Parsing is not implemented, so this method always returns 
140         * <code>null</code>.
141         * 
142         * @param source  ignored.
143         * @param parsePosition  ignored.
144         * 
145         * @return Always <code>null</code>.
146         */
147        public Number parse (String source, ParsePosition parsePosition) {
148            return null; // don't bother with parsing
149        }
150    
151    }