package com.sap.ide.treeprovider.internal.explorer; import java.util.Collection; import java.util.List; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EEnum; import org.eclipse.emf.ecore.EEnumLiteral; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import com.sap.ide.treeprovider.GenericRefObjectNode; public class ModelElementViewerSorter extends ViewerSorter { public ModelElementViewerSorter() { } public int compare(Viewer viewer, EObject e1, EObject e2) { if (e1 instanceof GenericRefObjectNode && e2 instanceof GenericRefObjectNode) { GenericRefObjectNode n1 = (GenericRefObjectNode) e1; GenericRefObjectNode n2 = (GenericRefObjectNode) e2; if (n1.getParent() instanceof GenericRefObjectNode) { GenericRefObjectNode p = (GenericRefObjectNode) n1.getParent(); EObject n1RO = n1.getValue(); EObject n2RO = n2.getValue(); EObject pRO = p.getValue(); JmiHelper jmiHelper = pRO.get___Connection().getJmiHelper(); EReference a1 = findCompositeAssoc(n1RO, pRO, jmiHelper); EReference a2 = findCompositeAssoc(n2RO, pRO, jmiHelper); if (a1 != a2) { // n1 and n2 in different composite associations; sort by // association return a1.refMetaObject().getName().compareTo(a2.refMetaObject().getName()); } else if (a1 != null) { // then a2 != null as well Collection<EObject> l = a1.refQuery(jmiHelper.getCompositeAssociationEnd(a1 .refMetaObject()), pRO); if (l instanceof List<?>) { return ((List<?>) l).indexOf(n1RO) - ((List<?>) l).indexOf(n2RO); } } } } return super.compare(viewer, e1, e2); } private EReference findCompositeAssoc(EObject child, EObject parent, JmiHelper jmiHelper) { // find a composite association with ordered child end where p/n1 is a link for (EReference ae : jmiHelper.getAssociationEnds((EClassifier) parent.refMetaObject(), /* includeSupertypes */true)) { if (ae.getAggregation().equals(EEnum.COMPOSITE)) { EReference assoc = jmiHelper.getRefAssociationForAssociation((EReference) ae.eContainer()); EObject first1; EObject second1; if (jmiHelper.isFirstAssociationEnd((EReference) ae.eContainer(), ae)) { first1 = parent; second1 = child; } else { first1 = child; second1 = parent; } if (first1.refIsInstanceOf(jmiHelper.getAssociationEnds(assoc.refMetaObject()).get(0).getType(), /* considerSubtypes */true) && second1.refIsInstanceOf(jmiHelper.getAssociationEnds(assoc.refMetaObject()).get(1).getType(), /* considerSubtypes */true) && assoc.refLinkExists(first1, second1)) { return assoc; } } } return null; } }