com.ebmwebsourcing.petals.common.internal.provisional.projectscnf.PetalsProjectsSorter.java Source code

Java tutorial

Introduction

Here is the source code for com.ebmwebsourcing.petals.common.internal.provisional.projectscnf.PetalsProjectsSorter.java

Source

/******************************************************************************
 * Copyright (c) 2010-2013, Linagora
 *
 * 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:
 *       Linagora - initial API and implementation
 *******************************************************************************/

package com.ebmwebsourcing.petals.common.internal.provisional.projectscnf;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.ui.model.IWorkbenchAdapter;

import com.ebmwebsourcing.petals.common.internal.PetalsCommonPlugin;

/**
 * Sort elements in the Petals projects view.
 * @author Vincent Zurczak - EBM WebSourcing
 */
public class PetalsProjectsSorter extends ViewerSorter {

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.ViewerComparator
     * #compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
     */
    @Override
    public int compare(Viewer viewer, Object e1, Object e2) {

        // The viewer can only contain IResources (projects, folders, files)
        // and categories (IWorkbenchAdapters)
        if (e1 instanceof IResource && e2 instanceof IResource) {
            IResource r1 = (IResource) e1;
            IResource r2 = (IResource) e2;

            if (r1.getType() == r2.getType()) {
                if (r1.getType() == IResource.FILE) {
                    if ("jbi.xml".equals(r1.getName()))
                        return -1;
                    else if ("jbi.xml".equals(r2.getName()))
                        return 1;

                    String ext1 = r1.getFileExtension();
                    String ext2 = r2.getFileExtension();
                    if (ext1 == null)
                        return ext2 == null ? 0 : -1;

                    if (ext2 == null)
                        return 1;

                    if (!ext1.equals(ext2))
                        return ext1.compareTo(ext2);
                }

                return r1.getName().compareTo(r2.getName());
            }

            if (r1.getType() == IResource.PROJECT)
                return -2;

            if (r2.getType() == IResource.PROJECT)
                return 2;

            if (r1.getType() == IResource.FOLDER)
                return -1;

            if (r2.getType() == IResource.FOLDER)
                return 1;

            return 0;
        }

        // Java resources are displayed first
        if (e1 instanceof IJavaElement && !(e2 instanceof IJavaElement))
            return -1;

        if (e2 instanceof IJavaElement && !(e1 instanceof IJavaElement))
            return 1;

        if (e2 instanceof IJavaElement && e1 instanceof IJavaElement)
            return compareJavaElements((IJavaElement) e1, (IJavaElement) e2);

        // Comparison of categories are specific
        if (e1 instanceof PetalsProjectCategory && e2 instanceof PetalsProjectCategory) {
            int n1 = ((PetalsProjectCategory) e1).getDisplayOrder();
            int n2 = ((PetalsProjectCategory) e2).getDisplayOrder();
            return n1 - n2;
        }

        // Otherwise, make the other comparisons
        if (e1 instanceof IWorkbenchAdapter && !(e1 instanceof IResource)) {

            if (e2 instanceof IWorkbenchAdapter && !(e2 instanceof IResource)) {
                String label1 = ((IWorkbenchAdapter) e1).getLabel(e1);
                String label2 = ((IWorkbenchAdapter) e2).getLabel(e2);
                return label1.compareTo(label2);
            }

            return -1;
        }

        if (e2 instanceof IWorkbenchAdapter && !(e2 instanceof IResource))
            return 1;

        return super.compare(viewer, e1, e2);
    }

    /**
     * Compares Java elements.
     * @param j1
     * @param j2
     * @return an integer for sorting (0 if equivalent, <0 to display j1 first, >0 to display j2 first)
     */
    private int compareJavaElements(IJavaElement j1, IJavaElement j2) {

        // Fragment roots have a special treatment
        if (j1 instanceof IPackageFragmentRoot && j2 instanceof IPackageFragmentRoot) {
            IPackageFragmentRoot p1 = (IPackageFragmentRoot) j1;
            IPackageFragmentRoot p2 = (IPackageFragmentRoot) j2;

            try {
                if (p1.getKind() == p2.getKind())
                    return p1.getElementName().compareTo(p2.getElementName());
                else if (p1.getKind() == IPackageFragmentRoot.K_SOURCE)
                    return -1;
                else
                    return 1;

            } catch (JavaModelException e) {
                PetalsCommonPlugin.log(e, IStatus.ERROR);
            }

            return p1.getElementName().compareTo(p2.getElementName());
        }

        // Otherwise, it depends on the element type
        if (j1.getElementType() == j2.getElementType())
            return j1.getElementName().compareTo(j2.getElementName());
        else
            return j1.getElementType() - j2.getElementType();
    }
}