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