package org.objectstyle.wolips.ruleeditor.listener;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.widgets.*;
import org.objectstyle.wolips.ruleeditor.sorter.*;
public class TableSortSelectionListener implements SelectionListener {
private final TableColumn column;
private InvertableSorter currentSorter;
private final boolean keepDirection;
private final InvertableSorter sorter;
private final TableViewer viewer;
/**
* The constructor of this listener.
*
* @param viewer
* the tableviewer this listener belongs to
* @param column
* the column this listener is responsible for
* @param sorter
* the sorter this listener uses
* @param defaultDirection
* the default sorting direction of this Listener. Possible
* values are {@link SWT.UP} and {@link SWT.DOWN}
* @param keepDirection
* if true, the listener will remember the last sorting direction
* of the associated column and restore it when the column is
* reselected. If false, the listener will use the default soting
* direction
*/
public TableSortSelectionListener(final TableViewer viewer, final TableColumn column, final AbstractInvertableTableSorter sorter, final int defaultDirection, final boolean keepDirection) {
this.viewer = viewer;
this.column = column;
this.keepDirection = keepDirection;
this.sorter = (defaultDirection == SWT.UP) ? sorter : sorter.getInverseSorter();
currentSorter = this.sorter;
this.column.addSelectionListener(this);
}
/**
* Chooses the colum of this listener for sorting of the table. Mainly used
* when first initialising the table.
*/
public void chooseColumnForSorting() {
viewer.getTable().setSortColumn(column);
viewer.getTable().setSortDirection(currentSorter.getSortDirection());
viewer.setSorter(currentSorter);
}
public void widgetDefaultSelected(final SelectionEvent e) {
widgetSelected(e);
}
public void widgetSelected(final SelectionEvent e) {
InvertableSorter newSorter;
if (viewer.getTable().getSortColumn() == column) {
newSorter = ((InvertableSorter) viewer.getSorter()).getInverseSorter();
} else {
if (keepDirection) {
newSorter = currentSorter;
} else {
newSorter = sorter;
}
}
currentSorter = newSorter;
chooseColumnForSorting();
}
}