diff options
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.java | 140 |
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) { |