/*******************************************************************************
* Copyright (c) 2009-2010, A. Kaufmann and Elexis
* 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:
* G. Weirich - initial implementation
* A. Kaufmann - copied from befunde-Plugin and adapted to new data structure
* G. Weirich - adapted to Eventhandling API Change in 2.1
* M. Descher - added copy function for value, added CSV Export for a Table
* P. Chaubert - adapted to Messwerte V2
* medshare GmbH - adapted to Messwerte V2.1 in February 2012
*
*******************************************************************************/
package com.hilotec.elexis.messwerte.v2.views;
import java.io.File;
import java.io.FileWriter;
import java.text.MessageFormat;
import java.util.ArrayList;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.part.ViewPart;
import ch.elexis.core.data.events.ElexisEvent;
import ch.elexis.core.data.events.ElexisEventDispatcher;
import ch.elexis.core.data.events.ElexisEventListener;
import ch.elexis.core.ui.UiDesk;
import ch.elexis.core.ui.icons.Images;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.core.ui.util.ViewMenus;
import ch.elexis.data.Patient;
import ch.rgw.tools.TimeTool;
import com.hilotec.elexis.messwerte.v2.data.Messung;
import com.hilotec.elexis.messwerte.v2.data.MessungKonfiguration;
import com.hilotec.elexis.messwerte.v2.data.MessungTyp;
import com.hilotec.elexis.messwerte.v2.data.Messwert;
import com.hilotec.elexis.messwerte.v2.data.typen.IMesswertTyp;
/**
* View fuer Uebersicht ueber alle Messungen des aktuellen Patienten
*
* @author Antoine Kaufmann
*
*/
public class MessungenUebersichtV20 extends ViewPart implements ElexisEventListener {
private final MessungKonfiguration config;
private ScrolledForm form;
private final ArrayList<MessungstypSeite> seiten;
private CTabFolder tabsfolder;
private Action neuAktion;
private Action editAktion;
private Action copyAktion;
private Action loeschenAktion;
private Action exportAktion;
private Action reloadXMLAction;
public MessungenUebersichtV20(){
config = MessungKonfiguration.getInstance();
config.readFromXML(null);
seiten = new ArrayList<MessungstypSeite>();
}
/**
* Ein einzelner Tab fuer einen bestimmten Messungstyp. In diesem wird dann eine Tabelle mit
* allen Messungen des aktuell ausgewaehlten Patienten angezeigt.
*
* @author Antoine Kaufmann
*
*/
class MessungstypSeite extends Composite {
private final MessungTyp typ;
private final Table table;
private final TableColumn cols[];
private Patient patient;
/**
* Einzelnes Tab fuer einen bestimmten Typ Messungen mit Tabelle der Messwerte.
*
* @param dt
* Typ der Messungen
*/
public MessungstypSeite(Composite parent, MessungTyp dt){
super(parent, SWT.NONE);
typ = dt;
parent.setLayout(new FillLayout());
setLayout(new GridLayout());
table = new Table(this, SWT.FULL_SELECTION | SWT.V_SCROLL);
table.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
table.setHeaderVisible(true);
table.setLinesVisible(true);
cols = new TableColumn[typ.getMesswertTypen().size() + 1];
// Spalten anlegen
int i = 0;
cols[i] = new TableColumn(table, SWT.NONE);
cols[i].setText(Messages.MessungenUebersicht_Table_Datum);
cols[i].setWidth(80);
i++;
for (IMesswertTyp dft : typ.getMesswertTypen()) {
cols[i] = new TableColumn(table, SWT.NONE);
if (dft.getUnit().equals("")) { //$NON-NLS-1$
cols[i].setText(dft.getTitle());
} else {
cols[i].setText(dft.getTitle() + " [" + dft.getUnit() + "]"); //$NON-NLS-1$ //$NON-NLS-2$
}
cols[i].setWidth(80);
i++;
}
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseDoubleClick(final MouseEvent e){
editAktion.run();
}
});
ViewMenus menu = new ViewMenus(getViewSite());
menu.createControlContextMenu(table, editAktion, copyAktion, loeschenAktion, neuAktion,
exportAktion);
}
/**
* Seite neu zeichnen (damit veraenterte Daten aktualisiert werden)
*/
public void aktualisieren(){
if (!table.isDisposed()) {
table.removeAll();
if (patient == null) {
return;
}
for (Messung messung : Messung.getPatientMessungen(patient, typ)) {
TableItem ti = new TableItem(table, SWT.NONE);
ti.setData(messung);
int i = 0;
ti.setText(i++, messung.getDatum());
for (Messwert mwrt : messung.getMesswerte()) {
ti.setText(i++, mwrt.getDarstellungswert());
}
}
}
}
/**
* Aktuell angezeigten Patienten festlegen. Dabei wird die Ansicht neu aufgebaut, da die
* Daten meist aendern.
*/
public void setCurPatient(Patient p){
patient = p;
aktualisieren();
}
/**
* @return Messungstyp der von dieser Seite angezeigt wird
*/
public MessungTyp getTyp(){
return typ;
}
}
/**
* Aktionen fuer Menuleiste und Kontextmenu initialisieren
*/
private void erstelleAktionen(){
neuAktion = new Action(Messages.MessungenUebersicht_action_neu) {
{
setImageDescriptor(Images.IMG_ADDITEM.getImageDescriptor());
setToolTipText(Messages.MessungenUebersicht_action_neu_ToolTip);
}
@Override
public void run(){
Patient p = ElexisEventDispatcher.getSelectedPatient();
if (p == null) {
return;
}
CTabItem tab = tabsfolder.getSelection();
MessungstypSeite mts = (MessungstypSeite) tab.getControl();
Messung messung = new Messung(p, mts.getTyp());
MessungBearbeiten dialog = new MessungBearbeiten(getSite().getShell(), messung);
if (dialog.open() != Dialog.OK) {
messung.delete();
}
aktualisieren();
}
};
editAktion = new Action(Messages.MessungenUebersicht_action_edit) {
{
setImageDescriptor(Images.IMG_EDIT.getImageDescriptor());
setToolTipText(Messages.MessungenUebersicht_action_edit_ToolTip);
}
@Override
public void run(){
CTabItem ci = tabsfolder.getSelection();
if (ci == null) {
return;
}
MessungstypSeite seite = (MessungstypSeite) ci.getControl();
TableItem[] tableitems = seite.table.getSelection();
if (tableitems.length == 1) {
Messung messung = (Messung) tableitems[0].getData();
MessungBearbeiten dialog = new MessungBearbeiten(getSite().getShell(), messung);
dialog.open();
aktualisieren();
}
}
};
copyAktion = new Action(Messages.MessungenUebersicht_action_copy) {
{
setImageDescriptor(Images.IMG_CLIPBOARD.getImageDescriptor());
setToolTipText(Messages.MessungenUebersicht_action_copy_ToolTip);
}
@Override
public void run(){
CTabItem ci = tabsfolder.getSelection();
if (ci == null) {
return;
}
MessungstypSeite seite = (MessungstypSeite) ci.getControl();
TableItem[] tableitems = seite.table.getSelection();
if (tableitems.length == 1) {
Messung messung = (Messung) tableitems[0].getData();
String messungsdatum = messung.getDatum();
TimeTool date = new TimeTool();
String newdatum = date.toString(TimeTool.DATE_GER);
if (!messungsdatum.equalsIgnoreCase(newdatum)) {
// Nur wenn Messung nich vom selben Tag wie heute!!
System.out.println(messung.getDatum());
System.out.println(date.toString(TimeTool.DATE_GER));
Messung messungnew = new Messung(messung.getPatient(), messung.getTyp());
messungnew.setDatum(date.toString(TimeTool.DATE_GER));
for (Messwert messwert : messung.getMesswerte()) {
Messwert copytemp = messungnew.getMesswert(messwert.getName());
copytemp.setWert(messwert.getWert());
}
aktualisieren();
} else {
SWTHelper.showError(Messages.MessungenUebersicht_action_copy_error,
Messages.MessungenUebersicht_action_copy_errorMessage);
}
}
}
};
exportAktion = new Action(Messages.MessungenUebersicht_action_export) {
{
setImageDescriptor(Images.IMG_EXPORT.getImageDescriptor());
setToolTipText(Messages.MessungenUebersicht_action_export_ToolTip);
}
@Override
public void run(){
CTabItem ci = tabsfolder.getSelection();
if (ci == null) {
return;
}
MessungstypSeite seite = (MessungstypSeite) ci.getControl();
TableItem[] tableitems = seite.table.getItems();
try {
String date = new TimeTool().toString(TimeTool.DATE_COMPACT);
String filename = ci.getText() + "-export-" + date + ".csv"; //$NON-NLS-1$ //$NON-NLS-2$
String fqfilename =
System.getProperty("user.home") + File.separatorChar + filename; //$NON-NLS-1$
FileWriter writer = new FileWriter(fqfilename);
// Get the headers Name (Unit); Name (Unit); ...
Messung headermessung = (Messung) tableitems[0].getData();
String headerstring = "datum;"; //$NON-NLS-1$
for (Messwert messwert : headermessung.getMesswerte()) {
headerstring = headerstring + messwert.getTyp().getName() + "(" //$NON-NLS-1$
+ messwert.getTyp().getUnit() + ")" + ";"; //$NON-NLS-1$ //$NON-NLS-2$
}
headerstring = headerstring.substring(0, headerstring.length() - 1);
writer.append(headerstring + "\n"); //$NON-NLS-1$
for (int i = 0; i < tableitems.length; i++) {
Messung messung = (Messung) tableitems[i].getData();
String messungstring = messung.getDatum() + ";"; //$NON-NLS-1$
for (Messwert messwert : messung.getMesswerte()) {
messungstring =
messungstring
+ messwert.getTyp().erstelleDarstellungswert(messwert) + ";"; //$NON-NLS-1$
}
messungstring = messungstring.substring(0, messungstring.length() - 1);
writer.append(messungstring + "\n"); //$NON-NLS-1$
}
writer.flush();
writer.close();
SWTHelper.showInfo(MessageFormat.format(
Messages.MessungenUebersicht_action_export_title, ci.getText()),
MessageFormat.format(Messages.MessungenUebersicht_action_export_success,
fqfilename));
} catch (Exception e) {
SWTHelper.showError(Messages.MessungenUebersicht_action_export_error,
e.toString());
}
}
};
loeschenAktion = new Action(Messages.MessungenUebersicht_action_loeschen) {
{
setImageDescriptor(Images.IMG_DELETE.getImageDescriptor());
setToolTipText(Messages.MessungenUebersicht_action_loeschen_ToolTip);
}
@Override
public void run(){
CTabItem ci = tabsfolder.getSelection();
if (ci == null) {
return;
}
MessungstypSeite seite = (MessungstypSeite) ci.getControl();
TableItem[] tableitems = seite.table.getSelection();
if ((tableitems.length > 0)
&& SWTHelper.askYesNo(Messages.MessungenUebersicht_action_loeschen_delete_0,
Messages.MessungenUebersicht_action_loeschen_delete_1)) {
for (TableItem ti : tableitems) {
Messung messung = (Messung) ti.getData();
messung.delete();
}
aktualisieren();
}
}
};
reloadXMLAction = new Action(Messages.MessungenUebersicht_action_reload) {
{
setImageDescriptor(Images.IMG_REFRESH.getImageDescriptor());
setToolTipText(Messages.MessungenUebersicht_action_reload_ToolTip);
}
@Override
public void run(){
for (CTabItem ci : tabsfolder.getItems()) {
ci.getControl().dispose();
ci.dispose();
}
for (Control c : tabsfolder.getChildren()) {
c.dispose();
}
config.readFromXML(null);
erstelleSeiten();
aktualisieren();
}
};
}
/**
* Menuleiste generieren
*/
private ViewMenus erstelleMenu(IViewSite site){
ViewMenus menu = new ViewMenus(site);
erstelleAktionen();
menu.createToolbar(neuAktion, editAktion, copyAktion, loeschenAktion, exportAktion);
menu.createMenu(reloadXMLAction);
return menu;
}
@Override
public void createPartControl(Composite parent){
parent.setLayout(new GridLayout());
form = UiDesk.getToolkit().createScrolledForm(parent);
form.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
Composite body = form.getBody();
body.setLayout(new FillLayout());
tabsfolder = new CTabFolder(body, SWT.NONE);
tabsfolder.setLayout(new FillLayout());
erstelleMenu(getViewSite());
erstelleSeiten();
ElexisEventDispatcher.getInstance().addListeners(this);
}
void erstelleSeiten(){
for (MessungTyp t : config.getTypes()) {
CTabItem cti = new CTabItem(tabsfolder, SWT.NONE);
cti.setText(t.getTitle());
MessungstypSeite mts = new MessungstypSeite(tabsfolder, t);
seiten.add(mts);
cti.setControl(mts);
}
tabsfolder.setSelection(0);
setCurPatient(ElexisEventDispatcher.getSelectedPatient());
}
@Override
public void dispose(){
ElexisEventDispatcher.getInstance().removeListeners(this);
}
@Override
public void setFocus(){
// TODO Auto-generated method stub
}
/**
* Aktuell ausgewaehlten Patient festlegen
*
* @param patient
* Ausgewaehlter Patient oder null falls keiner ausgewaehlt ist.
*/
private void setCurPatient(Patient patient){
if (patient == null) {
form.setText(Messages.MessungenUebersicht_kein_Patient);
} else {
form.setText(patient.getLabel());
}
// Tabs benachrichtigen
for (MessungstypSeite mts : seiten) {
mts.setCurPatient(patient);
}
}
/**
* Alle Seiten aktualisieren
*/
private void aktualisieren(){
for (MessungstypSeite mts : seiten) {
mts.aktualisieren();
}
}
/**
* Dieser Event-Handler ist dafuer zustaendig, uns ueber den aktuell ausgewaehlten Patienten auf
* dem Laufenden zu halten, damit die Ansicht aktualisiert wird.
*/
public void catchElexisEvent(final ElexisEvent ev){
UiDesk.asyncExec(new Runnable() {
public void run(){
if (ev.getType() == ElexisEvent.EVENT_SELECTED) {
setCurPatient((Patient) ev.getObject());
} else if (ev.getType() == ElexisEvent.EVENT_DESELECTED) {
setCurPatient(null);
}
}
});
}
private final ElexisEvent eetmpl = new ElexisEvent(null, Patient.class,
ElexisEvent.EVENT_SELECTED | ElexisEvent.EVENT_DESELECTED);
public ElexisEvent getElexisEventFilter(){
return eetmpl;
}
}