package com.aptana.ide.core.ui.widgets;
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;
/**
* Creates a new table viewer sorter
*
* @param columnIndex
*/
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).
*
* @param viewer
* @param e1
* @param e2
* @return - comparison
*/
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.
*
* @param tableViewer
*/
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);
}
});
}
}
}