summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Bruch2012-03-14 05:32:46 (EDT)
committer Dani Megert2012-03-14 05:32:46 (EDT)
commitb243be1cdfecff6dc8850fd2bffd2d955808ac18 (patch)
tree096a1e634159b04eab5f69dbfd5c2989d7e9f15e
parent579a1a62d04dbff688759eed4225e32fb056f06e (diff)
downloadeclipse.platform.text-b243be1cdfecff6dc8850fd2bffd2d955808ac18.zip
eclipse.platform.text-b243be1cdfecff6dc8850fd2bffd2d955808ac18.tar.gz
eclipse.platform.text-b243be1cdfecff6dc8850fd2bffd2d955808ac18.tar.bz2
Fixed bug 350991: [content assist][api] Allow to re-sort proposals
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/CompletionProposalPopup.java41
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java22
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ICompletionProposalSorter.java39
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 8644363..f6fb7de 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 e69d019..20d78b4 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 0000000..90b08da
--- /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