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 4b1a7d73a1e4..cf9b5ad22798 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java @@ -40,6 +40,7 @@ import com.intellij.openapi.options.FontSize; import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.registry.Registry; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.ex.WindowManagerEx; import com.intellij.pom.Navigatable; import com.intellij.psi.PsiElement; @@ -65,6 +66,7 @@ import javax.swing.event.HyperlinkListener; import javax.swing.text.*; import java.awt.*; import java.awt.event.*; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Stack; @@ -98,6 +100,7 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr private final JComponent mySettingsPanel; private final MyShowSettingsButton myShowSettingsButton; private boolean myIgnoreFontSizeSliderChange; + private String myEffectiveExternalUrl; private static class Context { final SmartPsiElementPointer element; @@ -461,7 +464,7 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr myForwardStack.clear(); } updateControlState(); - setData(element, text, clearHistory); + setData(element, text, clearHistory, null); if (clean) { myIsEmpty = false; } @@ -480,7 +483,8 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr myBackStack.clear(); } - public void setData(PsiElement _element, String text, final boolean clearHistory) { + public void setData(PsiElement _element, String text, final boolean clearHistory, String effectiveExternalUrl) { + myEffectiveExternalUrl = effectiveExternalUrl; if (myElement != null) { myBackStack.push(saveContext()); myForwardStack.clear(); @@ -683,10 +687,16 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr } if (!processed) { - final List urls = provider.getUrlFor(element, originalElement); - assert urls != null : provider; - assert !urls.isEmpty() : provider; - ExternalJavaDocAction.showExternalJavadoc(urls); + final Component component = PlatformDataKeys.CONTEXT_COMPONENT.getData(e.getDataContext()); + final List urls; + if (!StringUtil.isEmptyOrSpaces(myEffectiveExternalUrl)) { + urls = Collections.singletonList(myEffectiveExternalUrl); + } else { + urls = provider.getUrlFor(element, originalElement); + assert urls != null : provider; + assert !urls.isEmpty() : provider; + } + ExternalJavaDocAction.showExternalJavadoc(urls, component); } } } 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 c81b505dec37..df55cbad9346 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java @@ -615,99 +615,7 @@ public class DocumentationManager extends DockablePopupManager() { - @Override - public DocumentationProvider compute() { - return getProviderFromElement(element, originalElement); - } - } - ); - if (myParameterInfoController != null) { - final String doc = ApplicationManager.getApplication().runReadAction( - new NullableComputable() { - @Override - public String compute() { - return generateParameterInfoDocumentation(provider); - } - } - ); - if (doc != null) return doc; - } - if (provider instanceof ExternalDocumentationProvider) { - final List urls = ApplicationManager.getApplication().runReadAction( - new NullableComputable>() { - @Override - public List compute() { - final SmartPsiElementPointer originalElementPtr = element.getUserData(ORIGINAL_ELEMENT_KEY); - final PsiElement originalElement = originalElementPtr != null ? originalElementPtr.getElement() : null; - if (((ExternalDocumentationProvider)provider).hasDocumentationFor(element, originalElement)) { - return provider.getUrlFor(element, originalElement); - } - return null; - } - } - ); - if (urls != null) { - final String doc = ((ExternalDocumentationProvider)provider).fetchExternalDocumentation(myProject, element, urls); - if (doc != null) return doc; - } - } - return ApplicationManager.getApplication().runReadAction( - new Computable() { - @Override - @Nullable - public String compute() { - final SmartPsiElementPointer originalElement = element.getUserData(ORIGINAL_ELEMENT_KEY); - return provider.generateDoc(element, originalElement != null ? originalElement.getElement() : null); - } - } - ); - } - - @Nullable - private String generateParameterInfoDocumentation(DocumentationProvider provider) { - final Object[] objects = myParameterInfoController.getSelectedElements(); - - if (objects.length > 0) { - @NonNls StringBuffer sb = null; - - for (Object o : objects) { - PsiElement parameter = null; - if (o instanceof PsiElement) { - parameter = (PsiElement)o; - } - - if (parameter != null) { - final SmartPsiElementPointer originalElement = parameter.getUserData(ORIGINAL_ELEMENT_KEY); - final String str2 = provider.generateDoc(parameter, originalElement != null ? originalElement.getElement() : null); - if (str2 == null) continue; - if (sb == null) sb = new StringBuffer(); - sb.append(str2); - sb.append("
"); - } - else { - sb = null; - break; - } - } - - if (sb != null) return sb.toString(); - } - return null; - } - - @Override - @Nullable - public PsiElement getElement() { - return element.isValid() ? element : null; - } - }; + return new DefaultDocumentationCollector(element, originalElement); } @Nullable @@ -813,7 +721,7 @@ public class DocumentationManager extends DockablePopupManager() { + @Override + public DocumentationProvider compute() { + return getProviderFromElement(myElement, myOriginalElement); + } + } + ); + if (myParameterInfoController != null) { + final String doc = ApplicationManager.getApplication().runReadAction( + new NullableComputable() { + @Override + public String compute() { + return generateParameterInfoDocumentation(provider); + } + } + ); + if (doc != null) return doc; + } + if (provider instanceof ExternalDocumentationProvider) { + final List urls = ApplicationManager.getApplication().runReadAction( + new NullableComputable>() { + @Override + public List compute() { + final SmartPsiElementPointer originalElementPtr = myElement.getUserData(ORIGINAL_ELEMENT_KEY); + final PsiElement originalElement = originalElementPtr != null ? originalElementPtr.getElement() : null; + if (((ExternalDocumentationProvider)provider).hasDocumentationFor(myElement, originalElement)) { + return provider.getUrlFor(myElement, originalElement); + } + return null; + } + } + ); + if (urls != null) { + for (String url : urls) { + final String doc = ((ExternalDocumentationProvider)provider).fetchExternalDocumentation(myProject, myElement, Collections.singletonList(url)); + if (doc != null) { + myEffectiveUrl = url; + return doc; + } + } + } + } + return ApplicationManager.getApplication().runReadAction( + new Computable() { + @Override + @Nullable + public String compute() { + final SmartPsiElementPointer originalElement = myElement.getUserData(ORIGINAL_ELEMENT_KEY); + return provider.generateDoc(myElement, originalElement != null ? originalElement.getElement() : null); + } + } + ); + } + + @Nullable + private String generateParameterInfoDocumentation(DocumentationProvider provider) { + final Object[] objects = myParameterInfoController.getSelectedElements(); + + if (objects.length > 0) { + @NonNls StringBuffer sb = null; + + for (Object o : objects) { + PsiElement parameter = null; + if (o instanceof PsiElement) { + parameter = (PsiElement)o; + } + + if (parameter != null) { + final SmartPsiElementPointer originalElement = parameter.getUserData(ORIGINAL_ELEMENT_KEY); + final String str2 = provider.generateDoc(parameter, originalElement != null ? originalElement.getElement() : null); + if (str2 == null) continue; + if (sb == null) sb = new StringBuffer(); + sb.append(str2); + sb.append("
"); + } + else { + sb = null; + break; + } + } + + if (sb != null) return sb.toString(); + } + return null; + } + + @Override + @Nullable + public PsiElement getElement() { + return myElement.isValid() ? myElement : null; + } + + @Nullable + @Override + public String getEffectiveExternalUrl() { + return myEffectiveUrl; + } } } 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 156e3a1e5d08..71b02f867d8a 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/ExternalJavaDocAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/ExternalJavaDocAction.java @@ -37,6 +37,7 @@ import com.intellij.psi.PsiReference; import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.Nullable; +import java.awt.*; import java.util.HashSet; import java.util.List; @@ -79,7 +80,7 @@ public class ExternalJavaDocAction extends AnAction { final List urls = provider.getUrlFor(element, originalElement); if (urls != null && !urls.isEmpty()) { - showExternalJavadoc(urls); + showExternalJavadoc(urls, PlatformDataKeys.CONTEXT_COMPONENT.getData(dataContext)); } else if (provider instanceof ExternalDocumentationProvider) { final ExternalDocumentationProvider externalDocumentationProvider = (ExternalDocumentationProvider)provider; @@ -89,7 +90,7 @@ public class ExternalJavaDocAction extends AnAction { } } - public static void showExternalJavadoc(List urls) { + public static void showExternalJavadoc(List urls, Component component) { final HashSet set = new HashSet(urls); if (set.size() > 1) { JBPopupFactory.getInstance().createListPopup(new BaseListPopupStep("Choose external documentation root", ArrayUtil.toStringArray(set)) { @@ -98,7 +99,7 @@ public class ExternalJavaDocAction extends AnAction { BrowserUtil.browse(selectedValue); return FINAL_CHOICE; } - }).showInBestPositionFor(DataManager.getInstance().getDataContext()); + }).showInBestPositionFor(DataManager.getInstance().getDataContext(component)); } else if (set.size() == 1) { BrowserUtil.browse(urls.get(0));