org.emftext.sdk.concretesyntax.resource.cs.ui.CsOutlinePageTreeViewerComparator.java Source code

Java tutorial

Introduction

Here is the source code for org.emftext.sdk.concretesyntax.resource.cs.ui.CsOutlinePageTreeViewerComparator.java

Source

/*******************************************************************************
 * Copyright (c) 2006-2015
 * Software Technology Group, Dresden University of Technology
 * DevBoost GmbH, Dresden, Amtsgericht Dresden, HRB 34001
 *
 * 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:
 *   Software Technology Group - TU Dresden, Germany;
 *   DevBoost GmbH - Dresden, Germany
 *      - initial API and implementation
 ******************************************************************************/

package org.emftext.sdk.concretesyntax.resource.cs.ui;

import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;

public class CsOutlinePageTreeViewerComparator extends ViewerComparator {

    private static Map<EPackage, Integer> ePackageMap = new LinkedHashMap<EPackage, Integer>();
    private static int nextPackageID;

    private Comparator<Object> comparator = new 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 EObject) {
            EObject eObject = (EObject) element;
            EClass eClass = eObject.eClass();
            EPackage ePackage = eClass.getEPackage();
            int packageID = getEPackageID(ePackage);
            int classifierID = eClass.getClassifierID();
            return packageID + classifierID;
        } else {
            return super.category(element);
        }
    }

    private int getEPackageID(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 Comparator<?> getComparator() {
        return this.comparator;
    }

    public int compare(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 EObject && o2 instanceof EObject) {
            EObject e1 = (EObject) o1;
            EObject e2 = (EObject) o2;
            org.emftext.sdk.concretesyntax.resource.cs.ICsNameProvider nameProvider = new org.emftext.sdk.concretesyntax.resource.cs.mopp.CsMetaInformation()
                    .createNameProvider();
            List<String> names1 = nameProvider.getNames(e1);
            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);
    }

}