when there are no green items, still preselect the most relevant one

This commit is contained in:
peter
2011-06-15 15:32:02 +02:00
parent 0bc84b6329
commit 5ab252bb58
5 changed files with 44 additions and 18 deletions

View File

@@ -0,0 +1,17 @@
class Foo {
int ELEMENT_A = 1;
int ELEMENT_B = 1;
int ELEMENT_C = 1;
int ELEMENT_D = 1;
int ELEMENT_E = 1;
int ELEMENT_F = 1;
int ELEMENT_G = 1;
int ELEMENT_H = 1;
int ELEMENT_I = 1;
{
El<caret>
}
}

View File

@@ -213,6 +213,15 @@ public class NormalCompletionOrderingTest extends CompletionSortingTestCase {
checkPreferredItems(0, "FooOCSomething", "FooObjectCollector");
}
public void testPreselectMostRelevantInTheMiddle() {
myFixture.addClass("package foo; public class Elaaaaaaaaaaaaaaaaaaaa {}");
invokeCompletion(getTestName(false) + ".java");
LookupImpl lookup = getLookup();
assertPreferredItems(lookup.getList().getSelectedIndex());
assertEquals("Elaaaaaaaaaaaaaaaaaaaa", lookup.getItems().get(0).getLookupString());
assertEquals("ELEMENT_A", lookup.getCurrentItem().getLookupString());
}
public void testPreferSamePackageOverImported() {
myFixture.addClass("package bar; public class Bar1 {}");
myFixture.addClass("package bar; public class Bar2 {}");

View File

@@ -23,7 +23,6 @@ import com.intellij.codeInsight.lookup.Lookup;
import com.intellij.codeInsight.lookup.LookupArranger;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.impl.LookupImpl;
import com.intellij.psi.PsiElement;
import com.intellij.psi.WeighingService;
import com.intellij.psi.statistics.StatisticsInfo;
import com.intellij.psi.statistics.StatisticsManager;
@@ -31,6 +30,7 @@ import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.FactoryMap;
import com.intellij.util.containers.MultiMap;
import gnu.trove.THashMap;
import gnu.trove.THashSet;
import gnu.trove.TObjectHashingStrategy;
import org.jetbrains.annotations.NotNull;
@@ -75,22 +75,22 @@ public class CompletionLookupArranger extends LookupArranger {
}
public int suggestPreselectedItem(List<LookupElement> sorted) {
public int suggestPreselectedItem(List<LookupElement> sorted, Iterable<List<LookupElement>> groups) {
final CompletionPreselectSkipper[] skippers = CompletionPreselectSkipper.EP_NAME.getExtensions();
nextItem: for (int i = 0; i < sorted.size(); i++){
LookupElement item = sorted.get(i);
final Object obj = item.getObject();
if (obj instanceof PsiElement && !((PsiElement)obj).isValid()) continue;
for (final CompletionPreselectSkipper skipper : skippers) {
if (skipper.skipElement(item, myLocation)) {
continue nextItem;
Set<LookupElement> model = new THashSet<LookupElement>(sorted);
for (List<LookupElement> group : groups) {
for (LookupElement element : group) {
if (model.contains(element)) {
for (final CompletionPreselectSkipper skipper : skippers) {
if (!skipper.skipElement(element, myLocation)) {
return sorted.indexOf(element);
}
}
}
}
return i;
}
return sorted.size() - 1;
}

View File

@@ -53,7 +53,7 @@ public abstract class LookupArranger {
public void itemSelected(LookupElement item, final Lookup lookup) {
}
public int suggestPreselectedItem(List<LookupElement> sorted) {
public int suggestPreselectedItem(List<LookupElement> sorted, Iterable<List<LookupElement>> groups) {
return 0;
}

View File

@@ -426,7 +426,7 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable
myList.setFixedCellWidth(Math.max(myLookupTextWidth + myCellRenderer.getIconIndent(), myAdComponent.getAdComponent().getPreferredSize().width));
if (isFocused() && (!isExactPrefixItem(model.iterator().next(), true) || mySelectionTouched)) {
restoreSelection(oldSelected, hasPreselected, oldInvariant);
restoreSelection(oldSelected, hasPreselected, oldInvariant, snapshot.second);
}
else {
myList.setSelectedIndex(0);
@@ -469,7 +469,7 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable
updateLookupStart(minPrefixLength);
}
private void restoreSelection(@Nullable LookupElement oldSelected, boolean choosePreselectedItem, @Nullable String oldInvariant) {
private void restoreSelection(@Nullable LookupElement oldSelected, boolean choosePreselectedItem, @Nullable String oldInvariant, Iterable<List<LookupElement>> groups) {
if (oldSelected != null) {
if (oldSelected.isValid()) {
myList.setSelectedValue(oldSelected, false);
@@ -493,7 +493,7 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable
if (choosePreselectedItem) {
myList.setSelectedValue(myPreselectedItem, false);
} else {
myList.setSelectedIndex(doSelectMostPreferableItem(getItems()));
myList.setSelectedIndex(doSelectMostPreferableItem(getItems(), groups));
}
if (myPreselectedItem != null && myShown) {
@@ -1218,7 +1218,7 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable
disposeTrace = DebugUtil.currentStackTrace();
}
private int doSelectMostPreferableItem(List<LookupElement> items) {
private int doSelectMostPreferableItem(List<LookupElement> items, Iterable<List<LookupElement>> groups) {
if (items.isEmpty()) {
return -1;
}
@@ -1234,7 +1234,7 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable
}
}
final int index = getActualArranger().suggestPreselectedItem(items);
final int index = getActualArranger().suggestPreselectedItem(items, groups);
assert index >= 0 && index < items.size();
return index;
}