/**
* Copyright (c) 2014 Codetrails GmbH.
* 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:
* Johannes Dorn - initial API and implementation.
*/
package org.eclipse.recommenders.internal.snipmatch.rcp.completion;
import java.util.Comparator;
import org.eclipse.jdt.internal.ui.text.java.RelevanceSorter;
import org.eclipse.jdt.ui.text.java.AbstractProposalSorter;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.contentassist.ICompletionProposalSorter;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Ordering;
public class ProposalSorter extends AbstractProposalSorter {
private static final Comparator<Integer> LOWER_PRIORITY_FIRST = Ordering.natural();
private static final ICompletionProposalSorter FALLBACK_SORTER = new RelevanceSorter();
@Override
public int compare(ICompletionProposal lhs, ICompletionProposal rhs) {
if (lhs instanceof SnippetProposal && rhs instanceof SnippetProposal) {
SnippetProposal lhsSnippet = (SnippetProposal) lhs;
SnippetProposal rhsSnippet = (SnippetProposal) rhs;
return ComparisonChain.start()
.compare(lhsSnippet.getRepositoryRelevance(), rhsSnippet.getRepositoryRelevance())
.compare(rhsSnippet.getRelevance(), lhsSnippet.getRelevance())
.compare(lhsSnippet.getSnippet().getName(), rhsSnippet.getSnippet().getName()).result();
} else if (lhs instanceof RepositoryProposal && rhs instanceof RepositoryProposal) {
RepositoryProposal lhsRepository = (RepositoryProposal) lhs;
RepositoryProposal rhsRepository = (RepositoryProposal) rhs;
return LOWER_PRIORITY_FIRST.compare(lhsRepository.getRepositoryPriority(),
rhsRepository.getRepositoryPriority());
} else if (lhs instanceof RepositoryProposal && rhs instanceof SnippetProposal) {
return compareRepositoryWithSnippet((RepositoryProposal) lhs, (SnippetProposal) rhs);
} else if (lhs instanceof SnippetProposal && rhs instanceof RepositoryProposal) {
return -compareRepositoryWithSnippet((RepositoryProposal) rhs, (SnippetProposal) lhs);
} else if (lhs instanceof ContextLoadingProposal) {
return -1;
} else if (rhs instanceof ContextLoadingProposal) {
return +1;
} else {
return FALLBACK_SORTER.compare(lhs, rhs);
}
}
private int compareRepositoryWithSnippet(RepositoryProposal repository, SnippetProposal snippet) {
int comparison = LOWER_PRIORITY_FIRST.compare(repository.getRepositoryPriority(),
snippet.getRepositoryRelevance());
return comparison != 0 ? comparison : -1;
}
}