/******************************************************************************* * Copyright (c) 2007-2013, D. Lutz 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 * D. Lutz - new version for Iatrix * G. Weirich - adapted to API-Changes * * Sponsors: * Dr. Peter Schönbucher, Luzern ******************************************************************************/ package org.iatrix.widgets; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.IJobChangeListener; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.viewers.IFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.TableWrapLayout; import org.iatrix.Iatrix; import org.iatrix.widgets.KonsListComposite.KonsData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.ui.actions.ObjectFilterRegistry; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.data.Fall; import ch.elexis.data.Konsultation; import ch.elexis.data.Patient; import ch.elexis.data.Query; /** * Anzeige der vergangenen Konsultationen inkl. Verrechnung. Der Patient wird ueber die Methode * setPatient(Patient) festgelegt. * * @author Daniel Lutz * */ public class KonsListDisplay extends Composite implements IJobChangeListener, IJournalArea { private final FormToolkit toolkit; private final ScrolledForm form; private final Composite formBody; private final KonsListComposite konsListComposite; private final KonsLoader dataLoader; private static Logger log = LoggerFactory.getLogger(org.iatrix.widgets.KonsListDisplay.class); // if false, only show the charges of the latest 2 consultations private boolean showAllCharges = false; // if false, only show the latest MAX_SHOWN_CONSULTATIONS private boolean showAllConsultations = false; public KonsListDisplay(Composite parent){ super(parent, SWT.BORDER); setLayout(new FillLayout()); toolkit = new FormToolkit(getDisplay()); form = toolkit.createScrolledForm(this); formBody = form.getBody(); formBody.setLayout(new TableWrapLayout()); konsListComposite = new KonsListComposite(formBody, toolkit); konsListComposite.setLayoutData(SWTHelper.getFillTableWrapData(1, true, 1, false)); dataLoader = new KonsLoader(); dataLoader.actKons = actKons; dataLoader.addJobChangeListener(this); } /** * reload contents * @param object */ private void reload(boolean showLoading, List<KonsData> konsultationen){ if (actKons!= null && konsultationen != null) { konsListComposite.setKonsultationen(konsultationen, actKons); } else { if (konsultationen == null) { konsListComposite.setKonsultationen(null, null); } else if (showLoading ) { konsListComposite.setKonsultationen(null, null); } } refresh(); } /* * re-display data */ private void refresh(){ // check for disposed widget to avoid error message at program exit if (form.isDisposed()) { dataLoader.cancel(); } else { form.reflow(true); } } class KonsLoader extends Job { String name; Patient patient = null; private boolean showAllCharges = true; private boolean showAllConsultations = true; List<KonsListComposite.KonsData> konsDataList = new ArrayList<>(); public Konsultation actKons; public KonsLoader(){ super("KonsLoader"); log.debug("loaderJob KonsLoader created"); } public void setKons(Konsultation kons, boolean showAllCharges, boolean showAllConsultations){ if (kons != null) { this.patient = kons.getFall().getPatient(); } else { this.patient = null; dataLoader.cancel(); } this.showAllCharges = showAllCharges; this.showAllConsultations = showAllConsultations; } @Override protected IStatus run(IProgressMonitor monitor) { synchronized (konsDataList) { log.debug("loaderJob started patient " + (patient == null ? "null" : patient.getPersonalia())); konsDataList.clear(); List<Konsultation> konsList = new ArrayList<>(); if (patient != null) { Fall[] faelle = patient.getFaelle(); if (faelle.length > 0) { IFilter globalFilter = ObjectFilterRegistry.getInstance().getFilterFor(Konsultation.class); Query<Konsultation> query = new Query<>(Konsultation.class); query.startGroup(); for (Fall fall : faelle) { query.add("FallID", "=", fall.getId()); query.or(); } query.endGroup(); query.orderBy(true, "Datum"); List<Konsultation> kons = query.execute(); if (monitor.isCanceled()) { monitor.done(); return Status.CANCEL_STATUS; } if (kons != null) { for (Konsultation k : kons) { if ( globalFilter == null || globalFilter.select(k)) { konsList.add(k); } } } } } if (monitor == null) { return Status.CANCEL_STATUS; } monitor.worked(1); if (CoreHub.globalCfg != null) { int maxShownConsultations = CoreHub.globalCfg.get(Iatrix.CFG_MAX_SHOWN_CONSULTATIONS, Iatrix.CFG_MAX_SHOWN_CONSULTATIONS_DEFAULT); if (!showAllConsultations && konsList.size() > maxShownConsultations) { // don't load all entries List<Konsultation> newList = new ArrayList<>(); for (int i = 0; i < maxShownConsultations; i++) { newList.add(konsList.get(i)); } konsList = newList; } } if (monitor.isCanceled()) { monitor.done(); return Status.CANCEL_STATUS; } if (CoreHub.globalCfg != null) { // convert Konsultation objects to KonsData objects int maxShownCharges = CoreHub.globalCfg.get(Iatrix.CFG_MAX_SHOWN_CHARGES, Iatrix.CFG_MAX_SHOWN_CHARGES_DEFAULT); int i = 0; // counter for maximally shown charges for (Konsultation k : konsList) { KonsListComposite.KonsData ks = new KonsListComposite.KonsData(k, showAllCharges || i < maxShownCharges); konsDataList.add(ks); i++; if (i > maxShownCharges) { break; } } } monitor.worked(1); monitor.done(); if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } else { return Status.OK_STATUS; } } } public List<KonsListComposite.KonsData> getKonsultationen(){ return konsDataList; } } @Override public void visible(boolean mode){ } @Override public void activation(boolean mode){ } static int savedKonsVersion = -1; static Konsultation actKons = null; @Override public void setKons(Konsultation newKons, KonsActions op){ log.debug("setKons " + (newKons != null ? newKons.getId() + " " + newKons.getLabel() + " " + newKons.getLabel() : "null" )); actKons = newKons; if (newKons == null) { reload(false, null); } else { dataLoader.cancel(); reload(true, null); dataLoader.setKons(newKons, showAllCharges, showAllConsultations); dataLoader.schedule(); } konsListComposite.refeshHyperLinks(actKons); } @Override public void aboutToRun(IJobChangeEvent event) { /* empty */} @Override public void awake(IJobChangeEvent event) { /* empty */} @Override public void done(IJobChangeEvent event) { final List<KonsData> copy = new ArrayList<>(dataLoader.getKonsultationen()); Display.getDefault().asyncExec(new Runnable() { @Override public void run() { log.debug("loaderJob got done for " + copy.size() + " kons."); reload(false, copy); } }); } @Override public void running(IJobChangeEvent event) { /* empty */} @Override public void scheduled(IJobChangeEvent event) { /* empty */} @Override public void sleeping(IJobChangeEvent event) { /* empty */} public void setKonsultation(Konsultation newKons, boolean showCharges, boolean showConsultations){ showAllCharges = showCharges; showAllConsultations = showConsultations; setKons(newKons, KonsActions.ACTIVATE_KONS); } }