diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java index a0a0af7b9849..3cac97504db1 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java @@ -21,13 +21,13 @@ import com.intellij.codeInsight.hint.ElementLocationUtil; import com.intellij.codeInsight.hint.HintManagerImpl; import com.intellij.codeInsight.hint.HintUtil; import com.intellij.icons.AllIcons; +import com.intellij.ide.BrowserUtil; import com.intellij.ide.DataManager; import com.intellij.ide.actions.BaseNavigateToSourceAction; import com.intellij.ide.actions.ExternalJavaDocAction; import com.intellij.lang.documentation.CompositeDocumentationProvider; import com.intellij.lang.documentation.DocumentationProvider; import com.intellij.lang.documentation.ExternalDocumentationHandler; -import com.intellij.lang.documentation.ExternalDocumentationProvider; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.impl.ActionButton; @@ -39,6 +39,7 @@ import com.intellij.openapi.editor.ex.EditorSettingsExternalizable; import com.intellij.openapi.editor.ex.util.EditorUtil; import com.intellij.openapi.options.FontSize; import com.intellij.openapi.ui.popup.JBPopup; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; @@ -54,6 +55,7 @@ import com.intellij.ui.SideBorder; import com.intellij.ui.components.JBLayeredPane; import com.intellij.ui.components.JBScrollPane; import com.intellij.util.Consumer; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashMap; import com.intellij.util.ui.GraphicsUtil; import com.intellij.util.ui.UIUtil; @@ -696,6 +698,12 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr } } + private static final Condition BROWSABLE_URL = new Condition() { + @Override + public boolean value(String s) { + return BrowserUtil.canBeBrowsed(s); + } + }; private class ExternalDocAction extends AnAction implements HintManagerImpl.ActionToIgnore { public ExternalDocAction() { @@ -722,10 +730,10 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr if (!processed) { final Component component = PlatformDataKeys.CONTEXT_COMPONENT.getData(e.getDataContext()); final List urls; - if (!StringUtil.isEmptyOrSpaces(myEffectiveExternalUrl)) { + if (!StringUtil.isEmptyOrSpaces(myEffectiveExternalUrl) && BROWSABLE_URL.value(myEffectiveExternalUrl)) { urls = Collections.singletonList(myEffectiveExternalUrl); } else { - urls = provider.getUrlFor(element, originalElement); + urls = getBrowsableUrls(provider.getUrlFor(element, originalElement)); assert urls != null : provider; assert !urls.isEmpty() : provider; } @@ -742,15 +750,15 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr final PsiElement element = myElement.getElement(); final DocumentationProvider provider = DocumentationManager.getProviderFromElement(element); final PsiElement originalElement = DocumentationManager.getOriginalElement(element); - if (provider instanceof ExternalDocumentationProvider) { - presentation.setEnabled(element != null && ((ExternalDocumentationProvider)provider).hasDocumentationFor(element, originalElement)); - } - else { - final List urls = provider.getUrlFor(element, originalElement); - presentation.setEnabled(element != null && urls != null && !urls.isEmpty()); - } + List urls = getBrowsableUrls(provider.getUrlFor(element, originalElement)); + presentation.setEnabled(element != null && urls != null && !urls.isEmpty()); } } + + @Nullable + private List getBrowsableUrls(@Nullable List urls) { + return urls == null ? null : ContainerUtil.filter(urls, BROWSABLE_URL); + } } private void registerActions() { diff --git a/platform/platform-api/src/com/intellij/ide/BrowserUtil.java b/platform/platform-api/src/com/intellij/ide/BrowserUtil.java index 129f41539ba9..12f2211a592d 100644 --- a/platform/platform-api/src/com/intellij/ide/BrowserUtil.java +++ b/platform/platform-api/src/com/intellij/ide/BrowserUtil.java @@ -57,6 +57,10 @@ public class BrowserUtil { public static boolean isAbsoluteURL(String url) { return ourExternalPrefix.matcher(url.toLowerCase(Locale.ENGLISH)).find(); } + + public static boolean canBeBrowsed(String url) { + return url != null && !url.startsWith("jar:"); + } public static String getDocURL(String url) { Matcher anchorMatcher = ourAnchorSuffix.matcher(url);