1 43 44 package org.jfree.chart.annotations; 45 46 import java.awt.BasicStroke ; 47 import java.awt.Color ; 48 import java.awt.Graphics2D ; 49 import java.awt.Paint ; 50 import java.awt.Stroke ; 51 import java.awt.geom.Rectangle2D ; 52 import java.io.IOException ; 53 import java.io.ObjectInputStream ; 54 import java.io.ObjectOutputStream ; 55 import java.io.Serializable ; 56 57 import org.jfree.chart.axis.ValueAxis; 58 import org.jfree.chart.plot.Plot; 59 import org.jfree.chart.plot.PlotOrientation; 60 import org.jfree.chart.plot.PlotRenderingInfo; 61 import org.jfree.chart.plot.XYPlot; 62 import org.jfree.io.SerialUtilities; 63 import org.jfree.ui.RectangleEdge; 64 import org.jfree.util.ObjectUtilities; 65 import org.jfree.util.PaintUtilities; 66 import org.jfree.util.PublicCloneable; 67 68 72 public class XYBoxAnnotation extends AbstractXYAnnotation 73 implements Cloneable , 74 PublicCloneable, 75 Serializable { 76 77 78 private static final long serialVersionUID = 6764703772526757457L; 79 80 81 private double x0; 82 83 84 private double y0; 85 86 87 private double x1; 88 89 90 private double y1; 91 92 93 private transient Stroke stroke; 94 95 96 private transient Paint outlinePaint; 97 98 99 private transient Paint fillPaint; 100 101 110 public XYBoxAnnotation(double x0, double y0, double x1, double y1) { 111 this(x0, y0, x1, y1, new BasicStroke (1.0f), Color.black); 112 } 113 114 125 public XYBoxAnnotation(double x0, double y0, double x1, double y1, 126 Stroke stroke, Paint outlinePaint) { 127 this(x0, y0, x1, y1, stroke, outlinePaint, null); 128 } 129 130 142 public XYBoxAnnotation(double x0, double y0, double x1, double y1, 143 Stroke stroke, Paint outlinePaint, Paint fillPaint) { 144 this.x0 = x0; 145 this.y0 = y0; 146 this.x1 = x1; 147 this.y1 = y1; 148 this.stroke = stroke; 149 this.outlinePaint = outlinePaint; 150 this.fillPaint = fillPaint; 151 } 152 153 165 public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, 166 ValueAxis domainAxis, ValueAxis rangeAxis, 167 int rendererIndex, PlotRenderingInfo info) { 168 169 PlotOrientation orientation = plot.getOrientation(); 170 RectangleEdge domainEdge = Plot.resolveDomainAxisLocation( 171 plot.getDomainAxisLocation(), orientation); 172 RectangleEdge rangeEdge = Plot.resolveRangeAxisLocation( 173 plot.getRangeAxisLocation(), orientation); 174 175 double transX0 = domainAxis.valueToJava2D(this.x0, dataArea, 176 domainEdge); 177 double transY0 = rangeAxis.valueToJava2D(this.y0, dataArea, rangeEdge); 178 double transX1 = domainAxis.valueToJava2D(this.x1, dataArea, 179 domainEdge); 180 double transY1 = rangeAxis.valueToJava2D(this.y1, dataArea, rangeEdge); 181 182 Rectangle2D box = null; 183 if (orientation == PlotOrientation.HORIZONTAL) { 184 box = new Rectangle2D.Double (transY0, transX1, transY1 - transY0, 185 transX0 - transX1); 186 } 187 else if (orientation == PlotOrientation.VERTICAL) { 188 box = new Rectangle2D.Double (transX0, transY1, transX1 - transX0, 189 transY0 - transY1); 190 } 191 192 if (this.fillPaint != null) { 193 g2.setPaint(this.fillPaint); 194 g2.fill(box); 195 } 196 197 if (this.stroke != null && this.outlinePaint != null) { 198 g2.setPaint(this.outlinePaint); 199 g2.setStroke(this.stroke); 200 g2.draw(box); 201 } 202 addEntity(info, box, rendererIndex, getToolTipText(), getURL()); 203 204 } 205 206 213 public boolean equals(Object obj) { 214 if (obj == this) { 215 return true; 216 } 217 if (!super.equals(obj)) { 219 return false; 220 } 221 if (!(obj instanceof XYBoxAnnotation)) { 222 return false; 223 } 224 XYBoxAnnotation that = (XYBoxAnnotation) obj; 225 if (!(this.x0 == that.x0)) { 226 return false; 227 } 228 if (!(this.y0 == that.y0)) { 229 return false; 230 } 231 if (!(this.x1 == that.x1)) { 232 return false; 233 } 234 if (!(this.y1 == that.y1)) { 235 return false; 236 } 237 if (!ObjectUtilities.equal(this.stroke, that.stroke)) { 238 return false; 239 } 240 if (!PaintUtilities.equal(this.outlinePaint, that.outlinePaint)) { 241 return false; 242 } 243 if (!PaintUtilities.equal(this.fillPaint, that.fillPaint)) { 244 return false; 245 } 246 return true; 248 } 249 250 255 public int hashCode() { 256 int result; 257 long temp; 258 temp = Double.doubleToLongBits(this.x0); 259 result = (int) (temp ^ (temp >>> 32)); 260 temp = Double.doubleToLongBits(this.x1); 261 result = 29 * result + (int) (temp ^ (temp >>> 32)); 262 temp = Double.doubleToLongBits(this.y0); 263 result = 29 * result + (int) (temp ^ (temp >>> 32)); 264 temp = Double.doubleToLongBits(this.y1); 265 result = 29 * result + (int) (temp ^ (temp >>> 32)); 266 return result; 267 } 268 269 277 public Object clone() throws CloneNotSupportedException { 278 return super.clone(); 279 } 280 281 288 private void writeObject(ObjectOutputStream stream) throws IOException { 289 stream.defaultWriteObject(); 290 SerialUtilities.writeStroke(this.stroke, stream); 291 SerialUtilities.writePaint(this.outlinePaint, stream); 292 SerialUtilities.writePaint(this.fillPaint, stream); 293 } 294 295 303 private void readObject(ObjectInputStream stream) 304 throws IOException , ClassNotFoundException { 305 306 stream.defaultReadObject(); 307 this.stroke = SerialUtilities.readStroke(stream); 308 this.outlinePaint = SerialUtilities.readPaint(stream); 309 this.fillPaint = SerialUtilities.readPaint(stream); 310 } 311 312 } 313 | Popular Tags |