package com.opcoach.ecf2014.engine.ui.parts; import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.inject.Named; import org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.Label; import org.eclipse.draw2d.LightweightSystem; import org.eclipse.draw2d.PositionConstants; import org.eclipse.draw2d.XYLayout; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.e4.core.contexts.ContextInjectionFactory; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.core.di.annotations.Optional; import org.eclipse.e4.ui.di.Focus; import org.eclipse.e4.ui.di.UISynchronize; import org.eclipse.e4.ui.model.application.MApplication; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.nebula.visualization.widgets.figures.GaugeFigure; import org.eclipse.nebula.visualization.xygraph.util.XYGraphMediaFactory; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; import com.opcoach.ecf2014.engine.core.EngineSimulator; import com.opcoach.ecf2014.engine.core.EngineWatcher; public class DashBoard { private GaugeFigure speedCounter; private GaugeFigure rpmCounter; private XYGraphMediaFactory gmfactory; private static final int COUNTER_SIZE = 200; private static final int COUNTER_MARGIN = 15; private Canvas canvas; @Inject public DashBoard(MApplication appli) { // We will use the application context to store and inject values. IEclipseContext appliContext = appli.getContext(); // We also need an ImageRegistry for the application appliContext.set(ImageRegistry.class, new ImageRegistry()); // Step 5 : create and start Engine. EngineSimulator simu = ContextInjectionFactory.make(EngineSimulator.class, appliContext); appliContext.set(EngineSimulator.class, simu); // Step 8 : create the engine alarm watcher and keep a reference on it ! EngineWatcher watcher = ContextInjectionFactory.make(EngineWatcher.class, appliContext); appliContext.set(EngineWatcher.class, watcher); } @Inject @Optional public void listenToRpmValue(final @Named(EngineSimulator.ENGINE_RPM_VALUE) int value, UISynchronize sync) { if (rpmCounter != null) sync.asyncExec(new Runnable() { @Override public void run() { rpmCounter.setValue(value); } }); } @Optional @Inject public void listenToSpeedValue(final @Named(EngineSimulator.ENGINE_SPEED_VALUE) int value, UISynchronize sync) { if (speedCounter != null) sync.asyncExec(new Runnable() { @Override public void run() { speedCounter.setValue(value); } }); } @PostConstruct public void postConstruct(Composite parent, IEclipseContext ctx) { // Create the canvas and the related LightweightSystem for Draw2D canvas = new Canvas(parent, SWT.NONE); final LightweightSystem lws = new LightweightSystem(canvas); // Create a main figure to contain the 2 counters and the 2 labels IFigure root = new Figure(); root.setLayoutManager(new XYLayout()); root.setBackgroundColor(ColorConstants.lightBlue); rpmCounter = createRpmCounter(); rpmCounter.setBounds(new Rectangle(COUNTER_MARGIN,COUNTER_MARGIN,COUNTER_SIZE, COUNTER_SIZE)); root.add(rpmCounter); speedCounter = createSpeedCounter(); speedCounter.setBounds(new Rectangle(COUNTER_MARGIN*2 + COUNTER_SIZE, COUNTER_MARGIN,COUNTER_SIZE, COUNTER_SIZE)); root.add(speedCounter); // Add two titles under the counters. Label rpmTitle = new Label(); rpmTitle.setText("Rpm"); rpmTitle.setLabelAlignment(PositionConstants.CENTER); rpmTitle.setBounds(new Rectangle(COUNTER_MARGIN, COUNTER_SIZE + COUNTER_MARGIN,COUNTER_SIZE, 20)); root.add(rpmTitle); Label speedTitle = new Label(); speedTitle.setText("Speed"); speedTitle.setLabelAlignment(PositionConstants.CENTER); speedTitle.setBounds(new Rectangle(COUNTER_SIZE + 2*COUNTER_MARGIN, COUNTER_SIZE + COUNTER_MARGIN,COUNTER_SIZE, 20)); root.add(speedTitle); // Set the root figure. lws.setContents(root); } private GaugeFigure createSpeedCounter() { final GaugeFigure gaugeFigure = new GaugeFigure(); // Init gauge gaugeFigure.setBackgroundColor(XYGraphMediaFactory.getInstance().getColor(255, 255, 255)); gaugeFigure.setForegroundColor(XYGraphMediaFactory.getInstance().getColor(0, 0, 0)); gaugeFigure.setRange(0, 220); gaugeFigure.setLoLevel(10); gaugeFigure.setLoloLevel(0); gaugeFigure.setHiLevel(130); gaugeFigure.setHihiLevel(180); gaugeFigure.setMajorTickMarkStepHint(50); gaugeFigure.setValue(60); return gaugeFigure; } private GaugeFigure createRpmCounter() { final GaugeFigure rpmFigure = new GaugeFigure(); gmfactory = XYGraphMediaFactory.getInstance(); rpmFigure.setBackgroundColor(gmfactory.getColor(0, 0, 0)); rpmFigure.setForegroundColor(gmfactory.getColor(255, 255, 255)); rpmFigure.setRange(0, 8000); rpmFigure.setLoLevel(1000); rpmFigure.setLoloLevel(500); rpmFigure.setHiLevel(4000); rpmFigure.setHiColor(gmfactory.getColor(128, 255, 255)); rpmFigure.setHihiColor(gmfactory.getColor(128, 255, 255)); rpmFigure.setHihiLevel(5000); rpmFigure.setMajorTickMarkStepHint(100); rpmFigure.setEffect3D(true); rpmFigure.setValue(2000); rpmFigure.setNeedleColor(gmfactory.getColor(50, 50, 255)); return rpmFigure; } @Focus public void onFocus() { canvas.setFocus(); } }