/*******************************************************************************
* Copyright (c) 2007-2011, G. Weirich and Elexis
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* G. Weirich - initial implementation
*******************************************************************************/
package ch.elexis.base.ch.medikamente.bag.views;
import java.sql.PreparedStatement;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.TableViewer;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.data.service.StockService;
import ch.elexis.core.ui.UiDesk;
import ch.elexis.core.ui.actions.FlatDataLoader;
import ch.elexis.core.ui.util.viewers.CommonViewer;
import ch.elexis.data.Artikel;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Query;
import ch.elexis.medikamente.bag.data.BAGMedi;
import ch.elexis.medikamente.bag.data.Substance;
import ch.rgw.tools.IFilter;
import ch.rgw.tools.JdbcLink;
import ch.rgw.tools.StringTool;
public class BagMediContentProvider extends FlatDataLoader {
PreparedStatement psSubst, psNotes, psMedi;
private List<String> ids;
private BAGMedi[] medis;
private boolean bOnlyGenerics = false;
private String sGroup = "";
private boolean bOnlyStock;
static final String FROM_SUBSTANCE = "SELECT j.product FROM " + BAGMedi.JOINTTABLE + " j, "
+ Substance.TABLENAME + " s WHERE j.Substance=s.ID AND s.name LIKE ";
public BagMediContentProvider(CommonViewer cv, Query<? extends PersistentObject> qbe){
super(cv, qbe);
qbe.addPostQueryFilter(new QueryFilter());
StringBuilder sql = new StringBuilder();
sql.append("SELECT m.product FROM ").append(BAGMedi.JOINTTABLE).append(" m, ")
.append(Substance.TABLENAME).append(" s WHERE m.Substance=s.ID AND s.name LIKE ?;");
psSubst = PersistentObject.getConnection().prepareStatement(sql.toString());
sql.setLength(0);
sql.append("SELECT id FROM ").append(BAGMedi.EXTTABLE).append(" WHERE Keywords LIKE ?;");
psNotes = PersistentObject.getConnection().prepareStatement(sql.toString());
}
@Override
public IStatus work(IProgressMonitor monitor, HashMap<String, Object> params){
final TableViewer tv = (TableViewer) cv.getViewerWidget();
// SortedSet<BAGMedi> coll=new TreeSet<BAGMedi>();
qbe.clear();
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
if (sGroup.length() > 0) {
qbe.add("Gruppe", "=", sGroup);
medis = qbe.execute().toArray(new BAGMedi[0]);
cv.getConfigurer().getControlFieldProvider().clearValues();
sGroup = "";
} else {
// String[] values=cv.getConfigurer().getControlFieldProvider().getValues();
HashMap<String, String> values = (HashMap<String, String>) params.get(PARAM_VALUES);
if (values == null) {
values = new HashMap<String, String>();
}
if (values.isEmpty()) {
qbe.orderBy(false, new String[] {
BAGMedi.FLD_NAME
});
medis = qbe.execute().toArray(new BAGMedi[0]);
} else {
String subst = values.get(BAGMediSelector.FIELD_SUBSTANCE);
String notes = values.get(BAGMediSelector.FIELD_NOTES);
String names = values.get(BAGMediSelector.FIELD_NAME);
if (StringTool.isNothing(subst) && StringTool.isNothing(notes)) {
qbe.add(BAGMedi.FLD_NAME, "Like", names + "%", true);
if (bOnlyGenerics) {
qbe.add("Generikum", "LIKE", "G%");
}
qbe.orderBy(false, new String[] {
BAGMedi.FLD_NAME
});
List<? extends PersistentObject> result = qbe.execute();
if (bOnlyStock) {
result = result.stream()
.filter(a -> (CoreHub.getStockService()
.getCumulatedAvailabilityForArticle((Artikel) a) != null))
.collect(Collectors.toList());
}
medis = result.toArray(new BAGMedi[0]);
} else {
if (!StringTool.isNothing(subst)) {
String sql = FROM_SUBSTANCE + JdbcLink.wrap(subst + "%");
Collection<BAGMedi> mediRaw =
(Collection<BAGMedi>) qbe.queryExpression(sql, null);
if (mediRaw == null) {
medis = new BAGMedi[0];
} else {
medis = mediRaw.toArray(new BAGMedi[0]);
}
} else if (!StringTool.isNothing(notes)) {
ids = qbe.execute(psNotes, new String[] {
"%" + notes + "%"
});
medis = new BAGMedi[ids.size()];
} else {
medis = new BAGMedi[0];
}
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
}
}
}
UiDesk.asyncExec(new Runnable() {
public void run(){
tv.setItemCount(0);
// tv.remove(LOADMESSAGE);
tv.setItemCount(medis.length);
}
});
return Status.OK_STATUS;
}
@Override
public void updateElement(int index){
if (index < medis.length) {
if (medis[index] == null) {
medis[index] = BAGMedi.load(ids.get(index));
}
TableViewer tv = (TableViewer) cv.getViewerWidget();
tv.replace(medis[index], index);
}
}
public void setGroup(String group){
sGroup = group;
}
public boolean toggleGenericsOnly(){
bOnlyGenerics = !bOnlyGenerics;
return bOnlyGenerics;
}
public boolean toggleStockOnly(){
bOnlyStock = !bOnlyStock;
return bOnlyStock;
}
class QueryFilter implements IFilter {
public boolean select(Object element){
BAGMedi medi = (BAGMedi) element;
if (bOnlyGenerics && !medi.isGenericum()) {
return false;
}
return true;
}
}
}