package edu.ualberta.med.biobank.gui.common.widgets; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import edu.ualberta.med.biobank.common.util.ListChangeEvent; import edu.ualberta.med.biobank.common.util.ListChangeHandler; public abstract class DefaultAbstractInfoTableWidget<T> extends AbstractInfoTableWidget<T> { private final InfoTableListChangeHandler infoTableListChangeHandler = new InfoTableListChangeHandler(); public DefaultAbstractInfoTableWidget(Composite parent, String[] headings, int rowsPerPage) { super(parent, headings, null, rowsPerPage); addListChangeHandler(infoTableListChangeHandler); } public void setSelection(T selection) { if (selection != null) { tableViewer.setSelection(new StructuredSelection(selection), true); } } protected void setPaginationParams(List<T> collection) { paginationRequired = paginationWidget .setTableMaxRows(collection.size()); if (paginationRequired) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { getTableViewer().refresh(); } }); } } @Override public void setList(List<T> list) { super.setList(list); resizeTable(); if (paginationRequired) { showPaginationWidget(); paginationWidget.setPageLabelText(); enablePaginationWidget(false); int rowsPerPage = paginationWidget.getRowsPerPage(); start = paginationWidget.getCurrentPage() * rowsPerPage; end = Math.min(start + rowsPerPage, getList().size()); enablePaginationWidget(true); } else { start = 0; end = getList().size(); if (paginationWidget != null) { paginationWidget.setVisible(false); } } final List<T> subList = getList().subList(start, end); getTableViewer().setInput(subList); if (autoSizeColumns) { autoSizeColumns(); } // Table table = tableViewer.getTable(); // for (int i = 0, n = table.getColumnCount(); i < n; i++) { // table.getColumn(i).pack(); // } // System.out.println("2"); } @Override public void setCollection(final Collection<T> list) { setList(new ArrayList<T>(list)); } @Override public void firstPage() { setList(getList()); } @Override public void prevPage() { setList(getList()); } @Override public void nextPage() { setList(getList()); } @Override public void lastPage() { setList(getList()); } @Override protected BgcTableSorter getTableSorter() { return null; } @Override public void reload() { setList(getList()); } @Override public boolean isEditMode() { return false; } @Override public T getSelection() { if (tableViewer.getTable().isDisposed()) return null; IStructuredSelection selection = (IStructuredSelection) tableViewer .getSelection(); @SuppressWarnings("unchecked") T firstElement = (T) selection.getFirstElement(); return firstElement; } private class InfoTableListChangeHandler implements ListChangeHandler<T> { private boolean ignoreEvents = false; @Override public void onListChange(ListChangeEvent<T> event) { // init() may cause ListChangeEvent-s to be fired, so don't listen // for them when init() is called. if (!ignoreEvents) { try { ignoreEvents = true; List<T> list = getList(); setPaginationParams(list); } finally { ignoreEvents = false; } } } } }