package ch.elexis.core.ui.proposals; import java.util.LinkedList; import java.util.List; import org.eclipse.jface.fieldassist.ContentProposal; import org.eclipse.jface.fieldassist.IContentProposal; import org.eclipse.jface.fieldassist.IContentProposalProvider; import ch.elexis.data.Mandant; import ch.elexis.data.PersistentObject; import ch.elexis.data.Query; public class PersistentObjectProposalProvider<T extends PersistentObject> implements IContentProposalProvider { private List<PersistentObjectContentProposal<T>> proposals = new LinkedList<PersistentObjectContentProposal<T>>(); private Query<T> query; private List<T> queryResults = new LinkedList<T>(); public PersistentObjectProposalProvider(Class<? extends PersistentObject> clazz){ this(clazz, null, null, null); } /** * Add an optional query filter to the content proposal * * @param field * @param operator * @param value */ public PersistentObjectProposalProvider(Class<? extends PersistentObject> clazz, String field, String operator, String value){ query = new Query<T>(clazz); if (field != null) query.add(field, operator, value); } @Override public IContentProposal[] getProposals(String contents, int position){ if (contents == null || contents.length() < 1) return null; if (position == 1) { // refresh all available from database queryResults.clear(); queryResults = query.execute(); } proposals.clear(); for (T a : queryResults) { String label = getLabelForObject(a); if (label.toLowerCase().startsWith(contents.toLowerCase())) { proposals.add(new PersistentObjectContentProposal<T>(label, a)); } } return proposals.toArray(new ContentProposal[] {}); } /** * The label to add on the content proposal. Normally not required to be overriden. One example, * however, is {@link Mandant} as the real label is gathered using * {@link Mandant#getMandantLabel()} here. * * @param a * @return */ public String getLabelForObject(T a){ return a.getLabel(); } }