package com.hilotec.elexis.kgview.medikarte; import static com.hilotec.elexis.kgview.text.KGTextTemplateRequirement.TT_MEDICARD; import java.util.Collections; import java.util.List; import org.eclipse.jface.action.Action; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.PartInitException; 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.PersistentObjectDropTarget; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.core.ui.util.ViewMenus; import ch.elexis.core.ui.views.TextView; import ch.elexis.data.Artikel; import ch.elexis.data.Brief; import ch.elexis.data.Konsultation; import ch.elexis.data.Patient; import ch.elexis.data.PersistentObject; import ch.elexis.data.Prescription; import com.hilotec.elexis.kgview.data.FavMedikament; import com.hilotec.elexis.kgview.medikarte.MedikarteEintragComparator.Sortierung; public class MedikarteView extends ViewPart implements ElexisEventListener { public static final String ID = "com.hilotec.elexis.kgview.MedikarteView"; private Table table; // Alle Verschreibungen anzeigen? Oder nur die aktiven. private boolean alle = false; // Geloeschte auch anzeigen? private boolean geloescht = false; // Alphabetisch sortieren private boolean sortAlph = false; private Patient patient; private Action actEdit; private Action actStop; private Action actDelete; private Action actFilter; private Action actShowDel; private Action actDrucken; private Action actSortAlph; @Override public void createPartControl(Composite parent){ table = new Table(parent, SWT.V_SCROLL | SWT.SINGLE | SWT.FULL_SELECTION); table.setHeaderVisible(true); table.setLinesVisible(true); // Ein haufen Tabellenueberschriften String[] ueberschriften = { "Ordnungszahl", "Medikament", "Mo", "Mi", "Ab", "Na", "Einh", "Zweck", "Einnahmevorschrift", "Von", "Bis" }; int[] breiten = { 30, 140, 40, 40, 40, 40, 40, 200, 70, 70, 70 }; for (int i = 0; i < breiten.length; i++) { TableColumn tc = new TableColumn(table, SWT.NONE); tc.setText(ueberschriften[i]); tc.setWidth(breiten[i]); } makeActions(); // Drop target um neue Medikamente auf die Liste zu nehmen new PersistentObjectDropTarget(table, new PersistentObjectDropTarget.IReceiver() { public void dropped(PersistentObject o, DropTargetEvent e){ if (patient == null) return; FavMedikament fm = FavMedikament.load((Artikel) o); new MedikarteEintragDialog(getSite().getShell(), patient, fm).open(); refresh(); } @Override public boolean accept(PersistentObject o){ if (!(o instanceof Artikel) || patient == null) return false; return (FavMedikament.load((Artikel) o) != null); } }); // Listener fuer Doppelklick um eintraege zu editieren table.addMouseListener(new MouseListener() { public void mouseUp(MouseEvent e){} public void mouseDown(MouseEvent e){} public void mouseDoubleClick(MouseEvent e){ actEdit.run(); } }); // Key-Listener zum stoppen von Eintraegen table.addKeyListener(new KeyListener() { public void keyReleased(KeyEvent e){} public void keyPressed(KeyEvent e){ if (e.keyCode != SWT.DEL) return; actStop.run(); } }); // Menus oben rechts in der View ViewMenus menus = new ViewMenus(getViewSite()); menus.createToolbar(actFilter, actShowDel, actDrucken, actSortAlph); // Contextmenu fuer Tabelle menus.createControlContextMenu(table, actEdit, actStop, actDelete); ElexisEventDispatcher.getInstance().addListeners(this); patient = (Patient) ElexisEventDispatcher.getSelected(Patient.class); refresh(); } private void makeActions(){ // Aktion zum Bearbeiten einer Verschreibung actEdit = new Action("Bearbeiten", Action.AS_PUSH_BUTTON) { { setImageDescriptor(Images.IMG_EDIT.getImageDescriptor()); } @Override public void run(){ TableItem[] sel = table.getSelection(); if (sel == null || sel.length != 1) return; Prescription presc = (Prescription) sel[0].getData(); new MedikarteEintragDialog(getSite().getShell(), patient, presc).open(); refresh(); } }; // Aktion zum Stoppen einer Verschreibung actStop = new Action("Stoppen", Action.AS_PUSH_BUTTON) { { setImageDescriptor(Images.IMG_AUSRUFEZ_ROT.getImageDescriptor()); } @Override public void run(){ TableItem[] tis = table.getSelection(); if (tis == null || tis.length != 1) return; Prescription presc = (Prescription) tis[0].getData(); if (presc.isDeleted() || !presc.getEndDate().equals("")) return; new MedikarteStopDialog(getSite().getShell(), presc).open(); refresh(); } }; // Aktion zum Loeschen von Verschreibungen actDelete = new Action("Löschen", Action.AS_PUSH_BUTTON) { { setImageDescriptor(Images.IMG_DELETE.getImageDescriptor()); } @Override public void run(){ TableItem[] tis = table.getSelection(); if (tis == null || tis.length != 1) return; Prescription presc = (Prescription) tis[0].getData(); if (presc.isDeleted()) return; if (!SWTHelper.askYesNo("Verschreibung loeschen", "Soll der " + "markierte Eintrag wirklich permanent gelöscht werden?")) return; presc.remove(); refresh(); } }; // Aktion fuer den Filter-Button actFilter = new Action("Alle anzeigen", Action.AS_CHECK_BOX) { { setImageDescriptor(Images.IMG_FILTER.getImageDescriptor()); setChecked(true); } @Override public void run(){ alle = !isChecked(); refresh(); } }; // Aktion fuer den Geloeschte anzeigen Button actShowDel = new Action("Gelöschte anzeigen", Action.AS_CHECK_BOX) { { setImageDescriptor(Images.IMG_BOOK.getImageDescriptor()); } @Override public void run(){ geloescht = isChecked(); refresh(); } }; // Aktion fuer den Drucken-Button actDrucken = new Action("Drucken", Action.AS_PUSH_BUTTON) { { setImageDescriptor(Images.IMG_PRINTER.getImageDescriptor()); } @Override public void run(){ Konsultation kons = (Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class); Patient patient = ElexisEventDispatcher.getSelectedPatient(); if (patient == null || kons == null) { SWTHelper.alert("Keine Konsultation ausgewählt", "Eine Konsutlation muss ausgewählt sein in der " + "die Medikamentenkarte erstellt werden soll."); return; } TextView tv; try { tv = (TextView) getSite().getPage().showView(TextView.ID); } catch (PartInitException e) { e.printStackTrace(); return; } // Medikarte aus Vorlage erstellen Brief doc = tv.getTextContainer().createFromTemplateName(kons, TT_MEDICARD, Brief.UNKNOWN, patient, "Medikamentenkarte"); tv.openDocument(doc); } }; // Aktion fuer die alphabetische Sortierung der Eintraege actSortAlph = new Action("Alphabetisch sortieren", Action.AS_CHECK_BOX) { { setImageDescriptor(Images.IMG_ARROWDOWN.getImageDescriptor()); } @Override public void run(){ sortAlph = isChecked(); refresh(); } }; } /** Formatiere Volltext (mit \n) fuer Darstellung in Tabelle. */ private String fmtVolltext(String text){ return text.replaceAll("[\\n\\r]+", ", "); } private void refresh(){ table.removeAll(); if (patient == null) return; // Medikation zu Patient zusammensuchen. List<Prescription> l = MedikarteHelpers.medikarteMedikation(patient, alle, geloescht); Sortierung s = Sortierung.CHRONOLOGISCH; if (sortAlph) s = Sortierung.ALPHABETISCH; Collections.sort(l, new MedikarteEintragComparator(s)); // Tabelle neu befuellen for (Prescription p : l) { FavMedikament fm = FavMedikament.load(p.getArtikel()); String[] dosierung = p.getDosis().split("-"); if (dosierung.length != 4 || fm == null) continue; TableItem ti = new TableItem(table, 0); ti.setData(p); if (p.isDeleted()) { Color red = new Color(Display.getCurrent(), 255, 0, 0); ti.setForeground(red); } int i = 0; int ord = MedikarteHelpers.getOrdnungszahl(p); ti.setText(i++, Integer.toString(ord)); ti.setText(i++, fm.getBezeichnung()); ti.setText(i++, dosierung[0]); ti.setText(i++, dosierung[1]); ti.setText(i++, dosierung[2]); ti.setText(i++, dosierung[3]); ti.setText(i++, fm.getEinheit()); String z = MedikarteHelpers.getPZweck(p); ti.setText(i++, fmtVolltext(z)); ti.setText(i++, p.getBemerkung()); ti.setText(i++, p.getBeginDate()); ti.setText(i++, p.getEndDate()); } } @Override public void setFocus(){} @Override public void dispose(){ ElexisEventDispatcher.getInstance().removeListeners(this); super.dispose(); } public void catchElexisEvent(final ElexisEvent ev){ UiDesk.syncExec(new Runnable() { public void run(){ if (ev.getObjectClass().equals(Patient.class)) { Patient p = (Patient) ev.getObject(); if (ev.getType() == ElexisEvent.EVENT_SELECTED) patient = p; else if (ev.getType() == ElexisEvent.EVENT_DESELECTED) patient = null; refresh(); } else if (ev.getObjectClass().equals(Prescription.class)) { refresh(); } } }); } private final ElexisEvent eetmpl = new ElexisEvent(null, null, ElexisEvent.EVENT_SELECTED | ElexisEvent.EVENT_DESELECTED | ElexisEvent.EVENT_CREATE | ElexisEvent.EVENT_DELETE); public ElexisEvent getElexisEventFilter(){ return eetmpl; } }