| 1 95 96 package org.jfree.chart.renderer.xy; 97 98 import java.awt.AlphaComposite ; 99 import java.awt.Composite ; 100 import java.awt.Font ; 101 import java.awt.GradientPaint ; 102 import java.awt.Graphics2D ; 103 import java.awt.Paint ; 104 import java.awt.Shape ; 105 import java.awt.Stroke ; 106 import java.awt.geom.Ellipse2D ; 107 import java.awt.geom.Line2D ; 108 import java.awt.geom.Point2D ; 109 import java.awt.geom.Rectangle2D ; 110 import java.io.Serializable ; 111 import java.util.Iterator ; 112 import java.util.List ; 113 114 import org.jfree.chart.LegendItem; 115 import org.jfree.chart.LegendItemCollection; 116 import org.jfree.chart.annotations.XYAnnotation; 117 import org.jfree.chart.axis.ValueAxis; 118 import org.jfree.chart.entity.EntityCollection; 119 import org.jfree.chart.entity.XYItemEntity; 120 import org.jfree.chart.event.RendererChangeEvent; 121 import org.jfree.chart.labels.ItemLabelPosition; 122 import org.jfree.chart.labels.StandardXYSeriesLabelGenerator; 123 import org.jfree.chart.labels.XYItemLabelGenerator; 124 import org.jfree.chart.labels.XYSeriesLabelGenerator; 125 import org.jfree.chart.labels.XYToolTipGenerator; 126 import org.jfree.chart.plot.CrosshairState; 127 import org.jfree.chart.plot.DrawingSupplier; 128 import org.jfree.chart.plot.IntervalMarker; 129 import org.jfree.chart.plot.Marker; 130 import org.jfree.chart.plot.Plot; 131 import org.jfree.chart.plot.PlotOrientation; 132 import org.jfree.chart.plot.PlotRenderingInfo; 133 import org.jfree.chart.plot.ValueMarker; 134 import org.jfree.chart.plot.XYPlot; 135 import org.jfree.chart.renderer.AbstractRenderer; 136 import org.jfree.chart.urls.XYURLGenerator; 137 import org.jfree.data.Range; 138 import org.jfree.data.general.DatasetUtilities; 139 import org.jfree.data.xy.XYDataset; 140 import org.jfree.text.TextUtilities; 141 import org.jfree.ui.GradientPaintTransformer; 142 import org.jfree.ui.Layer; 143 import org.jfree.ui.LengthAdjustmentType; 144 import org.jfree.ui.RectangleAnchor; 145 import org.jfree.ui.RectangleInsets; 146 import org.jfree.util.ObjectList; 147 import org.jfree.util.ObjectUtilities; 148 import org.jfree.util.PublicCloneable; 149 150 154 public abstract class AbstractXYItemRenderer extends AbstractRenderer 155 implements XYItemRenderer, 156 Cloneable , 157 Serializable { 158 159 160 private static final long serialVersionUID = 8019124836026607990L; 161 162 163 private XYPlot plot; 164 165 166 private XYItemLabelGenerator itemLabelGenerator; 167 168 169 private ObjectList itemLabelGeneratorList; 170 171 172 private XYItemLabelGenerator baseItemLabelGenerator; 173 174 175 private XYToolTipGenerator toolTipGenerator; 176 177 178 private ObjectList toolTipGeneratorList; 179 180 181 private XYToolTipGenerator baseToolTipGenerator; 182 183 184 private XYURLGenerator urlGenerator; 185 186 190 private List backgroundAnnotations; 191 192 196 private List foregroundAnnotations; 197 198 private int defaultEntityRadius; 199 200 private XYSeriesLabelGenerator legendItemLabelGenerator; 201 202 private XYSeriesLabelGenerator legendItemToolTipGenerator; 203 204 private XYSeriesLabelGenerator legendItemURLGenerator; 205 206 210 protected AbstractXYItemRenderer() { 211 this.itemLabelGenerator = null; 212 this.itemLabelGeneratorList = new ObjectList(); 213 this.toolTipGenerator = null; 214 this.toolTipGeneratorList = new ObjectList(); 215 this.urlGenerator = null; 216 this.backgroundAnnotations = new java.util.ArrayList (); 217 this.foregroundAnnotations = new java.util.ArrayList (); 218 this.defaultEntityRadius = 3; 219 this.legendItemLabelGenerator 220 = new StandardXYSeriesLabelGenerator("{0}"); 221 } 222 223 230 public int getPassCount() { 231 return 1; 232 } 233 234 239 public XYPlot getPlot() { 240 return this.plot; 241 } 242 243 248 public void setPlot(XYPlot plot) { 249 this.plot = plot; 250 } 251 252 269 public XYItemRendererState initialise(Graphics2D g2, 270 Rectangle2D dataArea, 271 XYPlot plot, 272 XYDataset data, 273 PlotRenderingInfo info) { 274 275 XYItemRendererState state = new XYItemRendererState(info); 276 return state; 277 278 } 279 280 282 293 public XYItemLabelGenerator getItemLabelGenerator(int row, int column) { 294 return getSeriesItemLabelGenerator(row); 295 } 296 297 304 public XYItemLabelGenerator getSeriesItemLabelGenerator(int series) { 305 306 if (this.itemLabelGenerator != null) { 308 return this.itemLabelGenerator; 309 } 310 311 XYItemLabelGenerator generator 313 = (XYItemLabelGenerator) this.itemLabelGeneratorList.get(series); 314 if (generator == null) { 315 generator = this.baseItemLabelGenerator; 316 } 317 return generator; 318 319 } 320 321 327 public void setItemLabelGenerator(XYItemLabelGenerator generator) { 328 this.itemLabelGenerator = generator; 329 notifyListeners(new RendererChangeEvent(this)); 330 } 331 332 339 public void setSeriesItemLabelGenerator(int series, 340 XYItemLabelGenerator generator) { 341 this.itemLabelGeneratorList.set(series, generator); 342 notifyListeners(new RendererChangeEvent(this)); 343 } 344 345 350 public XYItemLabelGenerator getBaseItemLabelGenerator() { 351 return this.baseItemLabelGenerator; 352 } 353 354 360 public void setBaseItemLabelGenerator(XYItemLabelGenerator generator) { 361 this.baseItemLabelGenerator = generator; 362 notifyListeners(new RendererChangeEvent(this)); 363 } 364 365 367 378 public XYToolTipGenerator getToolTipGenerator(int row, int column) { 379 return getSeriesToolTipGenerator(row); 380 } 381 382 389 public XYToolTipGenerator getSeriesToolTipGenerator(int series) { 390 391 if (this.toolTipGenerator != null) { 393 return this.toolTipGenerator; 394 } 395 396 XYToolTipGenerator generator 398 = (XYToolTipGenerator) this.toolTipGeneratorList.get(series); 399 if (generator == null) { 400 generator = this.baseToolTipGenerator; 401 } 402 return generator; 403 404 } 405 406 412 public void setToolTipGenerator(XYToolTipGenerator generator) { 413 this.toolTipGenerator = generator; 414 notifyListeners(new RendererChangeEvent(this)); 415 } 416 417 424 public void setSeriesToolTipGenerator(int series, 425 XYToolTipGenerator generator) { 426 this.toolTipGeneratorList.set(series, generator); 427 notifyListeners(new RendererChangeEvent(this)); 428 } 429 430 435 public XYToolTipGenerator getBaseToolTipGenerator() { 436 return this.baseToolTipGenerator; 437 } 438 439 445 public void setBaseToolTipGenerator(XYToolTipGenerator generator) { 446 this.baseToolTipGenerator = generator; 447 notifyListeners(new RendererChangeEvent(this)); 448 } 449 450 452 457 public XYURLGenerator getURLGenerator() { 458 return this.urlGenerator; 459 } 460 461 466 public void setURLGenerator(XYURLGenerator urlGenerator) { 467 this.urlGenerator = urlGenerator; 468 notifyListeners(new RendererChangeEvent(this)); 469 } 470 471 478 public void addAnnotation(XYAnnotation annotation) { 479 addAnnotation(annotation, Layer.FOREGROUND); 481 } 482 483 489 public void addAnnotation(XYAnnotation annotation, Layer layer) { 490 if (annotation == null) { 491 throw new IllegalArgumentException ("Null 'annotation' argument."); 492 } 493 if (layer.equals(Layer.FOREGROUND)) { 494 this.foregroundAnnotations.add(annotation); 495 notifyListeners(new RendererChangeEvent(this)); 496 } 497 else if (layer.equals(Layer.BACKGROUND)) { 498 this.backgroundAnnotations.add(annotation); 499 notifyListeners(new RendererChangeEvent(this)); 500 } 501 else { 502 throw new RuntimeException ("Unknown layer."); 504 } 505 } 506 516 public boolean removeAnnotation(XYAnnotation annotation) { 517 boolean removed = this.foregroundAnnotations.remove(annotation); 518 removed = removed & this.backgroundAnnotations.remove(annotation); 519 notifyListeners(new RendererChangeEvent(this)); 520 return removed; 521 } 522 523 527 public void removeAnnotations() { 528 this.foregroundAnnotations.clear(); 529 this.backgroundAnnotations.clear(); 530 notifyListeners(new RendererChangeEvent(this)); 531 } 532 533 539 public int getDefaultEntityRadius() { 540 return this.defaultEntityRadius; 541 } 542 543 549 public void setDefaultEntityRadius(int radius) { 550 this.defaultEntityRadius = radius; 551 } 552 553 558 public XYSeriesLabelGenerator getLegendItemLabelGenerator() { 559 return this.legendItemLabelGenerator; 560 } 561 562 567 public void setLegendItemLabelGenerator(XYSeriesLabelGenerator generator) { 568 if (generator == null) { 569 throw new IllegalArgumentException ("Null 'generator' argument."); 570 } 571 this.legendItemLabelGenerator = generator; 572 } 573 574 579 public XYSeriesLabelGenerator getLegendItemToolTipGenerator() { 580 return this.legendItemToolTipGenerator; 581 } 582 583 588 public void setLegendItemToolTipGenerator(XYSeriesLabelGenerator generator) 589 { 590 this.legendItemToolTipGenerator = generator; 591 } 592 593 598 public XYSeriesLabelGenerator getLegendItemURLGenerator() { 599 return this.legendItemURLGenerator; 600 } 601 602 607 public void setLegendItemURLGenerator(XYSeriesLabelGenerator generator) 608 { 609 this.legendItemURLGenerator = generator; 610 } 611 612 621 public Range findDomainBounds(XYDataset dataset) { 622 if (dataset != null) { 623 return DatasetUtilities.findDomainBounds(dataset, false); 624 } 625 else { 626 return null; 627 } 628 } 629 630 639 public Range findRangeBounds(XYDataset dataset) { 640 if (dataset != null) { 641 return DatasetUtilities.findRangeBounds(dataset, false); 642 } 643 else { 644 return null; 645 } 646 } 647 648 654 public LegendItemCollection getLegendItems() { 655 if (this.plot == null) { 656 return new LegendItemCollection(); 657 } 658 LegendItemCollection result = new LegendItemCollection(); 659 int index = this.plot.getIndexOf(this); 660 XYDataset dataset = this.plot.getDataset(index); 661 if (dataset != null) { 662 int seriesCount = dataset.getSeriesCount(); 663 for (int i = 0; i < seriesCount; i++) { 664 if (isSeriesVisibleInLegend(i)) { 665 LegendItem item = getLegendItem(index, i); 666 if (item != null) { 667 result.add(item); 668 } 669 } 670 } 671 672 } 673 return result; 674 } 675 676 685 public LegendItem getLegendItem(int datasetIndex, int series) { 686 LegendItem result = null; 687 XYPlot xyplot = getPlot(); 688 if (xyplot != null) { 689 XYDataset dataset = xyplot.getDataset(datasetIndex); 690 if (dataset != null) { 691 String label = this.legendItemLabelGenerator.generateLabel( 692 dataset, series); 693 String description = label; 694 String toolTipText = null; 695 if (getLegendItemToolTipGenerator() != null) { 696 toolTipText = getLegendItemToolTipGenerator().generateLabel( 697 dataset, series); 698 } 699 String urlText = null; 700 if (getLegendItemURLGenerator() != null) { 701 urlText = getLegendItemURLGenerator().generateLabel( 702 dataset, series); 703 } 704 Shape shape = getSeriesShape(series); 705 Paint paint = getSeriesPaint(series); 706 Paint outlinePaint = getSeriesOutlinePaint(series); 707 Stroke outlineStroke = getSeriesOutlineStroke(series); 708 result = new LegendItem(label, description, toolTipText, 709 urlText, shape, paint, outlineStroke, outlinePaint); 710 result.setSeriesIndex(series); 711 result.setDatasetIndex(datasetIndex); 712 } 713 } 714 return result; 715 } 716 717 728 public void fillDomainGridBand(Graphics2D g2, 729 XYPlot plot, 730 ValueAxis axis, 731 Rectangle2D dataArea, 732 double start, double end) { 733 734 double x1 = axis.valueToJava2D(start, dataArea, 735 plot.getDomainAxisEdge()); 736 double x2 = axis.valueToJava2D(end, dataArea, 737 plot.getDomainAxisEdge()); 738 Rectangle2D band = new Rectangle2D.Double (x1, dataArea.getMinY(), 741 x2 - x1, dataArea.getMaxY() - dataArea.getMinY()); 742 Paint paint = plot.getDomainTickBandPaint(); 743 744 if (paint != null) { 745 g2.setPaint(paint); 746 g2.fill(band); 747 } 748 749 } 750 751 762 public void fillRangeGridBand(Graphics2D g2, 763 XYPlot plot, 764 ValueAxis axis, 765 Rectangle2D dataArea, 766 double start, double end) { 767 768 double y1 = axis.valueToJava2D(start, dataArea, 769 plot.getRangeAxisEdge()); 770 double y2 = axis.valueToJava2D(end, dataArea, plot.getRangeAxisEdge()); 771 Rectangle2D band = new Rectangle2D.Double (dataArea.getMinX(), y2, 774 dataArea.getWidth(), y1 - y2); 775 Paint paint = plot.getRangeTickBandPaint(); 776 777 if (paint != null) { 778 g2.setPaint(paint); 779 g2.fill(band); 780 } 781 782 } 783 784 794 public void drawDomainGridLine(Graphics2D g2, 795 XYPlot plot, 796 ValueAxis axis, 797 Rectangle2D dataArea, 798 double value) { 799 800 Range range = axis.getRange(); 801 if (!range.contains(value)) { 802 return; 803 } 804 805 PlotOrientation orientation = plot.getOrientation(); 806 double v = axis.valueToJava2D(value, dataArea, 807 plot.getDomainAxisEdge()); 808 Line2D line = null; 809 if (orientation == PlotOrientation.HORIZONTAL) { 810 line = new Line2D.Double (dataArea.getMinX(), v, 811 dataArea.getMaxX(), v); 812 } 813 else if (orientation == PlotOrientation.VERTICAL) { 814 line = new Line2D.Double (v, dataArea.getMinY(), v, 815 dataArea.getMaxY()); 816 } 817 818 Paint paint = plot.getDomainGridlinePaint(); 819 Stroke stroke = plot.getDomainGridlineStroke(); 820 g2.setPaint(paint != null ? paint : Plot.DEFAULT_OUTLINE_PAINT); 821 g2.setStroke(stroke != null ? stroke : Plot.DEFAULT_OUTLINE_STROKE); 822 g2.draw(line); 823 824 } 825 826 838 public void drawRangeLine(Graphics2D g2, 839 XYPlot plot, 840 ValueAxis axis, 841 Rectangle2D dataArea, 842 double value, 843 Paint paint, 844 Stroke stroke) { 845 846 Range range = axis.getRange(); 847 if (!range.contains(value)) { 848 return; 849 } 850 851 PlotOrientation orientation = plot.getOrientation(); 852 Line2D line = null; 853 double v = axis.valueToJava2D(value, dataArea, plot.getRangeAxisEdge()); 854 if (orientation == PlotOrientation.HORIZONTAL) { 855 line = new Line2D.Double (v, dataArea.getMinY(), v, 856 dataArea.getMaxY()); 857 } 858 else if (orientation == PlotOrientation.VERTICAL) { 859 line = new Line2D.Double (dataArea.getMinX(), v, 860 dataArea.getMaxX(), v); 861 } 862 863 g2.setPaint(paint); 864 g2.setStroke(stroke); 865 g2.draw(line); 866 867 } 868 869  
|