package edu.ualberta.med.biobank.widgets.infotables; import java.util.Collection; import java.util.Date; import java.util.Iterator; import java.util.List; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Table; import edu.ualberta.med.biobank.common.formatters.DateFormatter; import edu.ualberta.med.biobank.common.formatters.NumberFormatter; import edu.ualberta.med.biobank.gui.common.BgcLogger; import edu.ualberta.med.biobank.gui.common.widgets.BgcLabelProvider; import edu.ualberta.med.biobank.gui.common.widgets.PaginationWidget; import gov.nih.nci.system.applicationservice.ApplicationException; public class ReportTableWidget<T> extends InfoTableBgrLoader<T> { private static BgcLogger logger = BgcLogger .getLogger(ReportTableWidget.class.getName()); public ReportTableWidget(Composite parent, List<T> list, String[] headings) { super(parent, list, headings, null, 24); } public ReportTableWidget(Composite parent, List<T> list, String[] headings, int rowsPerPage) { super(parent, list, headings, null, rowsPerPage); } @Override protected void setPaginationParams(List<T> collection) { if (collection != null) { int rowsPerPage = paginationWidget.getRowsPerPage(); int size = collection.size(); if (((size == -1) || (size > rowsPerPage)) && (collection.get(rowsPerPage) != null)) { paginationRequired = true; init(collection); } } else { paginationRequired = false; } } @Override public BgcLabelProvider getLabelProvider() { return getLabelProvider(true); } public BgcLabelProvider getLabelProvider(final boolean formatNumbers) { return new BgcLabelProvider() { @Override public String getColumnText(Object element, int columnIndex) { if (element instanceof Object[]) { Object[] castedVals = (Object[]) element; if (castedVals[columnIndex] == null) return ""; //$NON-NLS-1$ if (castedVals[columnIndex] instanceof Date) return DateFormatter .formatAsDate((Date) castedVals[columnIndex]); if (formatNumbers && castedVals[columnIndex] instanceof Number) return NumberFormatter .format((Number) castedVals[columnIndex]); return castedVals[columnIndex].toString(); } return "no label provider"; //$NON-NLS-1$ } }; } @Override public void tableLoader(final List<T> collection, final T selection) { final TableViewer viewer = getTableViewer(); final Table table = viewer.getTable(); Display display = viewer.getTable().getDisplay(); int rowsPerPage = paginationWidget.getRowsPerPage(); if (paginationRequired) { start = paginationWidget.getCurrentPage() * rowsPerPage; end = start + rowsPerPage; } else { start = 0; end = rowsPerPage; } final Collection<?> collSubList; // if we are not dealing with a biobanklistproxy we need to // check for bounds if (collection.size() != -1) { start = Math.min(start, collection.size()); end = Math.min(end, collection.size()); } collSubList = collection.subList(start, end); init(collection); display.syncExec(new Runnable() { @Override public void run() { if (!table.isDisposed()) { if (paginationRequired) { paginationWidget.setPageLabelText(); ReportTableWidget.this.getShell().layout(true, true); } tableViewer.setInput(collSubList); } } }); try { Object selItem = null; Iterator<?> it = collSubList.iterator(); for (int i = start; i < end && it.hasNext(); ++i) { if (table.isDisposed()) return; final Object item = it.next(); if (item == null) { end = i; break; } display.syncExec(new Runnable() { @Override public void run() { if (!table.isDisposed()) { viewer.refresh(item, false); } } }); if ((selection != null) && selection.equals(item)) { selItem = item; } } final Object selectedItem = selItem; display.syncExec(new Runnable() { @Override public void run() { if (!table.isDisposed()) { if (paginationRequired) { enablePaginationWidget(true); } if (selectedItem != null) { tableViewer.setSelection(new StructuredSelection( selectedItem)); } } } }); } catch (Exception e) { logger.error("setCollection error", e); //$NON-NLS-1$ } } @Override protected void init(List<T> list) { if (paginationWidget.getTotalPages() == PaginationWidget.TOTAL_PAGES_UNKNOWN) { int size = list.size(); if (size > 0) { paginationWidget.setTableMaxRows(size); } } } @Override protected boolean isEditMode() { return false; } @Override public T getSelection() { // TODO Auto-generated method stub return null; } @Override protected Boolean canEdit(T target) throws ApplicationException { return false; } @Override protected Boolean canDelete(T target) throws ApplicationException { return false; } @Override protected Boolean canView(T target) throws ApplicationException { return false; } }