package jas.hist; import jas.plot.DataArea; import jas.plot.DataAreaLayout; import jas.plot.Legend; import jas.plot.LegendEntry; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.io.ObjectInputStream; import java.util.Enumeration; import java.util.Vector; import javax.swing.JMenu; import javax.swing.SwingUtilities; import javax.swing.Timer; abstract class AbstractDataManager extends DataManager implements Runnable { AbstractDataManager(JASHist plot, DataArea da, Legend l, StatisticsBlock stats) { super(plot,da); this.legend = l; this.stats = stats; nVisible = 0; nVisibleLegend = 0; xm.setFixed(false); xm.setRangeAutomatic(true); ym[0].setFixed(false); ym[0].setRangeAutomatic(true); timer = new Timer(1000,new ActionListener() { public void actionPerformed(ActionEvent e) { doUpdate(); } }); timer.setRepeats(false); } void init() { computeXAxisRange(); XAxisUpdated(); computeYAxisRange(); // Add a mouse listener to the Axes //new AxisListener(xAxis); //new AxisListener(yAxis); isInit = true; } final void invalidate() { if (isInit) SwingUtilities.invokeLater(this); } final public void run() { doUpdate(); } boolean isRealized() { return isInit; } void setRealized(boolean b) { isInit = b; } void requestShow(JASHistData data) { da.add(data.getOverlay()); nVisible++; if (legend != null) { LegendEntry le = data.getLegendEntry(); if (le != null) { legend.add(le); nVisibleLegend++; showLegend(); } } if (stats != null) { stats.add(data); } if (isInit) { xm.setAttentionNeeded(); computeXAxisRange(); XAxisUpdated(); computeYAxisRange(); da.validate(); da.repaint(); } } void requestHide(JASHistData data) { da.remove(data.getOverlay()); nVisible--; if (legend != null) { LegendEntry le = data.getLegendEntry(); if (le != null) { legend.remove(le); nVisibleLegend--; showLegend(); } } if (stats != null) { stats.remove(data); } if (isInit) { xm.setAttentionNeeded(); computeXAxisRange(); XAxisUpdated(); computeYAxisRange(); da.validate(); da.repaint(); } } protected void showLegend() { int showLegend = plot.getShowLegend(); boolean show = (showLegend == JASHist.LEGEND_ALWAYS) || ( showLegend == JASHist.LEGEND_AUTOMATIC && nVisibleLegend>1 ); legend.setVisible(show); legend.revalidate(); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); timer = new Timer(1000,new ActionListener() { public void actionPerformed(ActionEvent e) { doUpdate(); } }); timer.setRepeats(false); da.add(xm, DataAreaLayout.X_AXIS); da.add(ym[0], DataAreaLayout.Y_AXIS_LEFT); da.add(ym[1], DataAreaLayout.Y_AXIS_RIGHT); } transient protected Timer timer; transient protected boolean isInit = false; protected Legend legend; protected StatisticsBlock stats; transient protected int nVisible; transient protected int nVisibleLegend; protected transient Vector data = new Vector(); abstract void doUpdate(); void remove(JASHistData d) { d.show(false); d.deleteNormalizationObserver(); data.removeElement(d); } int numberOfDataSources() { return data.size(); } void destroy() // detaches data, but doesn't set up the plot for further use { final Enumeration e = data.elements(); while (e.hasMoreElements()) { JASHistData d = (JASHistData) e.nextElement(); d.show(false); d.deleteNormalizationObserver(); } data.removeAllElements(); destroyYAxis(1); // In case second Y Axis was created stats.clear(); } Enumeration getDataSources() { return data.elements(); } JMenu addPerDataSourceMenu(String name, DataSourceMenuFactory f) { int n = numberOfDataSources(); if (n == 0) { JMenu result = new JMenu(name); result.setEnabled(false); return result; } if (n == 1) { JASHistData ds = (JASHistData) getDataSources().nextElement(); return f.createMenu(name,ds); } else { JMenu result = new JMenu(name); Enumeration e = getDataSources(); for (int i=0; e.hasMoreElements(); i++) { JASHistData ds = (JASHistData) e.nextElement(); JMenu sub = f.createMenu(ds.getTitle(),ds); sub.setMnemonic('0' + (char) i); result.add(sub); } return result; } } }