/** * Copyright (c) 2005-2013 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ /* * Created on 02/11/2016 * * @author Mark Leone */ package org.python.pydev.plugin; import java.util.Arrays; import java.util.Comparator; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IConfigurationElement; import org.python.pydev.editor.hover.PyEditorTextHoverDescriptor; /** * Allows to sort an array based on their elements' configuration elements * according to the natural sort order of the specified attribute. * <p> * This class may be subclassed. * </p> * */ public abstract class ConfigurationElementAttributeSorter { private String attName; /** * Sorts the given array based on its elements' configuration elements * according to the natural sort order of the specified attribute. * * @param elements the array to be sorted * @param attribute the name of the attribute on whose values the elements are to be sorted */ public final void sort(Object[] elements, String attribute) { this.attName = attribute; Arrays.sort(elements, new ConfigurationElementAttributeComparator<Object>(elements, attribute)); } /** * Returns the configuration element for the given object. * * @param object the object * @return the object's configuration element, must not be <code>null</code> */ public abstract IConfigurationElement getConfigurationElement(Object object); /** * Compare configuration elements according to the natural sort order * of specified attribute values. */ private class ConfigurationElementAttributeComparator<O> implements Comparator<O> { public ConfigurationElementAttributeComparator(O[] elements, String attribute) { Assert.isNotNull(elements); } /* * @see Comparator#compare(java.lang.Object, java.lang.Object) * @since 2.0 */ @Override public int compare(O object0, O object1) { if (object0 instanceof PyEditorTextHoverDescriptor && object1 instanceof PyEditorTextHoverDescriptor) { PyEditorTextHoverDescriptor descr0 = (PyEditorTextHoverDescriptor) object0; PyEditorTextHoverDescriptor descr1 = (PyEditorTextHoverDescriptor) object1; if (descr0.getPriority() != null && descr1.getPriority() != null) { return descr0.getPriority().compareTo(descr1.getPriority()); } IConfigurationElement e0 = getConfigurationElement(object0); IConfigurationElement e1 = getConfigurationElement(object1); if (e0 != null && e1 != null) { String e0String = e0.getAttribute(attName); String e1String = e1.getAttribute(attName); if (e0String != null && e1String != null) { Integer val0 = null; Integer val1 = null; try { val0 = Integer.parseInt(e0String); val1 = Integer.parseInt(e1String); } catch (NumberFormatException e) { return e0String.compareTo(e1String); } if (val0 != null && val1 != null) { return val0.compareTo(val1); } } } } return 0; } } }