/**
* <copyright>
* </copyright>
*
*
*/
package org.feature.multi.perspective.mapping.viewmapping.resource.mtext.ui;
public class MtextOutlinePageTreeViewerComparator extends org.eclipse.jface.viewers.ViewerComparator {
private static java.util.Map<org.eclipse.emf.ecore.EPackage, Integer> ePackageMap = new java.util.LinkedHashMap<org.eclipse.emf.ecore.EPackage, Integer>();
private static int nextPackageID;
private java.util.Comparator<Object> comparator = new java.util.Comparator<Object>() {
public int compare(Object o1, Object o2) {
if (!sortLexically) {
return 0;
}
if (o1 instanceof String && o2 instanceof String) {
String s1 = (String) o1;
String s2 = (String) o2;
return s1.compareTo(s2);
}
return 0;
}
};
private boolean groupTypes;
private boolean sortLexically;
public void setGroupTypes(boolean on) {
this.groupTypes = on;
}
public void setSortLexically(boolean on) {
this.sortLexically = on;
}
@Override
public int category(Object element) {
if (!groupTypes) {
return 0;
}
if (element instanceof org.eclipse.emf.ecore.EObject) {
org.eclipse.emf.ecore.EObject eObject = (org.eclipse.emf.ecore.EObject) element;
org.eclipse.emf.ecore.EClass eClass = eObject.eClass();
org.eclipse.emf.ecore.EPackage ePackage = eClass.getEPackage();
int packageID = getEPackageID(ePackage);
int classifierID = eClass.getClassifierID();
return packageID + classifierID;
} else {
return super.category(element);
}
}
private int getEPackageID(org.eclipse.emf.ecore.EPackage ePackage) {
Integer packageID = ePackageMap.get(ePackage);
if (packageID == null) {
packageID = nextPackageID;
// we assumed that packages do contain at most 1000 classifiers
nextPackageID += 1000;
ePackageMap.put(ePackage, nextPackageID);
}
return packageID;
}
public java.util.Comparator<?> getComparator() {
return this.comparator;
}
public int compare(org.eclipse.jface.viewers.Viewer viewer, Object o1, Object o2) {
// first check categories
int cat1 = category(o1);
int cat2 = category(o2);
if (cat1 != cat2) {
return cat1 - cat2;
}
// then try to compare the names
if (sortLexically && o1 instanceof org.eclipse.emf.ecore.EObject && o2 instanceof org.eclipse.emf.ecore.EObject) {
org.eclipse.emf.ecore.EObject e1 = (org.eclipse.emf.ecore.EObject) o1;
org.eclipse.emf.ecore.EObject e2 = (org.eclipse.emf.ecore.EObject) o2;
org.feature.multi.perspective.mapping.viewmapping.resource.mtext.IMtextNameProvider nameProvider = new org.feature.multi.perspective.mapping.viewmapping.resource.mtext.mopp.MtextMetaInformation().createNameProvider();
java.util.List<String> names1 = nameProvider.getNames(e1);
java.util.List<String> names2 = nameProvider.getNames(e2);
if (names1 != null && !names1.isEmpty() && names2 != null && !names2.isEmpty()) {
String name1 = names1.get(0);
String name2 = names2.get(0);
return name1.compareTo(name2);
}
}
return super.compare(viewer, o1, o2);
}
}