From 842af1a95ba308e7749effd0ea6b67acc94e63b7 Mon Sep 17 00:00:00 2001 From: Alexander Luyblinsky Date: Tue, 20 Feb 2018 17:12:40 +0300 Subject: [PATCH 1/2] OC-16776 [Quick doc UI] Fix external doc link when unavailable Fixes showing link to external link for ExternalDocumentationProvider when documentation isn't available. --- .../documentation/DocumentationComponent.java | 46 +++++++------------ 1 file changed, 17 insertions(+), 29 deletions(-) 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 bd1c2e8ff4b5..13ce2f3e2374 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java @@ -993,27 +993,25 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr String title = myManager.getTitle(element); final DocumentationProvider provider = DocumentationManager.getProviderFromElement(element); if (myEffectiveExternalUrl == null) { - if (!isExternalHandler(provider)) { - final PsiElement originalElement = DocumentationManager.getOriginalElement(element); - List urls = provider.getUrlFor(element, originalElement); - if (urls != null) { - boolean hasBadUrl = false; - StringBuilder result = new StringBuilder(); - for (String url : urls) { - String link = getLink(title, url); - if (link == null) { - hasBadUrl = true; - break; - } - - if (result.length() > 0) result.append("

"); - result.append(link); + final PsiElement originalElement = DocumentationManager.getOriginalElement(element); + List urls = provider.getUrlFor(element, originalElement); + if (urls != null) { + boolean hasBadUrl = false; + StringBuilder result = new StringBuilder(); + for (String url : urls) { + String link = getLink(title, url); + if (link == null) { + hasBadUrl = true; + break; } - if (!hasBadUrl) return result.toString(); - } - else { - return null; + + if (result.length() > 0) result.append("

"); + result.append(link); } + if (!hasBadUrl) return result.toString(); + } + else { + return null; } } else { String link = getLink(title, myEffectiveExternalUrl); @@ -1038,16 +1036,6 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr return result.toString(); } - private static boolean isExternalHandler(DocumentationProvider provider) { - if (provider instanceof CompositeDocumentationProvider) { - for (DocumentationProvider documentationProvider : ((CompositeDocumentationProvider)provider).getProviders()) { - if (documentationProvider instanceof ExternalDocumentationHandler) return true; - } - return false; - } - return provider instanceof ExternalDocumentationHandler; - } - private static String getHostname(String url) { try { return new URL(url).toURI().getHost(); From cb5b3e58859b57ca6c6183e400fa9d7efb566d45 Mon Sep 17 00:00:00 2001 From: Alexander Luyblinsky Date: Tue, 13 Mar 2018 16:17:55 +0300 Subject: [PATCH 2/2] OC-16776 [Doc UI] Add ability to hide external doc link Extend interface @ExternalDocumentationHandler to check whether ExternalDocumentationHandler can handle external documentation or not. --- .../ExternalDocumentationHandler.java | 13 +++++++++++ .../documentation/DocumentationComponent.java | 23 +++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/platform/lang-api/src/com/intellij/lang/documentation/ExternalDocumentationHandler.java b/platform/lang-api/src/com/intellij/lang/documentation/ExternalDocumentationHandler.java index 358a83f7f88e..e801c9a9bccb 100644 --- a/platform/lang-api/src/com/intellij/lang/documentation/ExternalDocumentationHandler.java +++ b/platform/lang-api/src/com/intellij/lang/documentation/ExternalDocumentationHandler.java @@ -27,4 +27,17 @@ public interface ExternalDocumentationHandler { @NotNull String fetchExternalDocumentation(@NotNull String link, @Nullable PsiElement element); + + /** + * Defines whether we will show external documentation + * link at the bottom of the documentation pane or not. + * + * + * @return true if external documentation link should be + * shown, false otherwise + */ + default boolean canHandleExternal(@Nullable PsiElement element, + @Nullable PsiElement originalElement) { + return true; + } } 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 13ce2f3e2374..ef7400f7f828 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java @@ -990,10 +990,14 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr final PsiElement element = getElement(); if (element == null) return null; - String title = myManager.getTitle(element); final DocumentationProvider provider = DocumentationManager.getProviderFromElement(element); + final PsiElement originalElement = DocumentationManager.getOriginalElement(element); + if (!shouldShowExternalDocumentationLink(provider, element, originalElement)) { + return null; + } + + final String title = myManager.getTitle(element); if (myEffectiveExternalUrl == null) { - final PsiElement originalElement = DocumentationManager.getOriginalElement(element); List urls = provider.getUrlFor(element, originalElement); if (urls != null) { boolean hasBadUrl = false; @@ -1036,6 +1040,21 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr return result.toString(); } + private static boolean shouldShowExternalDocumentationLink(DocumentationProvider provider, + PsiElement element, + PsiElement originalElement) { + if (provider instanceof CompositeDocumentationProvider) { + for (DocumentationProvider documentationProvider : ((CompositeDocumentationProvider)provider).getProviders()) { + if (documentationProvider instanceof ExternalDocumentationHandler) { + return ((ExternalDocumentationHandler)documentationProvider).canHandleExternal(element, originalElement); + } + } + } else if (provider instanceof ExternalDocumentationHandler) { + return ((ExternalDocumentationHandler)provider).canHandleExternal(element, originalElement); + } + return true; + } + private static String getHostname(String url) { try { return new URL(url).toURI().getHost();