package com.hilotec.elexis.kgview.medikarte; import java.util.HashMap; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.RowData; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.data.Patient; import ch.elexis.data.Prescription; import ch.rgw.tools.TimeTool; import com.hilotec.elexis.kgview.Preferences; import com.hilotec.elexis.kgview.data.FavMedikament; /** * Dialog um einen Eintrag in der Liste der favorisierten Medikamente anzupassen oder neu zu * erstellen. * * @author Antoine Kaufmann */ public class MedikarteEintragDialog extends TitleAreaDialog { private Patient pat; private FavMedikament fm; private Prescription presc; private Text tOrd; private Text tDoMorgen; private Text tDoMittag; private Text tDoAbend; private Text tDoNacht; private Text tVon; private Text tBis; private Combo cEV; private Text tZweck; public MedikarteEintragDialog(Shell parentShell, Patient patient, FavMedikament med){ super(parentShell); fm = med; pat = patient; presc = null; } public MedikarteEintragDialog(Shell parentShell, Patient patient, Prescription prescription){ super(parentShell); fm = FavMedikament.load(prescription.getArtikel()); pat = patient; presc = prescription; } @Override protected Control createDialogArea(Composite parent){ Composite comp = new Composite(parent, 0); comp.setLayout(new GridLayout(2, false)); // Patient, Medikament beides rein informativ setTitle("Neues Medikament fuer " + pat.getName() + ", " + pat.getGeburtsdatum()); Label lLMed = new Label(comp, 0); lLMed.setText("Medikament"); Label lMed = new Label(comp, SWT.BORDER); lMed.setText(fm.getBezeichnung()); // Originalnamen anzeigen Label lLOMed = new Label(comp, 0); lLOMed.setText("Original"); Label lOMed = new Label(comp, SWT.BORDER); lOMed.setText(fm.getArtikel().getName()); // Feld fuer Ordnungszahl Label lOrd = new Label(comp, 0); lOrd.setText("Ordnungszahl"); tOrd = SWTHelper.createText(comp, 1, 0); // Felder zum ausfuellen, Datum von bis, Dosis Label lVon = new Label(comp, 0); lVon.setText("Von"); tVon = SWTHelper.createText(comp, 1, 0); Label lBis = new Label(comp, 0); lBis.setText("Bis"); tBis = SWTHelper.createText(comp, 1, 0); Label lDosierung = new Label(comp, 0); lDosierung.setText("Dosierung"); Composite cDos = new Composite(comp, 0); cDos.setLayout(new RowLayout()); tDoMorgen = new Text(cDos, SWT.BORDER); tDoMorgen.setLayoutData(new RowData(30, SWT.DEFAULT)); tDoMittag = new Text(cDos, SWT.BORDER); tDoMittag.setLayoutData(new RowData(30, SWT.DEFAULT)); tDoAbend = new Text(cDos, SWT.BORDER); tDoAbend.setLayoutData(new RowData(30, SWT.DEFAULT)); tDoNacht = new Text(cDos, SWT.BORDER); tDoNacht.setLayoutData(new RowData(30, SWT.DEFAULT)); // Liste mit Einnahmevorschriften initialisieren Label lEV = new Label(comp, 0); lEV.setText("Einnahmevorschrift"); cEV = new Combo(comp, SWT.DROP_DOWN | SWT.BORDER); HashMap<String, Integer> evMap = new HashMap<String, Integer>(); int evIndex = 0; cEV.add(""); cEV.select(0); evMap.put("", evIndex++); for (String ev : Preferences.getEinnahmevorschriften()) { if (evMap.containsKey(ev)) continue; cEV.add(ev); evMap.put(ev, evIndex++); } // Zweck Label lZweck = new Label(comp, 0); lZweck.setText("Zweck"); tZweck = SWTHelper.createText(comp, 2, 0); // Einheit, rein informativ Label lEinheit = new Label(comp, 0); lEinheit.setText("Einheit"); Label lEinheitText = new Label(comp, SWT.BORDER); lEinheitText.setText(fm.getEinheit()); tVon.setText(new TimeTool().toString(TimeTool.DATE_GER)); if (presc != null) { int o = MedikarteHelpers.getOrdnungszahl(presc); tOrd.setText(Integer.toString(o)); tBis.setText(presc.getEndDate()); String[] dos = presc.getDosis().split("-"); tDoMorgen.setText(dos[0]); tDoMittag.setText(dos[1]); tDoAbend.setText(dos[2]); tDoNacht.setText(dos[3]); tZweck.setText(MedikarteHelpers.getPZweck(presc)); // Korrekte Einnahmevorschrift auswaehlen String ev = presc.getBemerkung(); if (evMap.containsKey(ev)) { cEV.select(evMap.get(ev)); } else { // XXX: Ist das so sinnvoll?? cEV.add(ev); cEV.select(evIndex); } } else { tOrd.setText(Integer.toString(fm.getOrdnungszahl())); tDoMorgen.setText("0"); tDoMittag.setText("0"); tDoAbend.setText("0"); tDoNacht.setText("0"); tZweck.setText(fm.getZweck()); ; } return comp; } private boolean validateDate(String s, boolean allowempty){ TimeTool tt = new TimeTool(); return (s.isEmpty() && allowempty) || tt.setDate(s); } /** * Format einer Dosierung ueberpruefen. */ private boolean validateDosierung(String s){ s = s.toUpperCase(); // Spezielle Dosierung auf Beiblatt if (s.equals("X")) return true; // Ganzzahlige Dosierung if (s.matches("[0-9]+")) { return true; } // Fuehrende Ganzzahl parsen if (s.matches("[0-9]+ .*")) { s = s.replaceAll("[ \t]+", " "); String[] parts = s.split(" "); if (parts.length != 2) return false; s = parts[1]; } // Bruch-Dosierung parsen if (s.matches("[0-9]+/[0-9]+")) { String[] parts = s.split("/"); int z, n; try { z = Integer.parseInt(parts[0]); n = Integer.parseInt(parts[1]); } catch (NumberFormatException nfe) { // Sollte nicht passieren nach Regex-Check oben. return false; } return (z > 0) && (n > 0) && (n > z); } return false; } private boolean validateInput(){ setMessage(""); // Datumsfelder pruefen if (!validateDate(tVon.getText(), false) || !validateDate(tBis.getText(), true)) { setMessage("Fehler: Ungültiges Datum. Erwarte Format " + "dd.mm.jjjj, oder leer (nur Bis)."); return false; } // Ordnungszahl pruefen try { Integer.parseInt(tOrd.getText()); } catch (NumberFormatException nfe) { setMessage("Fehler: Ungültige Ordnungszahl. Erwarte Ganzzahl."); return false; } // Format der Dosierungen pruefen if (!validateDosierung(tDoMorgen.getText()) || !validateDosierung(tDoMittag.getText()) || !validateDosierung(tDoAbend.getText()) || !validateDosierung(tDoNacht.getText())) { setMessage("Fehler: Ungültige Dosierung. Erwarte nicht-negative " + "Ganzzahl, Bruch mit positivem, ganzzahligem Zähler " + "und Nenner, oder x für Einnahme gemäss separater " + "Verschreibungskarte."); return false; } return true; } @Override public void okPressed(){ if (!validateInput()) return; String dosierung = tDoMorgen.getText() + "-" + tDoMittag.getText() + "-" + tDoAbend.getText() + "-" + tDoNacht.getText(); dosierung = dosierung.toUpperCase(); String bemerkung = cEV.getItem(cEV.getSelectionIndex()); int ordnungszahl = Integer.parseInt(tOrd.getText()); // Spezialfall, nur Ordnungszahl geaendert, muss nicht aktenkundig sein if (presc != null && presc.getDosis().equals(dosierung) && presc.getBeginDate().equals(tVon.getText()) && presc.getEndDate().equals(tBis.getText()) && presc.getBemerkung().equals(bemerkung) && MedikarteHelpers.getPZweck(presc).equals(tZweck.getText())) { MedikarteHelpers.setOrdnungszahl(presc, ordnungszahl); close(); return; } if (presc != null && !presc.isDeleted() && presc.getEndDate().equals("")) { TimeTool ttOld = new TimeTool(presc.getBeginDate()); TimeTool ttNew = new TimeTool(tVon.getText()); // Wenn das neue vonDatum >= das alte von Datum ist, setzen wir das // bis Datum des bestehenden Medikamentes darauf. Sind sie gleich // wird die bisherige verschreibung geloescht. int cmp = ttOld.compareTo(ttNew); if (cmp == 0) { presc.remove(); } else if (cmp < 0) { presc.setEndDate(tVon.getText()); } } presc = new Prescription(fm.getArtikel(), pat, dosierung, bemerkung); presc.setBeginDate(tVon.getText()); presc.setEndDate(tBis.getText()); MedikarteHelpers.setOrdnungszahl(presc, Integer.parseInt(tOrd.getText())); MedikarteHelpers.setPZweck(presc, tZweck.getText()); close(); } }