/** * Copyright (c) 2005-2011 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 Sep 14, 2004 * * @author Fabio Zadrozny */ package org.python.pydev.editor.codecompletion; import java.util.Comparator; import org.eclipse.jface.text.contentassist.ICompletionProposal; /** * @author Fabio Zadrozny */ public final class ProposalsComparator implements Comparator<ICompletionProposal> { public int compare(ICompletionProposal o1, ICompletionProposal o2) { if (o1 instanceof IPyCompletionProposal && o2 instanceof IPyCompletionProposal) { IPyCompletionProposal p1 = (IPyCompletionProposal) o1; IPyCompletionProposal p2 = (IPyCompletionProposal) o2; int priority1 = p1.getPriority(); int priority2 = p2.getPriority(); if (priority1 < priority2) { return -1; } if (priority1 > priority2) { return 1; } } //if it is not an IPyCompletionProposal, it has default priority. else if (o1 instanceof IPyCompletionProposal) { IPyCompletionProposal p1 = (IPyCompletionProposal) o1; int priority1 = p1.getPriority(); if (priority1 < IPyCompletionProposal.PRIORITY_DEFAULT) { return -1; } if (priority1 > IPyCompletionProposal.PRIORITY_DEFAULT) { return 1; } } else if (o2 instanceof IPyCompletionProposal) { IPyCompletionProposal p2 = (IPyCompletionProposal) o2; int priority2 = p2.getPriority(); if (IPyCompletionProposal.PRIORITY_DEFAULT < priority2) { return -1; } if (IPyCompletionProposal.PRIORITY_DEFAULT > priority2) { return 1; } } String o1Str = o1.getDisplayString(); String o2Str = o2.getDisplayString(); String o1StrOriginal = o1Str; String o2StrOriginal = o2Str; boolean o1StartsWithUnder = false; boolean o2StartsWithUnder = false; try { o1StartsWithUnder = o1Str.charAt(0) == '_'; } catch (Exception e1) { //Shouldn't happen (empty completion?), but if it does, just ignore... } try { o2StartsWithUnder = o2Str.charAt(0) == '_'; } catch (Exception e) { //Shouldn't happen (empty completion?), but if it does, just ignore... } if (o1StartsWithUnder != o2StartsWithUnder) { if (o1StartsWithUnder) { return 1; } return -1; } else if (o1StartsWithUnder) {//both start with '_' at this point, let's check for '__' int o1Len = o1Str.length(); int o2Len = o2Str.length(); if (o1Len > 1) { o1StartsWithUnder = o1Str.charAt(1) == '_'; } else { o1StartsWithUnder = false; } if (o2Len > 1) { o2StartsWithUnder = o2Str.charAt(1) == '_'; } else { o2StartsWithUnder = false; } if (o1StartsWithUnder != o2StartsWithUnder) { if (o1StartsWithUnder) { return 1; } return -1; } //Ok, at this point, both start with '__', so, the final thing is checking for '__' in the end. //START: Get the contents only to the first parens or space for the comparisons. { int iSplit1 = o1Str.indexOf('(', 0); int iSplit2 = o2Str.indexOf('(', 0); int iSpace1 = o1Str.indexOf(' ', 0); int iSpace2 = o2Str.indexOf(' ', 0); if (iSpace1 >= 0 && iSpace1 < iSplit1) { iSplit1 = iSpace1; } if (iSpace2 >= 0 && iSpace2 < iSplit2) { iSplit2 = iSpace2; } if (iSplit1 >= 0) { o1Str = o1Str.substring(0, iSplit1); o1Len = o1Str.length(); } if (iSplit2 >= 0) { o2Str = o2Str.substring(0, iSplit2); o2Len = o2Str.length(); } } //END: Get the contents only to the first parens or space for the comparisons. boolean o1EndsWithUnder = false; boolean o2EndsWithUnder = false; if (o1Len > 2) { o1EndsWithUnder = o1Str.charAt(o1Len - 1) == '_'; } if (o2Len > 2) { o2EndsWithUnder = o2Str.charAt(o2Len - 1) == '_'; } if (o1EndsWithUnder != o2EndsWithUnder) { if (o1EndsWithUnder) { return 1; } return -1; } } return o1StrOriginal.compareToIgnoreCase(o2StrOriginal); } }