summaryrefslogtreecommitdiff
path: root/platform/lang-impl/src/com/intellij/codeInsight/navigation/CtrlMouseHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/lang-impl/src/com/intellij/codeInsight/navigation/CtrlMouseHandler.java')
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/navigation/CtrlMouseHandler.java140
1 files changed, 66 insertions, 74 deletions
diff --git a/platform/lang-impl/src/com/intellij/codeInsight/navigation/CtrlMouseHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/navigation/CtrlMouseHandler.java
index 3666b4642efd..2f56d3714943 100644
--- a/platform/lang-impl/src/com/intellij/codeInsight/navigation/CtrlMouseHandler.java
+++ b/platform/lang-impl/src/com/intellij/codeInsight/navigation/CtrlMouseHandler.java
@@ -19,6 +19,7 @@ package com.intellij.codeInsight.navigation;
import com.intellij.codeInsight.CodeInsightBundle;
import com.intellij.codeInsight.TargetElementUtilBase;
import com.intellij.codeInsight.documentation.DocumentationManager;
+import com.intellij.codeInsight.documentation.DocumentationManagerProtocol;
import com.intellij.codeInsight.hint.HintManager;
import com.intellij.codeInsight.hint.HintManagerImpl;
import com.intellij.codeInsight.hint.HintUtil;
@@ -34,9 +35,7 @@ import com.intellij.openapi.actionSystem.MouseShortcut;
import com.intellij.openapi.actionSystem.Shortcut;
import com.intellij.openapi.actionSystem.impl.ActionButton;
import com.intellij.openapi.actionSystem.impl.PresentationFactory;
-import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.components.AbstractProjectComponent;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
@@ -66,7 +65,7 @@ import com.intellij.openapi.project.IndexNotReadyException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.startup.StartupManager;
import com.intellij.openapi.util.Comparing;
-import com.intellij.openapi.util.Key;
+import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
@@ -104,16 +103,14 @@ import java.util.List;
public class CtrlMouseHandler extends AbstractProjectComponent {
private static final AbstractDocumentationTooltipAction[] ourTooltipActions = {new ShowQuickDocAtPinnedWindowFromTooltipAction()};
- private static Key<?> ourDebuggerHighlighterKey;
- private static Key<?> ourXDebuggerHighlighterKey;
private final EditorColorsManager myEditorColorsManager;
- private HighlightersSet myHighlighter;
- @JdkConstants.InputEventMask private int myStoredModifiers = 0;
- private TooltipProvider myTooltipProvider = null;
- private final FileEditorManager myFileEditorManager;
- private final DocumentationManager myDocumentationManager;
- @Nullable private Point myPrevMouseLocation;
+ private HighlightersSet myHighlighter;
+ @JdkConstants.InputEventMask private int myStoredModifiers = 0;
+ private TooltipProvider myTooltipProvider = null;
+ private final FileEditorManager myFileEditorManager;
+ private final DocumentationManager myDocumentationManager;
+ @Nullable private Point myPrevMouseLocation;
private LightweightHint myHint;
private enum BrowseMode {None, Declaration, TypeDeclaration, Implementation}
@@ -137,7 +134,11 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
BrowseMode browseMode = getBrowseMode(modifiers);
- if (browseMode != BrowseMode.None) {
+ if (browseMode == BrowseMode.None) {
+ disposeHighlighter();
+ cancelPreviousTooltip();
+ }
+ else {
TooltipProvider tooltipProvider = myTooltipProvider;
if (tooltipProvider != null) {
if (browseMode != tooltipProvider.getBrowseMode()) {
@@ -149,10 +150,6 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
myTooltipProvider.execute(browseMode);
}
}
- else {
- disposeHighlighter();
- cancelPreviousTooltip();
- }
}
};
@@ -240,8 +237,7 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
EditorColorsManager colorsManager,
FileEditorManager fileEditorManager,
@NotNull DocumentationManager documentationManager,
- @NotNull final EditorFactory editorFactory)
- {
+ @NotNull final EditorFactory editorFactory) {
super(project);
myEditorColorsManager = colorsManager;
startupManager.registerPostStartupActivity(new DumbAwareRunnable() {
@@ -289,6 +285,7 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
return new Rectangle(hintComponent.getLocationOnScreen(), hintComponent.getSize());
}
+ @NotNull
private static BrowseMode getBrowseMode(@JdkConstants.InputEventMask int modifiers) {
if (modifiers != 0) {
final Keymap activeKeymap = KeymapManager.getInstance().getActiveKeymap();
@@ -375,9 +372,9 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
private abstract static class Info {
@NotNull protected final PsiElement myElementAtPointer;
- private final List<TextRange> myRanges;
+ @NotNull private final List<TextRange> myRanges;
- public Info(@NotNull PsiElement elementAtPointer, List<TextRange> ranges) {
+ public Info(@NotNull PsiElement elementAtPointer, @NotNull List<TextRange> ranges) {
myElementAtPointer = elementAtPointer;
myRanges = ranges;
}
@@ -387,10 +384,11 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
elementAtPointer.getTextOffset() + elementAtPointer.getTextLength())));
}
- boolean isSimilarTo(final Info that) {
+ boolean isSimilarTo(@NotNull Info that) {
return Comparing.equal(myElementAtPointer, that.myElementAtPointer) && myRanges.equals(that.myRanges);
}
+ @NotNull
public List<TextRange> getRanges() {
return myRanges;
}
@@ -398,11 +396,11 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
@NotNull
public abstract DocInfo getInfo();
- public abstract boolean isValid(Document document);
+ public abstract boolean isValid(@NotNull Document document);
public abstract void showDocInfo(@NotNull DocumentationManager docManager);
- protected boolean rangesAreCorrect(Document document) {
+ protected boolean rangesAreCorrect(@NotNull Document document) {
final TextRange docRange = new TextRange(0, document.getTextLength());
for (TextRange range : getRanges()) {
if (!docRange.contains(range)) return false;
@@ -412,7 +410,7 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
}
}
- private static void showDumbModeNotification(final Project project) {
+ private static void showDumbModeNotification(@NotNull Project project) {
DumbService.getInstance(project).showDumbModeNotification("Element information is not available during index update");
}
@@ -424,7 +422,7 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
myTargetElement = targetElement;
}
- public InfoSingle(final PsiReference ref, @NotNull final PsiElement targetElement) {
+ public InfoSingle(@NotNull PsiReference ref, @NotNull final PsiElement targetElement) {
super(ref.getElement(), ReferenceRange.getAbsoluteRanges(ref));
myTargetElement = targetElement;
}
@@ -432,21 +430,22 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
@Override
@NotNull
public DocInfo getInfo() {
- AccessToken token = ReadAction.start();
- try {
- return generateInfo(myTargetElement, myElementAtPointer);
- }
- catch (IndexNotReadyException e) {
- showDumbModeNotification(myTargetElement.getProject());
- return DocInfo.EMPTY;
- }
- finally {
- token.finish();
- }
+ return ApplicationManager.getApplication().runReadAction(new Computable<DocInfo>() {
+ @Override
+ public DocInfo compute() {
+ try {
+ return generateInfo(myTargetElement, myElementAtPointer);
+ }
+ catch (IndexNotReadyException e) {
+ showDumbModeNotification(myTargetElement.getProject());
+ return DocInfo.EMPTY;
+ }
+ }
+ });
}
@Override
- public boolean isValid(Document document) {
+ public boolean isValid(@NotNull Document document) {
if (!myTargetElement.isValid()) return false;
if (!myElementAtPointer.isValid()) return false;
if (myTargetElement == myElementAtPointer) return false;
@@ -462,7 +461,6 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
}
private static class InfoMultiple extends Info {
-
public InfoMultiple(@NotNull final PsiElement elementAtPointer) {
super(elementAtPointer);
}
@@ -478,7 +476,7 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
}
@Override
- public boolean isValid(Document document) {
+ public boolean isValid(@NotNull Document document) {
return rangesAreCorrect(document);
}
@@ -489,7 +487,7 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
}
@Nullable
- private Info getInfoAt(@NotNull Editor editor, PsiFile file, int offset, BrowseMode browseMode) {
+ private Info getInfoAt(@NotNull Editor editor, @NotNull PsiFile file, int offset, @NotNull BrowseMode browseMode) {
PsiElement targetElement = null;
if (browseMode == BrowseMode.TypeDeclaration) {
@@ -502,7 +500,7 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
}
else if (browseMode == BrowseMode.Declaration) {
final PsiReference ref = TargetElementUtilBase.findReference(editor, offset);
- final List<PsiElement> resolvedElements = ref != null ? resolve(ref) : Collections.<PsiElement>emptyList();
+ final List<PsiElement> resolvedElements = ref == null ? Collections.<PsiElement>emptyList() : resolve(ref);
final PsiElement resolvedElement = resolvedElements.size() == 1 ? resolvedElements.get(0) : null;
final PsiElement[] targetElements = GotoDeclarationAction.findTargetElementsNoVS(myProject, editor, offset, false);
@@ -572,7 +570,8 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
return null;
}
- private static List<PsiElement> resolve(final PsiReference ref) {
+ @NotNull
+ private static List<PsiElement> resolve(@NotNull PsiReference ref) {
// IDEA-56727 try resolve first as in GotoDeclarationAction
PsiElement resolvedElement = ref.resolve();
@@ -734,13 +733,13 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
}
private class TooltipProvider {
- private final Editor myEditor;
- private final LogicalPosition myPosition;
+ @NotNull private final Editor myEditor;
+ @NotNull private final LogicalPosition myPosition;
private BrowseMode myBrowseMode;
private boolean myDisposed;
private final ProgressIndicator myProgress = new ProgressIndicatorBase();
- TooltipProvider(Editor editor, LogicalPosition pos) {
+ TooltipProvider(@NotNull Editor editor, @NotNull LogicalPosition pos) {
myEditor = editor;
myPosition = pos;
}
@@ -754,7 +753,7 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
return myBrowseMode;
}
- void execute(BrowseMode browseMode) {
+ void execute(@NotNull BrowseMode browseMode) {
myBrowseMode = browseMode;
Document document = myEditor.getDocument();
@@ -785,16 +784,16 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
});
}
- private void doExecute(PsiFile file, int offset) {
+ private void doExecute(@NotNull PsiFile file, int offset) {
final Info info;
try {
info = getInfoAt(myEditor, file, offset, myBrowseMode);
+ if (info == null) return;
}
catch (IndexNotReadyException e) {
showDumbModeNotification(myProject);
return;
}
- if (info == null) return;
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
@@ -805,7 +804,7 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
});
}
- private void showHint(Info info) {
+ private void showHint(@NotNull Info info) {
if (myDisposed || myEditor.isDisposed()) return;
Component internalComponent = myEditor.getContentComponent();
if (myHighlighter != null) {
@@ -856,10 +855,6 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
@Override
public void mouseClicked(MouseEvent e) {
- QuickDocInfoPane pane = quickDocPaneRef.get();
- if (pane != null) {
- pane.mouseClicked(e);
- }
}
};
Ref<Consumer<String>> newTextConsumerRef = new Ref<Consumer<String>>();
@@ -889,7 +884,7 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
showHint(hint);
}
- public void showHint(LightweightHint hint) {
+ public void showHint(@NotNull LightweightHint hint) {
final HintManagerImpl hintManager = HintManagerImpl.getInstanceImpl();
Point p = HintManagerImpl.getHintPosition(hint, myEditor, myPosition, HintManager.ABOVE);
hintManager.showEditorHint(hint, myEditor, p,
@@ -898,7 +893,8 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
}
}
- private HighlightersSet installHighlighterSet(Info info, Editor editor) {
+ @NotNull
+ private HighlightersSet installHighlighterSet(@NotNull Info info, @NotNull Editor editor) {
final JComponent internalComponent = editor.getContentComponent();
internalComponent.addKeyListener(myEditorKeyListener);
editor.getScrollingModel().addVisibleAreaListener(myVisibleAreaListener);
@@ -922,12 +918,15 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
private class HighlightersSet {
- private final List<RangeHighlighter> myHighlighters;
- private final Editor myHighlighterView;
- private final Cursor myStoredCursor;
- private final Info myStoredInfo;
-
- private HighlightersSet(List<RangeHighlighter> highlighters, Editor highlighterView, Cursor storedCursor, Info storedInfo) {
+ @NotNull private final List<RangeHighlighter> myHighlighters;
+ @NotNull private final Editor myHighlighterView;
+ @NotNull private final Cursor myStoredCursor;
+ @NotNull private final Info myStoredInfo;
+
+ private HighlightersSet(@NotNull List<RangeHighlighter> highlighters,
+ @NotNull Editor highlighterView,
+ @NotNull Cursor storedCursor,
+ @NotNull Info storedInfo) {
myHighlighters = highlighters;
myHighlighterView = highlighterView;
myStoredCursor = storedCursor;
@@ -946,18 +945,18 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
myFileEditorManager.removeFileEditorManagerListener(myFileEditorManagerListener);
}
+ @NotNull
public Info getStoredInfo() {
return myStoredInfo;
}
}
private static class DocInfo {
-
public static final DocInfo EMPTY = new DocInfo(null, null, null);
- @Nullable public final String text;
+ @Nullable public final String text;
@Nullable public final DocumentationProvider docProvider;
- @Nullable public final PsiElement documentationAnchor;
+ @Nullable public final PsiElement documentationAnchor;
DocInfo(@Nullable String text, @Nullable DocumentationProvider provider, @Nullable PsiElement documentationAnchor) {
this.text = text;
@@ -967,7 +966,6 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
}
private class QuickDocInfoPane extends JBLayeredPane {
-
private static final int BUTTON_HGAP = 5;
@NotNull private final List<JComponent> myButtons = new ArrayList<JComponent>();
@@ -1073,11 +1071,6 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
processStateChangeIfNecessary(e.getLocationOnScreen(), false);
}
- public void mouseClicked(@NotNull MouseEvent e) {
- // TODO den check the processing.
- int i = 1;
- }
-
private void processStateChangeIfNecessary(@NotNull Point mouseScreenLocation, boolean mouseEntered) {
// Don't show 'view quick doc' buttons if docked quick doc control is already active.
if (myDocumentationManager.hasActiveDockedDocWindow()) {
@@ -1095,9 +1088,8 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
}
private class QuickDocHyperlinkListener implements HyperlinkListener {
-
@NotNull private final DocumentationProvider myProvider;
- @NotNull private final PsiElement myContext;
+ @NotNull private final PsiElement myContext;
QuickDocHyperlinkListener(@NotNull DocumentationProvider provider, @NotNull PsiElement context) {
myProvider = provider;
@@ -1111,11 +1103,11 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
}
String description = e.getDescription();
- if (StringUtil.isEmpty(description) || !description.startsWith(DocumentationManager.PSI_ELEMENT_PROTOCOL)) {
+ if (StringUtil.isEmpty(description) || !description.startsWith(DocumentationManagerProtocol.PSI_ELEMENT_PROTOCOL)) {
return;
}
- String elementName = e.getDescription().substring(DocumentationManager.PSI_ELEMENT_PROTOCOL.length());
+ String elementName = e.getDescription().substring(DocumentationManagerProtocol.PSI_ELEMENT_PROTOCOL.length());
final PsiElement targetElement = myProvider.getDocumentationElementForLink(PsiManager.getInstance(myProject), elementName, myContext);
if (targetElement != null) {