/******************************************************************************* * Copyright (c) 2015, Daniel Ludin * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Daniel Ludin (ludin@hispeed.ch) - initial implementation *******************************************************************************/ package ch.gpb.elexis.cst.widget; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.FontMetrics; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; import ch.elexis.core.ui.UiDesk; import ch.gpb.elexis.cst.Activator; /** * * @author daniel * created: 11.01.2015 * * Custom Widget for the display of values within a defined range * */ public class CstDangerRangeCanvas extends CstCanvas { double dRangeStart; double dRangeEnd; double dValue; String alphanumValue; int iLenScale; Image marker; Image verlaufRl; Image verlaufLr; Image pointer; int xoffset; int yoffset; int iPixLen; String title; String sDate; public CstDangerRangeCanvas(Composite parent, boolean a4Quer, int style, double dRangeStart, double dRangeEnd, double dValue, String sValue, String title, String date) { super(parent, style); this.dRangeStart = dRangeStart; this.dRangeEnd = dRangeEnd; this.dValue = dValue; this.title = title; this.sDate = date; this.alphanumValue = sValue; // 1123 - 794 = 329 if (a4Quer) { iPixLen = 809; } else { iPixLen = 480; } xoffset = 4; yoffset = 12; pointer = UiDesk.getImage(Activator.IMG_POINTER_NAME); addPaintListener(new PaintListener() { public void paintControl(PaintEvent e) { CstDangerRangeCanvas.this.paintControl(e); } }); } public Point computeSize(int wHint, int hHint, boolean changed) { return new Point(iPixLen + 50, 36); } void paintControl(PaintEvent e) { GC gc = e.gc; gc.setFont(fontA); // der Anzeigebereich wird mit dem h�chsten Wert berechnet, zB wenn // RangeEnd gr�sser als der eigentlich Wert ist, nimmt man diesen // ceilValue = 10 hoch Anzahl Stellen vor dem Komma von value double dTmp = dValue; if (dValue < dRangeEnd) { dTmp = dRangeEnd; } double rTmp = Math.round(dTmp); //System.out.println("========================"); //System.out.println("rTmp : " + rTmp); double dAnzeigeBereich; // Wenn bereits das Aufrunden des h�chsten Wertes eine 10er Potenz // ergibt, soll dieser als Anzeigebereich gelten. if (rTmp % 10 == 0) { dAnzeigeBereich = rTmp; //System.out.println("Runden ergibt 10er Potenz"); } else { dAnzeigeBereich = dTmp * 1.2; } //System.out.println("dAnzeigeBereich : " + dAnzeigeBereich); // compute a factor for the x-offset double xFac = iPixLen / dAnzeigeBereich; //System.out.println("val: " + dValue); //System.out.println("fac: " + fac); gc.setBackground(ORANGE); gc.fillRectangle(xoffset, yoffset, iPixLen, 10); int greenStart = 0; int greenEnd = 0; if (dRangeStart > 0) { greenStart = new Double(Math.round(xFac * dRangeStart)).intValue(); } greenEnd = new Double(xFac * dRangeEnd).intValue(); gc.setBackground(BRIGHTGREEN); gc.fillRectangle(xoffset + greenStart, yoffset, (greenEnd - greenStart), 10); gc.setForeground(ORANGE); if (dRangeStart > 0) { //System.out.println("end x/xLenToFill: " + (xoffset + greenEnd - 20) + " / " + xLenToFill); gc.fillGradientRectangle(xoffset + greenStart, yoffset, 40, 10, false); //System.out.println("Verlauf links xoff/yoff/xlen: "+ (xoffset + greenStart-20) + " / " + yoffset +" / "+ ((greenEnd - greenStart)+20)); } gc.setForeground(BRIGHTGREEN); gc.setBackground(ORANGE); int xLenToFill = iPixLen - (greenEnd - 20); //System.out.println("end x/xLenToFill: " + (xoffset + greenEnd - 20) + " / " + xLenToFill); try { gc.fillGradientRectangle((xoffset + greenEnd - 20), yoffset, xLenToFill, 10, false); } catch (Exception e1) { e1.printStackTrace(); log.error("DangerRangeCanvas error: " + "greenEnd:" + greenEnd + " xLenToFill: " + xLenToFill + " " + "title: " + title + " " + e1.getMessage()); } gc.setForeground(BLACK); //if (!alphanumValue.matches("(?i)(.*)[neg|pos|norm](.*)")) { if (!(alphanumValue.toLowerCase().indexOf("neg") > -1 || alphanumValue.toLowerCase().indexOf("norm") > -1 || alphanumValue.toLowerCase().indexOf("pos") > -1 || alphanumValue.toLowerCase().indexOf("-") > -1 || alphanumValue.toLowerCase().indexOf("+") > -1)) { gc.drawString(">" + String.valueOf(dRangeEnd), xoffset + greenEnd, yoffset - 2, true); } if (this.title != null) { gc.drawString(title + " (" + sDate + ")", xoffset + 2, yoffset - 13, true); } else { gc.drawString("[title missing] (" + sDate + ")", xoffset + 2, yoffset - 13, true); } if (dRangeStart > 0) { gc.drawString("< " + String.valueOf(dRangeStart), xoffset + greenStart, yoffset - 2, true); } int posM = new Double(Math.round(xFac * dValue)).intValue(); // draw a Rect as pointer // draw the value String sValue = String.valueOf(dValue); // TODO: compute the pixel width of the value string int iLenValue = 4; //if (alphanumValue.matches("(?i)(.*)[neg|norm](.*)")) { FontMetrics fm = gc.getFontMetrics(); Point pt = gc.textExtent(alphanumValue); if (alphanumValue.toLowerCase().indexOf("pos") > -1 || alphanumValue.toLowerCase().indexOf("+") > -1) { String sDisplay = alphanumValue; if (sDisplay.indexOf("+") > -1) { sDisplay = "positiv"; } gc.drawString(sDisplay, iPixLen - pt.x - 20, yoffset - iLenValue + 1, true); } else if (alphanumValue.toLowerCase().indexOf("neg") > -1 || alphanumValue.toLowerCase().indexOf("norm") > -1 || alphanumValue.toLowerCase().indexOf("-") > -1) { /* if (alphanumValue != null && (alphanumValue.toLowerCase().indexOf("pos") > -1 || alphanumValue.toLowerCase().indexOf("neg") > -1 || alphanumValue.toLowerCase().indexOf("norm") > -1)) { */ String sDisplay = alphanumValue; if (sDisplay.indexOf("-") > -1) { sDisplay = "negativ"; } gc.drawString(sDisplay, xoffset + posM, yoffset - iLenValue + 1, true); } else { if (dValue > 0) { gc.drawString(sValue, xoffset + posM, yoffset + 14 - iLenValue, true); // draw the pointer icon gc.drawImage(pointer, xoffset + posM - 6, yoffset + 14 - iLenValue - 14); } } } public double getRangeStart() { return dRangeStart; } public void setRangeStart(double rangeStart) { this.dRangeStart = rangeStart; } public double getRangeEnd() { return dRangeEnd; } public void setRangeEnd(double rangeEnd) { this.dRangeEnd = rangeEnd; } public double getValue() { return dValue; } public void setValue(double value) { this.dValue = value; } public int getlScale() { return iLenScale; } public void setlScale(int lScale) { this.iLenScale = lScale; } }