From 8626f1472b813c2e7459602bc87591bce3ecdb49 Mon Sep 17 00:00:00 2001 From: Matt E Date: Fri, 27 Nov 2020 20:39:14 -0500 Subject: [PATCH 1/6] Add XYAnnotation support --- README.md | 152 +++++++---- .../simple-time-series-with-annotations.png | Bin 0 -> 24874 bytes .../stock-chart-time-series-weekend-gaps.png | Bin 80835 -> 74507 bytes .../builders/IXYAnnotationBuilder.java | 107 ++++++++ .../jfcbuilder/builders/IXYPlotBuilder.java | 12 +- .../jfcbuilder/builders/OhlcPlotBuilder.java | 23 ++ .../builders/VolumeXYPlotBuilder.java | 42 +-- .../builders/XYAnnotationElements.java | 249 ++++++++++++++++++ .../jfcbuilder/builders/XYArrowBuilder.java | 128 +++++++++ .../jfcbuilder/builders/XYPlotBuilder.java | 20 +- .../jfcbuilder/builders/XYTextBuilder.java | 116 ++++++++ .../XYTimeSeriesPlotBuilderElements.java | 24 +- 12 files changed, 790 insertions(+), 83 deletions(-) create mode 100644 screenshots/simple-time-series-with-annotations.png create mode 100644 src/main/java/com/jfcbuilder/builders/IXYAnnotationBuilder.java create mode 100644 src/main/java/com/jfcbuilder/builders/XYAnnotationElements.java create mode 100644 src/main/java/com/jfcbuilder/builders/XYArrowBuilder.java create mode 100644 src/main/java/com/jfcbuilder/builders/XYTextBuilder.java diff --git a/README.md b/README.md index f0baed0..0dfddc5 100644 --- a/README.md +++ b/README.md @@ -4,38 +4,73 @@ A [builder pattern](https://en.wikipedia.org/wiki/Builder_pattern) module for wo Takes an opinionated approach to creating "good enough" charts while providing a more declarative way of parameterizing them. + +## Capabilities + +* XY time series plots using a [CombinedDomainXYPlot](https://github.com/jfree/jfreechart/blob/master/src/main/java/org/jfree/chart/plot/CombinedDomainXYPlot.java) in all cases. This produces left-to-right horizontal time axes and vertical value axes. The time axis is meant to be shared by all sub-plots. If you need different time axes then you'll need to `build()` multiple charts and lay those out as desired in your app. + +* Stock market OHLC candlestick charts + +* Stock market volume bar charts + +* Stright lines + +* Annotations (arrows and text) + +In the future, more parameterization may be added like specifying background and axis colors, or even the actual series renderer objects themselves to fully leverage what [jfreechart](https://github.com/jfree/jfreechart) provides. + +## Samples + Code like this: ``` -public static final Stroke SOLID = - new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND); +ChartBuilder.instance() + .title("Simple Time Series With Annotations") + .timeData(timeArray) + .xyPlot(XYPlotBuilder.instance() + .series(XYTimeSeriesBuilder.instance().name("Amplitude").data(array1).color(Color.BLUE).style(SOLID_LINE)) + .annotation(XYArrowBuilder.instance().x(arrowX).y(arrowY).angle(180.0).color(Color.RED).text(arrowTxt)) + .annotation(XYArrowBuilder.instance().x(arrowX).y(arrowY).angle(0.0).color(Color.RED)) + .annotation(XYTextBuilder.instance().x(arrowX).y(arrowY).color(DARK_GREEN) + .text("This value!").textPaddingLeft(5).textAlign(TextAnchor.BASELINE_LEFT).angle(90.0))) + .build() +``` + +Produces a chart like this: + +![A multi-plot minute time series chart](./screenshots/simple-time-series-with-annotations.png "Screenshot") + +Multiple series can be multi-plotted like this: + +``` +public static final Stroke SOLID = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND); private static final Color DARK_GREEN = new Color(0, 150, 0); ChartBuilder.instance() - .title("Multi Plot Minute Time Series") + .title("Multi Plot Minute Time Series") - .timeData(timestampsArray) + .timeData(timeArray) - .xyPlot(XYPlotBuilder.instance().yAxisName("Values") - .series(XYTimeSeriesBuilder.instance().data(array1).color(Color.BLUE).style(SOLID)) - .series(XYTimeSeriesBuilder.instance().data(array2).color(Color.RED).style(SOLID)) - .series(XYTimeSeriesBuilder.instance().data(array3).color(DARK_GREEN).style(SOLID)) - .series(XYTimeSeriesBuilder.instance().data(array4).color(Color.MAGENTA).style(SOLID))) + .xyPlot(XYPlotBuilder.instance().yAxisName("Values") + .series(XYTimeSeriesBuilder.instance().data(array1).color(Color.BLUE).style(SOLID)) + .series(XYTimeSeriesBuilder.instance().data(array2).color(Color.RED).style(SOLID)) + .series(XYTimeSeriesBuilder.instance().data(array3).color(DARK_GREEN).style(SOLID)) + .series(XYTimeSeriesBuilder.instance().data(array4).color(Color.MAGENTA).style(SOLID))) - .xyPlot(XYPlotBuilder.instance().yAxisName("Amplitudes") - .series(XYTimeSeriesBuilder.instance().data(array2).color(Color.GRAY).style(SOLID)) - .series(XYTimeSeriesBuilder.instance().data(array3).color(Color.LIGHT_GRAY).style(SOLID))) + .xyPlot(XYPlotBuilder.instance().yAxisName("Amplitudes") + .series(XYTimeSeriesBuilder.instance().data(array2).color(Color.GRAY).style(SOLID)) + .series(XYTimeSeriesBuilder.instance().data(array3).color(Color.LIGHT_GRAY).style(SOLID))) - .xyPlot(XYPlotBuilder.instance().yAxisName("Series 1") - .series(XYTimeSeriesBuilder.instance().data(array1).color(Color.BLUE).style(SOLID))) + .xyPlot(XYPlotBuilder.instance().yAxisName("Series 1") + .series(XYTimeSeriesBuilder.instance().data(array1).color(Color.BLUE).style(SOLID))) - .xyPlot(XYPlotBuilder.instance().yAxisName("Series 2") - .series(XYTimeSeriesBuilder.instance().data(array2).color(Color.RED).style(SOLID))) + .xyPlot(XYPlotBuilder.instance().yAxisName("Series 2") + .series(XYTimeSeriesBuilder.instance().data(array2).color(Color.RED).style(SOLID))) - .xyPlot(XYPlotBuilder.instance().yAxisName("Series 3") - .series(XYTimeSeriesBuilder.instance().data(array3).color(DARK_GREEN).style(SOLID))) + .xyPlot(XYPlotBuilder.instance().yAxisName("Series 3") + .series(XYTimeSeriesBuilder.instance().data(array3).color(DARK_GREEN).style(SOLID))) .build() ``` @@ -44,34 +79,41 @@ Produces a chart like this: ![A multi-plot minute time series chart](./screenshots/multi-plot-minute-time-series.png "Screenshot") -And code like this: +Stock chart code and data like this: ``` ChartBuilder.instance() - .title("Stock Chart Time Series With Weekend Gaps") - - .timeData(timestampsArray) // Has weekend date timestamps missing - - .xyPlot(OhlcPlotBuilder.instance().yAxisName("Price").plotWeight(3) - .series(OhlcSeriesBuilder.instance().ohlcv(ohlcv).upColor(Color.WHITE).downColor(Color.RED)) - .series(XYTimeSeriesBuilder.instance().name("MA(20)").data(sma20).color(Color.MAGENTA).style(SOLID)) - .series(XYTimeSeriesBuilder.instance().name("MA(50)").data(sma50).color(Color.BLUE).style(SOLID)) - .series(XYTimeSeriesBuilder.instance().name("MA(200)").data(sma200).color(Color.RED).style(SOLID))) - - .xyPlot(VolumeXYPlotBuilder.instance().yAxisName("Volume") - .series(VolumeXYTimeSeriesBuilder.instance().ohlcv(ohlcv).closeUpSeries().color(Color.WHITE)) - .series(VolumeXYTimeSeriesBuilder.instance().ohlcv(ohlcv).closeDownSeries().color(Color.RED)) - .series(XYTimeSeriesBuilder.instance().name("MA(90)").data(volSma90).color(Color.BLUE).style(SOLID))) - - .xyPlot(XYPlotBuilder.instance().yAxisName("Stoch").yAxisRange(0.0, 100.0).yAxisTickSize(50.0) - .series(XYTimeSeriesBuilder.instance().name("K(" + K + ")").data(stochK).color(Color.RED).style(SOLID)) - .series(XYTimeSeriesBuilder.instance().name("D(" + D + ")").data(stochD).color(Color.BLUE).style(SOLID)) - .line(LineBuilder.instance().orientation(Orientation.HORIZONTAL).atValue(80.0).color(Color.BLACK).style(SOLID)) - .line(LineBuilder.instance().orientation(Orientation.HORIZONTAL).atValue(50.0).color(Color.BLUE).style(SOLID)) - .line(LineBuilder.instance().orientation(Orientation.HORIZONTAL).atValue(20.0).color(Color.BLACK).style(SOLID))) - - .build() + .title("Stock Chart Time Series With Weekend Gaps, Lines, and Annotations") + .timeData(timeArray) + + .xyPlot(OhlcPlotBuilder.instance().yAxisName("Price").plotWeight(3) + .series(OhlcSeriesBuilder.instance().ohlcv(dohlcv).upColor(Color.WHITE).downColor(Color.RED)) + .series(XYTimeSeriesBuilder.instance().name("MA(20)").data(sma20).color(Color.MAGENTA).style(SOLID_LINE)) + .series(XYTimeSeriesBuilder.instance().name("MA(50)").data(sma50).color(Color.BLUE).style(SOLID_LINE)) + .series(XYTimeSeriesBuilder.instance().name("MA(200)").data(sma200).color(Color.RED).style(SOLID_LINE)) + .annotation(XYArrowBuilder.instance().x(stockEventDate).y(stockEventPrice).angle(270.0).color(DARK_GREEN) + .textAlign(TextAnchor.BOTTOM_CENTER).text(String.format("%.2f", stockEventPrice))) + .line(LineBuilder.instance().orientation(Orientation.HORIZONTAL).atValue(resistanceLevel) + .color(Color.LIGHT_GRAY).style(SOLID_LINE))) + + .xyPlot(VolumeXYPlotBuilder.instance().yAxisName("Volume").plotWeight(1) + .series(VolumeXYTimeSeriesBuilder.instance().ohlcv(dohlcv).closeUpSeries().color(Color.WHITE)) + .series(VolumeXYTimeSeriesBuilder.instance().ohlcv(dohlcv).closeDownSeries().color(Color.RED)) + .series(XYTimeSeriesBuilder.instance().name("MA(90)").data(volSma90).color(Color.BLUE).style(SOLID_LINE)) + .annotation(XYArrowBuilder.instance().x(stockEventDate).y(stockEventVolume).angle(270.0).color(DARK_GREEN) + .textAlign(TextAnchor.BOTTOM_CENTER).text(String.format("%.0f", stockEventVolume))) + .line(LineBuilder.instance().orientation(Orientation.HORIZONTAL).atValue(volumeLine) + .color(DARK_GREEN).style(SOLID_LINE))) + + .xyPlot(XYPlotBuilder.instance().yAxisName("Stoch").yAxisRange(0.0, 100.0).yAxisTickSize(50.0).plotWeight(1) + .series(XYTimeSeriesBuilder.instance().name("K(" + K + ")").data(stoch.getPctK()).color(Color.RED).style(SOLID_LINE)) + .series(XYTimeSeriesBuilder.instance().name("D(" + D + ")").data(stoch.getPctD()).color(Color.BLUE).style(SOLID_LINE)) + .line(LineBuilder.instance().orientation(Orientation.HORIZONTAL).atValue(80.0).color(Color.BLACK).style(SOLID_LINE)) + .line(LineBuilder.instance().orientation(Orientation.HORIZONTAL).atValue(50.0).color(Color.BLUE).style(SOLID_LINE)) + .line(LineBuilder.instance().orientation(Orientation.HORIZONTAL).atValue(20.0).color(Color.BLACK).style(SOLID_LINE))) + + .build() ``` Produces a chart like this: @@ -83,18 +125,10 @@ Produces a chart like this: See the [jfreechart-builder-demo](https://github.com/matoos32/jfreechart-builder-demo) for an interactive demo used for development. -## Scope - -Currently only supports XY time series plots and uses a [CombinedDomainXYPlot](https://github.com/jfree/jfreechart/blob/master/src/main/java/org/jfree/chart/plot/CombinedDomainXYPlot.java) in all cases. This produces left-to-right horizontal time axes and vertical value axes. The time axis is meant to be shared by all sub-plots. If you need different time axes then you'll need to `build()` multiple charts and lay those out as desired in your app. - -Currently also only supports lines, stock market OHLC candlestick charts, and stock market volume bar charts. - -In the future, more parameterization may be added like specifying background and axis colors, or even the actual series renderer objects themselves to fully leverage what [jfreechart](https://github.com/jfree/jfreechart) provides. - ## Thread-safety and garbage collection -No thread-safety measures are deliberately taken. If you require thread-safety then either provide deep copies of parameter objects or or synchronize access to builders and data vs. what your app is doing. +No thread-safety measures are deliberately taken. If you require thread-safety then provide deep copies of objects, don't share builders, don't share charts, or add synchronization to your business logic. Generally, primitive data arrays are copied into **jfreechart** objects. **jfreechart-builder** will maintain references to other objects passed-in like strings, colors, and drawing strokes. When the builders and charts they produce go out of scope, the objects you provided (and other objects that may be referencing them) should be garbage collected as applicable. @@ -102,16 +136,16 @@ the objects you provided (and other objects that may be referencing them) should ## Versioning -The major and minor numbers are the same as the **jfreechart** major and minor used. This is to indicate general compatibility. The incremental ("patch") number is the version of this module. +The major and minor numbers are the same as the **jfreechart** major and minor to denote what version is compatible. The incremental ("patch") number is the monolithic version number of **jfreechart-builder**. ## License **jfreechart-builder** is not affiliated with the **jfreechart** project but for compatibility is provided under the terms of the same [LGPL 2.1 license](./license-LGPL.txt). -You should be aware of the contents of the **jfreechart-builder** JAR file built form this project. +You should be aware of the contents of the **jfreechart-builder** JAR file built from this project. -It's understood it will contain the compiled `.class` files of only **jfreechart-builder** and should not incorporate any from **jfreechart**, however you must verify its contents to know what your build tools are actually producing. +It should contain the compiled `.class` files only of **jfreechart-builder** and should not incorporate any from **jfreechart**, however you must verify its contents to know what the build tools are actually producing. If you need clarification on the LGPL vs. Java, please see the [FSF's tech note about it](https://www.gnu.org/licenses/lgpl-java.html). @@ -126,16 +160,18 @@ If you need clarification on the LGPL vs. Java, please see the [FSF's tech note ### Installing source code -`git clone` this repo locally. +``` +git clone +``` ### Building and installing the JAR ``` cd path/to/the/cloned/repo -``` -Next, use `git` to checkout the desired branch or tag. +git checkout +``` If you want to simply build the jar and figure out what to do with it next ... @@ -168,4 +204,4 @@ Add this dependency to your project's `.pom` file: ## Contributing -Contributions are welcome. The project maintainers' time permitting, merge/pull requests will be reviewed. If accepted they will be merged. No guarantees are made that requests will be reviewed or merged. +Contributions are welcome and will be accepted as the maintainers' time permits. diff --git a/screenshots/simple-time-series-with-annotations.png b/screenshots/simple-time-series-with-annotations.png new file mode 100644 index 0000000000000000000000000000000000000000..b601b121f14f90935d5d12be20e817036ca1323f GIT binary patch literal 24874 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 literal 0 HcmV?d00001 diff --git a/screenshots/stock-chart-time-series-weekend-gaps.png b/screenshots/stock-chart-time-series-weekend-gaps.png index ddbb00478062f15bcc45a7084ebacc1951ea85aa..fced1b949e88b2a064a22c654dac13997e1c435b 100644 GIT binary patch literal 74507 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 literal 80835 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

sGuXn_OX&@%O?;Hi2|iL?H= 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 MrKYc1sbU-Qe|H7CKL7v# diff --git a/src/main/java/com/jfcbuilder/builders/IXYAnnotationBuilder.java b/src/main/java/com/jfcbuilder/builders/IXYAnnotationBuilder.java new file mode 100644 index 0000000..e17a363 --- /dev/null +++ b/src/main/java/com/jfcbuilder/builders/IXYAnnotationBuilder.java @@ -0,0 +1,107 @@ +/* + * jfreechart-builder: a builder pattern module for working with the jfreechart library + * + * (C) Copyright 2020, by Matt E. + * + * 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 + */ + +package com.jfcbuilder.builders; + +import java.awt.Color; + +import org.jfree.chart.annotations.XYAnnotation; +import org.jfree.chart.ui.TextAnchor; + +/** + * Interface for all XYAnnotation builders. + */ +public interface IXYAnnotationBuilder> { + + /** + * Sets the color used to draw the annotation. + * + * @param color The color to be used when drawing the annotation + * @return Reference to this builder for chaining method calls + */ + T color(Color color); + + /** + * Sets the alignment of the annotation relative to the XY anchor point. + * + * @param alignment The TextAnchor specifying the alignment + * @return Reference to this builder for chaining method calls + */ + T textAlign(TextAnchor alignment); + + /** + * Sets the annotation text to be drawn + * + * @param text The text to be drawn + * @return Reference to this builder for chaining method calls + */ + T text(String text); + + /** + * Pads the right side of the text with a number of spaces. Use this to offset the text a desired + * distance from the anchored XY coordinate. + * + * @param n Number of space characters to insert at right of text + * @return Reference to this builder instance for method chaining + */ + T textPaddingRight(int n); + + /** + * Pads the left side of the text with a number of spaces. Use this to offset the text a desired + * distance from the anchored XY coordinate. + * + * @param n Number of space characters to insert at left of text + * @return Reference to this builder instance for method chaining + */ + T textPaddingLeft(int n); + + /** + * Sets the rotational orientation angle of the annotation in degrees. + * + * @param degrees The rotation angle of the annotation + * @return Reference to this builder for chaining method calls + */ + T angle(double degrees); + + /** + * Sets the x-coordinate of the annotation. + * + * @param x The x-coordinate + * @return Reference to this builder for chaining method calls + */ + T x(double x); + + /** + * Sets the y-coordinate of the annotation. + * + * @param y The y-coordinate + * @return Reference to this builder for chaining method calls + */ + T y(double y); + + /** + * Builds the XYAnnotation from all configured data and properties. + * + * @return New instance of an XYAnnotation corresponding to all configured data and properties. + * @throws IllegalStateException If the builder is missing properties when {@code build()} is + * called. + */ + XYAnnotation build() throws IllegalStateException; +} diff --git a/src/main/java/com/jfcbuilder/builders/IXYPlotBuilder.java b/src/main/java/com/jfcbuilder/builders/IXYPlotBuilder.java index d798068..fb90caf 100644 --- a/src/main/java/com/jfcbuilder/builders/IXYPlotBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/IXYPlotBuilder.java @@ -90,6 +90,15 @@ public interface IXYPlotBuilder> { */ T line(LineBuilder line); + /** + * Registers an IXYAnnotationBuilder whose {@code build()} method will be called to generate its + * XYAnnotation when this plot builder's {@code build()} method is called. + * + * @param annotation The annotation builder representing the annotation that it will build + * @return Reference to this builder instance for method chaining + */ + T annotation(IXYAnnotationBuilder annotation); + /** * Sets the plot weight to be attributed to the plot. A default of 1 will be used if this is not * set. @@ -142,4 +151,5 @@ public interface IXYPlotBuilder> { * data was not set. */ XYPlot build() throws IllegalStateException; -} \ No newline at end of file + +} diff --git a/src/main/java/com/jfcbuilder/builders/OhlcPlotBuilder.java b/src/main/java/com/jfcbuilder/builders/OhlcPlotBuilder.java index 48dac12..d44ae37 100644 --- a/src/main/java/com/jfcbuilder/builders/OhlcPlotBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/OhlcPlotBuilder.java @@ -25,6 +25,7 @@ import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.ValueAxis; +import org.jfree.chart.plot.ValueMarker; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.CandlestickRenderer; import org.jfree.chart.renderer.xy.StandardXYItemRenderer; @@ -34,6 +35,7 @@ import com.jfcbuilder.builders.renderers.CandlestickRendererBuilder; import com.jfcbuilder.builders.types.BuilderConstants; +import com.jfcbuilder.builders.types.Orientation; import com.jfcbuilder.builders.types.ZeroBasedIndexRange; /** @@ -123,6 +125,12 @@ public OhlcPlotBuilder line(LineBuilder line) { return this; } + @Override + public OhlcPlotBuilder annotation(IXYAnnotationBuilder annotation) { + elements.annotation(annotation); + return this; + } + @Override public OhlcPlotBuilder plotWeight(int weight) { elements.plotWeight(weight); @@ -224,6 +232,21 @@ public XYPlot build() throws IllegalStateException { } } + for (LineBuilder builder : elements.unmodifiableLines()) { + ValueMarker line = builder.build(); + + if (builder.orientation() == Orientation.HORIZONTAL) { + plot.addRangeMarker(line); + } else { + plot.addDomainMarker(line); + } + } + + for (IXYAnnotationBuilder builder : elements.unmodifiableAnnotations()) { + // Annotations don't have ability to get their max/min y-value to adjust y-axis range :( + plot.addAnnotation(builder.build()); + } + yAxis.setLabel(elements.yAxisName() + axisSubName.toString()); final int seriesIndex = plot.getSeriesCount(); diff --git a/src/main/java/com/jfcbuilder/builders/VolumeXYPlotBuilder.java b/src/main/java/com/jfcbuilder/builders/VolumeXYPlotBuilder.java index 645267f..a136c33 100644 --- a/src/main/java/com/jfcbuilder/builders/VolumeXYPlotBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/VolumeXYPlotBuilder.java @@ -21,7 +21,6 @@ package com.jfcbuilder.builders; import java.awt.Color; -import java.util.List; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.NumberTickUnit; @@ -181,6 +180,12 @@ public VolumeXYPlotBuilder line(LineBuilder line) { return this; } + @Override + public VolumeXYPlotBuilder annotation(IXYAnnotationBuilder annotation) { + elements.annotation(annotation); + return this; + } + @Override public VolumeXYPlotBuilder plotWeight(int weight) { elements.plotWeight(weight); @@ -216,8 +221,6 @@ public XYPlot build() throws IllegalStateException { elements.checkBuildPreconditions(); - final List> seriesBuilders = elements.unmodifiableSeries(); - final List lineBuilders = elements.unmodifiableLines(); final ValueAxis xAxis = elements.xAxis(); final long[] timeData = elements.timeData(); @@ -231,7 +234,7 @@ public XYPlot build() throws IllegalStateException { final ZeroBasedIndexRange indexRange = elements.indexRange(); - for (IXYTimeSeriesBuilder builder : seriesBuilders) { + for (IXYTimeSeriesBuilder builder : elements.unmodifiableSeries()) { builder.indexRange(indexRange); builder.timeData(timeData); @@ -257,19 +260,6 @@ public XYPlot build() throws IllegalStateException { final XYPlot plot = new XYPlot(xyCollection, xAxis, yAxis, stdXRenderer); - for (LineBuilder line : lineBuilders) { - ValueMarker marker = line.build(); - - if (line.orientation() == Orientation.HORIZONTAL) { - yMax = Math.max(yMax, marker.getValue()); - yMin = Math.min(yMin, marker.getValue()); - plot.addRangeMarker(marker); - } else { - // Vertical lines have infinite y-value so don't count them in y-min/max - plot.addDomainMarker(marker); - } - } - if (uniformVolSeriesBuilder != null) { uniformVolSeriesBuilder.indexRange(indexRange); @@ -332,6 +322,24 @@ public XYPlot build() throws IllegalStateException { } + for (LineBuilder line : elements.unmodifiableLines()) { + ValueMarker marker = line.build(); + + if (line.orientation() == Orientation.HORIZONTAL) { + yMax = Math.max(yMax, marker.getValue()); + yMin = Math.min(yMin, marker.getValue()); + plot.addRangeMarker(marker); + } else { + // Vertical lines have infinite y-value so don't count them in y-min/max + plot.addDomainMarker(marker); + } + } + + for (IXYAnnotationBuilder builder : elements.unmodifiableAnnotations()) { + // Annotations don't have ability to get their max/min y-value to adjust y-axis range :( + plot.addAnnotation(builder.build()); + } + yAxis.setMinorTickMarksVisible(true); yAxis.setMinorTickCount(2); yAxis.setMinorTickMarkOutsideLength(2); diff --git a/src/main/java/com/jfcbuilder/builders/XYAnnotationElements.java b/src/main/java/com/jfcbuilder/builders/XYAnnotationElements.java new file mode 100644 index 0000000..7028600 --- /dev/null +++ b/src/main/java/com/jfcbuilder/builders/XYAnnotationElements.java @@ -0,0 +1,249 @@ +/* + * jfreechart-builder: a builder pattern module for working with the jfreechart library + * + * (C) Copyright 2020, by Matt E. + * + * 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 + */ + +package com.jfcbuilder.builders; + +import java.awt.Color; +import java.util.Collections; + +import org.jfree.chart.ui.TextAnchor; + +import com.jfcbuilder.builders.types.BuilderConstants; + +/** + * Helper class for storing and accessing properties common to different kinds of XYAnnotation + * builders. Intended for use in composition-type implementations. + */ +public class XYAnnotationElements { + + private static final String DEFAULT_TEXT = ""; + private static final int DEFAULT_TEXT_PADDING = 0; + protected static final double DEFAULT_ANGLE = 0.0; + protected static final TextAnchor DEFAULT_TEXT_ALIGNMENT = TextAnchor.BASELINE_RIGHT; + + protected double x; + protected double y; + protected double angle; + protected String text; + private int textPaddingLeft; + private int textPaddingRight; + protected TextAnchor textAlign; + protected Color color; + + /** + * Constructor. + */ + public XYAnnotationElements() { + x = Double.NaN; + y = Double.NaN; + angle = DEFAULT_ANGLE; + text = DEFAULT_TEXT; + textPaddingLeft = DEFAULT_TEXT_PADDING; + textPaddingRight = DEFAULT_TEXT_PADDING; + textAlign = DEFAULT_TEXT_ALIGNMENT; + color = BuilderConstants.DEFAULT_LINE_COLOR; + } + + /** + * Sets the x-coordinate of the annotation. + * + * @param x The x-coordinate + */ + public void x(double x) { + this.x = x; + } + + /** + * Gets the x-coordinate of the annotation. + * + * @return The x-coordinate + */ + public double x() { + return x; + } + + /** + * Sets the y-coordinate of the annotation. + * + * @param y The y-coordinate + */ + public void y(double y) { + this.y = y; + } + + /** + * Gets the y-coordinate of the annotation. + * + * @return The y-coordinate + */ + public double y() { + return y; + } + + /** + * Sets the angular orientation of the annotation in degrees. + * + * @param degrees The annotation orientation angle + */ + public void angle(double degrees) { + angle = Double.isNaN(degrees) ? DEFAULT_ANGLE : degrees; + } + + /** + * Gets the angular orientation of the annotation in degrees. + * + * @return The annotation orientation angle + */ + public double angle() { + return angle; + } + + /** + * Sets the annotation text. + * + * @param text The text to be set + */ + public void text(String text) { + this.text = text == null ? DEFAULT_TEXT : text; + } + + /** + * Gets the annotation text. + * + * @return The annotation's text + */ + public String text() { + return text; + } + + /** + * Gets the number of padding spaces to left side of the text. + * + * @return The number of left side padding spaces + */ + public void textPaddingLeft(int n) { + textPaddingLeft = (n < 0) ? 0 : n; + } + + /** + * Sets the number of padding spaces to left side of the text. Use this to offset the text a + * desired distance from the anchored XY coordinate. + * + * @param n Number of space characters to insert at left of text + */ + public int textPaddingLeft() { + return textPaddingLeft; + } + + /** + * Sets the number of padding spaces to right side of the text. Use this to offset the text a + * desired distance from the anchored XY coordinate. + * + * @param n Number of space characters to insert at right of text + */ + public void textPaddingRight(int n) { + textPaddingRight = (n < 0) ? 0 : n; + } + + /** + * Gets the number of padding spaces to right side of the text. + * + * @return The number of right side padding spaces + */ + public int textPaddingRight() { + return textPaddingRight; + } + + /** + * Sets the annotation's text alignment relative to the anchored XY coordinate. + * + * @param alignment The annotation's text alignment + */ + public void textAlign(TextAnchor alignment) { + this.textAlign = alignment == null ? DEFAULT_TEXT_ALIGNMENT : alignment; + } + + /** + * Gets the annotation's text alignment relative to the anchored XY coordinate. + * + * @return The annotation's text alignment + */ + public TextAnchor textAlignment() { + return textAlign; + } + + /** + * Sets the annotation's color. + * + * @param color The color to be set + */ + public void color(Color color) { + this.color = color == null ? BuilderConstants.DEFAULT_LINE_COLOR : color; + } + + /** + * Gets the color of the annotation + * + * @return The annotation's color + */ + public Color color() { + return color; + } + + /** + * Checks to see if all preconditions for building the annotation are satisfied and throws an + * exception if not. + * + * @throws IllegalStateException If x or y have not been configured. + */ + public void checkBuildPreconditions() throws IllegalStateException { + + if (Double.isNaN(x) || Double.isNaN(y)) { + throw new IllegalStateException("X or Y value not set"); + } + } + + /** + * Helper method to build the left/right padded text to be displayed. + * + * @return The text including the configured left and right padding spaces + */ + public String paddedText() { + + // TODO: Can this be made more efficient? Strings.repeat() below may use a new StringBuilder + // each call. Strings are also accumulated with += .. would StringBuilder be better for such + // a low number of +=? How does this fare for huge numbers of annotations and/or charts + // being generated in bulk? + + String label = ""; + + if (textPaddingLeft > 0) { + label += String.join("", Collections.nCopies(textPaddingLeft, " ")); + } + + label += text; + + if (textPaddingRight > 0) { + label += String.join("", Collections.nCopies(textPaddingRight, " ")); + } + return label; + } + +} \ No newline at end of file diff --git a/src/main/java/com/jfcbuilder/builders/XYArrowBuilder.java b/src/main/java/com/jfcbuilder/builders/XYArrowBuilder.java new file mode 100644 index 0000000..8ae2fd6 --- /dev/null +++ b/src/main/java/com/jfcbuilder/builders/XYArrowBuilder.java @@ -0,0 +1,128 @@ +/* + * jfreechart-builder: a builder pattern module for working with the jfreechart library + * + * (C) Copyright 2020, by Matt E. + * + * 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 + */ + +package com.jfcbuilder.builders; + +import java.awt.Color; + +import org.jfree.chart.annotations.XYAnnotation; +import org.jfree.chart.annotations.XYPointerAnnotation; +import org.jfree.chart.ui.TextAnchor; + +/** + * Builder for producing XYPointerAnnotation (arrow) annotations. + */ +public class XYArrowBuilder implements IXYAnnotationBuilder { + + /** + * radial length of the arrow. + */ + private static final double DEFAULT_ARROW_LENGTH = 20.0; + + /** + * Radial spacing the tip of the arrow will be away from the anchored XY coordinate. + */ + private static final double DEFAULT_XY_COORD_SPACING = 5.0; + + private XYAnnotationElements elems; + + /** + * Hidden constructor. + */ + private XYArrowBuilder() { + elems = new XYAnnotationElements(); + } + + /** + * Factory method for obtaining new instances of this class. + * + * @return New instance of this class + */ + public static XYArrowBuilder instance() { + return new XYArrowBuilder(); + } + + @Override + public XYArrowBuilder x(double x) { + elems.x(x); + return this; + } + + @Override + public XYArrowBuilder y(double y) { + elems.y(y); + return this; + } + + @Override + public XYArrowBuilder angle(double degrees) { + elems.angle(degrees); + return this; + } + + @Override + public XYArrowBuilder text(String text) { + elems.text(text); + return this; + } + + @Override + public XYArrowBuilder textPaddingLeft(int n) { + elems.textPaddingLeft(n); + return this; + } + + @Override + public XYArrowBuilder textPaddingRight(int n) { + elems.textPaddingRight(n); + return this; + } + + @Override + public XYArrowBuilder textAlign(TextAnchor alignment) { + elems.textAlign(alignment); + return this; + } + + @Override + public XYArrowBuilder color(Color color) { + elems.color(color); + return this; + } + + private void checkBuildPreconditions() throws IllegalStateException { + elems.checkBuildPreconditions(); + } + + @Override + public XYAnnotation build() throws IllegalStateException { + + checkBuildPreconditions(); + + XYPointerAnnotation arrow = new XYPointerAnnotation(elems.paddedText(), elems.x(), elems.y(), + Math.toRadians(elems.angle())); + arrow.setTextAnchor(elems.textAlignment()); + arrow.setBaseRadius(DEFAULT_ARROW_LENGTH); + arrow.setTipRadius(DEFAULT_XY_COORD_SPACING); + arrow.setArrowPaint(elems.color()); + return arrow; + } + +} diff --git a/src/main/java/com/jfcbuilder/builders/XYPlotBuilder.java b/src/main/java/com/jfcbuilder/builders/XYPlotBuilder.java index a33d3a2..9bbd301 100644 --- a/src/main/java/com/jfcbuilder/builders/XYPlotBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/XYPlotBuilder.java @@ -20,8 +20,6 @@ package com.jfcbuilder.builders; -import java.util.List; - import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.NumberTickUnit; import org.jfree.chart.axis.ValueAxis; @@ -95,6 +93,12 @@ public XYPlotBuilder line(LineBuilder line) { return this; } + @Override + public XYPlotBuilder annotation(IXYAnnotationBuilder annotation) { + elements.annotation(annotation); + return this; + } + @Override public XYPlotBuilder plotWeight(int weight) { elements.plotWeight(weight); @@ -129,8 +133,6 @@ public XYPlot build() throws IllegalStateException { elements.checkBuildPreconditions(); - final List> seriesBuilders = elements.unmodifiableSeries(); - final List lineBuilders = elements.unmodifiableLines(); final ValueAxis xAxis = elements.xAxis(); final long[] timeData = elements.timeData(); @@ -144,7 +146,7 @@ public XYPlot build() throws IllegalStateException { final ZeroBasedIndexRange indexRange = elements.indexRange(); - for (IXYTimeSeriesBuilder builder : seriesBuilders) { + for (IXYTimeSeriesBuilder builder : elements.unmodifiableSeries()) { builder.indexRange(indexRange); builder.timeData(timeData); @@ -177,7 +179,7 @@ public XYPlot build() throws IllegalStateException { final XYPlot plot = new XYPlot(collection, xAxis, yAxis, renderer); - for (LineBuilder builder : lineBuilders) { + for (LineBuilder builder : elements.unmodifiableLines()) { ValueMarker line = builder.build(); yMax = Math.max(yMax, line.getValue()); @@ -190,6 +192,11 @@ public XYPlot build() throws IllegalStateException { } } + for (IXYAnnotationBuilder builder : elements.unmodifiableAnnotations()) { + // Annotations don't have ability to get their max/min y-value to adjust y-axis range :( + plot.addAnnotation(builder.build()); + } + if (elements.yAxisRange() != null) { yAxis.setRange(elements.yAxisRange()); } else { @@ -204,4 +211,5 @@ public XYPlot build() throws IllegalStateException { return plot; } + } diff --git a/src/main/java/com/jfcbuilder/builders/XYTextBuilder.java b/src/main/java/com/jfcbuilder/builders/XYTextBuilder.java new file mode 100644 index 0000000..ffda593 --- /dev/null +++ b/src/main/java/com/jfcbuilder/builders/XYTextBuilder.java @@ -0,0 +1,116 @@ +/* + * jfreechart-builder: a builder pattern module for working with the jfreechart library + * + * (C) Copyright 2020, by Matt E. + * + * 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 + */ + +package com.jfcbuilder.builders; + +import java.awt.Color; + +import org.jfree.chart.annotations.XYAnnotation; +import org.jfree.chart.annotations.XYTextAnnotation; +import org.jfree.chart.ui.TextAnchor; + +/** + * Builder for producing XYTextAnnotation instances. + */ +public class XYTextBuilder implements IXYAnnotationBuilder { + + private XYAnnotationElements elems; + + /** + * Hidden constructor. + */ + private XYTextBuilder() { + elems = new XYAnnotationElements(); + } + + /** + * Factory method for obtaining new instances of this class. + * + * @return New instance of this class + */ + public static XYTextBuilder instance() { + return new XYTextBuilder(); + } + + @Override + public XYTextBuilder x(double x) { + elems.x(x); + return this; + } + + @Override + public XYTextBuilder y(double y) { + elems.y(y); + return this; + } + + @Override + public XYTextBuilder angle(double degrees) { + elems.angle(degrees); + return this; + } + + @Override + public XYTextBuilder text(String text) { + elems.text(text); + return this; + } + + @Override + public XYTextBuilder textAlign(TextAnchor alignment) { + elems.textAlign(alignment); + return this; + } + + @Override + public XYTextBuilder color(Color color) { + elems.color(color); + return this; + } + + @Override + public XYTextBuilder textPaddingLeft(int n) { + elems.textPaddingLeft(n); + return this; + } + + @Override + public XYTextBuilder textPaddingRight(int n) { + elems.textPaddingRight(n); + return this; + } + + private void checkBuildPreconditions() throws IllegalStateException { + elems.checkBuildPreconditions(); + } + + @Override + public XYAnnotation build() throws IllegalStateException { + + checkBuildPreconditions(); + + XYTextAnnotation txt = new XYTextAnnotation(elems.paddedText(), elems.x(), elems.y()); + txt.setTextAnchor(elems.textAlignment()); + txt.setRotationAngle(Math.toRadians(elems.angle())); + txt.setPaint(elems.color()); + return txt; + } + +} diff --git a/src/main/java/com/jfcbuilder/builders/XYTimeSeriesPlotBuilderElements.java b/src/main/java/com/jfcbuilder/builders/XYTimeSeriesPlotBuilderElements.java index 86e5ee0..00c3128 100644 --- a/src/main/java/com/jfcbuilder/builders/XYTimeSeriesPlotBuilderElements.java +++ b/src/main/java/com/jfcbuilder/builders/XYTimeSeriesPlotBuilderElements.java @@ -48,6 +48,7 @@ public class XYTimeSeriesPlotBuilderElements { private List> seriesBuilders; private List> datasetBuilders; private List lineBuilders; + private List> annotationBuilders; private ValueAxis xAxis; private long[] timeData; private ZeroBasedIndexRange indexRange; @@ -63,6 +64,7 @@ public XYTimeSeriesPlotBuilderElements() { seriesBuilders = new ArrayList<>(); datasetBuilders = new ArrayList<>(); lineBuilders = new ArrayList<>(); + annotationBuilders = new ArrayList<>(); xAxis = null; timeData = null; indexRange = null; @@ -108,7 +110,7 @@ public void xAxis(ValueAxis xAxis) { public ValueAxis xAxis() { return xAxis; } - + /** * Sets the time data to be used with all data series. Values should be in ascending order and * representing milliseconds since the epoch start. @@ -189,6 +191,26 @@ public List unmodifiableLines() { return Collections.unmodifiableList(lineBuilders); } + /** + * Registers an IXYAnnotationBuilder to be used for building the plot. + * + * @param annotation The builder to be registered + */ + public void annotation(IXYAnnotationBuilder annotation) { + if (annotation != null) { + annotationBuilders.add(annotation); + } + } + + /** + * Gets an unmodifiable list of the annotation builders to be used for building the plot. + * + * @return The unmodifiable list of annotation builders + */ + public List> unmodifiableAnnotations() { + return Collections.unmodifiableList(annotationBuilders); + } + /** * Sets the layout weight to be used when rendering the plot. * From c5cd178177ff98180f7d1f1fc05b9e4b1c96377f Mon Sep 17 00:00:00 2001 From: Matt E Date: Sun, 29 Nov 2020 01:44:11 -0500 Subject: [PATCH 2/6] Shorten method calls and update documentation --- LICENSE | 2 +- README.md | 82 +++++++++---------- pom.xml | 4 +- .../com/jfcbuilder/builders/ChartBuilder.java | 8 +- .../builders/ITimeSeriesBuilder.java | 2 +- .../builders/IXYAnnotationBuilder.java | 6 +- .../builders/IXYDatasetBuilder.java | 10 +-- .../jfcbuilder/builders/IXYPlotBuilder.java | 4 +- .../builders/IXYTimeSeriesBuilder.java | 2 +- .../com/jfcbuilder/builders/LineBuilder.java | 26 +++++- .../jfcbuilder/builders/OhlcPlotBuilder.java | 8 +- .../builders/OhlcSeriesBuilder.java | 4 +- .../builders/VolumeXYPlotBuilder.java | 6 +- .../builders/VolumeXYTimeSeriesBuilder.java | 4 +- .../builders/XYAnnotationElements.java | 2 +- .../jfcbuilder/builders/XYArrowBuilder.java | 4 +- .../jfcbuilder/builders/XYPlotBuilder.java | 4 +- .../jfcbuilder/builders/XYTextBuilder.java | 4 +- .../builders/XYTimeSeriesBuilder.java | 4 +- .../builders/XYTimeSeriesElements.java | 2 +- .../XYTimeSeriesPlotBuilderElements.java | 2 +- .../renderers/CandlestickRendererBuilder.java | 4 +- .../renderers/XYBarRendererBuilder.java | 4 +- .../builders/types/BuilderConstants.java | 2 +- .../builders/types/DohlcvSeries.java | 2 +- .../builders/types/OhlcvSeries.java | 2 +- .../builders/types/Orientation.java | 2 +- .../builders/types/ZeroBasedIndexRange.java | 10 +-- 28 files changed, 118 insertions(+), 98 deletions(-) diff --git a/LICENSE b/LICENSE index 3f471b9..1df667b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ jfreechart-builder: a builder pattern module for working with the jfreechart library -(C) Copyright 2020, by Matt E. +(C) Copyright 2020, by Matt E. and project contributors This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/README.md b/README.md index 0dfddc5..9063385 100644 --- a/README.md +++ b/README.md @@ -24,14 +24,14 @@ In the future, more parameterization may be added like specifying background and Code like this: ``` -ChartBuilder.instance() +ChartBuilder.get() .title("Simple Time Series With Annotations") .timeData(timeArray) - .xyPlot(XYPlotBuilder.instance() - .series(XYTimeSeriesBuilder.instance().name("Amplitude").data(array1).color(Color.BLUE).style(SOLID_LINE)) - .annotation(XYArrowBuilder.instance().x(arrowX).y(arrowY).angle(180.0).color(Color.RED).text(arrowTxt)) - .annotation(XYArrowBuilder.instance().x(arrowX).y(arrowY).angle(0.0).color(Color.RED)) - .annotation(XYTextBuilder.instance().x(arrowX).y(arrowY).color(DARK_GREEN) + .xyPlot(XYPlotBuilder.get() + .series(XYTimeSeriesBuilder.get().name("Amplitude").data(array1).color(Color.BLUE).style(SOLID_LINE)) + .annotation(XYArrowBuilder.get().x(arrowX).y(arrowY).angle(180.0).color(Color.RED).text(arrowTxt)) + .annotation(XYArrowBuilder.get().x(arrowX).y(arrowY).angle(0.0).color(Color.RED)) + .annotation(XYTextBuilder.get().x(arrowX).y(arrowY).color(DARK_GREEN) .text("This value!").textPaddingLeft(5).textAlign(TextAnchor.BASELINE_LEFT).angle(90.0))) .build() ``` @@ -47,30 +47,30 @@ public static final Stroke SOLID = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, B private static final Color DARK_GREEN = new Color(0, 150, 0); -ChartBuilder.instance() +ChartBuilder.get() .title("Multi Plot Minute Time Series") .timeData(timeArray) - .xyPlot(XYPlotBuilder.instance().yAxisName("Values") - .series(XYTimeSeriesBuilder.instance().data(array1).color(Color.BLUE).style(SOLID)) - .series(XYTimeSeriesBuilder.instance().data(array2).color(Color.RED).style(SOLID)) - .series(XYTimeSeriesBuilder.instance().data(array3).color(DARK_GREEN).style(SOLID)) - .series(XYTimeSeriesBuilder.instance().data(array4).color(Color.MAGENTA).style(SOLID))) + .xyPlot(XYPlotBuilder.get().yAxisName("Values") + .series(XYTimeSeriesBuilder.get().data(array1).color(Color.BLUE).style(SOLID)) + .series(XYTimeSeriesBuilder.get().data(array2).color(Color.RED).style(SOLID)) + .series(XYTimeSeriesBuilder.get().data(array3).color(DARK_GREEN).style(SOLID)) + .series(XYTimeSeriesBuilder.get().data(array4).color(Color.MAGENTA).style(SOLID))) - .xyPlot(XYPlotBuilder.instance().yAxisName("Amplitudes") - .series(XYTimeSeriesBuilder.instance().data(array2).color(Color.GRAY).style(SOLID)) - .series(XYTimeSeriesBuilder.instance().data(array3).color(Color.LIGHT_GRAY).style(SOLID))) + .xyPlot(XYPlotBuilder.get().yAxisName("Amplitudes") + .series(XYTimeSeriesBuilder.get().data(array2).color(Color.GRAY).style(SOLID)) + .series(XYTimeSeriesBuilder.get().data(array3).color(Color.LIGHT_GRAY).style(SOLID))) - .xyPlot(XYPlotBuilder.instance().yAxisName("Series 1") - .series(XYTimeSeriesBuilder.instance().data(array1).color(Color.BLUE).style(SOLID))) + .xyPlot(XYPlotBuilder.get().yAxisName("Series 1") + .series(XYTimeSeriesBuilder.get().data(array1).color(Color.BLUE).style(SOLID))) - .xyPlot(XYPlotBuilder.instance().yAxisName("Series 2") - .series(XYTimeSeriesBuilder.instance().data(array2).color(Color.RED).style(SOLID))) + .xyPlot(XYPlotBuilder.get().yAxisName("Series 2") + .series(XYTimeSeriesBuilder.get().data(array2).color(Color.RED).style(SOLID))) - .xyPlot(XYPlotBuilder.instance().yAxisName("Series 3") - .series(XYTimeSeriesBuilder.instance().data(array3).color(DARK_GREEN).style(SOLID))) + .xyPlot(XYPlotBuilder.get().yAxisName("Series 3") + .series(XYTimeSeriesBuilder.get().data(array3).color(DARK_GREEN).style(SOLID))) .build() ``` @@ -82,36 +82,36 @@ Produces a chart like this: Stock chart code and data like this: ``` -ChartBuilder.instance() +ChartBuilder.get() .title("Stock Chart Time Series With Weekend Gaps, Lines, and Annotations") .timeData(timeArray) - .xyPlot(OhlcPlotBuilder.instance().yAxisName("Price").plotWeight(3) - .series(OhlcSeriesBuilder.instance().ohlcv(dohlcv).upColor(Color.WHITE).downColor(Color.RED)) - .series(XYTimeSeriesBuilder.instance().name("MA(20)").data(sma20).color(Color.MAGENTA).style(SOLID_LINE)) - .series(XYTimeSeriesBuilder.instance().name("MA(50)").data(sma50).color(Color.BLUE).style(SOLID_LINE)) - .series(XYTimeSeriesBuilder.instance().name("MA(200)").data(sma200).color(Color.RED).style(SOLID_LINE)) - .annotation(XYArrowBuilder.instance().x(stockEventDate).y(stockEventPrice).angle(270.0).color(DARK_GREEN) + .xyPlot(OhlcPlotBuilder.get().yAxisName("Price").plotWeight(3) + .series(OhlcSeriesBuilder.get().ohlcv(dohlcv).upColor(Color.WHITE).downColor(Color.RED)) + .series(XYTimeSeriesBuilder.get().name("MA(20)").data(sma20).color(Color.MAGENTA).style(SOLID_LINE)) + .series(XYTimeSeriesBuilder.get().name("MA(50)").data(sma50).color(Color.BLUE).style(SOLID_LINE)) + .series(XYTimeSeriesBuilder.get().name("MA(200)").data(sma200).color(Color.RED).style(SOLID_LINE)) + .annotation(XYArrowBuilder.get().x(stockEventDate).y(stockEventPrice).angle(270.0).color(DARK_GREEN) .textAlign(TextAnchor.BOTTOM_CENTER).text(String.format("%.2f", stockEventPrice))) - .line(LineBuilder.instance().orientation(Orientation.HORIZONTAL).atValue(resistanceLevel) + .line(LineBuilder.get().horizontal().at(resistanceLevel) .color(Color.LIGHT_GRAY).style(SOLID_LINE))) - .xyPlot(VolumeXYPlotBuilder.instance().yAxisName("Volume").plotWeight(1) - .series(VolumeXYTimeSeriesBuilder.instance().ohlcv(dohlcv).closeUpSeries().color(Color.WHITE)) - .series(VolumeXYTimeSeriesBuilder.instance().ohlcv(dohlcv).closeDownSeries().color(Color.RED)) - .series(XYTimeSeriesBuilder.instance().name("MA(90)").data(volSma90).color(Color.BLUE).style(SOLID_LINE)) - .annotation(XYArrowBuilder.instance().x(stockEventDate).y(stockEventVolume).angle(270.0).color(DARK_GREEN) + .xyPlot(VolumeXYPlotBuilder.get().yAxisName("Volume").plotWeight(1) + .series(VolumeXYTimeSeriesBuilder.get().ohlcv(dohlcv).closeUpSeries().color(Color.WHITE)) + .series(VolumeXYTimeSeriesBuilder.get().ohlcv(dohlcv).closeDownSeries().color(Color.RED)) + .series(XYTimeSeriesBuilder.get().name("MA(90)").data(volSma90).color(Color.BLUE).style(SOLID_LINE)) + .annotation(XYArrowBuilder.get().x(stockEventDate).y(stockEventVolume).angle(270.0).color(DARK_GREEN) .textAlign(TextAnchor.BOTTOM_CENTER).text(String.format("%.0f", stockEventVolume))) - .line(LineBuilder.instance().orientation(Orientation.HORIZONTAL).atValue(volumeLine) + .line(LineBuilder.get().horizontal().at(volumeLine) .color(DARK_GREEN).style(SOLID_LINE))) - .xyPlot(XYPlotBuilder.instance().yAxisName("Stoch").yAxisRange(0.0, 100.0).yAxisTickSize(50.0).plotWeight(1) - .series(XYTimeSeriesBuilder.instance().name("K(" + K + ")").data(stoch.getPctK()).color(Color.RED).style(SOLID_LINE)) - .series(XYTimeSeriesBuilder.instance().name("D(" + D + ")").data(stoch.getPctD()).color(Color.BLUE).style(SOLID_LINE)) - .line(LineBuilder.instance().orientation(Orientation.HORIZONTAL).atValue(80.0).color(Color.BLACK).style(SOLID_LINE)) - .line(LineBuilder.instance().orientation(Orientation.HORIZONTAL).atValue(50.0).color(Color.BLUE).style(SOLID_LINE)) - .line(LineBuilder.instance().orientation(Orientation.HORIZONTAL).atValue(20.0).color(Color.BLACK).style(SOLID_LINE))) + .xyPlot(XYPlotBuilder.get().yAxisName("Stoch").yAxisRange(0.0, 100.0).yAxisTickSize(50.0).plotWeight(1) + .series(XYTimeSeriesBuilder.get().name("K(" + K + ")").data(stoch.getPctK()).color(Color.RED).style(SOLID_LINE)) + .series(XYTimeSeriesBuilder.get().name("D(" + D + ")").data(stoch.getPctD()).color(Color.BLUE).style(SOLID_LINE)) + .line(LineBuilder.get().horizontal().at(80.0).color(Color.BLACK).style(SOLID_LINE)) + .line(LineBuilder.get().horizontal().at(50.0).color(Color.BLUE).style(SOLID_LINE)) + .line(LineBuilder.get().horizontal().at(20.0).color(Color.BLACK).style(SOLID_LINE))) .build() ``` diff --git a/pom.xml b/pom.xml index 3caab75..4735ee8 100644 --- a/pom.xml +++ b/pom.xml @@ -15,8 +15,8 @@ - GNU Lesser General Public Licence 3 - http://www.gnu.org/licenses/lgpl-3.0.txt + GNU Lesser General Public Licence 2.1 + http://www.gnu.org/licenses/lgpl-2.1.txt repo, manual diff --git a/src/main/java/com/jfcbuilder/builders/ChartBuilder.java b/src/main/java/com/jfcbuilder/builders/ChartBuilder.java index ede456a..c2d4cdf 100644 --- a/src/main/java/com/jfcbuilder/builders/ChartBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/ChartBuilder.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -70,7 +70,7 @@ private ChartBuilder() { * * @return New instance of this class */ - public static ChartBuilder instance() { + public static ChartBuilder get() { return new ChartBuilder(); } @@ -146,8 +146,8 @@ private void checkBuildPreconditions() throws IllegalStateException { /** * Builds the JFreeChart using all configured settings. * - * @return New instance of a JFreeChart corresponding to all configured data sets and settings. - * @throws IllegalStateException If time data to be shared by all plots was not set. + * @return New instance of a JFreeChart corresponding to all configured data sets and settings + * @throws IllegalStateException If time data to be shared by all plots was not set */ public JFreeChart build() { diff --git a/src/main/java/com/jfcbuilder/builders/ITimeSeriesBuilder.java b/src/main/java/com/jfcbuilder/builders/ITimeSeriesBuilder.java index 75c60e7..a8b9505 100644 --- a/src/main/java/com/jfcbuilder/builders/ITimeSeriesBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/ITimeSeriesBuilder.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/com/jfcbuilder/builders/IXYAnnotationBuilder.java b/src/main/java/com/jfcbuilder/builders/IXYAnnotationBuilder.java index e17a363..9d239a6 100644 --- a/src/main/java/com/jfcbuilder/builders/IXYAnnotationBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/IXYAnnotationBuilder.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -99,9 +99,9 @@ public interface IXYAnnotationBuilder> { /** * Builds the XYAnnotation from all configured data and properties. * - * @return New instance of an XYAnnotation corresponding to all configured data and properties. + * @return New instance of an XYAnnotation corresponding to all configured data and properties * @throws IllegalStateException If the builder is missing properties when {@code build()} is - * called. + * called */ XYAnnotation build() throws IllegalStateException; } diff --git a/src/main/java/com/jfcbuilder/builders/IXYDatasetBuilder.java b/src/main/java/com/jfcbuilder/builders/IXYDatasetBuilder.java index 5e83ead..ac59585 100644 --- a/src/main/java/com/jfcbuilder/builders/IXYDatasetBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/IXYDatasetBuilder.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -41,16 +41,16 @@ public interface IXYDatasetBuilder> { * This is an optimization to allow clients to supply existing data without having to copy and/or * crop it to match the desired size in chart. * - * @param indexRange The index range to be set. - * @return Reference to this builder instance for method chaining. + * @param indexRange The index range to be set + * @return Reference to this builder instance for method chaining */ T indexRange(ZeroBasedIndexRange indexRange); /** * Sets the time data to be used for generating the XYDataset. * - * @param timeData Ascending date-time values represented as milliseconds since the epoch start. - * @return Reference to this builder instance for method chaining. + * @param timeData Ascending date-time values represented as milliseconds since the epoch start + * @return Reference to this builder instance for method chaining */ T timeData(long[] timeData); diff --git a/src/main/java/com/jfcbuilder/builders/IXYPlotBuilder.java b/src/main/java/com/jfcbuilder/builders/IXYPlotBuilder.java index fb90caf..31e96cc 100644 --- a/src/main/java/com/jfcbuilder/builders/IXYPlotBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/IXYPlotBuilder.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -144,7 +144,7 @@ public interface IXYPlotBuilder> { /** * Builds the XYPlot from all configured data and properties. * - * @return New instance of an XYPlot corresponding to all configured data and properties. + * @return New instance of an XYPlot corresponding to all configured data and properties * @throws IllegalStateException If a XYTimeSeriesBuilder or LineBuilder are not configured, * possibly if at least one XYTimeSeriesBuilder or LineBuilder are not of a specifically * needed sub-type based on the implementation, if a time axis was not set, or if time diff --git a/src/main/java/com/jfcbuilder/builders/IXYTimeSeriesBuilder.java b/src/main/java/com/jfcbuilder/builders/IXYTimeSeriesBuilder.java index dd954ba..ac55da3 100644 --- a/src/main/java/com/jfcbuilder/builders/IXYTimeSeriesBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/IXYTimeSeriesBuilder.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/com/jfcbuilder/builders/LineBuilder.java b/src/main/java/com/jfcbuilder/builders/LineBuilder.java index 06036cd..f2e47ca 100644 --- a/src/main/java/com/jfcbuilder/builders/LineBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/LineBuilder.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -55,7 +55,7 @@ private LineBuilder() { * * @return New instance of this class */ - public static LineBuilder instance() { + public static LineBuilder get() { return new LineBuilder(); } @@ -70,6 +70,26 @@ public LineBuilder orientation(Orientation orientation) { return this; } + /** + * Sets the orientation of the line to horizontal. + * + * @return Reference to this builder for chaining method calls + */ + public LineBuilder horizontal() { + this.orientation = Orientation.HORIZONTAL; + return this; + } + + /** + * Sets the orientation of the line to vertical. + * + * @return Reference to this builder for chaining method calls + */ + public LineBuilder vertical() { + this.orientation = Orientation.VERTICAL; + return this; + } + /** * Gets the currently configured line orientation * @@ -85,7 +105,7 @@ public Orientation orientation() { * @param value The desired line value * @return Reference to this builder for chaining method calls */ - public LineBuilder atValue(double value) { + public LineBuilder at(double value) { this.value = value; return this; } diff --git a/src/main/java/com/jfcbuilder/builders/OhlcPlotBuilder.java b/src/main/java/com/jfcbuilder/builders/OhlcPlotBuilder.java index d44ae37..1159cb1 100644 --- a/src/main/java/com/jfcbuilder/builders/OhlcPlotBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/OhlcPlotBuilder.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -63,7 +63,7 @@ private OhlcPlotBuilder() { * * @return New instance of this class */ - public static OhlcPlotBuilder instance() { + public static OhlcPlotBuilder get() { return new OhlcPlotBuilder(); } @@ -175,7 +175,7 @@ private void checkBuildPreconditions() throws IllegalStateException { /** * Builds the DOHLC plot. The DOHLC series is shown behind all other series that were added. * - * @return New instance of an plot corresponding to all configured data sets and settings. + * @return New instance of an plot corresponding to all configured data sets and settings * @throws IllegalStateException If an OhlcSeriesBuilder, if time axis was not set, or if time * data was not set. */ @@ -285,7 +285,7 @@ private CandlestickRenderer getCandleRenderer() { Color downColor = (ohlcSeriesBuilder != null) ? ohlcSeriesBuilder.downColor() : BuilderConstants.DEFAULT_DOWN_COLOR; - return CandlestickRendererBuilder.instance().upColor(upColor).downColor(downColor).build(); + return CandlestickRendererBuilder.get().upColor(upColor).downColor(downColor).build(); } } diff --git a/src/main/java/com/jfcbuilder/builders/OhlcSeriesBuilder.java b/src/main/java/com/jfcbuilder/builders/OhlcSeriesBuilder.java index e68f5c7..5263882 100644 --- a/src/main/java/com/jfcbuilder/builders/OhlcSeriesBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/OhlcSeriesBuilder.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -62,7 +62,7 @@ private OhlcSeriesBuilder() { * * @return New instance of this class */ - public static OhlcSeriesBuilder instance() { + public static OhlcSeriesBuilder get() { return new OhlcSeriesBuilder(); } diff --git a/src/main/java/com/jfcbuilder/builders/VolumeXYPlotBuilder.java b/src/main/java/com/jfcbuilder/builders/VolumeXYPlotBuilder.java index a136c33..13f33ff 100644 --- a/src/main/java/com/jfcbuilder/builders/VolumeXYPlotBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/VolumeXYPlotBuilder.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -71,7 +71,7 @@ private VolumeXYPlotBuilder() { * * @return New instance of this class */ - public static VolumeXYPlotBuilder instance() { + public static VolumeXYPlotBuilder get() { return new VolumeXYPlotBuilder(); } @@ -363,7 +363,7 @@ public XYPlot build() throws IllegalStateException { } private XYBarRenderer createXYBarRenderer(Color fillColor, Color outlineColor) { - return XYBarRendererBuilder.instance().fillColor(fillColor).outlineColor(outlineColor).build(); + return XYBarRendererBuilder.get().fillColor(fillColor).outlineColor(outlineColor).build(); } } diff --git a/src/main/java/com/jfcbuilder/builders/VolumeXYTimeSeriesBuilder.java b/src/main/java/com/jfcbuilder/builders/VolumeXYTimeSeriesBuilder.java index 46137e5..5357453 100644 --- a/src/main/java/com/jfcbuilder/builders/VolumeXYTimeSeriesBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/VolumeXYTimeSeriesBuilder.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -96,7 +96,7 @@ private VolumeXYTimeSeriesBuilder() { * * @return New instance of this class */ - public static VolumeXYTimeSeriesBuilder instance() { + public static VolumeXYTimeSeriesBuilder get() { return new VolumeXYTimeSeriesBuilder(); } diff --git a/src/main/java/com/jfcbuilder/builders/XYAnnotationElements.java b/src/main/java/com/jfcbuilder/builders/XYAnnotationElements.java index 7028600..12a1864 100644 --- a/src/main/java/com/jfcbuilder/builders/XYAnnotationElements.java +++ b/src/main/java/com/jfcbuilder/builders/XYAnnotationElements.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/com/jfcbuilder/builders/XYArrowBuilder.java b/src/main/java/com/jfcbuilder/builders/XYArrowBuilder.java index 8ae2fd6..ba579e8 100644 --- a/src/main/java/com/jfcbuilder/builders/XYArrowBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/XYArrowBuilder.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -55,7 +55,7 @@ private XYArrowBuilder() { * * @return New instance of this class */ - public static XYArrowBuilder instance() { + public static XYArrowBuilder get() { return new XYArrowBuilder(); } diff --git a/src/main/java/com/jfcbuilder/builders/XYPlotBuilder.java b/src/main/java/com/jfcbuilder/builders/XYPlotBuilder.java index 9bbd301..cd77d5a 100644 --- a/src/main/java/com/jfcbuilder/builders/XYPlotBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/XYPlotBuilder.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -53,7 +53,7 @@ private XYPlotBuilder() { * * @return New instance of this class */ - public static XYPlotBuilder instance() { + public static XYPlotBuilder get() { return new XYPlotBuilder(); } diff --git a/src/main/java/com/jfcbuilder/builders/XYTextBuilder.java b/src/main/java/com/jfcbuilder/builders/XYTextBuilder.java index ffda593..923a3d3 100644 --- a/src/main/java/com/jfcbuilder/builders/XYTextBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/XYTextBuilder.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -45,7 +45,7 @@ private XYTextBuilder() { * * @return New instance of this class */ - public static XYTextBuilder instance() { + public static XYTextBuilder get() { return new XYTextBuilder(); } diff --git a/src/main/java/com/jfcbuilder/builders/XYTimeSeriesBuilder.java b/src/main/java/com/jfcbuilder/builders/XYTimeSeriesBuilder.java index bbf7d34..4dd0aaf 100644 --- a/src/main/java/com/jfcbuilder/builders/XYTimeSeriesBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/XYTimeSeriesBuilder.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -49,7 +49,7 @@ private XYTimeSeriesBuilder() { * * @return New instance of this class */ - public static XYTimeSeriesBuilder instance() { + public static XYTimeSeriesBuilder get() { return new XYTimeSeriesBuilder(); } diff --git a/src/main/java/com/jfcbuilder/builders/XYTimeSeriesElements.java b/src/main/java/com/jfcbuilder/builders/XYTimeSeriesElements.java index 892dba9..7981fc2 100644 --- a/src/main/java/com/jfcbuilder/builders/XYTimeSeriesElements.java +++ b/src/main/java/com/jfcbuilder/builders/XYTimeSeriesElements.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/com/jfcbuilder/builders/XYTimeSeriesPlotBuilderElements.java b/src/main/java/com/jfcbuilder/builders/XYTimeSeriesPlotBuilderElements.java index 00c3128..e61f3eb 100644 --- a/src/main/java/com/jfcbuilder/builders/XYTimeSeriesPlotBuilderElements.java +++ b/src/main/java/com/jfcbuilder/builders/XYTimeSeriesPlotBuilderElements.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/com/jfcbuilder/builders/renderers/CandlestickRendererBuilder.java b/src/main/java/com/jfcbuilder/builders/renderers/CandlestickRendererBuilder.java index ab4f213..034a391 100644 --- a/src/main/java/com/jfcbuilder/builders/renderers/CandlestickRendererBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/renderers/CandlestickRendererBuilder.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -40,7 +40,7 @@ private CandlestickRendererBuilder() { downColor = BuilderConstants.DEFAULT_DOWN_COLOR; } - public static CandlestickRendererBuilder instance() { + public static CandlestickRendererBuilder get() { return new CandlestickRendererBuilder(); } diff --git a/src/main/java/com/jfcbuilder/builders/renderers/XYBarRendererBuilder.java b/src/main/java/com/jfcbuilder/builders/renderers/XYBarRendererBuilder.java index e49792f..0029e16 100644 --- a/src/main/java/com/jfcbuilder/builders/renderers/XYBarRendererBuilder.java +++ b/src/main/java/com/jfcbuilder/builders/renderers/XYBarRendererBuilder.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -44,7 +44,7 @@ private XYBarRendererBuilder() { outlineColor = BuilderConstants.DEFAULT_FILL_COLOR; } - public static XYBarRendererBuilder instance() { + public static XYBarRendererBuilder get() { return new XYBarRendererBuilder(); } diff --git a/src/main/java/com/jfcbuilder/builders/types/BuilderConstants.java b/src/main/java/com/jfcbuilder/builders/types/BuilderConstants.java index 07983ff..5b405c3 100644 --- a/src/main/java/com/jfcbuilder/builders/types/BuilderConstants.java +++ b/src/main/java/com/jfcbuilder/builders/types/BuilderConstants.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/com/jfcbuilder/builders/types/DohlcvSeries.java b/src/main/java/com/jfcbuilder/builders/types/DohlcvSeries.java index 7bb0ae9..798daed 100644 --- a/src/main/java/com/jfcbuilder/builders/types/DohlcvSeries.java +++ b/src/main/java/com/jfcbuilder/builders/types/DohlcvSeries.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/com/jfcbuilder/builders/types/OhlcvSeries.java b/src/main/java/com/jfcbuilder/builders/types/OhlcvSeries.java index 41f1f10..fbe0c3e 100644 --- a/src/main/java/com/jfcbuilder/builders/types/OhlcvSeries.java +++ b/src/main/java/com/jfcbuilder/builders/types/OhlcvSeries.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/com/jfcbuilder/builders/types/Orientation.java b/src/main/java/com/jfcbuilder/builders/types/Orientation.java index b062d45..0bf71ef 100644 --- a/src/main/java/com/jfcbuilder/builders/types/Orientation.java +++ b/src/main/java/com/jfcbuilder/builders/types/Orientation.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/com/jfcbuilder/builders/types/ZeroBasedIndexRange.java b/src/main/java/com/jfcbuilder/builders/types/ZeroBasedIndexRange.java index f5d36b8..429e85d 100644 --- a/src/main/java/com/jfcbuilder/builders/types/ZeroBasedIndexRange.java +++ b/src/main/java/com/jfcbuilder/builders/types/ZeroBasedIndexRange.java @@ -1,7 +1,7 @@ /* * jfreechart-builder: a builder pattern module for working with the jfreechart library * - * (C) Copyright 2020, by Matt E. + * (C) Copyright 2020, by Matt E. and project contributors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -39,8 +39,8 @@ public ZeroBasedIndexRange() { /** * Constructor that sets the zero-based indexes defining the range. * - * @param startIndex Zero based index of the start of the range . - * @param endIndex Zero based index of the end of the range. + * @param startIndex Zero based index of the start of the range + * @param endIndex Zero based index of the end of the range * @throws IllegalArgumentException If startIndex or endIndex are negative, or if startIndex is * greater than endIndex. */ @@ -51,8 +51,8 @@ public ZeroBasedIndexRange(int startIndex, int endIndex) throws IllegalArgumentE /** * Sets the zero-based indexes defining the range. * - * @param startIndex Zero based index of the start of the range . - * @param endIndex Zero based index of the end of the range. + * @param startIndex Zero based index of the start of the range + * @param endIndex Zero based index of the end of the range * @throws IllegalArgumentException If startIndex or endIndex are negative, or if startIndex is * greater than endIndex. */ From dad87b8efc30be166cdbc92113adc0f9a0a11bb7 Mon Sep 17 00:00:00 2001 From: Matt E Date: Sun, 29 Nov 2020 02:28:10 -0500 Subject: [PATCH 3/6] Fix comment text --- .../java/com/jfcbuilder/builders/XYAnnotationElements.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/jfcbuilder/builders/XYAnnotationElements.java b/src/main/java/com/jfcbuilder/builders/XYAnnotationElements.java index 12a1864..0b8bb82 100644 --- a/src/main/java/com/jfcbuilder/builders/XYAnnotationElements.java +++ b/src/main/java/com/jfcbuilder/builders/XYAnnotationElements.java @@ -227,10 +227,9 @@ public void checkBuildPreconditions() throws IllegalStateException { */ public String paddedText() { - // TODO: Can this be made more efficient? Strings.repeat() below may use a new StringBuilder - // each call. Strings are also accumulated with += .. would StringBuilder be better for such - // a low number of +=? How does this fare for huge numbers of annotations and/or charts - // being generated in bulk? + // TODO: Can and should this be made more efficient? Strings are accumulated with += + // would StringBuilder be better for such a low number of +=? How does this + // fare for huge numbers of annotations and/or charts being generated in bulk? String label = ""; From dd194824aac337652912b8b70579f2a11f490d22 Mon Sep 17 00:00:00 2001 From: Matt E Date: Sun, 29 Nov 2020 02:40:30 -0500 Subject: [PATCH 4/6] Shuffle around README sections --- README.md | 53 +++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 9063385..6a947e0 100644 --- a/README.md +++ b/README.md @@ -126,38 +126,16 @@ Produces a chart like this: See the [jfreechart-builder-demo](https://github.com/matoos32/jfreechart-builder-demo) for an interactive demo used for development. -## Thread-safety and garbage collection - -No thread-safety measures are deliberately taken. If you require thread-safety then provide deep copies of objects, don't share builders, don't share charts, or add synchronization to your business logic. - -Generally, primitive data arrays are copied into **jfreechart** objects. **jfreechart-builder** will maintain references to other objects passed-in like strings, colors, and drawing strokes. When the builders and charts they produce go out of scope, -the objects you provided (and other objects that may be referencing them) should be garbage collected as applicable. - - -## Versioning - -The major and minor numbers are the same as the **jfreechart** major and minor to denote what version is compatible. The incremental ("patch") number is the monolithic version number of **jfreechart-builder**. - - -## License - -**jfreechart-builder** is not affiliated with the **jfreechart** project but for compatibility is provided under the terms of the same [LGPL 2.1 license](./license-LGPL.txt). - -You should be aware of the contents of the **jfreechart-builder** JAR file built from this project. - -It should contain the compiled `.class` files only of **jfreechart-builder** and should not incorporate any from **jfreechart**, however you must verify its contents to know what the build tools are actually producing. - -If you need clarification on the LGPL vs. Java, please see the [FSF's tech note about it](https://www.gnu.org/licenses/lgpl-java.html). - - ## Incorporating into your project + ### Building Prerequisites * JDK 8 or greater [[1](https://openjdk.java.net/)] [[2](https://www.oracle.com/java/)] installed. * [Apache Maven](https://maven.apache.org/) installed. * Internet connection so Maven can download artifacts or you provide and install those into your local Maven repo by alternative means. + ### Installing source code ``` @@ -173,7 +151,7 @@ cd path/to/the/cloned/repo git checkout ``` -If you want to simply build the jar and figure out what to do with it next ... +To simply build the jar and figure out what to do with it next: ``` mvn package @@ -182,7 +160,7 @@ mvn package The jar will be in the `target/` folder. -If you want to build and install the jar into your Maven repo: +To build and install the jar into your Maven repo: ``` mvn install @@ -201,6 +179,29 @@ Add this dependency to your project's `.pom` file: ``` +## Thread-safety and garbage collection + +No thread-safety measures are deliberately taken. If you require thread-safety then provide deep copies of objects, don't share builders, don't share charts, or add synchronization to your business logic. + +Generally, primitive data arrays are copied into **jfreechart** objects. **jfreechart-builder** will maintain references to other objects passed-in like strings, colors, and drawing strokes. When the builders and charts they produce go out of scope, +the objects you provided (and other objects that may be referencing them) should be garbage collected as applicable. + + +## Versioning + +The major and minor numbers are the same as the **jfreechart** major and minor to denote what version is compatible. The incremental ("patch") number is the monolithic version number of **jfreechart-builder**. + + +## License + +**jfreechart-builder** is not affiliated with the **jfreechart** project but for compatibility is provided under the terms of the same [LGPL 2.1 license](./license-LGPL.txt). + +You should be aware of the contents of the **jfreechart-builder** JAR file built from this project. + +It should contain the compiled `.class` files only of **jfreechart-builder** and should not incorporate any from **jfreechart**, however you must verify its contents to know what the build tools are actually producing. + +If you need clarification on the LGPL vs. Java, please see the [FSF's tech note about it](https://www.gnu.org/licenses/lgpl-java.html). + ## Contributing From 803a6005a220d22defd5c8ed4de5ca6b3c478bbc Mon Sep 17 00:00:00 2001 From: Matt E Date: Sun, 29 Nov 2020 22:19:49 -0500 Subject: [PATCH 5/6] Bump version number to 1.5.1 --- README.md | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6a947e0..08d9e66 100644 --- a/README.md +++ b/README.md @@ -175,7 +175,7 @@ Add this dependency to your project's `.pom` file: com.jfcbuilder jfreechart-builder - 1.5.0 + 1.5.1 ``` diff --git a/pom.xml b/pom.xml index 4735ee8..2be3543 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.jfcbuilder jfreechart-builder - 1.5.0 + 1.5.1 JFreeChartBuilder A builder framework for creating JFreeChart charts. From 5983b4ecd7baa3cfa7467e11eeca44c3008b13dc Mon Sep 17 00:00:00 2001 From: Matt E Date: Sun, 29 Nov 2020 22:35:54 -0500 Subject: [PATCH 6/6] Add branching model section to README --- README.md | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 08d9e66..50eb619 100644 --- a/README.md +++ b/README.md @@ -126,10 +126,22 @@ Produces a chart like this: See the [jfreechart-builder-demo](https://github.com/matoos32/jfreechart-builder-demo) for an interactive demo used for development. +## Versioning + +The major and minor numbers are the same as the **jfreechart** major and minor to denote what version is compatible. The incremental ("patch") number is the monolithic version number of **jfreechart-builder**. + + +## Branching model + +If you want the latest and greatest contributions use the `develop` branch. These commits have not yet been merged into `main` nor received a version tag, but give you a preview of what's to come. + +Each time `develop` is merged into `main`, a version tag is added onto that merge commit so that each commit to `main` represents the next version. + + ## Incorporating into your project -### Building Prerequisites +### Prerequisites * JDK 8 or greater [[1](https://openjdk.java.net/)] [[2](https://www.oracle.com/java/)] installed. * [Apache Maven](https://maven.apache.org/) installed. @@ -187,11 +199,6 @@ Generally, primitive data arrays are copied into **jfreechart** objects. **jfree the objects you provided (and other objects that may be referencing them) should be garbage collected as applicable. -## Versioning - -The major and minor numbers are the same as the **jfreechart** major and minor to denote what version is compatible. The incremental ("patch") number is the monolithic version number of **jfreechart-builder**. - - ## License **jfreechart-builder** is not affiliated with the **jfreechart** project but for compatibility is provided under the terms of the same [LGPL 2.1 license](./license-LGPL.txt). @@ -206,3 +213,5 @@ If you need clarification on the LGPL vs. Java, please see the [FSF's tech note ## Contributing Contributions are welcome and will be accepted as the maintainers' time permits. + +Please use indentations of two spaces (no tabs) and wrap lines at a max width of 100 characters.