/*- * Copyright © 2009 Diamond Light Source Ltd. * * This file is part of GDA. * * GDA is free software: you can redistribute it and/or modify it under the * terms of the GNU General Public License version 3 as published by the Free * Software Foundation. * * GDA 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 GDA. If not, see <http://www.gnu.org/licenses/>. */ package uk.ac.gda.dal.csswidgets.editparts; import org.csstudio.sds.ui.editparts.AbstractWidgetEditPart; import org.csstudio.sds.ui.editparts.IWidgetPropertyChangeHandler; import org.eclipse.draw2d.IFigure; import org.eclipse.swt.graphics.Color; import uk.ac.gda.dal.csswidgets.figures.TempCircleFigure; import uk.ac.gda.dal.csswidgets.model.TempCircleModel; public class TempCircleEditPart extends AbstractWidgetEditPart { private TempCircleFigure tempCircleFigure; private Color previousColor; @Override protected IFigure doCreateFigure() { TempCircleModel model = (TempCircleModel) getWidgetModel(); double temp = model.getTemp(); double min = model.getTempMin(); double max = model.getTempMax(); tempCircleFigure = new TempCircleFigure(heatMap(temp, min, max)); Color currentColor = heatMap(temp, min, max); previousColor = currentColor; tempCircleFigure.setLiveColor(currentColor); tempCircleFigure.setHistoryColorA(new Color(null, 255, 255, 255)); tempCircleFigure.setHistoryColorB(new Color(null, 255, 255, 255)); tempCircleFigure.setHistoryColorC(new Color(null, 255, 255, 255)); return tempCircleFigure; } @Override protected void registerPropertyChangeHandlers() { IWidgetPropertyChangeHandler handle = new IWidgetPropertyChangeHandler() { @Override public boolean handleChange(final Object oldValue, final Object newValue, final IFigure figure) { TempCircleFigure tempCircleFigure = (TempCircleFigure) figure; TempCircleModel model = (TempCircleModel) getWidgetModel(); double temp = model.getTemp(); double min = model.getTempMin(); double max = model.getTempMax(); Color currentColor = heatMap(temp, min, max); if (!compareColors(currentColor, previousColor)) { tempCircleFigure.setHistoryColorC(tempCircleFigure.getHistoryColorB()); tempCircleFigure.setHistoryColorB(tempCircleFigure.getHistoryColorA()); tempCircleFigure.setHistoryColorA(previousColor); } tempCircleFigure.setLiveColor(currentColor); previousColor = heatMap(temp, min, max); return true; } }; setPropertyChangeHandler(TempCircleModel.PROP_TEMP, handle); } public boolean compareColors(Color col1, Color col2) { boolean same = true; if (col1.getRed() != col2.getRed() || col1.getGreen() != col2.getGreen() || col1.getBlue() != col2.getBlue()) same = false; return same; } public Color heatMap(double temp, double min, double max) { Color heatMap[] = new Color[10]; heatMap[0] = new Color(null, 0, 0, 255); heatMap[1] = new Color(null, 0, 128, 255); heatMap[2] = new Color(null, 0, 255, 255); heatMap[3] = new Color(null, 0, 255, 128); heatMap[4] = new Color(null, 0, 255, 0); heatMap[5] = new Color(null, 128, 255, 0); heatMap[6] = new Color(null, 255, 255, 0); heatMap[7] = new Color(null, 255, 128, 0); heatMap[8] = new Color(null, 255, 0, 0); double factor = temp / (max - min); Color col = new Color(null, 0, 0, 0); if (factor < 0.11) col = heatMap[0]; else if (factor < 0.22) col = heatMap[1]; else if (factor < 0.33) col = heatMap[2]; else if (factor < 0.44) col = heatMap[3]; else if (factor < 0.55) col = heatMap[4]; else if (factor < 0.66) col = heatMap[5]; else if (factor < 0.77) col = heatMap[6]; else if (factor < 0.88) col = heatMap[7]; else if (factor <= 1) col = heatMap[8]; else if (factor > 1) col = heatMap[8]; return col; } }