diff -r 3bf53096ec0a javafx-ui-charts/src/javafx/scene/chart/AreaChart.java --- a/javafx-ui-charts/src/javafx/scene/chart/AreaChart.java Thu Mar 07 14:04:37 2013 -0800 +++ b/javafx-ui-charts/src/javafx/scene/chart/AreaChart.java Fri Mar 08 13:00:45 2013 +0100 @@ -54,6 +54,14 @@ import com.sun.javafx.charts.Legend; import com.sun.javafx.charts.Legend.LegendItem; +import com.sun.javafx.css.converters.BooleanConverter; +import java.util.Collections; +import javafx.beans.property.BooleanProperty; +import javafx.css.CssMetaData; +import javafx.css.Styleable; +import javafx.css.StyleableBooleanProperty; +import javafx.css.StyleableProperty; +import static javafx.scene.chart.LineChart.getClassCssMetaData; /** * AreaChart - Plots the area between the line that connects the data points and @@ -67,6 +75,54 @@ private Map seriesYMultiplierMap = new HashMap(); private Legend legend = new Legend(); + // -------------- PUBLIC PROPERTIES ---------------------------------------- + + /** When true, CSS styleable symbols are created for any data items that don't have a symbol node specified. */ + private BooleanProperty createSymbols = new StyleableBooleanProperty(true) { + @Override protected void invalidated() { + for (int seriesIndex=0; seriesIndex < getData().size(); seriesIndex ++) { + Series series = getData().get(seriesIndex); + for (int itemIndex=0; itemIndex < series.getData().size(); itemIndex ++) { + Data item = series.getData().get(itemIndex); + Node symbol = item.getNode(); + if(get() && symbol == null) { // create any symbols + symbol = createSymbol(series, getData().indexOf(series), item, itemIndex); + if (null != symbol) { + getPlotChildren().add(symbol); + } + } else if (!get() && symbol != null) { // remove symbols + getPlotChildren().remove(symbol); + symbol = null; + item.setNode(null); + } + } + } + requestChartLayout(); + } + + public Object getBean() { + return this; + } + + public String getName() { + return "createSymbols"; + } + + public CssMetaData getCssMetaData() { + return StyleableProperties.CREATE_SYMBOLS; + } + }; + + /** + * Indicates whether symbols for data points will be created or not. + * + * @return true if symbols for data points will be created and false otherwise. + */ + public final boolean getCreateSymbols() { return createSymbols.getValue(); } + public final void setCreateSymbols(boolean value) { createSymbols.setValue(value); } + public final BooleanProperty createSymbolsProperty() { return createSymbols; } + + // -------------- CONSTRUCTORS ---------------------------------------------- /** @@ -157,7 +213,7 @@ int last = series.getData().size() - 2; item.setCurrentX(series.getData().get(last).getXValue()); item.setCurrentY(series.getData().get(last).getYValue()); - } else { + } else if (symbol != null) { // fade in new symbol FadeTransition ft = new FadeTransition(Duration.millis(500),symbol); ft.setToValue(1); @@ -176,8 +232,9 @@ ); } + } else if (symbol != null) { + getPlotChildren().add(symbol); } - getPlotChildren().add(symbol); } @Override protected void dataItemRemoved(final Data item, final Series series) { @@ -315,14 +372,19 @@ for (int j=0; j series) { @@ -345,7 +407,6 @@ } seriesColorMap.remove(series); } - @Override protected void seriesRemoved(final Series series) { updateDefaultColorIndex(series); // remove series Y multiplier @@ -355,7 +416,10 @@ // create list of all nodes we need to fade out final List nodes = new ArrayList(); nodes.add(series.getNode()); + if (getCreateSymbols()) { // RT-22124 + // done need to fade the symbols if createSymbols is false for (Data d: series.getData()) nodes.add(d.getNode()); + } // fade out old and symbols KeyValue[] startValues = new KeyValue[nodes.size()]; KeyValue[] endValues = new KeyValue[nodes.size()]; @@ -423,13 +487,13 @@ private Node createSymbol(Series series, int seriesIndex, final Data item, int itemIndex) { Node symbol = item.getNode(); // check if symbol has already been created - if (symbol == null) { + if (symbol == null && getCreateSymbols()) { symbol = new StackPane(); item.setNode(symbol); } // set symbol styles // Note: not sure if we want to add or check, ie be more careful and efficient here - symbol.getStyleClass().setAll("chart-area-symbol", "series" + seriesIndex, "data" + itemIndex, + if (symbol != null) symbol.getStyleClass().setAll("chart-area-symbol", "series" + seriesIndex, "data" + itemIndex, series.defaultColorStyleClass); return symbol; } @@ -458,4 +522,47 @@ } } + // -------------- STYLESHEET HANDLING -------------------------------------- + + private static class StyleableProperties { + private static final CssMetaData,Boolean> CREATE_SYMBOLS = + new CssMetaData,Boolean>("-fx-create-symbols", + BooleanConverter.getInstance(), Boolean.TRUE) { + + @Override + public boolean isSettable(AreaChart node) { + return node.createSymbols == null || !node.createSymbols.isBound(); } + + @Override + public StyleableProperty getStyleableProperty(AreaChart node) { + return (StyleableProperty)node.createSymbolsProperty(); + } + }; + + private static final List> STYLEABLES; + static { + final List> styleables = + new ArrayList>(XYChart.getClassCssMetaData()); + styleables.add(CREATE_SYMBOLS); + STYLEABLES = Collections.unmodifiableList(styleables); + } + } + + /** + * @return The CssMetaData associated with this class, which may include the + * CssMetaData of its super classes. + */ + public static List> getClassCssMetaData() { + return StyleableProperties.STYLEABLES; + } + + /** + * {@inheritDoc} + */ + @Override + public List> getCssMetaData() { + return getClassCssMetaData(); + } + +} diff -r 3bf53096ec0a javafx-ui-charts/src/javafx/scene/chart/StackedAreaChart.java --- a/javafx-ui-charts/src/javafx/scene/chart/StackedAreaChart.java Thu Mar 07 14:04:37 2013 -0800 +++ b/javafx-ui-charts/src/javafx/scene/chart/StackedAreaChart.java Fri Mar 08 13:00:45 2013 +0100 @@ -42,8 +42,13 @@ import javafx.util.Duration; import com.sun.javafx.charts.Legend; import com.sun.javafx.charts.Legend.LegendItem; +import com.sun.javafx.css.converters.BooleanConverter; +import javafx.beans.property.BooleanProperty; import javafx.css.CssMetaData; import javafx.css.Styleable; +import javafx.css.StyleableBooleanProperty; +import javafx.css.StyleableProperty; +import javafx.scene.paint.Color; /** * StackedAreaChart is a variation of {@link AreaChart} that displays trends of the @@ -66,6 +71,57 @@ private Map seriesYMultiplierMap = new HashMap(); private Legend legend = new Legend(); + // -------------- PUBLIC PROPERTIES ---------------------------------------- + /** + * When true, CSS styleable symbols are created for any data items that + * don't have a symbol node specified. + */ + private BooleanProperty createSymbols = new StyleableBooleanProperty(true) { + @Override + protected void invalidated() { + for (int seriesIndex = 0; seriesIndex < getData().size(); seriesIndex++) { + Series series = getData().get(seriesIndex); + for (int itemIndex = 0; itemIndex < series.getData().size(); itemIndex++) { + Data item = series.getData().get(itemIndex); + Node symbol = item.getNode(); + if (get() && symbol == null) { // create any symbols + symbol = createSymbol(series, getData().indexOf(series), item, itemIndex); + if (null != symbol) { + getPlotChildren().add(symbol); + } + } else if (!get() && symbol != null) { // remove symbols + getPlotChildren().remove(symbol); + symbol = null; + item.setNode(null); + } + } + } + requestChartLayout(); + } + + public Object getBean() { + return this; + } + + public String getName() { + return "createSymbols"; + } + + public CssMetaData getCssMetaData() { + return StyleableProperties.CREATE_SYMBOLS; + } + }; + + /** + * Indicates whether symbols for data points will be created or not. + * + * @return true if symbols for data points will be created and false otherwise. + */ + public final boolean getCreateSymbols() { return createSymbols.getValue(); } + public final void setCreateSymbols(boolean value) { createSymbols.setValue(value); } + public final BooleanProperty createSymbolsProperty() { return createSymbols; } + + // -------------- CONSTRUCTORS ---------------------------------------------- /** @@ -132,7 +188,7 @@ int last = series.getData().size() - 2; item.setCurrentX(series.getData().get(last).getXValue()); item.setCurrentY(series.getData().get(last).getYValue()); - } else { + } else if (symbol != null) { // fade in new symbol FadeTransition ft = new FadeTransition(Duration.millis(500),symbol); ft.setToValue(1); @@ -151,8 +207,9 @@ ); } + } else if (symbol != null) { + getPlotChildren().add(symbol); } - getPlotChildren().add(symbol); } @Override protected void dataItemRemoved(final Data item, final Series series) { @@ -290,6 +347,7 @@ for (int j=0; j() { + @Override public void handle(ActionEvent actionEvent) { + getPlotChildren().removeAll(nodes); + removeSeriesFromDisplay(series); + } + }) + ); + tl.play(); + } + } else { getPlotChildren().remove(series.getNode()); for (Data d:series.getData()) getPlotChildren().remove(d.getNode()); removeSeriesFromDisplay(series); @@ -650,13 +722,13 @@ private Node createSymbol(Series series, int seriesIndex, final Data item, int itemIndex) { Node symbol = item.getNode(); // check if symbol has already been created - if (symbol == null) { + if (symbol == null && getCreateSymbols()) { symbol = new StackPane(); item.setNode(symbol); } // set symbol styles // Note not sure if we want to add or check, ie be more careful and efficient here - symbol.getStyleClass().setAll("chart-area-symbol", "series" + seriesIndex, "data" + itemIndex, + if (symbol != null) symbol.getStyleClass().setAll("chart-area-symbol", "series" + seriesIndex, "data" + itemIndex, series.defaultColorStyleClass); return symbol; } @@ -745,12 +817,26 @@ private static class StyleableProperties { + private static final CssMetaData, Boolean> CREATE_SYMBOLS = + new CssMetaData, Boolean>("-fx-create-symbols", + BooleanConverter.getInstance(), Boolean.TRUE) { + @Override + public boolean isSettable(StackedAreaChart node) { + return node.createSymbols == null || !node.createSymbols.isBound(); + } + + @Override + public StyleableProperty getStyleableProperty(StackedAreaChart node) { + return (StyleableProperty) node.createSymbolsProperty(); + } + }; + private static final List> STYLEABLES; static { final List> styleables = new ArrayList>(XYChart.getClassCssMetaData()); - + styleables.add(CREATE_SYMBOLS); STYLEABLES = Collections.unmodifiableList(styleables); } @@ -763,6 +849,7 @@ public static List> getClassCssMetaData() { return StyleableProperties.STYLEABLES; } + /** * {@inheritDoc} */