mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
WebBrowserUrlProvider getUrl nullable
This commit is contained in:
@@ -23,6 +23,7 @@ import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.project.DumbAwareAction;
|
||||
import com.intellij.openapi.ui.Messages;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.xml.XmlBundle;
|
||||
import com.intellij.xml.util.HtmlUtil;
|
||||
@@ -32,6 +33,7 @@ import java.awt.event.InputEvent;
|
||||
public class OpenFileInBrowserAction extends DumbAwareAction {
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.ide.browsers.OpenFileInBrowserAction");
|
||||
|
||||
@Override
|
||||
public void update(AnActionEvent e) {
|
||||
final DataContext dataContext = e.getDataContext();
|
||||
final PsiFile file = LangDataKeys.PSI_FILE.getData(dataContext);
|
||||
@@ -40,7 +42,7 @@ public class OpenFileInBrowserAction extends DumbAwareAction {
|
||||
if (file != null && file.getVirtualFile() != null) {
|
||||
presentation.setVisible(true);
|
||||
|
||||
final WebBrowserUrlProvider browserUrlProvider = WebBrowserServiceImpl.getProvider(file);
|
||||
Pair<WebBrowserUrlProvider, Url> browserUrlProvider = WebBrowserServiceImpl.getProvider(file);
|
||||
final boolean isHtmlFile = HtmlUtil.isHtmlFile(file);
|
||||
presentation.setEnabled(browserUrlProvider != null || isHtmlFile);
|
||||
|
||||
@@ -48,11 +50,11 @@ public class OpenFileInBrowserAction extends DumbAwareAction {
|
||||
String description = getTemplatePresentation().getDescription();
|
||||
|
||||
if (browserUrlProvider != null) {
|
||||
final String customText = browserUrlProvider.getOpenInBrowserActionText(file);
|
||||
final String customText = browserUrlProvider.first.getOpenInBrowserActionText(file);
|
||||
if (customText != null) {
|
||||
text = customText;
|
||||
}
|
||||
final String customDescription = browserUrlProvider.getOpenInBrowserActionDescription(file);
|
||||
final String customDescription = browserUrlProvider.first.getOpenInBrowserActionDescription(file);
|
||||
if (customDescription != null) {
|
||||
description = customDescription;
|
||||
}
|
||||
@@ -82,6 +84,7 @@ public class OpenFileInBrowserAction extends DumbAwareAction {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(AnActionEvent e) {
|
||||
final DataContext dataContext = e.getDataContext();
|
||||
final PsiFile psiFile = LangDataKeys.PSI_FILE.getData(dataContext);
|
||||
|
||||
@@ -20,6 +20,8 @@ import com.intellij.ide.browsers.Urls;
|
||||
import com.intellij.ide.browsers.WebBrowserService;
|
||||
import com.intellij.ide.browsers.WebBrowserUrlProvider;
|
||||
import com.intellij.openapi.project.DumbService;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.openapi.util.Ref;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.vfs.impl.http.HttpVirtualFile;
|
||||
import com.intellij.psi.PsiElement;
|
||||
@@ -55,10 +57,14 @@ public class WebBrowserServiceImpl extends WebBrowserService {
|
||||
}
|
||||
|
||||
if (!(preferLocalUrl && HtmlUtil.isHtmlFile(psiFile))) {
|
||||
WebBrowserUrlProvider provider = getProvider(psiElement);
|
||||
Pair<WebBrowserUrlProvider, Url> provider = getProvider(psiElement);
|
||||
if (provider != null) {
|
||||
if (provider.second != null) {
|
||||
return provider.second;
|
||||
}
|
||||
|
||||
try {
|
||||
return provider.getUrl(psiElement, psiFile, virtualFile);
|
||||
return provider.first.getUrl(psiElement, psiFile, virtualFile);
|
||||
}
|
||||
catch (WebBrowserUrlProvider.BrowserException e) {
|
||||
if (!HtmlUtil.isHtmlFile(psiFile)) {
|
||||
@@ -82,16 +88,17 @@ public class WebBrowserServiceImpl extends WebBrowserService {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static WebBrowserUrlProvider getProvider(@Nullable PsiElement element) {
|
||||
public static Pair<WebBrowserUrlProvider, Url> getProvider(@Nullable PsiElement element) {
|
||||
PsiFile psiFile = element == null ? null : element.getContainingFile();
|
||||
if (psiFile == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Ref<Url> result = Ref.create();
|
||||
List<WebBrowserUrlProvider> allProviders = Arrays.asList(WebBrowserUrlProvider.EP_NAME.getExtensions());
|
||||
for (WebBrowserUrlProvider urlProvider : DumbService.getInstance(element.getProject()).filterByDumbAwareness(allProviders)) {
|
||||
if (urlProvider.canHandleElement(element, psiFile)) {
|
||||
return urlProvider;
|
||||
if (urlProvider.canHandleElement(element, psiFile, result)) {
|
||||
return Pair.create(urlProvider, result.get());
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
package com.intellij.ide.browsers;
|
||||
|
||||
import com.intellij.openapi.extensions.ExtensionPointName;
|
||||
import com.intellij.openapi.util.Ref;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiFile;
|
||||
@@ -33,12 +34,30 @@ public abstract class WebBrowserUrlProvider {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Invariant: element has not null containing psi file with not null virtual file
|
||||
*/
|
||||
public abstract boolean canHandleElement(@NotNull PsiElement element, @NotNull PsiFile psiFile);
|
||||
|
||||
@NotNull
|
||||
public boolean canHandleElement(@NotNull PsiElement element, @NotNull PsiFile psiFile, Ref<Url> result) {
|
||||
VirtualFile file = psiFile.getVirtualFile();
|
||||
if (file == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Url url;
|
||||
try {
|
||||
url = getUrl(element, psiFile, file);
|
||||
}
|
||||
catch (BrowserException ignored) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (url == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
result.set(url);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public abstract Url getUrl(@NotNull PsiElement element, @NotNull PsiFile psiFile, @NotNull VirtualFile virtualFile) throws BrowserException;
|
||||
|
||||
@Nullable
|
||||
|
||||
Reference in New Issue
Block a user