package com.aptana.ide.core.ui.widgets;
import org.eclipse.jface.viewers.TreeViewer;
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.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
/**
* A generic TableViewer Sorter.
*
* Mostly taken from https://bugs.eclipse.org/bugs/show_bug.cgi?id=158112
*
* @author brad
*/
public class TreeViewerSorter extends ViewerSorter {
private int columnIndex = 0;
public TreeViewerSorter(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 TreeViewer) {
TreeViewer tv = (TreeViewer) viewer;
Tree table = tv.getTree();
table.setSortColumn(table.getColumn(columnIndex));
int idx1 = -1, idx2 = -1;
TreeItem[] items = table.getItems();
for (int i = 0; i < items.length; i++) {
Object obj = items[i].getData();
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 TreeViewer tableViewer) {
final Tree table = tableViewer.getTree();
for (int i = 0; i < table.getColumnCount(); i++) {
final int columnNum = i;
TreeColumn column = table.getColumn(i);
column.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(final SelectionEvent e) {
TreeViewerSorter sorter = new TreeViewerSorter(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);
}
});
}
}
}