don't cache invalid injected editor in lookup (IDEA-146179, EA-54321 - assert: PsiFil...
[idea/community.git] / platform / lang-api / src / com / intellij / codeInsight / lookup / Lookup.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.intellij.codeInsight.lookup;
18
19 import com.intellij.codeInsight.completion.PrefixMatcher;
20 import com.intellij.openapi.editor.Editor;
21 import com.intellij.openapi.project.Project;
22 import com.intellij.psi.PsiElement;
23 import com.intellij.psi.PsiFile;
24 import org.jetbrains.annotations.NotNull;
25 import org.jetbrains.annotations.Nullable;
26
27 import java.awt.*;
28 import java.util.List;
29
30 /**
31  * Represents list with suggestions shown in code completion, refactorings, live templates etc.
32  */
33 public interface Lookup {
34   char NORMAL_SELECT_CHAR = '\n';
35   char REPLACE_SELECT_CHAR = '\t';
36   char COMPLETE_STATEMENT_SELECT_CHAR = '\r';
37   char AUTO_INSERT_SELECT_CHAR = (char) 0;
38
39   /**
40    * @return the offset in {@link #getTopLevelEditor()} which this lookup's left side should be aligned with. Note that if the lookup doesn't fit
41    * the screen due to its dimensions, the actual position might differ from this editor offset.
42    */
43   int getLookupStart();
44
45   @Nullable
46   LookupElement getCurrentItem();
47
48   void addLookupListener(LookupListener listener);
49   void removeLookupListener(LookupListener listener);
50
51   /**
52    * @return bounds in layered pane coordinate system
53    */
54   Rectangle getBounds();
55
56   /**
57    * @return bounds of the current item in the layered pane coordinate system.
58    */
59   Rectangle getCurrentItemBounds();
60   boolean isPositionedAboveCaret();
61
62   /**
63    * @return leaf PSI element at this lookup's start position (see {@link #getLookupStart()}) in {@link #getPsiFile()} result.
64    */
65   @Nullable
66   PsiElement getPsiElement();
67
68   /**
69    * Consider using {@link #getTopLevelEditor()} if you don't need injected editor.
70    * @return editor, possibly injected, where this lookup is shown
71    */
72   @NotNull
73   Editor getEditor();
74
75   /**
76    * @return the non-injected editor where this lookup is shown
77    */
78   @NotNull
79   Editor getTopLevelEditor();
80
81   @NotNull
82   Project getProject();
83
84   /**
85    * @return PSI file, possibly injected, associated with this lookup's editor
86    * @see #getEditor()
87    */
88   @Nullable
89   PsiFile getPsiFile();
90
91   boolean isCompletion();
92
93   List<LookupElement> getItems();
94
95   boolean isFocused();
96
97   @NotNull
98   String itemPattern(@NotNull LookupElement element);
99
100   @NotNull
101   PrefixMatcher itemMatcher(@NotNull LookupElement item);
102
103   boolean isSelectionTouched();
104
105   List<String> getAdvertisements();
106 }