summaryrefslogtreecommitdiff
path: root/xml/impl/src/com/intellij/ide
diff options
context:
space:
mode:
Diffstat (limited to 'xml/impl/src/com/intellij/ide')
-rw-r--r--xml/impl/src/com/intellij/ide/browsers/OpenFileInDefaultBrowserAction.java67
-rw-r--r--xml/impl/src/com/intellij/ide/browsers/SelectInDefaultBrowserTarget.java6
-rw-r--r--xml/impl/src/com/intellij/ide/browsers/UrlImpl.java3
-rw-r--r--xml/impl/src/com/intellij/ide/browsers/Urls.java15
-rw-r--r--xml/impl/src/com/intellij/ide/browsers/impl/WebBrowserServiceImpl.java55
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;
}
}