package it.albertus.cycles.gui; import org.eclipse.draw2d.LightweightSystem; import org.eclipse.jface.resource.FontRegistry; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.nebula.visualization.xygraph.dataprovider.CircularBufferDataProvider; import org.eclipse.nebula.visualization.xygraph.dataprovider.IDataProvider; import org.eclipse.nebula.visualization.xygraph.figures.Axis; import org.eclipse.nebula.visualization.xygraph.figures.Trace; import org.eclipse.nebula.visualization.xygraph.figures.Trace.PointStyle; import org.eclipse.nebula.visualization.xygraph.figures.XYGraph; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import it.albertus.cycles.model.Bike; import it.albertus.cycles.model.Torque; import it.albertus.cycles.resources.Messages; public class TorqueGraph extends Canvas { private static final String FONT_KEY_GRAPH_TITLE = "graphTitle"; private static final String FONT_KEY_AXIS_TITLE = "axisTitle"; private static final float TITLE_FONT_HEIGHT_FACTOR = 1.25f; private final Trace trace; private final double[] values; private final XYGraph xyGraph; private final Axis abscissae; private final Axis ordinates; TorqueGraph(final Composite parent, final Bike bike) { super(parent, SWT.NULL); final LightweightSystem lws = new LightweightSystem(this); xyGraph = new XYGraph(); xyGraph.setTitle(Messages.get("lbl.graph.title")); lws.setContents(xyGraph); final double[] x = new double[Torque.LENGTH]; final double[] y = new double[Torque.LENGTH]; for (short i = 0; i < bike.getTorque().getCurve().length; i++) { x[i] = ((double) Torque.getRpm(i)) / 1000; y[i] = bike.getTorque().getCurve()[i]; } final CircularBufferDataProvider traceDataProvider = new CircularBufferDataProvider(false); traceDataProvider.setBufferSize(x.length); traceDataProvider.setCurrentXDataArray(x); traceDataProvider.setCurrentYDataArray(y); final FontRegistry fontRegistry = JFaceResources.getFontRegistry(); if (!fontRegistry.hasValueFor(FONT_KEY_AXIS_TITLE)) { final Font sysFont = Display.getCurrent().getSystemFont(); fontRegistry.put(FONT_KEY_AXIS_TITLE, new FontData[] { new FontData(sysFont.getFontData()[0].getName(), sysFont.getFontData()[0].getHeight(), SWT.BOLD) }); } final Font axisTitleFont = fontRegistry.get(FONT_KEY_AXIS_TITLE); abscissae = xyGraph.getPrimaryXAxis(); abscissae.setTitle(Messages.get("lbl.graph.axis.x")); abscissae.setAutoScale(true); abscissae.setTitleFont(axisTitleFont); abscissae.setShowMajorGrid(true); ordinates = xyGraph.getPrimaryYAxis(); ordinates.setTitle(Messages.get("lbl.graph.axis.y")); ordinates.setAutoScale(true); ordinates.setTitleFont(axisTitleFont); ordinates.setShowMajorGrid(true); final Trace trc = new Trace("Torque", abscissae, ordinates, traceDataProvider); trc.setPointStyle(PointStyle.NONE); trc.setLineWidth(3); final Color traceColor; switch (bike.getType()) { case CLASS_125: traceColor = getDisplay().getSystemColor(SWT.COLOR_RED); break; case CLASS_250: traceColor = getDisplay().getSystemColor(SWT.COLOR_BLUE); break; case CLASS_500: traceColor = getDisplay().getSystemColor(SWT.COLOR_BLACK); break; default: traceColor = trc.getTraceColor(); } trc.setTraceColor(traceColor); xyGraph.addTrace(trc); xyGraph.setShowLegend(false); if (!fontRegistry.hasValueFor(FONT_KEY_GRAPH_TITLE)) { final Font sysFont = Display.getCurrent().getSystemFont(); fontRegistry.put(FONT_KEY_GRAPH_TITLE, new FontData[] { new FontData(sysFont.getFontData()[0].getName(), (int) (sysFont.getFontData()[0].getHeight() * TITLE_FONT_HEIGHT_FACTOR), SWT.BOLD) }); } xyGraph.setTitleFont(fontRegistry.get(FONT_KEY_GRAPH_TITLE)); this.trace = trc; this.values = y; } public Trace getTrace() { return trace; } public double[] getValues() { return values; } public boolean refresh() { boolean success = false; final IDataProvider dataProvider = this.trace.getDataProvider(); if (dataProvider instanceof CircularBufferDataProvider) { ((CircularBufferDataProvider) dataProvider).triggerUpdate(); success = true; } return success; } public void updateTexts() { xyGraph.setTitle(Messages.get("lbl.graph.title")); abscissae.setTitle(Messages.get("lbl.graph.axis.x")); ordinates.setTitle(Messages.get("lbl.graph.axis.y")); } public XYGraph getXyGraph() { return xyGraph; } public Axis getAbscissae() { return abscissae; } public Axis getOrdinates() { return ordinates; } }