/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
/*
* Created on Oct 8, 2006
* @author Fabio
*/
package org.python.pydev.navigator.sorter;
import org.eclipse.core.resources.IContainer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.python.pydev.core.structure.TreeNode;
import org.python.pydev.navigator.LabelAndImage;
import org.python.pydev.navigator.elements.ISortedElement;
import org.python.pydev.navigator.elements.IWrappedResource;
import org.python.pydev.navigator.elements.ProjectConfigError;
import org.python.pydev.navigator.elements.PythonNode;
import org.python.pydev.navigator.elements.PythonSourceFolder;
public class PythonModelSorter extends ViewerSorter {
public int compare(Viewer viewer, Object e1, Object e2) {
if (e1 instanceof PythonNode || e2 instanceof PythonNode) {
return 0; //we don't want to sort it... just show it in the order it is found in the file
}
//Tree nodes come after everything.
if (e1 instanceof TreeNode<?>) {
if (!(e2 instanceof TreeNode<?>)) {
return 1;
}
//Both are ISortedElement, so, keep going.
}
if (e2 instanceof TreeNode<?>) {
return -1;
}
//now, on to the priorities (if both have different classes)
if (e1 instanceof ISortedElement && e2 instanceof ISortedElement) {
ISortedElement iSortedElement1 = (ISortedElement) e1;
int r1 = iSortedElement1.getRank();
ISortedElement iSortedElement2 = (ISortedElement) e2;
int r2 = iSortedElement2.getRank();
if (r1 == r2) {
if (e1 instanceof IWrappedResource && e2 instanceof IWrappedResource) {
return super.compare(viewer, ((IWrappedResource) e1).getActualObject(),
((IWrappedResource) e2).getActualObject());
} else if (e1 instanceof TreeNode && e2 instanceof TreeNode) {
TreeNode<?> p1 = (TreeNode<?>) e1;
TreeNode<?> p2 = (TreeNode<?>) e2;
Object data2 = p2.getData();
Object data1 = p1.getData();
if (data1 instanceof LabelAndImage && data2 instanceof LabelAndImage) {
return ((LabelAndImage) data1).label.compareTo(((LabelAndImage) data2).label);
}
return 0;
} else {
return 0;
}
} else if (r1 < r2) {
return -1;
} else {
return 1;
}
}
//Config error elements always have priority over non-sorted resources
if (e1 instanceof ProjectConfigError) {
return -1;
}
if (e2 instanceof ProjectConfigError) {
return 1;
}
//If both were IWrappedResource they'd be handled at ISortedElement
if (e1 instanceof IWrappedResource) {
//Source folders should come before other resources
if (e1 instanceof PythonSourceFolder) {
return -1;
}
e1 = ((IWrappedResource) e1).getActualObject();
}
if (e2 instanceof IWrappedResource) {
//Source folders should come before other resources
if (e2 instanceof PythonSourceFolder) {
return 1;
}
e2 = ((IWrappedResource) e2).getActualObject();
}
if (e1 instanceof IContainer && e2 instanceof IContainer) {
return super.compare(viewer, e1, e2);
}
if (e1 instanceof IContainer) {
return -1;
}
if (e2 instanceof IContainer) {
return 1;
}
return super.compare(viewer, e1, e2);
}
}