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     * MeterInterval.java
029     * ------------------
030     * (C) Copyright 2005, by Object Refinery Limited and Contributors.
031     *
032     * Original Author:  David Gilbert (for Object Refinery Limited);
033     * Contributor(s):   -;
034     *
035     * $Id: MeterInterval.java,v 1.4.2.1 2005/10/25 20:52:07 mungady Exp $
036     *
037     * Changes
038     * -------
039     * 22-Mar-2005 : Version 1 (DG);
040     * 29-Mar-2005 : Fixed serialization (DG);
041     * 
042     */
043    
044    package org.jfree.chart.plot;
045    
046    import java.awt.BasicStroke;
047    import java.awt.Color;
048    import java.awt.Paint;
049    import java.awt.Stroke;
050    import java.io.IOException;
051    import java.io.ObjectInputStream;
052    import java.io.ObjectOutputStream;
053    import java.io.Serializable;
054    
055    import org.jfree.data.Range;
056    import org.jfree.io.SerialUtilities;
057    import org.jfree.util.ObjectUtilities;
058    import org.jfree.util.PaintUtilities;
059    
060    /**
061     * An interval to be highlighted on a {@link MeterPlot}.  Instances of this
062     * class are immutable.
063     */
064    public class MeterInterval implements Serializable {
065    
066        /** For serialization. */
067        private static final long serialVersionUID = 1530982090622488257L;
068        
069        /** The interval label. */
070        private String label;
071        
072        /** The interval range. */
073        private Range range;
074        
075        /** The outline paint (used for the arc marking the interval). */
076        private transient Paint outlinePaint;
077        
078        /** The outline stroke (used for the arc marking the interval). */
079        private transient Stroke outlineStroke;
080        
081        /** The background paint for the interval. */
082        private transient Paint backgroundPaint;
083        
084        /**
085         * Creates a new interval.
086         * 
087         * @param label  the label (<code>null</code> not permitted).
088         * @param range  the range (<code>null</code> not permitted).
089         */
090        public MeterInterval(String label, Range range) {
091            this(label, range, Color.yellow, new BasicStroke(2.0f), null);
092        }
093        
094        /**
095         * Creates a new interval.
096         * 
097         * @param label  the label (<code>null</code> not permitted).
098         * @param range  the range (<code>null</code> not permitted).
099         * @param outlinePaint  the outline paint (<code>null</code> permitted).
100         * @param outlineStroke  the outline stroke (<code>null</code> permitted).
101         * @param backgroundPaint  the background paint (<code>null</code> 
102         *                         permitted).
103         */
104        public MeterInterval(String label, Range range, Paint outlinePaint, 
105                             Stroke outlineStroke, Paint backgroundPaint) {
106            if (label == null) {
107                throw new IllegalArgumentException("Null 'label' argument.");
108            }
109            if (range == null) {
110                throw new IllegalArgumentException("Null 'range' argument.");
111            }
112            this.label = label;
113            this.range = range;
114            this.outlinePaint = outlinePaint;
115            this.outlineStroke = outlineStroke;
116            this.backgroundPaint = backgroundPaint;
117        }
118        
119        /**
120         * Returns the label.
121         * 
122         * @return The label (never <code>null</code>).
123         */
124        public String getLabel() {
125            return this.label;
126        }
127    
128        /**
129         * Returns the range.
130         * 
131         * @return The range (never <code>null</code>).
132         */
133        public Range getRange() {
134            return this.range;
135        }
136    
137        /**
138         * Returns the background paint.  If <code>null</code>, the background
139         * should remain unfilled.
140         * 
141         * @return The background paint (possibly <code>null</code>).
142         */
143        public Paint getBackgroundPaint() {
144            return this.backgroundPaint;
145        }
146        
147        /**
148         * Returns the outline paint.
149         * 
150         * @return The outline paint (possibly <code>null</code>).
151         */
152        public Paint getOutlinePaint() {
153            return this.outlinePaint;
154        }
155        
156        /**
157         * Returns the outline stroke.
158         * 
159         * @return The outline stroke (possibly <code>null</code>).
160         */
161        public Stroke getOutlineStroke() {
162            return this.outlineStroke;
163        }
164        
165        /**
166         * Checks this instance for equality with an arbitrary object.
167         * 
168         * @param obj  the object (<code>null</code> permitted).
169         * 
170         * @return A boolean.
171         */
172        public boolean equals(Object obj) {
173            if (obj == this) {
174                return true;
175            }
176            if (!(obj instanceof MeterInterval)) {
177                return false;
178            }
179            MeterInterval that = (MeterInterval) obj;
180            if (!this.label.equals(that.label)) {
181                return false;
182            }
183            if (!this.range.equals(that.range)) {
184                return false;
185            }
186            if (!PaintUtilities.equal(this.outlinePaint, that.outlinePaint)) {
187                return false;
188            }
189            if (!ObjectUtilities.equal(this.outlineStroke, that.outlineStroke)) {
190                return false;
191            }
192            if (!PaintUtilities.equal(this.backgroundPaint, that.backgroundPaint)) {
193                return false;
194            }
195            return true;
196        }
197        
198        /**
199         * Provides serialization support.
200         *
201         * @param stream  the output stream.
202         *
203         * @throws IOException  if there is an I/O error.
204         */
205        private void writeObject(ObjectOutputStream stream) throws IOException {
206            stream.defaultWriteObject();
207            SerialUtilities.writePaint(this.outlinePaint, stream);
208            SerialUtilities.writeStroke(this.outlineStroke, stream);
209            SerialUtilities.writePaint(this.backgroundPaint, stream);
210        }
211        
212        /**
213         * Provides serialization support.
214         *
215         * @param stream  the input stream.
216         *
217         * @throws IOException  if there is an I/O error.
218         * @throws ClassNotFoundException  if there is a classpath problem.
219         */
220        private void readObject(ObjectInputStream stream) 
221            throws IOException, ClassNotFoundException {
222            stream.defaultReadObject();
223            this.outlinePaint = SerialUtilities.readPaint(stream);
224            this.outlineStroke = SerialUtilities.readStroke(stream);
225            this.backgroundPaint = SerialUtilities.readPaint(stream);
226        }
227    
228    }