package org.projectusus.ui.viewer;
import java.text.DecimalFormat;
import java.text.ParseException;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
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;
class ColumnByLabelSorter extends ViewerComparator {
private final static DecimalFormat formatter = new DecimalFormat( "#.##" ); //$NON-NLS-1$
private final TreeColumn column;
private final StructuredViewer viewer;
private final int columnIndex;
private boolean ascending = false;
private final boolean numeric;
public ColumnByLabelSorter( StructuredViewer viewer, TreeColumn column, int columnIndex, boolean numeric ) {
this.column = column;
this.viewer = viewer;
this.columnIndex = columnIndex;
this.numeric = numeric;
this.column.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( @SuppressWarnings( "unused" ) SelectionEvent e ) {
sortAndActualizeSortOrder();
}
} );
}
void sortAndActualizeSortOrder() {
if( viewer.getComparator() == this ) {
ascending = !ascending;
}
Tree table = column.getParent();
table.setSortColumn( column );
table.setSortDirection( ascending ? SWT.UP : SWT.DOWN );
if( viewer.getComparator() == this ) {
viewer.refresh();
}
viewer.setComparator( this ); // does nothing when already this
}
@Override
public int compare( @SuppressWarnings( "unused" ) Viewer viewr, Object o1, Object o2 ) {
return (ascending ? 1 : -1) * doCompare( o1, o2 );
}
protected int doCompare( Object o1, Object o2 ) {
ITableLabelProvider labelProvider = ((ITableLabelProvider)viewer.getLabelProvider());
String text1 = labelProvider.getColumnText( o1, columnIndex );
String text2 = labelProvider.getColumnText( o2, columnIndex );
if( numeric ) {
try {
Number number1 = formatter.parse( text1 );
Number number2 = formatter.parse( text2 );
return (int)Math.signum( number1.doubleValue() - number2.doubleValue() );
} catch( ParseException e ) {
// OK
}
}
return text1.compareTo( text2 );
}
}