WebBrowserUrlProvider getUrl nullable

This commit is contained in:
Vladimir Krivosheev
2013-05-30 09:46:04 +02:00
parent 1f5817582a
commit 80e8a556c4
3 changed files with 42 additions and 13 deletions
@@ -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