From aa7f24dbd4414be8276d06b8702a7a48b07f5158 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 4 Apr 2011 17:09:41 +0200 Subject: [PATCH] prompt to configure external documentation location if none is configured --- .../lang/java/JavaDocumentationProvider.java | 9 ++++++++ .../CompositeDocumentationProvider.java | 22 +++++++++++++++++++ .../ExternalDocumentationProvider.java | 15 +++++++++++++ .../ide/actions/ExternalJavaDocAction.java | 15 +++++++++---- .../android/AndroidDocumentationProvider.java | 10 ++++++++- .../GroovyDocumentationProvider.java | 9 ++++++++ 6 files changed, 75 insertions(+), 5 deletions(-) diff --git a/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java b/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java index 96e429e058e2..1ba430a037e5 100644 --- a/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java +++ b/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java @@ -681,6 +681,15 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext return CompositeDocumentationProvider.hasUrlsFor(this, element, originalElement); } + @Override + public boolean canPromptToConfigureDocumentation(PsiElement element) { + return false; + } + + @Override + public void promptToConfigureDocumentation(PsiElement element) { + } + public static String fetchExternalJavadoc(PsiElement element, final Project project, final List docURLs) { final JavaDocExternalFilter docFilter = new JavaDocExternalFilter(project); 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 1babe6ea6a1a..41bf89be9ebf 100644 --- a/platform/lang-api/src/com/intellij/lang/documentation/CompositeDocumentationProvider.java +++ b/platform/lang-api/src/com/intellij/lang/documentation/CompositeDocumentationProvider.java @@ -148,6 +148,28 @@ public class CompositeDocumentationProvider implements DocumentationProvider, Ex return false; } + @Override + public boolean canPromptToConfigureDocumentation(PsiElement element) { + for (DocumentationProvider provider : myProviders) { + if (provider instanceof ExternalDocumentationProvider && + ((ExternalDocumentationProvider)provider).canPromptToConfigureDocumentation(element)) { + return true; + } + } + return false; + } + + @Override + public void promptToConfigureDocumentation(PsiElement element) { + for (DocumentationProvider provider : myProviders) { + if (provider instanceof ExternalDocumentationProvider && + ((ExternalDocumentationProvider)provider).canPromptToConfigureDocumentation(element)) { + ((ExternalDocumentationProvider)provider).promptToConfigureDocumentation(element); + break; + } + } + } + public static boolean hasUrlsFor(DocumentationProvider provider, PsiElement element, PsiElement originalElement) { final List urls = provider.getUrlFor(element, originalElement); if (urls != null && !urls.isEmpty()) return true; diff --git a/platform/lang-api/src/com/intellij/lang/documentation/ExternalDocumentationProvider.java b/platform/lang-api/src/com/intellij/lang/documentation/ExternalDocumentationProvider.java index 88c2b3de5493..3172726f282e 100644 --- a/platform/lang-api/src/com/intellij/lang/documentation/ExternalDocumentationProvider.java +++ b/platform/lang-api/src/com/intellij/lang/documentation/ExternalDocumentationProvider.java @@ -39,4 +39,19 @@ public interface ExternalDocumentationProvider { * @return true if the external documentation action should be enabled, false otherwise. */ boolean hasDocumentationFor(PsiElement element, PsiElement originalElement); + + /** + * Checks if the provider is capable of asking the user to configure external documentation for an element. + * + * @param element the element for which no documentation was found + * @return true if the element is applicable to this provider and the provider has a UI to configure the documentation location, false otherwise + */ + boolean canPromptToConfigureDocumentation(PsiElement element); + + /** + * Prompts the user to configure the external documentation for an element if none was found. + * + * @param element the element for which no documentation was found + */ + void promptToConfigureDocumentation(PsiElement element); } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/ExternalJavaDocAction.java b/platform/lang-impl/src/com/intellij/ide/actions/ExternalJavaDocAction.java index f6864cb8a9d9..21522b9bb701 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/ExternalJavaDocAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/ExternalJavaDocAction.java @@ -68,9 +68,15 @@ public class ExternalJavaDocAction extends AnAction { DocumentationManager.storeOriginalElement(project, originalElement, element); final DocumentationProvider provider = DocumentationManager.getProviderFromElement(element); final List urls = provider.getUrlFor(element, originalElement); - assert urls != null; - assert !urls.isEmpty(); - showExternalJavadoc(urls); + if (urls != null && !urls.isEmpty()) { + showExternalJavadoc(urls); + } + else if (provider instanceof ExternalDocumentationProvider) { + final ExternalDocumentationProvider externalDocumentationProvider = (ExternalDocumentationProvider)provider; + if (externalDocumentationProvider.canPromptToConfigureDocumentation(element)) { + externalDocumentationProvider.promptToConfigureDocumentation(element); + } + } } public static void showExternalJavadoc(List urls) { @@ -103,7 +109,8 @@ public class ExternalJavaDocAction extends AnAction { final DocumentationProvider provider = DocumentationManager.getProviderFromElement(element); boolean enabled; if (provider instanceof ExternalDocumentationProvider) { - enabled = ((ExternalDocumentationProvider) provider).hasDocumentationFor(element, originalElement); + final ExternalDocumentationProvider edProvider = (ExternalDocumentationProvider)provider; + enabled = edProvider.hasDocumentationFor(element, originalElement) || edProvider.canPromptToConfigureDocumentation(element); } else { final List urls = provider.getUrlFor(element, originalElement); diff --git a/plugins/android/src/org/jetbrains/android/AndroidDocumentationProvider.java b/plugins/android/src/org/jetbrains/android/AndroidDocumentationProvider.java index c1957c5a622f..75744a8fff07 100644 --- a/plugins/android/src/org/jetbrains/android/AndroidDocumentationProvider.java +++ b/plugins/android/src/org/jetbrains/android/AndroidDocumentationProvider.java @@ -18,7 +18,6 @@ package org.jetbrains.android; import com.android.sdklib.SdkConstants; import com.intellij.codeInsight.javadoc.JavaDocExternalFilter; import com.intellij.facet.ProjectFacetManager; -import com.intellij.lang.documentation.CompositeDocumentationProvider; import com.intellij.lang.documentation.DocumentationProvider; import com.intellij.lang.documentation.ExternalDocumentationProvider; import com.intellij.lang.java.JavaDocumentationProvider; @@ -85,6 +84,15 @@ public class AndroidDocumentationProvider implements DocumentationProvider, Exte return false; } + @Override + public boolean canPromptToConfigureDocumentation(PsiElement element) { + return false; + } + + @Override + public void promptToConfigureDocumentation(PsiElement element) { + } + private static boolean isMyContext(@NotNull final PsiElement element, @NotNull final Project project) { if (element instanceof PsiClass) { return ApplicationManager.getApplication().runReadAction(new Computable() { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java index 2f0b8c188fa4..d03672d08a15 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java @@ -298,6 +298,15 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E return CompositeDocumentationProvider.hasUrlsFor(this, element, originalElement); } + @Override + public boolean canPromptToConfigureDocumentation(PsiElement element) { + return false; + } + + @Override + public void promptToConfigureDocumentation(PsiElement element) { + } + private static String getMethodCandidateInfo(GrReferenceExpression expr) { final GroovyResolveResult[] candidates = expr.multiResolve(false); final String text = expr.getText();