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 * LongNeedle.java
029 * ---------------
030 * (C) Copyright 2002-2008, by the Australian Antarctic Division and
031 * Contributors.
032 *
033 * Original Author: Bryan Scott (for the Australian Antarctic Division);
034 * Contributor(s): David Gilbert (for Object Refinery Limited);
035 *
036 * Changes:
037 * --------
038 * 25-Sep-2002 : Version 1, contributed by Bryan Scott (DG);
039 * 27-Mar-2003 : Implemented Serializable (DG);
040 * 09-Sep-2003 : Added equals() method (DG);
041 * 16-Mar-2004 : Implemented Rotation;
042 * 22-Nov-2007 : Implemented hashCode() (DG);
043 *
044 */
045
046 package org.jfree.chart.needle;
047
048 import java.awt.Graphics2D;
049 import java.awt.Shape;
050 import java.awt.geom.GeneralPath;
051 import java.awt.geom.Point2D;
052 import java.awt.geom.Rectangle2D;
053 import java.io.Serializable;
054
055 /**
056 * A needle that is represented by a long line.
057 */
058 public class LongNeedle extends MeterNeedle
059 implements Cloneable, Serializable {
060
061 /** For serialization. */
062 private static final long serialVersionUID = -4319985779783688159L;
063
064 /**
065 * Default constructor.
066 */
067 public LongNeedle() {
068 super();
069 setRotateY(0.8);
070 }
071
072 /**
073 * Draws the needle.
074 *
075 * @param g2 the graphics device.
076 * @param plotArea the plot area.
077 * @param rotate the rotation point.
078 * @param angle the angle.
079 */
080 protected void drawNeedle(Graphics2D g2, Rectangle2D plotArea,
081 Point2D rotate, double angle) {
082
083 GeneralPath shape1 = new GeneralPath();
084 GeneralPath shape2 = new GeneralPath();
085 GeneralPath shape3 = new GeneralPath();
086
087 float minX = (float) plotArea.getMinX();
088 float minY = (float) plotArea.getMinY();
089 float maxX = (float) plotArea.getMaxX();
090 float maxY = (float) plotArea.getMaxY();
091 //float midX = (float) (minX + (plotArea.getWidth() * getRotateX()));
092 //float midY = (float) (minY + (plotArea.getHeight() * getRotateY()));
093 float midX = (float) (minX + (plotArea.getWidth() * 0.5));
094 float midY = (float) (minY + (plotArea.getHeight() * 0.8));
095 float y = maxY - (2 * (maxY - midY));
096 if (y < minY) {
097 y = minY;
098 }
099 shape1.moveTo(minX, midY);
100 shape1.lineTo(midX, minY);
101 shape1.lineTo(midX, y);
102 shape1.closePath();
103
104 shape2.moveTo(maxX, midY);
105 shape2.lineTo(midX, minY);
106 shape2.lineTo(midX, y);
107 shape2.closePath();
108
109 shape3.moveTo(minX, midY);
110 shape3.lineTo(midX, maxY);
111 shape3.lineTo(maxX, midY);
112 shape3.lineTo(midX, y);
113 shape3.closePath();
114
115 Shape s1 = shape1;
116 Shape s2 = shape2;
117 Shape s3 = shape3;
118
119 if ((rotate != null) && (angle != 0)) {
120 /// we have rotation huston, please spin me
121 getTransform().setToRotation(angle, rotate.getX(), rotate.getY());
122 s1 = shape1.createTransformedShape(transform);
123 s2 = shape2.createTransformedShape(transform);
124 s3 = shape3.createTransformedShape(transform);
125 }
126
127
128 if (getHighlightPaint() != null) {
129 g2.setPaint(getHighlightPaint());
130 g2.fill(s3);
131 }
132
133 if (getFillPaint() != null) {
134 g2.setPaint(getFillPaint());
135 g2.fill(s1);
136 g2.fill(s2);
137 }
138
139
140 if (getOutlinePaint() != null) {
141 g2.setStroke(getOutlineStroke());
142 g2.setPaint(getOutlinePaint());
143 g2.draw(s1);
144 g2.draw(s2);
145 g2.draw(s3);
146 }
147 }
148
149 /**
150 * Tests another object for equality with this object.
151 *
152 * @param obj the object to test (<code>null</code> permitted).
153 *
154 * @return A boolean.
155 */
156 public boolean equals(Object obj) {
157 if (obj == this) {
158 return true;
159 }
160 if (!(obj instanceof LongNeedle)) {
161 return false;
162 }
163 return super.equals(obj);
164 }
165
166 /**
167 * Returns a hash code for this instance.
168 *
169 * @return A hash code.
170 */
171 public int hashCode() {
172 return super.hashCode();
173 }
174
175 /**
176 * Returns a clone of this needle.
177 *
178 * @return A clone.
179 *
180 * @throws CloneNotSupportedException if the <code>LongNeedle</code>
181 * cannot be cloned (in theory, this should not happen).
182 */
183 public Object clone() throws CloneNotSupportedException {
184 return super.clone();
185 }
186
187 }