package uihelpers; import java.util.Comparator; import logger.LoggerFactory; import org.apache.log4j.Logger; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.widgets.Item; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeColumn; import uihelpers.TableViewerAdministrator.IColumnDescriptor; public class TableColumnSorter<T> implements SelectionListener { private static final Logger logger = LoggerFactory.make(); private final StructuredViewer viewer; private Table table; private Tree tree; private final Item column; private final ViewerComparator sorterUp; private final ViewerComparator sorterDown; private int sortDirection = SWT.UP; private TableColumnSorter(StructuredViewer structuredViewer,Item column, ViewerComparator sorterUp,ViewerComparator sorterDown ) { this.viewer = structuredViewer; this.column = column; this.sorterUp = sorterUp; this.sorterDown = sorterDown; } public TableColumnSorter(TableViewer tableViewer,TableColumn tableColumn, ViewerComparator sorterUp,ViewerComparator sorterDown ) { this((StructuredViewer)tableViewer,tableColumn,sorterUp,sorterDown); this.table = tableViewer.getTable(); tableColumn.addSelectionListener(this); } public TableColumnSorter(TableViewer tableViewer,TableColumn tableColumn,IColumnDescriptor<T> col ) { this(tableViewer,tableColumn, col.getComparator(false), col.getComparator(true)); } public TableColumnSorter(TableViewer tableViewer,TableColumn tableColumn,Comparator<T> c ) { this(tableViewer,tableColumn, Comp(c,true),Comp(c,false)); } public TableColumnSorter(TreeViewer treeViewer,TreeColumn treeColumn, ViewerComparator sorterUp,ViewerComparator sorterDown ) { this((StructuredViewer)treeViewer,treeColumn,sorterUp,sorterDown); this.tree = treeViewer.getTree(); treeColumn.addSelectionListener(this); } public TableColumnSorter(TreeViewer treeViewer,TreeColumn treeColumn,IColumnDescriptor<T> col ) { this(treeViewer,treeColumn, col.getComparator(false), col.getComparator(true)); } public TableColumnSorter(TreeViewer treeViewer,TreeColumn treeColumn,Comparator<T> c ) { this(treeViewer,treeColumn, Comp(c,true),Comp(c,false)); } private void setSorter() { if (table == null) { tree.setSortDirection(sortDirection); } else { table.setSortDirection(sortDirection); } viewer.getControl().setRedraw(false); switch(sortDirection) { case SWT.NONE: viewer.setComparator(null); break; case SWT.UP: viewer.setComparator(sorterUp); break; case SWT.DOWN: viewer.setComparator(sorterDown); break; } viewer.getControl().setRedraw(true); } public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } public void widgetSelected(SelectionEvent e) { if (getSortColumn() == column) { changeSortDirection(); setSorter(); } else { logger.debug("column changed"); if (sorterUp != null) { setSortColumn(column); //choose this column for sorting setSorter(); } else { setSortColumn(null); } } } private Item getSortColumn() { if (table == null) { return tree.getSortColumn(); } else { return table.getSortColumn(); } } private void setSortColumn(Item i) { if (table == null) { tree.setSortColumn((TreeColumn)i); } else { table.setSortColumn((TableColumn)i); } } private void changeSortDirection() { switch(sortDirection) { case SWT.NONE: sortDirection = SWT.UP; break; case SWT.UP: sortDirection = SWT.DOWN; break; case SWT.DOWN: sortDirection = SWT.NONE; break; } } private static <T> ViewerComparator Comp(final Comparator<T> comp,final boolean inverted) { return new ViewerComparator() { @SuppressWarnings("unchecked") @Override public int compare(Viewer viewer, Object e1, Object e2) { return (inverted? -1: 1)* comp.compare((T)e1, (T)e2); } }; } }