package com.hilotec.elexis.kgview;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Composite;
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 org.eclipse.ui.plugin.AbstractUIPlugin;
import ch.elexis.core.data.activator.CoreHub;
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.actions.GlobalActions;
import ch.elexis.core.ui.icons.Images;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.core.ui.util.ViewMenus;
import ch.elexis.data.Konsultation;
import ch.elexis.data.Mandant;
import ch.elexis.data.Patient;
import com.hilotec.elexis.kgview.data.KonsData;
/**
* Einfache Konsultationsliste die aber auch auf Konsultationszeiten Ruecksicht nimmt beim
* Sortieren.
*/
public class Konsliste extends ViewPart implements ElexisEventListener {
protected TableViewer tv;
protected SelListener sl;
/**
* Wrapper um globale delKonsAction da diese keine Bestaetigung verlangt.
*/
class KonsLoeschenAct extends Action {
public KonsLoeschenAct(){
setImageDescriptor(Images.IMG_DELETE.getImageDescriptor());
setText("Konsultation löschen");
setToolTipText("Aktuell ausgewählte Konsultation löschen");
}
@Override
public void run(){
Konsultation k = (Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class);
if (k != null
&& SWTHelper.askYesNo("Konsultation löschen",
"Soll die aktuell ausgewählte Konsultation wirklich "
+ "gelöscht werden?\nDieser Vorgang kann nicht Rückgängig"
+ "gemacht werden."))
GlobalActions.delKonsAction.run();
}
}
@Override
public void createPartControl(Composite parent){
tv = new TableViewer(parent, SWT.SINGLE | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.BORDER);
Table t = tv.getTable();
t.setHeaderVisible(true);
// Konfiguriere Tabellenspalten
TableLayout layout = new TableLayout();
layout.addColumnData(new ColumnPixelData(20));
layout.addColumnData(new ColumnPixelData(70));
layout.addColumnData(new ColumnPixelData(50));
layout.addColumnData(new ColumnWeightData(10));
t.setLayout(layout);
TableColumn tc = new TableColumn(t, 0);
tc = new TableColumn(t, 0);
tc.setText("Datum");
tc = new TableColumn(t, 0);
tc.setText("Zeit");
tc = new TableColumn(t, 0);
tc.setText("Fall");
// Inhalt
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){
return ArchivKG.getKonsultationen(pat, false).toArray();
}
});
// Label provider um mehrzeilige Zellen zu erlauben
tv.setLabelProvider(new CellLabelProvider() {
private Color mandantColor(Mandant m){
return UiDesk.getColorFromRGB(CoreHub.globalCfg.get(
ch.elexis.core.constants.Preferences.USR_MANDATOR_COLORS_PREFIX + m.getLabel(),
"ffffff"));
}
@Override
public void update(ViewerCell cell){
Konsultation k = (Konsultation) cell.getElement();
KonsData kd = KonsData.load(k);
String s = "";
switch (cell.getColumnIndex()) {
case 0:
int typ = kd.getKonsTyp();
ImageDescriptor desc = null;
if (typ == KonsData.KONSTYP_TELEFON)
desc =
AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID,
"rsc/phone.png");
else if (typ == KonsData.KONSTYP_HAUSBESUCH)
desc = Images.IMG_HOME.getImageDescriptor();
if (desc != null)
cell.setImage(desc.createImage());
break;
case 1:
s = k.getDatum();
break;
case 2:
s = (kd == null ? "" : kd.getKonsBeginn());
break;
case 3:
s = k.getFall().getLabel();
break;
}
// Zum Mandanten passende Hintergrundfarbe
cell.setBackground(mandantColor(k.getMandant()));
cell.setText(s);
}
});
// 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;
Konsultation k = (Konsultation) tis[0].getData();
ElexisEventDispatcher.fireSelectionEvent(k);
}
});
// Menuleiste
ViewMenus menus = new ViewMenus(getViewSite());
menus.createToolbar(new ArchivKG.NeueKonsAct(KonsData.KONSTYP_NORMAL),
new ArchivKG.NeueKonsAct(KonsData.KONSTYP_TELEFON), new ArchivKG.NeueKonsAct(
KonsData.KONSTYP_HAUSBESUCH), null, new ArchivKG.KonsAendernAct(),
new KonsLoeschenAct());
tv.setInput(ElexisEventDispatcher.getSelectedPatient());
sl = new SelListener();
sl.init();
ElexisEventDispatcher.getInstance().addListeners(this);
}
@Override
public void dispose(){
ElexisEventDispatcher.getInstance().removeListeners(this);
sl.destroy();
super.dispose();
}
/** Selection Listener um bei Patientenwechsel zu aktualisieren */
private class SelListener extends POSelectionListener<Patient> {
protected void deselected(Patient p){
tv.setInput(null);
}
protected void selected(Patient p){
tv.setInput(p);
}
}
@Override
public void setFocus(){}
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;
}
}