package com.hilotec.elexis.kgview.medikarte; import java.util.Comparator; import ch.elexis.data.Artikel; import ch.elexis.data.Prescription; import ch.rgw.tools.TimeTool; import com.hilotec.elexis.kgview.data.FavMedikament; /** * Comparator fuer Medikamentenkarteeintraege (Prescription) */ public class MedikarteEintragComparator implements Comparator<Prescription> { public enum Sortierung { ALPHABETISCH, CHRONOLOGISCH, ORDNUNGSZAHL, }; MedikarteEintragComparator.Sortierung sort; public MedikarteEintragComparator(MedikarteEintragComparator.Sortierung sort) { this.sort = sort; } // Helper zum Sortieren weil wir die 0 ganz unten wollen private int oz(int o) { return (o == 0 ? Integer.MAX_VALUE : o); } /** Sortierung nur alphabetisch */ private int compareNurLabel(Prescription p1, Prescription p2) { Artikel a1 = p1.getArtikel(); Artikel a2 = p2.getArtikel(); // Alphabetisch nach Fav-Medi Name FavMedikament fm1 = FavMedikament.load(a1); FavMedikament fm2 = FavMedikament.load(a2); if (fm1 != null && fm2 != null) return fm1.getBezeichnung().compareTo( fm2.getBezeichnung()); // Als letzte Moeglichkeit nehmen wir das Artikel-Label return a1.getLabel().compareTo(a2.getLabel()); } /** Sortierung nur chronologisch (neuste zuoberst) */ private int compareNurChronologisch(Prescription p1, Prescription p2) { TimeTool b1 = new TimeTool(p1.getBeginDate()); TimeTool b2 = new TimeTool(p2.getBeginDate()); TimeTool e1 = new TimeTool(p1.getEndDate()); TimeTool e2 = new TimeTool(p2.getEndDate()); // Sortieren nach Startdatum int bc = b1.compareTo(b2); if (bc != 0) return -bc; // Sortieren nach Enddatum return -e1.compareTo(e2); } /** Sortierung nach Ordnungszahl */ private int compareOz(Prescription p1, Prescription p2) { Integer o1 = oz(MedikarteHelpers.getOrdnungszahl(p1)); Integer o2 = oz(MedikarteHelpers.getOrdnungszahl(p2)); if (!o1.equals(o2)) return o1.compareTo(o2); // Als fallback sortieren wir chronologisch return compareNurLabel(p1, p2); } /** Sortierung chronologisch */ private int compareCh(Prescription p1, Prescription p2) { int ord = compareNurChronologisch(p1, p2); if (ord != 0) return ord; // Als Fallback sortieren wir alphabetisch return compareNurLabel(p1, p2); } /** Sortierung alphabetisch */ public int compareAl(Prescription p1, Prescription p2) { int ord = compareNurLabel(p1, p2); if (ord != 0) return ord; // Als Fallback sortieren wir chronologisch return compareCh(p1, p2); } public int compare(Prescription p1, Prescription p2) { switch (sort) { case ALPHABETISCH: return compareAl(p1, p2); case CHRONOLOGISCH: return compareCh(p1, p2); case ORDNUNGSZAHL: return compareOz(p1, p2); } throw new RuntimeException("Unbekannte Sortierungsreihenfolge"); } }