/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.components.parametricstudy.gui.view; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import org.eclipse.nebula.visualization.xygraph.figures.Trace.TraceType; import org.eclipse.swt.graphics.RGB; import de.rcenvironment.core.utils.common.StringUtils; import de.rcenvironment.core.utils.incubator.configuration.annotation.Configurable; import de.rcenvironment.core.utils.incubator.configuration.annotation.Configuration; /** * The java bean holding the configuration of a chart to be displayed. * * @author Christian Weiss */ @Configuration public final class ChartConfiguration extends AbstractConfiguration { /** The default value whether or not the title of the chart is shown. */ public static final boolean DEFAULT_SHOW_TITLE = true; private static final int NO_SUCH_ELEMENT_INDEX = -1; /** The serialVersionUID. */ private static final long serialVersionUID = -1320466508913829555L; /** The x axes. */ private final List<XAxis> xAxes = new LinkedList<XAxis>(); /** The y axes. */ private final List<YAxis> yAxes = new LinkedList<YAxis>(); /** The traces. */ private Trace[] traces = new Trace[0]; /** The title. */ private String title; /** The information whether or not to show the title. */ private boolean showTitle = DEFAULT_SHOW_TITLE; /** The information whether or not to show the legend. */ private boolean showLegend = true; /** * Returns the title. * * @return the title */ @Configurable public String getTitle() { return title; } /** * Sets the title. * * @param title the new title */ public void setTitle(final String title) { final String oldValue = this.title; this.title = title; firePropertyChange("title", oldValue, title); } /** * Returns the information whether or not to show the title. * * @return the show title */ @Configurable public boolean getShowTitle() { return showTitle; } /** * Sets the information whether or not to show the title. * * @param showTitle the new show title */ public void setShowTitle(final boolean showTitle) { final boolean oldValue = this.showTitle; this.showTitle = showTitle; firePropertyChange("showTitle", oldValue, showTitle); } /** * Returns the information whether or not the legend shall be shown. * * @return true, if is show legend */ @Configurable public boolean isShowLegend() { return showLegend; } /** * Sets the information whether or not to show the legend. * * @param showLegend the new show legend */ public void setShowLegend(final boolean showLegend) { final boolean oldValue = this.showLegend; this.showLegend = showLegend; firePropertyChange("showLegend", oldValue, showLegend); } /** * Returns the x axis with the given title. * * @param axisTitle the title * @return the x axis */ public XAxis getXAxis(final String axisTitle) { for (final XAxis axis : xAxes) { if (axisTitle.equals(axis.getTitle())) { return axis; } } return null; } /** * Returns the x axes. * * @return the x axes */ @Configurable public XAxis[] getXAxes() { return xAxes.toArray(new XAxis[xAxes.size()]); } /** * Returns the x axis at the given index. * * @param index the index * @return the x axes */ public XAxis getXAxes(final int index) { return xAxes.get(index); } /** * Adds the x axis. * * @param xaxis the xaxis */ public void addXAxis(final XAxis xaxis) { if (xAxes.contains(xaxis) || getXAxis(xaxis.getTitle()) != null) { return; } this.xAxes.add(xaxis); } /** * Returns the y axis with the given title. * * @param axisTitle the title * @return the y axis */ public YAxis getYAxis(final String axisTitle) { for (final YAxis axis : yAxes) { if (axisTitle.equals(axis.getTitle())) { return axis; } } return null; } /** * Returns the y axes. * * @return the y axes */ @Configurable public YAxis[] getYAxes() { return yAxes.toArray(new YAxis[yAxes.size()]); } /** * Returns the y axis at the given index. * * @param index the index * @return the y axes */ public YAxis getYAxes(final int index) { return yAxes.get(index); } /** * Adds the y axis. * * @param yaxis the yaxis */ public void addYAxis(final YAxis yaxis) { if (yAxes.contains(yaxis) || getYAxis(yaxis.getTitle()) != null) { return; } this.yAxes.add(yaxis); } /** * Returns the trace with the given title. * * @param traceTitle the title * @return the trace */ public Trace getTrace(final String traceTitle) { for (final Trace trace : traces) { if (traceTitle.equals(trace.getName())) { return trace; } } return null; } /** * Returns the traces. * * @return the traces */ @Configurable public Trace[] getTraces() { return traces; } /** * Returns the trace at the given index. * * @param index the index * @return the trace */ public Trace getTrace(final int index) { return traces[index]; } /** * Adds the trace. * * @param trace the trace */ public void addTrace(final Trace trace) { final Trace[] oldTraces = traces; final Trace[] newTraces = new Trace[oldTraces.length + 1]; System.arraycopy(oldTraces, 0, newTraces, 0, oldTraces.length); newTraces[newTraces.length - 1] = trace; traces = newTraces; fireIndexedPropertyChange("traces", traces.length - 1, null, trace); } /** * Removes the trace. * * @param trace the trace */ public void removeTrace(final Trace trace) { final int index = getTraceIndex(trace); if (index >= 0) { final Trace[] oldTraces = traces; final Trace[] newTraces = new Trace[oldTraces.length - 1]; System.arraycopy(oldTraces, 0, newTraces, 0, index); System.arraycopy(oldTraces, index + 1, newTraces, index, newTraces.length - index); traces = newTraces; firePropertyChange("traces", oldTraces, traces); } } /** * Returns the trace index. * * @param trace the trace * @return the trace index */ private int getTraceIndex(final Trace trace) { for (int index = 0; index < traces.length; ++index) { if (traces[index].equals(trace)) { return index; } } return NO_SUCH_ELEMENT_INDEX; } /** * {@inheritDoc} * * @see de.rcenvironment.components.parametricstudy.gui.view.AbstractConfiguration#validate() */ @Override public String validate() { String result = null; if (title == null || title.isEmpty() // || xAxes.size() == 0 // || yAxes.size() == 0 // || traces.length == 0) { result = "chart configuration is not valid"; } if (result != null) { final List<AbstractConfiguration> elements = new LinkedList<AbstractConfiguration>(); elements.addAll(xAxes); elements.addAll(yAxes); elements.addAll(Arrays.asList(traces)); for (final Object element : elements) { if (!(element instanceof AbstractConfiguration)) { continue; } result = ((AbstractConfiguration) element).validate(); if (result != null) { break; } } } return result; } /** * The common base class for axes, holding the common configuration attributes. * * @author Christian Weiss */ @Configuration public abstract static class Axis extends AbstractConfiguration { /** The serialVersionUID. */ private static final long serialVersionUID = -5175175964625896094L; /** The title. */ private String title; /** The information whether or not the axis is visible. */ private boolean visible = true; /** The information whether or not the axis shall use auto formating. */ private boolean autoFormat = true; /** The information whether or not the axis shall use auto scaling. */ private boolean autoScale = true; /** The information whether or not the axis shall use log scaling. */ private boolean logScale = false; /** * Returns the title. * * @return the title */ @Configurable public String getTitle() { return title; } /** * Sets the title. * * @param title the new title */ public void setTitle(String title) { final String oldValue = this.title; this.title = title; firePropertyChange("title", oldValue, title); } /** * Checks if is visible. * * @return true, if is visible */ @Configurable public boolean isVisible() { return visible; } /** * Sets the visible. * * @param visible the new visible */ public void setVisible(boolean visible) { final boolean oldValue = this.visible; this.visible = visible; firePropertyChange("visible", oldValue, visible); } /** * Checks if is auto format. * * @return true, if is auto format */ @Configurable public boolean isAutoFormat() { return autoFormat; } /** * Sets the auto format. * * @param autoFormat the new auto format */ public void setAutoFormat(boolean autoFormat) { final boolean oldValue = this.autoFormat; this.autoFormat = autoFormat; firePropertyChange("autoFormat", oldValue, autoFormat); } /** * Checks if is auto scale. * * @return true, if is auto scale */ @Configurable public boolean isAutoScale() { return autoScale; } /** * Sets the auto scale. * * @param autoScale the new auto scale */ public void setAutoScale(boolean autoScale) { final boolean oldValue = this.autoScale; this.autoScale = autoScale; firePropertyChange("autoScale", oldValue, autoScale); } /** * Checks if is log scale. * * @return true, if is log scale */ @Configurable public boolean isLogScale() { return logScale; } /** * Sets the log scale. * * @param logScale the new log scale */ public void setLogScale(boolean logScale) { final boolean oldValue = this.logScale; this.logScale = logScale; firePropertyChange("logScale", oldValue, logScale); } /** * {@inheritDoc} * * @see de.rcenvironment.components.parametricstudy.gui.view.AbstractConfiguration#validate() */ @Override public String validate() { if (title == null || title.isEmpty()) { return "axis configuration is not valid"; } return null; } /** * {@inheritDoc} * * @see java.lang.Object#toString() */ @Override public String toString() { return StringUtils.format("%s", title); } } /** * The class holding the configuration for an axis on the x (horizontal) dimension. * * @author Chritian Weiss */ public static final class XAxis extends Axis { /** The serialVersionUID. */ private static final long serialVersionUID = -8467430361175681746L; } /** * The class holding the configuration for an axis on the y (vertical) dimension. */ public static final class YAxis extends Axis { /** The serialVersionUID. */ private static final long serialVersionUID = 6839843465063469066L; } /** * The class holding the configuration for a trace. */ @Configuration public static final class Trace extends AbstractConfiguration { /** The Constant PROPERTY_VISIBLE. */ public static final String PROPERTY_VISIBLE = "visible"; /** The Constant PROPERTY_Y_AXIS. */ public static final String PROPERTY_Y_AXIS = "yAxis"; /** The Constant PROPERTY_X_AXIS. */ public static final String PROPERTY_X_AXIS = "xAxis"; /** The Constant serialVersionUID. */ private static final long serialVersionUID = -6828180563766171017L; /** * The Enum Type. */ public enum Type { /** Solid Line. */ SOLID_LINE("Solid Line"), /** Dash Line. */ DASH_LINE("Dash Line"), /** Point. */ POINT("Point"), /** Bar. */ BAR("Bar"), // /** Area. */ AREA("Area"), /** Step Vertically. */ STEP_VERTICALLY("Step Vertically"), /** Step Horizontally. */ STEP_HORIZONTALLY("Step Horizontally"); /** The title. */ private final String title; /** * Instantiates a new type. * * @param title the title */ Type(final String title) { this.title = title; } /** * {@inheritDoc} * * @see java.lang.Enum#toString() */ @Override public String toString() { return title; } } /** The chart configuration. */ private final ChartConfiguration chartConfiguration; /** The type. */ private TraceType type = TraceType.SOLID_LINE; /** The color. */ private RGB color; /** The name. */ private String name = ""; /** The x axis. */ private XAxis xAxis; /** The y axis. */ private YAxis yAxis; /** The visible. */ private boolean visible = true; /** * Instantiates a new trace. * * @param chartConfiguration the chart configuration */ public Trace(final ChartConfiguration chartConfiguration) { this.chartConfiguration = chartConfiguration; } /** * Returns the chart configuration. * * @return the chart configuration */ public ChartConfiguration getChartConfiguration() { return chartConfiguration; } /** * Returns the type. * * @return the type */ @Configurable public TraceType getType() { return type; } /** * Sets the type. * * @param type the new type */ public void setType(TraceType type) { if (type == null) { throw new IllegalArgumentException(); } final TraceType oldValue = this.type; this.type = type; firePropertyChange("type", oldValue, type); } /** * Returns the color. * * @return the color */ @Configurable public RGB getColor() { return color; } /** * Sets the color. * * @param color the new color */ public void setColor(RGB color) { if (color == null) { throw new IllegalArgumentException(); } final RGB oldValue = this.color; this.color = color; firePropertyChange("color", oldValue, color); } /** * Returns the name. * * @return the name */ @Configurable public String getName() { return name; } /** * Sets the name. * * @param name the new name */ public void setName(String name) { final String oldValue = this.name; this.name = name; firePropertyChange("name", oldValue, name); } /** * The Class XAxisSelectionProvider. */ public static final class XAxisSelectionProvider implements Configurable.ValueProvider { /** The trace. */ private Trace trace; /** * {@inheritDoc} * * @see de.rcenvironment.core.utils.incubator.configuration.annotation.Configurable.ValueProvider#setObject(java.lang.Object) */ @Override public void setObject(Object object) { trace = (Trace) object; } /** * {@inheritDoc} * * @see de.rcenvironment.core.utils.incubator.configuration.annotation.Configurable.ValueProvider#getValues() */ @Override public Object[] getValues() { return trace.getChartConfiguration().getXAxes(); } } /** * Returns the x axis. * * @return the x axis */ @Configurable(valueProvider = XAxisSelectionProvider.class) public XAxis getXAxis() { return xAxis; } /** * Sets the x axis. * * @param xAxisIn the new x axis */ public void setXAxis(XAxis xAxisIn) { final XAxis oldValue = this.xAxis; this.xAxis = xAxisIn; firePropertyChange(PROPERTY_X_AXIS, oldValue, xAxisIn); } /** * The Class YAxisSelectionProvider. */ public static final class YAxisSelectionProvider implements Configurable.ValueProvider { /** The trace. */ private Trace trace; /** * {@inheritDoc} * * @see de.rcenvironment.core.utils.incubator.configuration.annotation.Configurable.ValueProvider#setObject(java.lang.Object) */ @Override public void setObject(Object object) { trace = (Trace) object; } /** * {@inheritDoc} * * @see de.rcenvironment.core.utils.incubator.configuration.annotation.Configurable.ValueProvider#getValues() */ @Override public Object[] getValues() { return trace.getChartConfiguration().getYAxes(); } } /** * Returns the y axis. * * @return the y axis */ @Configurable(valueProvider = YAxisSelectionProvider.class) public YAxis getYAxis() { return yAxis; } /** * Sets the y axis. * * @param yAxisIn the new y axis */ public void setYAxis(YAxis yAxisIn) { final YAxis oldValue = this.yAxis; this.yAxis = yAxisIn; firePropertyChange(PROPERTY_Y_AXIS, oldValue, yAxisIn); } /** * Checks if is visible. * * @return true, if is visible */ @Configurable public boolean isVisible() { return visible; } /** * Sets the visible. * * @param visible the new visible */ public void setVisible(boolean visible) { final boolean oldValue = this.visible; if (oldValue == visible) { return; } this.visible = visible; firePropertyChange(PROPERTY_VISIBLE, oldValue, visible); // check if axes can be hidden or must be shown as a result if (visible) { getXAxis().setVisible(visible); getYAxis().setVisible(visible); } else { boolean xAxisUsed = false; boolean yAxisUsed = false; for (final Trace trace : getChartConfiguration().getTraces()) { if (!trace.isVisible()) { continue; } if (trace.getXAxis() == getXAxis()) { xAxisUsed = true; } if (trace.getYAxis() == getYAxis()) { yAxisUsed = true; } } if (!xAxisUsed) { getXAxis().setVisible(visible); } if (!yAxisUsed) { getYAxis().setVisible(visible); } } } /** * {@inheritDoc} * * @see de.rcenvironment.components.parametricstudy.gui.view.AbstractConfiguration#validate() */ @Override public String validate() { if (type == null // || name == null || name.isEmpty() // || xAxis == null // || yAxis == null) { return "something is wrong"; } return null; } /** * {@inheritDoc} * * @see java.lang.Object#toString() */ @Override public String toString() { return getName(); } } }