package com.hilotec.elexis.kgview.medikarte;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.action.Action;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.part.ViewPart;
import ch.elexis.core.data.events.ElexisEvent;
import ch.elexis.core.data.events.ElexisEventDispatcher;
import ch.elexis.core.data.events.ElexisEventListener;
import ch.elexis.core.ui.UiDesk;
import ch.elexis.core.ui.util.PersistentObjectDragSource;
import ch.elexis.core.ui.util.PersistentObjectDropTarget;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.core.ui.util.ViewMenus;
import ch.elexis.data.Artikel;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Query;
import com.hilotec.elexis.kgview.Preferences;
import com.hilotec.elexis.kgview.data.FavMedikament;
/**
* Liste der Favorisierten Medikamente anzeigen. Bietet die Möglichkeit zu suchen, neue Eintraege zu
* erstellen indem ein neues Medikament per Drag&Drop auf die Tabelle gezogen wird, Eintraege zu
* veraendern und zu loeschen.
*
* @author Antoine Kaufmann
*/
public class FavMedikamentListe extends ViewPart implements ElexisEventListener {
public static final String ID = "com.hilotec.elexis.kgview.medikarte.FavMedikamentListe";
private Text suche;
private Table table;
private Action actEdit;
private Action actDelete;
private Action actCheckList;
@Override
public void createPartControl(Composite parent){
parent.setLayout(new GridLayout(2, false));
Label l = new Label(parent, SWT.NONE);
l.setText("Suche");
GridData gd = new GridData();
gd.horizontalAlignment = GridData.FILL;
gd.grabExcessHorizontalSpace = true;
suche = new Text(parent, SWT.BORDER);
suche.setLayoutData(gd);
suche.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e){
refresh();
}
});
gd = new GridData();
gd.horizontalSpan = 2;
gd.horizontalAlignment = GridData.FILL;
gd.verticalAlignment = GridData.FILL;
gd.grabExcessHorizontalSpace = true;
gd.grabExcessVerticalSpace = true;
table = new Table(parent, SWT.V_SCROLL | SWT.SINGLE | SWT.FULL_SELECTION);
table.setLayoutData(gd);
table.setHeaderVisible(true);
table.setLinesVisible(true);
TableColumn tc;
tc = new TableColumn(table, 0);
tc.setText("Bezeichnung");
tc.setWidth(180);
tc = new TableColumn(table, 0);
tc.setText("Zweck");
tc.setWidth(180);
tc = new TableColumn(table, 0);
tc.setText("Einheit");
tc.setWidth(40);
if (Preferences.getOrdnungszahlInFML()) {
tc = new TableColumn(table, 0);
tc.setText("Ordnungszahl");
tc.setWidth(40);
}
// Drop Target um neue Eintraege zu erstellen
new PersistentObjectDropTarget(table, new PersistentObjectDropTarget.IReceiver() {
@Override
public void dropped(PersistentObject o, DropTargetEvent e){
Artikel a = (Artikel) o;
new FavMedikamentDialog(getSite().getShell(), a).open();
}
@Override
public boolean accept(PersistentObject o){
if (o instanceof Artikel) {
Artikel a = (Artikel) o;
// Droppen nur erlauben wenn Medikament noch nicht in Liste
FavMedikament fm = FavMedikament.load(a.getId());
return (fm == null);
}
return false;
}
});
// Drag Source um die Eintraege zu benutzen
// XXX: Dabei wird kein FavMedikament mitgeben sondern direkt der
// Artikel
new PersistentObjectDragSource(table, new PersistentObjectDragSource.ISelectionRenderer() {
public List<PersistentObject> getSelection(){
TableItem[] tis = table.getSelection();
if (table.getSelection() == null)
return null;
ArrayList<PersistentObject> res = new ArrayList<PersistentObject>(tis.length);
for (TableItem ti : tis) {
FavMedikament fm = (FavMedikament) ti.getData();
res.add(fm.getArtikel());
}
return res;
}
});
makeActions();
// Mouse Listener zum aendern von Eintraegen
table.addMouseListener(new MouseListener() {
public void mouseUp(MouseEvent e){}
public void mouseDown(MouseEvent e){}
public void mouseDoubleClick(MouseEvent e){
actEdit.run();
}
});
// Key Listener zum Loeschen von Eintraegen
table.addKeyListener(new KeyListener() {
public void keyReleased(KeyEvent e){}
public void keyPressed(KeyEvent e){
if (e.keyCode != SWT.DEL)
return;
actDelete.run();
}
});
// Kontextmenü für Liste
ViewMenus menus = new ViewMenus(getViewSite());
menus.createMenu(actCheckList);
menus.createControlContextMenu(table, actEdit, actDelete);
refresh();
ElexisEventDispatcher.getInstance().addListeners(this);
}
/** Formatiere Volltext (mit \n) fuer Darstellung in Tabelle. */
private String fmtVolltext(String text){
return text.replaceAll("[\\n\\r]+", ", ");
}
/**
* Liste neu laden.
*/
private void refresh(){
Query<FavMedikament> qMeds = new Query<FavMedikament>(FavMedikament.class);
// XXX: Irgendwie unschoen
qMeds.add("ID", Query.NOT_EQUAL, "VERSION");
String suchstring = suche.getText();
if (!suchstring.isEmpty()) {
qMeds.add(FavMedikament.FLD_BEZEICHNUNG, Query.LIKE, "%" + suchstring + "%");
}
qMeds.orderBy(false, FavMedikament.FLD_BEZEICHNUNG);
List<FavMedikament> meds = qMeds.execute();
table.removeAll();
for (FavMedikament med : meds) {
TableItem ti = new TableItem(table, 0);
ti.setData(med);
ti.setText(0, med.getBezeichnung());
ti.setText(1, fmtVolltext(med.getZweck()));
ti.setText(2, med.getEinheit());
if (Preferences.getOrdnungszahlInFML()) {
ti.setText(3, Integer.toString(med.getOrdnungszahl()));
}
}
}
/**
* FavMedis auf tote Medikamente pruefen, und ggf. versuchen neu zu verlinken.
*/
private static void checkFavMediList(){
StringBuilder sb = new StringBuilder();
for (FavMedikament fm : FavMedikament.getAll()) {
Artikel art = fm.getArtikel();
// Wir interessieren uns nur fuer geloeschte Artikel
if (art.exists())
continue;
String pk = art.get(Artikel.FLD_SUB_ID);
if (pk == null || pk.isEmpty() || pk.equals("0")) {
sb.append("Kann nicht verknüpft werden: ");
sb.append(fm.getBezeichnung());
sb.append("\n");
continue;
}
Query<Artikel> aq = new Query<Artikel>(Artikel.class);
aq.clear();
aq.add(Artikel.FLD_SUB_ID, Query.EQUALS, pk);
List<Artikel> al = aq.execute();
if (al.isEmpty()) {
sb.append("Keine Alternative gefunden: ");
sb.append(fm.getBezeichnung());
sb.append("\n");
continue;
}
boolean rl = false;
for (Artikel na : al) {
if (SWTHelper.askYesNo("Fav. Medikamente", "Soll '" + fm.getBezeichnung()
+ "' neu mit '" + na.getName() + "' verknüpft werden?")) {
fm.relinkTo(na);
rl = true;
break;
}
}
if (!rl) {
sb.append("Medikament nicht neu verknuepft: ");
sb.append(fm.getBezeichnung());
sb.append("\n");
}
}
if (sb.length() != 0) {
SWTHelper.showInfo("Favoriten Medikamenten-Listen check", sb.toString());
}
}
private void makeActions(){
actEdit = new Action("Bearbeiten", Action.AS_PUSH_BUTTON) {
@Override
public void run(){
TableItem[] tis = table.getSelection();
if (tis == null || tis.length != 1)
return;
new FavMedikamentDialog(getSite().getShell(), (FavMedikament) tis[0].getData())
.open();
refresh();
}
};
actDelete = new Action("Löschen", Action.AS_PUSH_BUTTON) {
@Override
public void run(){
TableItem[] tis = table.getSelection();
if (tis == null || tis.length == 0)
return;
// Nachfragen
if (!SWTHelper.askYesNo("Medikament(e) aus Liste entfernen",
"Sollen das/die ausgewählte(n) Medikament(e) aus der"
+ " Liste entfernt werden?"))
return;
for (TableItem ti : tis) {
FavMedikament fm = (FavMedikament) ti.getData();
fm.delete();
}
refresh();
}
};
actCheckList = new Action("Liste prüfen", Action.AS_PUSH_BUTTON) {
@Override
public void run(){
checkFavMediList();
}
};
}
@Override
public void setFocus(){}
@Override
public void dispose(){
ElexisEventDispatcher.getInstance().removeListeners(this);
super.dispose();
}
@Override
public void catchElexisEvent(ElexisEvent ev){
UiDesk.syncExec(new Runnable() {
public void run(){
refresh();
}
});
}
private final ElexisEvent eetmpl = new ElexisEvent(null, FavMedikament.class,
ElexisEvent.EVENT_CREATE | ElexisEvent.EVENT_DELETE | ElexisEvent.EVENT_UPDATE
| ElexisEvent.EVENT_RELOAD);
@Override
public ElexisEvent getElexisEventFilter(){
return eetmpl;
}
}