diff options
Diffstat (limited to 'xml/impl/src/com/intellij/ide')
5 files changed, 106 insertions, 40 deletions
diff --git a/xml/impl/src/com/intellij/ide/browsers/OpenFileInDefaultBrowserAction.java b/xml/impl/src/com/intellij/ide/browsers/OpenFileInDefaultBrowserAction.java index 7e822817a44e..92f5abf20591 100644 --- a/xml/impl/src/com/intellij/ide/browsers/OpenFileInDefaultBrowserAction.java +++ b/xml/impl/src/com/intellij/ide/browsers/OpenFileInDefaultBrowserAction.java @@ -15,7 +15,7 @@ */ package com.intellij.ide.browsers; -import com.intellij.ide.BrowserUtil; +import com.intellij.icons.AllIcons; import com.intellij.ide.GeneralSettings; import com.intellij.ide.browsers.impl.WebBrowserServiceImpl; import com.intellij.openapi.actionSystem.*; @@ -23,13 +23,23 @@ 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.ui.popup.JBPopupFactory; +import com.intellij.openapi.util.AsyncResult; import com.intellij.openapi.util.Pair; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.testFramework.LightVirtualFile; +import com.intellij.ui.ColoredListCellRenderer; +import com.intellij.ui.components.JBList; +import com.intellij.util.Consumer; +import com.intellij.util.containers.ContainerUtil; import com.intellij.xml.XmlBundle; import com.intellij.xml.util.HtmlUtil; +import org.jetbrains.annotations.NotNull; +import javax.swing.*; import java.awt.event.InputEvent; +import java.util.Set; public class OpenFileInDefaultBrowserAction extends DumbAwareAction { private static final Logger LOG = Logger.getInstance(OpenFileInDefaultBrowserAction.class); @@ -46,7 +56,7 @@ public class OpenFileInDefaultBrowserAction extends DumbAwareAction { return; } - Pair<WebBrowserUrlProvider, Url> browserUrlProvider = WebBrowserServiceImpl.getProvider(file); + Pair<WebBrowserUrlProvider, Set<Url>> browserUrlProvider = WebBrowserServiceImpl.getProvider(file); final boolean isHtmlFile = HtmlUtil.isHtmlFile(file); if (browserUrlProvider == null) { if (file.getVirtualFile() instanceof LightVirtualFile) { @@ -102,15 +112,20 @@ public class OpenFileInDefaultBrowserAction extends DumbAwareAction { PsiFile psiFile = CommonDataKeys.PSI_FILE.getData(dataContext); LOG.assertTrue(psiFile != null); InputEvent event = e.getInputEvent(); - doOpen(psiFile, event != null && event.isShiftDown()); + doOpen(psiFile, event != null && event.isShiftDown(), null); } - static void doOpen(PsiFile psiFile, boolean preferLocalUrl) { + public static void doOpen(PsiElement psiFile, boolean preferLocalUrl, final WebBrowser browser) { try { - Url url = WebBrowserService.getInstance().getUrlToOpen(psiFile, preferLocalUrl); - if (url != null) { - ApplicationManager.getApplication().saveAll(); - BrowserUtil.launchBrowser(url.toExternalForm()); + Set<Url> urls = WebBrowserService.getInstance().getUrlToOpen(psiFile, preferLocalUrl); + if (!urls.isEmpty()) { + chooseUrl(urls).doWhenDone(new Consumer<Url>() { + @Override + public void consume(Url url) { + ApplicationManager.getApplication().saveAll(); + UrlOpener.launchBrowser(url.toExternalForm(), browser); + } + }); } } catch (WebBrowserUrlProvider.BrowserException e1) { @@ -120,4 +135,40 @@ public class OpenFileInDefaultBrowserAction extends DumbAwareAction { LOG.error(e1); } } + + @NotNull + private static AsyncResult<Url> chooseUrl(Set<Url> urls) { + if (urls.size() == 1) { + return new AsyncResult.Done<Url>(ContainerUtil.getFirstItem(urls)); + } + + final JBList list = new JBList(urls); + list.setCellRenderer(new ColoredListCellRenderer() { + @Override + protected void customizeCellRenderer(JList list, Object value, int index, boolean selected, boolean hasFocus) { + // todo icons looks good, but is it really suitable for all URLs providers? + setIcon(AllIcons.Nodes.Servlet); + append(((Url)value).getPath()); + } + }); + + final AsyncResult<Url> result = new AsyncResult<Url>(); + JBPopupFactory.getInstance(). + createListPopupBuilder(list). + setTitle("Choose Url"). + setItemChoosenCallback(new Runnable() { + @Override + public void run() { + Url value = (Url)list.getSelectedValue(); + if (value != null) { + result.setDone(value); + } + else { + result.setRejected(); + } + } + }). + createPopup().showInFocusCenter(); + return result; + } } diff --git a/xml/impl/src/com/intellij/ide/browsers/SelectInDefaultBrowserTarget.java b/xml/impl/src/com/intellij/ide/browsers/SelectInDefaultBrowserTarget.java index 3114bb80d97b..55ceeeb5e977 100644 --- a/xml/impl/src/com/intellij/ide/browsers/SelectInDefaultBrowserTarget.java +++ b/xml/impl/src/com/intellij/ide/browsers/SelectInDefaultBrowserTarget.java @@ -27,6 +27,8 @@ import com.intellij.testFramework.LightVirtualFile; import com.intellij.xml.XmlBundle; import com.intellij.xml.util.HtmlUtil; +import java.util.Set; + class SelectInDefaultBrowserTarget extends SelectInTargetBase { private static final Logger LOG = Logger.getInstance(SelectInDefaultBrowserTarget.class); @@ -44,7 +46,7 @@ class SelectInDefaultBrowserTarget extends SelectInTargetBase { return false; } - Pair<WebBrowserUrlProvider, Url> browserUrlProvider = WebBrowserServiceImpl.getProvider(file); + Pair<WebBrowserUrlProvider, Set<Url>> browserUrlProvider = WebBrowserServiceImpl.getProvider(file); currentName = XmlBundle.message("browser.select.in.default.name"); if (browserUrlProvider == null) { return HtmlUtil.isHtmlFile(file) && !(file.getVirtualFile() instanceof LightVirtualFile); @@ -69,7 +71,7 @@ class SelectInDefaultBrowserTarget extends SelectInTargetBase { LOG.assertTrue(psiElement != null); PsiFile psiFile = psiElement.getContainingFile(); LOG.assertTrue(psiFile != null); - OpenFileInDefaultBrowserAction.doOpen(psiFile, false); + OpenFileInDefaultBrowserAction.doOpen(psiFile, false, null); } @Override diff --git a/xml/impl/src/com/intellij/ide/browsers/UrlImpl.java b/xml/impl/src/com/intellij/ide/browsers/UrlImpl.java index 936cda3bb505..3523ad9bd172 100644 --- a/xml/impl/src/com/intellij/ide/browsers/UrlImpl.java +++ b/xml/impl/src/com/intellij/ide/browsers/UrlImpl.java @@ -169,6 +169,9 @@ public final class UrlImpl implements Url { return true; } if (!(o instanceof UrlImpl)) { + if (o instanceof LocalFileUrl && isInLocalFileSystem()) { + return o.getPath().equals(path); + } return false; } diff --git a/xml/impl/src/com/intellij/ide/browsers/Urls.java b/xml/impl/src/com/intellij/ide/browsers/Urls.java index 763204d24a23..cd40599b7a01 100644 --- a/xml/impl/src/com/intellij/ide/browsers/Urls.java +++ b/xml/impl/src/com/intellij/ide/browsers/Urls.java @@ -120,12 +120,23 @@ public final class Urls { // must not be used in NodeJS public static Url newFromVirtualFile(@NotNull VirtualFile file) { - String path = file.getPath(); if (file.isInLocalFileSystem()) { - return new UrlImpl(file.getFileSystem().getProtocol(), null, path); + return new UrlImpl(file.getFileSystem().getProtocol(), null, file.getPath()); } else { return parseUrl(file.getUrl(), false); } } + + public static boolean equalsIgnoreParameters(@NotNull Url url, @NotNull VirtualFile file) { + if (file.isInLocalFileSystem()) { + return url.isInLocalFileSystem() && url.getPath().equals(file.getPath()); + } + else if (url.isInLocalFileSystem()) { + return false; + } + + Url fileUrl = parseUrl(file.getUrl(), false); + return fileUrl != null && fileUrl.equalsIgnoreParameters(url); + } }
\ No newline at end of file diff --git a/xml/impl/src/com/intellij/ide/browsers/impl/WebBrowserServiceImpl.java b/xml/impl/src/com/intellij/ide/browsers/impl/WebBrowserServiceImpl.java index 4541caf9f483..af7eb2e28278 100644 --- a/xml/impl/src/com/intellij/ide/browsers/impl/WebBrowserServiceImpl.java +++ b/xml/impl/src/com/intellij/ide/browsers/impl/WebBrowserServiceImpl.java @@ -27,10 +27,14 @@ import com.intellij.openapi.vfs.impl.http.HttpVirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.testFramework.LightVirtualFile; +import com.intellij.util.containers.ContainerUtil; import com.intellij.xml.util.HtmlUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collections; +import java.util.Set; + public class WebBrowserServiceImpl extends WebBrowserService { @Override public boolean canOpenInBrowser(@NotNull PsiElement psiElement) { @@ -40,32 +44,32 @@ public class WebBrowserServiceImpl extends WebBrowserService { ((HtmlUtil.isHtmlFile(psiFile) && !(virtualFile instanceof LightVirtualFile)) || getProvider(psiElement, psiFile) != null); } + @NotNull @Override - @Nullable - public Url getUrlToOpen(@NotNull PsiElement psiElement, boolean preferLocalUrl) throws WebBrowserUrlProvider.BrowserException { + public Set<Url> getUrlToOpen(@NotNull PsiElement psiElement, boolean preferLocalUrl) throws WebBrowserUrlProvider.BrowserException { final PsiFile psiFile = psiElement instanceof PsiFile ? (PsiFile)psiElement : psiElement.getContainingFile(); if (psiFile == null) { - return null; + return Collections.emptySet(); } VirtualFile virtualFile = psiFile.getVirtualFile(); if (virtualFile == null) { - return null; + return Collections.emptySet(); } if (virtualFile instanceof HttpVirtualFile) { - return Urls.newFromVirtualFile(virtualFile); + return Collections.singleton(Urls.newFromVirtualFile(virtualFile)); } if (!(preferLocalUrl && HtmlUtil.isHtmlFile(psiFile))) { - Pair<WebBrowserUrlProvider, Url> provider = getProvider(psiElement); + Pair<WebBrowserUrlProvider, Set<Url>> provider = getProvider(psiElement); if (provider != null) { if (provider.second != null) { return provider.second; } try { - Url url = provider.first.getUrl(psiElement, psiFile, virtualFile); - if (url != null) { - return url; + Set<Url> urls = provider.first.getUrls(psiElement, psiFile, virtualFile); + if (!urls.isEmpty()) { + return urls; } } catch (WebBrowserUrlProvider.BrowserException e) { @@ -75,28 +79,17 @@ public class WebBrowserServiceImpl extends WebBrowserService { } } } - return virtualFile instanceof LightVirtualFile ? null : Urls.newFromVirtualFile(virtualFile); + return virtualFile instanceof LightVirtualFile ? Collections.<Url>emptySet() : Collections.singleton(Urls.newFromVirtualFile(virtualFile)); } - @Override @Nullable - public Url getUrlToOpen(@NotNull PsiElement psiElement) { - try { - return getUrlToOpen(psiElement, false); - } - catch (WebBrowserUrlProvider.BrowserException ignored) { - return null; - } - } - - @Nullable - public static Pair<WebBrowserUrlProvider, Url> getProvider(@Nullable PsiElement element) { + public static Pair<WebBrowserUrlProvider, Set<Url>> getProvider(@Nullable PsiElement element) { PsiFile psiFile = element == null ? null : element.getContainingFile(); return psiFile == null ? null : getProvider(element, psiFile); } - private static Pair<WebBrowserUrlProvider, Url> getProvider(PsiElement element, PsiFile psiFile) { - Ref<Url> result = Ref.create(); + private static Pair<WebBrowserUrlProvider, Set<Url>> getProvider(PsiElement element, PsiFile psiFile) { + Ref<Set<Url>> result = Ref.create(); DumbService dumbService = DumbService.getInstance(element.getProject()); for (WebBrowserUrlProvider urlProvider : WebBrowserUrlProvider.EP_NAME.getExtensions()) { if ((!dumbService.isDumb() || DumbService.isDumbAware(urlProvider)) && urlProvider.canHandleElement(element, psiFile, result)) { @@ -113,8 +106,15 @@ public class WebBrowserServiceImpl extends WebBrowserService { return null; } - Url url = WebBrowserService.getInstance().getUrlToOpen(sourceElement); - if (url == null) { + Url url; + try { + Set<Url> urls = WebBrowserService.getInstance().getUrlToOpen(sourceElement, false); + url = ContainerUtil.getFirstItem(urls); + if (url == null) { + return null; + } + } + catch (WebBrowserUrlProvider.BrowserException ignored) { return null; } @@ -123,7 +123,6 @@ public class WebBrowserServiceImpl extends WebBrowserService { return null; } - boolean isRemote = !url.isInLocalFileSystem(); - return isRemote || HtmlUtil.isHtmlFile(virtualFile) ? url : null; + return !url.isInLocalFileSystem() || HtmlUtil.isHtmlFile(virtualFile) ? url : null; } } |