package com.onpositive.commons.ui.viewers;
import java.util.Comparator;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TableViewer;
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.Control;
import org.eclipse.swt.widgets.Item;
public abstract class SortController extends SelectionAdapter {
private final class MComparator implements Comparator {
private final boolean state;
private MComparator(boolean state) {
this.state = state;
}
public int compare(Object e1, Object e2) {
int rev = state ? 1 : -1;
return rev * columnComparator.compare(e1, e2);
}
}
private static final String CONTROLLER = "controller";
private StructuredViewer viewer;
private Item column;
private Comparator columnComparator;
private boolean state = true;
// private static WeakHashMap instantes = new WeakHashMap();
public static SortController getController(Control control, Item column) {
return (SortController) column.getData(CONTROLLER);
}
public SortController(StructuredViewer viewer, Item column,
Comparator columnComparator, boolean defaultDesc) {
column.setData(CONTROLLER, this);
this.viewer = viewer;
this.column = column;
this.columnComparator = columnComparator;
this.state = defaultDesc;
}
public void widgetSelected(SelectionEvent e) {
boolean newColumn = false;
if (viewer instanceof TableViewer) {
TableViewer tv = (TableViewer) viewer;
newColumn = tv.getTable().getSortColumn() != column;
}
if (viewer instanceof TreeViewer) {
TreeViewer tv = (TreeViewer) viewer;
newColumn = tv.getTree().getSortColumn() != column;
}
if (newColumn) {
this.state = true;
}
stateChanged();
// if (!newColumn) {
this.state = !state;
// }
}
public void setState(boolean state) {
stateChanged();
this.state = !state;
}
private boolean getState() {
return state;
}
protected StructuredViewer getViewer() {
return viewer;
}
protected Item getColumn() {
return column;
}
protected ViewerSorter getViewerSorter() {
final boolean state = getState();
return new ViewerSorter() {
public int compare(Viewer viewer, Object e1, Object e2) {
int rev = state ? 1 : -1;
return rev * columnComparator.compare(e1, e2);
}
};
}
public Comparator getComparator() {
final boolean state = getState();
return new MComparator(state);
}
protected int getSortDirection() {
return getState() ? SWT.DOWN : SWT.UP;
}
public void initState() {
state = getRealSortDirection() == SWT.DOWN;
update();
this.state = !state;
}
protected void update() {
IContentProvider contentProvider = getViewer().getContentProvider();
if (contentProvider instanceof DeferedContentProvider) {
DeferedContentProvider ds = (DeferedContentProvider) contentProvider;
contentProvider = ds.getBase();
}
getViewer().getControl().setRedraw(false);
try {
getViewer().setContentProvider(new ITreeContentProvider() {
public Object[] getChildren(Object parentElement) {
return null;
}
public Object getParent(Object element) {
return null;
}
public boolean hasChildren(Object element) {
return false;
}
public Object[] getElements(Object inputElement) {
return new Object[0];
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
}
});
getViewer().setSorter(getViewerSorter());
getViewer().setContentProvider(
new DeferedContentProvider(
(ITreeContentProvider) contentProvider));
} finally {
getViewer().getControl().setRedraw(true);
}
}
public abstract int getRealSortDirection();
public abstract void stateChanged();
}