package jas.hist;
import jas.plot.LegendEntry;
import jas.plot.Overlay;
import java.util.Observable;
import java.util.Observer;
/**
* This class is returned whenever a DataSource is added to a JASHist
* It supports making the data visible/invisible, and controlling the
* style (color etc) in which the data is shown.
* @author Tony Johnson
*/
public abstract class JASHistData
extends Observable
implements Observer
{
JASHistData(DataManager parent)
{
this.parent = parent;
}
/**
* Only used for object serialization, do not call
*/
public JASHistData()
{
}
/**
* Controls the visibility of the associated DataSource
* Only listens to changes in DataSources if visible
* @param show true if the DataSource should be visible
*/
public void show(boolean show)
{
if (show != isVisible)
{
isVisible = show;
DataSource dataSource = getDataSource();
if (dataSource instanceof Observable)
{
if (show) {
((Observable) dataSource).addObserver(this);
restoreNormalizationObserver();
} else {
((Observable) dataSource).deleteObserver(this);
deleteNormalizationObserver();
}
}
if (show) parent.requestShow(this);
else parent.requestHide(this);
}
}
/**
* Controls whether statistics associated with this datasource should be shown
*/
public void setShowStatistics(boolean show)
{
showStatistics = show;
}
public boolean getShowStatistics()
{
return showStatistics;
}
/**
* Controls whether statistics associated with this datasource should be shown
*/
public void setShowLegend(boolean show)
{
showLegend = show;
}
/**
* Get the legend entry for this data set
* @return The LegendEntry, or null if there isnt one
*/
LegendEntry getLegendEntry()
{
if ( ! showLegend )
return null;
Overlay ol = getOverlay();
return ol instanceof LegendEntry ? (LegendEntry) ol : null;
}
abstract Overlay createOverlay();
/**
* Get the overlay associated with this data set
*/
Overlay getOverlay()
{
if (overlay == null)
{
CustomOverlay co = getStyle().getCustomOverlay();
if (co != null)
{
co.setDataSource(getDataSource());
overlay = co;
}
else
{
overlay = createOverlay();
}
}
return overlay;
}
/**
* Get the DataSource associated with this JASHistData
* @return The associated DataSource
*/
public abstract DataSource getDataSource();
/**
* Get a DataSource suitable for using as the source for
* fit operations. In the case where the binning is set
* by the plot itself, this will differ from the orginal
* DataSource attached to the plot in that it reflects the
* current binning of the plot (remember a binned fit needs
* to be redone if the binning changes).
* @see #getDataSource()
*/
public DataSource getFittableDataSource()
{
return getDataSource();
}
/**
* Get the title of the associated DataSource
* @return The title
*/
public abstract String getTitle();
abstract void axisChanged();
/**
* Set a style for this data. The JASHistStyle object passed to this method must be
* appropriate for the corresponding DataSource, e.g. if the DataSource is a
* Rebinnable1DHistogramData then the JASHistStyle must be a JASHist1DStyle.
* @param style The style to be set
* @exception IllegalArgumentException If the style is not of the approriate type
*/
public abstract void setStyle(JASHistStyle style);
/**
* Get the JASHistStyle associated with this DataSource
* @return The associated style
*/
public abstract JASHistStyle getStyle();
/**
* Sets which Y axis the data is plotted against.
* @param axis Either YAXIS_LEFT or YAXIS_RIGHT
*/
public void setYAxis(int i)
{
yAxisIndex = i;
axisChanged();
}
/**
* Get the y axis against which this data is plotted
* @return Either YAXIS_LEFT or YAXIS_RIGHT
*/
public int getYAxis()
{
return yAxisIndex;
}
/**
* Equivalent to show(boolean)
* @param value true if the corresponding DataSource should be visible
*/
public void setShowing(boolean value)
{
show(value);
}
/**
* Find out if this DayaSource is visible
* @return true if the corresponding DataSource is visible
*/
public boolean isShowing()
{
return isVisible;
}
public String toString()
{
return getTitle();
}
/**
* Set the text for the legene entry corresponding to this data item
*/
public void setLegendText(String text)
{
String newText = null;
if (text.length() > 0 && !text.equals(getTitle())) newText = text;
if (newText != legendText)
{
legendText = newText;
parent.getPlot().getLegend().legendTextChanged();
}
}
public String getLegendText()
{
return legendText != null ? legendText : getTitle();
}
boolean isLegendChanged()
{
return legendText != null;
}
Statistics getStatistics()
{
if (showStatistics)
{
DataSource dataSource = getDataSource();
if (dataSource instanceof HasStatistics)
return ((HasStatistics) dataSource).getStatistics();
}
return null;
}
/**
* Writes the data and surrounding XML tags. Subclasses must implement this sensibly.
*/
abstract void writeAsXML(XMLPrintWriter pw, boolean snapshot);
void deleteNormalizationObserver()
{
if (normalization instanceof Observable) ((Observable) normalization).deleteObserver(this);
}
void restoreNormalizationObserver()
{
if (normalization instanceof Observable) ((Observable) normalization).addObserver(this);
}
/**
* Set the normalization for this dataset.
* @param factor The normalization to apply, or null for no normalization
*/
public void setNormalization(jas.hist.normalization.Normalizer factor)
{
if (factor != normalization)
{
if (normalization instanceof Observable)
{
((Observable) normalization).deleteObserver(this);
}
normalization = factor;
if (factor instanceof Observable)
{
((Observable) normalization).addObserver(this);
}
normalizationChanged(true);
}
}
public jas.hist.normalization.Normalizer getNormalization()
{
return normalization;
}
public void setXBounds(double xmin, double xmax) {
}
abstract void normalizationChanged(boolean now);
static final long serialVersionUID = -3529869583896718619L;
jas.hist.normalization.Normalizer normalization;
int yAxisIndex;
boolean isVisible = false;
DataManager parent;
private String legendText;
private boolean showStatistics = true;
private boolean showLegend = true;
protected Overlay overlay;
/**
* Y Axis on the left of the data area
*/
public final static int YAXIS_LEFT = 0;
/**
* Y Axis on the right of the data area
*/
public final static int YAXIS_RIGHT = 1;
}