package ch.elexis.core.ui.medication.views; import java.util.Collections; import java.util.List; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import ch.elexis.core.ui.icons.Images; import ch.elexis.data.Prescription; public class MedicationTableViewerContentProvider implements IStructuredContentProvider { private List<Prescription> input; private List<MedicationTableViewerItem> currentItems; private StructuredViewer viewer; private int pageSize; private int currentPageOffset; public MedicationTableViewerContentProvider(StructuredViewer viewer){ this.viewer = viewer; this.pageSize = 500; this.currentPageOffset = 0; } @Override public void dispose(){ viewer = null; currentItems = null; input = null; } @SuppressWarnings("unchecked") @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput){ if (newInput instanceof List<?>) { currentPageOffset = 0; input = (List<Prescription>) newInput; createCurrentItems(); } else { currentPageOffset = 0; input = Collections.emptyList(); currentItems = Collections.emptyList(); } } private void createCurrentItems(){ if (input.size() < pageSize) { currentItems = MedicationTableViewerItem.createFromPrescriptionList(input, viewer); } else { if (currentPageOffset + pageSize < input.size()) { currentItems = MedicationTableViewerItem.createFromPrescriptionList( input.subList(currentPageOffset, currentPageOffset + pageSize), viewer); } else { currentItems = MedicationTableViewerItem.createFromPrescriptionList( input.subList(currentPageOffset, input.size()), viewer); } } } public void nextPage(){ if ((currentPageOffset + pageSize) < input.size()) { currentPageOffset += pageSize; createCurrentItems(); } } public boolean hasNext(){ return input != null && (currentPageOffset + pageSize) < input.size(); } public void previousPage(){ if (currentPageOffset >= pageSize) { currentPageOffset -= pageSize; createCurrentItems(); } } public boolean hasPrevious(){ return input != null && currentPageOffset >= pageSize; } @Override public Object[] getElements(Object inputElement){ return currentItems.toArray(); } public static class MedicationContentProviderComposite extends Composite { private Label currentState; private MedicationTableViewerContentProvider contentProvider; private ToolBarManager toolbarmgr; public MedicationContentProviderComposite(Composite parent, int style){ super(parent, style); setLayout(new RowLayout(SWT.HORIZONTAL)); createContent(); } private void createContent(){ currentState = new Label(this, SWT.NONE); toolbarmgr = new ToolBarManager(); toolbarmgr.add(new PreviousPage()); toolbarmgr.add(new NextPage()); toolbarmgr.createControl(this); } public void setContentProvider(MedicationTableViewerContentProvider contentProvider){ this.contentProvider = contentProvider; refresh(); } public void refresh(){ if (contentProvider != null && contentProvider.input != null) { currentState.setText(contentProvider.currentPageOffset + " - " + (contentProvider.currentPageOffset + contentProvider.pageSize) + " / " + contentProvider.input.size()); } else { currentState.setText(" / "); } layout(); for (IContributionItem item : toolbarmgr.getItems()) { item.update(); } } private class NextPage extends Action { @Override public ImageDescriptor getImageDescriptor(){ return Images.IMG_NEXT.getImageDescriptor(); } @Override public void run(){ contentProvider.nextPage(); contentProvider.viewer.refresh(); refresh(); } @Override public boolean isEnabled(){ return contentProvider != null && contentProvider.hasNext(); } } private class PreviousPage extends Action { @Override public ImageDescriptor getImageDescriptor(){ return Images.IMG_PREVIOUS.getImageDescriptor(); } @Override public void run(){ contentProvider.previousPage(); contentProvider.viewer.refresh(); refresh(); } @Override public boolean isEnabled(){ return contentProvider != null && contentProvider.hasPrevious(); } } } }