package org.erlide.ui.navigator;
import java.text.Collator;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.erlide.engine.model.ErlElementKind;
import org.erlide.engine.model.IErlElement;
import org.erlide.engine.model.erlang.IErlFunction;
import org.erlide.engine.model.erlang.ISourceReference;
public class ErlElementSorter extends ViewerSorter {
public static final int SORT_ON_NAME = 0;
public static final int SORT_ON_EXPORT = 1;
private int how = SORT_ON_NAME;
@Override
public int compare(final Viewer viewer, final Object o1, final Object o2) {
if (o1 instanceof IErlElement && o2 instanceof IErlElement) {
final IErlElement e1 = (IErlElement) o1;
final IErlElement e2 = (IErlElement) o2;
if (e1.getKind() == ErlElementKind.CLAUSE
&& e2.getKind() == ErlElementKind.CLAUSE) {
return comparePositions(viewer, (ISourceReference) o1,
(ISourceReference) o2);
}
}
return super.compare(viewer, o1, o2);
}
public ErlElementSorter() {
super();
}
public ErlElementSorter(final int how) {
super();
this.how = how;
}
public ErlElementSorter(final Collator collator) {
super(collator);
}
@Override
public int category(final Object element) {
if (!(element instanceof IErlElement)) {
return super.category(element);
}
final IErlElement e = (IErlElement) element;
switch (how) {
case SORT_ON_NAME:
if (e.getKind() == ErlElementKind.FUNCTION) {
return 1000;
}
return e.getKind().ordinal();
case SORT_ON_EXPORT:
if (e.getKind() == ErlElementKind.FUNCTION) {
if (e instanceof IErlFunction) {
final IErlFunction f = (IErlFunction) e;
if (f.isExported()) {
return 500;
}
}
return 1000;
}
return e.getKind().ordinal();
default:
return super.category(element);
}
}
protected int comparePositions(final Viewer viewer, final ISourceReference s1,
final ISourceReference s2) {
final int p1 = s1.getSourceRange().getOffset();
final int p2 = s2.getSourceRange().getOffset();
if (p1 < p2) {
return -1;
} else if (p1 > p2) {
return 1;
} else {
return 0;
}
}
}