/*******************************************************************************
* Copyright (c) 2014 MEDEVIT.
* 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:
* MEDEVIT <office@medevit.at> - initial API and implementation
*******************************************************************************/
package at.medevit.elexis.impfplan.ui;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import at.medevit.elexis.impfplan.model.ArticleToImmunisationModel;
import at.medevit.elexis.impfplan.model.po.Vaccination;
import at.medevit.elexis.impfplan.model.vaccplans.ImpfplanSchweiz2015;
import at.medevit.elexis.impfplan.ui.dialogs.EditVaccinationDialog;
import at.medevit.elexis.impfplan.ui.preferences.PreferencePage;
import ch.elexis.core.constants.StringConstants;
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.events.ElexisUiEventListenerImpl;
import ch.elexis.core.ui.icons.Images;
import ch.elexis.data.Patient;
import ch.elexis.data.Query;
import ch.rgw.tools.TimeTool;
public class VaccinationView extends ViewPart {
public static final String PART_ID = "at.medevit.elexis.impfplan.ui.ImpfplanViewPart";
private static VaccinationPlanHeaderDefinition vaccinationHeaderDefinition;
private static List<Vaccination> vaccinations;
private VaccinationComposite vaccinationComposite;
private VaccinationCompositePaintListener vcPaintListener;
public static final String HEADER_ID_SHOW_ADMINISTERED = "HISA";
private Patient pat;
/**
* knowledge if the sortByVaccination icon is active
*/
private boolean sortByVaccinationName = false;
private ElexisEventListener eeli_pat = new ElexisUiEventListenerImpl(Patient.class) {
public void runInUi(ElexisEvent ev){
setPatient(ElexisEventDispatcher.getSelectedPatient());
}
};
private ElexisEventListener eeli_vacc = new ElexisUiEventListenerImpl(Vaccination.class,
ElexisEvent.EVENT_CREATE | ElexisEvent.EVENT_DELETE) {
public void runInUi(ElexisEvent ev){
updateUi(true);
};
};
public VaccinationView(){
ImpfplanSchweiz2015 is = new ImpfplanSchweiz2015();
vaccinationHeaderDefinition =
new VaccinationPlanHeaderDefinition(is.id, is.name, is.getOrderedBaseDiseases(),
is.getOrderedExtendedDiseases());
ElexisEventDispatcher.getInstance().addListeners(eeli_pat, eeli_vacc);
}
/**
* Create contents of the view part.
*
* @param parent
*/
@Override
public void createPartControl(Composite parent){
parent.setLayout(new FillLayout(SWT.VERTICAL));
ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.BORDER);
vaccinationComposite = new VaccinationComposite(sc);
sc.setContent(vaccinationComposite);
sc.setExpandHorizontal(true);
sc.setExpandVertical(true);
sc.setMinSize(vaccinationComposite.computeSize(800, 800));
vcPaintListener = vaccinationComposite.getVaccinationCompositePaintListener();
vaccinationComposite.addMouseListener(new MouseAdapter() {
@Override
public void mouseDoubleClick(MouseEvent e){
Vaccination selVaccination = vcPaintListener.getSelectedVaccination();
editVaccination(selVaccination);
}
});
MenuManager menuManager = new MenuManager();
menuManager.add(new Action() {
@Override
public String getText(){
return "Eintrag löschen";
}
@Override
public ImageDescriptor getImageDescriptor(){
return Images.IMG_DELETE.getImageDescriptor();
}
@Override
public void run(){
Vaccination selVaccination = vcPaintListener.getSelectedVaccination();
if (selVaccination != null) {
selVaccination.delete();
}
}
});
menuManager.add(new Action() {
@Override
public String getText(){
return "Impfung editieren";
}
@Override
public ImageDescriptor getImageDescriptor(){
return Images.IMG_EDIT.getImageDescriptor();
}
@Override
public void run(){
Vaccination selVaccination = vcPaintListener.getSelectedVaccination();
editVaccination(selVaccination);
}
});
vaccinationComposite.setMenu(menuManager.createContextMenu(vaccinationComposite));
getSite().registerContextMenu(PART_ID + ".contextMenu", menuManager,
vaccinationComposite);
getSite().setSelectionProvider(vaccinationComposite);
if (ElexisEventDispatcher.getSelectedPatient() != null) {
setPatient(ElexisEventDispatcher.getSelectedPatient());
}
}
private void editVaccination(Vaccination selVaccination) {
if (selVaccination != null) {
EditVaccinationDialog evd =
new EditVaccinationDialog(vaccinationComposite.getShell(), selVaccination);
evd.open();
}
}
private void setPatient(Patient selectedPatient){
pat = selectedPatient;
updateUi(true);
}
/**
* updates the ui
*
* @param patientChanged
* if this value is true all vacc's will be reloaded (via a query)
*/
public void updateUi(boolean patientChanged){
if (pat == null) {
vaccinations = Collections.emptyList();
return;
}
if (patientChanged) {
boolean sortDir = CoreHub.userCfg.get(PreferencePage.VAC_SORT_ORDER, false);
Query<Vaccination> qbe = new Query<>(Vaccination.class);
qbe.add("ID", Query.NOT_EQUAL, StringConstants.VERSION_LITERAL);
qbe.add(Vaccination.FLD_PATIENT_ID, Query.EQUALS, pat.getId());
qbe.orderBy(sortDir, Vaccination.FLD_DOA);
vaccinations = qbe.execute();
}
if (sortByVaccinationName) {
sortVaccinationsByName();
}
if (vaccinationHeaderDefinition.id.equals(HEADER_ID_SHOW_ADMINISTERED)) {
HashSet<String> atc = new HashSet<>();
for (Vaccination vacc : vaccinations) {
String atcCode = vacc.get(Vaccination.FLD_ATCCODE);
if (atcCode.length() > 3) {
List<String> immunisationForAtcCode =
ArticleToImmunisationModel.getImmunisationForAtcCode(atcCode);
atc.addAll(immunisationForAtcCode);
} else {
atc.addAll(Arrays.asList(vacc.get(Vaccination.FLD_VACC_AGAINST).split(",")));
}
}
vaccinationHeaderDefinition =
new VaccinationPlanHeaderDefinition(HEADER_ID_SHOW_ADMINISTERED,
"Nur verabreichte Impfungen", new ArrayList<String>(atc),
Collections.emptyList());
}
vaccinationComposite.updateUi(vaccinationHeaderDefinition, vaccinations,
new TimeTool(pat.getGeburtsdatum()));
}
public void sortVaccinationsByName(){
Collections.sort(vaccinations, new Comparator<Vaccination>() {
@Override
public int compare(Vaccination vac1, Vaccination vac2){
String name1 = vac1.getShortBusinessName();
String name2 = vac2.getShortBusinessName();
return name1.compareTo(name2);
}
});
}
public void setSortByVaccinationName(boolean sort){
sortByVaccinationName = sort;
updateUi(!sort);
}
@Override
public void setFocus(){
updateUi(false);
}
@Override
public void dispose(){
ElexisEventDispatcher.getInstance().removeListeners(eeli_pat, eeli_vacc);
super.dispose();
}
public static void setVaccinationHeaderDefinition(
VaccinationPlanHeaderDefinition vacccinationHeaderDefinition){
VaccinationView.vaccinationHeaderDefinition = vacccinationHeaderDefinition;
IViewReference viewReference =
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
.findViewReference(PART_ID);
IWorkbenchPart part = viewReference.getPart(false);
if (part != null) {
part.setFocus();
}
}
public static VaccinationPlanHeaderDefinition getVaccinationHeaderDefinition(){
return vaccinationHeaderDefinition;
}
public VaccinationComposite getVaccinationComposite(){
return vaccinationComposite;
}
}