diff options
3 files changed, 101 insertions, 1 deletions
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/CompletionProposalPopup.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/CompletionProposalPopup.java index 8644363d15a..f6fb7de2ed5 100644 --- a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/CompletionProposalPopup.java +++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/CompletionProposalPopup.java @@ -8,10 +8,13 @@ * Contributors: * IBM Corporation - initial API and implementation * Sean Montgomery, sean_montgomery@comcast.net - https://bugs.eclipse.org/bugs/show_bug.cgi?id=116454 + * Marcel Bruch, bruch@cs.tu-darmstadt.de - [content assist] Allow to re-sort proposals - https://bugs.eclipse.org/bugs/show_bug.cgi?id=350991 *******************************************************************************/ package org.eclipse.jface.text.contentassist; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; import java.util.List; import org.eclipse.osgi.util.TextProcessor; @@ -429,6 +432,13 @@ class CompletionProposalPopup implements IContentAssistListener { */ private boolean fIsColoredLabelsSupportEnabled= false; + /** + * The most recent sorter. Used when sorting proposals after filtering is requested by a completion engine. The sorter may + * be <code>null</code>. + * + * @since 3.8 + */ + private ICompletionProposalSorter fSorter; /** * Creates a new completion proposal popup for the given elements. @@ -1084,7 +1094,9 @@ class CompletionProposalPopup implements IContentAssistListener { } /** - * Initializes the proposal selector with these given proposals. + * Initializes the proposal selector with these given proposals. If a proposal sorter is + * configured, the given proposals are sorted before. + * * @param proposals the proposals * @param isFilteredSubset if <code>true</code>, the proposal table is * not cleared, but the proposals that are not in the passed array @@ -1106,6 +1118,7 @@ class CompletionProposalPopup implements IContentAssistListener { proposals= new ICompletionProposal[] { fEmptyProposal }; } + sortProposals(proposals); fFilteredProposals= proposals; final int newLen= proposals.length; if (USE_VIRTUAL) { @@ -1831,4 +1844,30 @@ class CompletionProposalPopup implements IContentAssistListener { return new ProposalSelectionHandler(operationCode); } + /** + * Sets the sorter to use when resorting is required by one of the completion engines. + * + * @param sorter the new sorter to be used, or <code>null</code> if no sorter is needed + * @since 3.8 + */ + public void setSorter(ICompletionProposalSorter sorter) { + fSorter= sorter; + } + + /** + * Sorts the given proposal array if a sorter is configured. Does nothing otherwise. + * + * @param proposals the new proposals to display in the popup window + * @since 3.8 + */ + private void sortProposals(final ICompletionProposal[] proposals) { + if (fSorter != null) { + Arrays.sort(proposals, new Comparator() { + public int compare(Object o1, Object o2) { + return fSorter.compare((ICompletionProposal)o1, + (ICompletionProposal)o2); + } + }); + } + } } diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java index e69d0197d8b..20d78b4b0d0 100644 --- a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java +++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java @@ -9,6 +9,7 @@ * IBM Corporation - initial API and implementation * Guy Gurfinkel, guy.g@zend.com - [content assist][api] provide better access to ContentAssistant - https://bugs.eclipse.org/bugs/show_bug.cgi?id=169954 * Anton Leherbauer (Wind River Systems) - [content assist][api] ContentAssistEvent should contain information about auto activation - https://bugs.eclipse.org/bugs/show_bug.cgi?id=193728 + * Marcel Bruch, bruch@cs.tu-darmstadt.de - [content assist] Allow to re-sort proposals - https://bugs.eclipse.org/bugs/show_bug.cgi?id=350991 *******************************************************************************/ package org.eclipse.jface.text.contentassist; @@ -985,6 +986,12 @@ public class ContentAssistant implements IContentAssistant, IContentAssistantExt */ private boolean fIsColoredLabelsSupportEnabled= false; + /** + * The sorter used to sort completion proposals when filtering was triggered. + * + * @since 3.8 + */ + private ICompletionProposalSorter fSorter; /** * Creates a new content assistant. The content assistant is not automatically activated, @@ -1374,6 +1381,7 @@ public class ContentAssistant implements IContentAssistant, IContentAssistantExt fContextInfoPopup= fContentAssistSubjectControlAdapter.createContextInfoPopup(this); fProposalPopup= fContentAssistSubjectControlAdapter.createCompletionProposalPopup(this, controller); + fProposalPopup.setSorter(fSorter); registerHandler(SELECT_NEXT_PROPOSAL_COMMAND_ID, fProposalPopup.createProposalSelectionHandler(CompletionProposalPopup.ProposalSelectionHandler.SELECT_NEXT)); registerHandler(SELECT_PREVIOUS_PROPOSAL_COMMAND_ID, fProposalPopup.createProposalSelectionHandler(CompletionProposalPopup.ProposalSelectionHandler.SELECT_PREVIOUS)); @@ -2462,4 +2470,18 @@ public class ContentAssistant implements IContentAssistant, IContentAssistantExt fIsColoredLabelsSupportEnabled= isEnabled; } + /** + * Sets the sorter used to sort proposal completions after filtering is triggered. + * + * @param sorter the sorter used for reordering the proposals, or <code>null</code> if no + * proposal reordering is needed + * @since 3.8 + * @see CompletionProposalPopup#setSorter(ICompletionProposalSorter) + */ + public void setSorter(ICompletionProposalSorter sorter) { + fSorter= sorter; + if (fProposalPopup != null) { + fProposalPopup.setSorter(fSorter); + } + } } diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ICompletionProposalSorter.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ICompletionProposalSorter.java new file mode 100644 index 00000000000..90b08da768a --- /dev/null +++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ICompletionProposalSorter.java @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2012 Darmstadt University of Technology 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: + * Marcel Bruch, bruch@cs.tu-darmstadt.de - [content assist] Allow to re-sort proposals - https://bugs.eclipse.org/bugs/show_bug.cgi?id=350991 + */ +package org.eclipse.jface.text.contentassist; + + +/** + * An <code>ICompletionProposalSorter</code> provides support for sorting proposals of a content + * assistant. + * <p> + * Implementors of this interface have to register this sorter with the content assist whenever + * needed. See {@link ContentAssistant#setSorter(ICompletionProposalSorter)} for more information on + * how to register a proposal sorter. + * </p> + * + * @since 3.8 + */ +public interface ICompletionProposalSorter { + + /** + * The orderings imposed by an implementation need not be consistent with equals. + * + * @param p1 the first proposal to be compared + * @param p2 the second proposal to be compared + * @return a negative integer, zero, or a positive integer as the first argument is less than, + * equal to, or greater than the second. + * + * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) + */ + public int compare(ICompletionProposal p1, ICompletionProposal p2); + +}
\ No newline at end of file |