001 /* ===========================================================
002 * JFreeChart : a free chart library for the Java(tm) platform
003 * ===========================================================
004 *
005 * (C) Copyright 2000-2005, 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 * TickUnits.java
029 * --------------
030 * (C) Copyright 2001-2005, by Object Refinery Limited.
031 *
032 * Original Author: David Gilbert (for Object Refinery Limited);
033 * Contributor(s): -;
034 *
035 * $Id: TickUnits.java,v 1.4.2.2 2005/10/25 20:37:34 mungady Exp $
036 *
037 * Changes
038 * -------
039 * 23-Nov-2001 : Version 1 (DG);
040 * 18-Feb-2002 : Fixed bug in getNearestTickUnit (thanks to Mario Inchiosa for
041 * reporting this, SourceForge bug id 518073) (DG);
042 * 25-Feb-2002 : Moved createStandardTickUnits() method from NumberAxis, and
043 * added createIntegerTickUnits() method (DG);
044 * 01-May-2002 : Updated for changes to the TickUnit class (DG);
045 * 18-Sep-2002 : Added standardTickUnit methods which take a Locale
046 * instance (AS);
047 * 26-Sep-2002 : Fixed errors reported by Checkstyle (DG);
048 * 08-Nov-2002 : Moved to new package com.jrefinery.chart.axis (DG);
049 * 26-Mar-2003 : Implemented Serializable (DG);
050 * 13-Aug-2003 : Implemented Cloneable (DG);
051 * 23-Sep-2003 : Implemented TickUnitSource interface (DG);
052 * 03-Dec-2003 : Adding null values now throws exceptions (TM);
053 * 11-Jan-2005 : Removed deprecated methods in preparation for 1.0.0
054 * release (DG);
055 *
056 */
057
058 package org.jfree.chart.axis;
059
060 import java.io.Serializable;
061 import java.text.NumberFormat;
062 import java.util.ArrayList;
063 import java.util.Collections;
064 import java.util.List;
065
066 /**
067 * A collection of tick units, used by the {@link DateAxis} and
068 * {@link NumberAxis} classes.
069 */
070 public class TickUnits implements TickUnitSource, Cloneable, Serializable {
071
072 /** For serialization. */
073 private static final long serialVersionUID = 1134174035901467545L;
074
075 /** Storage for the tick units. */
076 private List tickUnits;
077
078 /**
079 * Constructs a new collection of tick units.
080 */
081 public TickUnits() {
082 this.tickUnits = new ArrayList();
083 }
084
085 /**
086 * Adds a tick unit to the collection.
087 * <P>
088 * The tick units are maintained in ascending order.
089 *
090 * @param unit the tick unit to add.
091 */
092 public void add(TickUnit unit) {
093
094 if (unit == null) {
095 throw new NullPointerException("Null 'unit' argument.");
096 }
097 this.tickUnits.add(unit);
098 Collections.sort(this.tickUnits);
099
100 }
101
102 /**
103 * Returns the number of tick units in this collection.
104 * <P>
105 * This method is required for the XML writer.
106 *
107 * @return The number of units in this collection.
108 */
109 public int size() {
110 return this.tickUnits.size();
111 }
112
113 /**
114 * Returns the tickunit on the given position.
115 * <P>
116 * This method is required for the XML writer.
117 *
118 * @param pos the position in the list.
119 *
120 * @return The tickunit.
121 */
122 public TickUnit get(int pos) {
123 return (TickUnit) this.tickUnits.get(pos);
124 }
125
126 /**
127 * Returns a tick unit that is larger than the supplied unit.
128 *
129 * @param unit the unit.
130 *
131 * @return A tick unit that is larger than the supplied unit.
132 */
133 public TickUnit getLargerTickUnit(TickUnit unit) {
134
135 int index = Collections.binarySearch(this.tickUnits, unit);
136 if (index >= 0) {
137 index = index + 1;
138 }
139 else {
140 index = -index;
141 }
142
143 return (TickUnit) this.tickUnits.get(
144 Math.min(index, this.tickUnits.size() - 1)
145 );
146
147 }
148
149 /**
150 * Returns the tick unit in the collection that is greater than or equal
151 * to (in size) the specified unit.
152 *
153 * @param unit the unit.
154 *
155 * @return A unit from the collection.
156 */
157 public TickUnit getCeilingTickUnit(TickUnit unit) {
158
159 int index = Collections.binarySearch(this.tickUnits, unit);
160 if (index >= 0) {
161 return (TickUnit) this.tickUnits.get(index);
162 }
163 else {
164 index = -(index + 1);
165 return (TickUnit) this.tickUnits.get(
166 Math.min(index, this.tickUnits.size() - 1)
167 );
168 }
169
170 }
171
172 /**
173 * Returns the tick unit in the collection that is greater than or equal
174 * to the specified size.
175 *
176 * @param size the size.
177 *
178 * @return A unit from the collection.
179 */
180 public TickUnit getCeilingTickUnit(double size) {
181 return getCeilingTickUnit(new NumberTickUnit(size,
182 NumberFormat.getInstance()));
183 }
184
185 /**
186 * Returns a clone of the collection.
187 *
188 * @return A clone.
189 *
190 * @throws CloneNotSupportedException if an item in the collection does not
191 * support cloning.
192 */
193 public Object clone() throws CloneNotSupportedException {
194 TickUnits clone = (TickUnits) super.clone();
195 clone.tickUnits = new java.util.ArrayList(this.tickUnits);
196 return clone;
197 }
198
199 /**
200 * Tests an object for equality with this instance.
201 *
202 * @param object the object to test.
203 *
204 * @return A boolean.
205 */
206 public boolean equals(Object object) {
207 if (object == null) {
208 return false;
209 }
210 if (object == this) {
211 return true;
212 }
213 if (object instanceof TickUnits) {
214 TickUnits tu = (TickUnits) object;
215 return tu.tickUnits.equals(this.tickUnits);
216 }
217 return false;
218 }
219
220 }