mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-08 15:09:39 +07:00
when there are no green items, still preselect the most relevant one
This commit is contained in:
@@ -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>
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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 {}");
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user