package jas.hist; import jas.plot.DataArea; import jas.plot.Legend; import java.awt.Component; import java.awt.event.ActionEvent; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Enumeration; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.SwingUtilities; abstract class OneDDataManager extends SliceableDataManager { OneDDataManager(JASHist plot, DataArea da, Legend l, StatisticsBlock stats) { super(plot, da,l, stats); } protected transient double xLow; protected transient double xHigh; JASHistData add(DataSource ds) { JASHistData dw = new JASHist1DHistogramData(this,ds); data.addElement(dw); return dw; } void modifyPopupMenu(final JPopupMenu menu, final Component source) { final JMenuItem outline = new HistMenuItem("Show Histogram Bars", "ShowHistogramBars"); final JMenuItem fill = new HistMenuItem("Fill Histogram Bars", "HistogramFill"); final JMenuItem error = new HistMenuItem("Show Error Bars", "ShowErrorBars"); final JMenuItem lines = new HistMenuItem("Draw Lines Between Points", "ShowLinesBetweenPoints"); final JMenuItem symbols = new HistMenuItem("Show Data Points", "ShowDataPoints"); if (menu.getComponentCount() > 0) menu.addSeparator(); menu.add(outline); menu.add(fill); menu.add(error); menu.add(lines); menu.add(symbols); if (fill.isEnabled()) fill.setEnabled(outline.isSelected()); } final protected void doUpdate() { if (isInit) { if (xm.needsAttention()) { computeXAxisRange(); XAxisUpdated(); } computeYAxisRange(); stats.repaint(); da.repaint(); } } public void update(final HistogramUpdate hu, final JASHistData data) { // Danger: likely to be run in a different thread //if (hu.isReset()) //parent.resetNumberOfBins(this); int index = data.getYAxis(); if (hu.isRangeUpdate() || hu.isReset()) xm.setAttentionNeeded(); else ym[index].setAttentionNeeded(); if (hu.isFinalUpdate() || hu.isReset()) { SwingUtilities.invokeLater(this); if (hu.isReset()) // When we get a reset we have to abandon all assumptions // about the data. We may have to create a new data manager // (because a reset is sent when the partition changes) // and inform JASHist somehow, but this has not yet been // implemented. For now, we will make sure that the // isFixed flag is correct in the x axis managed axis // because that is currently the only instance where // a reset is sent. We also check if the number of bins is set. // We also set rangeAutomatic. { // SwingUtilities.invokeLater(new Runnable() // { // final public void run() // { //final boolean isRebinnable = ((Rebinnable1DHistogramData) data.getDataSource()).isRebinnable(); DataSource dataSource = data.getDataSource(); final boolean isRebinnable = (dataSource instanceof Rebinnable1DHistogramData) ? ((Rebinnable1DHistogramData) dataSource).isRebinnable() : false; xm.setFixed(!isRebinnable); xm.setRangeAutomatic(isRebinnable); // } // }); } } else timer.start(); } final void axisChanged(final JASHistData data) { int index = data.getYAxis(); if (ym[index] == null) createYAxis(index); else ym[index].setAttentionNeeded(); // BUG: What about the OLD y-axis, doesnt it need attention? SwingUtilities.invokeLater(this); } void styleUpdate(JASHistData data) { int index = data.getYAxis(); if (ym[index] == null) createYAxis(index); else ym[index].setAttentionNeeded();// BUG: What about the OLD y-axis, doesnt it need attention? SwingUtilities.invokeLater(this); } private final class HistMenuItem extends JCheckBoxMenuItem { HistMenuItem(final String menuLabel, final String methodRoot) { super(menuLabel); if (numberOfDataSources() > 0) { try { m_methodRoot = methodRoot; final Method get = JASHist1DHistogramStyle.class.getMethod("get".concat(methodRoot), new Class[0]); boolean selected = true; final Enumeration e = getDataSources(); final Object[] emptyList = new Object[0]; while (selected && e.hasMoreElements()) selected = ((Boolean) get.invoke(((JASHistData) e.nextElement()).getStyle(), emptyList)).booleanValue(); setSelected(selected); } catch (NoSuchMethodException x) { setEnabled(false); setSelected(false); } catch (IllegalAccessException x) { setEnabled(false); setSelected(false); } catch (InvocationTargetException x) { setEnabled(false); setSelected(false); } } else { setEnabled(false); setSelected(false); } } protected void fireActionPerformed(final ActionEvent event) { final Class[] booleanList = { boolean.class }; try { final Method set = JASHist1DHistogramStyle.class.getMethod("set".concat(m_methodRoot), booleanList); final Object[] arg = { new Boolean(isSelected()) }; final Enumeration enumer = getDataSources(); while (enumer.hasMoreElements()) { try { set.invoke(((JASHistData) enumer.nextElement()).getStyle(), arg); } catch (final Exception exception) { } } } catch (final Exception exception) { } } private String m_methodRoot; } }