package org.rubypeople.rdt.ui;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
/**
* A generic TableViewer Sorter.
*
* Mostly taken from https://bugs.eclipse.org/bugs/show_bug.cgi?id=158112
*
* @author brad
*/
public class TableViewerSorter extends ViewerSorter {
private int columnIndex = 0;
public TableViewerSorter(int columnIndex) {
this.columnIndex = columnIndex;
}
/**
* Compares the two objects provided.
*
* If numbers are in the relevant string then the objects are returned in
* number order (rather than string order).
*/
public int compare(Viewer viewer, Object e1, Object e2) {
int order = 0;
if (viewer instanceof TableViewer) {
TableViewer tv = (TableViewer) viewer;
Table table = tv.getTable();
table.setSortColumn(table.getColumn(columnIndex));
int idx1 = -1, idx2 = -1;
for (int i = 0; i < table.getItemCount(); i++) {
Object obj = tv.getElementAt(i);
if (obj.equals(e1)) {
idx1 = i;
}
else if (obj.equals(e2)) {
idx2 = i;
}
if (idx1 > 0 && idx2 > 0) {
break;
}
}
if (idx1 > -1 && idx2 > -1) {
String str1 = table.getItems()[idx1].getText(this.columnIndex);
String str2 = table.getItems()[idx2].getText(this.columnIndex);
order = str1.compareTo(str2);
try {
Double d1 = Double.valueOf(str1);
Double d2 = Double.valueOf(str2);
order = d1.compareTo(d2);
}
catch (NumberFormatException e) {
// do nothing
}
if (table.getSortDirection() != SWT.UP) {
order *= -1;
}
}
}
return order;
}
/**
* The TableViewer passed in will be set up to use this sorter when a column
* is clicked.
*/
public static void bind(final TableViewer tableViewer) {
final Table table = tableViewer.getTable();
for (int i = 0; i < table.getColumnCount(); i++) {
final int columnNum = i;
TableColumn column = table.getColumn(i);
column.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(final SelectionEvent e) {
TableViewerSorter sorter = new TableViewerSorter(columnNum);
if (table.getSortDirection() == SWT.UP) {
table.setSortDirection(SWT.DOWN);
}
else if (table.getSortDirection() == SWT.DOWN) {
table.setSortDirection(SWT.UP);
}
else {
table.setSortDirection(SWT.UP);
}
tableViewer.setSorter(sorter);
}
});
}
}
public static void bind(final TableViewer tableViewer, int columnIndex) {
bind(tableViewer);
TableViewerSorter sorter = new TableViewerSorter(columnIndex);
tableViewer.setSorter(sorter);
}
}