/*******************************************************************************
* 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 java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import ch.gpb.elexis.cst.data.ValueFinding;
import ch.gpb.elexis.cst.preferences.Messages;
import ch.gpb.elexis.cst.service.CstService;
public class CstVorwertCanvas extends CstCanvas {
//Image pointer;
ValueFinding finding;
int iPixX = 480;
int iPixY = 60;
int xoffBase = 4;
int yoffBase = 80;
List<ValueFinding> findings = new ArrayList<ValueFinding>();
public CstVorwertCanvas(Composite parent, boolean a4Quer, int style) {
super(parent, style);
setBackground(WHITE);
if (a4Quer) {
iPixX = 810;
} else {
iPixX = 480;
}
parent.setSize(iPixX, 600);
addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
CstVorwertCanvas.this.paintControl(e);
}
});
}
public double getHightestValue() {
double highest = 0;
for (ValueFinding finding : getFindings()) {
if (finding.getValue() > highest) {
highest = finding.getValue();
}
}
return highest;
}
void paintControl(PaintEvent e) {
GC gc = e.gc;
gc.setFont(fontA);
if (findings == null || findings.size() == 0) {
gc.drawText(Messages.Cst_Text_keine_vorwerte, 20, 20);
return;
}
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
// compute nr of days between lowest and highest date
Date dStart = findings.get(0).getDateOfFinding();
Date dEnd = findings.get(findings.size() - 1).getDateOfFinding();
long totalSpan = getNrOfDaysBetween(dStart, dEnd);
gc.setBackground(ORANGE);
// draw the x base line
gc.setForeground(GRAY);
gc.drawRectangle(xoffBase, yoffBase, iPixX, 1);
double dRefFend = findings.get(0).getRefFend();
double dRefMend = findings.get(0).getRefMend();
double dRefFstart = findings.get(0).getRefFstart();
double dRefMstart = findings.get(0).getRefMstart();
double maxRef = Math.max(dRefFend, dRefMend);
double yFactor = new Double(iPixY).doubleValue() / Math.max(getHightestValue(), maxRef);
int iOffYtopM = new Double(dRefMend * yFactor).intValue();
int iOffYtopF = new Double(dRefFend * yFactor).intValue();
int iOffYbottomM = new Double(dRefMstart * yFactor).intValue();
int iOffYbottomF = new Double(dRefFstart * yFactor).intValue();
// draw top range line and value Male
gc.setForeground(BRIGHTGREEN);
if (dRefMend > 0) {
gc.drawLine(xoffBase, yoffBase - iOffYtopM, iPixX, yoffBase - iOffYtopM);
gc.drawText(String.valueOf(dRefMend), iPixX + 25, yoffBase - iOffYtopM - 6, true);
}
// draw bottom range line and value Male
if (dRefMstart > 0) {
gc.drawLine(xoffBase, yoffBase - iOffYbottomM, iPixX, yoffBase - iOffYbottomM);
gc.drawText(String.valueOf(dRefMstart), iPixX + 25, yoffBase - iOffYbottomM - 6, true);
}
// draw top range line and value Female
gc.setForeground(ORANGE);
if (dRefFend > 0) {
gc.drawLine(xoffBase, yoffBase - iOffYtopF, iPixX, yoffBase - iOffYtopF);
gc.drawText(String.valueOf(dRefFend), iPixX + 25, yoffBase - iOffYtopF - 6, true);
}
// draw bottom range line and value Female
if (dRefFstart > 0) {
gc.drawLine(xoffBase, yoffBase - iOffYbottomF, iPixX, yoffBase - iOffYbottomF);
gc.drawText(String.valueOf(dRefFstart), iPixX + 25, yoffBase - iOffYbottomF - 6, true);
}
gc.setBackground(GRAY);
int xoff = 0;
double xFactor = new Double(iPixX).doubleValue() / new Double(totalSpan).doubleValue();
gc.setForeground(BLACK);
for (int x = 0; x < findings.size(); x++) {
ValueFinding finding = findings.get(x);
int yoff = 0;
if (x % 2 == 0) {
yoff = 8;
}
String date = sdf.format(finding.getDateOfFinding());
gc.drawText(date, xoffBase + new Double(xoff * xFactor).intValue(), yoffBase + yoff + 4, true);
// je gr�sser corrY desto h�her wandert der Text
int corrY = 10;
if (!(finding.getParam().toLowerCase().indexOf("neg") > -1 ||
finding.getParam().toLowerCase().indexOf("norm") > -1 ||
finding.getParam().toLowerCase().indexOf("pos") > -1 ||
finding.getParam().toLowerCase().indexOf("+") > -1 || finding.getParam().toLowerCase().indexOf("-") > -1)) {
gc.drawText(String.valueOf(finding.getValue()), xoffBase + new Double(xoff * xFactor).intValue(),
yoffBase
- new Double(finding.getValue() * yFactor).intValue() - corrY, true);
}
else {
String sDisplay = finding.getParam();
if (sDisplay.indexOf("-") > -1) {
sDisplay = "negativ";
} else if (sDisplay.indexOf("+") > -1) {
sDisplay = "positiv";
}
gc.drawText(sDisplay, xoffBase + new Double(xoff * xFactor).intValue(),
yoffBase - 12 - corrY, true);
}
if (x < findings.size() - 1) {
long lSpan = getNrOfDaysBetween(findings.get(0).getDateOfFinding(), findings.get(x + 1)
.getDateOfFinding());
xoff = new Long(lSpan).intValue();
}
}
gc.dispose();
}
private long getNrOfDaysBetween(Date dStart, Date dEnd) {
long diff = dEnd.getTime() - dStart.getTime();
long days = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);
return days;
}
public Point computeSize(int wHint, int hHint, boolean changed) {
return new Point(iPixX + 50, 30 + yoffBase);
}
public ValueFinding getFinding() {
return finding;
}
public void setFinding(ValueFinding finding) {
this.finding = finding;
}
public List<ValueFinding> getFindings() {
return findings;
}
public void setFindings(List<ValueFinding> findings) {
this.findings = findings;
Collections.sort(this.findings, new FindingsComparable());
}
public class FindingsComparable implements Comparator<ValueFinding> {
@Override
public int compare(ValueFinding o1, ValueFinding o2) {
return o1.getDateOfFinding().compareTo(o2.getDateOfFinding());
}
}
@Override
public String toString() {
//return super.toString();
StringBuffer result = new StringBuffer();
result.append("");
for (ValueFinding finding : getFindings()) {
result.append("(" + CstService.getCompactFromDate(finding.getDateOfFinding()) + ":" + finding.getValue()
+ ")");
}
return result.toString();
}
}