/******************************************************************************* * Copyright (c) 2007-2010, G. Weirich 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 * *******************************************************************************/ package ch.elexis.core.ui.contacts.views; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; 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.Job; import org.eclipse.jface.viewers.ILazyContentProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.progress.IProgressConstants; import org.eclipse.ui.progress.IWorkbenchSiteProgressService; import ch.elexis.admin.AccessControlDefaults; import ch.elexis.core.constants.StringConstants; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.ui.UiDesk; import ch.elexis.core.ui.icons.Images; import ch.elexis.core.ui.util.viewers.CommonViewer; import ch.elexis.core.ui.util.viewers.ViewerConfigurer.ICommonViewerContentProvider; import ch.elexis.core.ui.views.Messages; import ch.elexis.data.Patient; import ch.elexis.data.Query; import ch.rgw.tools.StringTool; public class PatListeContentProvider implements ICommonViewerContentProvider, ILazyContentProvider { CommonViewer viewer; Query<Patient> qbe; Object[] pats; boolean bValid = false; boolean bUpdating = false; String[] orderLabels; String[] orderFields; String firstOrder; PatListFilterBox pfilter; ViewPart site; public PatListeContentProvider(CommonViewer cv, String[] fieldsToOrder, ViewPart s){ viewer = cv; site = s; updateFields(fieldsToOrder); } /** * Update the used fields to order the content. * * @param fieldsToOrder * @since 3.0.0 */ public void updateFields(String[] fieldsToOrder){ orderLabels = new String[fieldsToOrder.length]; orderFields = new String[fieldsToOrder.length]; for (int i = 0; i < fieldsToOrder.length; i++) { String[] def = fieldsToOrder[i].split(Query.EQUALS); orderFields[i] = def[0]; orderLabels[i] = def.length > 1 ? def[1] : def[0]; } firstOrder = orderFields[0]; } @Override public void startListening(){ viewer.getConfigurer().getControlFieldProvider().addChangeListener(this); qbe = new Query<Patient>(Patient.class); } @Override public void stopListening(){ if (viewer != null) { viewer.getConfigurer().getControlFieldProvider().removeChangeListener(this); } } public void setFilter(PatListFilterBox f){ qbe.addPostQueryFilter(f); pfilter = f; bValid = false; } public void removeFilter(PatListFilterBox f){ qbe.removePostQueryFilter(f); pfilter = null; bValid = false; } /** * @since 3.2 */ public void syncRefresh() { qbe.clear(); viewer.getConfigurer().getControlFieldProvider().setQuery(qbe); String[] actualOrder; int idx = StringTool.getIndex(orderFields, firstOrder); if ((idx == -1) || (idx == 0)) { actualOrder = orderFields; } else { actualOrder = new String[orderFields.length]; int n = 0; int begin = idx; do { actualOrder[n++] = orderFields[idx++]; if (idx >= orderFields.length) { idx = 0; } } while (idx != begin); } qbe.orderBy(false, actualOrder); List<Patient> lPats = qbe.execute(); if (lPats == null) { pats = new Patient[0]; } else { pats = lPats.toArray(new Patient[0]); } UiDesk.getDisplay().syncExec(new Runnable() { @Override public void run(){ TableViewer tv = (TableViewer) viewer.getViewerWidget(); tv.setItemCount(pats.length); bValid = true; if (pfilter != null) { pfilter.finished(); } tv.refresh(); bUpdating = false; } }); } @Override public Object[] getElements(Object inputElement){ if (bValid || bUpdating) { return pats; } if (pfilter != null) { pats = new String[] { Messages.PatListeContentProvider_LoadingData }; ((TableViewer) viewer.getViewerWidget()).setItemCount(1); } if (!CoreHub.acl.request(AccessControlDefaults.PATIENT_DISPLAY)) { return new Object[0]; } Job job = new Job(Messages.PatListeContentProvider_LoadingPatients) { @Override protected IStatus run(IProgressMonitor monitor){ monitor.beginTask(Messages.PatListeContentProvider_LoadPatients, IProgressMonitor.UNKNOWN); if (pfilter != null) { if (pfilter.aboutToStart() == false) { return Status.CANCEL_STATUS; } } syncRefresh(); monitor.done(); return Status.OK_STATUS; } }; job.setPriority(Job.SHORT); job.setUser(false); bUpdating = true; IWorkbenchSiteProgressService siteService = (IWorkbenchSiteProgressService) site.getSite().getAdapter( IWorkbenchSiteProgressService.class); siteService.schedule(job, 0, true); job.setProperty(IProgressConstants.ICON_PROPERTY, Images.IMG_AUSRUFEZ_ROT.getImage()); return pats; } @Override public void dispose(){ stopListening(); } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput){} @Override public void changed(HashMap<String, String> vals){ bValid = false; getElements(viewer); if (viewer.getConfigurer().getControlFieldProvider().isEmpty()) { viewer.notify(CommonViewer.Message.empty); } else { viewer.notify(CommonViewer.Message.notempty); } // viewer.notify(CommonViewer.Message.update); } @Override public void reorder(String field){ int idx = StringTool.getIndex(orderLabels, field); if (idx > -1) { firstOrder = orderFields[idx]; changed(null); } } @Override public void selected(){ // TODO Auto-generated method stub } @Override public void updateElement(int index){ if (!bValid) { getElements(viewer); } TableViewer tv = (TableViewer) viewer.getViewerWidget(); if (pats.length > index) { tv.replace(pats[index], index); } else { tv.replace(StringConstants.DASH, index); } } public void invalidate(){ bValid = false; } /** * Directly add an object to the content providers held array. * * @param newObject * @return * @see https://redmine.medelexis.ch/issues/5719 for use case * @since 3.2 */ void temporaryAddObject(Object newObject){ ArrayList<Object> temp = new ArrayList<Object>(Arrays.asList(pats)); temp.add(newObject); pats = temp.toArray(); ((TableViewer) viewer.getViewerWidget()).setItemCount(pats.length); } @Override public void init(){ // TODO Auto-generated method stub } }