package jas.hist;
import jas.plot.Axis;
import jas.plot.DataArea;
import jas.plot.DataAreaLayout;
import jas.plot.DoubleAxis;
import jas.plot.EditableLabel;
import java.awt.Component;
import java.util.Enumeration;
import java.util.NoSuchElementException;
import javax.swing.JPopupMenu;
/**
* The Data Manager is used to control overlaying of multiple data sets
* on a single plot. There are many different subclasses of data manager
* to handle different types of plots and data. The Data Manager is also
* responsible for coordinating the update of displays when the data source
* changes.
* @author Tony Johnson
*/
abstract class DataManager
{
DataManager(JASHist plot, DataArea da)
{
this.plot = plot;
this.da = da;
da.setSpecialComponent(null);
this.xm = (ManagedAxis) da.getXAxis();
this.ym[0] = (ManagedAxis) da.getYAxis();
}
JASHist getPlot()
{
return plot;
}
abstract void init();
abstract JASHistData add(DataSource data);
abstract void remove(JASHistData data);
abstract void requestShow(JASHistData data);
abstract void requestHide(JASHistData data);
abstract void invalidate();
abstract boolean isRealized();
abstract void setRealized(boolean b);
abstract void XAxisUpdated();
abstract void computeYAxisRange();
abstract void computeXAxisRange();
abstract void update(HistogramUpdate update, JASHistData data);
abstract int numberOfDataSources();
abstract Enumeration getDataSources();
abstract void destroy();
abstract void modifyPopupMenu(JPopupMenu menu, Component source);
abstract protected void showLegend();
// For the below two functions, the argument JASHistData will always be either
// JASHist1DHistogramData or JASHistScatterPlotData (but never JASHist1DFunctionData)
// When the axis or style changes for a function, update(JASHist1DFunctionData) is called.
abstract void styleUpdate(JASHistData source);
abstract void axisChanged(JASHistData source);
public EditableLabel getLabel(Axis m)
{
return da.getLabel(m);
}
public void setLabel(Axis m, EditableLabel l)
{
da.setLabel(m,l);
}
JASHistAxis getXAxis()
{
return xm;
}
JASHistAxis[] getYAxes()
{
return ym;
}
JASHistAxis getYAxis(int index)
{
if (index >= ym.length) throw new IllegalArgumentException("Y axis index out of range");
if (ym[index] == null) createYAxis(index);
return ym[index];
}
protected void createYAxis(int index)
{
ym[index] = new ManagedAxis(this,Axis.VERTICAL,true);
DoubleAxis a = (DoubleAxis) ym[index].getType();
a.setUseSuggestedRange(true);
ym[index].setOnLeftSide(false);
da.add(ym[index],DataAreaLayout.Y_AXIS_RIGHT);
da.revalidate();
}
protected void destroyYAxis(int index)
{
if (ym[index] != null) da.remove(ym[index]);
da.revalidate();
}
protected final static Enumeration nullEnumeration = new NullEnumeration();
final private static class NullEnumeration implements Enumeration
{
public boolean hasMoreElements()
{
return false;
}
public Object nextElement()
{
throw new NoSuchElementException();
}
}
protected ManagedAxis xm;
protected ManagedAxis[] ym = new ManagedAxis[2];
final protected JASHist plot;
final protected DataArea da;
}