/******************************************************************************* * * The authorship of this code and the accompanying materials is held by * medshare GmbH, Switzerland. All rights reserved. * http://medshare.net * * This code and the accompanying materials are made available under * the terms of the Eclipse Public License v1.0 * * Year of publication: 2012 * *******************************************************************************/ package com.hilotec.elexis.messwerte.v2.views; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.lang.reflect.InvocationTargetException; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.FileDialog; 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.ExportData; 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; public class MessungenUebersichtV21 extends ViewPart implements ElexisEventListener { private static int DEFAULT_COL_WIDTH = 80; private static String DATA_PATIENT = "patient"; //$NON-NLS-1$ private static String DATA_TYP = "typ"; //$NON-NLS-1$ private static String DATA_VIEWER = "viewer"; //$NON-NLS-1$ private MessungKonfiguration config; private ScrolledForm form; private CTabFolder tabfolder; private final ArrayList<TableViewer> tableViewers; private Action neuAktion; private Action editAktion; private Action copyAktion; private Action loeschenAktion; private Action exportAktion; private Action reloadXMLAction; public MessungenUebersichtV21(){ config = MessungKonfiguration.getInstance(); tableViewers = new ArrayList<TableViewer>(); } private class CustomColumnLabelProvider extends ColumnLabelProvider { private final String messwertName; public CustomColumnLabelProvider(int columnIndex, String name){ messwertName = name; } @Override public String getText(Object element){ Messung m = (Messung) element; return m.getMesswert(messwertName).getDarstellungswert(); } }; private void setCurPatient(Patient patient){ if (patient == null) { form.setText(Messages.MessungenUebersicht_kein_Patient); } else { form.setText(patient.getLabel()); } CTabItem tab = tabfolder.getSelection(); Control c = tab.getControl(); MessungTyp t = (MessungTyp) c.getData(DATA_TYP); refreshContent(patient, t); } 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; } @Override public void createPartControl(Composite parent){ parent.setLayout(new GridLayout()); intializeView(parent); if (form.getCursor() == null) form.setCursor(new Cursor(form.getShell().getDisplay(), SWT.CURSOR_WAIT)); config = MessungKonfiguration.getInstance(); erstelleAktionen(); erstelleMenu(getViewSite()); initializeContent(); if (form.getCursor() != null) form.setCursor(null); } @Override public void setFocus(){ CTabItem tab = tabfolder.getSelection(); if(tab==null) return; Control c = tab.getControl(); TableViewer tv = (TableViewer) c.getData(DATA_VIEWER); if (tv != null) { if (tv.getInput() == null) { Patient p = (Patient) tabfolder.getData(DATA_PATIENT); if (p == null) { p = ElexisEventDispatcher.getSelectedPatient(); } MessungTyp t = (MessungTyp) c.getData(DATA_TYP); refreshContent(p, t); } } } private void intializeView(Composite parent){ form = UiDesk.getToolkit().createScrolledForm(parent); form.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); form.setText(Messages.MessungenUebersicht_kein_Patient); Composite body = form.getBody(); body.setLayout(new GridLayout()); tabfolder = new CTabFolder(body, SWT.NONE); tabfolder.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); tabfolder.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e){ CTabFolder tf = (CTabFolder) e.widget; Patient p = (Patient) tf.getData(DATA_PATIENT); if (p == null) { return; } CTabItem tab = tf.getSelection(); Control c = tab.getControl(); MessungTyp t = (MessungTyp) c.getData(DATA_TYP); refreshContent(p, t); } public void widgetDefaultSelected(SelectionEvent e){ // Auto-generated method stub, but not needed } }); ElexisEventDispatcher.getInstance().addListeners(this); } private void initializeContent(){ tableViewers.clear(); config.readFromXML(); for (MessungTyp t : config.getTypes()) { TableViewer tv = createTableViewer(tabfolder, t); Control c = tv.getControl(); c.setData(DATA_TYP, t); c.setData(DATA_VIEWER, tv); tableViewers.add(tv); CTabItem ti = new CTabItem(tabfolder, SWT.NONE); ti.setText(t.getTitle()); ti.setControl(c); tv.setInput(null); tv.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event){ editAktion.run(); } }); ViewMenus menu = new ViewMenus(getViewSite()); menu.createControlContextMenu(tv.getControl(), editAktion, copyAktion, loeschenAktion, neuAktion, exportAktion); } tabfolder.setSelection(0); } private void refreshContent(Patient patient, MessungTyp requestedTyp){ if (patient != null) { if (form.getCursor() == null) form.setCursor(new Cursor(form.getShell().getDisplay(), SWT.CURSOR_WAIT)); form.setText(patient.getLabel()); tabfolder.setData(DATA_PATIENT, patient); MessungTyp typToRefresh = requestedTyp; TableViewer viewerToRefresh = null; for (TableViewer tv : tableViewers) { Control c = tv.getControl(); if (!c.isDisposed()) { MessungTyp typ = (MessungTyp) c.getData(DATA_TYP); // bei unbekannten typen (z.B. bei reloadXML) einfach den ersten refreshen if (typToRefresh == null) { typToRefresh = typ; viewerToRefresh = tv; break; } else { if (requestedTyp.getName().equals(typ.getName())) { typToRefresh = typ; viewerToRefresh = tv; break; } } } } if(viewerToRefresh!=null) { viewerToRefresh.setInput(Messung.getPatientMessungen(patient, typToRefresh)); } if (form.getCursor() != null) form.setCursor(null); } } private TableViewer createTableViewer(Composite parent, MessungTyp t){ TableViewer viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); createColumns(parent, viewer, t); final Table table = viewer.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); viewer.setContentProvider(new ArrayContentProvider()); // Make the selection available to other views getSite().setSelectionProvider(viewer); // Set the sorter for the table // Layout the viewer GridData gridData = new GridData(); gridData.verticalAlignment = GridData.FILL; gridData.horizontalSpan = 2; gridData.grabExcessHorizontalSpace = true; gridData.grabExcessVerticalSpace = true; gridData.horizontalAlignment = GridData.FILL; viewer.getControl().setLayoutData(gridData); viewer.setComparator(new MessungenComparator()); return viewer; } private void createColumns(final Composite parent, final TableViewer viewer, MessungTyp t){ // First column is for the measure date TableViewerColumn col; col = createTableViewerColumn(viewer, Messages.MessungenUebersicht_Table_Datum, DEFAULT_COL_WIDTH, 0); col.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element){ Messung m = (Messung) element; return m.getDatum(); } }); int i = 0; for (IMesswertTyp dft : t.getMesswertTypen()) { String colTitle = dft.getTitle(); if (!dft.getUnit().equals("")) //$NON-NLS-1$ colTitle += " [" + dft.getUnit() + "]"; //$NON-NLS-1$ //$NON-NLS-2$ col = createTableViewerColumn(viewer, colTitle, DEFAULT_COL_WIDTH, 0); col.setLabelProvider(new CustomColumnLabelProvider(i, dft.getName())); i++; } } private TableViewerColumn createTableViewerColumn(final TableViewer viewer, String title, int bound, final int colNumber){ final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); final TableColumn column = viewerColumn.getColumn(); column.setText(title); column.setWidth(bound); column.setResizable(true); column.setMoveable(true); column.addSelectionListener(getSelectionAdapter(viewer, column, colNumber)); return viewerColumn; } private SelectionAdapter getSelectionAdapter(final TableViewer viewer, final TableColumn column, final int index){ SelectionAdapter selectionAdapter = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e){ MessungenComparator comparator = (MessungenComparator) viewer.getComparator(); comparator.setColumn(0); int dir = comparator.getDirection(); viewer.getTable().setSortDirection(dir); viewer.getTable().setSortColumn(viewer.getTable().getColumn(0)); viewer.refresh(); } }; return selectionAdapter; } /** * 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 = (Patient) tabfolder.getData(DATA_PATIENT); if (p == null) { return; } CTabItem tab = tabfolder.getSelection(); Control c = tab.getControl(); MessungTyp t = (MessungTyp) c.getData(DATA_TYP); Messung messung = new Messung(p, t); MessungBearbeiten dialog = new MessungBearbeiten(getSite().getShell(), messung); if (dialog.open() != Dialog.OK) { messung.delete(); } refreshContent(p, t); } }; editAktion = new Action(Messages.MessungenUebersicht_action_edit) { { setImageDescriptor(Images.IMG_EDIT.getImageDescriptor()); setToolTipText(Messages.MessungenUebersicht_action_edit_ToolTip); } @Override public void run(){ Patient p = (Patient) tabfolder.getData(DATA_PATIENT); if (p == null) { return; } CTabItem tab = tabfolder.getSelection(); Control c = tab.getControl(); MessungTyp t = (MessungTyp) c.getData(DATA_TYP); TableItem[] tableitems = ((Table) c).getSelection(); if (tableitems.length == 1) { Messung messung = (Messung) tableitems[0].getData(); MessungBearbeiten dialog = new MessungBearbeiten(getSite().getShell(), messung); if (dialog.open() == Dialog.OK) { refreshContent(p, t); } } } }; copyAktion = new Action(Messages.MessungenUebersicht_action_copy) { { setImageDescriptor(Images.IMG_CLIPBOARD.getImageDescriptor()); setToolTipText(Messages.MessungenUebersicht_action_copy_ToolTip); } @Override public void run(){ Patient p = (Patient) tabfolder.getData(DATA_PATIENT); if (p == null) { return; } CTabItem tab = tabfolder.getSelection(); Control c = tab.getControl(); MessungTyp t = (MessungTyp) c.getData(DATA_TYP); TableItem[] tableitems = ((Table) c).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()); } messungnew.set("deleted", "0"); // kopierte Messung als gültig markieren //$NON-NLS-1$ //$NON-NLS-2$ refreshContent(p, t); } else { SWTHelper.showError(Messages.MessungenUebersicht_action_copy_error, Messages.MessungenUebersicht_action_copy_errorMessage); } } } }; loeschenAktion = new Action(Messages.MessungenUebersicht_action_loeschen) { { setImageDescriptor(Images.IMG_DELETE.getImageDescriptor()); setToolTipText(Messages.MessungenUebersicht_action_loeschen_ToolTip); } @Override public void run(){ Patient p = (Patient) tabfolder.getData(DATA_PATIENT); if (p == null) { return; } CTabItem tab = tabfolder.getSelection(); Control c = tab.getControl(); MessungTyp t = (MessungTyp) c.getData(DATA_TYP); TableItem[] tableitems = ((Table) c).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(); } refreshContent(p, t); } } }; exportAktion = new Action(Messages.MessungenUebersicht_action_export) { { setImageDescriptor(Images.IMG_EXPORT.getImageDescriptor()); setToolTipText(Messages.MessungenUebersicht_action_export_ToolTip); } @Override public void run(){ Patient p = (Patient) tabfolder.getData(DATA_PATIENT); CTabItem tab = tabfolder.getSelection(); Control c = tab.getControl(); MessungTyp t = (MessungTyp) c.getData(DATA_TYP); ExportData expData = new ExportData(); if (p != null) { expData.setPatientNumberFrom(Integer.parseInt(p.getPatCode())); expData.setPatientNumberTo(Integer.parseInt(p.getPatCode())); } ExportDialog expDialog = new ExportDialog(form.getShell(), expData); if (expDialog.open() == Dialog.OK) { String label = t.getTitle(); String date = new TimeTool().toString(TimeTool.DATE_COMPACT); String filename = label + "-export-" + date + ".csv"; //$NON-NLS-1$ //$NON-NLS-2$ FileDialog fd = new FileDialog(getSite().getShell(), SWT.SAVE); String[] extensions = { "*.csv" //$NON-NLS-1$ }; fd.setOverwrite(true); fd.setFilterExtensions(extensions); fd.setFileName(filename); fd.setFilterPath(System.getProperty("user.home")); //$NON-NLS-1$ String filepath = fd.open(); if (filepath != null) { try { Exporter exporter = new Exporter(expData, t, filepath); new ProgressMonitorDialog(form.getShell()).run(true, true, exporter); if (!exporter.wasAborted()) { SWTHelper.showInfo(MessageFormat.format( Messages.MessungenUebersicht_action_export_title, label), MessageFormat.format( Messages.MessungenUebersicht_action_export_success, label, filepath)); } else { SWTHelper.showError(MessageFormat.format( Messages.MessungenUebersicht_action_export_title, label), MessageFormat.format( Messages.MessungenUebersicht_action_export_aborted, label, filepath)); } } catch (InvocationTargetException e) { SWTHelper.showError(Messages.MessungenUebersichtV21_Error, e.getMessage()); } catch (InterruptedException e) { SWTHelper.showInfo(Messages.MessungenUebersichtV21_Cancelled, e.getMessage()); } } else { SWTHelper.showInfo(Messages.MessungenUebersichtV21_Information, Messages.MessungenUebersicht_action_export_filepath_error); } } } }; reloadXMLAction = new Action(Messages.MessungenUebersicht_action_reload) { { setImageDescriptor(Images.IMG_REFRESH.getImageDescriptor()); setToolTipText(Messages.MessungenUebersicht_action_reload_ToolTip); } @Override public void run(){ Patient p = (Patient) tabfolder.getData(DATA_PATIENT); if (p == null) { return; } for (CTabItem ci : tabfolder.getItems()) { ci.getControl().dispose(); ci.dispose(); } for (Control ctrl : tabfolder.getChildren()) { ctrl.dispose(); } if (form.getCursor() == null) form.setCursor(new Cursor(form.getShell().getDisplay(), SWT.CURSOR_WAIT)); initializeContent(); refreshContent(p, null); if (form.getCursor() != null) form.setCursor(null); } }; } /** * Menuleiste generieren */ private ViewMenus erstelleMenu(IViewSite site){ ViewMenus menu = new ViewMenus(site); menu.createToolbar(neuAktion, editAktion, copyAktion, loeschenAktion, exportAktion); menu.createMenu(reloadXMLAction); return menu; } class Exporter implements IRunnableWithProgress { private final ExportData expData; private final MessungTyp typ; private final String filepath; private Boolean aborted = false; /** * LongRunningOperation constructor * * @param indeterminate * whether the animation is unknown */ public Exporter(ExportData xpd, MessungTyp t, String fp){ expData = xpd; typ = t; filepath = fp; } /** * Runs the long running operation * * @param monitor * the progress monitor */ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException{ monitor.beginTask(Messages.MessungenUebersichtV21_Initializing, IProgressMonitor.UNKNOWN); try { FileOutputStream fout = new FileOutputStream(filepath); OutputStreamWriter writer = new OutputStreamWriter(fout, "ISO-8859-1"); //$NON-NLS-1$ ArrayList<IMesswertTyp> messwertTypen = typ.getMesswertTypen(); String headerstring = "PatientenNr;Name;Vorname;Geburtsdatum;Geschlecht;datum;"; //$NON-NLS-1$ for (IMesswertTyp messwertTyp : messwertTypen) { headerstring = headerstring + messwertTyp.getName(); String unit = messwertTyp.getUnit(); if (!"".equals(unit)) headerstring += "(" //$NON-NLS-1$ + messwertTyp.getUnit() + ")"; //$NON-NLS-2$ headerstring += ";"; //$NON-NLS-1$ } headerstring = headerstring.substring(0, headerstring.length() - 1); writer.append(headerstring + "\n"); //$NON-NLS-1$ List<Messung> messungen = Messung.getMessungenForExport(typ, expData.getDateFrom(), expData.getDateTo()); monitor.beginTask(Messages.MessungenUebersicht_action_export_progress, messungen.size()); for (Messung m : messungen) { Patient p = Patient.load(m.getPatient().getId()); int curPatNr = -1; try { curPatNr = Integer.parseInt(p.getPatCode()); } catch (Exception e) {} if ((curPatNr >= expData.getPatientNumberFrom()) && (curPatNr <= expData.getPatientNumberTo())) { monitor.subTask(p.getLabel() + " - " + m.getDatum()); //$NON-NLS-1$ String messungstring = m.getPatient().getPatCode() + ";"; //$NON-NLS-1$ messungstring += m.getPatient().getName() + ";"; //$NON-NLS-1$ messungstring += m.getPatient().getVorname() + ";"; //$NON-NLS-1$ messungstring += m.getPatient().getGeburtsdatum() + ";"; //$NON-NLS-1$ messungstring += m.getPatient().getGeschlecht() + ";"; //$NON-NLS-1$ messungstring += m.getDatum() + ";"; //$NON-NLS-1$ for (Messwert messwert : m.getMesswerte()) { messungstring += messwert.getWert() + ";"; //$NON-NLS-1$ } messungstring = messungstring.substring(0, messungstring.length() - 1); writer.append(messungstring + "\n"); //$NON-NLS-1$ } monitor.worked(1); if (monitor.isCanceled()) { aborted = true; break; } } writer.flush(); writer.close(); fout.flush(); fout.close(); } catch (Exception e) { SWTHelper.showError(Messages.MessungenUebersicht_action_export_error, e.toString()); } monitor.done(); } private Boolean wasAborted(){ return aborted; } } }