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 * ClipPath.java 029 * ------------- 030 * (C) Copyright 2003-2008, by David M. O'Donnell and Contributors. 031 * 032 * Original Author: David M. O'Donnell; 033 * Contributor(s): David Gilbert (for Object Refinery Limited); 034 * Nicolas Brodu; 035 * 036 * Changes 037 * ------- 038 * 22-Apr-2003 : Added standard header (DG); 039 * 09-May-2003 : Added AxisLocation (DG); 040 * 11-Sep-2003 : Implemented Cloneable (NB); 041 * 21-Jan-2004 : Update for renamed method in ValueAxis (DG); 042 * ------------- JFREECHART 1.0.x --------------------------------------------- 043 * 31-Jan-2007 : Deprecated (DG); 044 * 045 */ 046 047 package org.jfree.chart; 048 049 import java.awt.BasicStroke; 050 import java.awt.Composite; 051 import java.awt.Graphics2D; 052 import java.awt.Paint; 053 import java.awt.Stroke; 054 import java.awt.geom.GeneralPath; 055 import java.awt.geom.Rectangle2D; 056 057 import org.jfree.chart.axis.ValueAxis; 058 import org.jfree.chart.plot.XYPlot; 059 import org.jfree.chart.renderer.xy.XYBlockRenderer; 060 import org.jfree.ui.RectangleEdge; 061 062 /** 063 * This class would typically be used with a 064 * {@link org.jfree.chart.plot.ContourPlot}. It allows the user to define a 065 * <code>GeneralPath</code> curve in plot coordinates. This curve can then be 066 * used mask off or define regions within the contour plot. The data must be 067 * sorted. 068 * 069 * @deprecated This class is no longer supported (as of version 1.0.4). If 070 * you are creating contour plots, please try to use {@link XYPlot} and 071 * {@link XYBlockRenderer}. 072 */ 073 public class ClipPath implements Cloneable { 074 075 /** The x values. */ 076 private double[] xValue = null; 077 078 /** The y values. */ 079 private double[] yValue = null; 080 081 /** Controls whether drawing will be clipped ( 082 * false would still allow the drawing or filling of path */ 083 private boolean clip = true; 084 085 /** Controls whether the path is drawn as an outline. */ 086 private boolean drawPath = false; 087 088 /** Controls whether the path is filled. */ 089 private boolean fillPath = false; 090 091 /** The fill paint. */ 092 private Paint fillPaint = null; 093 094 /** The draw paint. */ 095 private Paint drawPaint = null; 096 097 /** The draw stroke. */ 098 private Stroke drawStroke = null; 099 100 /** The composite. */ 101 private Composite composite = null; 102 103 /** 104 * Constructor for ClipPath. 105 */ 106 public ClipPath() { 107 super(); 108 } 109 110 /** 111 * Constructor for ClipPath. 112 * Default values are assumed for the fillPath and drawPath options as 113 * false and true respectively. The fillPaint is set to Color.GRAY, the 114 * drawColor is Color.BLUE, the stroke is BasicStroke(1) 115 * and the composite is AlphaComposite.Src. 116 * 117 * @param xValue x coordinates of curved to be created 118 * @param yValue y coordinates of curved to be created 119 */ 120 public ClipPath(double[] xValue, double[] yValue) { 121 this(xValue, yValue, true, false, true); 122 } 123 124 125 /** 126 * Constructor for ClipPath. 127 * The fillPaint is set to Color.GRAY, the drawColor is Color.BLUE, the 128 * stroke is BasicStroke(1) and the composite is AlphaComposite.Src. 129 * 130 * @param xValue x coordinates of curved to be created 131 * @param yValue y coordinates of curved to be created 132 * @param clip clip? 133 * @param fillPath whether the path is to filled 134 * @param drawPath whether the path is to drawn as an outline 135 */ 136 public ClipPath(double[] xValue, double[] yValue, 137 boolean clip, boolean fillPath, boolean drawPath) { 138 this.xValue = xValue; 139 this.yValue = yValue; 140 141 this.clip = clip; 142 this.fillPath = fillPath; 143 this.drawPath = drawPath; 144 145 this.fillPaint = java.awt.Color.gray; 146 this.drawPaint = java.awt.Color.blue; 147 this.drawStroke = new BasicStroke(1); 148 this.composite = java.awt.AlphaComposite.Src; 149 } 150 151 /** 152 * Constructor for ClipPath. 153 * 154 * @param xValue x coordinates of curved to be created 155 * @param yValue y coordinates of curved to be created 156 * @param fillPath whether the path is to filled 157 * @param drawPath whether the path is to drawn as an outline 158 * @param fillPaint the fill paint 159 * @param drawPaint the outline stroke color 160 * @param drawStroke the stroke style 161 * @param composite the composite rule 162 */ 163 public ClipPath(double[] xValue, double[] yValue, boolean fillPath, 164 boolean drawPath, Paint fillPaint, Paint drawPaint, 165 Stroke drawStroke, Composite composite) { 166 167 this.xValue = xValue; 168 this.yValue = yValue; 169 170 this.fillPath = fillPath; 171 this.drawPath = drawPath; 172 173 this.fillPaint = fillPaint; 174 this.drawPaint = drawPaint; 175 this.drawStroke = drawStroke; 176 this.composite = composite; 177 178 } 179 180 /** 181 * Draws the clip path. 182 * 183 * @param g2 current graphics2D. 184 * @param dataArea the dataArea that the plot is being draw in. 185 * @param horizontalAxis the horizontal axis. 186 * @param verticalAxis the vertical axis. 187 * 188 * @return The GeneralPath defining the outline 189 */ 190 public GeneralPath draw(Graphics2D g2, 191 Rectangle2D dataArea, 192 ValueAxis horizontalAxis, ValueAxis verticalAxis) { 193 194 GeneralPath generalPath = generateClipPath( 195 dataArea, horizontalAxis, verticalAxis 196 ); 197 if (this.fillPath || this.drawPath) { 198 Composite saveComposite = g2.getComposite(); 199 Paint savePaint = g2.getPaint(); 200 Stroke saveStroke = g2.getStroke(); 201 202 if (this.fillPaint != null) { 203 g2.setPaint(this.fillPaint); 204 } 205 if (this.composite != null) { 206 g2.setComposite(this.composite); 207 } 208 if (this.fillPath) { 209 g2.fill(generalPath); 210 } 211 212 if (this.drawStroke != null) { 213 g2.setStroke(this.drawStroke); 214 } 215 if (this.drawPath) { 216 g2.draw(generalPath); 217 } 218 g2.setPaint(savePaint); 219 g2.setComposite(saveComposite); 220 g2.setStroke(saveStroke); 221 } 222 return generalPath; 223 224 } 225 226 /** 227 * Generates the clip path. 228 * 229 * @param dataArea the dataArea that the plot is being draw in. 230 * @param horizontalAxis the horizontal axis. 231 * @param verticalAxis the vertical axis. 232 * 233 * @return The GeneralPath defining the outline 234 */ 235 public GeneralPath generateClipPath(Rectangle2D dataArea, 236 ValueAxis horizontalAxis, 237 ValueAxis verticalAxis) { 238 239 GeneralPath generalPath = new GeneralPath(); 240 double transX = horizontalAxis.valueToJava2D( 241 this.xValue[0], dataArea, RectangleEdge.BOTTOM 242 ); 243 double transY = verticalAxis.valueToJava2D( 244 this.yValue[0], dataArea, RectangleEdge.LEFT 245 ); 246 generalPath.moveTo((float) transX, (float) transY); 247 for (int k = 0; k < this.yValue.length; k++) { 248 transX = horizontalAxis.valueToJava2D( 249 this.xValue[k], dataArea, RectangleEdge.BOTTOM 250 ); 251 transY = verticalAxis.valueToJava2D( 252 this.yValue[k], dataArea, RectangleEdge.LEFT 253 ); 254 generalPath.lineTo((float) transX, (float) transY); 255 } 256 generalPath.closePath(); 257 258 return generalPath; 259 260 } 261 262 /** 263 * Returns the composite. 264 * 265 * @return Composite 266 */ 267 public Composite getComposite() { 268 return this.composite; 269 } 270 271 /** 272 * Returns the drawPaint. 273 * 274 * @return Paint 275 */ 276 public Paint getDrawPaint() { 277 return this.drawPaint; 278 } 279 280 /** 281 * Returns the drawPath. 282 * 283 * @return boolean 284 */ 285 public boolean isDrawPath() { 286 return this.drawPath; 287 } 288 289 /** 290 * Returns the drawStroke. 291 * 292 * @return Stroke 293 */ 294 public Stroke getDrawStroke() { 295 return this.drawStroke; 296 } 297 298 /** 299 * Returns the fillPaint. 300 * 301 * @return Paint 302 */ 303 public Paint getFillPaint() { 304 return this.fillPaint; 305 } 306 307 /** 308 * Returns the fillPath. 309 * 310 * @return boolean 311 */ 312 public boolean isFillPath() { 313 return this.fillPath; 314 } 315 316 /** 317 * Returns the xValue. 318 * 319 * @return double[] 320 */ 321 public double[] getXValue() { 322 return this.xValue; 323 } 324 325 /** 326 * Returns the yValue. 327 * 328 * @return double[] 329 */ 330 public double[] getYValue() { 331 return this.yValue; 332 } 333 334 /** 335 * Sets the composite. 336 * 337 * @param composite The composite to set 338 */ 339 public void setComposite(Composite composite) { 340 this.composite = composite; 341 } 342 343 /** 344 * Sets the drawPaint. 345 * 346 * @param drawPaint The drawPaint to set 347 */ 348 public void setDrawPaint(Paint drawPaint) { 349 this.drawPaint = drawPaint; 350 } 351 352 /** 353 * Sets the drawPath. 354 * 355 * @param drawPath The drawPath to set 356 */ 357 public void setDrawPath(boolean drawPath) { 358 this.drawPath = drawPath; 359 } 360 361 /** 362 * Sets the drawStroke. 363 * 364 * @param drawStroke The drawStroke to set 365 */ 366 public void setDrawStroke(Stroke drawStroke) { 367 this.drawStroke = drawStroke; 368 } 369 370 /** 371 * Sets the fillPaint. 372 * 373 * @param fillPaint The fillPaint to set 374 */ 375 public void setFillPaint(Paint fillPaint) { 376 this.fillPaint = fillPaint; 377 } 378 379 /** 380 * Sets the fillPath. 381 * 382 * @param fillPath The fillPath to set 383 */ 384 public void setFillPath(boolean fillPath) { 385 this.fillPath = fillPath; 386 } 387 388 /** 389 * Sets the xValue. 390 * 391 * @param xValue The xValue to set 392 */ 393 public void setXValue(double[] xValue) { 394 this.xValue = xValue; 395 } 396 397 /** 398 * Sets the yValue. 399 * 400 * @param yValue The yValue to set 401 */ 402 public void setYValue(double[] yValue) { 403 this.yValue = yValue; 404 } 405 406 /** 407 * Returns the clip. 408 * 409 * @return boolean 410 */ 411 public boolean isClip() { 412 return this.clip; 413 } 414 415 /** 416 * Sets the clip. 417 * 418 * @param clip The clip to set 419 */ 420 public void setClip(boolean clip) { 421 this.clip = clip; 422 } 423 424 /** 425 * Returns a clone of the object (a deeper clone than default to avoid bugs 426 * when setting values in cloned object). 427 * 428 * @return The clone. 429 * 430 * @throws CloneNotSupportedException if cloning is not supported. 431 */ 432 public Object clone() throws CloneNotSupportedException { 433 ClipPath clone = (ClipPath) super.clone(); 434 clone.xValue = (double[]) this.xValue.clone(); 435 clone.yValue = (double[]) this.yValue.clone(); 436 return clone; 437 } 438 439 }