package at.medevit.ch.artikelstamm.medcalendar.ui.provider; import java.util.HashMap; import java.util.List; import org.apache.commons.lang.StringUtils; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import at.medevit.ch.artikelstamm.elexis.common.ui.cv.MephaPrefferedProviderSorterAction; import at.medevit.ch.artikelstamm.medcalendar.MedCalendarSection; import at.medevit.ch.artikelstamm.medcalendar.Messages; import ch.artikelstamm.elexis.common.ArtikelstammItem; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.ui.UiDesk; import ch.elexis.core.ui.actions.FlatDataLoader; import ch.elexis.core.ui.selectors.ActiveControl; import ch.elexis.core.ui.util.viewers.CommonViewer; import ch.elexis.core.ui.util.viewers.SelectorPanelProvider; import ch.elexis.core.ui.util.viewers.ViewerConfigurer.ControlFieldProvider; import ch.elexis.data.PersistentObject; import ch.elexis.data.Query; public class MedCalArtikelstammFlatDataLoader extends FlatDataLoader implements IDoubleClickListener { private MedCalQueryFilter medCalQueryFilter = new MedCalQueryFilter(); private boolean useMedCalQueryFilter = false; private boolean useMephaPreferredSorter = false; private String filterValueStore; @SuppressWarnings("rawtypes") private List filtered = null; @SuppressWarnings("rawtypes") private List raw = null; private SelectorPanelProvider slp; public MedCalArtikelstammFlatDataLoader(CommonViewer cv, Query<? extends PersistentObject> qbe, SelectorPanelProvider slp){ super(cv, qbe); this.slp = slp; setOrderFields(ArtikelstammItem.FLD_DSCR); applyQueryFilters(); addQueryFilter(new IncludeEANQueryFilter()); addQueryFilter(new NoVersionQueryFilter()); useMephaPreferredSorter = CoreHub.globalCfg.get(MephaPrefferedProviderSorterAction.CFG_PREFER_MEPHA, false); } @Override public void doubleClick(DoubleClickEvent event){ StructuredSelection selection = (StructuredSelection) event.getSelection(); if (selection.getFirstElement() == null) return; if (selection.getFirstElement() instanceof MedCalFilterInfoElement) { slp.clearValues(); ActiveControl ac = slp.getPanel().getControls().get(0); ac.setText((filterValueStore != null) ? filterValueStore : ""); setMedCalQueryFilterValue(null); } } /** * Set the MedCalendarSection value to filter the selector * * @param filterValue * a MedCalendarSection value or <code>null</code> to remove */ public void setMedCalQueryFilterValue(MedCalendarSection filterValue){ if (filterValue == null) { removeQueryFilter(medCalQueryFilter); medCalQueryFilter.setSectionFilter(null); } else { slp.clearValues(); medCalQueryFilter.setSectionFilter(filterValue); addQueryFilter(medCalQueryFilter); } dj.launch(0); } /** * set the med cal query filter to active or inactive * * @param useMedCalQueryFilter */ public void setUseMedCalQueryFilter(boolean useMedCalQueryFilter){ this.useMedCalQueryFilter = useMedCalQueryFilter; if (!useMedCalQueryFilter) { removeQueryFilter(medCalQueryFilter); medCalQueryFilter.setSectionFilter(null); } dj.launch(0); } /** * * @return <code>true</code> if the medCal query filter is active */ public boolean isUseMedCalQueryFilter(){ return useMedCalQueryFilter; } @Override public IStatus work(IProgressMonitor monitor, HashMap<String, Object> params){ if (isSuspended()) { return Status.CANCEL_STATUS; } final TableViewer tv = (TableViewer) cv.getViewerWidget(); if (filtered != null) { filtered.clear(); } filtered = null; setQuery(); applyQueryFilters(); if (useMephaPreferredSorter) { // #3627 need to work-around qbe.addToken(" 1=1 ORDER BY FIELD(COMP_GLN, '7601001001121') DESC, DSCR ASC"); } else { if (orderFields != null) { qbe.orderBy(false, orderFields); } } if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } raw = qbe.execute(); if (useMedCalQueryFilter && medCalQueryFilter.isActive()) { addFilterInformation(); } if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } UiDesk.asyncExec(new Runnable() { public void run(){ // Avoid access to disposed table if (tv != null && !tv.getTable().isDisposed()) { tv.setItemCount(0); filtered = raw; tv.setItemCount(raw.size()); } } }); return Status.OK_STATUS; } private void addFilterInformation(){ MedCalendarSection sectionFilter = medCalQueryFilter.getSectionFilter(); String label = Messages.MedCalFilter + sectionFilter.getCode() + " " + sectionFilter.getName(); MedCalFilterInfoElement filterInfo = new MedCalFilterInfoElement(label); raw.add(0, filterInfo); } public void setResult(List<PersistentObject> res){ raw = res; } /** * prepare the query so it returns the appropriate Objects on execute(). The default * implemetation lets the ControlFieldProvider set the query. Subclasses may override */ protected void setQuery(){ qbe.clear(); ControlFieldProvider cfp = cv.getConfigurer().getControlFieldProvider(); if (cfp != null) { cfp.setQuery(qbe); } } /** * copied from {@link FlatDataLoader} */ public void updateElement(int index){ if (filtered != null) { if (index >= 0 && index < filtered.size()) { Object o = filtered.get(index); if (o != null) { TableViewer tv = (TableViewer) cv.getViewerWidget(); tv.replace(filtered.get(index), index); } } } } /** * should filtering prefer Mepha articles? #3627 * * @param doPrefer * if yes, first in list are Mepha articles A-Z then others A-Z */ public void setUseMephaPrefferedProviderSorter(boolean doPreferMepha){ this.useMephaPreferredSorter = doPreferMepha; dj.launch(0); } /** * This filter skips all entries with ID "VERSION" */ private class NoVersionQueryFilter implements QueryFilter { @Override public void apply(Query<? extends PersistentObject> qbe){ qbe.and(); qbe.add("ID", Query.NOT_EQUAL, "VERSION"); } } private class IncludeEANQueryFilter implements QueryFilter { @Override public void apply(Query<? extends PersistentObject> qbe){ if (slp.getValues() != null) { String eanValue = slp.getValues()[0]; if (eanValue.length() > 0 && StringUtils.isNumeric(eanValue)) { qbe.or(); qbe.add(ArtikelstammItem.FLD_GTIN, Query.LIKE, eanValue + "%"); } } } } /** * This filter limits all results to a certain {@link MedCalendarSection} * */ private class MedCalQueryFilter implements QueryFilter { private MedCalendarSection sectionFilter; @Override public void apply(Query<? extends PersistentObject> qbe){ if (sectionFilter != null && !sectionFilter.getATCCodes().isEmpty()) { String first = sectionFilter.getATCCodes().get(0); for (String atc : sectionFilter.getATCCodes()) { if (!atc.equals(first)) { qbe.or(); } qbe.add(ArtikelstammItem.FLD_ATC, Query.LIKE, atc + "%"); } qbe.and(); } } public void setSectionFilter(MedCalendarSection sectionFilter){ this.sectionFilter = sectionFilter; } public MedCalendarSection getSectionFilter(){ return sectionFilter; } public boolean isActive(){ return sectionFilter != null; } } }