mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
external documentation: multiple roots
This commit is contained in:
@@ -4,6 +4,8 @@ import com.intellij.lang.documentation.DocumentationProvider;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiManager;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Dmitry Avdeev
|
||||
*/
|
||||
@@ -13,7 +15,7 @@ public class DomDocumentationProvider implements DocumentationProvider {
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getUrlFor(final PsiElement element, final PsiElement originalElement) {
|
||||
public List<String> getUrlFor(final PsiElement element, final PsiElement originalElement) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -52,20 +52,20 @@ public class CompositeDocumentationProvider implements DocumentationProvider{
|
||||
String result = provider.getQuickNavigateInfo(element);
|
||||
if ( result != null ) return result;
|
||||
}
|
||||
for (DocumentationProvider provider : Extensions.getExtensions(DocumentationProvider.EP_NAME)) {
|
||||
for (DocumentationProvider provider : Extensions.getExtensions(EP_NAME)) {
|
||||
final String result = provider.getQuickNavigateInfo(element);
|
||||
if (result != null) return result;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getUrlFor(PsiElement element, PsiElement originalElement) {
|
||||
public List<String> getUrlFor(PsiElement element, PsiElement originalElement) {
|
||||
for ( DocumentationProvider provider : myProviders ) {
|
||||
String result = provider.getUrlFor(element,originalElement);
|
||||
List<String> result = provider.getUrlFor(element,originalElement);
|
||||
if ( result != null ) return result;
|
||||
}
|
||||
for (DocumentationProvider provider : Extensions.getExtensions(DocumentationProvider.EP_NAME)) {
|
||||
final String result = provider.getUrlFor(element, originalElement);
|
||||
for (DocumentationProvider provider : Extensions.getExtensions(EP_NAME)) {
|
||||
final List<String> result = provider.getUrlFor(element, originalElement);
|
||||
if (result != null) return result;
|
||||
}
|
||||
return null;
|
||||
@@ -76,7 +76,7 @@ public class CompositeDocumentationProvider implements DocumentationProvider{
|
||||
String result = provider.generateDoc(element,originalElement);
|
||||
if ( result != null ) return result;
|
||||
}
|
||||
for (DocumentationProvider provider : Extensions.getExtensions(DocumentationProvider.EP_NAME)) {
|
||||
for (DocumentationProvider provider : Extensions.getExtensions(EP_NAME)) {
|
||||
final String result = provider.generateDoc(element, originalElement);
|
||||
if (result != null) return result;
|
||||
}
|
||||
@@ -88,7 +88,7 @@ public class CompositeDocumentationProvider implements DocumentationProvider{
|
||||
PsiElement result = provider.getDocumentationElementForLookupItem(psiManager,object,element);
|
||||
if ( result != null ) return result;
|
||||
}
|
||||
for (DocumentationProvider provider : Extensions.getExtensions(DocumentationProvider.EP_NAME)) {
|
||||
for (DocumentationProvider provider : Extensions.getExtensions(EP_NAME)) {
|
||||
final PsiElement result = provider.getDocumentationElementForLookupItem(psiManager, object, element);
|
||||
if (result != null) return result;
|
||||
}
|
||||
@@ -100,7 +100,7 @@ public class CompositeDocumentationProvider implements DocumentationProvider{
|
||||
PsiElement result = provider.getDocumentationElementForLink(psiManager,link,context);
|
||||
if ( result != null ) return result;
|
||||
}
|
||||
for (DocumentationProvider provider : Extensions.getExtensions(DocumentationProvider.EP_NAME)) {
|
||||
for (DocumentationProvider provider : Extensions.getExtensions(EP_NAME)) {
|
||||
final PsiElement result = provider.getDocumentationElementForLink(psiManager, link, context);
|
||||
if (result != null) return result;
|
||||
}
|
||||
|
||||
@@ -21,6 +21,8 @@ import com.intellij.psi.PsiManager;
|
||||
import com.intellij.openapi.extensions.ExtensionPointName;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @see com.intellij.lang.LanguageDocumentation
|
||||
*/
|
||||
@@ -32,7 +34,7 @@ public interface DocumentationProvider {
|
||||
String getQuickNavigateInfo(PsiElement element);
|
||||
|
||||
@Nullable
|
||||
String getUrlFor(PsiElement element, PsiElement originalElement);
|
||||
List<String> getUrlFor(PsiElement element, PsiElement originalElement);
|
||||
|
||||
@Nullable
|
||||
String generateDoc(PsiElement element, PsiElement originalElement);
|
||||
|
||||
@@ -20,10 +20,12 @@ import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiManager;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public abstract class QuickDocumentationProvider implements DocumentationProvider {
|
||||
@Nullable
|
||||
|
||||
public String getUrlFor(PsiElement element, PsiElement originalElement) {
|
||||
public List<String> getUrlFor(PsiElement element, PsiElement originalElement) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ import com.intellij.codeInsight.CodeInsightBundle;
|
||||
import com.intellij.codeInsight.hint.ElementLocationUtil;
|
||||
import com.intellij.codeInsight.hint.HintManagerImpl;
|
||||
import com.intellij.codeInsight.hint.HintUtil;
|
||||
import com.intellij.ide.BrowserUtil;
|
||||
import com.intellij.ide.actions.ExternalJavaDocAction;
|
||||
import com.intellij.lang.documentation.DocumentationProvider;
|
||||
import com.intellij.openapi.Disposable;
|
||||
import com.intellij.openapi.actionSystem.*;
|
||||
@@ -26,6 +26,7 @@ import javax.swing.event.HyperlinkListener;
|
||||
import javax.swing.text.View;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.util.List;
|
||||
import java.util.Stack;
|
||||
|
||||
public class DocumentationComponent extends JPanel implements Disposable{
|
||||
@@ -360,9 +361,10 @@ public class DocumentationComponent extends JPanel implements Disposable{
|
||||
if (myElement != null) {
|
||||
final PsiElement element = myElement.getElement();
|
||||
final DocumentationProvider provider = DocumentationManager.getProviderFromElement(element);
|
||||
final String url = provider.getUrlFor(element, DocumentationManager.getOriginalElement(element));
|
||||
assert url != null;
|
||||
BrowserUtil.launchBrowser(url);
|
||||
final List<String> urls = provider.getUrlFor(element, DocumentationManager.getOriginalElement(element));
|
||||
assert urls != null;
|
||||
assert !urls.isEmpty();
|
||||
ExternalJavaDocAction.showExternalJavadoc(urls);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -372,8 +374,8 @@ public class DocumentationComponent extends JPanel implements Disposable{
|
||||
if (myElement != null) {
|
||||
final PsiElement element = myElement.getElement();
|
||||
final DocumentationProvider provider = DocumentationManager.getProviderFromElement(element);
|
||||
final String url = provider.getUrlFor(element, DocumentationManager.getOriginalElement(element));
|
||||
presentation.setEnabled(element != null && url!= null);
|
||||
final List<String> urls = provider.getUrlFor(element, DocumentationManager.getOriginalElement(element));
|
||||
presentation.setEnabled(element != null && urls!= null && !urls.isEmpty());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,8 +43,8 @@ import org.jetbrains.annotations.Nullable;
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
|
||||
public class DocumentationManager {
|
||||
@NonNls public static final String JAVADOC_LOCATION_AND_SIZE = "javadoc.popup";
|
||||
@@ -558,8 +558,8 @@ public class DocumentationManager {
|
||||
public String getDocumentation() throws Exception {
|
||||
if (docUrl.startsWith(DOC_ELEMENT_PROTOCOL)) {
|
||||
final DocumentationProvider provider = getProviderFromElement(psiElement);
|
||||
final String url = provider.getUrlFor(psiElement, getOriginalElement(psiElement));
|
||||
BrowserUtil.launchBrowser(url != null? url : docUrl);
|
||||
final List<String> urls = provider.getUrlFor(psiElement, getOriginalElement(psiElement));
|
||||
BrowserUtil.launchBrowser(urls != null && !urls.isEmpty() ? urls.get(0) : docUrl);
|
||||
} else {
|
||||
BrowserUtil.launchBrowser(docUrl);
|
||||
}
|
||||
|
||||
@@ -3,15 +3,23 @@ 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.lang.documentation.DocumentationProvider;
|
||||
import com.intellij.openapi.actionSystem.*;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.Messages;
|
||||
import com.intellij.openapi.ui.popup.JBPopupFactory;
|
||||
import com.intellij.openapi.ui.popup.PopupStep;
|
||||
import com.intellij.openapi.ui.popup.util.BaseListPopupStep;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.HashSet;
|
||||
|
||||
public class ExternalJavaDocAction extends AnAction {
|
||||
|
||||
public ExternalJavaDocAction() {
|
||||
@@ -42,9 +50,25 @@ public class ExternalJavaDocAction extends AnAction {
|
||||
PsiElement originalElement = getOriginalElement(context, editor);
|
||||
DocumentationManager.storeOriginalElement(project, originalElement, element);
|
||||
final DocumentationProvider provider = DocumentationManager.getProviderFromElement(element);
|
||||
final String url = provider.getUrlFor(element, originalElement);
|
||||
assert url != null;
|
||||
BrowserUtil.launchBrowser(url);
|
||||
final List<String> urls = provider.getUrlFor(element, originalElement);
|
||||
assert urls != null;
|
||||
assert !urls.isEmpty();
|
||||
showExternalJavadoc(urls);
|
||||
}
|
||||
|
||||
public static void showExternalJavadoc(List<String> urls) {
|
||||
final HashSet<String> set = new HashSet<String>(urls);
|
||||
if (set.size() > 1) {
|
||||
JBPopupFactory.getInstance().createListPopup(new BaseListPopupStep<String>("Choose javadoc root", ArrayUtil.toStringArray(set)) {
|
||||
public PopupStep onChosen(final String selectedValue, final boolean finalChoice) {
|
||||
BrowserUtil.launchBrowser(selectedValue);
|
||||
return FINAL_CHOICE;
|
||||
}
|
||||
}).showInBestPositionFor(DataManager.getInstance().getDataContext());
|
||||
}
|
||||
else if (set.size() == 1) {
|
||||
BrowserUtil.launchBrowser(urls.get(0));
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@@ -60,7 +84,8 @@ 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);
|
||||
boolean enabled = provider.getUrlFor(element, originalElement) != null;
|
||||
final List<String> urls = provider.getUrlFor(element, originalElement);
|
||||
boolean enabled = urls != null && !urls.isEmpty();
|
||||
if (editor != null) {
|
||||
presentation.setEnabled(enabled);
|
||||
if (event.getPlace().equals(ActionPlaces.MAIN_MENU)) {
|
||||
|
||||
@@ -20,6 +20,7 @@ import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
@@ -205,12 +206,12 @@ public class AntDocumentationProvider implements DocumentationProvider {
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getUrlFor(PsiElement element, PsiElement originalElement) {
|
||||
public List<String> getUrlFor(PsiElement element, PsiElement originalElement) {
|
||||
final VirtualFile helpFile = getHelpFile(originalElement);
|
||||
if (helpFile == null || !(helpFile.getFileSystem() instanceof LocalFileSystem)) {
|
||||
return null;
|
||||
}
|
||||
return helpFile.getUrl();
|
||||
return Collections.singletonList(helpFile.getUrl());
|
||||
}
|
||||
|
||||
public PsiElement getDocumentationElementForLookupItem(PsiManager psiManager, Object object, PsiElement element) {
|
||||
|
||||
@@ -87,8 +87,8 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider {
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getUrlFor(final PsiElement element, final PsiElement originalElement) {
|
||||
return null;
|
||||
public List<String> getUrlFor(final PsiElement element, final PsiElement originalElement) {
|
||||
return getExternalJavaDocUrl(element);
|
||||
}
|
||||
|
||||
private static void newLine(StringBuffer buffer) {
|
||||
@@ -708,13 +708,11 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider {
|
||||
}
|
||||
else {
|
||||
DocumentationProvider provider = DocumentationManager.getProviderFromElement(element);
|
||||
if (provider != null) {
|
||||
final SmartPsiElementPointer originalElementPointer = element.getUserData(DocumentationManager.ORIGINAL_ELEMENT_KEY);
|
||||
final String url = provider.getUrlFor(element, originalElementPointer != null ? originalElementPointer.getElement() : null);
|
||||
if (url != null) {
|
||||
urls = new ArrayList<String>();
|
||||
urls.add(url);
|
||||
}
|
||||
final SmartPsiElementPointer originalElementPointer = element.getUserData(DocumentationManager.ORIGINAL_ELEMENT_KEY);
|
||||
final List<String> urlz = provider.getUrlFor(element, originalElementPointer != null ? originalElementPointer.getElement() : null);
|
||||
if (urlz != null) {
|
||||
urls = new ArrayList<String>();
|
||||
urls.addAll(urlz);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,9 @@ import com.intellij.xml.util.XmlUtil;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: maxim
|
||||
@@ -43,14 +46,14 @@ public class HtmlDocumentationProvider implements DocumentationProvider {
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getUrlFor(PsiElement element, PsiElement originalElement) {
|
||||
public List<String> getUrlFor(PsiElement element, PsiElement originalElement) {
|
||||
String result = getUrlForHtml(element, PsiTreeUtil.getParentOfType(originalElement,XmlTag.class,false));
|
||||
|
||||
if (result == null && ourStyleProvider !=null) {
|
||||
result = ourStyleProvider.getUrlFor(element, originalElement);
|
||||
return ourStyleProvider.getUrlFor(element, originalElement);
|
||||
}
|
||||
|
||||
return result;
|
||||
return result != null ? Collections.singletonList(result) : null;
|
||||
}
|
||||
|
||||
public String getUrlForHtml(PsiElement element, XmlTag context) {
|
||||
|
||||
@@ -30,6 +30,9 @@ import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: maxim
|
||||
@@ -61,7 +64,7 @@ public class XmlDocumentationProvider implements DocumentationProvider {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public String getUrlFor(PsiElement element, PsiElement originalElement) {
|
||||
public List<String> getUrlFor(PsiElement element, PsiElement originalElement) {
|
||||
if (element instanceof XmlTag) {
|
||||
XmlTag tag = (XmlTag)element;
|
||||
|
||||
@@ -76,7 +79,7 @@ public class XmlDocumentationProvider implements DocumentationProvider {
|
||||
}
|
||||
}
|
||||
|
||||
return processor.url;
|
||||
return processor.url != null ? Collections.singletonList(processor.url) : null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user