From: <mu...@us...> - 2008-09-01 13:25:17
|
Revision: 1404 http://jfreechart.svn.sourceforge.net/jfreechart/?rev=1404&view=rev Author: mungady Date: 2008-09-01 13:25:14 +0000 (Mon, 01 Sep 2008) Log Message: ----------- Synchronised with 1.0.x branch. Modified Paths: -------------- trunk/source/org/jfree/chart/axis/DateAxis.java trunk/source/org/jfree/data/time/DateRange.java Modified: trunk/source/org/jfree/chart/axis/DateAxis.java =================================================================== --- trunk/source/org/jfree/chart/axis/DateAxis.java 2008-09-01 13:23:41 UTC (rev 1403) +++ trunk/source/org/jfree/chart/axis/DateAxis.java 2008-09-01 13:25:14 UTC (rev 1404) @@ -118,6 +118,7 @@ * 02-Jul-2007 : Added entity support for axis labels (DG); * 12-Jul-2007 : Updated for API changes in super class (DG); * 21-Nov-2007 : Fixed warnings from FindBugs (DG); + * 01-Sep-2008 : Use new methods from DateRange (DG); * */ @@ -704,8 +705,8 @@ value = this.timeline.toTimelineValue((long) value); DateRange range = (DateRange) getRange(); - double axisMin = this.timeline.toTimelineValue(range.getLowerDate()); - double axisMax = this.timeline.toTimelineValue(range.getUpperDate()); + double axisMin = this.timeline.toTimelineValue(range.getLowerMillis()); + double axisMax = this.timeline.toTimelineValue(range.getUpperMillis()); double result = 0.0; if (RectangleEdge.isTopOrBottom(edge)) { double minX = area.getX(); @@ -768,8 +769,8 @@ RectangleEdge edge) { DateRange range = (DateRange) getRange(); - double axisMin = this.timeline.toTimelineValue(range.getLowerDate()); - double axisMax = this.timeline.toTimelineValue(range.getUpperDate()); + double axisMin = this.timeline.toTimelineValue(range.getLowerMillis()); + double axisMax = this.timeline.toTimelineValue(range.getUpperMillis()); double min = 0.0; double max = 0.0; @@ -1282,16 +1283,15 @@ * @param edge the axis location. */ protected void selectHorizontalAutoTickUnit(Graphics2D g2, - Rectangle2D dataArea, - RectangleEdge edge) { + Rectangle2D dataArea, RectangleEdge edge) { long shift = 0; if (this.timeline instanceof SegmentedTimeline) { shift = ((SegmentedTimeline) this.timeline).getStartTime(); } double zero = valueToJava2D(shift + 0.0, dataArea, edge); - double tickLabelWidth - = estimateMaximumTickLabelWidth(g2, getTickUnit()); + double tickLabelWidth = estimateMaximumTickLabelWidth(g2, + getTickUnit()); // start with the current tick unit... TickUnitSource tickUnits = getStandardTickUnits(); Modified: trunk/source/org/jfree/data/time/DateRange.java =================================================================== --- trunk/source/org/jfree/data/time/DateRange.java 2008-09-01 13:23:41 UTC (rev 1403) +++ trunk/source/org/jfree/data/time/DateRange.java 2008-09-01 13:25:14 UTC (rev 1404) @@ -38,6 +38,7 @@ * 07-Oct-2002 : Fixed errors reported by Checkstyle (DG); * 23-Sep-2003 : Minor Javadoc update (DG); * 28-May-2008 : Fixed problem with immutability (DG); + * 01-Sep-2008 : Added getLowerMillis() and getUpperMillis() (DG); * */ @@ -112,21 +113,51 @@ * Returns the lower (earlier) date for the range. * * @return The lower date for the range. + * + * @see #getLowerMillis() */ public Date getLowerDate() { return new Date(this.lowerDate); } /** + * Returns the lower bound of the range in milliseconds. + * + * @return The lower bound. + * + * @see #getLowerDate() + * + * @since 1.0.11 + */ + public long getLowerMillis() { + return this.lowerDate; + } + + /** * Returns the upper (later) date for the range. * * @return The upper date for the range. + * + * @see #getUpperMillis() */ public Date getUpperDate() { return new Date(this.upperDate); } /** + * Returns the upper bound of the range in milliseconds. + * + * @return The upper bound. + * + * @see #getUpperDate() + * + * @since 1.0.11 + */ + public long getUpperMillis() { + return this.upperDate; + } + + /** * Returns a string representing the date range (useful for debugging). * * @return A string representing the date range. @@ -134,7 +165,7 @@ public String toString() { DateFormat df = DateFormat.getDateTimeInstance(); return "[" + df.format(getLowerDate()) + " --> " - + df.format(getUpperDate()) + "]"; + + df.format(getUpperDate()) + "]"; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mu...@us...> - 2008-09-01 14:52:19
|
Revision: 1406 http://jfreechart.svn.sourceforge.net/jfreechart/?rev=1406&view=rev Author: mungady Date: 2008-09-01 14:52:15 +0000 (Mon, 01 Sep 2008) Log Message: ----------- Synchronised with 1.0.x branch. Modified Paths: -------------- trunk/source/org/jfree/chart/axis/DateAxis.java trunk/source/org/jfree/data/time/Month.java Modified: trunk/source/org/jfree/chart/axis/DateAxis.java =================================================================== --- trunk/source/org/jfree/chart/axis/DateAxis.java 2008-09-01 14:47:33 UTC (rev 1405) +++ trunk/source/org/jfree/chart/axis/DateAxis.java 2008-09-01 14:52:15 UTC (rev 1406) @@ -118,7 +118,8 @@ * 02-Jul-2007 : Added entity support for axis labels (DG); * 12-Jul-2007 : Updated for API changes in super class (DG); * 21-Nov-2007 : Fixed warnings from FindBugs (DG); - * 01-Sep-2008 : Use new methods from DateRange (DG); + * 01-Sep-2008 : Use new methods from DateRange, added fix for bug + * 2078057 (DG); * */ @@ -971,6 +972,9 @@ long millis = standardDate.getTime(); if (millis >= date.getTime()) { month = (Month) month.previous(); + // need to peg the month in case the time zone isn't the + // default - see bug 2078057 + month.peg(Calendar.getInstance(this.timeZone)); standardDate = calculateDateForPosition( month, this.tickMarkPosition); } Modified: trunk/source/org/jfree/data/time/Month.java =================================================================== --- trunk/source/org/jfree/data/time/Month.java 2008-09-01 14:47:33 UTC (rev 1405) +++ trunk/source/org/jfree/data/time/Month.java 2008-09-01 14:52:15 UTC (rev 1406) @@ -56,6 +56,7 @@ * 06-Oct-2006 : Refactored to cache first and last millisecond values (DG); * 04-Apr-2007 : Fixed bug in Month(Date, TimeZone) constructor (CB); * 21-Jun-2007 : Removed JCommon dependencies (DG); + * 01-Sep-2008 : Added clarification for previous() and next() methods (DG); * */ @@ -219,7 +220,10 @@ } /** - * Returns the month preceding this one. + * Returns the month preceding this one. Note that the returned + * {@link Month} is "pegged" using the default time-zone, irrespective of + * the time-zone used to peg of the current month (which is not recorded + * anywhere). See the {@link #peg(Calendar)} method. * * @return The month preceding this one. */ @@ -240,7 +244,10 @@ } /** - * Returns the month following this one. + * Returns the month following this one. Note that the returned + * {@link Month} is "pegged" using the default time-zone, irrespective of + * the time-zone used to peg of the current month (which is not recorded + * anywhere). See the {@link #peg(Calendar)} method. * * @return The month following this one. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mu...@us...> - 2008-09-01 19:41:03
|
Revision: 1429 http://jfreechart.svn.sourceforge.net/jfreechart/?rev=1429&view=rev Author: mungady Date: 2008-09-01 19:41:00 +0000 (Mon, 01 Sep 2008) Log Message: ----------- Kill some tabs. Modified Paths: -------------- trunk/source/org/jfree/chart/StandardChartTheme.java trunk/source/org/jfree/data/category/SlidingCategoryDataset.java trunk/source/org/jfree/data/gantt/SlidingGanttCategoryDataset.java trunk/source/org/jfree/data/gantt/TaskSeries.java trunk/source/org/jfree/data/gantt/TaskSeriesCollection.java Modified: trunk/source/org/jfree/chart/StandardChartTheme.java =================================================================== --- trunk/source/org/jfree/chart/StandardChartTheme.java 2008-09-01 19:28:54 UTC (rev 1428) +++ trunk/source/org/jfree/chart/StandardChartTheme.java 2008-09-01 19:41:00 UTC (rev 1429) @@ -111,67 +111,67 @@ public class StandardChartTheme implements ChartTheme, Cloneable, PublicCloneable, Serializable { - /** The name of this theme. */ - private String name; + /** The name of this theme. */ + private String name; - /** - * The largest font size. Use for the main chart title. - */ - private Font extraLargeFont; + /** + * The largest font size. Use for the main chart title. + */ + private Font extraLargeFont; - /** - * A large font. Used for subtitles. - */ - private Font largeFont; + /** + * A large font. Used for subtitles. + */ + private Font largeFont; - /** - * The regular font size. Used for axis tick labels, legend items etc. - */ - private Font regularFont; + /** + * The regular font size. Used for axis tick labels, legend items etc. + */ + private Font regularFont; - /** The paint used to display the main chart title. */ - private transient Paint titlePaint; + /** The paint used to display the main chart title. */ + private transient Paint titlePaint; - /** The paint used to display subtitles. */ - private transient Paint subtitlePaint; + /** The paint used to display subtitles. */ + private transient Paint subtitlePaint; - /** The background paint for the chart. */ - private transient Paint chartBackgroundPaint; + /** The background paint for the chart. */ + private transient Paint chartBackgroundPaint; /** The legend background paint. */ - private transient Paint legendBackgroundPaint; + private transient Paint legendBackgroundPaint; - /** The legend item paint. */ - private transient Paint legendItemPaint; + /** The legend item paint. */ + private transient Paint legendItemPaint; - /** The drawing supplier. */ - private DrawingSupplier drawingSupplier; + /** The drawing supplier. */ + private DrawingSupplier drawingSupplier; - /** The background paint for the plot. */ - private transient Paint plotBackgroundPaint; + /** The background paint for the plot. */ + private transient Paint plotBackgroundPaint; - /** The plot outline paint. */ - private transient Paint plotOutlinePaint; + /** The plot outline paint. */ + private transient Paint plotOutlinePaint; - /** The label link style for pie charts. */ - private PieLabelLinkStyle labelLinkStyle; + /** The label link style for pie charts. */ + private PieLabelLinkStyle labelLinkStyle; - /** The label link paint for pie charts. */ - private transient Paint labelLinkPaint; + /** The label link paint for pie charts. */ + private transient Paint labelLinkPaint; - /** The domain grid line paint. */ - private transient Paint domainGridlinePaint; + /** The domain grid line paint. */ + private transient Paint domainGridlinePaint; - /** The range grid line paint. */ - private transient Paint rangeGridlinePaint; + /** The range grid line paint. */ + private transient Paint rangeGridlinePaint; - /** The axis offsets. */ - private RectangleInsets axisOffset; + /** The axis offsets. */ + private RectangleInsets axisOffset; - /** The axis label paint. */ - private transient Paint axisLabelPaint; + /** The axis label paint. */ + private transient Paint axisLabelPaint; - /** The tick label paint. */ + /** The tick label paint. */ private transient Paint tickLabelPaint; /** The item label paint. */ @@ -211,1464 +211,1464 @@ private transient Paint gridBandAlternatePaint = SymbolAxis.DEFAULT_GRID_BAND_ALTERNATE_PAINT; - /** - * Creates and returns the default 'JFree' chart theme. - * - * @return A chart theme. - */ - public static ChartTheme createJFreeTheme() { - return new StandardChartTheme("JFree"); - } + /** + * Creates and returns the default 'JFree' chart theme. + * + * @return A chart theme. + */ + public static ChartTheme createJFreeTheme() { + return new StandardChartTheme("JFree"); + } - /** - * Creates and returns a theme called "Darkness". In this theme, the - * charts have a black background. - * - * @return The "Darkness" theme. - */ - public static ChartTheme createDarknessTheme() { - StandardChartTheme theme = new StandardChartTheme("Darkness"); - theme.titlePaint = Color.white; - theme.subtitlePaint = Color.white; - theme.legendBackgroundPaint = Color.black; - theme.legendItemPaint = Color.white; - theme.chartBackgroundPaint = Color.black; - theme.plotBackgroundPaint = Color.black; - theme.plotOutlinePaint = Color.yellow; - theme.labelLinkPaint = Color.lightGray; - theme.tickLabelPaint = Color.white; - theme.axisLabelPaint = Color.white; - theme.shadowPaint = Color.darkGray; - theme.itemLabelPaint = Color.white; - theme.drawingSupplier = new DefaultDrawingSupplier( - new Paint[] { Color.decode("0xFFFF00"), - Color.decode("0x0036CC"), Color.decode("0xFF0000"), - Color.decode("0xFFFF7F"), Color.decode("0x6681CC"), - Color.decode("0xFF7F7F"), Color.decode("0xFFFFBF"), - Color.decode("0x99A6CC"), Color.decode("0xFFBFBF"), - Color.decode("0xA9A938"), Color.decode("0x2D4587")}, - new Paint[] { Color.decode("0xFFFF00"), - Color.decode("0x0036CC")}, - new Stroke[] { new BasicStroke(2.0f)}, - new Stroke[] { new BasicStroke(0.5f)}, - DefaultDrawingSupplier.DEFAULT_SHAPE_SEQUENCE); - theme.wallPaint = Color.darkGray; - theme.errorIndicatorPaint = Color.lightGray; - theme.gridBandPaint = new Color(255, 255, 255, 20); - theme.gridBandAlternatePaint = new Color(255, 255, 255, 40); - return theme; - } /** + * Creates and returns a theme called "Darkness". In this theme, the + * charts have a black background. + * + * @return The "Darkness" theme. + */ + public static ChartTheme createDarknessTheme() { + StandardChartTheme theme = new StandardChartTheme("Darkness"); + theme.titlePaint = Color.white; + theme.subtitlePaint = Color.white; + theme.legendBackgroundPaint = Color.black; + theme.legendItemPaint = Color.white; + theme.chartBackgroundPaint = Color.black; + theme.plotBackgroundPaint = Color.black; + theme.plotOutlinePaint = Color.yellow; + theme.labelLinkPaint = Color.lightGray; + theme.tickLabelPaint = Color.white; + theme.axisLabelPaint = Color.white; + theme.shadowPaint = Color.darkGray; + theme.itemLabelPaint = Color.white; + theme.drawingSupplier = new DefaultDrawingSupplier( + new Paint[] { Color.decode("0xFFFF00"), + Color.decode("0x0036CC"), Color.decode("0xFF0000"), + Color.decode("0xFFFF7F"), Color.decode("0x6681CC"), + Color.decode("0xFF7F7F"), Color.decode("0xFFFFBF"), + Color.decode("0x99A6CC"), Color.decode("0xFFBFBF"), + Color.decode("0xA9A938"), Color.decode("0x2D4587")}, + new Paint[] { Color.decode("0xFFFF00"), + Color.decode("0x0036CC")}, + new Stroke[] { new BasicStroke(2.0f)}, + new Stroke[] { new BasicStroke(0.5f)}, + DefaultDrawingSupplier.DEFAULT_SHAPE_SEQUENCE); + theme.wallPaint = Color.darkGray; + theme.errorIndicatorPaint = Color.lightGray; + theme.gridBandPaint = new Color(255, 255, 255, 20); + theme.gridBandAlternatePaint = new Color(255, 255, 255, 40); + return theme; + } + /** * Creates and returns a {@link ChartTheme} that doesn't apply any changes * to the JFreeChart defaults. This produces the "legacy" look for * JFreeChart. * * @return A legacy theme. */ - public static ChartTheme createLegacyTheme() { - StandardChartTheme theme = new StandardChartTheme("Legacy") { - public void apply(JFreeChart chart) { - // do nothing at all - } - }; - return theme; - } + public static ChartTheme createLegacyTheme() { + StandardChartTheme theme = new StandardChartTheme("Legacy") { + public void apply(JFreeChart chart) { + // do nothing at all + } + }; + return theme; + } - /** - * Creates a new default instance. - * - * @param name the name of the theme (<code>null</code> not permitted). - */ - public StandardChartTheme(String name) { - if (name == null) { - throw new IllegalArgumentException("Null 'name' argument."); - } - this.name = name; - this.extraLargeFont = new Font("Tahoma", Font.BOLD, 20); - this.largeFont = new Font("Tahoma", Font.BOLD, 14); - this.regularFont = new Font("Tahoma", Font.PLAIN, 12); + /** + * Creates a new default instance. + * + * @param name the name of the theme (<code>null</code> not permitted). + */ + public StandardChartTheme(String name) { + if (name == null) { + throw new IllegalArgumentException("Null 'name' argument."); + } + this.name = name; + this.extraLargeFont = new Font("Tahoma", Font.BOLD, 20); + this.largeFont = new Font("Tahoma", Font.BOLD, 14); + this.regularFont = new Font("Tahoma", Font.PLAIN, 12); - this.titlePaint = Color.black; - this.subtitlePaint = Color.black; - this.legendBackgroundPaint = Color.white; - this.legendItemPaint = Color.darkGray; - this.chartBackgroundPaint = Color.white; - this.drawingSupplier = new DefaultDrawingSupplier(); - this.plotBackgroundPaint = Color.lightGray; - this.plotOutlinePaint = Color.black; - this.labelLinkPaint = Color.black; - this.labelLinkStyle = PieLabelLinkStyle.CUBIC_CURVE; - this.axisOffset = new RectangleInsets(4, 4, 4, 4); - this.domainGridlinePaint = Color.white; - this.rangeGridlinePaint = Color.white; - this.axisLabelPaint = Color.darkGray; - this.tickLabelPaint = Color.darkGray; - this.barPainter = new GradientBarPainter(); - this.xyBarPainter = new GradientXYBarPainter(); - this.shadowVisible = true; - this.shadowPaint = Color.gray; - this.itemLabelPaint = Color.black; - this.thermometerPaint = Color.white; - this.wallPaint = BarRenderer3D.DEFAULT_WALL_PAINT; - this.errorIndicatorPaint = Color.black; - } + this.titlePaint = Color.black; + this.subtitlePaint = Color.black; + this.legendBackgroundPaint = Color.white; + this.legendItemPaint = Color.darkGray; + this.chartBackgroundPaint = Color.white; + this.drawingSupplier = new DefaultDrawingSupplier(); + this.plotBackgroundPaint = Color.lightGray; + this.plotOutlinePaint = Color.black; + this.labelLinkPaint = Color.black; + this.labelLinkStyle = PieLabelLinkStyle.CUBIC_CURVE; + this.axisOffset = new RectangleInsets(4, 4, 4, 4); + this.domainGridlinePaint = Color.white; + this.rangeGridlinePaint = Color.white; + this.axisLabelPaint = Color.darkGray; + this.tickLabelPaint = Color.darkGray; + this.barPainter = new GradientBarPainter(); + this.xyBarPainter = new GradientXYBarPainter(); + this.shadowVisible = true; + this.shadowPaint = Color.gray; + this.itemLabelPaint = Color.black; + this.thermometerPaint = Color.white; + this.wallPaint = BarRenderer3D.DEFAULT_WALL_PAINT; + this.errorIndicatorPaint = Color.black; + } - /** - * Returns the largest font for this theme. - * - * @return The largest font for this theme. - * - * @see #setExtraLargeFont(Font) - */ - public Font getExtraLargeFont() { - return this.extraLargeFont; - } + /** + * Returns the largest font for this theme. + * + * @return The largest font for this theme. + * + * @see #setExtraLargeFont(Font) + */ + public Font getExtraLargeFont() { + return this.extraLargeFont; + } - /** - * Sets the largest font for this theme. - * - * @param font the font (<code>null</code> not permitted). - * - * @see #getExtraLargeFont() - */ - public void setExtraLargeFont(Font font) { - if (font == null) { - throw new IllegalArgumentException("Null 'font' argument."); - } - this.extraLargeFont = font; - } + /** + * Sets the largest font for this theme. + * + * @param font the font (<code>null</code> not permitted). + * + * @see #getExtraLargeFont() + */ + public void setExtraLargeFont(Font font) { + if (font == null) { + throw new IllegalArgumentException("Null 'font' argument."); + } + this.extraLargeFont = font; + } - /** - * Returns the large font for this theme. - * - * @return The large font (never <code>null</code>). - * - * @see #setLargeFont(Font) - */ - public Font getLargeFont() { - return this.largeFont; - } + /** + * Returns the large font for this theme. + * + * @return The large font (never <code>null</code>). + * + * @see #setLargeFont(Font) + */ + public Font getLargeFont() { + return this.largeFont; + } - /** - * Sets the large font for this theme. - * - * @param font the font (<code>null</code> not permitted). - * - * @see #getLargeFont() - */ - public void setLargeFont(Font font) { - this.largeFont = font; - } + /** + * Sets the large font for this theme. + * + * @param font the font (<code>null</code> not permitted). + * + * @see #getLargeFont() + */ + public void setLargeFont(Font font) { + this.largeFont = font; + } - /** - * Returns the regular font. - * - * @return The regular font (never <code>null</code>). - * - * @see #setRegularFont(Font) - */ - public Font getRegularFont() { - return this.regularFont; - } + /** + * Returns the regular font. + * + * @return The regular font (never <code>null</code>). + * + * @see #setRegularFont(Font) + */ + public Font getRegularFont() { + return this.regularFont; + } - /** - * Sets the regular font for this theme. - * - * @param font the font (<code>null</code> not permitted). - * - * @see #getRegularFont() - */ - public void setRegularFont(Font font) { - this.regularFont = font; - } + /** + * Sets the regular font for this theme. + * + * @param font the font (<code>null</code> not permitted). + * + * @see #getRegularFont() + */ + public void setRegularFont(Font font) { + this.regularFont = font; + } - /** - * Returns the title paint. - * - * @return The title paint (never <code>null</code>). - * - * @see #setTitlePaint(Paint) - */ - public Paint getTitlePaint() { - return this.titlePaint; - } + /** + * Returns the title paint. + * + * @return The title paint (never <code>null</code>). + * + * @see #setTitlePaint(Paint) + */ + public Paint getTitlePaint() { + return this.titlePaint; + } - /** - * Sets the title paint. - * - * @param paint the paint (<code>null</code> not permitted). - * - * @see #getTitlePaint() - */ - public void setTitlePaint(Paint paint) { - if (paint == null) { - throw new IllegalArgumentException("Null 'paint' argument."); - } - this.titlePaint = paint; - } + /** + * Sets the title paint. + * + * @param paint the paint (<code>null</code> not permitted). + * + * @see #getTitlePaint() + */ + public void setTitlePaint(Paint paint) { + if (paint == null) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.titlePaint = paint; + } - /** - * Returns the subtitle paint. - * - * @return The subtitle paint (never <code>null</code>). - * - * @see #setSubtitlePaint(Paint) - */ - public Paint getSubtitlePaint() { - return this.subtitlePaint; - } + /** + * Returns the subtitle paint. + * + * @return The subtitle paint (never <code>null</code>). + * + * @see #setSubtitlePaint(Paint) + */ + public Paint getSubtitlePaint() { + return this.subtitlePaint; + } - /** - * Sets the subtitle paint. - * - * @param paint the paint (<code>null</code> not permitted). - * - * @see #getSubtitlePaint() - */ - public void setSubtitlePaint(Paint paint) { - if (paint == null) { - throw new IllegalArgumentException("Null 'paint' argument."); - } - this.subtitlePaint = paint; - } + /** + * Sets the subtitle paint. + * + * @param paint the paint (<code>null</code> not permitted). + * + * @see #getSubtitlePaint() + */ + public void setSubtitlePaint(Paint paint) { + if (paint == null) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.subtitlePaint = paint; + } - /** - * Returns the chart background paint. - * - * @return The chart background paint (never <code>null</code>). - * - * @see #setChartBackgroundPaint(Paint) - */ - public Paint getChartBackgroundPaint() { - return this.chartBackgroundPaint; - } + /** + * Returns the chart background paint. + * + * @return The chart background paint (never <code>null</code>). + * + * @see #setChartBackgroundPaint(Paint) + */ + public Paint getChartBackgroundPaint() { + return this.chartBackgroundPaint; + } - /** - * Sets the chart background paint. - * - * @param paint the paint (<code>null</code> not permitted). - * - * @see #getChartBackgroundPaint() - */ - public void setChartBackgroundPaint(Paint paint) { - if (paint == null) { - throw new IllegalArgumentException("Null 'paint' argument."); - } - this.chartBackgroundPaint = paint; - } + /** + * Sets the chart background paint. + * + * @param paint the paint (<code>null</code> not permitted). + * + * @see #getChartBackgroundPaint() + */ + public void setChartBackgroundPaint(Paint paint) { + if (paint == null) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.chartBackgroundPaint = paint; + } - /** - * Returns the legend background paint. - * - * @return The legend background paint (never <code>null</code>). - * - * @see #setLegendBackgroundPaint(Paint) - */ - public Paint getLegendBackgroundPaint() { - return this.legendBackgroundPaint; - } + /** + * Returns the legend background paint. + * + * @return The legend background paint (never <code>null</code>). + * + * @see #setLegendBackgroundPaint(Paint) + */ + public Paint getLegendBackgroundPaint() { + return this.legendBackgroundPaint; + } - /** - * Sets the legend background paint. - * - * @param paint the paint (<code>null</code> not permitted). - * - * @see #getLegendBackgroundPaint() - */ - public void setLegendBackgroundPaint(Paint paint) { - if (paint == null) { - throw new IllegalArgumentException("Null 'paint' argument."); - } - this.legendBackgroundPaint = paint; - } + /** + * Sets the legend background paint. + * + * @param paint the paint (<code>null</code> not permitted). + * + * @see #getLegendBackgroundPaint() + */ + public void setLegendBackgroundPaint(Paint paint) { + if (paint == null) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.legendBackgroundPaint = paint; + } - /** - * Returns the legend item paint. - * - * @return The legend item paint (never <code>null</code>). - * - * @see #setLegendItemPaint(Paint) - */ - public Paint getLegendItemPaint() { - return this.legendItemPaint; - } + /** + * Returns the legend item paint. + * + * @return The legend item paint (never <code>null</code>). + * + * @see #setLegendItemPaint(Paint) + */ + public Paint getLegendItemPaint() { + return this.legendItemPaint; + } - /** - * Sets the legend item paint. - * - * @param paint the paint (<code>null</code> not permitted). - * - * @see #getLegendItemPaint() - */ - public void setLegendItemPaint(Paint paint) { - if (paint == null) { - throw new IllegalArgumentException("Null 'paint' argument."); - } - this.legendItemPaint = paint; - } + /** + * Sets the legend item paint. + * + * @param paint the paint (<code>null</code> not permitted). + * + * @see #getLegendItemPaint() + */ + public void setLegendItemPaint(Paint paint) { + if (paint == null) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.legendItemPaint = paint; + } - /** - * Returns the plot background paint. - * - * @return The plot background paint (never <code>null</code>). - * - * @see #setPlotBackgroundPaint(Paint) - */ - public Paint getPlotBackgroundPaint() { - return this.plotBackgroundPaint; - } + /** + * Returns the plot background paint. + * + * @return The plot background paint (never <code>null</code>). + * + * @see #setPlotBackgroundPaint(Paint) + */ + public Paint getPlotBackgroundPaint() { + return this.plotBackgroundPaint; + } - /** - * Sets the plot background paint. - * - * @param paint the paint (<code>null</code> not permitted). - * - * @see #getPlotBackgroundPaint() - */ - public void setPlotBackgroundPaint(Paint paint) { - if (paint == null) { - throw new IllegalArgumentException("Null 'paint' argument."); - } - this.plotBackgroundPaint = paint; - } + /** + * Sets the plot background paint. + * + * @param paint the paint (<code>null</code> not permitted). + * + * @see #getPlotBackgroundPaint() + */ + public void setPlotBackgroundPaint(Paint paint) { + if (paint == null) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.plotBackgroundPaint = paint; + } - /** - * Returns the plot outline paint. - * - * @return The plot outline paint (never <code>null</code>). - * - * @see #setPlotOutlinePaint(Paint) - */ - public Paint getPlotOutlinePaint() { - return this.plotOutlinePaint; - } + /** + * Returns the plot outline paint. + * + * @return The plot outline paint (never <code>null</code>). + * + * @see #setPlotOutlinePaint(Paint) + */ + public Paint getPlotOutlinePaint() { + return this.plotOutlinePaint; + } - /** - * Sets the plot outline paint. - * - * @param paint the paint (<code>null</code> not permitted). - * - * @see #getPlotOutlinePaint() - */ - public void setPlotOutlinePaint(Paint paint) { - if (paint == null) { - throw new IllegalArgumentException("Null 'paint' argument."); - } - this.plotOutlinePaint = paint; - } + /** + * Sets the plot outline paint. + * + * @param paint the paint (<code>null</code> not permitted). + * + * @see #getPlotOutlinePaint() + */ + public void setPlotOutlinePaint(Paint paint) { + if (paint == null) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.plotOutlinePaint = paint; + } - /** - * Returns the label link style for pie charts. - * - * @return The label link style (never <code>null</code>). - * - * @see #setLabelLinkStyle(PieLabelLinkStyle) - */ - public PieLabelLinkStyle getLabelLinkStyle() { - return this.labelLinkStyle; - } + /** + * Returns the label link style for pie charts. + * + * @return The label link style (never <code>null</code>). + * + * @see #setLabelLinkStyle(PieLabelLinkStyle) + */ + public PieLabelLinkStyle getLabelLinkStyle() { + return this.labelLinkStyle; + } - /** - * Sets the label link style for pie charts. - * - * @param style the style (<code>null</code> not permitted). - * - * @see #getLabelLinkStyle() - */ - public void setLabelLinkStyle(PieLabelLinkStyle style) { - if (style == null) { - throw new IllegalArgumentException("Null 'style' argument."); - } - this.labelLinkStyle = style; - } + /** + * Sets the label link style for pie charts. + * + * @param style the style (<code>null</code> not permitted). + * + * @see #getLabelLinkStyle() + */ + public void setLabelLinkStyle(PieLabelLinkStyle style) { + if (style == null) { + throw new IllegalArgumentException("Null 'style' argument."); + } + this.labelLinkStyle = style; + } - /** - * Returns the label link paint for pie charts. - * - * @return The label link paint (never <code>null</code>). - * - * @see #setLabelLinkPaint(Paint) - */ - public Paint getLabelLinkPaint() { - return this.labelLinkPaint; - } + /** + * Returns the label link paint for pie charts. + * + * @return The label link paint (never <code>null</code>). + * + * @see #setLabelLinkPaint(Paint) + */ + public Paint getLabelLinkPaint() { + return this.labelLinkPaint; + } - /** - * Sets the label link paint for pie charts. - * - * @param paint the paint (<code>null</code> not permitted). - * - * @see #getLabelLinkPaint() - */ - public void setLabelLinkPaint(Paint paint) { - if (paint == null) { - throw new IllegalArgumentException("Null 'paint' argument."); - } - this.labelLinkPaint = paint; - } + /** + * Sets the label link paint for pie charts. + * + * @param paint the paint (<code>null</code> not permitted). + * + * @see #getLabelLinkPaint() + */ + public void setLabelLinkPaint(Paint paint) { + if (paint == null) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.labelLinkPaint = paint; + } - /** - * Returns the domain grid line paint. - * - * @return The domain grid line paint (never <code>null<code>). - * - * @see #setDomainGridlinePaint(Paint) - */ - public Paint getDomainGridlinePaint() { - return this.domainGridlinePaint; - } + /** + * Returns the domain grid line paint. + * + * @return The domain grid line paint (never <code>null<code>). + * + * @see #setDomainGridlinePaint(Paint) + */ + public Paint getDomainGridlinePaint() { + return this.domainGridlinePaint; + } - /** - * Sets the domain grid line paint. - * - * @param paint the paint (<code>null</code> not permitted). - * - * @see #getDomainGridlinePaint() - */ - public void setDomainGridlinePaint(Paint paint) { - if (paint == null) { - throw new IllegalArgumentException("Null 'paint' argument."); - } - this.domainGridlinePaint = paint; - } + /** + * Sets the domain grid line paint. + * + * @param paint the paint (<code>null</code> not permitted). + * + * @see #getDomainGridlinePaint() + */ + public void setDomainGridlinePaint(Paint paint) { + if (paint == null) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.domainGridlinePaint = paint; + } - /** - * Returns the range grid line paint. - * - * @return The range grid line paint (never <code>null</code>). - * - * @see #setRangeGridlinePaint(Paint) - */ - public Paint getRangeGridlinePaint() { - return this.rangeGridlinePaint; - } + /** + * Returns the range grid line paint. + * + * @return The range grid line paint (never <code>null</code>). + * + * @see #setRangeGridlinePaint(Paint) + */ + public Paint getRangeGridlinePaint() { + return this.rangeGridlinePaint; + } - /** - * Sets the range grid line paint. - * - * @param paint the paint (<code>null</code> not permitted). - * - * @see #getRangeGridlinePaint() - */ - public void setRangeGridlinePaint(Paint paint) { - if (paint == null) { - throw new IllegalArgumentException("Null 'paint' argument."); - } - this.rangeGridlinePaint = paint; - } + /** + * Sets the range grid line paint. + * + * @param paint the paint (<code>null</code> not permitted). + * + * @see #getRangeGridlinePaint() + */ + public void setRangeGridlinePaint(Paint paint) { + if (paint == null) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.rangeGridlinePaint = paint; + } - /** - * Returns the axis offsets. - * - * @return The axis offsets (never <code>null</code>). - * - * @see #setAxisOffset(RectangleInsets) - */ - public RectangleInsets getAxisOffset() { - return this.axisOffset; - } + /** + * Returns the axis offsets. + * + * @return The axis offsets (never <code>null</code>). + * + * @see #setAxisOffset(RectangleInsets) + */ + public RectangleInsets getAxisOffset() { + return this.axisOffset; + } - /** - * Sets the axis offset. - * - * @param offset the offset (<code>null</code> not permitted). - * - * @see #getAxisOffset() - */ - public void setAxisOffset(RectangleInsets offset) { - if (offset == null) { - throw new IllegalArgumentException("Null 'offset' argument."); - } - this.axisOffset = offset; - } + /** + * Sets the axis offset. + * + * @param offset the offset (<code>null</code> not permitted). + * + * @see #getAxisOffset() + */ + public void setAxisOffset(RectangleInsets offset) { + if (offset == null) { + throw new IllegalArgumentException("Null 'offset' argument."); + } + this.axisOffset = offset; + } - /** - * Returns the axis label paint. - * - * @return The axis label paint (never <code>null</code>). - * - * @see #setAxisLabelPaint(Paint) - */ - public Paint getAxisLabelPaint() { - return this.axisLabelPaint; - } + /** + * Returns the axis label paint. + * + * @return The axis label paint (never <code>null</code>). + * + * @see #setAxisLabelPaint(Paint) + */ + public Paint getAxisLabelPaint() { + return this.axisLabelPaint; + } - /** - * Sets the axis label paint. - * - * @param paint the paint (<code>null</code> not permitted). - * - * @see #getAxisLabelPaint() - */ - public void setAxisLabelPaint(Paint paint) { - if (paint == null) { - throw new IllegalArgumentException("Null 'paint' argument."); - } - this.axisLabelPaint = paint; - } + /** + * Sets the axis label paint. + * + * @param paint the paint (<code>null</code> not permitted). + * + * @see #getAxisLabelPaint() + */ + public void setAxisLabelPaint(Paint paint) { + if (paint == null) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.axisLabelPaint = paint; + } - /** - * Returns the tick label paint. - * - * @return The tick label paint (never <code>null</code>). - * - * @see #setTickLabelPaint(Paint) - */ - public Paint getTickLabelPaint() { - return this.tickLabelPaint; - } + /** + * Returns the tick label paint. + * + * @return The tick label paint (never <code>null</code>). + * + * @see #setTickLabelPaint(Paint) + */ + public Paint getTickLabelPaint() { + return this.tickLabelPaint; + } - /** - * Sets the tick label paint. - * - * @param paint the paint (<code>null</code> not permitted). - * - * @see #getTickLabelPaint() - */ - public void setTickLabelPaint(Paint paint) { - if (paint == null) { - throw new IllegalArgumentException("Null 'paint' argument."); - } - this.tickLabelPaint = paint; - } + /** + * Sets the tick label paint. + * + * @param paint the paint (<code>null</code> not permitted). + * + * @see #getTickLabelPaint() + */ + public void setTickLabelPaint(Paint paint) { + if (paint == null) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.tickLabelPaint = paint; + } - /** - * Returns the item label paint. - * - * @return The item label paint (never <code>null</code>). - * - * @see #setItemLabelPaint(Paint) - */ - public Paint getItemLabelPaint() { - return this.itemLabelPaint; - } + /** + * Returns the item label paint. + * + * @return The item label paint (never <code>null</code>). + * + * @see #setItemLabelPaint(Paint) + */ + public Paint getItemLabelPaint() { + return this.itemLabelPaint; + } - /** - * Sets the item label paint. - * - * @param paint the paint (<code>null</code> not permitted). - * - * @see #getItemLabelPaint() - */ - public void setItemLabelPaint(Paint paint) { - if (paint == null) { - throw new IllegalArgumentException("Null 'paint' argument."); - } - this.itemLabelPaint = paint; - } + /** + * Sets the item label paint. + * + * @param paint the paint (<code>null</code> not permitted). + * + * @see #getItemLabelPaint() + */ + public void setItemLabelPaint(Paint paint) { + if (paint == null) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.itemLabelPaint = paint; + } - /** - * Returns the shadow visibility flag. - * - * @return The shadow visibility flag. - * - * @see #setShadowVisible(boolean) - */ - public boolean isShadowVisible() { - return this.shadowVisible; - } + /** + * Returns the shadow visibility flag. + * + * @return The shadow visibility flag. + * + * @see #setShadowVisible(boolean) + */ + public boolean isShadowVisible() { + return this.shadowVisible; + } - /** - * Sets the shadow visibility flag. - * - * @param visible the flag. - * - * @see #isShadowVisible() - */ - public void setShadowVisible(boolean visible) { - this.shadowVisible = visible; - } + /** + * Sets the shadow visibility flag. + * + * @param visible the flag. + * + * @see #isShadowVisible() + */ + public void setShadowVisible(boolean visible) { + this.shadowVisible = visible; + } - /** - * Returns the shadow paint. - * - * @return The shadow paint (never <code>null</code>). - * - * @see #setShadowPaint(Paint) - */ - public Paint getShadowPaint() { - return this.shadowPaint; - } + /** + * Returns the shadow paint. + * + * @return The shadow paint (never <code>null</code>). + * + * @see #setShadowPaint(Paint) + */ + public Paint getShadowPaint() { + return this.shadowPaint; + } - /** - * Sets the shadow paint. - * - * @param paint the paint (<code>null</code> not permitted). - * - * @see #getShadowPaint() - */ - public void setShadowPaint(Paint paint) { - if (paint == null) { - throw new IllegalArgumentException("Null 'paint' argument."); - } - this.shadowPaint = paint; - } + /** + * Sets the shadow paint. + * + * @param paint the paint (<code>null</code> not permitted). + * + * @see #getShadowPaint() + */ + public void setShadowPaint(Paint paint) { + if (paint == null) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.shadowPaint = paint; + } - /** - * Returns the bar painter. - * - * @return The bar painter (never <code>null</code>). - * - * @see #setBarPainter(BarPainter) - */ - public BarPainter getBarPainter() { - return this.barPainter; - } + /** + * Returns the bar painter. + * + * @return The bar painter (never <code>null</code>). + * + * @see #setBarPainter(BarPainter) + */ + public BarPainter getBarPainter() { + return this.barPainter; + } - /** - * Sets the bar painter. - * - * @param painter the painter (<code>null</code> not permitted). - * - * @see #getBarPainter() - */ - public void setBarPainter(BarPainter painter) { - if (painter == null) { - throw new IllegalArgumentException("Null 'painter' argument."); - } - this.barPainter = painter; - } + /** + * Sets the bar painter. + * + * @param painter the painter (<code>null</code> not permitted). + * + * @see #getBarPainter() + */ + public void setBarPainter(BarPainter painter) { + if (painter == null) { + throw new IllegalArgumentException("Null 'painter' argument."); + } + this.barPainter = painter; + } - /** - * Returns the XY bar painter. - * - * @return The XY bar painter (never <code>null</code>). - * - * @see #setXYBarPainter(XYBarPainter) - */ - public XYBarPainter getXYBarPainter() { - return this.xyBarPainter; - } + /** + * Returns the XY bar painter. + * + * @return The XY bar painter (never <code>null</code>). + * + * @see #setXYBarPainter(XYBarPainter) + */ + public XYBarPainter getXYBarPainter() { + return this.xyBarPainter; + } - /** - * Sets the XY bar painter. - * - * @param painter the painter (<code>null</code> not permitted). - * - * @see #getXYBarPainter() - */ - public void setXYBarPainter(XYBarPainter painter) { - if (painter == null) { - throw new IllegalArgumentException("Null 'painter' argument."); - } - this.xyBarPainter = painter; - } + /** + * Sets the XY bar painter. + * + * @param painter the painter (<code>null</code> not permitted). + * + * @see #getXYBarPainter() + */ + public void setXYBarPainter(XYBarPainter painter) { + if (painter == null) { + throw new IllegalArgumentException("Null 'painter' argument."); + } + this.xyBarPainter = painter; + } - /** - * Returns the thermometer paint. - * - * @return The thermometer paint (never <code>null</code>). - * - * @see #setThermometerPaint(Paint) - */ - public Paint getThermometerPaint() { - return this.thermometerPaint; - } + /** + * Returns the thermometer paint. + * + * @return The thermometer paint (never <code>null</code>). + * + * @see #setThermometerPaint(Paint) + */ + public Paint getThermometerPaint() { + return this.thermometerPaint; + } - /** - * Sets the thermometer paint. - * - * @param paint the paint (<code>null</code> not permitted). - * - * @see #getThermometerPaint() - */ - public void setThermometerPaint(Paint paint) { - if (paint == null) { - throw new IllegalArgumentException("Null 'paint' argument."); - } - this.thermometerPaint = paint; - } + /** + * Sets the thermometer paint. + * + * @param paint the paint (<code>null</code> not permitted). + * + * @see #getThermometerPaint() + */ + public void setThermometerPaint(Paint paint) { + if (paint == null) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.thermometerPaint = paint; + } - /** - * Returns the wall paint for charts with a 3D effect. - * - * @return The wall paint (never <code>null</code>). - * - * @see #setWallPaint(Paint) - */ - public Paint getWallPaint() { - return this.wallPaint; - } + /** + * Returns the wall paint for charts with a 3D effect. + * + * @return The wall paint (never <code>null</code>). + * + * @see #setWallPaint(Paint) + */ + public Paint getWallPaint() { + return this.wallPaint; + } - /** - * Sets the wall paint for charts with a 3D effect. - * - * @param paint the paint (<code>null</code> not permitted). - * - * @see #getWallPaint() - */ - public void setWallPaint(Paint paint) { - if (paint == null) { - throw new IllegalArgumentException("Null 'paint' argument."); - } - this.wallPaint = paint; - } + /** + * Sets the wall paint for charts with a 3D effect. + * + * @param paint the paint (<code>null</code> not permitted). + * + * @see #getWallPaint() + */ + public void setWallPaint(Paint paint) { + if (paint == null) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.wallPaint = paint; + } - /** - * Returns the error indicator paint. - * - * @return The error indicator paint (never <code>null</code>). - * - * @see #setErrorIndicatorPaint(Paint) - */ - public Paint getErrorIndicatorPaint() { - return this.errorIndicatorPaint; - } + /** + * Returns the error indicator paint. + * + * @return The error indicator paint (never <code>null</code>). + * + * @see #setErrorIndicatorPaint(Paint) + */ + public Paint getErrorIndicatorPaint() { + return this.errorIndicatorPaint; + } - /** - * Sets the error indicator paint. - * - * @param paint the paint (<code>null</code> not permitted). - * - * @see #getErrorIndicatorPaint() - */ - public void setErrorIndicatorPaint(Paint paint) { - if (paint == null) { - throw new IllegalArgumentException("Null 'paint' argument."); - } - this.errorIndicatorPaint = paint; - } + /** + * Sets the error indicator paint. + * + * @param paint the paint (<code>null</code> not permitted). + * + * @see #getErrorIndicatorPaint() + */ + public void setErrorIndicatorPaint(Paint paint) { + if (paint == null) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.errorIndicatorPaint = paint; + } - /** - * Returns the grid band paint. - * - * @return The grid band paint (never <code>null</code>). - * - * @see #setGridBandPaint(Paint) - */ - public Paint getGridBandPaint() { - return this.gridBandPaint; - } + /** + * Returns the grid band paint. + * + * @return The grid band paint (never <code>null</code>). + * + * @see #setGridBandPaint(Paint) + */ + public Paint getGridBandPaint() { + return this.gridBandPaint; + } - /** - * Sets the grid band paint. - * - * @param paint the paint (<code>null</code> not permitted). - * - * @see #getGridBandPaint() - */ - public void setGridBandPaint(Paint paint) { - if (paint == null) { - throw new IllegalArgumentException("Null 'paint' argument."); - } - this.gridBandPaint = paint; - } + /** + * Sets the grid band paint. + * + * @param paint the paint (<code>null</code> not permitted). + * + * @see #getGridBandPaint() + */ + public void setGridBandPaint(Paint paint) { + if (paint == null) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.gridBandPaint = paint; + } - /** - * Returns the grid band alternate paint (used for a {@link SymbolAxis}). - * - * @return The paint (never <code>null</code>). - * - * @see #setGridBandAlternatePaint(Paint) - */ - public Paint getGridBandAlternatePaint() { - return this.gridBandAlternatePaint; - } + /** + * Returns the grid band alternate paint (used for a {@link SymbolAxis}). + * + * @return The paint (never <code>null</code>). + * + * @see #setGridBandAlternatePaint(Paint) + */ + public Paint getGridBandAlternatePaint() { + return this.gridBandAlternatePaint; + } - /** - * Sets the grid band alternate paint (used for a {@link SymbolAxis}). - * - * @param paint the paint (<code>null</code> not permitted). - * - * @see #getGridBandAlternatePaint() - */ - public void setGridBandAlternatePaint(Paint paint) { - if (paint == null) { - throw new IllegalArgumentException("Null 'paint' argument."); - } - this.gridBandAlternatePaint = paint; - } + /** + * Sets the grid band alternate paint (used for a {@link SymbolAxis}). + * + * @param paint the paint (<code>null</code> not permitted). + * + * @see #getGridBandAlternatePaint() + */ + public void setGridBandAlternatePaint(Paint paint) { + if (paint == null) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.gridBandAlternatePaint = paint; + } - /** - * Returns the name of this theme. - * - * @return The name of this theme. - */ - public String getName() { - return this.name; - } + /** + * Returns the name of this theme. + * + * @return The name of this theme. + */ + public String getName() { + return this.name; + } - /** - * Returns a clone of the drawing supplier for this theme. - * - * @return A clone of the drawing supplier. - */ - public DrawingSupplier getDrawingSupplier() { - DrawingSupplier result = null; - if (this.drawingSupplier instanceof PublicCloneable) { - PublicCloneable pc = (PublicCloneable) this.drawingSupplier; - try { - result = (DrawingSupplier) pc.clone(); - } - catch (CloneNotSupportedException e) { - e.printStackTrace(); - } - } - return result; - } + /** + * Returns a clone of the drawing supplier for this theme. + * + * @return A clone of the drawing supplier. + */ + public DrawingSupplier getDrawingSupplier() { + DrawingSupplier result = null; + if (this.drawingSupplier instanceof PublicCloneable) { + PublicCloneable pc = (PublicCloneable) this.drawingSupplier; + try { + result = (DrawingSupplier) pc.clone(); + } + catch (CloneNotSupportedException e) { + e.printStackTrace(); + } + } + return result; + } - /** - * Sets the drawing supplier for this theme. - * - * @param supplier the supplier (<code>null</code> not permitted). - * - * @see #getDrawingSupplier() - */ - public void setDrawingSupplier(DrawingSupplier supplier) { - if (supplier == null) { - throw new IllegalArgumentException("Null 'supplier' argument."); - } - this.drawingSupplier = supplier; - } + /** + * Sets the drawing supplier for this theme. + * + * @param supplier the supplier (<code>null</code> not permitted). + * + * @see #getDrawingSupplier() + */ + public void setDrawingSupplier(DrawingSupplier supplier) { + if (supplier == null) { + throw new IllegalArgumentException("Null 'supplier' argument."); + } + this.drawingSupplier = supplier; + } - /** - * Applies this theme to the supplied chart. - * - * @param chart the chart (<code>null</code> not permitted). - */ - public void apply(JFreeChart chart) { - if (chart == null) { - throw new IllegalArgumentException("Null 'chart' argument."); - } - TextTitle title = chart.getTitle(); - if (title != null) { - title.setFont(this.extraLargeFont); - title.setPaint(this.titlePaint); - } + /** + * Applies this theme to the supplied chart. + * + * @param chart the chart (<code>null</code> not permitted). + */ + public void apply(JFreeChart chart) { + if (chart == null) { + throw new IllegalArgumentException("Null 'chart' argument."); + } + TextTitle title = chart.getTitle(); + if (title != null) { + title.setFont(this.extraLargeFont); + title.setPaint(this.titlePaint); + } - int subtitleCount = chart.getSubtitleCount(); - for (int i = 0; i < subtitleCount; i++) { - applyToTitle(chart.getSubtitle(i)); - } + int subtitleCount = chart.getSubtitleCount(); + for (int i = 0; i < subtitleCount; i++) { + applyToTitle(chart.getSubtitle(i)); + } - chart.setBackgroundPaint(this.chartBackgroundPaint); + chart.setBackgroundPaint(this.chartBackgroundPaint); - // now process the plot if there is one - Plot plot = chart.getPlot(); - if (plot != null) { - applyToPlot(plot); - } - } + // now process the plot if there is one + Plot plot = chart.getPlot(); + if (plot != null) { + applyToPlot(plot); + } + } - /** - * Applies the attributes of this theme to the specified title. - * - * @param title the title. - */ - protected void applyToTitle(Title title) { - if (title instanceof TextTitle) { - TextTitle tt = (TextTitle) title; - tt.setFont(this.largeFont); - tt.setPaint(this.subtitlePaint); - } - else if (title instanceof LegendTitle) { - LegendTitle lt = (LegendTitle) title; - if (lt.getBackgroundPaint() != null) { - lt.setBackgroundPaint(this.legendBackgroundPaint); - } - lt.setItemFont(this.regularFont); - lt.setItemPaint(this.legendItemPaint); - if (lt.getWrapper() != null) { - applyToBlockContainer(lt.getWrapper()); - } - } - else if (title instanceof PaintScaleLegend) { - PaintScaleLegend psl = (PaintScaleLegend) title; - psl.setBackgroundPaint(this.legendBackgroundPaint); - ValueAxis axis = psl.getAxis(); - if (axis != null) { - applyToValueAxis(axis); - } - } - else if (title instanceof CompositeTitle) { - CompositeTitle ct = (CompositeTitle) title; - BlockContainer bc = ct.getContainer(); - List blocks = bc.getBlocks(); - Iterator iterator = blocks.iterator(); - while (iterator.hasNext()) { - Block b = (Block) iterator.next(); - if (b instanceof Title) { - applyToTitle((Title) b); - } - } - } - } + /** + * Applies the attributes of this theme to the specified title. + * + * @param title the title. + */ + protected void applyToTitle(Title title) { + if (title instanceof TextTitle) { + TextTitle tt = (TextTitle) title; + tt.setFont(this.largeFont); + tt.setPaint(this.subtitlePaint); + } + else if (title instanceof LegendTitle) { + LegendTitle lt = (LegendTitle) title; + if (lt.getBackgroundPaint() != null) { + lt.setBackgroundPaint(this.legendBackgroundPaint); + } + lt.setItemFont(this.regularFont); + lt.setItemPaint(this.legendItemPaint); + if (lt.getWrapper() != null) { + applyToBlockContainer(lt.getWrapper()); + } + } + else if (title instanceof PaintScaleLegend) { + PaintScaleLegend psl = (PaintScaleLegend) title; + psl.setBackgroundPaint(this.legendBackgroundPaint); + ValueAxis axis = psl.getAxis(); + if (axis != null) { + applyToValueAxis(axis); + } + } + else if (title instanceof CompositeTitle) { + CompositeTitle ct = (CompositeTitle) title; + BlockContainer bc = ct.getContainer(); + List blocks = bc.getBlocks(); + Iterator iterator = blocks.iterator(); + while (iterator.hasNext()) { + Block b = (Block) iterator.next(); + if (b instanceof Title) { + applyToTitle((Title) b); + } + } + } + } - /** - * Applies the attributes of this theme to the specified container. - * - * @param bc a block container (<code>null</code> not permitted). - */ - protected void applyToBlockContainer(BlockContainer bc) { - Iterator iterator = bc.getBlocks().iterator(); - while (iterator.hasNext()) { - Block b = (Block) iterator.next(); - applyToBlock(b); - } - } + /** + * Applies the attributes of this theme to the specified container. + * + * @param bc a block container (<code>null</code> not permitted). + */ + protected void applyToBlockContainer(BlockContainer bc) { + Iterator iterator = bc.getBlocks().iterator(); + while (iterator.hasNext()) { + Block b = (Block) iterator.next(); + applyToBlock(b); + } + } - /** - * Applies the attributes of this theme to the specified block. - * - * @param b the block. - */ - protected void applyToBlock(Block b) { - if (b instanceof Title) { - applyToTitle((Title) b); - } - else if (b instanceof LabelBlock) { - LabelBlock lb = (LabelBlock) b; - lb.setFont(this.regularFont); - lb.setPaint(this.legendItemPaint); - } - } + /** + * Applies the attributes of this theme to the specified block. + * + * @param b the block. + */ + protected void applyToBlock(Block b) { + if (b instanceof Title) { + applyToTitle((Title) b); + } + else if (b instanceof LabelBlock) { + LabelBlock lb = (LabelBlock) b; + lb.setFont(this.regularFont); + lb.setPaint(this.legendItemPaint); + } + } - /** - * Applies the attributes of this theme to a plot. - * - * @param plot the plot (<code>null</code>). - */ - protected void applyToPlot(Plot plot) { - if (plot == null) { - throw new IllegalArgumentException("Null 'plot' argument."); - } - if (plot.getDrawingSupplier() != null) { - plot.setDrawingSupplier(getDrawingSupplier()); - } - if (plot.getBackgroundPaint() != null) { + /** + * Applies the attributes of this theme to a plot. + * + * @param plot the plot (<code>null</code>). + */ + protected void applyToPlot(Plot plot) { + if (plot == null) { + throw new IllegalArgumentException("Null 'plot' argument."); + } + if (plot.getDrawingSupplier() != null) { + plot.setDrawingSupplier(getDrawingSupplier()); + } + if (plot.getBackgroundPaint() != null) { plot.setBackgroundPaint(this.plotBackgroundPaint); - } - plot.setOutlinePaint(this.plotOutlinePaint); + } + plot.setOutlinePaint(this.plotOutlinePaint); - // now handle specific plot types (and yes, I know this is some - // really ugly code that has to be manually updated any time a new - // plot type is added - I should have written something much cooler, - // but I didn't and neither did anyone else). - if (plot instanceof PiePlot) { - applyToPiePlot((PiePlot) plot); - } - else if (plot instanceof MultiplePiePlot) { - applyToMultiplePiePlot((MultiplePiePlot) plot); - } - else if (plot instanceof CategoryPlot) { - applyToCategoryPlot((CategoryPlot) plot); - } - else if (plot instanceof XYPlot) { - applyToXYPlot((XYPlot) plot); - } - else if (plot instanceof FastScatterPlot) { - applyToFastScatterPlot((FastScatterPlot) plot); - } - else if (plot instanceof MeterPlot) { - applyToMeterPlot((MeterPlot) plot); - } - else if (plot instanceof ThermometerPlot) { - applyToThermometerPlot((ThermometerPlot) plot); - } - else if (plot instanceof SpiderWebPlot) { - applyToSpiderWebPlot((SpiderWebPlot) plot); - } - else if (plot instanceof PolarPlot) { - applyToPolarPlot((PolarPlot) plot); - } - } + // now handle specific plot types (and yes, I know this is some + // really ugly code that has to be manually updated any time a new + // plot type is added - I should have written something much cooler, + // but I didn't and neither did anyone else). + if (plot instanceof PiePlot) { + applyToPiePlot((PiePlot) plot); + } + else if (plot instanceof MultiplePiePlot) { + applyToMultiplePiePlot((MultiplePiePlot) plot); + } + else if (plot instanceof CategoryPlot) { + applyToCategoryPlot((CategoryPlot) plot); + } + else if (plot instanceof XYPlot) { + applyToXYPlot((XYPlot) plot); + } + else if (plot instanceof FastScatterPlot) { + applyToFastScatterPlot((FastScatterPlot) plot); + } + else if (plot instanceof MeterPlot) { + applyToMeterPlot((MeterPlot) plot); + } + else if (plot instanceof ThermometerPlot) { + applyToThermometerPlot((ThermometerPlot) plot); + } + else if (plot instanceof SpiderWebPlot) { + applyToSpiderWebPlot((SpiderWebPlot) plot); + } + else if (plot instanceof PolarPlot) { + applyToPolarPlot((PolarPlot) plot); + } + } - /** - * Applies the attributes of this theme to a {@link PiePlot} instance. - * This method also clears any set values for the section paint, outline - * etc, so that the theme's {@link DrawingSupplier} will be used. - * - * @param plot the plot (<code>null</code> not permitted). - */ - protected void applyToPiePlot(PiePlot plot) { - plot.setLabelLinkPaint(this.labelLinkPaint); - plot.setLabelLinkStyle(this.labelLinkStyle); - plot.setLabelFont(this.regularFont); + /** + * Applies the attributes of this theme to a {@link PiePlot} instance. + * This method also clears any set values for the section paint, outline + * etc, so that the theme's {@link DrawingSupplier} will be used. + * + * @param plot the plot (<code>null</code> not permitted). + */ + protected void applyToPiePlot(PiePlot plot) { + plot.setLabelLinkPaint(this.labelLinkPaint); + plot.setLabelLinkStyle(this.labelLinkStyle); + plot.setLabelFont(this.regularFont); - // clear the section attributes so that the theme's DrawingSupplier - // will be used - if (plot.getAutoPopulateSectionPaint()) { - plot.clearSectionPaints(false); - } - if (plot.getAutoPopulateSectionOutlinePaint()) { - plot.clearSectionOutlinePaints(false); - } - if (plot.getAutoPopulateSectionOutlineStroke()) { - plot.clearSectionOutlineStrokes(false); - } - } + // clear the section attributes so that the theme's DrawingSupplier + // will be used + if (plot.getAutoPopulateSectionPaint()) { + plot.clearSectionPaints(false); + } + if (plot.getAutoPopulateSectionOutlinePaint()) { + plot.clearSectionOutlinePaints(false); + } + if (plot.getAutoPopulateSectionOutlineStroke()) { + plot.clearSectionOutlineStrokes(false); + } + } - /** - * Applies the attributes of this theme to a {@link MultiplePiePlot}. - * - * @param plot the plot (<code>null</code> not permitted). - */ - protected void applyToMultiplePiePlot(MultiplePiePlot plot) { - apply(plot.getPieChart()); - } + /** + * Applies the attributes of this theme to a {@link MultiplePiePlot}. + * + * @param plot the plot (<code>null</code> not permitted). + */ + protected void applyToMultiplePiePlot(MultiplePiePlot plot) { + apply(plot.getPieChart()); + } - /** - * Applies the attributes of this theme to a {@link CategoryPlot}. - * - * @param plot the plot (<code>null</code> not permitted). - */ - protected void applyToCategoryPlot(CategoryPlot plot) { - plot.setAxisOffset(this.axisOffset); - plot.setDomainGridlinePaint(this.domainGridlinePaint); - plot.setRangeGridlinePaint(this.rangeGridlinePaint); + /** + * Applies the attributes of this theme to a {@link CategoryPlot}. + * + * @param plot the plot (<code>null</code> not permitted). + */ + protected void applyToCategoryPlot(CategoryPlot plot) { + plot.setAxisOffset(this.axisOffset); + plot.setDomainGridlinePaint(this.domainGridlinePaint); + plot.setRangeGridlinePaint(this.rangeGridlinePaint); - // process all domain axes - int domainAxisCount = plot.getDomainAxisCount(); - for (int i = 0; i < domainAxisCount; i++) { - CategoryAxis axis = (CategoryAxis) plot.getDomainAxis(i); - if (axis != null) { - applyToCategoryAxis(axis); - } - } + // process all domain axes + int domainAxisCount = plot.getDomainAxisCount(); + for (int i = 0; i < domainAxisCount; i++) { + CategoryAxis axis = (CategoryAxis) plot.getDomainAxis(i); + if (axis != null) { + applyToCategoryAxis(axis); + } + } - // process all range axes - int rangeAxisCount = plot.getRangeAxisCount(); - for (int i = 0; i < rangeAxisCount; i++) { - ValueAxis axis = (ValueAxis) plot.getRangeAxis(i); - if (axis != null) { - applyToValueAxis(axis); - } - } + // process all range axes + int rangeAxisCount = plot... [truncated message content] |
From: <mu...@us...> - 2009-04-07 11:04:58
|
Revision: 1950 http://jfreechart.svn.sourceforge.net/jfreechart/?rev=1950&view=rev Author: mungady Date: 2009-04-07 11:04:48 +0000 (Tue, 07 Apr 2009) Log Message: ----------- Synchronised with 1.0.x branch. Modified Paths: -------------- trunk/source/org/jfree/chart/renderer/category/BarRenderer3D.java trunk/source/org/jfree/data/category/SlidingCategoryDataset.java Modified: trunk/source/org/jfree/chart/renderer/category/BarRenderer3D.java =================================================================== --- trunk/source/org/jfree/chart/renderer/category/BarRenderer3D.java 2009-04-07 09:41:45 UTC (rev 1949) +++ trunk/source/org/jfree/chart/renderer/category/BarRenderer3D.java 2009-04-07 11:04:48 UTC (rev 1950) @@ -2,7 +2,7 @@ * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * - * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors. + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * @@ -27,7 +27,7 @@ * ------------------ * BarRenderer3D.java * ------------------ - * (C) Copyright 2001-2008, by Serge V. Grachov and Contributors. + * (C) Copyright 2001-2009, by Serge V. Grachov and Contributors. * * Original Author: Serge V. Grachov; * Contributor(s): David Gilbert (for Object Refinery Limited); @@ -456,11 +456,8 @@ * @param value the value at which the grid line should be drawn. * */ - public void drawRangeGridline(Graphics2D g2, - CategoryPlot plot, - ValueAxis axis, - Rectangle2D dataArea, - double value) { + public void drawRangeGridline(Graphics2D g2, CategoryPlot plot, + ValueAxis axis, Rectangle2D dataArea, double value) { Range range = axis.getRange(); @@ -505,6 +502,64 @@ } /** + * Draws a line perpendicular to the range axis. + * + * @param g2 the graphics device. + * @param plot the plot. + * @param axis the value axis. + * @param dataArea the area for plotting data (not yet adjusted for any 3D + * effect). + * @param value the value at which the grid line should be drawn. + * @param paint the paint. + * @param stroke the stroke. + * + * @see #drawRangeGridline + * + * @since 1.0.13 + */ + public void drawRangeLine(Graphics2D g2, CategoryPlot plot, ValueAxis axis, + Rectangle2D dataArea, double value, Paint paint, Stroke stroke) { + + Range range = axis.getRange(); + if (!range.contains(value)) { + return; + } + + Rectangle2D adjusted = new Rectangle2D.Double(dataArea.getX(), + dataArea.getY() + getYOffset(), dataArea.getWidth() + - getXOffset(), dataArea.getHeight() - getYOffset()); + + Line2D line1 = null; + Line2D line2 = null; + PlotOrientation orientation = plot.getOrientation(); + if (orientation == PlotOrientation.HORIZONTAL) { + double x0 = axis.valueToJava2D(value, adjusted, + plot.getRangeAxisEdge()); + double x1 = x0 + getXOffset(); + double y0 = dataArea.getMaxY(); + double y1 = y0 - getYOffset(); + double y2 = dataArea.getMinY(); + line1 = new Line2D.Double(x0, y0, x1, y1); + line2 = new Line2D.Double(x1, y1, x1, y2); + } + else if (orientation == PlotOrientation.VERTICAL) { + double y0 = axis.valueToJava2D(value, adjusted, + plot.getRangeAxisEdge()); + double y1 = y0 - getYOffset(); + double x0 = dataArea.getMinX(); + double x1 = x0 + getXOffset(); + double x2 = dataArea.getMaxX(); + line1 = new Line2D.Double(x0, y0, x1, y1); + line2 = new Line2D.Double(x1, y1, x2, y1); + } + g2.setPaint(paint); + g2.setStroke(stroke); + g2.draw(line1); + g2.draw(line2); + + } + + /** * Draws a range marker. * * @param g2 the graphics device. Modified: trunk/source/org/jfree/data/category/SlidingCategoryDataset.java =================================================================== --- trunk/source/org/jfree/data/category/SlidingCategoryDataset.java 2009-04-07 09:41:45 UTC (rev 1949) +++ trunk/source/org/jfree/data/category/SlidingCategoryDataset.java 2009-04-07 11:04:48 UTC (rev 1950) @@ -2,7 +2,7 @@ * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * - * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors. + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * @@ -27,7 +27,7 @@ * --------------------------- * SlidingCategoryDataset.java * --------------------------- - * (C) Copyright 2008, by Object Refinery Limited. + * (C) Copyright 2008, 2009, by Object Refinery Limited. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): -; @@ -35,6 +35,7 @@ * Changes * ------- * 08-May-2008 : Version 1 (DG); + * 15-Mar-2009 : Fixed bug in getColumnKeys() method (DG); * */ @@ -199,7 +200,7 @@ public List getColumnKeys() { List result = new java.util.ArrayList(); int last = lastCategoryIndex(); - for (int i = this.firstCategoryIndex; i < last; i++) { + for (int i = this.firstCategoryIndex; i <= last; i++) { result.add(this.underlying.getColumnKey(i)); } return Collections.unmodifiableList(result); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mu...@us...> - 2009-04-07 12:46:51
|
Revision: 1955 http://jfreechart.svn.sourceforge.net/jfreechart/?rev=1955&view=rev Author: mungady Date: 2009-04-07 12:46:47 +0000 (Tue, 07 Apr 2009) Log Message: ----------- Synchronised with 1.0.x branch. Modified Paths: -------------- trunk/source/org/jfree/data/xy/IntervalXYDelegate.java Added Paths: ----------- trunk/source/org/jfree/chart/annotations/XYDataImageAnnotation.java trunk/source/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java Added: trunk/source/org/jfree/chart/annotations/XYDataImageAnnotation.java =================================================================== --- trunk/source/org/jfree/chart/annotations/XYDataImageAnnotation.java (rev 0) +++ trunk/source/org/jfree/chart/annotations/XYDataImageAnnotation.java 2009-04-07 12:46:47 UTC (rev 1955) @@ -0,0 +1,373 @@ +/* =========================================================== + * JFreeChart : a free chart library for the Java(tm) platform + * =========================================================== + * + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. + * + * Project Info: http://www.jfree.org/jfreechart/index.html + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * -------------------------- + * XYDataImageAnnotation.java + * -------------------------- + * (C) Copyright 2008, 2009, by Object Refinery Limited and Contributors. + * + * Original Author: David Gilbert (for Object Refinery Limited); + * Contributor(s): -; + * + * Changes: + * -------- + * 17-Sep-2008 : Version 1, based on XYImageAnnotation (DG); + * 10-Mar-2009 : Implemented XYAnnotationBoundsInfo (DG); + * + */ + +package org.jfree.chart.annotations; + +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.geom.Rectangle2D; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import org.jfree.chart.axis.AxisLocation; +import org.jfree.chart.axis.ValueAxis; +import org.jfree.chart.plot.Plot; +import org.jfree.chart.plot.PlotOrientation; +import org.jfree.chart.plot.PlotRenderingInfo; +import org.jfree.chart.plot.XYPlot; +import org.jfree.chart.util.ObjectUtilities; +import org.jfree.chart.util.PublicCloneable; +import org.jfree.chart.util.RectangleEdge; +import org.jfree.data.Range; + +/** + * An annotation that allows an image to be placed within a rectangle specified + * in data coordinates on an {@link XYPlot}. Note that this annotation + * is not currently serializable, so don't use it if you plan on serializing + * your chart(s). + * + * @since 1.0.11 + */ +public class XYDataImageAnnotation extends AbstractXYAnnotation + implements Cloneable, PublicCloneable, XYAnnotationBoundsInfo { + + /** The image. */ + private transient Image image; + + /** + * The x-coordinate (in data space). + */ + private double x; + + /** + * The y-coordinate (in data space). + */ + private double y; + + /** + * The image display area width in data coordinates. + */ + private double w; + + /** + * The image display area height in data coordinates. + */ + private double h; + + /** + * A flag indicating whether or not the annotation should contribute to + * the data range for a plot/renderer. + * + * @since 1.0.13 + */ + private boolean includeInDataBounds; + + /** + * Creates a new annotation to be displayed within the specified rectangle. + * + * @param image the image (<code>null</code> not permitted). + * @param x the x-coordinate (in data space). + * @param y the y-coordinate (in data space). + * @param w the image display area width. + * @param h the image display area height. + */ + public XYDataImageAnnotation(Image image, double x, double y, double w, + double h) { + this(image, x, y, w, h, false); + } + + /** + * Creates a new annotation to be displayed within the specified rectangle. + * + * @param image the image (<code>null</code> not permitted). + * @param x the x-coordinate (in data space). + * @param y the y-coordinate (in data space). + * @param w the image display area width. + * @param h the image display area height. + * @param includeInDataBounds a flag that controls whether or not the + * annotation is included in the data bounds for the axis autoRange. + * + * @since 1.0.13 + */ + public XYDataImageAnnotation(Image image, double x, double y, double w, + double h, boolean includeInDataBounds) { + + if (image == null) { + throw new IllegalArgumentException("Null 'image' argument."); + } + this.image = image; + this.x = x; + this.y = y; + this.w = w; + this.h = h; + this.includeInDataBounds = includeInDataBounds; + } + + /** + * Returns the image for the annotation. + * + * @return The image. + */ + public Image getImage() { + return this.image; + } + + /** + * Returns the x-coordinate (in data space) for the annotation. + * + * @return The x-coordinate. + */ + public double getX() { + return this.x; + } + + /** + * Returns the y-coordinate (in data space) for the annotation. + * + * @return The y-coordinate. + */ + public double getY() { + return this.y; + } + + /** + * Returns the width (in data space) of the data rectangle into which the + * image will be drawn. + * + * @return The width. + */ + public double getWidth() { + return this.w; + } + + /** + * Returns the height (in data space) of the data rectangle into which the + * image will be drawn. + * + * @return The height. + */ + public double getHeight() { + return this.h; + } + + /** + * Returns the flag that controls whether or not the annotation should + * contribute to the autoRange for the axis it is plotted against. + * + * @return A boolean. + * + * @since 1.0.13 + */ + public boolean getIncludeInDataBounds() { + return this.includeInDataBounds; + } + + /** + * Returns the x-range for the annotation. + * + * @return The range. + * + * @since 1.0.13 + */ + public Range getXRange() { + return new Range(this.x, this.x + this.w); + } + + /** + * Returns the y-range for the annotation. + * + * @return The range. + * + * @since 1.0.13 + */ + public Range getYRange() { + return new Range(this.y, this.y + this.h); + } + + /** + * Draws the annotation. This method is called by the drawing code in the + * {@link XYPlot} class, you don't normally need to call this method + * directly. + * + * @param g2 the graphics device. + * @param plot the plot. + * @param dataArea the data area. + * @param domainAxis the domain axis. + * @param rangeAxis the range axis. + * @param rendererIndex the renderer index. + * @param info if supplied, this info object will be populated with + * entity information. + */ + public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, + ValueAxis domainAxis, ValueAxis rangeAxis, + int rendererIndex, + PlotRenderingInfo info) { + + PlotOrientation orientation = plot.getOrientation(); + AxisLocation xAxisLocation = plot.getDomainAxisLocation(); + AxisLocation yAxisLocation = plot.getRangeAxisLocation(); + RectangleEdge xEdge = Plot.resolveDomainAxisLocation(xAxisLocation, + orientation); + RectangleEdge yEdge = Plot.resolveRangeAxisLocation(yAxisLocation, + orientation); + float j2DX0 = (float) domainAxis.valueToJava2D(this.x, dataArea, xEdge); + float j2DY0 = (float) rangeAxis.valueToJava2D(this.y, dataArea, yEdge); + float j2DX1 = (float) domainAxis.valueToJava2D(this.x + this.w, + dataArea, xEdge); + float j2DY1 = (float) rangeAxis.valueToJava2D(this.y + this.h, + dataArea, yEdge); + float xx0 = 0.0f; + float yy0 = 0.0f; + float xx1 = 0.0f; + float yy1 = 0.0f; + if (orientation == PlotOrientation.HORIZONTAL) { + xx0 = j2DY0; + xx1 = j2DY1; + yy0 = j2DX0; + yy1 = j2DX1; + } + else if (orientation == PlotOrientation.VERTICAL) { + xx0 = j2DX0; + xx1 = j2DX1; + yy0 = j2DY0; + yy1 = j2DY1; + } + // TODO: rotate the image when drawn with horizontal orientation? + g2.drawImage(this.image, (int) xx0, (int) Math.min(yy0, yy1), + (int) (xx1 - xx0), (int) Math.abs(yy1 - yy0), null); + String toolTip = getToolTipText(); + String url = getURL(); + if (toolTip != null || url != null) { + addEntity(info, new Rectangle2D.Float(xx0, yy0, (xx1 - xx0), + (yy1 - yy0)), rendererIndex, toolTip, url); + } + } + + /** + * Tests this object for equality with an arbitrary object. + * + * @param obj the object (<code>null</code> permitted). + * + * @return A boolean. + */ + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + // now try to reject equality... + if (!super.equals(obj)) { + return false; + } + if (!(obj instanceof XYDataImageAnnotation)) { + return false; + } + XYDataImageAnnotation that = (XYDataImageAnnotation) obj; + if (this.x != that.x) { + return false; + } + if (this.y != that.y) { + return false; + } + if (this.w != that.w) { + return false; + } + if (this.h != that.h) { + return false; + } + if (this.includeInDataBounds != that.includeInDataBounds) { + return false; + } + if (!ObjectUtilities.equal(this.image, that.image)) { + return false; + } + // seems to be the same... + return true; + } + + /** + * Returns a hash code for this object. + * + * @return A hash code. + */ + public int hashCode() { + return this.image.hashCode(); + } + + /** + * Returns a clone of the annotation. + * + * @return A clone. + * + * @throws CloneNotSupportedException if the annotation can't be cloned. + */ + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } + + /** + * Provides serialization support. + * + * @param stream the output stream. + * + * @throws IOException if there is an I/O error. + */ + private void writeObject(ObjectOutputStream stream) throws IOException { + stream.defaultWriteObject(); + // FIXME + //SerialUtilities.writeImage(this.image, stream); + } + + /** + * Provides serialization support. + * + * @param stream the input stream. + * + * @throws IOException if there is an I/O error. + * @throws ClassNotFoundException if there is a classpath problem. + */ + private void readObject(ObjectInputStream stream) + throws IOException, ClassNotFoundException { + stream.defaultReadObject(); + // FIXME + //this.image = SerialUtilities.readImage(stream); + } + +} Added: trunk/source/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java =================================================================== --- trunk/source/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java (rev 0) +++ trunk/source/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java 2009-04-07 12:46:47 UTC (rev 1955) @@ -0,0 +1,431 @@ +/* =========================================================== + * JFreeChart : a free chart library for the Java(tm) platform + * =========================================================== + * + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. + * + * Project Info: http://www.jfree.org/jfreechart/index.html + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * --------------------------- + * SamplingXYLineRenderer.java + * --------------------------- + * (C) Copyright 2008, 2009, by Object Refinery Limited. + * + * Original Author: David Gilbert (for Object Refinery Limited); + * Contributor(s): -; + * + * Changes: + * -------- + * 02-Oct-2008 : Version 1 (DG); + * + */ + +package org.jfree.chart.renderer.xy; + +import java.awt.Graphics2D; +import java.awt.Paint; +import java.awt.Shape; +import java.awt.geom.GeneralPath; +import java.awt.geom.Line2D; +import java.awt.geom.PathIterator; +import java.awt.geom.Rectangle2D; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import org.jfree.chart.LegendItem; +import org.jfree.chart.axis.ValueAxis; +import org.jfree.chart.event.RendererChangeEvent; +import org.jfree.chart.plot.CrosshairState; +import org.jfree.chart.plot.PlotOrientation; +import org.jfree.chart.plot.PlotRenderingInfo; +import org.jfree.chart.plot.XYPlot; +import org.jfree.chart.util.PublicCloneable; +import org.jfree.chart.util.RectangleEdge; +import org.jfree.chart.util.SerialUtilities; +import org.jfree.chart.util.ShapeUtilities; +import org.jfree.data.xy.XYDataset; + +/** + * A renderer that... This renderer is designed for use with the {@link XYPlot} + * class. + */ +public class SamplingXYLineRenderer extends AbstractXYItemRenderer + implements XYItemRenderer, Cloneable, PublicCloneable, Serializable { + + /** The shape that is used to represent a line in the legend. */ + private transient Shape legendLine; + + /** + * Creates a new renderer. + */ + public SamplingXYLineRenderer() { + this.legendLine = new Line2D.Double(-7.0, 0.0, 7.0, 0.0); + } + + /** + * Returns the shape used to represent a line in the legend. + * + * @return The legend line (never <code>null</code>). + * + * @see #setLegendLine(Shape) + */ + public Shape getLegendLine() { + return this.legendLine; + } + + /** + * Sets the shape used as a line in each legend item and sends a + * {@link RendererChangeEvent} to all registered listeners. + * + * @param line the line (<code>null</code> not permitted). + * + * @see #getLegendLine() + */ + public void setLegendLine(Shape line) { + if (line == null) { + throw new IllegalArgumentException("Null 'line' argument."); + } + this.legendLine = line; + fireChangeEvent(); + } + + /** + * Returns the number of passes through the data that the renderer requires + * in order to draw the chart. Most charts will require a single pass, but + * some require two passes. + * + * @return The pass count. + */ + public int getPassCount() { + return 1; + } + + /** + * Records the state for the renderer. This is used to preserve state + * information between calls to the drawItem() method for a single chart + * drawing. + */ + public static class State extends XYItemRendererState { + + /** The path for the current series. */ + GeneralPath seriesPath; + + /** + * A second path that draws vertical intervals to cover any extreme + * values. + */ + GeneralPath intervalPath; + + /** + * The minimum change in the x-value needed to trigger an update to + * the seriesPath. + */ + double dX = 1.0; + + /** The last x-coordinate visited by the seriesPath. */ + double lastX; + + /** The initial y-coordinate for the current x-coordinate. */ + double openY = 0.0; + + /** The highest y-coordinate for the current x-coordinate. */ + double highY = 0.0; + + /** The lowest y-coordinate for the current x-coordinate. */ + double lowY = 0.0; + + /** The final y-coordinate for the current x-coordinate. */ + double closeY = 0.0; + + /** + * A flag that indicates if the last (x, y) point was 'good' + * (non-null). + */ + boolean lastPointGood; + + /** + * Creates a new state instance. + * + * @param info the plot rendering info. + */ + public State(PlotRenderingInfo info) { + super(info); + } + + /** + * This method is called by the {@link XYPlot} at the start of each + * series pass. We reset the state for the current series. + * + * @param dataset the dataset. + * @param series the series index. + * @param firstItem the first item index for this pass. + * @param lastItem the last item index for this pass. + * @param pass the current pass index. + * @param passCount the number of passes. + */ + public void startSeriesPass(XYDataset dataset, int series, + int firstItem, int lastItem, int pass, int passCount) { + this.seriesPath.reset(); + this.lastPointGood = false; + super.startSeriesPass(dataset, series, firstItem, lastItem, pass, + passCount); + } + + } + + /** + * Initialises the renderer. + * <P> + * This method will be called before the first item is rendered, giving the + * renderer an opportunity to initialise any state information it wants to + * maintain. The renderer can do nothing if it chooses. + * + * @param g2 the graphics device. + * @param dataArea the area inside the axes. + * @param plot the plot. + * @param data the data. + * @param info an optional info collection object to return data back to + * the caller. + * + * @return The renderer state. + */ + public XYItemRendererState initialise(Graphics2D g2, + Rectangle2D dataArea, XYPlot plot, XYDataset data, + PlotRenderingInfo info) { + + double dpi = 72; + // Integer dpiVal = (Integer) g2.getRenderingHint(HintKey.DPI); + // if (dpiVal != null) { + // dpi = dpiVal.intValue(); + // } + State state = new State(info); + state.seriesPath = new GeneralPath(); + state.intervalPath = new GeneralPath(); + state.dX = 72.0 / dpi; + return state; + } + + /** + * Draws the visual representation of a single data item. + * + * @param g2 the graphics device. + * @param state the renderer state. + * @param dataArea the area within which the data is being drawn. + * @param info collects information about the drawing. + * @param plot the plot (can be used to obtain standard color + * information etc). + * @param domainAxis the domain axis. + * @param rangeAxis the range axis. + * @param dataset the dataset. + * @param series the series index (zero-based). + * @param item the item index (zero-based). + * @param crosshairState crosshair information for the plot + * (<code>null</code> permitted). + * @param pass the pass index. + */ + public void drawItem(Graphics2D g2, + XYItemRendererState state, + Rectangle2D dataArea, + PlotRenderingInfo info, + XYPlot plot, + ValueAxis domainAxis, + ValueAxis rangeAxis, + XYDataset dataset, + int series, + int item, + CrosshairState crosshairState, + int pass) { + + // do nothing if item is not visible + if (!getItemVisible(series, item)) { + return; + } + RectangleEdge xAxisLocation = plot.getDomainAxisEdge(); + RectangleEdge yAxisLocation = plot.getRangeAxisEdge(); + + // get the data point... + double x1 = dataset.getXValue(series, item); + double y1 = dataset.getYValue(series, item); + double transX1 = domainAxis.valueToJava2D(x1, dataArea, xAxisLocation); + double transY1 = rangeAxis.valueToJava2D(y1, dataArea, yAxisLocation); + + State s = (State) state; + // update path to reflect latest point + if (!Double.isNaN(transX1) && !Double.isNaN(transY1)) { + float x = (float) transX1; + float y = (float) transY1; + PlotOrientation orientation = plot.getOrientation(); + if (orientation == PlotOrientation.HORIZONTAL) { + x = (float) transY1; + y = (float) transX1; + } + if (s.lastPointGood) { + if ((Math.abs(x - s.lastX) > s.dX)) { + s.seriesPath.lineTo(x, y); + if (s.lowY < s.highY) { + s.intervalPath.moveTo((float) s.lastX, (float) s.lowY); + s.intervalPath.lineTo((float) s.lastX, (float) s.highY); + } + s.lastX = x; + s.openY = y; + s.highY = y; + s.lowY = y; + s.closeY = y; + } + else { + s.highY = Math.max(s.highY, y); + s.lowY = Math.min(s.lowY, y); + s.closeY = y; + } + } + else { + s.seriesPath.moveTo(x, y); + s.lastX = x; + s.openY = y; + s.highY = y; + s.lowY = y; + s.closeY = y; + } + s.lastPointGood = true; + } + else { + s.lastPointGood = false; + } + // if this is the last item, draw the path ... + if (item == s.getLastItemIndex()) { + // draw path + PathIterator pi = s.seriesPath.getPathIterator(null); + int count = 0; + while (!pi.isDone()) { + count++; + pi.next(); + } + g2.setStroke(getItemStroke(series, item)); + g2.setPaint(getItemPaint(series, item)); + g2.draw(s.seriesPath); + g2.draw(s.intervalPath); + } + } + + /** + * Returns a legend item for the specified series. + * + * @param datasetIndex the dataset index (zero-based). + * @param series the series index (zero-based). + * + * @return A legend item for the series. + */ + public LegendItem getLegendItem(int datasetIndex, int series) { + + XYPlot plot = getPlot(); + if (plot == null) { + return null; + } + + LegendItem result = null; + XYDataset dataset = plot.getDataset(datasetIndex); + if (dataset != null) { + if (getItemVisible(series, 0)) { + String label = getLegendItemLabelGenerator().generateLabel( + dataset, series); + result = new LegendItem(label); + result.setLabelFont(lookupLegendTextFont(series)); + Paint labelPaint = lookupLegendTextPaint(series); + if (labelPaint != null) { + result.setLabelPaint(labelPaint); + } + result.setSeriesKey(dataset.getSeriesKey(series)); + result.setSeriesIndex(series); + result.setDataset(dataset); + result.setDatasetIndex(datasetIndex); + } + } + return result; + + } + + /** + * Returns a clone of the renderer. + * + * @return A clone. + * + * @throws CloneNotSupportedException if the clone cannot be created. + */ + public Object clone() throws CloneNotSupportedException { + SamplingXYLineRenderer clone = (SamplingXYLineRenderer) super.clone(); + if (this.legendLine != null) { + clone.legendLine = ShapeUtilities.clone(this.legendLine); + } + return clone; + } + + /** + * Tests this renderer for equality with an arbitrary object. + * + * @param obj the object (<code>null</code> permitted). + * + * @return <code>true</code> or <code>false</code>. + */ + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof SamplingXYLineRenderer)) { + return false; + } + if (!super.equals(obj)) { + return false; + } + SamplingXYLineRenderer that = (SamplingXYLineRenderer) obj; + if (!ShapeUtilities.equal(this.legendLine, that.legendLine)) { + return false; + } + return true; + } + + /** + * Provides serialization support. + * + * @param stream the input stream. + * + * @throws IOException if there is an I/O error. + * @throws ClassNotFoundException if there is a classpath problem. + */ + private void readObject(ObjectInputStream stream) + throws IOException, ClassNotFoundException { + stream.defaultReadObject(); + this.legendLine = SerialUtilities.readShape(stream); + } + + /** + * Provides serialization support. + * + * @param stream the output stream. + * + * @throws IOException if there is an I/O error. + */ + private void writeObject(ObjectOutputStream stream) throws IOException { + stream.defaultWriteObject(); + SerialUtilities.writeShape(this.legendLine, stream); + } + +} \ No newline at end of file Modified: trunk/source/org/jfree/data/xy/IntervalXYDelegate.java =================================================================== --- trunk/source/org/jfree/data/xy/IntervalXYDelegate.java 2009-04-07 12:34:18 UTC (rev 1954) +++ trunk/source/org/jfree/data/xy/IntervalXYDelegate.java 2009-04-07 12:46:47 UTC (rev 1955) @@ -2,7 +2,7 @@ * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * - * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors. + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * @@ -27,13 +27,13 @@ * ----------------------- * IntervalXYDelegate.java * ----------------------- - * (C) Copyright 2004-2008, by Andreas Schroeder and Contributors. + * (C) Copyright 2004-2009, by Andreas Schroeder and Contributors. * * Original Author: Andreas Schroeder; * Contributor(s): David Gilbert (for Object Refinery Limited); * - * Changes (from 31-Mar-2004) - * -------------------------- + * Changes + * ------- * 31-Mar-2004 : Version 1 (AS); * 15-Jul-2004 : Switched getX() with getXValue() and getY() with * getYValue() (DG); @@ -47,6 +47,7 @@ * autoIntervalWidth (DG); * 02-Feb-2007 : Removed author tags all over JFreeChart sources (DG); * 21-Jun-2007 : Removed JCommon dependencies (DG); + * 06-Mar-2009 : Implemented hashCode() (DG); * */ @@ -54,6 +55,7 @@ import java.io.Serializable; +import org.jfree.chart.util.HashUtilities; import org.jfree.chart.util.PublicCloneable; import org.jfree.data.DomainInfo; import org.jfree.data.Range; @@ -182,7 +184,7 @@ * aligned with the x-value at the lower end of the interval, and for a * value of 1.0, the interval is aligned with the x-value at the upper * end of the interval. - * + * <br><br> * Note that changing the interval position factor amounts to changing the * data values represented by the dataset. Therefore, the dataset that is * using this delegate is responsible for generating the @@ -381,7 +383,9 @@ public void datasetChanged(DatasetChangeEvent e) { // TODO: by coding the event with some information about what changed // in the dataset, we could make the recalculation of the interval - // more efficient in some cases... + // more efficient in some cases (for instance, if the change is + // just an update to a y-value, then the x-interval doesn't need + // updating)... if (this.autoWidth) { this.autoIntervalWidth = recalculateInterval(); } @@ -423,7 +427,11 @@ } /** - * Tests the delegate for equality with an arbitrary object. + * Tests the delegate for equality with an arbitrary object. The + * equality test considers two delegates to be equal if they would + * calculate the same intervals for any given dataset (for this reason, the + * dataset itself is NOT included in the equality test, because it is just + * a reference back to the current 'owner' of the delegate). * * @param obj the object (<code>null</code> permitted). * @@ -458,4 +466,17 @@ return super.clone(); } + /** + * Returns a hash code for this instance. + * + * @return A hash code. + */ + public int hashCode() { + int hash = 5; + hash = HashUtilities.hashCode(hash, this.autoWidth); + hash = HashUtilities.hashCode(hash, this.intervalPositionFactor); + hash = HashUtilities.hashCode(hash, this.fixedIntervalWidth); + return hash; + } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mu...@us...> - 2009-04-07 19:01:07
|
Revision: 1961 http://jfreechart.svn.sourceforge.net/jfreechart/?rev=1961&view=rev Author: mungady Date: 2009-04-07 19:00:55 +0000 (Tue, 07 Apr 2009) Log Message: ----------- Synchronised with 1.0.x branch. Modified Paths: -------------- trunk/source/org/jfree/chart/editor/DefaultNumberAxisEditor.java trunk/source/org/jfree/chart/renderer/category/BarRenderer.java trunk/source/org/jfree/chart/renderer/category/StackedBarRenderer.java trunk/source/org/jfree/chart/renderer/xy/XYBarRenderer.java trunk/source/org/jfree/data/function/NormalDistributionFunction2D.java Modified: trunk/source/org/jfree/chart/editor/DefaultNumberAxisEditor.java =================================================================== --- trunk/source/org/jfree/chart/editor/DefaultNumberAxisEditor.java 2009-04-07 18:58:46 UTC (rev 1960) +++ trunk/source/org/jfree/chart/editor/DefaultNumberAxisEditor.java 2009-04-07 19:00:55 UTC (rev 1961) @@ -2,7 +2,7 @@ * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * - * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors. + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * @@ -27,7 +27,7 @@ * ---------------------------- * DefaultNumberAxisEditor.java * ---------------------------- - * (C) Copyright 2005-2008, Object Refinery Limited and Contributors. + * (C) Copyright 2005-2009, Object Refinery Limited and Contributors. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): Arnaud Lelievre; @@ -35,7 +35,9 @@ * Changes: * -------- * 24-Nov-2005 : Version 1, based on NumberAxisPropertyEditor (DG); - * 21-Jun-2007 : Removed JCommon dependencies (DG); + * 18-Dec-2008 : Use ResourceBundleWrapper - see patch 1607918 by + * Jess Thrysoee (DG); + * 27-Feb-2009 : Fixed bug 2612649, NullPointerException (DG); * */ @@ -105,8 +107,8 @@ private StrokeSample[] availableStrokeSamples; /** The resourceBundle for the localization. */ - protected static ResourceBundle localizationResources = - ResourceBundleWrapper.getBundle( + protected static ResourceBundle localizationResources + = ResourceBundleWrapper.getBundle( "org.jfree.chart.editor.LocalizationBundle"); /** @@ -139,20 +141,17 @@ range.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); range.add(new JPanel()); - this.autoRangeCheckBox = new JCheckBox( - localizationResources.getString("Auto-adjust_range"), this.autoRange - ); + this.autoRangeCheckBox = new JCheckBox(localizationResources.getString( + "Auto-adjust_range"), this.autoRange); this.autoRangeCheckBox.setActionCommand("AutoRangeOnOff"); this.autoRangeCheckBox.addActionListener(this); range.add(this.autoRangeCheckBox); range.add(new JPanel()); - range.add( - new JLabel(localizationResources.getString("Minimum_range_value")) - ); - this.minimumRangeValue = new JTextField( - Double.toString(this.minimumValue) - ); + range.add(new JLabel(localizationResources.getString( + "Minimum_range_value"))); + this.minimumRangeValue = new JTextField(Double.toString( + this.minimumValue)); this.minimumRangeValue.setEnabled(!this.autoRange); this.minimumRangeValue.setActionCommand("MinimumRange"); this.minimumRangeValue.addActionListener(this); @@ -160,12 +159,10 @@ range.add(this.minimumRangeValue); range.add(new JPanel()); - range.add( - new JLabel(localizationResources.getString("Maximum_range_value")) - ); - this.maximumRangeValue = new JTextField( - Double.toString(this.maximumValue) - ); + range.add(new JLabel(localizationResources.getString( + "Maximum_range_value"))); + this.maximumRangeValue = new JTextField(Double.toString( + this.maximumValue)); this.maximumRangeValue.setEnabled(!this.autoRange); this.maximumRangeValue.setActionCommand("MaximumRange"); this.maximumRangeValue.addActionListener(this); @@ -235,13 +232,11 @@ * Handle a grid stroke selection. */ private void attemptGridStrokeSelection() { - StrokeChooserPanel panel = new StrokeChooserPanel( - null, this.availableStrokeSamples - ); - int result = JOptionPane.showConfirmDialog( - this, panel, localizationResources.getString("Stroke_Selection"), - JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE - ); + StrokeChooserPanel panel = new StrokeChooserPanel(this.gridStrokeSample, + this.availableStrokeSamples); + int result = JOptionPane.showConfirmDialog(this, panel, + localizationResources.getString("Stroke_Selection"), + JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); if (result == JOptionPane.OK_OPTION) { this.gridStrokeSample.setStroke(panel.getSelectedStroke()); @@ -253,9 +248,8 @@ */ private void attemptGridPaintSelection() { Color c; - c = JColorChooser.showDialog( - this, localizationResources.getString("Grid_Color"), Color.blue - ); + c = JColorChooser.showDialog(this, localizationResources.getString( + "Grid_Color"), Color.blue); if (c != null) { this.gridPaintSample.setPaint(c); } Modified: trunk/source/org/jfree/chart/renderer/category/BarRenderer.java =================================================================== --- trunk/source/org/jfree/chart/renderer/category/BarRenderer.java 2009-04-07 18:58:46 UTC (rev 1960) +++ trunk/source/org/jfree/chart/renderer/category/BarRenderer.java 2009-04-07 19:00:55 UTC (rev 1961) @@ -90,6 +90,7 @@ * 26-Jun-2008 : Added crosshair support (DG); * 13-Aug-2008 : Added shadowPaint attribute (DG); * 14-Jan-2009 : Added support for seriesVisible flags (PK); + * 03-Feb-2009 : Added defaultShadowsVisible flag - see patch 2511330 (PK); * */ @@ -188,6 +189,37 @@ BarRenderer.defaultBarPainter = painter; } + /** + * The default value for the initialisation of the shadowsVisible flag. + */ + private static boolean defaultShadowsVisible = true; + + /** + * Returns the default value for the <code>shadowsVisible</code> flag. + * + * @return A boolean. + * + * @see #setDefaultShadowsVisible(boolean) + * + * @since 1.0.13 + */ + public static boolean getDefaultShadowsVisible() { + return BarRenderer.defaultShadowsVisible; + } + + /** + * Sets the default value for the shadows visible flag. + * + * @param visible the new value for the default. + * + * @see #getDefaultShadowsVisible() + * + * @since 1.0.13 + */ + public static void setDefaultShadowsVisible(boolean visible) { + BarRenderer.defaultShadowsVisible = visible; + } + /** The margin between items (bars) within a category. */ private double itemMargin; @@ -287,7 +319,7 @@ this.minimumBarLength = 0.0; setBaseLegendShape(new Rectangle2D.Double(-4.0, -4.0, 8.0, 8.0)); this.barPainter = getDefaultBarPainter(); - this.shadowsVisible = true; + this.shadowsVisible = getDefaultShadowsVisible(); this.shadowPaint = Color.gray; this.shadowXOffset = 4.0; this.shadowYOffset = 4.0; Modified: trunk/source/org/jfree/chart/renderer/category/StackedBarRenderer.java =================================================================== --- trunk/source/org/jfree/chart/renderer/category/StackedBarRenderer.java 2009-04-07 18:58:46 UTC (rev 1960) +++ trunk/source/org/jfree/chart/renderer/category/StackedBarRenderer.java 2009-04-07 19:00:55 UTC (rev 1961) @@ -2,7 +2,7 @@ * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * - * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors. + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * @@ -27,12 +27,13 @@ * ----------------------- * StackedBarRenderer.java * ----------------------- - * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors. + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): Richard Atkinson; * Thierry Saura; * Christian W. Zuckschwerdt; + * Peter Kolb (patch 2511330); * * Changes * ------- @@ -292,6 +293,10 @@ int column, int pass) { + if (!isSeriesVisible(row)) { + return; + } + // nothing is drawn for null values... Number dataValue = dataset.getValue(row, column); if (dataValue == null) { @@ -301,7 +306,8 @@ double value = dataValue.doubleValue(); double total = 0.0; // only needed if calculating percentages if (this.renderAsPercentages) { - total = DataUtilities.calculateColumnTotal(dataset, column); + total = DataUtilities.calculateColumnTotal(dataset, column, + state.getVisibleSeriesArray()); value = value / total; } @@ -315,7 +321,7 @@ for (int i = 0; i < row; i++) { Number v = dataset.getValue(i, column); - if (v != null) { + if (v != null && isSeriesVisible(i)) { double d = v.doubleValue(); if (this.renderAsPercentages) { d = d / total; Modified: trunk/source/org/jfree/chart/renderer/xy/XYBarRenderer.java =================================================================== --- trunk/source/org/jfree/chart/renderer/xy/XYBarRenderer.java 2009-04-07 18:58:46 UTC (rev 1960) +++ trunk/source/org/jfree/chart/renderer/xy/XYBarRenderer.java 2009-04-07 19:00:55 UTC (rev 1961) @@ -2,7 +2,7 @@ * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * - * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors. + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * @@ -27,7 +27,7 @@ * ------------------ * XYBarRenderer.java * ------------------ - * (C) Copyright 2001-2008, by Object Refinery Limited. + * (C) Copyright 2001-2009, by Object Refinery Limited. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): Richard Atkinson; @@ -186,6 +186,37 @@ } /** + * The default value for the initialisation of the shadowsVisible flag. + */ + private static boolean defaultShadowsVisible = true; + + /** + * Returns the default value for the <code>shadowsVisible</code> flag. + * + * @return A boolean. + * + * @see #setDefaultShadowsVisible(boolean) + * + * @since 1.0.13 + */ + public static boolean getDefaultShadowsVisible() { + return XYBarRenderer.defaultShadowsVisible; + } + + /** + * Sets the default value for the shadows visible flag. + * + * @param visible the new value for the default. + * + * @see #getDefaultShadowsVisible() + * + * @since 1.0.13 + */ + public static void setDefaultShadowsVisible(boolean visible) { + XYBarRenderer.defaultShadowsVisible = visible; + } + + /** * The state class used by this renderer. */ protected class XYBarRendererState extends XYItemRendererState { @@ -289,6 +320,13 @@ private double shadowYOffset; /** + * A factor used to align the bars about the x-value. + * + * @since 1.0.13 + */ + private double barAlignmentFactor; + + /** * The default constructor. */ public XYBarRenderer() { @@ -309,9 +347,10 @@ this.drawBarOutline = false; this.legendBar = new Rectangle2D.Double(-3.0, -5.0, 6.0, 10.0); this.barPainter = getDefaultBarPainter(); - this.shadowsVisible = true; + this.shadowsVisible = getDefaultShadowsVisible(); this.shadowXOffset = 4.0; this.shadowYOffset = 4.0; + this.barAlignmentFactor = -1.0; } /** @@ -631,6 +670,31 @@ } /** + * Returns the bar alignment factor. + * + * @return The bar alignment factor. + * + * @since 1.0.13 + */ + public double getBarAlignmentFactor() { + return this.barAlignmentFactor; + } + + /** + * Sets the bar alignment factor and sends a {@link RendererChangeEvent} + * to all registered listeners. If the alignment factor is outside the + * range 0.0 to 1.0, no alignment will be performed by the renderer. + * + * @param factor the factor. + * + * @since 1.0.13 + */ + public void setBarAlignmentFactor(double factor) { + this.barAlignmentFactor = factor; + fireChangeEvent(); + } + + /** * Initialises the renderer and returns a state object that should be * passed to all subsequent calls to the drawItem() method. Here we * calculate the Java2D y-coordinate for zero, since all the bars have @@ -802,6 +866,14 @@ } } + // is there an alignment adjustment to be made? + if (this.barAlignmentFactor >= 0.0 && this.barAlignmentFactor <= 1.0) { + double x = intervalDataset.getXValue(series, item); + double interval = endX - startX; + startX = x - interval * this.barAlignmentFactor; + endX = startX + interval; + } + RectangleEdge location = plot.getDomainAxisEdge(); double translatedStartX = domainAxis.valueToJava2D(startX, dataArea, location); @@ -1207,6 +1279,9 @@ if (this.shadowYOffset != that.shadowYOffset) { return false; } + if (this.barAlignmentFactor != that.barAlignmentFactor) { + return false; + } return super.equals(obj); } Modified: trunk/source/org/jfree/data/function/NormalDistributionFunction2D.java =================================================================== --- trunk/source/org/jfree/data/function/NormalDistributionFunction2D.java 2009-04-07 18:58:46 UTC (rev 1960) +++ trunk/source/org/jfree/data/function/NormalDistributionFunction2D.java 2009-04-07 19:00:55 UTC (rev 1961) @@ -2,7 +2,7 @@ * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * - * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors. + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * @@ -27,7 +27,7 @@ * --------------------------------- * NormalDistributionFunction2D.java * --------------------------------- - * (C)opyright 2004-2008, by Object Refinery Limited. + * (C)opyright 2004-2009, by Object Refinery Limited. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): -; @@ -36,13 +36,16 @@ * ------- * 25-May-2004 : Version 1 (DG); * 21-Nov-2005 : Added getters for the mean and standard deviation (DG); + * 12-Feb-2009 : Precompute some constants from the function - see bug + * 2572016 (DG); * */ package org.jfree.data.function; /** - * A normal distribution function. + * A normal distribution function. See + * http://en.wikipedia.org/wiki/Normal_distribution. */ public class NormalDistributionFunction2D implements Function2D { @@ -52,15 +55,27 @@ /** The standard deviation. */ private double std; + /** Precomputed factor for the function value. */ + private double factor; + + /** Precomputed denominator for the function value. */ + private double denominator; + /** * Constructs a new normal distribution function. * * @param mean the mean. - * @param std the standard deviation. + * @param std the standard deviation (> 0). */ public NormalDistributionFunction2D(double mean, double std) { + if (std <= 0) { + throw new IllegalArgumentException("Requires 'std' > 0."); + } this.mean = mean; this.std = std; + // calculate constant values + this.factor = 1 / (std * Math.sqrt(2.0 * Math.PI)); + this.denominator = 2 * std * std; } /** @@ -89,9 +104,8 @@ * @return The value. */ public double getValue(double x) { - return Math.exp(-1.0 * (x - this.mean) * (x - this.mean) - / (2 * this.std * this.std)) / Math.sqrt(2 * Math.PI - * this.std * this.std); + double z = x - this.mean; + return this.factor * Math.exp(-z * z / this.denominator); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mu...@us...> - 2009-06-23 07:57:21
|
Revision: 2131 http://jfreechart.svn.sourceforge.net/jfreechart/?rev=2131&view=rev Author: mungady Date: 2009-06-23 07:56:14 +0000 (Tue, 23 Jun 2009) Log Message: ----------- Synchronised with 1.0.x branch. Modified Paths: -------------- trunk/source/org/jfree/chart/renderer/category/BarRenderer.java trunk/source/org/jfree/chart/renderer/category/IntervalBarRenderer.java trunk/source/org/jfree/chart/renderer/category/ScatterRenderer.java trunk/source/org/jfree/chart/renderer/category/StatisticalBarRenderer.java trunk/source/org/jfree/data/general/DatasetUtilities.java Modified: trunk/source/org/jfree/chart/renderer/category/BarRenderer.java =================================================================== --- trunk/source/org/jfree/chart/renderer/category/BarRenderer.java 2009-06-23 07:48:54 UTC (rev 2130) +++ trunk/source/org/jfree/chart/renderer/category/BarRenderer.java 2009-06-23 07:56:14 UTC (rev 2131) @@ -31,7 +31,7 @@ * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): Christian W. Zuckschwerdt; - * Peter Kolb (patch 2497611); + * Peter Kolb (patches 2497611, 2791407); * * Changes * ------- @@ -897,15 +897,17 @@ * the base value for the bars should be included in the range. * * @param dataset the dataset (<code>null</code> permitted). + * @param includeInterval include the interval if the dataset has one? * * @return The range (or <code>null</code> if the dataset is * <code>null</code> or empty). */ - public Range findRangeBounds(CategoryDataset dataset) { + public Range findRangeBounds(CategoryDataset dataset, + boolean includeInterval) { if (dataset == null) { return null; } - Range result = DatasetUtilities.findRangeBounds(dataset); + Range result = super.findRangeBounds(dataset, includeInterval); if (result != null) { if (this.includeBaseInRange) { result = Range.expandToInclude(result, this.base); Modified: trunk/source/org/jfree/chart/renderer/category/IntervalBarRenderer.java =================================================================== --- trunk/source/org/jfree/chart/renderer/category/IntervalBarRenderer.java 2009-06-23 07:48:54 UTC (rev 2130) +++ trunk/source/org/jfree/chart/renderer/category/IntervalBarRenderer.java 2009-06-23 07:56:14 UTC (rev 2131) @@ -32,7 +32,7 @@ * Original Author: Jeremy Bowman; * Contributor(s): David Gilbert (for Object Refinery Limited); * Christian W. Zuckschwerdt; - * Peter Kolb (patch 2497611); + * Peter Kolb (patch 2497611, 2791407); * * Changes * ------- @@ -62,6 +62,9 @@ * 24-Jun-2008 : Added new barPainter mechanism (DG); * 07-Oct-2008 : Override equals() method to fix minor bug (DG); * 14-Jan-2009 : Added support for seriesVisible flags (PK); + * 16-May-2009 : The findRangeBounds() method needs to include the dataset + * interval (DG); + * 19-May-2009 : Fixed FindBugs warnings, patch by Michal Wozniak (DG); * */ @@ -77,6 +80,7 @@ import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.util.RectangleEdge; +import org.jfree.data.Range; import org.jfree.data.category.CategoryDataset; import org.jfree.data.category.IntervalCategoryDataset; @@ -103,6 +107,20 @@ } /** + * Returns the range of values from the specified dataset. For this + * renderer, this is equivalent to calling + * <code>findRangeBounds(dataset, true)</code>. + * + * @param dataset the dataset (<code>null</code> permitted). + * + * @return The range (or <code>null</code> if the dataset is + * <code>null</code> or empty). + */ + public Range findRangeBounds(CategoryDataset dataset) { + return findRangeBounds(dataset, true); + } + + /** * Draws the bar for a single (series, category) data item. * * @param g2 the graphics device. @@ -199,9 +217,6 @@ double temp = java2dValue1; java2dValue1 = java2dValue0; java2dValue0 = temp; - Number tempNum = value1; - value1 = value0; - value0 = tempNum; } // BAR WIDTH Modified: trunk/source/org/jfree/chart/renderer/category/ScatterRenderer.java =================================================================== --- trunk/source/org/jfree/chart/renderer/category/ScatterRenderer.java 2009-06-23 07:48:54 UTC (rev 2130) +++ trunk/source/org/jfree/chart/renderer/category/ScatterRenderer.java 2009-06-23 07:56:14 UTC (rev 2131) @@ -31,7 +31,7 @@ * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): David Forslund; - * Peter Kolb (patch 2497611); + * Peter Kolb (patches 2497611, 2791407); * * Changes * ------- @@ -39,6 +39,7 @@ * 11-Oct-2007 : Renamed ScatterRenderer (DG); * 17-Jun-2008 : Apply legend shape, font and paint attributes (DG); * 14-Jan-2009 : Added support for seriesVisible flags (PK); + * 16-May-2009 : Patch 2791407 - findRangeBounds() override (PK); * */ @@ -66,6 +67,7 @@ import org.jfree.chart.util.ObjectUtilities; import org.jfree.chart.util.PublicCloneable; import org.jfree.chart.util.ShapeUtilities; +import org.jfree.data.Range; import org.jfree.data.category.CategoryDataset; import org.jfree.data.statistics.MultiValueCategoryDataset; @@ -353,6 +355,20 @@ } /** + * Returns the range of values the renderer requires to display all the + * items from the specified dataset. This takes into account the range + * between the min/max values, possibly ignoring invisible series. + * + * @param dataset the dataset (<code>null</code> permitted). + * + * @return The range (or <code>null</code> if the dataset is + * <code>null</code> or empty). + */ + public Range findRangeBounds(CategoryDataset dataset) { + return findRangeBounds(dataset, true); + } + + /** * Draw a single data item. * * @param g2 the graphics device. @@ -393,8 +409,8 @@ // current data point... double x1; if (this.useSeriesOffset) { - x1 = domainAxis.getCategorySeriesMiddle(column,dataset.getColumnCount(), - visibleRow, visibleRowCount, + x1 = domainAxis.getCategorySeriesMiddle(column, + dataset.getColumnCount(), visibleRow, visibleRowCount, this.itemMargin, dataArea, plot.getDomainAxisEdge()); } else { Modified: trunk/source/org/jfree/chart/renderer/category/StatisticalBarRenderer.java =================================================================== --- trunk/source/org/jfree/chart/renderer/category/StatisticalBarRenderer.java 2009-06-23 07:48:54 UTC (rev 2130) +++ trunk/source/org/jfree/chart/renderer/category/StatisticalBarRenderer.java 2009-06-23 07:56:14 UTC (rev 2131) @@ -32,7 +32,7 @@ * Original Author: Pascal Collet; * Contributor(s): David Gilbert (for Object Refinery Limited); * Christian W. Zuckschwerdt; - * Peter Kolb (patch 2497611); + * Peter Kolb (patches 2497611, 2791407); * * Changes * ------- @@ -57,6 +57,8 @@ * 14-Nov-2007 : Added errorIndicatorStroke, and fixed bugs with drawBarOutline * and gradientPaintTransformer attributes being ignored (DG); * 14-Jan-2009 : Added support for seriesVisible flags (PK); + * 16-May-2009 : Added findRangeBounds() override to take into account the + * dataset interval (PK); * */ @@ -88,6 +90,7 @@ import org.jfree.chart.util.PublicCloneable; import org.jfree.chart.util.RectangleEdge; import org.jfree.chart.util.SerialUtilities; +import org.jfree.data.Range; import org.jfree.data.category.CategoryDataset; import org.jfree.data.statistics.StatisticalCategoryDataset; @@ -184,6 +187,20 @@ } /** + * Returns the range of values the renderer requires to display all the + * items from the specified dataset. This takes into account the range + * between the min/max values, possibly ignoring invisible series. + * + * @param dataset the dataset (<code>null</code> permitted). + * + * @return The range (or <code>null</code> if the dataset is + * <code>null</code> or empty). + */ + public Range findRangeBounds(CategoryDataset dataset) { + return findRangeBounds(dataset, true); + } + + /** * Draws the bar with its standard deviation line range for a single * (series, category) data item. * Modified: trunk/source/org/jfree/data/general/DatasetUtilities.java =================================================================== --- trunk/source/org/jfree/data/general/DatasetUtilities.java 2009-06-23 07:48:54 UTC (rev 2130) +++ trunk/source/org/jfree/data/general/DatasetUtilities.java 2009-06-23 07:56:14 UTC (rev 2131) @@ -36,6 +36,7 @@ * Andreas Schroeder; * Rafal Skalny (patch 1925366); * Jerome David (patch 2131001); + * Peter Kolb (patch 27914070; * * Changes (from 18-Sep-2001) * -------------------------- @@ -117,6 +118,8 @@ * account hidden series (DG); * 01-Apr-2009 : Handle a StatisticalCategoryDataset in * iterateToFindRangeBounds() (DG); + * 16-May-2009 : Patch 2791407 - fix iterateToFindRangeBounds for + * MultiValueCategoryDataset (PK); * */ @@ -137,7 +140,9 @@ import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.data.category.IntervalCategoryDataset; import org.jfree.data.function.Function2D; +import org.jfree.data.statistics.BoxAndWhiskerCategoryDataset; import org.jfree.data.statistics.BoxAndWhiskerXYDataset; +import org.jfree.data.statistics.MultiValueCategoryDataset; import org.jfree.data.statistics.StatisticalCategoryDataset; import org.jfree.data.xy.IntervalXYDataset; import org.jfree.data.xy.OHLCDataset; @@ -1034,7 +1039,36 @@ double minimum = Double.POSITIVE_INFINITY; double maximum = Double.NEGATIVE_INFINITY; int columnCount = dataset.getColumnCount(); - if (includeInterval && dataset instanceof IntervalCategoryDataset) { + if (includeInterval + && dataset instanceof BoxAndWhiskerCategoryDataset) { + // handle special case of BoxAndWhiskerDataset + BoxAndWhiskerCategoryDataset bx + = (BoxAndWhiskerCategoryDataset) dataset; + Iterator iterator = visibleSeriesKeys.iterator(); + while (iterator.hasNext()) { + Comparable seriesKey = (Comparable) iterator.next(); + int series = dataset.getRowIndex(seriesKey); + int itemCount = dataset.getColumnCount(); + for (int item = 0; item < itemCount; item++) { + Number lvalue = bx.getMinRegularValue(series, item); + if (lvalue == null) { + lvalue = bx.getValue(series, item); + } + Number uvalue = bx.getMaxRegularValue(series, item); + if (uvalue == null) { + uvalue = bx.getValue(series, item); + } + if (lvalue != null) { + minimum = Math.min(minimum, lvalue.doubleValue()); + } + if (uvalue != null) { + maximum = Math.max(maximum, uvalue.doubleValue()); + } + } + } + } + else if (includeInterval + && dataset instanceof IntervalCategoryDataset) { // handle the special case where the dataset has y-intervals that // we want to measure IntervalCategoryDataset icd = (IntervalCategoryDataset) dataset; @@ -1056,6 +1090,32 @@ } } else if (includeInterval + && dataset instanceof MultiValueCategoryDataset) { + // handle the special case where the dataset has y-intervals that + // we want to measure + MultiValueCategoryDataset mvcd + = (MultiValueCategoryDataset) dataset; + Iterator iterator = visibleSeriesKeys.iterator(); + while (iterator.hasNext()) { + Comparable seriesKey = (Comparable) iterator.next(); + int series = dataset.getRowIndex(seriesKey); + for (int column = 0; column < columnCount; column++) { + List values = mvcd.getValues(series, column); + Iterator valueIterator = values.iterator(); + while (valueIterator.hasNext()) { + Object o = valueIterator.next(); + if (o instanceof Number){ + double v = ((Number) o).doubleValue(); + if (!Double.isNaN(v)){ + minimum = Math.min(minimum, v); + maximum = Math.max(maximum, v); + } + } + } + } + } + } + else if (includeInterval && dataset instanceof StatisticalCategoryDataset) { // handle the special case where the dataset has y-intervals that // we want to measure @@ -1565,7 +1625,7 @@ Number value; if (dataset instanceof IntervalCategoryDataset) { IntervalCategoryDataset icd - = (IntervalCategoryDataset) dataset; + = (IntervalCategoryDataset) dataset; value = icd.getStartValue(series, item); } else { @@ -1622,7 +1682,7 @@ double value; if (dataset instanceof IntervalXYDataset) { IntervalXYDataset intervalXYData - = (IntervalXYDataset) dataset; + = (IntervalXYDataset) dataset; value = intervalXYData.getStartYValue(series, item); } else if (dataset instanceof OHLCDataset) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mu...@us...> - 2009-06-29 13:12:00
|
Revision: 2173 http://jfreechart.svn.sourceforge.net/jfreechart/?rev=2173&view=rev Author: mungady Date: 2009-06-29 12:42:20 +0000 (Mon, 29 Jun 2009) Log Message: ----------- Implemented selection mechanism for XYPlots (other plot types later). Modified Paths: -------------- trunk/source/org/jfree/chart/ChartPanel.java trunk/source/org/jfree/chart/ChartRenderingInfo.java trunk/source/org/jfree/chart/plot/XYPlot.java trunk/source/org/jfree/chart/renderer/xy/XYItemRendererState.java trunk/source/org/jfree/data/general/SeriesChangeEvent.java trunk/source/org/jfree/data/statistics/SimpleHistogramBin.java trunk/source/org/jfree/data/statistics/SimpleHistogramDataset.java trunk/source/org/jfree/data/time/TimeSeriesCollection.java trunk/source/org/jfree/data/time/TimeSeriesDataItem.java trunk/source/org/jfree/data/xy/AbstractXYDataset.java trunk/source/org/jfree/data/xy/XYDataItem.java trunk/source/org/jfree/data/xy/XYSeriesCollection.java Added Paths: ----------- trunk/source/org/jfree/chart/RenderingSource.java trunk/source/org/jfree/chart/panel/AbstractMouseHandler.java trunk/source/org/jfree/chart/panel/PanHandler.java trunk/source/org/jfree/chart/panel/RegionSelectionHandler.java trunk/source/org/jfree/chart/panel/ZoomHandler.java trunk/source/org/jfree/chart/plot/Selectable.java trunk/source/org/jfree/data/general/DatasetAndSelection.java trunk/source/org/jfree/data/general/DatasetSelectionState.java trunk/source/org/jfree/data/general/SeriesChangeInfo.java trunk/source/org/jfree/data/general/SeriesChangeType.java trunk/source/org/jfree/data/xy/SelectableXYDataset.java trunk/source/org/jfree/data/xy/XYDatasetSelectionState.java Modified: trunk/source/org/jfree/chart/ChartPanel.java =================================================================== --- trunk/source/org/jfree/chart/ChartPanel.java 2009-06-29 12:10:22 UTC (rev 2172) +++ trunk/source/org/jfree/chart/ChartPanel.java 2009-06-29 12:42:20 UTC (rev 2173) @@ -162,13 +162,15 @@ * 05-May-2009 : Match scaling (and insets) in doCopy() (DG); * 01-Jun-2009 : Check for null chart in mousePressed() method (DG); * 08-Jun-2009 : Fixed bug in setMouseWheelEnabled() (DG); + * 29-Jun-2009 : Implemented new mouse handler mechanism (DG); + * */ package org.jfree.chart; import java.awt.AWTEvent; +import java.awt.BasicStroke; import java.awt.Color; -import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; @@ -178,6 +180,8 @@ import java.awt.Paint; import java.awt.Point; import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.Stroke; import java.awt.Toolkit; import java.awt.Transparency; import java.awt.datatransfer.Clipboard; @@ -188,6 +192,7 @@ import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.geom.AffineTransform; +import java.awt.geom.GeneralPath; import java.awt.geom.Line2D; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; @@ -226,10 +231,12 @@ import org.jfree.chart.event.ChartChangeListener; import org.jfree.chart.event.ChartProgressEvent; import org.jfree.chart.event.ChartProgressListener; +import org.jfree.chart.panel.Overlay; import org.jfree.chart.event.OverlayChangeEvent; import org.jfree.chart.event.OverlayChangeListener; -import org.jfree.chart.panel.Overlay; -import org.jfree.chart.plot.Pannable; +import org.jfree.chart.panel.AbstractMouseHandler; +import org.jfree.chart.panel.PanHandler; +import org.jfree.chart.panel.ZoomHandler; import org.jfree.chart.plot.Plot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.PlotRenderingInfo; @@ -237,6 +244,9 @@ import org.jfree.chart.ui.ExtensionFileFilter; import org.jfree.chart.util.ResourceBundleWrapper; import org.jfree.chart.util.SerialUtilities; +import org.jfree.data.general.Dataset; +import org.jfree.data.general.DatasetAndSelection; +import org.jfree.data.general.DatasetSelectionState; /** * A Swing GUI component for displaying a {@link JFreeChart} object. @@ -247,7 +257,8 @@ */ public class ChartPanel extends JPanel implements ChartChangeListener, ChartProgressListener, ActionListener, MouseListener, - MouseMotionListener, OverlayChangeListener, Printable, Serializable { + MouseMotionListener, OverlayChangeListener, RenderingSource, + Printable, Serializable { /** For serialization. */ private static final long serialVersionUID = 6046366297214274674L; @@ -512,29 +523,72 @@ "org.jfree.chart.LocalizationBundle"); /** - * Temporary storage for the width and height of the chart - * drawing area during panning. + * A list of overlays for the panel. + * + * @since 1.0.13 */ - private double panW, panH; + private List overlays; - /** The last mouse position during panning. */ - private Point panLast; + /** + * The mouse handlers that are available to deal with mouse events. + * + * @since 1.2.0 + */ + private List availableMouseHandlers; /** - * The mask for mouse events to trigger panning. + * The current "live" mouse handler. One of the handlers from the + * 'availableMouseHandlers' list will be selected (typically in the + * mousePressed() method) to be the live handler. * - * @since 1.0.13 + * @since 1.2.0 */ - private int panMask = InputEvent.CTRL_MASK; + private AbstractMouseHandler liveMouseHandler; /** - * A list of overlays for the panel. + * A list of auxiliary mouse handlers that will be called after the + * live handler has done it's work. + */ + private List auxiliaryMouseHandlers; + + /** + * The zoom handler that is installed by default. * - * @since 1.0.13 + * @since 1.2.0 */ - private List overlays; + private ZoomHandler zoomHandler; /** + * The selection shape (may be <code>null</code>). + * + * @since 1.2.0 + */ + private Shape selectionShape; + + /** + * The selection fill paint (may be <code>null</code>). + * + * @since 1.2.0 + */ + private Paint selectionFillPaint; + + /** + * The paint used to draw the outline of the selection shape. + * + * @since 1.2.0 + */ + private Paint selectionOutlinePaint = Color.darkGray; + + /** + * The stroke used to draw the outline of the selection stroke. + * + * @since 1.2.0 + */ + private Stroke selectionOutlineStroke = new BasicStroke(1.0f, + BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 4.0f, + new float[] {3.0f, 3.0f}, 0.0f); + + /** * Constructs a panel that displays the specified chart. * * @param chart the chart. @@ -699,6 +753,7 @@ setChart(chart); this.chartMouseListeners = new EventListenerList(); this.info = new ChartRenderingInfo(); + this.info.setRenderingSource(this); setPreferredSize(new Dimension(width, height)); this.useBuffer = useBuffer; this.refreshBuffer = false; @@ -734,15 +789,24 @@ this.zoomOutlinePaint = Color.blue; this.zoomFillPaint = new Color(0, 0, 255, 63); - this.panMask = InputEvent.CTRL_MASK; + this.overlays = new java.util.ArrayList(); + + this.availableMouseHandlers = new java.util.ArrayList(); + + this.zoomHandler = new ZoomHandler(); + this.availableMouseHandlers.add(zoomHandler); + + PanHandler panHandler = new PanHandler(); + int panMask = InputEvent.CTRL_MASK; // for MacOSX we can't use the CTRL key for mouse drags, see: // http://developer.apple.com/qa/qa2004/qa1362.html String osName = System.getProperty("os.name").toLowerCase(); if (osName.startsWith("mac os x")) { - this.panMask = InputEvent.ALT_MASK; + panMask = InputEvent.ALT_MASK; } - - this.overlays = new java.util.ArrayList(); + panHandler.setModifier(panMask); + this.availableMouseHandlers.add(panHandler); + this.auxiliaryMouseHandlers = new java.util.ArrayList(); } /** @@ -1359,34 +1423,38 @@ e.printStackTrace(); } } - else if (!flag && this.mouseWheelHandler != null) { - // use reflection to deregister the mouseWheelHandler - try { - Class mwl = Class.forName("java.awt.event.MouseWheelListener"); - Class c2 = ChartPanel.class; - Method m = c2.getMethod("removeMouseWheelListener", - new Class[] {mwl}); - m.invoke(this, new Object[] {this.mouseWheelHandler}); - this.mouseWheelHandler = null; + else { + + if (this.mouseWheelHandler != null) { + // use reflection to deregister the mouseWheelHandler + try { + Class mwl = Class.forName( + "java.awt.event.MouseWheelListener"); + Class c2 = ChartPanel.class; + Method m = c2.getMethod("removeMouseWheelListener", + new Class[] {mwl}); + m.invoke(this, new Object[] {this.mouseWheelHandler}); + this.mouseWheelHandler = null; + } + catch (ClassNotFoundException e) { + // must be running on JRE 1.3.1, so just ignore this + } + catch (SecurityException e) { + e.printStackTrace(); + } + catch (NoSuchMethodException e) { + e.printStackTrace(); + } + catch (IllegalArgumentException e) { + e.printStackTrace(); + } + catch (IllegalAccessException e) { + e.printStackTrace(); + } + catch (InvocationTargetException e) { + e.printStackTrace(); + } } - catch (ClassNotFoundException e) { - // must be running on JRE 1.3.1, so just ignore this - } - catch (SecurityException e) { - e.printStackTrace(); - } - catch (NoSuchMethodException e) { - e.printStackTrace(); - } - catch (IllegalArgumentException e) { - e.printStackTrace(); - } - catch (IllegalAccessException e) { - e.printStackTrace(); - } - catch (InvocationTargetException e) { - e.printStackTrace(); - } } } @@ -1436,6 +1504,106 @@ } /** + * Returns the value of the <code>useBuffer</code> flag as set in the + * constructor. + * + * @return A boolean. + * + * @since 1.2.0 + */ + public boolean getUseBuffer() { + return this.useBuffer; + } + + /** + * Returns the orientation of the plot in the panel. + * + * @return The orientation of the plot. + * + * @since 1.2.0 + */ + public PlotOrientation getOrientation() { + return this.orientation; + } + + /** + * Adds a mouse handler. + * + * @param handler the handler (<code>null</code> not permitted). + * + * @see #removeMouseHandler(org.jfree.chart.panel.AbstractMouseHandler) + * + * @since 1.2.0 + */ + public void addMouseHandler(AbstractMouseHandler handler) { + if (handler == null) { + throw new IllegalArgumentException("Null 'handler' argument."); + } + this.availableMouseHandlers.add(handler); + } + + /** + * Removes a mouse handler. + * + * @param handler the handler (<code>null</code> not permitted). + * + * @return A boolean. + * + * @see #addMouseHandler(org.jfree.chart.panel.AbstractMouseHandler) + * + * @since 1.2.0 + */ + public boolean removeMouseHandler(AbstractMouseHandler handler) { + if (handler == null) { + throw new IllegalArgumentException("Null 'handler' argument."); + } + return this.availableMouseHandlers.remove(handler); + } + + /** + * Clears the 'liveMouseHandler' field. Each handler is responsible for + * calling this method when they have finished handling mouse events. + * + * @since 1.2.0 + */ + public void clearLiveMouseHandler() { + this.liveMouseHandler = null; + } + + /** + * Returns the zoom handler. + * + * @return The zoom handler. + * + * @since 1.2.0 + */ + public ZoomHandler getZoomHandler() { + return this.zoomHandler; + } + + /** + * Returns the zoom rectangle. + * + * @return The zoom rectangle (possibly <code>null</code>). + * + * @since 1.2.0 + */ + public Rectangle2D getZoomRectangle() { + return this.zoomRectangle; + } + + /** + * Sets the zoom rectangle for the panel. + * + * @param rect the rectangle (<code>null</code> permitted). + * + * @since 1.2.0 + */ + public void setZoomRectangle(Rectangle2D rect) { + this.zoomRectangle = rect; + } + + /** * Switches the display of tooltips for the panel on or off. Note that * tooltips can only be displayed if the chart has been configured to * generate tooltip items. @@ -1700,7 +1868,7 @@ // we use XOR so we can XOR the rectangle away again without redrawing // the chart drawZoomRectangle(g2, !this.useBuffer); - + drawSelectionShape(g2, !this.useBuffer); g2.dispose(); this.anchor = null; @@ -1821,6 +1989,15 @@ this.ownToolTipDelaysActive = true; } + + if (this.liveMouseHandler != null) { + this.liveMouseHandler.mouseEntered(e); + } + Iterator iterator = this.auxiliaryMouseHandlers.iterator(); + while (iterator.hasNext()) { + AbstractMouseHandler h = (AbstractMouseHandler) iterator.next(); + h.mouseEntered(e); + } } /** @@ -1839,6 +2016,15 @@ ttm.setDismissDelay(this.originalToolTipDismissDelay); this.ownToolTipDelaysActive = false; } + + if (this.liveMouseHandler != null) { + this.liveMouseHandler.mouseExited(e); + } + Iterator iterator = this.auxiliaryMouseHandlers.iterator(); + while (iterator.hasNext()) { + AbstractMouseHandler h = (AbstractMouseHandler) iterator.next(); + h.mouseExited(e); + } } /** @@ -1853,59 +2039,50 @@ if (this.chart == null) { return; } - Plot plot = this.chart.getPlot(); int mods = e.getModifiers(); - if ((mods & this.panMask) == this.panMask) { - // can we pan this plot? - if (plot instanceof Pannable) { - Pannable pannable = (Pannable) plot; - if (pannable.isDomainPannable() || pannable.isRangePannable()) { - Rectangle2D screenDataArea = getScreenDataArea(e.getX(), - e.getY()); - if (screenDataArea != null && screenDataArea.contains( - e.getPoint())) { - this.panW = screenDataArea.getWidth(); - this.panH = screenDataArea.getHeight(); - this.panLast = e.getPoint(); - setCursor(Cursor.getPredefinedCursor( - Cursor.MOVE_CURSOR)); - } - } - // the actual panning occurs later in the mouseDragged() - // method + + if (e.isPopupTrigger()) { + if (this.popup != null) { + displayPopupMenu(e.getX(), e.getY()); } + return; } - else if (this.zoomRectangle == null) { - Rectangle2D screenDataArea = getScreenDataArea(e.getX(), e.getY()); - if (screenDataArea != null) { - this.zoomPoint = getPointInRectangle(e.getX(), e.getY(), - screenDataArea); + + if (this.liveMouseHandler != null) { + this.liveMouseHandler.mousePressed(e); + } + else { + AbstractMouseHandler h = null; + boolean found = false; + Iterator iterator = this.availableMouseHandlers.iterator(); + AbstractMouseHandler nomod = null; + while (iterator.hasNext() && !found) { + h = (AbstractMouseHandler) iterator.next(); + if (h.getModifier() == 0 && nomod == null) { + nomod = h; + } + else { + found = (mods & h.getModifier()) == h.getModifier(); + } } - else { - this.zoomPoint = null; + if (!found && nomod != null) { + h = nomod; + found = true; } - if (e.isPopupTrigger()) { - if (this.popup != null) { - displayPopupMenu(e.getX(), e.getY()); - } + if (found) { + this.liveMouseHandler = h; + this.liveMouseHandler.mousePressed(e); } } - } - /** - * Returns a point based on (x, y) but constrained to be within the bounds - * of the given rectangle. This method could be moved to JCommon. - * - * @param x the x-coordinate. - * @param y the y-coordinate. - * @param area the rectangle (<code>null</code> not permitted). - * - * @return A point within the rectangle. - */ - private Point2D getPointInRectangle(int x, int y, Rectangle2D area) { - double xx = Math.max(area.getMinX(), Math.min(x, area.getMaxX())); - double yy = Math.max(area.getMinY(), Math.min(y, area.getMaxY())); - return new Point2D.Double(xx, yy); + // now process the auxiliary handlers + Iterator iterator = this.auxiliaryMouseHandlers.iterator(); + while (iterator.hasNext()) { + AbstractMouseHandler handler = + (AbstractMouseHandler) iterator.next(); + handler.mousePressed(e); + } + } /** @@ -1920,93 +2097,17 @@ return; } - // handle panning if we have a start point - if (this.panLast != null) { - double dx = e.getX() - this.panLast.getX(); - double dy = e.getY() - this.panLast.getY(); - if (dx == 0.0 && dy == 0.0) { - return; - } - double wPercent = -dx / this.panW; - double hPercent = dy / this.panH; - boolean old = this.chart.getPlot().isNotify(); - this.chart.getPlot().setNotify(false); - Pannable p = (Pannable) this.chart.getPlot(); - if (p.getOrientation() == PlotOrientation.VERTICAL) { - p.panDomainAxes(wPercent, this.info.getPlotInfo(), - this.panLast); - p.panRangeAxes(hPercent, this.info.getPlotInfo(), - this.panLast); - } - else { - p.panDomainAxes(hPercent, this.info.getPlotInfo(), - this.panLast); - p.panRangeAxes(wPercent, this.info.getPlotInfo(), - this.panLast); - } - this.panLast = e.getPoint(); - this.chart.getPlot().setNotify(old); - return; + if (this.liveMouseHandler != null) { + this.liveMouseHandler.mouseDragged(e); } - // if no initial zoom point was set, ignore dragging... - if (this.zoomPoint == null) { - return; + // now process the auxiliary handlers + Iterator iterator = this.auxiliaryMouseHandlers.iterator(); + while (iterator.hasNext()) { + AbstractMouseHandler handler = (AbstractMouseHandler) iterator.next(); + handler.mouseDragged(e); } - Graphics2D g2 = (Graphics2D) getGraphics(); - // erase the previous zoom rectangle (if any). We only need to do - // this is we are using XOR mode, which we do when we're not using - // the buffer (if there is a buffer, then at the end of this method we - // just trigger a repaint) - if (!this.useBuffer) { - drawZoomRectangle(g2, true); - } - - boolean hZoom = false; - boolean vZoom = false; - if (this.orientation == PlotOrientation.HORIZONTAL) { - hZoom = this.rangeZoomable; - vZoom = this.domainZoomable; - } - else { - hZoom = this.domainZoomable; - vZoom = this.rangeZoomable; - } - Rectangle2D scaledDataArea = getScreenDataArea( - (int) this.zoomPoint.getX(), (int) this.zoomPoint.getY()); - if (hZoom && vZoom) { - // selected rectangle shouldn't extend outside the data area... - double xmax = Math.min(e.getX(), scaledDataArea.getMaxX()); - double ymax = Math.min(e.getY(), scaledDataArea.getMaxY()); - this.zoomRectangle = new Rectangle2D.Double( - this.zoomPoint.getX(), this.zoomPoint.getY(), - xmax - this.zoomPoint.getX(), ymax - this.zoomPoint.getY()); - } - else if (hZoom) { - double xmax = Math.min(e.getX(), scaledDataArea.getMaxX()); - this.zoomRectangle = new Rectangle2D.Double( - this.zoomPoint.getX(), scaledDataArea.getMinY(), - xmax - this.zoomPoint.getX(), scaledDataArea.getHeight()); - } - else if (vZoom) { - double ymax = Math.min(e.getY(), scaledDataArea.getMaxY()); - this.zoomRectangle = new Rectangle2D.Double( - scaledDataArea.getMinX(), this.zoomPoint.getY(), - scaledDataArea.getWidth(), ymax - this.zoomPoint.getY()); - } - - // Draw the new zoom rectangle... - if (this.useBuffer) { - repaint(); - } - else { - // with no buffer, we use XOR to draw the rectangle "over" the - // chart... - drawZoomRectangle(g2, true); - } - g2.dispose(); - } /** @@ -2018,92 +2119,22 @@ */ public void mouseReleased(MouseEvent e) { - // if we've been panning, we need to reset now that the mouse is - // released... - if (this.panLast != null) { - this.panLast = null; - setCursor(Cursor.getDefaultCursor()); + if (e.isPopupTrigger()) { + if (this.popup != null) { + displayPopupMenu(e.getX(), e.getY()); + } + return; } - else if (this.zoomRectangle != null) { - boolean hZoom = false; - boolean vZoom = false; - if (this.orientation == PlotOrientation.HORIZONTAL) { - hZoom = this.rangeZoomable; - vZoom = this.domainZoomable; - } - else { - hZoom = this.domainZoomable; - vZoom = this.rangeZoomable; - } - - boolean zoomTrigger1 = hZoom && Math.abs(e.getX() - - this.zoomPoint.getX()) >= this.zoomTriggerDistance; - boolean zoomTrigger2 = vZoom && Math.abs(e.getY() - - this.zoomPoint.getY()) >= this.zoomTriggerDistance; - if (zoomTrigger1 || zoomTrigger2) { - if ((hZoom && (e.getX() < this.zoomPoint.getX())) - || (vZoom && (e.getY() < this.zoomPoint.getY()))) { - restoreAutoBounds(); - } - else { - double x, y, w, h; - Rectangle2D screenDataArea = getScreenDataArea( - (int) this.zoomPoint.getX(), - (int) this.zoomPoint.getY()); - double maxX = screenDataArea.getMaxX(); - double maxY = screenDataArea.getMaxY(); - // for mouseReleased event, (horizontalZoom || verticalZoom) - // will be true, so we can just test for either being false; - // otherwise both are true - if (!vZoom) { - x = this.zoomPoint.getX(); - y = screenDataArea.getMinY(); - w = Math.min(this.zoomRectangle.getWidth(), - maxX - this.zoomPoint.getX()); - h = screenDataArea.getHeight(); - } - else if (!hZoom) { - x = screenDataArea.getMinX(); - y = this.zoomPoint.getY(); - w = screenDataArea.getWidth(); - h = Math.min(this.zoomRectangle.getHeight(), - maxY - this.zoomPoint.getY()); - } - else { - x = this.zoomPoint.getX(); - y = this.zoomPoint.getY(); - w = Math.min(this.zoomRectangle.getWidth(), - maxX - this.zoomPoint.getX()); - h = Math.min(this.zoomRectangle.getHeight(), - maxY - this.zoomPoint.getY()); - } - Rectangle2D zoomArea = new Rectangle2D.Double(x, y, w, h); - zoom(zoomArea); - } - this.zoomPoint = null; - this.zoomRectangle = null; - } - else { - // erase the zoom rectangle - Graphics2D g2 = (Graphics2D) getGraphics(); - if (this.useBuffer) { - repaint(); - } - else { - drawZoomRectangle(g2, true); - } - g2.dispose(); - this.zoomPoint = null; - this.zoomRectangle = null; - } - + if (this.liveMouseHandler != null) { + this.liveMouseHandler.mouseReleased(e); } - else if (e.isPopupTrigger()) { - if (this.popup != null) { - displayPopupMenu(e.getX(), e.getY()); - } + // now process the auxiliary handlers + Iterator iterator = this.auxiliaryMouseHandlers.iterator(); + while (iterator.hasNext()) { + AbstractMouseHandler handler = (AbstractMouseHandler) iterator.next(); + handler.mouseReleased(e); } } @@ -2606,7 +2637,7 @@ private void drawZoomRectangle(Graphics2D g2, boolean xor) { if (this.zoomRectangle != null) { if (xor) { - // Set XOR mode to draw the zoom rectangle + // Set XOR mode to draw the zoom rectangle g2.setXORMode(Color.gray); } if (this.fillZoomRectangle) { @@ -2625,6 +2656,38 @@ } /** + * Draws zoom rectangle (if present). + * The drawing is performed in XOR mode, therefore + * when this method is called twice in a row, + * the second call will completely restore the state + * of the canvas. + * + * @param g2 the graphics device. + * @param xor use XOR for drawing? + */ + private void drawSelectionShape(Graphics2D g2, boolean xor) { + if (this.selectionShape != null) { + if (xor) { + // Set XOR mode to draw the zoom rectangle + g2.setXORMode(Color.gray); + } + if (this.selectionFillPaint != null) { + g2.setPaint(this.selectionFillPaint); + g2.fill(this.selectionShape); + } + g2.setPaint(this.selectionOutlinePaint); + g2.setStroke(this.selectionOutlineStroke); + GeneralPath pp = new GeneralPath(this.selectionShape); + pp.closePath(); + g2.draw(pp); + if (xor) { + // Reset to the default 'overwrite' mode + g2.setPaintMode(); + } + } + } + + /** * Draws a vertical line used to trace the mouse position to the horizontal * axis. * @@ -3119,4 +3182,137 @@ } + /** + * Returns the selection shape. + * + * @return The selection shape (possibly <code>null</code>). + * + * @see #setSelectionShape(java.awt.Shape) + * + * @since 1.2.0 + */ + public Shape getSelectionShape() { + return this.selectionShape; + } + + /** + * Sets the selection shape. + * + * @param shape the selection shape (<code>null</code> permitted). + * + * @see #getSelectionShape() + * + * @since 1.2.0 + */ + public void setSelectionShape(Shape shape) { + this.selectionShape = shape; + } + + /** + * Returns the selection fill paint. + * + * @return The selection fill paint (possibly <code>null</code>). + * + * @see #setSelectionFillPaint(java.awt.Paint) + * + * @since 1.2.0 + */ + public Paint getSelectionFillPaint() { + return this.selectionFillPaint; + } + + /** + * Sets the selection fill paint. + * + * @param paint the paint (<code>null</code> permitted). + * + * @see #getSelectionFillPaint() + * + * @since 1.2.0 + */ + public void setSelectionFillPaint(Paint paint) { + this.selectionFillPaint = paint; + } + + /** + * Returns the selection outline paint. + * + * @return The selection outline paint. + * + * @since 1.2.0 + */ + public Paint getSelectionOutlinePaint() { + return this.selectionOutlinePaint; + } + + /** + * Sets the selection outline paint. + * + * @param paint + */ + public void setSelectionOutlinePaint(Paint paint) { + this.selectionOutlinePaint = paint; + } + + /** + * Returns the selection outline stroke. + * + * @return The selection outline stroke. + * + * @since 1.2.0 + */ + public Stroke getSelectionOutlineStroke() { + return this.selectionOutlineStroke; + } + + /** + * Sets the selection outline stroke. + * + * @param stroke the stroke. + * + * @since 1.2.0 + */ + public void setSelectionOutlineStroke(Stroke stroke) { + this.selectionOutlineStroke = stroke; + } + + /** + * A list of {@link DatasetAndSelection} objects. + */ + private List selectionStates = new java.util.ArrayList(); + + /** + * Returns the selection state for the specified dataset, if any. + * + * @param dataset the dataset (<code>null</code> not permitted). + * + * @return The selection state. + * + * @since 1.2.0 + */ + public DatasetSelectionState getSelectionState(Dataset dataset) { + Iterator iterator = this.selectionStates.iterator(); + while (iterator.hasNext()) { + DatasetAndSelection das = (DatasetAndSelection) iterator.next(); + if (das.getDataset() == dataset) { + return das.getSelection(); + } + } + return null; + } + + /** + * When setting up a selectable panel, you need to create the selection + * state and register it here (unless the dataset is managing the selection + * directly). + * + * @param dataset the dataset (<code>null</code> not permitted). + * @param state the state. + * + * @since 1.2.0 + */ + public void putSelectionState(Dataset dataset, DatasetSelectionState state) { + this.selectionStates.add(new DatasetAndSelection(dataset, state)); + } + } Modified: trunk/source/org/jfree/chart/ChartRenderingInfo.java =================================================================== --- trunk/source/org/jfree/chart/ChartRenderingInfo.java 2009-06-29 12:10:22 UTC (rev 2172) +++ trunk/source/org/jfree/chart/ChartRenderingInfo.java 2009-06-29 12:42:20 UTC (rev 2173) @@ -2,7 +2,7 @@ * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * - * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors. + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * @@ -27,7 +27,7 @@ * ----------------------- * ChartRenderingInfo.java * ----------------------- - * (C) Copyright 2002-2008, by Object Refinery Limited. + * (C) Copyright 2002-2009, by Object Refinery Limited. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): -; @@ -45,6 +45,7 @@ * ------------- JFREECHART 1.0.x --------------------------------------------- * 01-Dec-2006 : Fixed equals() and clone() (DG); * 21-Jun-2007 : Removed JCommon dependencies (DG); + * 18-Jun-2009 : Added RenderingSource (DG); * */ @@ -96,6 +97,18 @@ private EntityCollection entities; /** + * The rendering source. This is the object that calls the draw(...) + * method in the {@link JFreeChart} class, or <code>null</code> if the + * rendering source chooses to remain anonymous. Our initial use for + * this is to identify the {@link ChartPanel} that is drawing a chart, so + * that selection state info can be retrieved from the panel in some + * cases. + * + * @since 1.2.0 + */ + private RenderingSource renderingSource; + + /** * Constructs a new ChartRenderingInfo structure that can be used to * collect information about the dimensions of a rendered chart. */ @@ -162,8 +175,35 @@ } /** - * Clears the information recorded by this object. + * Returns the rendering source, or <code>null</code>. + * + * @return The rendering source (possibly <code>null</code>). + * + * @see #setRenderingSource(org.jfree.chart.RenderingSource) + * + * @since 1.2.0 */ + public RenderingSource getRenderingSource() { + return this.renderingSource; + } + + /** + * Sets the rendering source. + * + * @param source the source (<code>null</code> permitted). + * + * @see #getRenderingSource() + * + * @since 1.2.0 + */ + public void setRenderingSource(RenderingSource source) { + this.renderingSource = source; + } + + /** + * Clears the information recorded by this object, but not the + * rendering source. + */ public void clear() { this.chartArea.setRect(0.0, 0.0, 0.0, 0.0); this.plotInfo = new PlotRenderingInfo(this); Added: trunk/source/org/jfree/chart/RenderingSource.java =================================================================== --- trunk/source/org/jfree/chart/RenderingSource.java (rev 0) +++ trunk/source/org/jfree/chart/RenderingSource.java 2009-06-29 12:42:20 UTC (rev 2173) @@ -0,0 +1,66 @@ +/* =========================================================== + * JFreeChart : a free chart library for the Java(tm) platform + * =========================================================== + * + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. + * + * Project Info: http://www.jfree.org/jfreechart/index.html + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * -------------------- + * RenderingSource.java + * -------------------- + * (C) Copyright 2009, by Object Refinery Limited. + * + * Original Author: David Gilbert (for Object Refinery Limited); + * Contributor(s): -; + * + * Changes: + * -------- + * 29-Jun-2009 : Version 1 (DG); + * + */ + +package org.jfree.chart; + +import org.jfree.data.general.Dataset; +import org.jfree.data.general.DatasetSelectionState; + +/** + * A <code>RenderingSource</code> is an object that calls the + * <code>draw(...)</code> method in the {@link JFreeChart} class. An example + * is the {@link ChartPanel} class. + */ +public interface RenderingSource { + + /** + * Returns the selection state, if any, that this source is maintaining + * for the specified dataset. + * + * @param dataset the dataset (<code>null</code> not permitted). + * + * @return The selection state (possibly <code>null</code>). + */ + public DatasetSelectionState getSelectionState(Dataset dataset); + + // the source will define a method to "put" the selection state, but we + // don't declare this in the interface. + +} Added: trunk/source/org/jfree/chart/panel/AbstractMouseHandler.java =================================================================== --- trunk/source/org/jfree/chart/panel/AbstractMouseHandler.java (rev 0) +++ trunk/source/org/jfree/chart/panel/AbstractMouseHandler.java 2009-06-29 12:42:20 UTC (rev 2173) @@ -0,0 +1,154 @@ +/* =========================================================== + * JFreeChart : a free chart library for the Java(tm) platform + * =========================================================== + * + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. + * + * Project Info: http://www.jfree.org/jfreechart/index.html + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * ------------------------- + * AbstractMouseHandler.java + * ------------------------- + * (C) Copyright 2009, by Object Refinery Limited. + * + * Original Author: David Gilbert (for Object Refinery Limited); + * Contributor(s): -; + * + * Changes: + * -------- + * 18-Jun-2009 : Version 1 (DG); + * + */ + +package org.jfree.chart.panel; + +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; + +/** + * A handler for mouse events in a {@link ChartPanel}. A handler can be + * assigned a modifier and installed on the panel to be invoked by the user. + * + * @since 1.2.0 + */ +public class AbstractMouseHandler implements MouseListener, + MouseMotionListener { + + /** The modifier used to invoke this handler. */ + private int modifier; + + /** + * Default constructor. + */ + public AbstractMouseHandler() { + this.modifier = 0; + } + + /** + * Returns the modifier for this handler. + * + * @return The modifier. + */ + public int getModifier() { + return this.modifier; + } + + /** + * Sets the modifier for this handler. + * + * @param modifier the modifier. + */ + public void setModifier(int modifier) { + this.modifier = modifier; + } + + /** + * Handle a mouse pressed event. This implementation does nothing - + * subclasses should override if necessary. + * + * @param e the mouse event. + */ + public void mousePressed(MouseEvent e) { + // override if you need this method to do something + } + + /** + * Handle a mouse released event. This implementation does nothing - + * subclasses should override if necessary. + * + * @param e the mouse event. + */ + public void mouseReleased(MouseEvent e) { + // override if you need this method to do something + } + + /** + * Handle a mouse clicked event. This implementation does nothing - + * subclasses should override if necessary. + * + * @param e the mouse event. + */ + public void mouseClicked(MouseEvent e) { + // override if you need this method to do something + } + + /** + * Handle a mouse entered event. This implementation does nothing - + * subclasses should override if necessary. + * + * @param e the mouse event. + */ + public void mouseEntered(MouseEvent e) { + // override if you need this method to do something + } + + /** + * Handle a mouse moved event. This implementation does nothing - + * subclasses should override if necessary. + * + * @param e the mouse event. + */ + public void mouseMoved(MouseEvent e) { + // override if you need this method to do something + } + + /** + * Handle a mouse exited event. This implementation does nothing - + * subclasses should override if necessary. + * + * @param e the mouse event. + */ + public void mouseExited(MouseEvent e) { + // override if you need this method to do something + } + + /** + * Handle a mouse dragged event. This implementation does nothing - + * subclasses should override if necessary. + * + * @param e the mouse event. + */ + public void mouseDragged(MouseEvent e) { + // override if you need this method to do something + } + +} Added: trunk/source/org/jfree/chart/panel/PanHandler.java =================================================================== --- trunk/source/org/jfree/chart/panel/PanHandler.java (rev 0) +++ trunk/source/org/jfree/chart/panel/PanHandler.java 2009-06-29 12:42:20 UTC (rev 2173) @@ -0,0 +1,158 @@ +/* =========================================================== + * JFreeChart : a free chart library for the Java(tm) platform + * =========================================================== + * + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. + * + * Project Info: http://www.jfree.org/jfreechart/index.html + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * --------------- + * PanHandler.java + * --------------- + * (C) Copyright 2009, by Object Refinery Limited. + * + * Original Author: David Gilbert (for Object Refinery Limited); + * Contributor(s): -; + * + * Changes: + * -------- + * 11-Jun-2009 : Version 1 (DG); + * + */ + +package org.jfree.chart.panel; + +import java.awt.Cursor; +import java.awt.Point; +import java.awt.event.MouseEvent; +import java.awt.geom.Rectangle2D; +import org.jfree.chart.ChartPanel; +import org.jfree.chart.JFreeChart; +import org.jfree.chart.plot.Pannable; +import org.jfree.chart.plot.Plot; +import org.jfree.chart.plot.PlotOrientation; +import org.jfree.chart.plot.PlotRenderingInfo; + +/** + * Handles panning operations in a {@link ChartPanel} if the plot supports + * panning (see the {@link Pannable} interface). + * + * @since 1.2.0 + */ +public class PanHandler extends AbstractMouseHandler { + + /** + * Temporary storage for the width and height of the chart + * drawing area during panning. + */ + private double panW, panH; + + /** The last mouse position during panning. */ + private Point panLast; + + /** + * Creates a new instance. + */ + public PanHandler() { + super(); + this.panLast = null; + } + + /** + * Handles a mouse pressed event. + * + * @param e the event. + */ + public void mousePressed(MouseEvent e) { + ChartPanel panel = (ChartPanel) e.getSource(); + Plot plot = panel.getChart().getPlot(); + if (!(plot instanceof Pannable)) { + return; // there's nothing for us to do + } + Pannable pannable = (Pannable) plot; + if (pannable.isDomainPannable() || pannable.isRangePannable()) { + Rectangle2D screenDataArea = panel.getScreenDataArea(e.getX(), + e.getY()); + if (screenDataArea != null && screenDataArea.contains( + e.getPoint())) { + this.panW = screenDataArea.getWidth(); + this.panH = screenDataArea.getHeight(); + this.panLast = e.getPoint(); + panel.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); + } + } + // the actual panning occurs later in the mouseDragged() method + } + + /** + * Handles a mouse dragged event. This is where the panning occurs. + * + * @param e the event. + */ + public void mouseDragged(MouseEvent e) { + // handle panning if we have a start point + if (this.panLast == null) { + return; + } + ChartPanel panel = (ChartPanel) e.getSource(); + JFreeChart chart = panel.getChart(); + double dx = e.getX() - this.panLast.getX(); + double dy = e.getY() - this.panLast.getY(); + if (dx == 0.0 && dy == 0.0) { + return; + } + double wPercent = -dx / this.panW; + double hPercent = dy / this.panH; + boolean old = chart.getPlot().isNotify(); + chart.getPlot().setNotify(false); + Pannable p = (Pannable) chart.getPlot(); + PlotRenderingInfo info = panel.getChartRenderingInfo().getPlotInfo(); + if (p.getOrientation() == PlotOrientation.VERTICAL) { + p.panDomainAxes(wPercent, info, this.panLast); + p.panRangeAxes(hPercent, info, this.panLast); + } + else { + p.panDomainAxes(hPercent, info, this.panLast); + p.panRangeAxes(wPercent, info, this.panLast); + } + this.panLast = e.getPoint(); + chart.getPlot().setNotify(old); + return; + } + + /** + * Handles a mouse released event. + * + * @param e the event. + */ + public void mouseReleased(MouseEvent e) { + // if we've been panning, we need to reset now that the mouse is + // released... + if (this.panLast != null) { + ChartPanel panel = (ChartPanel) e.getSource(); + this.panLast = null; + panel.setCursor(Cursor.getDefaultCursor()); + panel.clearLiveMouseHandler(); + } + } + +} + Added: trunk/source/org/jfree/chart/panel/RegionSelectionHandler.java =================================================================== --- trunk/source/org/jfree/chart/panel/RegionSelectionHandler.java (rev 0) +++ trunk/source/org/jfree/chart/panel/RegionSelectionHandler.java 2009-06-29 12:42:20 UTC (rev 2173) @@ -0,0 +1,247 @@ +/* =========================================================== + * JFreeChart : a free chart library for the Java(tm) platform + * =========================================================== + * + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. + * + * Project Info: http://www.jfree.org/jfreechart/index.html + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * --------------------------- + * RegionSelectionHandler.java + * --------------------------- + * (C) Copyright 2009, by Object Refinery Limited. + * + * Original Author: David Gilbert (for Object Refinery Limited); + * Contributor(s): -; + * + * Changes: + * -------- + * 29-Jun-2009 : Version 1 (DG); + * + */ + +package org.jfree.chart.panel; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Paint; +import java.awt.Point; +import java.awt.Stroke; +import java.awt.event.MouseEvent; +import java.awt.geom.GeneralPath; +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; +import org.jfree.chart.ChartPanel; +import org.jfree.chart.JFreeChart; +import org.jfree.chart.plot.Plot; +import org.jfree.chart.plot.Selectable; +import org.jfree.chart.util.ShapeUtilities; + +/** + * A mouse handler that allows data items to be selected. + * + * @since 1.2.0 + */ +public class RegionSelectionHandler extends AbstractMouseHandler { + + /** + * The selection path (in Java2D space). + */ + private GeneralPath selection; + + /** + * The last mouse point. + */ + private Point2D lastPoint; + + /** + * The outline stroke. + */ + private Stroke outlineStroke; + + /** + * The outline paint. + */ + private Paint outlinePaint; + + /** + * The fill paint. + */ + private Paint fillPaint; + + /** + * Creates a new default instance. + */ + public RegionSelectionHandler() { + this(new BasicStroke(1.0f), Color.darkGray, new Color(255, 0, 255, 50)); + } + + /** + * Creates a new selection handler with the specified attributes. + * + * @param outlineStroke the outline stroke. + * @param outlinePaint the outline paint. + * @param fillPaint the fill paint. + */ + public RegionSelectionHandler(Stroke outlineStroke, Paint outlinePaint, + Paint fillPaint) { + super(); + this.selection = new GeneralPath(); + this.lastPoint = null; + this.outlineStroke = new BasicStroke(1.0f); + this.outlinePaint = Color.darkGray; + this.fillPaint = new Color(255, 0, 255, 50); + } + + /** + * Returns the fill paint. + * + * @return The fill paint (possibly <code>null</code>). + * + * @see #setFillPaint(java.awt.Paint) + */ + public Paint getFillPaint() { + return this.fillPaint; + } + + /** + * Sets the fill paint. + * + * @param fillPaint the fill paint (<code>null</code> permitted). + * + * @see #getFillPaint() + */ + public void setFillPaint(Paint paint) { + this.fillPaint = paint; + } + + /** + * Returns the outline paint. + * + * @return The outline paint. + */ + public Paint getOutlinePaint() { + return this.outlinePaint; + } + + /** + * Sets the outline paint. + * + * @param paint the paint. + */ + public void setOutlinePaint(Paint paint) { + this.outlinePaint = paint; + } + + /** + * Returns the outline stroke. + * + * @return The outline stroke. + */ + public Stroke getOutlineStroke() { + return this.outlineStroke; + } + + /** + * Sets the outline stroke. + * + * @param stroke the outline stroke. + */ + public void setOutlineStroke(Stroke stroke) { + this.outlineStroke = stroke; + } + + /** + * Handles a mouse pressed event. + * + * @param e the event. + */ + public void mousePressed(MouseEvent e) { + ChartPanel panel = (ChartPanel) e.getSource(); + Rectangle2D dataArea = panel.getScreenDataArea(); + if (dataArea.contains(e.getPoint())) { + JFreeChart chart = panel.getChart(); + if (chart.getPlot() instanceof Selectable) { + Selectable s = (Selectable) chart.getPlot(); + if (!e.isShiftDown()) { + s.clearSelection(); + chart.setNotify(true); + } + Point pt = e.getPoint(); + this.selection.moveTo(pt.getX(), pt.getY()); + this.lastPoint = new Point(pt); + } + } + } + + /** + * Handles a mouse dragged event. + * + * @param e the event. + */ + public void mouseDragged(MouseEvent e) { + if (this.lastPoint == null) { + return; // we never started a selection + } + ChartPanel panel = (ChartPanel) e.getSource(); + Point pt = e.getPoint(); + Point2D pt2 = ShapeUtilities.getPointInRectangle(pt.x, pt.y, + panel.getScreenDataArea()); + if (pt2.distance(this.lastPoint) > 5) { + this.selection.lineTo(pt2.getX(), pt2.getY()); + this.lastPoint = pt2; + } + panel.setSelectionShape(selection); + panel.setSelectionFillPaint(this.fillPaint); + panel.setSelectionOutlinePaint(this.outlinePaint); + panel.repaint(); + } + + /** + * Handles a mouse released event. + * + * @param e the event. + */ + public void mouseReleased(MouseEvent e) { + if (this.lastPoint == null) { + return; // we never started a selection + } + ChartPanel panel = (ChartPanel) e.getSource(); + this.selection.closePath(); + + // do something with the selection shape + JFreeChart chart = panel.getChart(); + Plot plot = chart.getPlot(); + if (!(plot instanceof Selectable)) { + return; + } + Selectable p = (Selectable) plot; + if (p.canSelectByRegion()) { + p.select(this.selection, panel.getScreenDataArea(), panel); + } + panel.setSelectionShape(null); + this.selection.reset(); + this.lastPoint = null; + panel.repaint(); + panel.clearLiveMouseHandler(); + } + +} Added: trunk/source/org/jfree/chart/panel/ZoomHandler.java =================================================================== --- trunk/source/org/jfree/chart/panel/ZoomHandler.java (rev 0) +++ trunk/source/org/jfree/chart/panel/ZoomHandler.java 2009-06-29 12:42:20 UTC (rev 2173) @@ -0,0 +1,259 @@ +/* =========================================================== + * JFreeChart : a free chart library for the Java(tm) platform + * =========================================================== + * + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. + * + * Project Info: http://www.jfree.org/jfreechart/index.html + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * ---------------- + * ZoomHandler.java + * ---------------- + * (C) Copyright 2009, by Object Refinery Limited. + * + * Original Author: David Gilbert (for Object Refinery Limited); + * Contributor(s): -; + * + * Changes: + * -------- + * 11-Jun-2009 : Version 1 (DG); + * + */ + +package org.jfree.chart.panel; + +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.event.MouseEvent; +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; +import org.jfree.chart.ChartPanel; +import org.jfree.chart.plot.PlotOrientation; +import org.jfree.chart.util.ShapeUtilities; + +/** + * A mouse handler than performs a zooming operation on a ChartPanel. + */ +public class ZoomHandler extends AbstractMouseHandler { + + private Point2D zoomPoint; + + private Rectangle2D zoomRectangle; + + /** + * Creates a new instance. + */ + public ZoomHandler() { + super(); + } + + public void mousePressed(MouseEvent e) { + ChartPanel chartPanel = (ChartPanel) e.getSource(); + Rectangle2D screenDataArea = chartPanel.getScreenDataArea(e.getX(), + e.getY()); + if (screenDataArea != null) { + this.zoomPoint = ShapeUtilities.getPointInRectangle(e.getX(), + e.getY(), screenDataArea); + } + else { + this.zoomPoint = null; + } + } + + public void mouseDragged(MouseEvent e) { + + // if no initial zoom point was set, ignore dragging... + if (this.zoomPoint == null) { + return; + } + ChartPanel panel = (ChartPanel) e.getSource(); + Graphics2D g2 = (Graphics2D) panel.getGraphics(); + + // erase the previous zoom rectangle (if any). We only need to do + // this is we are using XOR mode, which we do when we're not using + // the buffer (if there is a buffer, then at the end of this method we + // just trigger a repaint) + if (!panel.getUseBuffer()) { + drawZoomRectangle(panel, g2, true); + } + + boolean hZoom = false; + boolean vZoom = false; + if (panel.getOrientation() == PlotOrientation.HORIZONTAL) { + hZoom = panel.isRangeZoomable(); + vZoom = panel.isDomainZoomable(); + } + else { + hZoom = panel.isDomainZoomable(); + vZoom = panel.isRangeZoomable(); + } + Rectangle2D scaledDataArea = panel.getScreenDataArea( + (int) this.zoomPoint.getX(), (int) this.zoomPoint.getY()); + if (hZoom && vZoom) { + // selected rectangle shouldn't extend outside the data area... + double xmax = Math.min(e.getX(), scaledDataArea.getMaxX()); + double ymax = Math.min(e.getY(), scaledDataArea.getMaxY()); + this.zoomRectangle = new Rectangle2D.Double( + this.zoomPoint.getX(), this.zoomPoint.getY(), + xmax - this.zoomPoint.getX(), ymax - this.zoomPoint.getY()); + } + else if (hZoom) { + double xmax = Math.min(e.getX(), sc... [truncated message content] |
From: <mu...@us...> - 2009-06-30 09:54:50
|
Revision: 2184 http://jfreechart.svn.sourceforge.net/jfreechart/?rev=2184&view=rev Author: mungady Date: 2009-06-30 09:54:13 +0000 (Tue, 30 Jun 2009) Log Message: ----------- Item selection update. Modified Paths: -------------- trunk/source/org/jfree/chart/plot/XYPlot.java trunk/source/org/jfree/chart/renderer/AbstractRenderer.java trunk/source/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java trunk/source/org/jfree/chart/renderer/xy/XYBarRenderer.java trunk/source/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java trunk/source/org/jfree/data/statistics/SimpleHistogramDataset.java trunk/source/org/jfree/data/time/TimeSeriesCollection.java trunk/source/org/jfree/data/xy/XYDatasetSelectionState.java trunk/source/org/jfree/data/xy/XYSeriesCollection.java Added Paths: ----------- trunk/source/org/jfree/chart/renderer/RenderAttributes.java Modified: trunk/source/org/jfree/chart/plot/XYPlot.java =================================================================== --- trunk/source/org/jfree/chart/plot/XYPlot.java 2009-06-29 18:18:43 UTC (rev 2183) +++ trunk/source/org/jfree/chart/plot/XYPlot.java 2009-06-30 09:54:13 UTC (rev 2184) @@ -5773,12 +5773,12 @@ double x = dataset.getXValue(s, i); double y = dataset.getYValue(s, i); if (path.contains(x, y)) { - state.setSelected(s, i, true); - // FIXME: we should fire just one dataset change event - // for the whole selection + state.setSelected(s, i, true, false); } } } + state.fireSelectionEvent(); + } } Modified: trunk/source/org/jfree/chart/renderer/AbstractRenderer.java =================================================================== --- trunk/source/org/jfree/chart/renderer/AbstractRenderer.java 2009-06-29 18:18:43 UTC (rev 2183) +++ trunk/source/org/jfree/chart/renderer/AbstractRenderer.java 2009-06-30 09:54:13 UTC (rev 2184) @@ -92,7 +92,8 @@ * AbstractXYItemRenderer class (DG); * 28-Apr-2009 : Added flag to allow a renderer to treat the legend shape as * a line (DG); - * + * 30-Jun-2009 : Added selected item attributes (DG); + * */ package org.jfree.chart.renderer; @@ -382,8 +383,12 @@ /** Storage for registered change listeners. */ private transient EventListenerList listenerList; - /** An event for re-use. */ - private transient RendererChangeEvent event; + /** + * Attributes for selected items. + * + * @since 1.2.0 + */ + private RenderAttributes selectedItemAttributes; /** * Default constructor. @@ -455,6 +460,8 @@ this.listenerList = new EventListenerList(); + this.selectedItemAttributes = new RenderAttributes(); + this.selectedItemAttributes.setDefaultFillPaint(Color.WHITE); } /** @@ -464,6 +471,18 @@ */ public abstract DrawingSupplier getDrawingSupplier(); + /** + * Returns the set of attributes that will override the standard + * attributes for selected items. + * + * @return The attributes. + * + * @since 1.2.0 + */ + public RenderAttributes getSelectedItemAttributes() { + return this.selectedItemAttributes; + } + // SERIES VISIBLE (not yet respected by all renderers) /** @@ -714,7 +733,14 @@ * @since 1.2.0 */ public Paint getItemPaint(int row, int column, boolean selected) { - return lookupSeriesPaint(row); + Paint result = null; + if (selected) { + result = this.selectedItemAttributes.getItemPaint(row, column); + } + if (result == null) { + result = lookupSeriesPaint(row); + } + return result; } /** @@ -887,7 +913,14 @@ * @since 1.2.0 */ public Paint getItemFillPaint(int row, int column, boolean selected) { - return lookupSeriesFillPaint(row); + Paint result = null; + if (selected) { + result = this.selectedItemAttributes.getItemFillPaint(row, column); + } + if (result == null) { + result = lookupSeriesFillPaint(row); + } + return result; } /** @@ -1041,16 +1074,24 @@ * {@link #lookupSeriesOutlinePaint(int)} method. You can override this * method if you require different behaviour. * - * @param row the row (or series) index (zero-based). - * @param column the column (or category) index (zero-based). + * @param series the series index (zero-based). + * @param item the item index (zero-based). * @param selected is the item selected? * * @return The paint (never <code>null</code>). * * @since 1.2.0 */ - public Paint getItemOutlinePaint(int row, int column, boolean selected) { - return lookupSeriesOutlinePaint(row); + public Paint getItemOutlinePaint(int series, int item, boolean selected) { + Paint result = null; + if (selected) { + result = this.selectedItemAttributes.getItemOutlinePaint(series, + item); + } + if (result == null) { + result = lookupSeriesOutlinePaint(series); + } + return result; } /** @@ -1543,16 +1584,23 @@ * method. You can override this method if you require different * behaviour. * - * @param row the row (or series) index (zero-based). - * @param column the column (or category) index (zero-based). + * @param series the series index (zero-based). + * @param item the item index (zero-based). * @param selected is the item selected? * * @return The shape (never <code>null</code>). * * @since 1.2.0 */ - public Shape getItemShape(int row, int column, boolean selected) { - return lookupSeriesShape(row); + public Shape getItemShape(int series, int item, boolean selected) { + Shape result = null; + if (selected) { + result = this.selectedItemAttributes.getItemShape(series, item); + } + if (result == null) { + result = lookupSeriesShape(series); + } + return result; } /** @@ -3208,7 +3256,7 @@ clone.legendTextPaint = (PaintList) this.legendTextPaint.clone(); } clone.listenerList = new EventListenerList(); - clone.event = null; + return clone; } Added: trunk/source/org/jfree/chart/renderer/RenderAttributes.java =================================================================== --- trunk/source/org/jfree/chart/renderer/RenderAttributes.java (rev 0) +++ trunk/source/org/jfree/chart/renderer/RenderAttributes.java 2009-06-30 09:54:13 UTC (rev 2184) @@ -0,0 +1,475 @@ +/* =========================================================== + * JFreeChart : a free chart library for the Java(tm) platform + * =========================================================== + * + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. + * + * Project Info: http://www.jfree.org/jfreechart/index.html + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * --------------------- + * RenderAttributes.java + * --------------------- + * (C) Copyright 2009, by Object Refinery Limited. + * + * Original Author: David Gilbert (for Object Refinery Limited); + * Contributor(s): -; + * + * Changes: + * -------- + * 29-Jun-2009 : Version 1 (DG); + * + */ + +package org.jfree.chart.renderer; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Font; +import java.awt.Paint; +import java.awt.Shape; +import java.awt.Stroke; +import java.io.Serializable; +import org.jfree.chart.labels.ItemLabelPosition; +import org.jfree.chart.util.BooleanList; +import org.jfree.chart.util.ObjectList; +import org.jfree.chart.util.PaintList; +import org.jfree.chart.util.ShapeList; +import org.jfree.chart.util.StrokeList; + +/** + * A set of attributes that a renderer can use for rendering a data item. The + * list is not exhaustive, but includes the most common attributes used by + * renderer implementations. + * + * @since 1.2.0 + */ +public class RenderAttributes implements Cloneable, Serializable { + + private boolean allowNull; + + private PaintList paintList; + + private Paint defaultPaint; + + private StrokeList strokeList; + + private Stroke defaultStroke; + + private ShapeList shapeList; + + private Shape defaultShape; + + private PaintList fillPaintList; + + private Paint defaultFillPaint; + + private PaintList outlinePaintList; + + private Paint defaultOutlinePaint; + + private StrokeList outlineStrokeList; + + private Stroke defaultOutlineStroke; + + private BooleanList labelsVisibleList; + + private Boolean defaultLabelVisible; + + private ObjectList labelFontList; + + private Font defaultLabelFont; + + private PaintList labelPaintList; + + private Paint defaultLabelPaint; + + private ObjectList positionItemLabelPositionList; + + private ItemLabelPosition defaultPositiveItemLabelPosition; + + private ObjectList negativeItemLabelPositionList; + + private ItemLabelPosition defaultNegativeItemLabelPosition; + + private BooleanList createEntityList; + + private Boolean defaultCreateEntity; + + /** + * Creates a new instance. + */ + public RenderAttributes() { + this(true); + } + + public RenderAttributes(boolean allowNull) { + this.paintList = new PaintList(); + this.defaultPaint = allowNull ? null : Color.BLACK; + this.strokeList = new StrokeList(); + this.defaultStroke = allowNull ? null : new BasicStroke(1.0f); + this.fillPaintList = new PaintList(); + this.defaultFillPaint = allowNull ? null : Color.BLACK; + this.outlinePaintList = new PaintList(); + this.defaultOutlinePaint = allowNull ? null : Color.BLACK; + this.shapeList = new ShapeList(); + } + + public boolean getAllowNull() { + return this.allowNull; + } + + // PAINT + + public Paint getItemPaint(int series, int item) { + return lookupSeriesPaint(series); + } + + protected Paint lookupSeriesPaint(int series) { + Paint result = this.paintList.getPaint(series); + if (result == null) { + result = this.defaultPaint; + } + return result; + } + + public Paint getSeriesPaint(int series) { + return this.paintList.getPaint(series); + } + + public void setSeriesPaint(int series, Paint paint) { + this.paintList.setPaint(series, paint); + } + + public Paint getDefaultPaint() { + return this.defaultPaint; + } + + public void setDefaultPaint(Paint paint) { + if (paint == null && !this.allowNull) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.defaultPaint = paint; + } + + // STROKE + + public Stroke getItemStroke(int series, int item) { + return lookupSeriesStroke(series); + } + + protected Stroke lookupSeriesStroke(int series) { + Stroke result = this.strokeList.getStroke(series); + if (result == null) { + result = this.defaultStroke; + } + return result; + } + + public Stroke getSeriesStroke(int series) { + return this.strokeList.getStroke(series); + } + + public void setSeriesStroke(int series, Stroke stroke) { + this.strokeList.setStroke(series, stroke); + } + + public Stroke getDefaultStroke() { + return this.defaultStroke; + } + + public void setDefaultStroke(Stroke stroke) { + if (stroke == null && !this.allowNull) { + throw new IllegalArgumentException("Null 'stroke' argument."); + } + this.defaultStroke = stroke; + } + + // SHAPE + + public Shape getItemShape(int series, int item) { + return lookupSeriesShape(series); + } + + protected Shape lookupSeriesShape(int series) { + Shape result = this.shapeList.getShape(series); + if (result == null) { + result = this.defaultShape; + } + return result; + } + + public Shape getSeriesShape(int series) { + return this.shapeList.getShape(series); + } + + public void setSeriesShape(int series, Shape shape) { + this.shapeList.setShape(series, shape); + } + + public Shape getDefaultShape() { + return this.defaultShape; + } + + public void setDefaultShape(Shape shape) { + if (shape == null && !this.allowNull) { + throw new IllegalArgumentException("Null 'shape' argument."); + } + this.defaultShape = shape; + } + + // FILL PAINT + + public Paint getItemFillPaint(int series, int item) { + return lookupSeriesFillPaint(series); + } + + protected Paint lookupSeriesFillPaint(int series) { + Paint result = this.fillPaintList.getPaint(series); + if (result == null) { + result = this.defaultFillPaint; + } + return result; + } + + public Paint getSeriesFillPaint(int series) { + return this.fillPaintList.getPaint(series); + } + + public void setSeriesFillPaint(int series, Paint paint) { + this.fillPaintList.setPaint(series, paint); + } + + public Paint getDefaultFillPaint() { + return this.defaultFillPaint; + } + + public void setDefaultFillPaint(Paint paint) { + if (paint == null && !this.allowNull) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.defaultFillPaint = paint; + } + + // OUTLINE PAINT + + public Paint getItemOutlinePaint(int series, int item) { + return lookupSeriesOutlinePaint(series); + } + + protected Paint lookupSeriesOutlinePaint(int series) { + Paint result = this.outlinePaintList.getPaint(series); + if (result == null) { + result = this.defaultOutlinePaint; + } + return result; + } + + public Paint getSeriesOutlinePaint(int series) { + return this.outlinePaintList.getPaint(series); + } + + public void setSeriesOutlinePaint(int series, Paint paint) { + this.outlinePaintList.setPaint(series, paint); + } + + public Paint getDefaultOutlinePaint() { + return this.defaultOutlinePaint; + } + + public void setDefaultOutlinePaint(Paint paint) { + if (paint == null && !this.allowNull) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.defaultOutlinePaint = paint; + } + + // OUTLINE STROKE + + public Stroke getItemOutlineStroke(int series, int item) { + return lookupSeriesOutlineStroke(series); + } + + protected Stroke lookupSeriesOutlineStroke(int series) { + Stroke result = this.outlineStrokeList.getStroke(series); + if (result == null) { + result = this.defaultOutlineStroke; + } + return result; + } + + public Stroke getSeriesOutlineStroke(int series) { + return this.strokeList.getStroke(series); + } + + public void setSeriesOutlineStroke(int series, Stroke stroke) { + this.outlineStrokeList.setStroke(series, stroke); + } + + public Stroke getDefaultOutlineStroke() { + return this.defaultOutlineStroke; + } + + public void setDefaultOutlineStroke(Stroke stroke) { + if (stroke == null && !this.allowNull) { + throw new IllegalArgumentException("Null 'stroke' argument."); + } + this.defaultOutlineStroke = stroke; + } + + // LABEL VISIBLE + + public Boolean isLabelVisible(int series, int item) { + return lookupSeriesLabelVisible(series); + } + + protected Boolean lookupSeriesLabelVisible(int series) { + Boolean result = this.labelsVisibleList.getBoolean(series); + if (result == null) { + result = this.defaultLabelVisible; + } + return result; + } + + public Boolean getSeriesLabelVisible(int series) { + return this.labelsVisibleList.getBoolean(series); + } + + public void setSeriesLabelVisible(int series, Boolean visible) { + this.labelsVisibleList.setBoolean(series, visible); + } + + public Boolean getDefaultLabelVisible() { + return this.defaultLabelVisible; + } + + public void setDefaultLabelVisible(Boolean visible) { + if (visible == null && !this.allowNull) { + throw new IllegalArgumentException("Null 'visible' argument."); + } + this.defaultLabelVisible = visible; + } + + // LABEL FONT + + public Font getItemLabelFont(int series, int item) { + return lookupSeriesLabelFont(series); + } + + protected Font lookupSeriesLabelFont(int series) { + Font result = (Font) this.labelFontList.get(series); + if (result == null) { + result = this.defaultLabelFont; + } + return result; + } + + public Font getSeriesLabelFont(int series) { + return (Font) this.labelFontList.get(series); + } + + public void setSeriesLabelFont(int series, Font font) { + this.labelFontList.set(series, font); + } + + public Font getDefaultLabelFont() { + return this.defaultLabelFont; + } + + public void setDefaultLabelFont(Font font) { + if (font == null && !this.allowNull) { + throw new IllegalArgumentException("Null 'font' argument."); + } + this.defaultLabelFont = font; + } + + // LABEL PAINT + + public Paint getItemLabelPaint(int series, int item) { + return lookupSeriesLabelPaint(series); + } + + protected Paint lookupSeriesLabelPaint(int series) { + Paint result = this.labelPaintList.getPaint(series); + if (result == null) { + result = this.defaultLabelPaint; + } + return result; + } + + public Paint getSeriesLabelPaint(int series) { + return this.labelPaintList.getPaint(series); + } + + public void setSeriesLabelPaint(int series, Paint paint) { + this.labelPaintList.setPaint(series, paint); + } + + public Paint getDefaultLabelPaint() { + return this.defaultFillPaint; + } + + public void setDefaultLabelPaint(Paint paint) { + if (paint == null && !this.allowNull) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.defaultLabelPaint = paint; + } + + // POSITIVE ITEM LABEL POSITION + + // NEGATIVE ITEM LABEL POSITION + + // CREATE ENTITY - you'd probably use this rarely, but for example you + // might want a chart where the selected items have entities created, but + // not any other items. + + public Boolean getCreateEntity(int series, int item) { + return lookupSeriesCreateEntity(series); + } + + protected Boolean lookupSeriesCreateEntity(int series) { + Boolean result = this.createEntityList.getBoolean(series); + if (result == null) { + result = this.defaultCreateEntity; + } + return result; + } + + public Boolean getSeriesCreateEntity(int series) { + return this.createEntityList.getBoolean(series); + } + + public void setSeriesCreateEntity(int series, Boolean visible) { + this.createEntityList.setBoolean(series, visible); + } + + public Boolean getDefaultCreateEntity() { + return this.defaultCreateEntity; + } + + public void setDefaultCreateEntity(Boolean create) { + if (create == null && !this.allowNull) { + throw new IllegalArgumentException("Null 'create' argument."); + } + this.defaultCreateEntity = create; + } + +} \ No newline at end of file Modified: trunk/source/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java =================================================================== --- trunk/source/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java 2009-06-29 18:18:43 UTC (rev 2183) +++ trunk/source/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java 2009-06-30 09:54:13 UTC (rev 2184) @@ -113,6 +113,7 @@ * 01-Apr-2009 : Moved defaultEntityRadius up to superclass (DG); * 28-Apr-2009 : Updated getLegendItem() method to observe new * 'treatLegendShapeAsLine' flag (DG); + * 29-Jun-2009 : Added attributes for selection (DG); * */ @@ -136,8 +137,10 @@ import java.util.Iterator; import java.util.List; +import org.jfree.chart.ChartRenderingInfo; import org.jfree.chart.LegendItem; import org.jfree.chart.LegendItemCollection; +import org.jfree.chart.RenderingSource; import org.jfree.chart.annotations.XYAnnotation; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.entity.EntityCollection; @@ -170,7 +173,9 @@ import org.jfree.chart.util.RectangleInsets; import org.jfree.data.Range; import org.jfree.data.general.DatasetUtilities; +import org.jfree.data.xy.SelectableXYDataset; import org.jfree.data.xy.XYDataset; +import org.jfree.data.xy.XYDatasetSelectionState; /** * A base class that can be used to create new {@link XYItemRenderer} @@ -270,6 +275,20 @@ } /** + * Creates the renderer state. This is called by the {@link #initialise()} + * method. + * + * @param info the plot rendering info. + * + * @return A new state instance. + * + * @since 1.2.0 + */ + protected XYItemRendererState createState(PlotRenderingInfo info) { + return new XYItemRendererState(info); + } + + /** * Initialises the renderer and returns a state object that should be * passed to all subsequent calls to the drawItem() method. * <P> @@ -280,23 +299,38 @@ * @param g2 the graphics device. * @param dataArea the area inside the axes. * @param plot the plot. - * @param data the data. + * @param dataset the dataset. * @param info an optional info collection object to return data back to * the caller. * * @return The renderer state (never <code>null</code>). */ - public XYItemRendererState initialise(Graphics2D g2, - Rectangle2D dataArea, - XYPlot plot, - XYDataset data, - PlotRenderingInfo info) { + public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, + XYPlot plot, XYDataset dataset, PlotRenderingInfo info) { - XYItemRendererState state = new XYItemRendererState(info); - return state; + XYItemRendererState state = createState(info); + // determine if there is any selection state for the dataset + XYDatasetSelectionState selectionState = null; + if (dataset instanceof SelectableXYDataset) { + SelectableXYDataset sxyd = (SelectableXYDataset) dataset; + selectionState = sxyd.getSelectionState(); } + // if the selection state is still null, go to the selection source + // and ask if it has state... + if (selectionState == null && info != null) { + ChartRenderingInfo cri = info.getOwner(); + if (cri != null) { + RenderingSource rs = cri.getRenderingSource(); + selectionState = (XYDatasetSelectionState) + rs.getSelectionState(dataset); + } + } + state.setSelectionState(selectionState); + return state; + } + // ITEM LABEL GENERATOR /** Modified: trunk/source/org/jfree/chart/renderer/xy/XYBarRenderer.java =================================================================== --- trunk/source/org/jfree/chart/renderer/xy/XYBarRenderer.java 2009-06-29 18:18:43 UTC (rev 2183) +++ trunk/source/org/jfree/chart/renderer/xy/XYBarRenderer.java 2009-06-30 09:54:13 UTC (rev 2184) @@ -96,6 +96,9 @@ * 19-Jun-2008 : Added findRangeBounds() method override to fix bug in default * axis range (DG); * 24-Jun-2008 : Added new barPainter mechanism (DG); + * 03-Feb-2009 : Added defaultShadowsVisible flag (DG); + * 05-Feb-2009 : Added barAlignmentFactor (DG); + * 30-Jun-2009 : Updated for item selection support (DG); * */ @@ -695,6 +698,20 @@ } /** + * Creates the renderer state. This is called by the {@link #initialise()} + * method. + * + * @param info the plot rendering info. + * + * @return A new state instance. + * + * @since 1.2.0 + */ + protected XYItemRendererState createState(PlotRenderingInfo info) { + return new XYBarRendererState(info); + } + + /** * Initialises the renderer and returns a state object that should be * passed to all subsequent calls to the drawItem() method. Here we * calculate the Java2D y-coordinate for zero, since all the bars have @@ -712,7 +729,8 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, XYPlot plot, XYDataset dataset, PlotRenderingInfo info) { - XYBarRendererState state = new XYBarRendererState(info); + XYBarRendererState state = (XYBarRendererState) super.initialise(g2, + dataArea, plot, dataset, info); ValueAxis rangeAxis = plot.getRangeAxisForDataset(plot.indexOf( dataset)); state.setG2Base(rangeAxis.valueToJava2D(this.base, dataArea, Modified: trunk/source/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java =================================================================== --- trunk/source/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java 2009-06-29 18:18:43 UTC (rev 2183) +++ trunk/source/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java 2009-06-30 09:54:13 UTC (rev 2184) @@ -66,6 +66,7 @@ * 17-Jun-2008 : Apply legend shape, font and paint attributes (DG); * 19-Sep-2008 : Fixed bug with drawSeriesLineAsPath - patch by Greg Darke (DG); * 18-May-2009 : Clip lines in drawPrimaryLine() (DG); + * 29-Jun-2009 : Updated for item selection support (DG); * */ @@ -83,7 +84,9 @@ import java.io.ObjectOutputStream; import java.io.Serializable; +import org.jfree.chart.ChartRenderingInfo; import org.jfree.chart.LegendItem; +import org.jfree.chart.RenderingSource; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.entity.EntityCollection; import org.jfree.chart.event.RendererChangeEvent; @@ -98,7 +101,9 @@ import org.jfree.chart.util.RectangleEdge; import org.jfree.chart.util.SerialUtilities; import org.jfree.chart.util.ShapeUtilities; +import org.jfree.data.xy.SelectableXYDataset; import org.jfree.data.xy.XYDataset; +import org.jfree.data.xy.XYDatasetSelectionState; /** * A renderer that connects data points with lines and/or draws shapes at each @@ -699,20 +704,36 @@ * @param g2 the graphics device. * @param dataArea the area inside the axes. * @param plot the plot. - * @param data the data. + * @param dataset the dataset. * @param info an optional info collection object to return data back to * the caller. * * @return The renderer state. */ - public XYItemRendererState initialise(Graphics2D g2, - Rectangle2D dataArea, - XYPlot plot, - XYDataset data, - PlotRenderingInfo info) { + public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, + XYPlot plot, XYDataset dataset, PlotRenderingInfo info) { State state = new State(info); state.seriesPath = new GeneralPath(); + // determine if there is any selection state for the dataset + XYDatasetSelectionState selectionState = null; + if (dataset instanceof SelectableXYDataset) { + SelectableXYDataset sxyd = (SelectableXYDataset) dataset; + selectionState = sxyd.getSelectionState(); + } + // if the selection state is still null, go to the selection source + // and ask if it has state... + if (selectionState == null && info != null) { + ChartRenderingInfo cri = info.getOwner(); + if (cri != null) { + RenderingSource rs = cri.getRenderingSource(); + if (rs != null) { + selectionState = (XYDatasetSelectionState) + rs.getSelectionState(dataset); + } + } + } + state.setSelectionState(selectionState); return state; } Modified: trunk/source/org/jfree/data/statistics/SimpleHistogramDataset.java =================================================================== --- trunk/source/org/jfree/data/statistics/SimpleHistogramDataset.java 2009-06-29 18:18:43 UTC (rev 2183) +++ trunk/source/org/jfree/data/statistics/SimpleHistogramDataset.java 2009-06-30 09:54:13 UTC (rev 2184) @@ -503,6 +503,16 @@ } /** + * Sends an event to all registered listeners to indicate that the + * selection has changed. + * + * @since 1.2.0 + */ + public void fireSelectionEvent() { + fireDatasetChanged(); + } + + /** * Compares the dataset for equality with an arbitrary object. * * @param obj the object (<code>null</code> permitted). Modified: trunk/source/org/jfree/data/time/TimeSeriesCollection.java =================================================================== --- trunk/source/org/jfree/data/time/TimeSeriesCollection.java 2009-06-29 18:18:43 UTC (rev 2183) +++ trunk/source/org/jfree/data/time/TimeSeriesCollection.java 2009-06-30 09:54:13 UTC (rev 2184) @@ -564,6 +564,16 @@ } /** + * Sends an event to all registered listeners to indicate that the + * selection has changed. + * + * @since 1.2.0 + */ + public void fireSelectionEvent() { + fireDatasetChanged(); + } + + /** * Returns the indices of the two data items surrounding a particular * millisecond value. * Modified: trunk/source/org/jfree/data/xy/XYDatasetSelectionState.java =================================================================== --- trunk/source/org/jfree/data/xy/XYDatasetSelectionState.java 2009-06-29 18:18:43 UTC (rev 2183) +++ trunk/source/org/jfree/data/xy/XYDatasetSelectionState.java 2009-06-30 09:54:13 UTC (rev 2184) @@ -55,7 +55,7 @@ * be maintained in parallel with a dataset implementation that doesn't * directly support selection state. * - * @since 1.0.14 + * @since 1.2.0 */ public interface XYDatasetSelectionState extends DatasetSelectionState { @@ -96,6 +96,19 @@ public void setSelected(int series, int item, boolean selected); /** + * Sets the selection state for the specified item and, if requested, + * fires a change event. + */ + public void setSelected(int series, int item, boolean selected, + boolean notify); + + /** + * Send an event to registered listeners to indicate that the selection + * has changed. + */ + public void fireSelectionEvent(); + + /** * Clears all selected items. */ public void clearSelection(); Modified: trunk/source/org/jfree/data/xy/XYSeriesCollection.java =================================================================== --- trunk/source/org/jfree/data/xy/XYSeriesCollection.java 2009-06-29 18:18:43 UTC (rev 2183) +++ trunk/source/org/jfree/data/xy/XYSeriesCollection.java 2009-06-30 09:54:13 UTC (rev 2184) @@ -455,6 +455,16 @@ } /** + * Fires an event to signal that the selection changed. + * + * @since 1.2.0 + */ + public void fireSelectionEvent() { + // TODO: should this be a separate event type. + fireDatasetChanged(); + } + + /** * Tests this collection for equality with an arbitrary object. * * @param obj the object (<code>null</code> permitted). This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mu...@us...> - 2009-07-06 07:25:10
|
Revision: 2193 http://jfreechart.svn.sourceforge.net/jfreechart/?rev=2193&view=rev Author: mungady Date: 2009-07-06 07:25:07 +0000 (Mon, 06 Jul 2009) Log Message: ----------- Selection state updates. Added Paths: ----------- trunk/source/org/jfree/chart/BufferedImageRenderingSource.java trunk/source/org/jfree/chart/event/DatasetChangeInfo.java trunk/source/org/jfree/chart/plot/PieSelectionAttributes.java trunk/source/org/jfree/data/KeyedObjectComparator.java trunk/source/org/jfree/data/KeyedObjectComparatorType.java trunk/source/org/jfree/data/SelectableValue.java trunk/source/org/jfree/data/category/AbstractCategoryDataset.java trunk/source/org/jfree/data/category/CategoryDatasetSelectionState.java trunk/source/org/jfree/data/category/SelectableCategoryDataset.java trunk/source/org/jfree/data/pie/ trunk/source/org/jfree/data/pie/AbstractPieDataset.java trunk/source/org/jfree/data/pie/DefaultPieDataset.java trunk/source/org/jfree/data/pie/PieDataset.java trunk/source/org/jfree/data/pie/PieDatasetChangeInfo.java trunk/source/org/jfree/data/pie/PieDatasetChangeType.java trunk/source/org/jfree/data/pie/PieDatasetSelectionState.java trunk/source/org/jfree/data/pie/SelectablePieDataset.java Removed Paths: ------------- trunk/source/org/jfree/data/general/DefaultPieDataset.java trunk/source/org/jfree/data/general/PieDataset.java Added: trunk/source/org/jfree/chart/BufferedImageRenderingSource.java =================================================================== --- trunk/source/org/jfree/chart/BufferedImageRenderingSource.java (rev 0) +++ trunk/source/org/jfree/chart/BufferedImageRenderingSource.java 2009-07-06 07:25:07 UTC (rev 2193) @@ -0,0 +1,78 @@ +/* =========================================================== + * JFreeChart : a free chart library for the Java(tm) platform + * =========================================================== + * + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. + * + * Project Info: http://www.jfree.org/jfreechart/index.html + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * --------------------------------- + * BufferedImageRenderingSource.java + * --------------------------------- + * (C) Copyright 2009, by David Gilbert (for Object Refinery Limited). + * + * Original Author: David Gilbert (for Object Refinery Limited); + * Contributor(s): -; + * + * Changes + * ------- + * 06-Jul-2009 : Version 1 (DG); + * + */ + +package org.jfree.chart; + +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import org.jfree.data.general.Dataset; +import org.jfree.data.general.DatasetSelectionState; + +/** + * The rendering source for drawing to a buffered image. + */ +public class BufferedImageRenderingSource implements RenderingSource { + + private BufferedImage image; + + public BufferedImageRenderingSource(BufferedImage image) { + if (image == null) { + throw new IllegalArgumentException("Null 'image' argument."); + } + this.image = image; + } + + public Graphics2D createGraphics2D() { + return this.image.createGraphics(); + } + + public DatasetSelectionState getSelectionState(Dataset dataset) { + if (dataset instanceof DatasetSelectionState) { + DatasetSelectionState dss = (DatasetSelectionState) dataset; + return dss; + // FIXME: later we could add a mechanism to add the selection + // state externally + } + return null; + } + + + +} Added: trunk/source/org/jfree/chart/event/DatasetChangeInfo.java =================================================================== --- trunk/source/org/jfree/chart/event/DatasetChangeInfo.java (rev 0) +++ trunk/source/org/jfree/chart/event/DatasetChangeInfo.java 2009-07-06 07:25:07 UTC (rev 2193) @@ -0,0 +1,51 @@ +/* =========================================================== + * JFreeChart : a free chart library for the Java(tm) platform + * =========================================================== + * + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. + * + * Project Info: http://www.jfree.org/jfreechart/index.html + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * ---------------------- + * DatasetChangeInfo.java + * ---------------------- + * (C) Copyright 2009, by Object Refinery Limited. + * + * Original Author: David Gilbert (for Object Refinery Limited); + * Contributor(s): -; + * + * Changes + * ------- + * 01-Jul-2009 : Version 1 (DG); + * + */ + +package org.jfree.chart.event; + +/** + * A base class for change info included in a {@link DatasetChangeEvent}. + * Subclasses should be immutable. + * + * @since 1.2.0 + */ +public class DatasetChangeInfo { + +} Added: trunk/source/org/jfree/chart/plot/PieSelectionAttributes.java =================================================================== --- trunk/source/org/jfree/chart/plot/PieSelectionAttributes.java (rev 0) +++ trunk/source/org/jfree/chart/plot/PieSelectionAttributes.java 2009-07-06 07:25:07 UTC (rev 2193) @@ -0,0 +1,334 @@ +/* =========================================================== + * JFreeChart : a free chart library for the Java(tm) platform + * =========================================================== + * + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. + * + * Project Info: http://www.jfree.org/jfreechart/index.html + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * --------------------------- + * PieSelectionAttributes.java + * --------------------------- + * (C) Copyright 2009, by Object Refinery Limited. + * + * Original Author: David Gilbert (for Object Refinery Limited); + * Contributor(s): -; + * + * Changes: + * -------- + * 03-Jul-2009 : Version 1 (DG); + * + */ + +package org.jfree.chart.plot; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Font; +import java.awt.Paint; +import java.awt.Stroke; +import java.io.Serializable; +import org.jfree.chart.util.BooleanList; +import org.jfree.chart.util.ObjectList; +import org.jfree.chart.util.PaintList; +import org.jfree.chart.util.PaintMap; +import org.jfree.chart.util.StrokeMap; + +/** + * A set of attributes that a {@link PiePlot} can use for rendering a selected + * data item. + * + * @since 1.2.0 + */ +public class PieSelectionAttributes implements Cloneable, Serializable { + + private boolean allowNull; + + private PaintMap sectionPaint; + + private Paint defaultPaint; + + private PaintMap sectionOutlinePaint; + + private Paint defaultOutlinePaint; + + private StrokeMap sectionOutlineStroke; + + private Stroke defaultOutlineStroke; + + private BooleanList labelsVisibleList; + + private Boolean defaultLabelVisible; + + private ObjectList labelFontList; + + private Font defaultLabelFont; + + private PaintList labelPaintList; + + private Paint defaultLabelPaint; + + private BooleanList createEntityList; + + private Boolean defaultCreateEntity; + + /** + * Creates a new instance. + */ + public PieSelectionAttributes() { + this(true); + } + + public PieSelectionAttributes(boolean allowNull) { + this.sectionPaint = new PaintMap(); + this.defaultPaint = allowNull ? null : Color.BLACK; + this.sectionOutlinePaint = new PaintMap(); + this.defaultOutlinePaint = allowNull ? null : Color.BLACK; + this.sectionOutlineStroke = new StrokeMap(); + this.defaultOutlineStroke = allowNull ? null : new BasicStroke(2.0f); + } + + public boolean getAllowNull() { + return this.allowNull; + } + + // PAINT + + protected Paint lookupSectionPaint(Comparable key) { + Paint result = this.sectionPaint.getPaint(key); + if (result == null) { + result = this.defaultPaint; + } + return result; + } + + public Paint getSectionPaint(Comparable key) { + return this.sectionPaint.getPaint(key); + } + + public void setSeriesPaint(Comparable key, Paint paint) { + this.sectionPaint.put(key, paint); + } + + public Paint getDefaultPaint() { + return this.defaultPaint; + } + + public void setDefaultPaint(Paint paint) { + if (paint == null && !this.allowNull) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.defaultPaint = paint; + } + + // OUTLINE PAINT + + protected Paint lookupSectionOutlinePaint(Comparable key) { + Paint result = this.sectionOutlinePaint.getPaint(key); + if (result == null) { + result = this.defaultOutlinePaint; + } + return result; + } + + public Paint getSectionOutlinePaint(Comparable key) { + return this.sectionOutlinePaint.getPaint(key); + } + + public void setSectionOutlinePaint(Comparable key, Paint paint) { + this.sectionOutlinePaint.put(key, paint); + } + + public Paint getDefaultOutlinePaint() { + return this.defaultOutlinePaint; + } + + public void setDefaultOutlinePaint(Paint paint) { + if (paint == null && !this.allowNull) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.defaultOutlinePaint = paint; + } + + // OUTLINE STROKE + + protected Stroke lookupSectionOutlineStroke(Comparable key) { + Stroke result = this.sectionOutlineStroke.getStroke(key); + if (result == null) { + result = this.defaultOutlineStroke; + } + return result; + } + + public Stroke getSectionOutlineStroke(Comparable key) { + return this.sectionOutlineStroke.getStroke(key); + } + + public void setSectionOutlineStroke(Comparable key, Stroke stroke) { + this.sectionOutlineStroke.put(key, stroke); + } + + public Stroke getDefaultOutlineStroke() { + return this.defaultOutlineStroke; + } + + public void setDefaultOutlineStroke(Stroke stroke) { + if (stroke == null && !this.allowNull) { + throw new IllegalArgumentException("Null 'stroke' argument."); + } + this.defaultOutlineStroke = stroke; + } + + // LABEL VISIBLE + + public Boolean isLabelVisible(int series, int item) { + return lookupSeriesLabelVisible(series); + } + + protected Boolean lookupSeriesLabelVisible(int series) { + Boolean result = this.labelsVisibleList.getBoolean(series); + if (result == null) { + result = this.defaultLabelVisible; + } + return result; + } + + public Boolean getSeriesLabelVisible(int series) { + return this.labelsVisibleList.getBoolean(series); + } + + public void setSeriesLabelVisible(int series, Boolean visible) { + this.labelsVisibleList.setBoolean(series, visible); + } + + public Boolean getDefaultLabelVisible() { + return this.defaultLabelVisible; + } + + public void setDefaultLabelVisible(Boolean visible) { + if (visible == null && !this.allowNull) { + throw new IllegalArgumentException("Null 'visible' argument."); + } + this.defaultLabelVisible = visible; + } + + // LABEL FONT + + public Font getItemLabelFont(int series, int item) { + return lookupSeriesLabelFont(series); + } + + protected Font lookupSeriesLabelFont(int series) { + Font result = (Font) this.labelFontList.get(series); + if (result == null) { + result = this.defaultLabelFont; + } + return result; + } + + public Font getSeriesLabelFont(int series) { + return (Font) this.labelFontList.get(series); + } + + public void setSeriesLabelFont(int series, Font font) { + this.labelFontList.set(series, font); + } + + public Font getDefaultLabelFont() { + return this.defaultLabelFont; + } + + public void setDefaultLabelFont(Font font) { + if (font == null && !this.allowNull) { + throw new IllegalArgumentException("Null 'font' argument."); + } + this.defaultLabelFont = font; + } + + // LABEL PAINT + + public Paint getItemLabelPaint(int series, int item) { + return lookupSeriesLabelPaint(series); + } + + protected Paint lookupSeriesLabelPaint(int series) { + Paint result = this.labelPaintList.getPaint(series); + if (result == null) { + result = this.defaultLabelPaint; + } + return result; + } + + public Paint getSeriesLabelPaint(int series) { + return this.labelPaintList.getPaint(series); + } + + public void setSeriesLabelPaint(int series, Paint paint) { + this.labelPaintList.setPaint(series, paint); + } + + public Paint getDefaultLabelPaint() { + return this.defaultLabelPaint; + } + + public void setDefaultLabelPaint(Paint paint) { + if (paint == null && !this.allowNull) { + throw new IllegalArgumentException("Null 'paint' argument."); + } + this.defaultLabelPaint = paint; + } + + // CREATE ENTITY - you'd probably use this rarely, but for example you + // might want a chart where the selected items have entities created, but + // not any other items. + + public Boolean getCreateEntity(int series, int item) { + return lookupSeriesCreateEntity(series); + } + + protected Boolean lookupSeriesCreateEntity(int series) { + Boolean result = this.createEntityList.getBoolean(series); + if (result == null) { + result = this.defaultCreateEntity; + } + return result; + } + + public Boolean getSeriesCreateEntity(int series) { + return this.createEntityList.getBoolean(series); + } + + public void setSeriesCreateEntity(int series, Boolean visible) { + this.createEntityList.setBoolean(series, visible); + } + + public Boolean getDefaultCreateEntity() { + return this.defaultCreateEntity; + } + + public void setDefaultCreateEntity(Boolean create) { + if (create == null && !this.allowNull) { + throw new IllegalArgumentException("Null 'create' argument."); + } + this.defaultCreateEntity = create; + } + +} \ No newline at end of file Added: trunk/source/org/jfree/data/KeyedObjectComparator.java =================================================================== --- trunk/source/org/jfree/data/KeyedObjectComparator.java (rev 0) +++ trunk/source/org/jfree/data/KeyedObjectComparator.java 2009-07-06 07:25:07 UTC (rev 2193) @@ -0,0 +1,157 @@ +/* =========================================================== + * JFreeChart : a free chart library for the Java(tm) platform + * =========================================================== + * + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. + * + * Project Info: http://www.jfree.org/jfreechart/index.html + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * -------------------------- + * KeyedObjectComparator.java + * -------------------------- + * (C) Copyright 2009, by Object Refinery Limited. + * + * Original Author: David Gilbert (for Object Refinery Limited); + * Contributor(s): -; + * + * Changes: + * -------- + * 01-Jul-2009 : Version 1 (DG); + * + */ + +package org.jfree.data; + +import java.util.Comparator; + +import org.jfree.chart.util.SortOrder; + +/** + * A utility class that can compare and order two {@link KeyedObject} instances + * and sort them into ascending or descending order by key or by object. + */ +public class KeyedObjectComparator implements Comparator { + + /** The comparator type. */ + private KeyedObjectComparatorType type; + + /** The sort order. */ + private SortOrder order; + + /** + * Creates a new comparator. + * + * @param type the type (<code>BY_KEY</code> or <code>BY_OBJECT</code>, + * <code>null</code> not permitted). + * @param order the order (<code>null</code> not permitted). + */ + public KeyedObjectComparator(KeyedObjectComparatorType type, + SortOrder order) { + if (order == null) { + throw new IllegalArgumentException("Null 'order' argument."); + } + this.type = type; + this.order = order; + } + + /** + * Returns the type. + * + * @return The type (never <code>null</code>). + */ + public KeyedObjectComparatorType getType() { + return this.type; + } + + /** + * Returns the sort order. + * + * @return The sort order (never <code>null</code>). + */ + public SortOrder getOrder() { + return this.order; + } + + /** + * Compares two {@link KeyedValue} instances and returns an + * <code>int</code> that indicates the relative order of the two objects. + * + * @param o1 object 1. + * @param o2 object 2. + * + * @return An int indicating the relative order of the objects. + */ + public int compare(Object o1, Object o2) { + + if (o2 == null) { + return -1; + } + if (o1 == null) { + return 1; + } + + KeyedObject ko1 = (KeyedObject) o1; + KeyedObject ko2 = (KeyedObject) o2; + + if (this.type == KeyedObjectComparatorType.BY_KEY) { + if (this.order.equals(SortOrder.ASCENDING)) { + return ko1.getKey().compareTo(ko2.getKey()); + } + else if (this.order.equals(SortOrder.DESCENDING)) { + return ko2.getKey().compareTo(ko1.getKey()); + } + else { + throw new IllegalArgumentException("Unrecognised sort order."); + } + } + else if (this.type == KeyedObjectComparatorType.BY_VALUE) { + Object n1 = ko1.getObject(); + Object n2 = ko2.getObject(); + Comparable c1 = "FALLBACK"; + if (n1 instanceof Comparable) { + c1 = (Comparable) n1; + } + Comparable c2 = "FALLBACK"; + if (n2 instanceof Comparable) { + c2 = (Comparable) n2; + } + if (n2 == null) { + return -1; + } + if (n1 == null) { + return 1; + } + if (this.order.equals(SortOrder.ASCENDING)) { + return c1.compareTo(c2); + } + else if (this.order.equals(SortOrder.DESCENDING)) { + return c2.compareTo(c1); + } + else { + throw new IllegalArgumentException("Unrecognised sort order."); + } + } + else { + throw new IllegalArgumentException("Unrecognised type."); + } + } + +} Added: trunk/source/org/jfree/data/KeyedObjectComparatorType.java =================================================================== --- trunk/source/org/jfree/data/KeyedObjectComparatorType.java (rev 0) +++ trunk/source/org/jfree/data/KeyedObjectComparatorType.java 2009-07-06 07:25:07 UTC (rev 2193) @@ -0,0 +1,109 @@ +/* =========================================================== + * JFreeChart : a free chart library for the Java(tm) platform + * =========================================================== + * + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. + * + * Project Info: http://www.jfree.org/jfreechart/index.html + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * ------------------------------ + * KeyedObjectComparatorType.java + * ------------------------------ + * (C) Copyright 2009, by Object Refinery Limited. + * + * Original Author: David Gilbert (for Object Refinery Limited); + * Contributor(s): -; + * + * Changes: + * -------- + * 01-Jul-2009 : Version 1 (DG); + * + */ + +package org.jfree.data; + +/** + * Used to indicate the type of a {@link KeyedObjectComparator} : 'by key' or + * 'by object'. + */ +public final class KeyedObjectComparatorType { + + /** An object representing 'by key' sorting. */ + public static final KeyedObjectComparatorType BY_KEY + = new KeyedObjectComparatorType("KeyedObjectComparatorType.BY_KEY"); + + /** An object representing 'by value' sorting. */ + public static final KeyedObjectComparatorType BY_VALUE + = new KeyedObjectComparatorType("KeyedObjectComparatorType.BY_VALUE"); + + /** The name. */ + private String name; + + /** + * Private constructor. + * + * @param name the name. + */ + private KeyedObjectComparatorType(String name) { + this.name = name; + } + + /** + * Returns a string representing the object. + * + * @return The string. + */ + public String toString() { + return this.name; + } + + /** + * Returns <code>true</code> if this object is equal to the specified + * object, and <code>false</code> otherwise. + * + * @param obj the other object. + * + * @return A boolean. + */ + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof KeyedObjectComparatorType)) { + return false; + } + KeyedObjectComparatorType type = (KeyedObjectComparatorType) obj; + if (!this.name.equals(type.name)) { + return false; + } + return true; + } + + /** + * Returns a hash code. + * + * @return A hash code. + */ + public int hashCode() { + return this.name.hashCode(); + } +} + Added: trunk/source/org/jfree/data/SelectableValue.java =================================================================== --- trunk/source/org/jfree/data/SelectableValue.java (rev 0) +++ trunk/source/org/jfree/data/SelectableValue.java 2009-07-06 07:25:07 UTC (rev 2193) @@ -0,0 +1,106 @@ +/* =========================================================== + * JFreeChart : a free chart library for the Java(tm) platform + * =========================================================== + * + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. + * + * Project Info: http://www.jfree.org/jfreechart/index.html + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * -------------------- + * SelectableValue.java + * -------------------- + * (C) Copyright 2009, by Object Refinery Limited. + * + * Original Author: David Gilbert (for Object Refinery Limited); + * Contributor(s): -; + * + * Changes + * ------- + * 03-Jul-2009 : Version 1 (DG); + * + */ + +package org.jfree.data; + +import java.io.Serializable; + +/** + * A data structure for a numerical value along with selection status. + * + * @since 1.2.0 + */ +public class SelectableValue implements Value, Cloneable, Serializable { + + /** The value (<code>null</code> is permitted). */ + private Number value; + + /** Is the item selected? */ + private boolean selected; + + /** + * Creates a new instance with the specified value and the selection + * state set to <code>false</code>. + * + * @param value the value (<code>null</code> permitted). + */ + public SelectableValue(Number value) { + this(value, false); + } + + /** + * Creates a new instance with the specified value and selection state. + * + * @param value the value (<code>null</code> permitted). + * @param selected the selection state. + */ + public SelectableValue(Number value, boolean selected) { + this.value = value; + this.selected = selected; + } + + /** + * Returns the value for this data item. + * + * @return The value (possibly <code>null</code>). + */ + public Number getValue() { + return this.value; + } + + /** + * Returns the selection state. + * + * @return The selection state. + */ + public boolean isSelected() { + return this.selected; + } + + /** + * Sets the selection state. + * + * @param selected selected? + */ + public void setSelected(boolean selected) { + this.selected = selected; + } + +} Added: trunk/source/org/jfree/data/category/AbstractCategoryDataset.java =================================================================== --- trunk/source/org/jfree/data/category/AbstractCategoryDataset.java (rev 0) +++ trunk/source/org/jfree/data/category/AbstractCategoryDataset.java 2009-07-06 07:25:07 UTC (rev 2193) @@ -0,0 +1,95 @@ +/* =========================================================== + * JFreeChart : a free chart library for the Java(tm) platform + * =========================================================== + * + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. + * + * Project Info: http://www.jfree.org/jfreechart/index.html + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * ---------------------------- + * AbstractCategoryDataset.java + * ---------------------------- + * (C) Copyright 2009, by Object Refinery Limited. + * + * Original Author: David Gilbert (for Object Refinery Limited); + * Contributor(s): -; + * + * Changes + * ------- + * 30-Jun-2009 : Version 1 (DG); + * + */ + + +package org.jfree.data.category; + +import org.jfree.chart.event.DatasetChangeInfo; +import org.jfree.data.general.AbstractDataset; + +/** + * A base class that is convenient for implementing the {@link CategoryDataset} + * interface. + */ +public class AbstractCategoryDataset extends AbstractDataset { + + /** + * The dataset selection state (possibly <code>null</code>). + * + * @since 1.2.0 + */ + private CategoryDatasetSelectionState selectionState; + + /** + * Default constructor. + */ + public AbstractCategoryDataset() { + super(); + } + + /** + * Returns the selection state for this dataset, if any. The default + * value is <code>null</code>. + * + * @return The selection state (possibly <code>null</code>). + * + * @since 1.2.0 + */ + public CategoryDatasetSelectionState getSelectionState() { + return this.selectionState; + } + + /** + * Sets the selection state for this dataset. + * + * @param state the selection state (<code>null</code> permitted). + * + * @since 1.2.0 + */ + public void setSelectionState(CategoryDatasetSelectionState state) { + this.selectionState = state; + fireDatasetChanged(new DatasetChangeInfo()); + // TODO: fill in real change details + } + + // TODO: should we override equals() and check the selection state? I + // think yes...and we need cloning and serialization too... + +} Added: trunk/source/org/jfree/data/category/CategoryDatasetSelectionState.java =================================================================== --- trunk/source/org/jfree/data/category/CategoryDatasetSelectionState.java (rev 0) +++ trunk/source/org/jfree/data/category/CategoryDatasetSelectionState.java 2009-07-06 07:25:07 UTC (rev 2193) @@ -0,0 +1,120 @@ +/* =========================================================== + * JFreeChart : a free chart library for the Java(tm) platform + * =========================================================== + * + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. + * + * Project Info: http://www.jfree.org/jfreechart/index.html + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * ---------------------------------- + * CategoryDatasetSelectionState.java + * ---------------------------------- + * (C) Copyright 2009, by Object Refinery Limited. + * + * Original Author: David Gilbert (for Object Refinery Limited); + * Contributor(s): -; + * + * Changes + * ------- + * 30-Jun-2009 : Version 1 (DG); + * + */ + +package org.jfree.data.category; + +import java.io.Serializable; +import org.jfree.chart.util.PublicCloneable; +import org.jfree.data.general.DatasetSelectionState; + +/** + * Returns information about the selection state of items in an + * {@link CategoryDataset}. Classes that implement this interface must also + * implement {@link PublicCloneable} to ensure that charts and datasets can be + * correctly cloned. Likewise, classes implementing this interface must also + * implement {@link Serializable}. + * <br><br> + * The selection state might be part of a dataset implementation, or it could + * be maintained in parallel with a dataset implementation that doesn't + * directly support selection state. + * + * @since 1.2.0 + */ +public interface CategoryDatasetSelectionState extends DatasetSelectionState { + + /** + * Returns the number of rows in the dataset. + * + * @return The number of rows. + */ + public int getRowCount(); + + /** + * Returns the number of columns in the dataset. + * + * + * @return The number of columns. + */ + public int getColumnCount(); + + /** + * Returns <code>true</code> if the specified item is selected, and + * <code>false</code> otherwise. + * + * @param row the row index. + * @param column the column index. + * + * @return A boolean. + */ + public boolean isSelected(int row, int column); + + /** + * Sets the selection state for an item in the dataset. + * + * @param row the row index. + * @param column the column index. + * @param selected the selection state. + */ + public void setSelected(int row, int column, boolean selected); + + /** + * Sets the selection state for the specified item and, if requested, + * fires a change event. + * + * @param row the row index. + * @param column the column index. + * @param selected the selection state. + * @param notify notify listeners? + */ + public void setSelected(int row, int column, boolean selected, + boolean notify); + + /** + * Clears all selected items. + */ + public void clearSelection(); + + /** + * Send an event to registered listeners to indicate that the selection + * has changed. + */ + public void fireSelectionEvent(); + +} Added: trunk/source/org/jfree/data/category/SelectableCategoryDataset.java =================================================================== --- trunk/source/org/jfree/data/category/SelectableCategoryDataset.java (rev 0) +++ trunk/source/org/jfree/data/category/SelectableCategoryDataset.java 2009-07-06 07:25:07 UTC (rev 2193) @@ -0,0 +1,58 @@ +/* =========================================================== + * JFreeChart : a free chart library for the Java(tm) platform + * =========================================================== + * + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. + * + * Project Info: http://www.jfree.org/jfreechart/index.html + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * ------------------------------ + * SelectableCategoryDataset.java + * ------------------------------ + * (C) Copyright 2009, by Object Refinery Limited. + * + * Original Author: David Gilbert (for Object Refinery Limited); + * Contributor(s): -; + * + * Changes + * ------- + * 29-Jun-2009 : Version 1 (DG); + * + */ + +package org.jfree.data.category; + +/** + * A {@link CategoryDataset} that has the ability to track selection state. + */ +public interface SelectableCategoryDataset { + + /** + * Returns the selection state for the dataset. If this method returns + * <code>null</code>, the dataset is not tracking item selections. + * + * @return The selection state (possibly <code>null</code>). + */ + public CategoryDatasetSelectionState getSelectionState(); + +} + + Deleted: trunk/source/org/jfree/data/general/DefaultPieDataset.java =================================================================== --- trunk/source/org/jfree/data/general/DefaultPieDataset.java 2009-07-01 11:46:52 UTC (rev 2192) +++ trunk/source/org/jfree/data/general/DefaultPieDataset.java 2009-07-06 07:25:07 UTC (rev 2193) @@ -1,371 +0,0 @@ -/* =========================================================== - * JFreeChart : a free chart library for the Java(tm) platform - * =========================================================== - * - * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors. - * - * Project Info: http://www.jfree.org/jfreechart/index.html - * - * This library is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation; either version 2.1 of the License, or - * (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - * License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA. - * - * [Java is a trademark or registered trademark of Sun Microsystems, Inc. - * in the United States and other countries.] - * - * ---------------------- - * DefaultPieDataset.java - * ---------------------- - * (C) Copyright 2001-2008, by Object Refinery Limited. - * - * Original Author: David Gilbert (for Object Refinery Limited); - * Contributor(s): Sam (oldman); - * - * Changes - * ------- - * 17-Nov-2001 : Version 1 (DG); - * 22-Jan-2002 : Removed legend methods from dataset implementations (DG); - * 07-Apr-2002 : Modified implementation to guarantee data sequence to remain - * in the order categories are added (oldman); - * 23-Oct-2002 : Added getCategory(int) method and getItemCount() method, in - * line with changes to the PieDataset interface (DG); - * 04-Feb-2003 : Changed underlying data storage to DefaultKeyedValues (DG); - * 04-Mar-2003 : Inserted DefaultKeyedValuesDataset class into hierarchy (DG); - * 24-Apr-2003 : Switched places with DefaultKeyedValuesDataset (DG); - * 18-Aug-2003 : Implemented Cloneable (DG); - * 03-Mar-2005 : Implemented PublicCloneable (DG); - * 29-Jun-2005 : Added remove() method (DG); - * ------------- JFREECHART 1.0.0 --------------------------------------------- - * 31-Jul-2006 : Added a clear() method to clear all values from the - * dataset (DG); - * 28-Sep-2006 : Added sortByKeys() and sortByValues() methods (DG); - * 30-Apr-2007 : Added new insertValues() methods (DG); - * 20-Jun-2007 : Removed JCommon dependencies (DG); - * - */ - -package org.jfree.data.general; - -import java.io.Serializable; -import java.util.Collections; -import java.util.List; - -import org.jfree.chart.util.PublicCloneable; -import org.jfree.chart.util.SortOrder; -import org.jfree.data.DefaultKeyedValues; -import org.jfree.data.KeyedValues; -import org.jfree.data.UnknownKeyException; - -/** - * A default implementation of the {@link PieDataset} interface. - */ -public class DefaultPieDataset extends AbstractDataset - implements PieDataset, Cloneable, PublicCloneable, Serializable { - - /** For serialization. */ - private static final long serialVersionUID = 2904745139106540618L; - - /** Storage for the data. */ - private DefaultKeyedValues data; - - /** - * Constructs a new dataset, initially empty. - */ - public DefaultPieDataset() { - this.data = new DefaultKeyedValues(); - } - - /** - * Creates a new dataset by copying data from a {@link KeyedValues} - * instance. - * - * @param data the data (<code>null</code> not permitted). - */ - public DefaultPieDataset(KeyedValues data) { - if (data == null) { - throw new IllegalArgumentException("Null 'data' argument."); - } - this.data = new DefaultKeyedValues(); - for (int i = 0; i < data.getItemCount(); i++) { - this.data.addValue(data.getKey(i), data.getValue(i)); - } - } - - /** - * Returns the number of items in the dataset. - * - * @return The item count. - */ - public int getItemCount() { - return this.data.getItemCount(); - } - - /** - * Returns the categories in the dataset. The returned list is - * unmodifiable. - * - * @return The categories in the dataset. - */ - public List getKeys() { - return Collections.unmodifiableList(this.data.getKeys()); - } - - /** - * Returns the key for the specified item, or <code>null</code>. - * - * @param item the item index (in the range <code>0</code> to - * <code>getItemCount() - 1</code>). - * - * @return The key, or <code>null</code>. - * - * @throws IndexOutOfBoundsException if <code>item</code> is not in the - * specified range. - */ - public Comparable getKey(int item) { - return this.data.getKey(item); - } - - /** - * Returns the index for a key, or -1 if the key is not recognised. - * - * @param key the key (<code>null</code> not permitted). - * - * @return The index, or <code>-1</code> if the key is unrecognised. - * - * @throws IllegalArgumentException if <code>key</code> is - * <code>null</code>. - */ - public int getIndex(Comparable key) { - return this.data.getIndex(key); - } - - /** - * Returns a value. - * - * @param item the value index. - * - * @return The value (possibly <code>null</code>). - */ - public Number getValue(int item) { - - Number result = null; - if (getItemCount() > item) { - result = this.data.getValue(item); - } - return result; - - } - - /** - * Returns the data value associated with a key. - * - * @param key the key (<code>null</code> not permitted). - * - * @return The value (possibly <code>null</code>). - * - * @throws UnknownKeyException if the key is not recognised. - */ - public Number getValue(Comparable key) { - if (key == null) { - throw new IllegalArgumentException("Null 'key' argument."); - } - return this.data.getValue(key); - } - - /** - * Sets the data value for a key and sends a {@link DatasetChangeEvent} to - * all registered listeners. - * - * @param key the key (<code>null</code> not permitted). - * @param value the value. - * - * @throws IllegalArgumentException if <code>key</code> is - * <code>null</code>. - */ - public void setValue(Comparable key, Number value) { - this.data.setValue(key, value); - fireDatasetChanged(); - } - - /** - * Sets the data value for a key and sends a {@link DatasetChangeEvent} to - * all registered listeners. - * - * @param key the key (<code>null</code> not permitted). - * @param value the value. - * - * @throws IllegalArgumentException if <code>key</code> is - * <code>null</code>. - */ - public void setValue(Comparable key, double value) { - setValue(key, new Double(value)); - } - - /** - * Inserts a new value at the specified position in the dataset or, if - * there is an existing item with the specified key, updates the value - * for that item and moves it to the specified position. After the change - * is made, this methods sends a {@link DatasetChangeEvent} to all - * registered listeners. - * - * @param position the position (in the range 0 to getItemCount()). - * @param key the key (<code>null</code> not permitted). - * @param value the value (<code>null</code> permitted). - * - * @since 1.0.6 - */ - public void insertValue(int position, Comparable key, double value) { - insertValue(position, key, new Double(value)); - } - - /** - * Inserts a new value at the specified position in the dataset or, if - * there is an existing item with the specified key, updates the value - * for that item and moves it to the specified position. After the change - * is made, this methods sends a {@link DatasetChangeEvent} to all - * registered listeners. - * - * @param position the position (in the range 0 to getItemCount()). - * @param key the key (<code>null</code> not permitted). - * @param value the value (<code>null</code> permitted). - * - * @since 1.0.6 - */ - public void insertValue(int position, Comparable key, Number value) { - this.data.insertValue(position, key, value); - fireDatasetChanged(); - } - - /** - * Removes an item from the dataset and sends a {@link DatasetChangeEvent} - * to all registered listeners. - * - * @param key the key (<code>null</code> not permitted). - * - * @throws IllegalArgumentException if <code>key</code> is - * <code>null</code>. - */ - public void remove(Comparable key) { - this.data.removeValue(key); - fireDatasetChanged(); - } - - /** - * Clears all data from this dataset and sends a {@link DatasetChangeEvent} - * to all registered listeners (unless the dataset was already empty). - * - * @since 1.0.2 - */ - public void clear() { - if (getItemCount() > 0) { - this.data.clear(); - fireDatasetChanged(); - } - } - - /** - * Sorts the dataset's items by key and sends a {@link DatasetChangeEvent} - * to all registered listeners. - * - * @param order the sort order (<code>null</code> not permitted). - * - * @since 1.0.3 - */ - public void sortByKeys(SortOrder order) { - this.data.sortByKeys(order); - fireDatasetChanged(); - } - - /** - * Sorts the dataset's items by value and sends a {@link DatasetChangeEvent} - * to all registered listeners. - * - * @param order the sort order (<code>null</code> not permitted). - * - * @since 1.0.3 - */ - public void sortByValues(SortOrder order) { - this.data.sortByValues(order); - fireDatasetChanged(); - } - - /** - * Tests if this object is equal to another. - * - * @param obj the other object. - * - * @return A boolean. - */ - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - - if (!(obj instanceof PieDataset)) { - return false; - } - PieDataset that = (PieDataset) obj; - int count = getItemCount(); - if (that.getItemCount() != count) { - return false; - } - - for (int i = 0; i < count; i++) { - Comparable k1 = getKey(i); - Comparable k2 = that.getKey(i); - if (!k1.equals(k2)) { - return false; - } - - Number v1 = getValue(i); - Number v2 = that.getValue(i); - if (v1 == null) { - if (v2 != null) { - return false; - } - } - else { - if (!v1.equals(v2)) { - return false; - } - } - } - return true; - - } - - /** - * Returns a hash code. - * - * @return A hash code. - */ - public int hashCode() { - return this.data.hashCode(); - } - - /** - * Returns a clone of the dataset. - * - * @return A clone. - * - * @throws CloneNotSupportedException This class will not throw this - * exception, but subclasses (if any) might. - */ - public Object clone() throws CloneNotSupportedException { - DefaultPieDataset clone = (DefaultPieDataset) super.clone(); - clone.data = (DefaultKeyedValues) this.data.clone(); - return clone; - } - -} Deleted: trunk/source/org/jfree/data/general/PieDataset.java =================================================================== --- trunk/source/org/jfree/data/general/PieDataset.java 2009-07-01 11:46:52 UTC (rev 2192) +++ trunk/source/org/jfree/data/general/PieDataset.java 2009-07-06 07:25:07 UTC (rev 2193) @@ -1,60 +0,0 @@ -/* =========================================================== - * JFreeChart : a free chart library for the Java(tm) platform - * =========================================================== - * - * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors. - * - * Project Info: http://www.jfree.org/jfreechart/index.html - * - * This library is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation; either version 2.1 of the License, or - * (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - * License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA. - * - * [Java is a trademark or registered trademark of Sun Microsystems, Inc. - * in the United States and other countries.] - * - * --------------- - * PieDataset.java - * --------------- - * (C) Copyright 2001-2008, by Object Refinery Limited. - * - * Original Author: David Gilbert (for Object Refinery Limited); - * Contributor(s): Sam (oldman); - * - * Changes - * ------- - * 17-Nov-2001 : Version 1 (DG); - * 22-Jan-2002 : Removed the getCategoryCount() method, updated Javadoc - * comments (DG); - * 18-Apr-2002 : getCategories() now returns List instead of Set (oldman); - * 23-Oct-2002 : Reorganised the code: PieDataset now extends KeyedValues - * interface (DG); - * 04-Mar-2003 : Now just replicates the KeyedValuesDataset interface (DG); - * - */ - -package org.jfree.data.general; - -import org.jfree.data.KeyedValues; - -/** - * A general purpose dataset where values are associated with keys. As the - * name suggests, you can use this dataset to supply data for pie charts (refer - * to the {@link org.jfree.chart.plot.PiePlot} class). - */ -public interface PieDataset extends KeyedValues, Dataset { - - // no new methods added. - -} Added: trunk/source/org/jfree/data/pie/AbstractPieDataset.java =================================================================== --- trunk/source/org/jfree/data/pie/AbstractPieDataset.java (rev 0) +++ trunk/source/org/jfree/data/pie/AbstractPieDataset.java 2009-07-06 07:25:07 UTC (rev 2193) @@ -0,0 +1,96 @@ +/* =========================================================== + * JFreeChart : a free chart library for the Java(tm) platform + * =========================================================== + * + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. + * + * Project Info: http://www.jfree.org/jfreechart/index.html + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * ----------------------- + * AbstractPieDataset.java + * ----------------------- + * (C) Copyright 2009, by Object Refinery Limited. + * + * Original Author: David Gilbert (for Object Refinery Limited); + * Contributor(s): -; + * + * Changes + * ------- + * 01-Jul-2009 : Version 1 (DG); + * + */ + + +package org.jfree.data.pie; + +import org.jfree.data.general.*; +import org.jfree.chart.event.DatasetChangeInfo; + +/** + * A base class that is convenient for implementing the {@link PieDataset} + * interface. + */ +public class AbstractPieDataset extends AbstractDataset + implements SelectablePieDataset{ + + /** + * The dataset selection state (possibly <code>null</code>). + * + * @since 1.2.0 + */ + private PieDatasetSelectionState selectionState; + + /** + * Default constructor. + */ + public AbstractPieDataset() { + super(); + } + + /** + * Returns the selection state for this dataset, if any. The default + * value is <code>null</code>. + * + * @return The selection state (possibly <code>null</code>). + * + * @since 1.2.0 + */ + public PieDatasetSelectionState getSelectionState() { + return this.selectionState; + } + + /** + * Sets the selection state for this dataset. + * + * @param state the selection state (<code>null</code> permitted). + * + * @since 1.2.0 + */ + public void setSelectionState(PieDatasetSelectionState state) { + this.selectionState = state; + fireDatasetChanged(new DatasetChangeInfo()); + // TODO: fill in real change details + } + + // TODO: should we override equals() and check the selection state? I + // think yes...and we need cloning and serialization too... + +} \ No newline at end of file Copied: trunk/source/org/jfree/data/pie/DefaultPieDataset.java (from rev 2164, trunk/source/org/jfree/data/general/DefaultPieDataset.java) =================================================================== --- trunk/source/org/jfree/data/pie/DefaultPieDataset.java (rev 0) +++ trunk/source/org/jfree/data/pie/DefaultPieDataset.java 2009-07-06 07:25:07 UTC (rev 2193) @@ -0,0 +1,425 @@ +/* =========================================================== + * JFreeChart : a free chart library for the Java(tm) platform + * =========================================================== + * + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. + * + * Project Info: http://www.jfree.org/jfreechart/index.html + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * ---------------------- + * DefaultPieDataset.java + * ---------------------- + * (C) Copyright 2001-2009, by Object Refinery Limited. + * + * Original Author: David Gilbert (for Object Refinery Limited); + * Contributor(s): Sam (oldman); + * + * Changes + * ------- + * 17-Nov-2001 : Version 1 (DG); + * 22-Jan-2002 : Removed legend methods from dataset implementations (DG); + * 07-Apr-2002 : Modified implementation to guarantee data sequence to remain + * in the order categories are added (oldman); + * 23-Oct-2002 : Added getCategory(int) method and getItemCount() method, in + * line with changes to the PieDataset interface (DG); + * 04-Feb-2003 : Changed underlying data storage to DefaultKeyedValues (DG); + * 04-Mar-2003 : Inserted DefaultKeyedValuesDataset class into hierarchy (DG); + * 24-Apr-2003 : Switched places with DefaultKeyedValuesDataset (DG); + * 18-Aug-2003 : Implemented Cloneable (DG); + * 03-Mar-2005 : Implemented PublicCloneable (DG); + * 29-Jun-2005 : Added remove() method (DG); + * ------------- JFREECHART 1.0.0 --------------------------------------------- + * 31-Jul-2006 : Added a clear() method to clear all values from the + * dataset (DG); + * 28-Sep-2006 : Added sortByKeys() and sortByValues() methods (DG); + * 30-... [truncated message content] |
From: <mu...@us...> - 2009-07-07 19:17:09
|
Revision: 2200 http://jfreechart.svn.sourceforge.net/jfreechart/?rev=2200&view=rev Author: mungady Date: 2009-07-07 19:17:05 +0000 (Tue, 07 Jul 2009) Log Message: ----------- Various updates. Modified Paths: -------------- trunk/source/org/jfree/chart/demo/TimeSeriesChartDemo1.java trunk/source/org/jfree/chart/plot/WaferMapPlot.java trunk/source/org/jfree/chart/plot/XYPlot.java trunk/source/org/jfree/data/time/TimePeriodValues.java trunk/source/org/jfree/data/time/TimeSeries.java trunk/source/org/jfree/data/time/TimeSeriesCollection.java trunk/source/org/jfree/data/time/TimeSeriesTableModel.java trunk/source/org/jfree/data/time/TimeTableXYDataset.java trunk/source/org/jfree/data/xy/VectorSeries.java trunk/source/org/jfree/data/xy/VectorSeriesCollection.java trunk/source/org/jfree/data/xy/XIntervalSeriesCollection.java trunk/source/org/jfree/data/xy/XYBarDataset.java trunk/source/org/jfree/data/xy/XYDatasetTableModel.java trunk/source/org/jfree/data/xy/XYIntervalSeriesCollection.java trunk/source/org/jfree/data/xy/XYSeries.java Modified: trunk/source/org/jfree/chart/demo/TimeSeriesChartDemo1.java =================================================================== --- trunk/source/org/jfree/chart/demo/TimeSeriesChartDemo1.java 2009-07-07 19:16:12 UTC (rev 2199) +++ trunk/source/org/jfree/chart/demo/TimeSeriesChartDemo1.java 2009-07-07 19:17:05 UTC (rev 2200) @@ -92,14 +92,8 @@ private static JFreeChart createChart(XYDataset dataset) { JFreeChart chart = ChartFactory.createTimeSeriesChart( - "Legal & General Unit Trust Prices", // title - "Date", // x-axis label - "Price Per Unit", // y-axis label - dataset, // data - true, // create legend? - true, // generate tooltips? - false // generate URLs? - ); + "Legal & General Unit Trust Prices", "Date", "Price Per Unit", + dataset, true); chart.setBackgroundPaint(Color.white); Modified: trunk/source/org/jfree/chart/plot/WaferMapPlot.java =================================================================== --- trunk/source/org/jfree/chart/plot/WaferMapPlot.java 2009-07-07 19:16:12 UTC (rev 2199) +++ trunk/source/org/jfree/chart/plot/WaferMapPlot.java 2009-07-07 19:17:05 UTC (rev 2200) @@ -67,7 +67,7 @@ import org.jfree.chart.renderer.WaferMapRenderer; import org.jfree.chart.util.RectangleInsets; import org.jfree.chart.util.ResourceBundleWrapper; -import org.jfree.data.general.DatasetChangeEvent; +import org.jfree.data.event.DatasetChangeEvent; import org.jfree.data.general.WaferMapDataset; /** Modified: trunk/source/org/jfree/chart/plot/XYPlot.java =================================================================== --- trunk/source/org/jfree/chart/plot/XYPlot.java 2009-07-07 19:16:12 UTC (rev 2199) +++ trunk/source/org/jfree/chart/plot/XYPlot.java 2009-07-07 19:17:05 UTC (rev 2200) @@ -293,7 +293,7 @@ import org.jfree.chart.util.SerialUtilities; import org.jfree.data.Range; import org.jfree.data.general.Dataset; -import org.jfree.data.general.DatasetChangeEvent; +import org.jfree.data.event.DatasetChangeEvent; import org.jfree.data.general.DatasetUtilities; import org.jfree.data.xy.AbstractXYDataset; import org.jfree.data.xy.SelectableXYDataset; Modified: trunk/source/org/jfree/data/time/TimePeriodValues.java =================================================================== --- trunk/source/org/jfree/data/time/TimePeriodValues.java 2009-07-07 19:16:12 UTC (rev 2199) +++ trunk/source/org/jfree/data/time/TimePeriodValues.java 2009-07-07 19:17:05 UTC (rev 2200) @@ -56,7 +56,7 @@ import org.jfree.chart.util.ObjectUtilities; import org.jfree.data.general.Series; -import org.jfree.data.general.SeriesChangeEvent; +import org.jfree.data.event.SeriesChangeEvent; import org.jfree.data.general.SeriesException; /** Modified: trunk/source/org/jfree/data/time/TimeSeries.java =================================================================== --- trunk/source/org/jfree/data/time/TimeSeries.java 2009-07-07 19:16:12 UTC (rev 2199) +++ trunk/source/org/jfree/data/time/TimeSeries.java 2009-07-07 19:17:05 UTC (rev 2200) @@ -101,7 +101,7 @@ import org.jfree.chart.util.ObjectUtilities; import org.jfree.data.general.Series; -import org.jfree.data.general.SeriesChangeEvent; +import org.jfree.data.event.SeriesChangeEvent; import org.jfree.data.general.SeriesException; /** Modified: trunk/source/org/jfree/data/time/TimeSeriesCollection.java =================================================================== --- trunk/source/org/jfree/data/time/TimeSeriesCollection.java 2009-07-07 19:16:12 UTC (rev 2199) +++ trunk/source/org/jfree/data/time/TimeSeriesCollection.java 2009-07-07 19:17:05 UTC (rev 2200) @@ -102,7 +102,7 @@ import org.jfree.data.DomainInfo; import org.jfree.data.DomainOrder; import org.jfree.data.Range; -import org.jfree.data.general.DatasetChangeEvent; +import org.jfree.data.event.DatasetChangeEvent; import org.jfree.data.xy.AbstractIntervalXYDataset; import org.jfree.data.xy.IntervalXYDataset; import org.jfree.data.xy.SelectableXYDataset; Modified: trunk/source/org/jfree/data/time/TimeSeriesTableModel.java =================================================================== --- trunk/source/org/jfree/data/time/TimeSeriesTableModel.java 2009-07-07 19:16:12 UTC (rev 2199) +++ trunk/source/org/jfree/data/time/TimeSeriesTableModel.java 2009-07-07 19:17:05 UTC (rev 2200) @@ -45,8 +45,8 @@ import javax.swing.table.AbstractTableModel; -import org.jfree.data.general.SeriesChangeEvent; -import org.jfree.data.general.SeriesChangeListener; +import org.jfree.data.event.SeriesChangeEvent; +import org.jfree.data.event.SeriesChangeListener; /** * Wrapper around a time series to convert it to a table model for use in Modified: trunk/source/org/jfree/data/time/TimeTableXYDataset.java =================================================================== --- trunk/source/org/jfree/data/time/TimeTableXYDataset.java 2009-07-07 19:16:12 UTC (rev 2199) +++ trunk/source/org/jfree/data/time/TimeTableXYDataset.java 2009-07-07 19:17:05 UTC (rev 2200) @@ -66,7 +66,7 @@ import org.jfree.data.DefaultKeyedValues2D; import org.jfree.data.DomainInfo; import org.jfree.data.Range; -import org.jfree.data.general.DatasetChangeEvent; +import org.jfree.data.event.DatasetChangeEvent; import org.jfree.data.xy.AbstractIntervalXYDataset; import org.jfree.data.xy.IntervalXYDataset; import org.jfree.data.xy.TableXYDataset; Modified: trunk/source/org/jfree/data/xy/VectorSeries.java =================================================================== --- trunk/source/org/jfree/data/xy/VectorSeries.java 2009-07-07 19:16:12 UTC (rev 2199) +++ trunk/source/org/jfree/data/xy/VectorSeries.java 2009-07-07 19:17:05 UTC (rev 2200) @@ -47,7 +47,7 @@ import org.jfree.data.ComparableObjectItem; import org.jfree.data.ComparableObjectSeries; -import org.jfree.data.general.SeriesChangeEvent; +import org.jfree.data.event.SeriesChangeEvent; /** * A list of (x,y, deltaX, deltaY) data items. Modified: trunk/source/org/jfree/data/xy/VectorSeriesCollection.java =================================================================== --- trunk/source/org/jfree/data/xy/VectorSeriesCollection.java 2009-07-07 19:16:12 UTC (rev 2199) +++ trunk/source/org/jfree/data/xy/VectorSeriesCollection.java 2009-07-07 19:17:05 UTC (rev 2200) @@ -51,7 +51,7 @@ import org.jfree.chart.event.DatasetChangeInfo; import org.jfree.chart.util.ObjectUtilities; import org.jfree.chart.util.PublicCloneable; -import org.jfree.data.general.DatasetChangeEvent; +import org.jfree.data.event.DatasetChangeEvent; /** * A collection of {@link VectorSeries} objects. Modified: trunk/source/org/jfree/data/xy/XIntervalSeriesCollection.java =================================================================== --- trunk/source/org/jfree/data/xy/XIntervalSeriesCollection.java 2009-07-07 19:16:12 UTC (rev 2199) +++ trunk/source/org/jfree/data/xy/XIntervalSeriesCollection.java 2009-07-07 19:17:05 UTC (rev 2200) @@ -50,7 +50,7 @@ import org.jfree.chart.event.DatasetChangeInfo; import org.jfree.chart.util.ObjectUtilities; import org.jfree.chart.util.PublicCloneable; -import org.jfree.data.general.DatasetChangeEvent; +import org.jfree.data.event.DatasetChangeEvent; /** * A collection of {@link XIntervalSeries} objects. Modified: trunk/source/org/jfree/data/xy/XYBarDataset.java =================================================================== --- trunk/source/org/jfree/data/xy/XYBarDataset.java 2009-07-07 19:16:12 UTC (rev 2199) +++ trunk/source/org/jfree/data/xy/XYBarDataset.java 2009-07-07 19:17:05 UTC (rev 2200) @@ -52,8 +52,8 @@ import org.jfree.chart.event.DatasetChangeInfo; import org.jfree.chart.util.PublicCloneable; -import org.jfree.data.general.DatasetChangeEvent; -import org.jfree.data.general.DatasetChangeListener; +import org.jfree.data.event.DatasetChangeEvent; +import org.jfree.data.event.DatasetChangeListener; /** * A dataset wrapper class that converts a standard {@link XYDataset} into an Modified: trunk/source/org/jfree/data/xy/XYDatasetTableModel.java =================================================================== --- trunk/source/org/jfree/data/xy/XYDatasetTableModel.java 2009-07-07 19:16:12 UTC (rev 2199) +++ trunk/source/org/jfree/data/xy/XYDatasetTableModel.java 2009-07-07 19:17:05 UTC (rev 2200) @@ -47,8 +47,8 @@ import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; -import org.jfree.data.general.DatasetChangeEvent; -import org.jfree.data.general.DatasetChangeListener; +import org.jfree.data.event.DatasetChangeEvent; +import org.jfree.data.event.DatasetChangeListener; /** * A READ-ONLY wrapper around a {@link TableXYDataset} to convert it to a Modified: trunk/source/org/jfree/data/xy/XYIntervalSeriesCollection.java =================================================================== --- trunk/source/org/jfree/data/xy/XYIntervalSeriesCollection.java 2009-07-07 19:16:12 UTC (rev 2199) +++ trunk/source/org/jfree/data/xy/XYIntervalSeriesCollection.java 2009-07-07 19:17:05 UTC (rev 2200) @@ -52,7 +52,7 @@ import org.jfree.chart.event.DatasetChangeInfo; import org.jfree.chart.util.ObjectUtilities; import org.jfree.chart.util.PublicCloneable; -import org.jfree.data.general.DatasetChangeEvent; +import org.jfree.data.event.DatasetChangeEvent; /** * A collection of {@link XYIntervalSeries} objects. Modified: trunk/source/org/jfree/data/xy/XYSeries.java =================================================================== --- trunk/source/org/jfree/data/xy/XYSeries.java 2009-07-07 19:16:12 UTC (rev 2199) +++ trunk/source/org/jfree/data/xy/XYSeries.java 2009-07-07 19:17:05 UTC (rev 2200) @@ -86,7 +86,7 @@ import java.util.List; import org.jfree.chart.util.ObjectUtilities; import org.jfree.data.general.Series; -import org.jfree.data.general.SeriesChangeEvent; +import org.jfree.data.event.SeriesChangeEvent; import org.jfree.data.general.SeriesException; /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mu...@us...> - 2009-07-07 19:16:17
|
Revision: 2199 http://jfreechart.svn.sourceforge.net/jfreechart/?rev=2199&view=rev Author: mungady Date: 2009-07-07 19:16:12 +0000 (Tue, 07 Jul 2009) Log Message: ----------- Various updates. Modified Paths: -------------- trunk/source/org/jfree/chart/BufferedImageRenderingSource.java trunk/source/org/jfree/chart/ChartFactory.java trunk/source/org/jfree/chart/ChartPanel.java trunk/source/org/jfree/chart/RenderingSource.java trunk/source/org/jfree/chart/demo/BarChartDemo1.java trunk/source/org/jfree/chart/demo/PieChartDemo1.java trunk/source/org/jfree/chart/plot/CategoryPlot.java trunk/source/org/jfree/chart/plot/MeterPlot.java trunk/source/org/jfree/chart/plot/MultiplePiePlot.java trunk/source/org/jfree/chart/plot/PiePlot.java trunk/source/org/jfree/chart/plot/Plot.java trunk/source/org/jfree/chart/plot/PolarPlot.java trunk/source/org/jfree/chart/plot/SpiderWebPlot.java trunk/source/org/jfree/chart/plot/ThermometerPlot.java trunk/source/org/jfree/chart/plot/dial/DialPlot.java trunk/source/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java trunk/source/org/jfree/data/ComparableObjectSeries.java trunk/source/org/jfree/data/category/CategoryToPieDataset.java trunk/source/org/jfree/data/category/DefaultCategoryDataset.java trunk/source/org/jfree/data/category/SlidingCategoryDataset.java trunk/source/org/jfree/data/gantt/SlidingGanttCategoryDataset.java trunk/source/org/jfree/data/gantt/TaskSeriesCollection.java trunk/source/org/jfree/data/general/AbstractDataset.java trunk/source/org/jfree/data/general/AbstractSeriesDataset.java trunk/source/org/jfree/data/general/Dataset.java trunk/source/org/jfree/data/general/Series.java trunk/source/org/jfree/data/pie/DefaultPieDataset.java trunk/source/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java trunk/source/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java trunk/source/org/jfree/data/statistics/HistogramDataset.java trunk/source/org/jfree/data/statistics/SimpleHistogramDataset.java trunk/source/org/jfree/data/time/DynamicTimeSeriesCollection.java trunk/source/org/jfree/data/time/ohlc/OHLCSeriesCollection.java trunk/source/org/jfree/data/xy/CategoryTableXYDataset.java trunk/source/org/jfree/data/xy/DefaultIntervalXYDataset.java trunk/source/org/jfree/data/xy/DefaultTableXYDataset.java trunk/source/org/jfree/data/xy/DefaultXYDataset.java trunk/source/org/jfree/data/xy/DefaultXYZDataset.java trunk/source/org/jfree/data/xy/IntervalXYDelegate.java Added Paths: ----------- trunk/source/org/jfree/data/event/ trunk/source/org/jfree/data/event/DatasetChangeEvent.java trunk/source/org/jfree/data/event/DatasetChangeListener.java trunk/source/org/jfree/data/event/SeriesChangeEvent.java trunk/source/org/jfree/data/event/SeriesChangeListener.java Removed Paths: ------------- trunk/source/org/jfree/data/general/DatasetChangeEvent.java trunk/source/org/jfree/data/general/DatasetChangeListener.java trunk/source/org/jfree/data/general/SeriesChangeEvent.java trunk/source/org/jfree/data/general/SeriesChangeListener.java Modified: trunk/source/org/jfree/chart/BufferedImageRenderingSource.java =================================================================== --- trunk/source/org/jfree/chart/BufferedImageRenderingSource.java 2009-07-06 20:44:00 UTC (rev 2198) +++ trunk/source/org/jfree/chart/BufferedImageRenderingSource.java 2009-07-07 19:16:12 UTC (rev 2199) @@ -42,16 +42,32 @@ import java.awt.Graphics2D; import java.awt.image.BufferedImage; +import java.util.Iterator; +import java.util.List; import org.jfree.data.general.Dataset; +import org.jfree.data.general.DatasetAndSelection; import org.jfree.data.general.DatasetSelectionState; /** * The rendering source for drawing to a buffered image. + * + * @since 1.2.0 */ public class BufferedImageRenderingSource implements RenderingSource { + /** The buffered image. */ private BufferedImage image; + /** + * A list of {@link DatasetAndSelection} objects. + */ + private List selectionStates = new java.util.ArrayList(); + + /** + * Creates a new rendering source. + * + * @param image the buffered image (<code>null</code> not permitted). + */ public BufferedImageRenderingSource(BufferedImage image) { if (image == null) { throw new IllegalArgumentException("Null 'image' argument."); @@ -59,20 +75,48 @@ this.image = image; } + /** + * Returns a graphics context that a renderer can use to calculate + * selection bounds. + * + * @return A graphics context. + */ public Graphics2D createGraphics2D() { return this.image.createGraphics(); } + /** + * Returns the selection state, if any, that this source is maintaining + * for the specified dataset. + * + * @param dataset the dataset (<code>null</code> not permitted). + * + * @return The selection state (possibly <code>null</code>). + */ public DatasetSelectionState getSelectionState(Dataset dataset) { - if (dataset instanceof DatasetSelectionState) { - DatasetSelectionState dss = (DatasetSelectionState) dataset; - return dss; - // FIXME: later we could add a mechanism to add the selection - // state externally + Iterator iterator = this.selectionStates.iterator(); + while (iterator.hasNext()) { + DatasetAndSelection das = (DatasetAndSelection) iterator.next(); + if (das.getDataset() == dataset) { + return das.getSelection(); + } } + // we didn't find a selection state for the dataset... return null; } + /** + * Stores the selection state that is associated with the specified + * dataset for this rendering source. If two rendering sources are + * displaying the same dataset, ideally they should have separate selection + * states. + * + * @param dataset the dataset (<code>null</code> not permitted). + * @param state the state (<code>null</code> permitted). + */ + public void putSelectionState(Dataset dataset, + DatasetSelectionState state) { + this.selectionStates.add(new DatasetAndSelection(dataset, state)); + } - } Modified: trunk/source/org/jfree/chart/ChartFactory.java =================================================================== --- trunk/source/org/jfree/chart/ChartFactory.java 2009-07-06 20:44:00 UTC (rev 2198) +++ trunk/source/org/jfree/chart/ChartFactory.java 2009-07-07 19:16:12 UTC (rev 2199) @@ -2,7 +2,7 @@ * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * - * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors. + * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * @@ -27,7 +27,7 @@ * ----------------- * ChartFactory.java * ----------------- - * (C) Copyright 2001-2008, by Object Refinery Limited and Contributors. + * (C) Copyright 2001-2009, by Object Refinery Limited and Contributors. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): Serge V. Grachov; @@ -123,7 +123,9 @@ * 23-Oct-2008 : Check for legacy theme in setChartTheme() and reset default * bar painters (DG); * 20-Dec-2008 : In createStackedAreaChart(), set category margin to 0.0 (DG); - * + * 07-Jul-2009 : Simplified API by removing orientation, tooltips and url + * arguments (DG); + * */ package org.jfree.chart; @@ -198,16 +200,9 @@ import org.jfree.chart.renderer.xy.XYStepRenderer; import org.jfree.chart.text.TextAnchor; import org.jfree.chart.title.TextTitle; -import org.jfree.chart.urls.PieURLGenerator; -import org.jfree.chart.urls.StandardCategoryURLGenerator; -import org.jfree.chart.urls.StandardPieURLGenerator; -import org.jfree.chart.urls.StandardXYURLGenerator; -import org.jfree.chart.urls.StandardXYZURLGenerator; -import org.jfree.chart.urls.XYURLGenerator; import org.jfree.chart.util.Layer; import org.jfree.chart.util.RectangleEdge; import org.jfree.chart.util.RectangleInsets; -import org.jfree.chart.util.SortOrder; import org.jfree.chart.util.TableOrder; import org.jfree.data.category.CategoryDataset; import org.jfree.data.category.IntervalCategoryDataset; @@ -216,6 +211,7 @@ import org.jfree.data.general.WaferMapDataset; import org.jfree.data.statistics.BoxAndWhiskerCategoryDataset; import org.jfree.data.statistics.BoxAndWhiskerXYDataset; +import org.jfree.data.time.TimeSeriesCollection; import org.jfree.data.xy.IntervalXYDataset; import org.jfree.data.xy.OHLCDataset; import org.jfree.data.xy.TableXYDataset; @@ -279,35 +275,18 @@ } /** - * Creates a pie chart with default settings. - * <P> - * The chart object returned by this method uses a {@link PiePlot} instance - * as the plot. + * Creates a pie chart with default settings. The chart object returned + * by this method uses a {@link PiePlot} instance as the plot. * * @param title the chart title (<code>null</code> permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param locale the locale (<code>null</code> not permitted). * * @return A pie chart. - * - * @since 1.0.7 */ public static JFreeChart createPieChart(String title, PieDataset dataset, - boolean legend, boolean tooltips, Locale locale) { - - PiePlot plot = new PiePlot(dataset); - plot.setLabelGenerator(new StandardPieSectionLabelGenerator(locale)); - plot.setInsets(new RectangleInsets(0.0, 5.0, 5.0, 5.0)); - if (tooltips) { - plot.setToolTipGenerator(new StandardPieToolTipGenerator(locale)); - } - JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, - plot, legend); - currentTheme.apply(chart); - return chart; - + boolean legend) { + return createPieChart(title, dataset, legend, Locale.getDefault()); } /** @@ -319,30 +298,24 @@ * @param title the chart title (<code>null</code> permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param urls configure chart to generate URLs? + * @param locale the locale (<code>null</code> not permitted). * * @return A pie chart. + * + * @since 1.0.7 */ - public static JFreeChart createPieChart(String title, - PieDataset dataset, - boolean legend, - boolean tooltips, - boolean urls) { + public static JFreeChart createPieChart(String title, PieDataset dataset, + boolean legend, Locale locale) { PiePlot plot = new PiePlot(dataset); - plot.setLabelGenerator(new StandardPieSectionLabelGenerator()); + plot.setLabelGenerator(new StandardPieSectionLabelGenerator(locale)); plot.setInsets(new RectangleInsets(0.0, 5.0, 5.0, 5.0)); - if (tooltips) { - plot.setToolTipGenerator(new StandardPieToolTipGenerator()); - } - if (urls) { - plot.setURLGenerator(new StandardPieURLGenerator()); - } + plot.setToolTipGenerator(new StandardPieToolTipGenerator(locale)); JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend); currentTheme.apply(chart); return chart; + } /** @@ -375,7 +348,6 @@ * @param greenForIncrease an increase since previousDataset will be * displayed in green (decrease red) if true. * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? * @param locale the locale (<code>null</code> not permitted). * @param subTitle displays a subtitle with colour scheme if true * @param showDifference create a new dataset that will show the % @@ -387,17 +359,14 @@ */ public static JFreeChart createPieChart(String title, PieDataset dataset, PieDataset previousDataset, int percentDiffForMaxScale, - boolean greenForIncrease, boolean legend, boolean tooltips, - Locale locale, boolean subTitle, boolean showDifference) { + boolean greenForIncrease, boolean legend, Locale locale, + boolean subTitle, boolean showDifference) { PiePlot plot = new PiePlot(dataset); plot.setLabelGenerator(new StandardPieSectionLabelGenerator(locale)); plot.setInsets(new RectangleInsets(0.0, 5.0, 5.0, 5.0)); + plot.setToolTipGenerator(new StandardPieToolTipGenerator(locale)); - if (tooltips) { - plot.setToolTipGenerator(new StandardPieToolTipGenerator(locale)); - } - List keys = dataset.getKeys(); DefaultPieDataset series = null; if (showDifference) { @@ -494,36 +463,22 @@ * @param greenForIncrease an increase since previousDataset will be * displayed in green (decrease red) if true. * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param urls configure chart to generate URLs? * @param subTitle displays a subtitle with colour scheme if true * @param showDifference create a new dataset that will show the % * difference between the two datasets. * * @return A pie chart. */ - public static JFreeChart createPieChart(String title, - PieDataset dataset, - PieDataset previousDataset, - int percentDiffForMaxScale, - boolean greenForIncrease, - boolean legend, - boolean tooltips, - boolean urls, - boolean subTitle, - boolean showDifference) { + public static JFreeChart createPieChart(String title, PieDataset dataset, + PieDataset previousDataset, int percentDiffForMaxScale, + boolean greenForIncrease, boolean legend, boolean subTitle, + boolean showDifference) { PiePlot plot = new PiePlot(dataset); plot.setLabelGenerator(new StandardPieSectionLabelGenerator()); plot.setInsets(new RectangleInsets(0.0, 5.0, 5.0, 5.0)); - - if (tooltips) { - plot.setToolTipGenerator(new StandardPieToolTipGenerator()); - } - if (urls) { - plot.setURLGenerator(new StandardPieURLGenerator()); - } - + plot.setToolTipGenerator(new StandardPieToolTipGenerator()); + List keys = dataset.getKeys(); DefaultPieDataset series = null; if (showDifference) { @@ -591,34 +546,20 @@ } /** - * Creates a ring chart with default settings. - * <P> - * The chart object returned by this method uses a {@link RingPlot} - * instance as the plot. + * Creates a ring chart with default settings. The chart object returned by + * this method uses a {@link RingPlot} instance as the plot. * * @param title the chart title (<code>null</code> permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param locale the locale (<code>null</code> not permitted). * * @return A ring chart. - * - * @since 1.0.7 */ public static JFreeChart createRingChart(String title, PieDataset dataset, - boolean legend, boolean tooltips, Locale locale) { + boolean legend) { - RingPlot plot = new RingPlot(dataset); - plot.setLabelGenerator(new StandardPieSectionLabelGenerator(locale)); - plot.setInsets(new RectangleInsets(0.0, 5.0, 5.0, 5.0)); - if (tooltips) { - plot.setToolTipGenerator(new StandardPieToolTipGenerator(locale)); - } - JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, - plot, legend); - currentTheme.apply(chart); - return chart; + return createRingChart(title, dataset, legend, Locale.getDefault()); + } /** @@ -630,31 +571,23 @@ * @param title the chart title (<code>null</code> permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param urls configure chart to generate URLs? + * @param locale the locale (<code>null</code> not permitted). * * @return A ring chart. + * + * @since 1.0.7 */ - public static JFreeChart createRingChart(String title, - PieDataset dataset, - boolean legend, - boolean tooltips, - boolean urls) { + public static JFreeChart createRingChart(String title, PieDataset dataset, + boolean legend, Locale locale) { RingPlot plot = new RingPlot(dataset); - plot.setLabelGenerator(new StandardPieSectionLabelGenerator()); + plot.setLabelGenerator(new StandardPieSectionLabelGenerator(locale)); plot.setInsets(new RectangleInsets(0.0, 5.0, 5.0, 5.0)); - if (tooltips) { - plot.setToolTipGenerator(new StandardPieToolTipGenerator()); - } - if (urls) { - plot.setURLGenerator(new StandardPieURLGenerator()); - } + plot.setToolTipGenerator(new StandardPieToolTipGenerator(locale)); JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend); currentTheme.apply(chart); return chart; - } /** @@ -667,17 +600,11 @@ * @param order the order that the data is extracted (by row or by column) * (<code>null</code> not permitted). * @param legend include a legend? - * @param tooltips generate tooltips? - * @param urls generate URLs? * * @return A chart. */ public static JFreeChart createMultiplePieChart(String title, - CategoryDataset dataset, - TableOrder order, - boolean legend, - boolean tooltips, - boolean urls) { + CategoryDataset dataset, TableOrder order, boolean legend) { if (order == null) { throw new IllegalArgumentException("Null 'order' argument."); @@ -686,20 +613,10 @@ plot.setDataExtractOrder(order); plot.setBackgroundPaint(null); plot.setOutlineStroke(null); - - if (tooltips) { - PieToolTipGenerator tooltipGenerator + PieToolTipGenerator tooltipGenerator = new StandardPieToolTipGenerator(); - PiePlot pp = (PiePlot) plot.getPieChart().getPlot(); - pp.setToolTipGenerator(tooltipGenerator); - } - - if (urls) { - PieURLGenerator urlGenerator = new StandardPieURLGenerator(); - PiePlot pp = (PiePlot) plot.getPieChart().getPlot(); - pp.setURLGenerator(urlGenerator); - } - + PiePlot pp = (PiePlot) plot.getPieChart().getPlot(); + pp.setToolTipGenerator(tooltipGenerator); JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend); currentTheme.apply(chart); @@ -715,7 +632,6 @@ * @param title the chart title (<code>null</code> permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? * @param locale the locale (<code>null</code> not permitted). * * @return A pie chart. @@ -723,13 +639,11 @@ * @since 1.0.7 */ public static JFreeChart createPieChart3D(String title, PieDataset dataset, - boolean legend, boolean tooltips, Locale locale) { + boolean legend, Locale locale) { PiePlot3D plot = new PiePlot3D(dataset); plot.setInsets(new RectangleInsets(0.0, 5.0, 5.0, 5.0)); - if (tooltips) { - plot.setToolTipGenerator(new StandardPieToolTipGenerator(locale)); - } + plot.setToolTipGenerator(new StandardPieToolTipGenerator(locale)); JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend); currentTheme.apply(chart); @@ -745,25 +659,15 @@ * @param title the chart title (<code>null</code> permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param urls configure chart to generate URLs? * * @return A pie chart. */ - public static JFreeChart createPieChart3D(String title, - PieDataset dataset, - boolean legend, - boolean tooltips, - boolean urls) { + public static JFreeChart createPieChart3D(String title, PieDataset dataset, + boolean legend) { PiePlot3D plot = new PiePlot3D(dataset); plot.setInsets(new RectangleInsets(0.0, 5.0, 5.0, 5.0)); - if (tooltips) { - plot.setToolTipGenerator(new StandardPieToolTipGenerator()); - } - if (urls) { - plot.setURLGenerator(new StandardPieURLGenerator()); - } + plot.setToolTipGenerator(new StandardPieToolTipGenerator()); JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend); currentTheme.apply(chart); @@ -781,17 +685,11 @@ * @param order the order that the data is extracted (by row or by column) * (<code>null</code> not permitted). * @param legend include a legend? - * @param tooltips generate tooltips? - * @param urls generate URLs? * * @return A chart. */ public static JFreeChart createMultiplePieChart3D(String title, - CategoryDataset dataset, - TableOrder order, - boolean legend, - boolean tooltips, - boolean urls) { + CategoryDataset dataset, TableOrder order, boolean legend) { if (order == null) { throw new IllegalArgumentException("Null 'order' argument."); @@ -810,19 +708,10 @@ pieChart.setBackgroundPaint(null); plot.setPieChart(pieChart); - if (tooltips) { - PieToolTipGenerator tooltipGenerator + PieToolTipGenerator tooltipGenerator = new StandardPieToolTipGenerator(); - PiePlot pp = (PiePlot) plot.getPieChart().getPlot(); - pp.setToolTipGenerator(tooltipGenerator); - } - - if (urls) { - PieURLGenerator urlGenerator = new StandardPieURLGenerator(); - PiePlot pp = (PiePlot) plot.getPieChart().getPlot(); - pp.setURLGenerator(urlGenerator); - } - + PiePlot pp = (PiePlot) plot.getPieChart().getPlot(); + pp.setToolTipGenerator(tooltipGenerator); JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend); currentTheme.apply(chart); @@ -842,57 +731,27 @@ * @param valueAxisLabel the label for the value axis * (<code>null</code> permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). - * @param orientation the plot orientation (horizontal or vertical) - * (<code>null</code> not permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param urls configure chart to generate URLs? * * @return A bar chart. */ public static JFreeChart createBarChart(String title, - String categoryAxisLabel, - String valueAxisLabel, - CategoryDataset dataset, - PlotOrientation orientation, - boolean legend, - boolean tooltips, - boolean urls) { + String categoryAxisLabel, String valueAxisLabel, + CategoryDataset dataset, boolean legend) { - if (orientation == null) { - throw new IllegalArgumentException("Null 'orientation' argument."); - } CategoryAxis categoryAxis = new CategoryAxis(categoryAxisLabel); ValueAxis valueAxis = new NumberAxis(valueAxisLabel); - BarRenderer renderer = new BarRenderer(); - if (orientation == PlotOrientation.HORIZONTAL) { - ItemLabelPosition position1 = new ItemLabelPosition( - ItemLabelAnchor.OUTSIDE3, TextAnchor.CENTER_LEFT); - renderer.setBasePositiveItemLabelPosition(position1); - ItemLabelPosition position2 = new ItemLabelPosition( - ItemLabelAnchor.OUTSIDE9, TextAnchor.CENTER_RIGHT); - renderer.setBaseNegativeItemLabelPosition(position2); - } - else if (orientation == PlotOrientation.VERTICAL) { - ItemLabelPosition position1 = new ItemLabelPosition( - ItemLabelAnchor.OUTSIDE12, TextAnchor.BOTTOM_CENTER); - renderer.setBasePositiveItemLabelPosition(position1); - ItemLabelPosition position2 = new ItemLabelPosition( - ItemLabelAnchor.OUTSIDE6, TextAnchor.TOP_CENTER); - renderer.setBaseNegativeItemLabelPosition(position2); - } - if (tooltips) { - renderer.setBaseToolTipGenerator( - new StandardCategoryToolTipGenerator()); - } - if (urls) { - renderer.setBaseURLGenerator(new StandardCategoryURLGenerator()); - } - + ItemLabelPosition position1 = new ItemLabelPosition( + ItemLabelAnchor.OUTSIDE12, TextAnchor.BOTTOM_CENTER); + renderer.setBasePositiveItemLabelPosition(position1); + ItemLabelPosition position2 = new ItemLabelPosition( + ItemLabelAnchor.OUTSIDE6, TextAnchor.TOP_CENTER); + renderer.setBaseNegativeItemLabelPosition(position2); + renderer.setBaseToolTipGenerator( + new StandardCategoryToolTipGenerator()); CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, renderer); - plot.setOrientation(orientation); JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend); currentTheme.apply(chart); @@ -913,42 +772,21 @@ * @param rangeAxisLabel the label for the value axis * (<code>null</code> permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). - * @param orientation the orientation of the chart (horizontal or - * vertical) (<code>null</code> not permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param urls configure chart to generate URLs? * * @return A stacked bar chart. */ public static JFreeChart createStackedBarChart(String title, - String domainAxisLabel, - String rangeAxisLabel, - CategoryDataset dataset, - PlotOrientation orientation, - boolean legend, - boolean tooltips, - boolean urls) { + String domainAxisLabel, String rangeAxisLabel, + CategoryDataset dataset, boolean legend) { - if (orientation == null) { - throw new IllegalArgumentException("Null 'orientation' argument."); - } - CategoryAxis categoryAxis = new CategoryAxis(domainAxisLabel); ValueAxis valueAxis = new NumberAxis(rangeAxisLabel); - StackedBarRenderer renderer = new StackedBarRenderer(); - if (tooltips) { - renderer.setBaseToolTipGenerator( + renderer.setBaseToolTipGenerator( new StandardCategoryToolTipGenerator()); - } - if (urls) { - renderer.setBaseURLGenerator(new StandardCategoryURLGenerator()); - } - CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, renderer); - plot.setOrientation(orientation); JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend); currentTheme.apply(chart); @@ -968,49 +806,22 @@ * @param valueAxisLabel the label for the value axis (<code>null</code> * permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). - * @param orientation the plot orientation (horizontal or vertical) - * (<code>null</code> not permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param urls configure chart to generate URLs? * * @return A bar chart with a 3D effect. */ public static JFreeChart createBarChart3D(String title, - String categoryAxisLabel, - String valueAxisLabel, - CategoryDataset dataset, - PlotOrientation orientation, - boolean legend, - boolean tooltips, - boolean urls) { + String categoryAxisLabel, String valueAxisLabel, + CategoryDataset dataset, boolean legend) { - if (orientation == null) { - throw new IllegalArgumentException("Null 'orientation' argument."); - } CategoryAxis categoryAxis = new CategoryAxis3D(categoryAxisLabel); ValueAxis valueAxis = new NumberAxis3D(valueAxisLabel); - BarRenderer3D renderer = new BarRenderer3D(); - if (tooltips) { - renderer.setBaseToolTipGenerator( - new StandardCategoryToolTipGenerator()); - } - if (urls) { - renderer.setBaseURLGenerator(new StandardCategoryURLGenerator()); - } - + renderer.setBaseToolTipGenerator( + new StandardCategoryToolTipGenerator()); CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, renderer); - plot.setOrientation(orientation); - if (orientation == PlotOrientation.HORIZONTAL) { - // change rendering order to ensure that bar overlapping is the - // right way around - plot.setRowRenderingOrder(SortOrder.DESCENDING); - plot.setColumnRenderingOrder(SortOrder.DESCENDING); - } plot.setForegroundAlpha(0.75f); - JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend); currentTheme.apply(chart); @@ -1031,50 +842,21 @@ * @param valueAxisLabel the label for the value axis (<code>null</code> * permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). - * @param orientation the orientation (horizontal or vertical) - * (<code>null</code> not permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param urls configure chart to generate URLs? * * @return A stacked bar chart with a 3D effect. */ public static JFreeChart createStackedBarChart3D(String title, - String categoryAxisLabel, - String valueAxisLabel, - CategoryDataset dataset, - PlotOrientation orientation, - boolean legend, - boolean tooltips, - boolean urls) { + String categoryAxisLabel, String valueAxisLabel, + CategoryDataset dataset, boolean legend) { - if (orientation == null) { - throw new IllegalArgumentException("Null 'orientation' argument."); - } CategoryAxis categoryAxis = new CategoryAxis3D(categoryAxisLabel); ValueAxis valueAxis = new NumberAxis3D(valueAxisLabel); - - // create the renderer... CategoryItemRenderer renderer = new StackedBarRenderer3D(); - if (tooltips) { - renderer.setBaseToolTipGenerator( - new StandardCategoryToolTipGenerator()); - } - if (urls) { - renderer.setBaseURLGenerator(new StandardCategoryURLGenerator()); - } - - // create the plot... + renderer.setBaseToolTipGenerator( + new StandardCategoryToolTipGenerator()); CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, renderer); - plot.setOrientation(orientation); - if (orientation == PlotOrientation.HORIZONTAL) { - // change rendering order to ensure that bar overlapping is the - // right way around - plot.setColumnRenderingOrder(SortOrder.DESCENDING); - } - - // create the chart... JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend); currentTheme.apply(chart); @@ -1094,43 +876,22 @@ * @param valueAxisLabel the label for the value axis (<code>null</code> * permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). - * @param orientation the plot orientation (<code>null</code> not - * permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param urls configure chart to generate URLs? * * @return An area chart. */ public static JFreeChart createAreaChart(String title, - String categoryAxisLabel, - String valueAxisLabel, - CategoryDataset dataset, - PlotOrientation orientation, - boolean legend, - boolean tooltips, - boolean urls) { + String categoryAxisLabel, String valueAxisLabel, + CategoryDataset dataset, boolean legend) { - if (orientation == null) { - throw new IllegalArgumentException("Null 'orientation' argument."); - } CategoryAxis categoryAxis = new CategoryAxis(categoryAxisLabel); categoryAxis.setCategoryMargin(0.0); - ValueAxis valueAxis = new NumberAxis(valueAxisLabel); - AreaRenderer renderer = new AreaRenderer(); - if (tooltips) { - renderer.setBaseToolTipGenerator( - new StandardCategoryToolTipGenerator()); - } - if (urls) { - renderer.setBaseURLGenerator(new StandardCategoryURLGenerator()); - } - + renderer.setBaseToolTipGenerator( + new StandardCategoryToolTipGenerator()); CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, renderer); - plot.setOrientation(orientation); JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend); currentTheme.apply(chart); @@ -1151,38 +912,22 @@ * @param valueAxisLabel the label for the value axis (<code>null</code> * permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). - * @param orientation the plot orientation (horizontal or vertical) - * (<code>null</code> not permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param urls configure chart to generate URLs? * * @return A stacked area chart. */ public static JFreeChart createStackedAreaChart(String title, String categoryAxisLabel, String valueAxisLabel, - CategoryDataset dataset, PlotOrientation orientation, - boolean legend, boolean tooltips, boolean urls) { + CategoryDataset dataset, boolean legend) { - if (orientation == null) { - throw new IllegalArgumentException("Null 'orientation' argument."); - } CategoryAxis categoryAxis = new CategoryAxis(categoryAxisLabel); categoryAxis.setCategoryMargin(0.0); ValueAxis valueAxis = new NumberAxis(valueAxisLabel); - StackedAreaRenderer renderer = new StackedAreaRenderer(); - if (tooltips) { - renderer.setBaseToolTipGenerator( + renderer.setBaseToolTipGenerator( new StandardCategoryToolTipGenerator()); - } - if (urls) { - renderer.setBaseURLGenerator(new StandardCategoryURLGenerator()); - } - CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, renderer); - plot.setOrientation(orientation); JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend); currentTheme.apply(chart); @@ -1202,40 +947,21 @@ * @param valueAxisLabel the label for the value axis (<code>null</code> * permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). - * @param orientation the chart orientation (horizontal or vertical) - * (<code>null</code> not permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param urls configure chart to generate URLs? * * @return A line chart. */ public static JFreeChart createLineChart(String title, - String categoryAxisLabel, - String valueAxisLabel, - CategoryDataset dataset, - PlotOrientation orientation, - boolean legend, - boolean tooltips, - boolean urls) { + String categoryAxisLabel, String valueAxisLabel, + CategoryDataset dataset, boolean legend) { - if (orientation == null) { - throw new IllegalArgumentException("Null 'orientation' argument."); - } CategoryAxis categoryAxis = new CategoryAxis(categoryAxisLabel); ValueAxis valueAxis = new NumberAxis(valueAxisLabel); - LineAndShapeRenderer renderer = new LineAndShapeRenderer(true, false); - if (tooltips) { - renderer.setBaseToolTipGenerator( + renderer.setBaseToolTipGenerator( new StandardCategoryToolTipGenerator()); - } - if (urls) { - renderer.setBaseURLGenerator(new StandardCategoryURLGenerator()); - } CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, renderer); - plot.setOrientation(orientation); JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend); currentTheme.apply(chart); @@ -1255,40 +981,22 @@ * @param valueAxisLabel the label for the value axis (<code>null</code> * permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). - * @param orientation the chart orientation (horizontal or vertical) - * (<code>null</code> not permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param urls configure chart to generate URLs? * * @return A line chart. */ public static JFreeChart createLineChart3D(String title, - String categoryAxisLabel, - String valueAxisLabel, - CategoryDataset dataset, - PlotOrientation orientation, - boolean legend, - boolean tooltips, - boolean urls) { + String categoryAxisLabel, String valueAxisLabel, + CategoryDataset dataset, boolean legend) { - if (orientation == null) { - throw new IllegalArgumentException("Null 'orientation' argument."); - } CategoryAxis categoryAxis = new CategoryAxis3D(categoryAxisLabel); ValueAxis valueAxis = new NumberAxis3D(valueAxisLabel); LineRenderer3D renderer = new LineRenderer3D(); - if (tooltips) { - renderer.setBaseToolTipGenerator( - new StandardCategoryToolTipGenerator()); - } - if (urls) { - renderer.setBaseURLGenerator(new StandardCategoryURLGenerator()); - } + renderer.setBaseToolTipGenerator( + new StandardCategoryToolTipGenerator()); CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, renderer); - plot.setOrientation(orientation); JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend); currentTheme.apply(chart); @@ -1310,32 +1018,19 @@ * (<code>null</code> permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param urls configure chart to generate URLs? * * @return A Gantt chart. */ public static JFreeChart createGanttChart(String title, - String categoryAxisLabel, - String dateAxisLabel, - IntervalCategoryDataset dataset, - boolean legend, - boolean tooltips, - boolean urls) { + String categoryAxisLabel, String dateAxisLabel, + IntervalCategoryDataset dataset, boolean legend) { CategoryAxis categoryAxis = new CategoryAxis(categoryAxisLabel); DateAxis dateAxis = new DateAxis(dateAxisLabel); - CategoryItemRenderer renderer = new GanttRenderer(); - if (tooltips) { - renderer.setBaseToolTipGenerator( + renderer.setBaseToolTipGenerator( new IntervalCategoryToolTipGenerator( "{3} - {4}", DateFormat.getDateInstance())); - } - if (urls) { - renderer.setBaseURLGenerator(new StandardCategoryURLGenerator()); - } - CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, dateAxis, renderer); plot.setOrientation(PlotOrientation.HORIZONTAL); @@ -1358,62 +1053,32 @@ * @param valueAxisLabel the label for the value axis (<code>null</code> * permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). - * @param orientation the plot orientation (horizontal or vertical) - * (<code>null</code> NOT permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param urls configure chart to generate URLs? * * @return A waterfall chart. */ public static JFreeChart createWaterfallChart(String title, - String categoryAxisLabel, - String valueAxisLabel, - CategoryDataset dataset, - PlotOrientation orientation, - boolean legend, - boolean tooltips, - boolean urls) { + String categoryAxisLabel, String valueAxisLabel, + CategoryDataset dataset, boolean legend) { - if (orientation == null) { - throw new IllegalArgumentException("Null 'orientation' argument."); - } CategoryAxis categoryAxis = new CategoryAxis(categoryAxisLabel); categoryAxis.setCategoryMargin(0.0); - ValueAxis valueAxis = new NumberAxis(valueAxisLabel); - WaterfallBarRenderer renderer = new WaterfallBarRenderer(); - if (orientation == PlotOrientation.HORIZONTAL) { - ItemLabelPosition position = new ItemLabelPosition( - ItemLabelAnchor.CENTER, TextAnchor.CENTER, - TextAnchor.CENTER, Math.PI / 2.0); - renderer.setBasePositiveItemLabelPosition(position); - renderer.setBaseNegativeItemLabelPosition(position); - } - else if (orientation == PlotOrientation.VERTICAL) { - ItemLabelPosition position = new ItemLabelPosition( - ItemLabelAnchor.CENTER, TextAnchor.CENTER, - TextAnchor.CENTER, 0.0); - renderer.setBasePositiveItemLabelPosition(position); - renderer.setBaseNegativeItemLabelPosition(position); - } - if (tooltips) { - StandardCategoryToolTipGenerator generator + ItemLabelPosition position = new ItemLabelPosition( + ItemLabelAnchor.CENTER, TextAnchor.CENTER, + TextAnchor.CENTER, 0.0); + renderer.setBasePositiveItemLabelPosition(position); + renderer.setBaseNegativeItemLabelPosition(position); + StandardCategoryToolTipGenerator generator = new StandardCategoryToolTipGenerator(); - renderer.setBaseToolTipGenerator(generator); - } - if (urls) { - renderer.setBaseURLGenerator(new StandardCategoryURLGenerator()); - } - + renderer.setBaseToolTipGenerator(generator); CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, renderer); plot.clearRangeMarkers(); Marker baseline = new ValueMarker(0.0); baseline.setPaint(Color.black); plot.addRangeMarker(baseline, Layer.FOREGROUND); - plot.setOrientation(orientation); JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend); currentTheme.apply(chart); @@ -1430,16 +1095,11 @@ * @param title the chart title (<code>null</code> permitted). * @param dataset the dataset (<code>null</code> permitted). * @param legend legend required? - * @param tooltips tooltips required? - * @param urls URLs required? * * @return A chart. */ - public static JFreeChart createPolarChart(String title, - XYDataset dataset, - boolean legend, - boolean tooltips, - boolean urls) { + public static JFreeChart createPolarChart(String title, XYDataset dataset, + boolean legend) { PolarPlot plot = new PolarPlot(); plot.setDataset(dataset); @@ -1467,43 +1127,21 @@ * @param xAxisLabel a label for the X-axis (<code>null</code> permitted). * @param yAxisLabel a label for the Y-axis (<code>null</code> permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). - * @param orientation the plot orientation (horizontal or vertical) - * (<code>null</code> NOT permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param urls configure chart to generate URLs? * * @return A scatter plot. */ public static JFreeChart createScatterPlot(String title, String xAxisLabel, - String yAxisLabel, XYDataset dataset, PlotOrientation orientation, - boolean legend, boolean tooltips, boolean urls) { + String yAxisLabel, XYDataset dataset, boolean legend) { - if (orientation == null) { - throw new IllegalArgumentException("Null 'orientation' argument."); - } NumberAxis xAxis = new NumberAxis(xAxisLabel); xAxis.setAutoRangeIncludesZero(false); NumberAxis yAxis = new NumberAxis(yAxisLabel); yAxis.setAutoRangeIncludesZero(false); - XYPlot plot = new XYPlot(dataset, xAxis, yAxis, null); - - XYToolTipGenerator toolTipGenerator = null; - if (tooltips) { - toolTipGenerator = new StandardXYToolTipGenerator(); - } - - XYURLGenerator urlGenerator = null; - if (urls) { - urlGenerator = new StandardXYURLGenerator(); - } XYItemRenderer renderer = new XYLineAndShapeRenderer(false, true); - renderer.setBaseToolTipGenerator(toolTipGenerator); - renderer.setBaseURLGenerator(urlGenerator); + renderer.setBaseToolTipGenerator(new StandardXYToolTipGenerator()); plot.setRenderer(renderer); - plot.setOrientation(orientation); - JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend); currentTheme.apply(chart); @@ -1524,27 +1162,14 @@ * @param dateAxis make the domain axis display dates? * @param yAxisLabel a label for the Y-axis (<code>null</code> permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). - * @param orientation the orientation (horizontal or vertical) - * (<code>null</code> NOT permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param urls configure chart to generate URLs? * * @return An XY bar chart. */ - public static JFreeChart createXYBarChart(String title, - String xAxisLabel, - boolean dateAxis, - String yAxisLabel, - IntervalXYDataset dataset, - PlotOrientation orientation, - boolean legend, - boolean tooltips, - boolean urls) { + public static JFreeChart createXYBarChart(String title, String xAxisLabel, + boolean dateAxis, String yAxisLabel, IntervalXYDataset dataset, + boolean legend) { - if (orientation == null) { - throw new IllegalArgumentException("Null 'orientation' argument."); - } ValueAxis domainAxis = null; if (dateAxis) { domainAxis = new DateAxis(xAxisLabel); @@ -1557,23 +1182,16 @@ ValueAxis valueAxis = new NumberAxis(yAxisLabel); XYBarRenderer renderer = new XYBarRenderer(); - if (tooltips) { - XYToolTipGenerator tt; - if (dateAxis) { - tt = StandardXYToolTipGenerator.getTimeSeriesInstance(); - } - else { - tt = new StandardXYToolTipGenerator(); - } - renderer.setBaseToolTipGenerator(tt); + XYToolTipGenerator tt; + if (dateAxis) { + tt = StandardXYToolTipGenerator.getTimeSeriesInstance(); } - if (urls) { - renderer.setBaseURLGenerator(new StandardXYURLGenerator()); + else { + tt = new StandardXYToolTipGenerator(); } + renderer.setBaseToolTipGenerator(tt); XYPlot plot = new XYPlot(dataset, domainAxis, valueAxis, renderer); - plot.setOrientation(orientation); - JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend); currentTheme.apply(chart); @@ -1593,45 +1211,21 @@ * @param xAxisLabel a label for the X-axis (<code>null</code> permitted). * @param yAxisLabel a label for the Y-axis (<code>null</code> permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). - * @param orientation the plot orientation (horizontal or vertical) - * (<code>null</code> NOT permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param urls configure chart to generate URLs? * * @return An XY area chart. */ - public static JFreeChart createXYAreaChart(String title, - String xAxisLabel, - String yAxisLabel, - XYDataset dataset, - PlotOrientation orientation, - boolean legend, - boolean tooltips, - boolean urls) { + public static JFreeChart createXYAreaChart(String title, String xAxisLabel, + String yAxisLabel, XYDataset dataset, boolean legend) { - if (orientation == null) { - throw new IllegalArgumentException("Null 'orientation' argument."); - } NumberAxis xAxis = new NumberAxis(xAxisLabel); xAxis.setAutoRangeIncludesZero(false); NumberAxis yAxis = new NumberAxis(yAxisLabel); XYPlot plot = new XYPlot(dataset, xAxis, yAxis, null); - plot.setOrientation(orientation); plot.setForegroundAlpha(0.5f); - - XYToolTipGenerator tipGenerator = null; - if (tooltips) { - tipGenerator = new StandardXYToolTipGenerator(); - } - - XYURLGenerator urlGenerator = null; - if (urls) { - urlGenerator = new StandardXYURLGenerator(); - } - - plot.setRenderer(new XYAreaRenderer(XYAreaRenderer.AREA, tipGenerator, - urlGenerator)); + XYAreaRenderer renderer = new XYAreaRenderer(XYAreaRenderer.AREA); + renderer.setBaseToolTipGenerator(new StandardXYToolTipGenerator()); + plot.setRenderer(renderer); JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend); currentTheme.apply(chart); @@ -1649,48 +1243,25 @@ * @param xAxisLabel a label for the X-axis (<code>null</code> permitted). * @param yAxisLabel a label for the Y-axis (<code>null</code> permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). - * @param orientation the plot orientation (horizontal or vertical) - * (<code>null</code> NOT permitted). * @param legend a flag specifying whether or not a legend is required. - * @param tooltips configure chart to generate tool tips? - * @param urls configure chart to generate URLs? + * * @return A stacked XY area chart. */ public static JFreeChart createStackedXYAreaChart(String title, - String xAxisLabel, - String yAxisLabel, - TableXYDataset dataset, - PlotOrientation orientation, - boolean legend, - boolean tooltips, - boolean urls) { + String xAxisLabel, String yAxisLabel, TableXYDataset dataset, + boolean legend) { - if (orientation == null) { - throw new IllegalArgumentException("Null 'orientation' argument."); - } NumberAxis xAxis = new NumberAxis(xAxisLabel); xAxis.setAutoRangeIncludesZero(false); xAxis.setLowerMargin(0.0); xAxis.setUpperMargin(0.0); NumberAxis yAxis = new NumberAxis(yAxisLabel); - XYToolTipGenerator toolTipGenerator = null; - if (tooltips) { - toolTipGenerator = new StandardXYToolTipGenerator(); - } - - XYURLGenerator urlGenerator = null; - if (urls) { - urlGenerator = new StandardXYURLGenerator(); - } ... [truncated message content] |