From 63ecd0546ff9d467a790abf797c916d4af321017 Mon Sep 17 00:00:00 2001 From: Alexey Pegov Date: Tue, 20 Sep 2011 14:28:48 +0400 Subject: [PATCH] OC-1152 Shift+F1 does not work on selectors + more AppCode QuickDock fixes --- .../CompositeDocumentationProvider.java | 24 ++++++++++++++++++ .../ExternalDocumentationHandler.java | 6 +++++ .../documentation/DocumentationManager.java | 25 ++++++++++++++++--- 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/platform/lang-api/src/com/intellij/lang/documentation/CompositeDocumentationProvider.java b/platform/lang-api/src/com/intellij/lang/documentation/CompositeDocumentationProvider.java index 9f4ff60bf008..79e55cdf06be 100644 --- a/platform/lang-api/src/com/intellij/lang/documentation/CompositeDocumentationProvider.java +++ b/platform/lang-api/src/com/intellij/lang/documentation/CompositeDocumentationProvider.java @@ -20,6 +20,7 @@ import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiManager; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -76,6 +77,29 @@ public class CompositeDocumentationProvider implements DocumentationProvider, Ex return false; } + @Override + public boolean canFetchDocumentationLink(String link) { + for (DocumentationProvider provider : myProviders) { + if (provider instanceof ExternalDocumentationHandler && ((ExternalDocumentationHandler)provider).canFetchDocumentationLink(link)) { + return true; + } + } + + return false; + } + + @NotNull + @Override + public String fetchExternalDocumentation(String link, Project project) { + for (DocumentationProvider provider : myProviders) { + if (provider instanceof ExternalDocumentationHandler && ((ExternalDocumentationHandler)provider).canFetchDocumentationLink(link)) { + return ((ExternalDocumentationHandler)provider).fetchExternalDocumentation(link, project); + } + } + + throw new IllegalStateException("Unable to find a provider to fetch documentation link!"); + } + public String getQuickNavigateInfo(PsiElement element, PsiElement originalElement) { for ( DocumentationProvider provider : myProviders ) { String result = provider.getQuickNavigateInfo(element, originalElement); 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 0584d7cff1cd..4fdba5fa167f 100644 --- a/platform/lang-api/src/com/intellij/lang/documentation/ExternalDocumentationHandler.java +++ b/platform/lang-api/src/com/intellij/lang/documentation/ExternalDocumentationHandler.java @@ -15,8 +15,10 @@ */ package com.intellij.lang.documentation; +import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiManager; +import org.jetbrains.annotations.NotNull; /** * User: spLeaner @@ -24,4 +26,8 @@ import com.intellij.psi.PsiManager; public interface ExternalDocumentationHandler { boolean handleExternal(PsiElement element, PsiElement originalElement); boolean handleExternalLink(PsiManager psiManager, String link, PsiElement context); + boolean canFetchDocumentationLink(String link); + + @NotNull + String fetchExternalDocumentation(String link, Project project); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java index 627c900d4461..abe3fc8b8f5d 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java @@ -837,7 +837,7 @@ public class DocumentationManager { return originalElementPointer != null ? originalElementPointer.getElement() : null; } - void navigateByLink(final DocumentationComponent component, String url) { + void navigateByLink(final DocumentationComponent component, final String url) { component.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); final PsiElement psiElement = component.getElement(); final PsiManager manager = PsiManager.getInstance(getProject(psiElement)); @@ -863,9 +863,26 @@ public class DocumentationManager { boolean processed = false; if (provider instanceof CompositeDocumentationProvider) { for (DocumentationProvider documentationProvider : ((CompositeDocumentationProvider)provider).getProviders()) { - if (documentationProvider instanceof ExternalDocumentationHandler && ((ExternalDocumentationHandler)documentationProvider).handleExternalLink(manager, url, psiElement)) { - processed = true; - break; + if (documentationProvider instanceof ExternalDocumentationHandler) { + final ExternalDocumentationHandler externalDocumentationHandler = (ExternalDocumentationHandler)documentationProvider; + if (externalDocumentationHandler.canFetchDocumentationLink(url)) { + fetchDocInfo(new DocumentationCollector() { + @Override + public String getDocumentation() throws Exception { + return externalDocumentationHandler.fetchExternalDocumentation(url, myProject); + } + + @Override + public PsiElement getElement() { + return psiElement; + } + }, component); + processed = true; + } + else if (externalDocumentationHandler.handleExternalLink(manager, url, psiElement)) { + processed = true; + break; + } } } }