05c839f3e664d379e8c4bfecf86c51d9ced57bb2
[idea/community.git] / platform / lang-impl / src / com / intellij / ide / actions / searcheverywhere / SearchListModel.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.ide.actions.searcheverywhere;
3
4 import com.google.common.collect.Lists;
5 import com.intellij.util.containers.ContainerUtil;
6 import org.jetbrains.annotations.NotNull;
7 import org.jetbrains.annotations.Nullable;
8
9 import javax.swing.*;
10 import java.util.ArrayList;
11 import java.util.Collection;
12 import java.util.List;
13 import java.util.Map;
14 import java.util.stream.Collectors;
15
16 abstract class SearchListModel extends AbstractListModel<Object> {
17
18   static final Object MORE_ELEMENT = new Object();
19
20   protected final List<SearchEverywhereFoundElementInfo> listElements = new ArrayList<>();
21   protected boolean resultsExpired = false;
22
23   public boolean isResultsExpired() {
24     return resultsExpired;
25   }
26
27   public void expireResults() {
28     resultsExpired = true;
29   }
30
31   @Override
32   public int getSize() {
33     return listElements.size();
34   }
35
36   @Override
37   public Object getElementAt(int index) {
38     return listElements.get(index).getElement();
39   }
40
41   public int getWeightAt(int index) {
42     return listElements.get(index).getPriority();
43   }
44
45   public List<Object> getItems() {
46     return new ArrayList<>(values());
47   }
48
49   public Collection<Object> getFoundItems(SearchEverywhereContributor contributor) {
50     return listElements.stream()
51       .filter(info -> info.getContributor() == contributor && info.getElement() != MORE_ELEMENT)
52       .map(info -> info.getElement())
53       .collect(Collectors.toList());
54   }
55
56   @NotNull
57   protected List<SearchEverywhereContributor> contributors() {
58     return Lists.transform(listElements, info -> info.getContributor());
59   }
60
61   @NotNull
62   protected List<Object> values() {
63     return Lists.transform(listElements, info -> info.getElement());
64   }
65
66   public abstract boolean hasMoreElements(SearchEverywhereContributor<?> contributor);
67
68   public abstract void setHasMore(SearchEverywhereContributor<?> contributor, boolean contributorHasMore);
69
70   public abstract void addElements(List<? extends SearchEverywhereFoundElementInfo> items);
71
72   public abstract void removeElement(@NotNull Object item, SearchEverywhereContributor<?> contributor);
73
74   public abstract void clearMoreItems();
75
76   public abstract int getIndexToScroll(int currentIndex, boolean scrollDown);
77
78   public void clear() {
79     int index = getSize() - 1;
80     listElements.clear();
81     if (index >= 0) {
82       fireIntervalRemoved(this, 0, index);
83     }
84   }
85
86   public boolean contains(Object val) {
87     return values().contains(val);
88   }
89
90   public boolean isMoreElement(int index) {
91     return getElementAt(index) == MORE_ELEMENT;
92   }
93
94   @Nullable
95   public <Item> SearchEverywhereContributor<Item> getContributorForIndex(int index) {
96     //noinspection unchecked
97     return (SearchEverywhereContributor<Item>)listElements.get(index).getContributor();
98   }
99
100   @NotNull
101   public List<SearchEverywhereFoundElementInfo> getFoundElementsInfo() {
102     return ContainerUtil.filter(listElements, info -> info.element != MORE_ELEMENT);
103   }
104
105   public Map<SearchEverywhereContributor<?>, Collection<SearchEverywhereFoundElementInfo>> getFoundElementsMap() {
106     return listElements.stream()
107       .filter(info -> info.element != MORE_ELEMENT)
108       .collect(Collectors.groupingBy(o -> o.getContributor(), Collectors.toCollection(ArrayList::new)));
109   }
110 }