package com.hilotec.elexis.kgview;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.OwnerDrawLabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
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.data.Konsultation;
import ch.elexis.data.Patient;
import ch.rgw.tools.StringTool;
import com.hilotec.elexis.kgview.data.KonsData;
public class Problemliste extends ViewPart implements ElexisEventListener {
final public static String ID = "com.hilotec.elexis.kgview.Problemliste";
private TableViewer tv;
@Override
public void createPartControl(Composite parent){
tv = new TableViewer(parent);
Table t = tv.getTable();
t.setHeaderVisible(true);
TableLayout layout = new TableLayout();
layout.addColumnData(new ColumnPixelData(70));
layout.addColumnData(new ColumnPixelData(70));
t.setLayout(layout);
TableColumn tc = new TableColumn(t, 0);
tc.setText("Datum");
tc = new TableColumn(t, 0);
tc.setText("Diagnose");
tv.setContentProvider(new IStructuredContentProvider() {
private Patient pat;
public void inputChanged(Viewer viewer, Object oldInput, Object newInput){
this.pat = (Patient) newInput;
}
public void dispose(){}
public Object[] getElements(Object inputElement){
List<Konsultation> kl = ArchivKG.getKonsultationen(pat, false);
ArrayList<KonsData> list = new ArrayList<KonsData>(kl.size());
// Liste mit KonsDatas zusammenstellen
for (Konsultation k : kl) {
KonsData kd = KonsData.load(k);
if (kd == null || StringTool.isNothing(kd.getDiagnose()))
continue;
list.add(kd);
}
return list.toArray();
}
});
// Label provider um mehrzeilige Zellen zu erlauben
tv.setLabelProvider(new OwnerDrawLabelProvider() {
private String getText(KonsData kd, Event event){
if (event.index == 0)
return kd.getKonsultation().getDatum();
else
return StringTool.unNull(kd.getDiagnose());
}
protected void paint(Event event, Object element){
KonsData kd = (KonsData) element;
String text = getText(kd, event);
event.gc.drawText(text, event.x, event.y, true);
}
protected void measure(Event event, Object element){
KonsData kd = (KonsData) element;
String text = getText(kd, event);
Point size = event.gc.textExtent(text);
event.width = tv.getTable().getColumn(event.index).getWidth();
if (event.width == 0)
event.width = 1;
int lines = size.x / event.width + 1;
event.height = size.y * lines;
}
});
// Doppelklick-Listener zum selektieren der Konsultation
tv.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event){
TableItem[] tis = tv.getTable().getSelection();
if (tis.length != 1)
return;
KonsData kd = (KonsData) tis[0].getData();
ElexisEventDispatcher.fireSelectionEvent(kd.getKonsultation());
}
});
// Drag source um per D&D Diagnosen in die Diagnoseliste uebernehmen zu
// koennen.
new PersistentObjectDragSource(tv);
tv.setInput(ElexisEventDispatcher.getSelectedPatient());
new SelListener().init();
ElexisEventDispatcher.getInstance().addListeners(this);
}
@Override
public void dispose(){
ElexisEventDispatcher.getInstance().removeListeners(this);
super.dispose();
}
public void setFocus(){}
/** Selection Listener um bei Patientenwechsel zu aktualisieren */
private class SelListener extends POSelectionListener<Patient> {
protected void deselected(Patient p){
if (tv.getControl() != null && !tv.getControl().isDisposed()) {
tv.setInput(null);
}
}
protected void selected(Patient p){
if (tv.getControl() != null && !tv.getControl().isDisposed()) {
tv.setInput(p);
}
}
}
public void catchElexisEvent(ElexisEvent ev){
UiDesk.syncExec(new Runnable() {
public void run(){
tv.refresh();
}
});
}
private ElexisEvent eetmpl = new ElexisEvent(null, Konsultation.class, ElexisEvent.EVENT_CREATE
| ElexisEvent.EVENT_UPDATE | ElexisEvent.EVENT_DELETE);
public ElexisEvent getElexisEventFilter(){
return eetmpl;
}
}