/******************************************************************************* * Copyright (c) 2007, 2009 Borland Software Corporation and others. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Borland Software Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.m2m.internal.qvt.oml.emf.util.ui.choosers.metamodel; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; public class EPackageSorter extends ViewerSorter { @Override public int compare(Viewer viewer, Object o1, Object o2) { if(o1 instanceof EObjectNode == false || o2 instanceof EObjectNode == false) { return 0; } EObject elem1 = ((EObjectNode)o1).getObj(); EObject elem2 = ((EObjectNode)o2).getObj(); int cmp = compareMetaclasses(elem1, elem2); if(cmp != 0) { return cmp; } cmp = compareNames(elem1, elem2); if(cmp != 0) { return cmp; } return 0; } private int compareMetaclasses(EObject elem1, EObject elem2) { int cls1 = getIndex(elem1); int cls2 = getIndex(elem2); if(cls1 == -1) { return cls2 != -1 ? 1 : 0; } if(cls2 == -1) { return -1; } return cls1 - cls2; } private int compareNames(EObject elem1, EObject elem2) { String name1 = getName(elem1); String name2 = getName(elem2); if(name1 == null) { return name2 != null ? -1 : 0; } if(name2 == null) { return 1; } return name1.compareToIgnoreCase(name2); } private String getName(EObject elem1) { EStructuralFeature nameFeature = elem1.eClass().getEStructuralFeature("name"); //$NON-NLS-1$ if(nameFeature == null) { return null; } else { Object name = elem1.eGet(nameFeature); if(name instanceof String == false) { return null; } else { return (String)name; } } } private int getIndex(EObject elem) { for(int i = 0; i < METAS.length; i++) { Class<?> cls = METAS[i]; if(cls.isAssignableFrom(elem.getClass())) { return i; } } return -1; } private final Class<?>[] METAS = new Class[] { EPackage.class, EClass.class }; }