API for quickly checking if external doc is available for an element

This commit is contained in:
Dmitry Jemerov
2011-03-30 20:49:07 +02:00
parent d231d788c8
commit 19b6fcbeba
6 changed files with 58 additions and 4 deletions
@@ -26,6 +26,7 @@ import com.intellij.lang.CodeDocumentationAwareCommenter;
import com.intellij.lang.LangBundle;
import com.intellij.lang.LanguageCommenters;
import com.intellij.lang.documentation.CodeDocumentationProvider;
import com.intellij.lang.documentation.CompositeDocumentationProvider;
import com.intellij.lang.documentation.ExternalDocumentationProvider;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
@@ -675,6 +676,11 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
return fetchExternalJavadoc(element, project, docUrls);
}
@Override
public boolean hasDocumentationFor(PsiElement element, PsiElement originalElement) {
return CompositeDocumentationProvider.hasUrlsFor(this, element, originalElement);
}
public static String fetchExternalJavadoc(PsiElement element, final Project project, final List<String> docURLs) {
final JavaDocExternalFilter docFilter = new JavaDocExternalFilter(project);
@@ -134,4 +134,23 @@ public class CompositeDocumentationProvider implements DocumentationProvider, Ex
}
return null;
}
@Override
public boolean hasDocumentationFor(PsiElement element, PsiElement originalElement) {
for (DocumentationProvider provider : myProviders) {
if (provider instanceof ExternalDocumentationProvider) {
if (((ExternalDocumentationProvider) provider).hasDocumentationFor(element, originalElement)) return true;
}
else {
if (hasUrlsFor(provider, element, originalElement)) return true;
}
}
return false;
}
public static boolean hasUrlsFor(DocumentationProvider provider, PsiElement element, PsiElement originalElement) {
final List<String> urls = provider.getUrlFor(element, originalElement);
if (urls != null && !urls.isEmpty()) return true;
return false;
}
}
@@ -29,4 +29,14 @@ import java.util.List;
public interface ExternalDocumentationProvider {
@Nullable
String fetchExternalDocumentation(final Project project, PsiElement element, final List<String> docUrls);
/**
* Quick check for existence of external documentation for specified element. Called from action update, so must be fast.
* If not implemented, update check is performed by calling {@link DocumentationProvider#getUrlFor(com.intellij.psi.PsiElement, com.intellij.psi.PsiElement)}.
*
* @param element the element to check for existence of documentation
* @param originalElement the element at caret (on which the action was invoked)
* @return true if the external documentation action should be enabled, false otherwise.
*/
boolean hasDocumentationFor(PsiElement element, PsiElement originalElement);
}
@@ -18,9 +18,10 @@ package com.intellij.ide.actions;
import com.intellij.codeInsight.documentation.DocumentationManager;
import com.intellij.ide.BrowserUtil;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.DataManager;
import com.intellij.ide.IdeBundle;
import com.intellij.lang.documentation.DocumentationProvider;
import com.intellij.lang.documentation.ExternalDocumentationProvider;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
@@ -33,8 +34,8 @@ import com.intellij.psi.PsiFile;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.HashSet;
import java.util.List;
public class ExternalJavaDocAction extends AnAction {
@@ -100,8 +101,14 @@ public class ExternalJavaDocAction extends AnAction {
final PsiElement originalElement = getOriginalElement(LangDataKeys.PSI_FILE.getData(dataContext), editor);
DocumentationManager.storeOriginalElement(PlatformDataKeys.PROJECT.getData(dataContext), originalElement, element);
final DocumentationProvider provider = DocumentationManager.getProviderFromElement(element);
final List<String> urls = provider.getUrlFor(element, originalElement);
boolean enabled = urls != null && !urls.isEmpty();
boolean enabled;
if (provider instanceof ExternalDocumentationProvider) {
enabled = ((ExternalDocumentationProvider) provider).hasDocumentationFor(element, originalElement);
}
else {
final List<String> urls = provider.getUrlFor(element, originalElement);
enabled = urls != null && !urls.isEmpty();
}
if (editor != null) {
presentation.setEnabled(enabled);
if (event.getPlace().equals(ActionPlaces.MAIN_MENU)) {
@@ -18,6 +18,7 @@ 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;
@@ -79,6 +80,11 @@ public class AndroidDocumentationProvider implements DocumentationProvider, Exte
null;
}
@Override
public boolean hasDocumentationFor(PsiElement element, PsiElement originalElement) {
return false;
}
private static boolean isMyContext(@NotNull final PsiElement element, @NotNull final Project project) {
if (element instanceof PsiClass) {
return ApplicationManager.getApplication().runReadAction(new Computable<Boolean>() {
@@ -21,6 +21,7 @@ import com.intellij.codeInsight.javadoc.JavaDocUtil;
import com.intellij.lang.CodeDocumentationAwareCommenter;
import com.intellij.lang.LanguageCommenters;
import com.intellij.lang.documentation.CodeDocumentationProvider;
import com.intellij.lang.documentation.CompositeDocumentationProvider;
import com.intellij.lang.documentation.ExternalDocumentationProvider;
import com.intellij.lang.java.JavaDocumentationProvider;
import com.intellij.openapi.project.Project;
@@ -292,6 +293,11 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
return JavaDocumentationProvider.fetchExternalJavadoc(element, project, docUrls);
}
@Override
public boolean hasDocumentationFor(PsiElement element, PsiElement originalElement) {
return CompositeDocumentationProvider.hasUrlsFor(this, element, originalElement);
}
private static String getMethodCandidateInfo(GrReferenceExpression expr) {
final GroovyResolveResult[] candidates = expr.multiResolve(false);
final String text = expr.getText();