diff options
| author | Keith Packard <keithp@keithp.com> | 2013-02-09 01:58:23 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2013-02-10 00:30:32 -0800 | 
| commit | 9839b0b62d797a8616fc66038e3f3c68e2a214d0 (patch) | |
| tree | 7fc22e0273996cc77066e0ba138d11a079347d76 | |
| parent | fd5e6b80a8be5fac7d913b97570f7e11f70a60ba (diff) | |
altosuilib: Add graphing routines from MicroPeak
Make these available for AltosUI too
Signed-off-by: Keith Packard <keithp@keithp.com>
| -rw-r--r-- | altosuilib/AltosUIDataPoint.java | 23 | ||||
| -rw-r--r-- | altosuilib/AltosUIDataSet.java | 23 | ||||
| -rw-r--r-- | altosuilib/AltosUIEnable.java | 93 | ||||
| -rw-r--r-- | altosuilib/AltosUIGraph.java | 129 | ||||
| -rw-r--r-- | altosuilib/AltosUISeries.java | 86 | ||||
| -rw-r--r-- | altosuilib/Makefile.am | 10 | 
6 files changed, 361 insertions, 3 deletions
| diff --git a/altosuilib/AltosUIDataPoint.java b/altosuilib/AltosUIDataPoint.java new file mode 100644 index 00000000..38857fd1 --- /dev/null +++ b/altosuilib/AltosUIDataPoint.java @@ -0,0 +1,23 @@ +/* + * Copyright © 2013 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package org.altusmetrum.altosuilib_1; + +public interface AltosUIDataPoint { +	public abstract double x(); +	public abstract double y(int index); +}
\ No newline at end of file diff --git a/altosuilib/AltosUIDataSet.java b/altosuilib/AltosUIDataSet.java new file mode 100644 index 00000000..6f23ef9a --- /dev/null +++ b/altosuilib/AltosUIDataSet.java @@ -0,0 +1,23 @@ +/* + * Copyright © 2013 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package org.altusmetrum.altosuilib_1; + +public interface AltosUIDataSet { +	public abstract String name(); +	public abstract Iterable<AltosUIDataPoint> dataPoints(); +} diff --git a/altosuilib/AltosUIEnable.java b/altosuilib/AltosUIEnable.java new file mode 100644 index 00000000..e5695fa0 --- /dev/null +++ b/altosuilib/AltosUIEnable.java @@ -0,0 +1,93 @@ +/* + * Copyright © 2013 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package org.altusmetrum.altosuilib_1; + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import java.io.*; +import java.util.concurrent.*; +import java.util.*; +import org.altusmetrum.altoslib_1.*; + +import org.jfree.ui.*; +import org.jfree.chart.*; +import org.jfree.chart.plot.*; +import org.jfree.chart.axis.*; +import org.jfree.chart.renderer.*; +import org.jfree.chart.renderer.xy.*; +import org.jfree.chart.labels.*; +import org.jfree.data.xy.*; +import org.jfree.data.*; + +public class AltosUIEnable extends Container { + +	Insets	il, ir; +	int	y; + +	class GraphElement implements ActionListener { +		AltosUISeries	series; +		JLabel		label; +		JRadioButton	enable; +		String		name; + +		public void actionPerformed(ActionEvent ae) { +			series.set_enable(enable.isSelected()); +		} + +		GraphElement (String name, AltosUISeries series, boolean enabled) { +			this.name = name; +			this.series = series; +			label = new JLabel(name); +			enable = new JRadioButton("Enable", enabled); +			series.set_enable(enabled);			   +			enable.addActionListener(this); +		} +	} + +	public void add(String name, AltosUISeries series, boolean enabled) { + +		GraphElement	e = new GraphElement(name, series, enabled); + +		/* Add label */ +		GridBagConstraints c = new GridBagConstraints(); +		c.gridx = 0; c.gridy = y; +		c.fill = GridBagConstraints.NONE; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = il; +		add(e.label, c); + +		/* Add radio button */ +		c = new GridBagConstraints(); +		c.gridx = 1; c.gridy = y; +		c.fill = GridBagConstraints.HORIZONTAL; +		c.anchor = GridBagConstraints.CENTER; +		c.insets = ir; +		add(e.enable, c); + +		/* Next row */ +		y++; +	} + +	public AltosUIEnable() { +		il = new Insets(4,4,4,4); +		ir = new Insets(4,4,4,4); +		y = 0; +		setLayout(new GridBagLayout()); +	} +} diff --git a/altosuilib/AltosUIGraph.java b/altosuilib/AltosUIGraph.java new file mode 100644 index 00000000..e79e36ba --- /dev/null +++ b/altosuilib/AltosUIGraph.java @@ -0,0 +1,129 @@ +/* + * Copyright © 2012 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package org.altusmetrum.altosuilib_1; + +import java.io.*; +import java.util.ArrayList; + +import java.awt.*; +import javax.swing.*; +import org.altusmetrum.altoslib_1.*; + +import org.jfree.ui.*; +import org.jfree.chart.*; +import org.jfree.chart.plot.*; +import org.jfree.chart.axis.*; +import org.jfree.chart.renderer.*; +import org.jfree.chart.renderer.xy.*; +import org.jfree.chart.labels.*; +import org.jfree.data.xy.*; +import org.jfree.data.*; + +public class AltosUIGraph implements AltosUnitsListener { + +	XYPlot				plot; +	JFreeChart			chart; +	public ChartPanel		panel; +	NumberAxis			xAxis; +	AltosUIEnable			enable; +	ArrayList<AltosUISeries>	series; +	AltosUIDataSet			dataSet; + +	static final private Color gridline_color = new Color(0, 0, 0); +	static final private Color border_color = new Color(255, 255, 255); +	static final private Color background_color = new Color(255, 255, 255); + +	public JPanel panel() { +		return panel; +	} + +	public void addSeries(int index, String label, int fetch, AltosUnits units, Color color) { +		AltosUISeries		series = new AltosUISeries(label, fetch, units, color); +		XYSeriesCollection	dataset = new XYSeriesCollection(series); + +		series.renderer.setPlot(plot); +		plot.setRangeAxis(index, series.axis); +		plot.setDataset(index, dataset); +		plot.setRenderer(index, series.renderer); +		plot.mapDatasetToRangeAxis(index, index); +		if (enable != null) +			enable.add(label, series, true); +		this.series.add(series); +	} +	 +	public void resetData() { +		for (AltosUISeries s : series) +			s.clear(); +		if (dataSet != null) { +			for (AltosUIDataPoint dataPoint : dataSet.dataPoints()) +				for (AltosUISeries s : series) +					s.add(dataPoint); +		} +	} + +	public void units_changed(boolean imperial_units) { +		for (AltosUISeries s : series) +			s.set_units(); +		resetData(); +	} + +	public void setName (String name) { +		chart.setTitle(name); +	} + +	public void setDataSet (AltosUIDataSet dataSet) { +		this.dataSet = dataSet; +		if (dataSet != null) +			setName(dataSet.name()); +		resetData(); +	} + +	public AltosUIGraph(AltosUIEnable enable) { + +		this.enable = enable; +		this.series = new ArrayList<AltosUISeries>(); + +		xAxis = new NumberAxis("Time (s)"); +		 +		xAxis.setAutoRangeIncludesZero(true); + +		plot = new XYPlot(); +		plot.setDomainAxis(xAxis); +		plot.setOrientation(PlotOrientation.VERTICAL); +		plot.setDomainPannable(true); +		plot.setRangePannable(true); + +		chart = new JFreeChart("Flight", JFreeChart.DEFAULT_TITLE_FONT, +				       plot, true); + +		ChartUtilities.applyCurrentTheme(chart); + +		plot.setDomainGridlinePaint(gridline_color); +		plot.setRangeGridlinePaint(gridline_color); +		plot.setBackgroundPaint(background_color); +		plot.setBackgroundAlpha((float) 1); + +		chart.setBackgroundPaint(background_color); +		chart.setBorderPaint(border_color); +		panel = new ChartPanel(chart); +		panel.setMouseWheelEnabled(true); +		panel.setPreferredSize(new java.awt.Dimension(800, 500)); + +		AltosPreferences.register_units_listener(this); +	} +}
\ No newline at end of file diff --git a/altosuilib/AltosUISeries.java b/altosuilib/AltosUISeries.java new file mode 100644 index 00000000..fe2c982b --- /dev/null +++ b/altosuilib/AltosUISeries.java @@ -0,0 +1,86 @@ +/* + * Copyright © 2013 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package org.altusmetrum.altosuilib_1; + +import java.io.*; +import java.util.ArrayList; + +import java.awt.*; +import javax.swing.*; +import org.altusmetrum.altoslib_1.*; + +import org.jfree.ui.*; +import org.jfree.chart.*; +import org.jfree.chart.plot.*; +import org.jfree.chart.axis.*; +import org.jfree.chart.renderer.*; +import org.jfree.chart.renderer.xy.*; +import org.jfree.chart.labels.*; +import org.jfree.data.xy.*; +import org.jfree.data.*; + +public class AltosUISeries extends XYSeries { +	NumberAxis	axis; +	String		label; +	AltosUnits	units; +	Color		color; +	XYItemRenderer	renderer; +	int		fetch; +	 +	void set_units() { +		String	units_string = units.show_units(); +		axis.setLabel(String.format("%s (%s)", label, units_string)); + +		StandardXYToolTipGenerator	ttg; + +		String  example = units.graph_format(4); + +		ttg = new StandardXYToolTipGenerator(String.format("{1}s: {2}%s ({0})", units_string), +						     new java.text.DecimalFormat(example), +						     new java.text.DecimalFormat(example)); +		renderer.setBaseToolTipGenerator(ttg); +	} + +	void set_enable(boolean enable) { +		renderer.setSeriesVisible(0, enable); +		axis.setVisible(enable); +	} + +	public void add(AltosUIDataPoint dataPoint) { +		super.add(dataPoint.x(), dataPoint.y(fetch)); +	} + +	public void set_axis(NumberAxis axis) { +		this.axis = axis; +	} + +	public AltosUISeries (String label, int fetch, AltosUnits units, Color color) { +		super(label); +		this.label = label; +		this.fetch = fetch; +		this.units = units; +		this.color = color; + +		axis = new NumberAxis(); +		axis.setLabelPaint(color); +		axis.setTickLabelPaint(color); + +		renderer = new XYLineAndShapeRenderer(true, false); +		renderer.setSeriesPaint(0, color); +	} +} diff --git a/altosuilib/Makefile.am b/altosuilib/Makefile.am index 25d5722e..e338b7cd 100644 --- a/altosuilib/Makefile.am +++ b/altosuilib/Makefile.am @@ -9,20 +9,24 @@ SRC=.  altosuilibdir = $(datadir)/java  altosuilib_JAVA = \ -	AltosUIConfigure.java \  	AltosDevice.java \  	AltosDeviceDialog.java \ -	AltosUSBDevice.java \  	AltosFontListener.java \  	AltosPositionListener.java \ +	AltosUIConfigure.java \ +	AltosUIDataPoint.java \ +	AltosUIDataSet.java \ +	AltosUIGraph.java \  	AltosUIDialog.java \ +	AltosUIEnable.java \  	AltosUIFrame.java \  	AltosUILib.java \  	AltosUIListener.java \  	AltosUIPreferencesBackend.java \  	AltosUIPreferences.java \ +	AltosUISeries.java \  	AltosUIVersion.java \ -	AltosUnitsListener.java +	AltosUSBDevice.java  JAR=altosuilib_$(ALTOSUILIB_VERSION).jar | 
