package ch.elexis.data; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.elexis.core.constants.StringConstants; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.data.events.ElexisEvent; import ch.elexis.core.data.events.ElexisEventDispatcher; import ch.elexis.core.data.events.ElexisEventListenerImpl; import ch.elexis.core.jdt.Nullable; import ch.elexis.core.model.IPersistentObject; public class VerrechenbarFavorites { public static final String USER_CFG_FAVORITES = "verrechenbar/favoriten"; private static List<Favorite> favorites; private static Logger log = LoggerFactory.getLogger(VerrechenbarFavorites.class); private static ElexisEventListenerImpl eeli_pat = new ElexisEventListenerImpl(Anwender.class, ElexisEvent.EVENT_USER_CHANGED) { public void run(ElexisEvent ev){ log.debug("User changed, nulling favorites."); favorites = null; }; }; static { ElexisEventDispatcher.getInstance().addListeners(eeli_pat); } /** * * @return the favorite {@link VerrechenbarAdapter} elements of THIS user, in a pre-ordered list */ public static List<Favorite> getFavorites(){ if (favorites == null) { favorites = new ArrayList<VerrechenbarFavorites.Favorite>(); String favs = CoreHub.userCfg.get(USER_CFG_FAVORITES, ""); String[] entries = favs.split(";"); for (int i = 0; i < entries.length; i++) { String entry = entries[i]; if (entry.contains(",")) { String[] value = entry.split(","); Favorite f = new Favorite(value[1], value[0], i); favorites.add(f); } } Collections.sort(favorites); } return favorites; } public static void storeFavorites(){ StringBuilder sb = new StringBuilder(); for (int i = 0; i < favorites.size(); i++) { Favorite f = favorites.get(i); sb.append(f.macroString + "," + f.storeToString); if (i != favorites.size() - 1) sb.append(";"); } CoreHub.userCfg.set(USER_CFG_FAVORITES, sb.toString()); CoreHub.userCfg.flush(); } /** * @param val * toggle element as favorite of the user * @since 3.1 */ public static void setFavorite(IPersistentObject po, boolean val){ Favorite fav = VerrechenbarFavorites.isFavorite(po); if (val) { if (fav != null) return; String storeToString; if (po instanceof Leistungsblock) { storeToString = Leistungsblock.class.getName() + StringConstants.DOUBLECOLON + po.getId(); } else { storeToString = po.storeToString(); } VerrechenbarFavorites.getFavorites().add(new Favorite(storeToString, "", 0)); } else { if (fav == null) return; VerrechenbarFavorites.getFavorites().remove(fav); } // TODO reload favorites view VerrechenbarFavorites.storeFavorites(); } /** * * @return the {@link Favorite} if a favorite {@link VerrechenbarAdapter} of this user, else * null */ public static Favorite isFavorite(IPersistentObject po){ for (Favorite favorite : getFavorites()) { String comparator = ""; if (po instanceof Leistungsblock) { comparator = Leistungsblock.class.getName() + StringConstants.DOUBLECOLON + po.getId(); } else { comparator = po.storeToString(); } if (comparator.equalsIgnoreCase(favorite.storeToString)) { return favorite; } } return null; } /** * Find the favorite for a provided macro by current user * * @return * @since 3.1 */ public static @Nullable Favorite findFavoritByMacroForCurrentUser(@Nullable String macro){ if (macro == null) return null; for (Favorite favorite : getFavorites()) { if (macro.equals(favorite.macroString)) return favorite; } return null; } public static class Favorite implements Comparable<Favorite> { String storeToString; String macroString; int order; private PersistentObjectFactory pof = new PersistentObjectFactory(); public Favorite(String storeToString, String macroString, int order){ this.storeToString = storeToString; this.macroString = macroString; this.order = order; } @Override public int compareTo(Favorite o){ return Integer.compare(order, o.order); } public String getStoreToString(){ return storeToString; } public void setStoreToString(String storeToString){ this.storeToString = storeToString; } public String getMacroString(){ if (storeToString.startsWith(Leistungsblock.class.getName())) { Leistungsblock po = (Leistungsblock) getPersistentObject(); return (po != null) ? po.getMacro() : macroString; } return macroString; } public void setMacroString(String macroString){ if (storeToString.startsWith(Leistungsblock.class.getName())) { Leistungsblock po = (Leistungsblock) getPersistentObject(); if (po != null) { po.setMacro(macroString); } else { log.warn("Could not set macroString " + macroString + " to Leistungsblock as po is null."); } } this.macroString = macroString; } public int getOrder(){ return order; } public void setOrder(int order){ this.order = order; } /** * @return the {@link IPersistentObject} as resolved via {@link #storeToString}, * <code>null</code> if erroneous */ public @Nullable IPersistentObject getPersistentObject(){ return pof.createFromString(storeToString); } } }