/*******************************************************************************
 * Copyright (c) 2000, 2004 IBM 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.internal.ide.dialogs;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;

/**
 * Sorter for viewers that display items of type <code>IResource</code>.
 * The sorter supports two sort criteria:
 * <p>
 * <code>NAME</code>: Folders are given order precedence, followed by files.
 * Within these two groups resources are ordered by name.  All name comparisons
 * are case-insensitive.
 * </p>
 * <p>
 * <code>TYPE</code>: Folders are given order precedence, followed by files.
 * Within these two groups resources are ordered by extension.  All extension
 * comparisons are case-insensitive.
 * </p>
 * <p>
 * This class may be instantiated; it is not intended to be subclassed.
 * </p>
 */
public class ResourceSorter extends ViewerSorter {

    /**
     * Constructor argument value that indicates to sort items by name.
     */
    public final static int NAME = 1;

    /**
     * Constructor argument value that indicates to sort items by extension.
     */
    public final static int TYPE = 2;

    private int criteria;

    /**
     * Creates a resource sorter that will use the given sort criteria.
     *
     * @param criteria the sort criterion to use: one of <code>NAME</code> or 
     *   <code>TYPE</code>
     */
    public ResourceSorter(int criteria) {
        super();
        this.criteria = criteria;
    }

    /**
     * Returns an integer value representing the relative sort priority of the 
     * given element based on its class.
     * <p>
     * <ul>
     *   <li>resources (<code>IResource</code>) - 2</li>
     *   <li>project references (<code>ProjectReference</code>) - 1</li>
     *   <li>everything else - 0</li>
     * </ul>
     * </p>
     *
     * @param element the element
     * @return the sort priority (larger numbers means more important)
     */
    protected int classComparison(Object element) {
        if (element instanceof IResource) {
            return 2;
        }
        return 0;
    }

    /* (non-Javadoc)
     * Method declared on ViewerSorter.
     */
    public int compare(Viewer viewer, Object o1, Object o2) {
        //have to deal with non-resources in navigator
        //if one or both objects are not resources, returned a comparison 
        //based on class.
        if (!(o1 instanceof IResource && o2 instanceof IResource)) {
            return compareClass(o1, o2);
        }
        IResource r1 = (IResource) o1;
        IResource r2 = (IResource) o2;

        if (r1 instanceof IContainer && r2 instanceof IContainer) {
			return compareNames(r1, r2);
		} else if (r1 instanceof IContainer) {
			return -1;
		} else if (r2 instanceof IContainer) {
			return 1;
		} else if (criteria == NAME) {
			return compareNames(r1, r2);
		} else if (criteria == TYPE) {
			return compareTypes(r1, r2);
		} else {
			return 0;
		}
    }

    /**
     * Returns a number reflecting the collation order of the given elements
     * based on their class.
     *
     * @param element1 the first element to be ordered
     * @param element2 the second element to be ordered
     * @return a negative number if the first element is less  than the 
     *  second element; the value <code>0</code> if the first element is
     *  equal to the second element; and a positive number if the first
     *  element is greater than the second element
     */
    protected int compareClass(Object element1, Object element2) {
        return classComparison(element1) - classComparison(element2);
    }

    /**
     * Returns a number reflecting the collation order of the given resources
     * based on their resource names.
     *
     * @param resource1 the first resource element to be ordered
     * @param resource2 the second resource element to be ordered
     * @return a negative number if the first element is less  than the 
     *  second element; the value <code>0</code> if the first element is
     *  equal to the second element; and a positive number if the first
     *  element is greater than the second element
     */
    protected int compareNames(IResource resource1, IResource resource2) {
        return collator.compare(resource1.getName(), resource2.getName());
    }

    /**
     * Returns a number reflecting the collation order of the given resources
     * based on their respective file extensions. Resources with the same file
     * extension will be collated based on their names.
     *
     * @param resource1 the first resource element to be ordered
     * @param resource2 the second resource element to be ordered
     * @return a negative number if the first element is less  than the 
     *  second element; the value <code>0</code> if the first element is
     *  equal to the second element; and a positive number if the first
     *  element is greater than the second element
     */
    protected int compareTypes(IResource resource1, IResource resource2) {
        String ext1 = getExtensionFor(resource1);
        String ext2 = getExtensionFor(resource2);

        // Compare extensions.  If they're different then return a value that
        // indicates correct extension ordering.  If they're the same then
        // return a value that indicates the correct NAME ordering.
        int result = collator.compare(ext1, ext2);

        if (result != 0) {
			return result;
		}

        return compareNames(resource1, resource2);
    }

    /**
     * Returns the sort criteria of this this sorter.
     *
     * @return the sort criterion: one of <code>NAME</code> or <code>TYPE</code>
     */
    public int getCriteria() {
        return criteria;
    }

    /**
     * Returns the extension portion of the given resource.
     *
     * @param resource the resource
     * @return the file extension, possibily the empty string
     */
    private String getExtensionFor(IResource resource) {
        String ext = resource.getFileExtension();
        return ext == null ? "" : ext; //$NON-NLS-1$
    }
}
