summaryrefslogtreecommitdiff
path: root/xml/impl/src/com/intellij
diff options
context:
space:
mode:
Diffstat (limited to 'xml/impl/src/com/intellij')
-rw-r--r--xml/impl/src/com/intellij/application/options/CodeStyleHtmlPanel.form21
-rw-r--r--xml/impl/src/com/intellij/application/options/CodeStyleHtmlPanel.java10
-rw-r--r--xml/impl/src/com/intellij/application/options/CodeStyleXmlPanel.form17
-rw-r--r--xml/impl/src/com/intellij/application/options/CodeStyleXmlPanel.java10
-rw-r--r--xml/impl/src/com/intellij/application/options/HtmlLanguageCodeStyleSettings.java11
-rw-r--r--xml/impl/src/com/intellij/application/options/XmlLanguageCodeStyleSettingsProvider.java9
-rw-r--r--xml/impl/src/com/intellij/codeInsight/completion/HtmlTextCompletionConfidence.java4
-rw-r--r--xml/impl/src/com/intellij/codeInsight/template/emmet/filters/TrimZenCodingFilter.java25
-rw-r--r--xml/impl/src/com/intellij/ide/browsers/BrowserLauncherImpl.java17
-rw-r--r--xml/impl/src/com/intellij/ide/browsers/BrowserSelector.java4
-rw-r--r--xml/impl/src/com/intellij/ide/browsers/BrowserSettingsPanel.form2
-rw-r--r--xml/impl/src/com/intellij/ide/browsers/BrowserSettingsPanel.java216
-rw-r--r--xml/impl/src/com/intellij/ide/browsers/ConfigurableWebBrowser.java11
-rw-r--r--xml/impl/src/com/intellij/ide/browsers/DefaultBrowserPolicy.java20
-rw-r--r--xml/impl/src/com/intellij/ide/browsers/WebBrowserManager.java105
-rw-r--r--xml/impl/src/com/intellij/ide/browsers/actions/BaseOpenInBrowserAction.java2
-rw-r--r--xml/impl/src/com/intellij/ide/browsers/actions/OpenFileInDefaultBrowserAction.java12
-rw-r--r--xml/impl/src/com/intellij/ide/browsers/impl/WebBrowserServiceImpl.java11
-rw-r--r--xml/impl/src/com/intellij/psi/formatter/xml/AbstractXmlBlock.java28
19 files changed, 352 insertions, 183 deletions
diff --git a/xml/impl/src/com/intellij/application/options/CodeStyleHtmlPanel.form b/xml/impl/src/com/intellij/application/options/CodeStyleHtmlPanel.form
index 01f7df00f6bd..0ddd4cf577f3 100644
--- a/xml/impl/src/com/intellij/application/options/CodeStyleHtmlPanel.form
+++ b/xml/impl/src/com/intellij/application/options/CodeStyleHtmlPanel.form
@@ -17,7 +17,7 @@
<border type="none"/>
<children/>
</xy>
- <grid id="1b801" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+ <grid id="1b801" layout-manager="GridLayoutManager" row-count="2" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
@@ -27,14 +27,14 @@
<children>
<scrollpane id="3e3f1" class="com.intellij.ui.components.JBScrollPane" binding="myJBScrollPane" custom-create="true">
<constraints>
- <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="0" anchor="9" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="0" anchor="9" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<horizontalScrollBarPolicy value="31"/>
</properties>
<border type="empty"/>
<children>
- <grid id="b4cfb" layout-manager="GridLayoutManager" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+ <grid id="b4cfb" layout-manager="GridLayoutManager" row-count="4" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints/>
<properties/>
@@ -43,7 +43,7 @@
<grid id="ca5bb" layout-manager="GridLayoutManager" row-count="7" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
- <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+ <grid row="3" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
@@ -185,7 +185,7 @@
<grid id="b8acc" layout-manager="GridLayoutManager" row-count="1" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
- <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+ <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
@@ -277,7 +277,7 @@
<grid id="6dece" layout-manager="GridLayoutManager" row-count="4" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
- <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+ <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
@@ -336,6 +336,15 @@
</component>
</children>
</grid>
+ <grid id="eb695" binding="myRightMarginPanel" custom-create="true" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+ <margin top="0" left="0" bottom="0" right="0"/>
+ <constraints>
+ <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties/>
+ <border type="none"/>
+ <children/>
+ </grid>
</children>
</grid>
</children>
diff --git a/xml/impl/src/com/intellij/application/options/CodeStyleHtmlPanel.java b/xml/impl/src/com/intellij/application/options/CodeStyleHtmlPanel.java
index ba5a72a80beb..476181ff256d 100644
--- a/xml/impl/src/com/intellij/application/options/CodeStyleHtmlPanel.java
+++ b/xml/impl/src/com/intellij/application/options/CodeStyleHtmlPanel.java
@@ -15,6 +15,7 @@
*/
package com.intellij.application.options;
+import com.intellij.application.options.codeStyle.RightMarginForm;
import com.intellij.ide.highlighter.XmlHighlighterFactory;
import com.intellij.openapi.application.ApplicationBundle;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
@@ -30,6 +31,7 @@ import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
import com.intellij.ui.components.JBScrollPane;
import com.intellij.util.ArrayUtil;
import com.intellij.util.PlatformIcons;
+import com.intellij.util.ui.Centerizer;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
@@ -64,6 +66,8 @@ public class CodeStyleHtmlPanel extends CodeStyleAbstractPanel {
private JCheckBox myShouldKeepLineBreaksInText;
private TextFieldWithBrowseButton myDontBreakIfInlineContent;
private JBScrollPane myJBScrollPane;
+ private JPanel myRightMarginPanel;
+ private RightMarginForm myRightMarginForm;
public CodeStyleHtmlPanel(CodeStyleSettings settings) {
super(settings);
@@ -95,6 +99,8 @@ public class CodeStyleHtmlPanel extends CodeStyleAbstractPanel {
}
private void createUIComponents() {
+ myRightMarginForm = new RightMarginForm(StdFileTypes.HTML.getLanguage(), getSettings());
+ myRightMarginPanel = myRightMarginForm.getTopPanel();
myJBScrollPane = new JBScrollPane() {
@Override
public Dimension getPreferredSize() {
@@ -158,6 +164,7 @@ public class CodeStyleHtmlPanel extends CodeStyleAbstractPanel {
settings.HTML_KEEP_WHITESPACES_INSIDE = myKeepWhiteSpacesTagNames.getText();
settings.HTML_KEEP_LINE_BREAKS = myShouldKeepBlankLines.isSelected();
settings.HTML_KEEP_LINE_BREAKS_IN_TEXT = myShouldKeepLineBreaksInText.isSelected();
+ myRightMarginForm.apply(settings);
}
private static int getIntValue(JTextField keepBlankLines) {
@@ -190,6 +197,7 @@ public class CodeStyleHtmlPanel extends CodeStyleAbstractPanel {
myInlineElementsTagNames.setText(settings.HTML_INLINE_ELEMENTS);
myDontBreakIfInlineContent.setText(settings.HTML_DONT_ADD_BREAKS_IF_INLINE_CONTENT);
myKeepWhiteSpacesTagNames.setText(settings.HTML_KEEP_WHITESPACES_INSIDE);
+ myRightMarginForm.reset(settings);
}
@Override
@@ -260,7 +268,7 @@ public class CodeStyleHtmlPanel extends CodeStyleAbstractPanel {
return true;
}
- return false;
+ return myRightMarginForm.isModified(settings);
}
@Override
diff --git a/xml/impl/src/com/intellij/application/options/CodeStyleXmlPanel.form b/xml/impl/src/com/intellij/application/options/CodeStyleXmlPanel.form
index 28d48d089cc1..c7895930be0f 100644
--- a/xml/impl/src/com/intellij/application/options/CodeStyleXmlPanel.form
+++ b/xml/impl/src/com/intellij/application/options/CodeStyleXmlPanel.form
@@ -17,7 +17,7 @@
</properties>
<border type="empty"/>
<children>
- <grid id="265f" layout-manager="GridLayoutManager" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+ <grid id="265f" layout-manager="GridLayoutManager" row-count="4" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints/>
<properties/>
@@ -26,7 +26,7 @@
<grid id="417cd" layout-manager="GridLayoutManager" row-count="2" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
- <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+ <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
@@ -114,7 +114,7 @@
<grid id="e7045" layout-manager="GridLayoutManager" row-count="4" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
- <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+ <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
@@ -176,7 +176,7 @@
<grid id="bcc6c" layout-manager="GridLayoutManager" row-count="2" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
- <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+ <grid row="3" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<clientProperties>
@@ -215,6 +215,15 @@
</component>
</children>
</grid>
+ <grid id="3d661" binding="myRightMarginPanel" custom-create="true" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+ <margin top="0" left="0" bottom="0" right="0"/>
+ <constraints>
+ <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties/>
+ <border type="none"/>
+ <children/>
+ </grid>
</children>
</grid>
</children>
diff --git a/xml/impl/src/com/intellij/application/options/CodeStyleXmlPanel.java b/xml/impl/src/com/intellij/application/options/CodeStyleXmlPanel.java
index ab3126162dde..8767e00de1ec 100644
--- a/xml/impl/src/com/intellij/application/options/CodeStyleXmlPanel.java
+++ b/xml/impl/src/com/intellij/application/options/CodeStyleXmlPanel.java
@@ -15,6 +15,7 @@
*/
package com.intellij.application.options;
+import com.intellij.application.options.codeStyle.RightMarginForm;
import com.intellij.ide.highlighter.XmlHighlighterFactory;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.editor.highlighter.EditorHighlighter;
@@ -25,6 +26,7 @@ import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
import com.intellij.psi.formatter.xml.XmlCodeStyleSettings;
import com.intellij.ui.components.JBScrollPane;
+import org.apache.xmlbeans.XmlLanguage;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
@@ -48,6 +50,8 @@ public class CodeStyleXmlPanel extends CodeStyleAbstractPanel{
private JComboBox myWhiteSpaceAroundCDATA;
private JCheckBox myKeepWhitespaceInsideCDATACheckBox;
private JBScrollPane myJBScrollPane;
+ private JPanel myRightMarginPanel;
+ private RightMarginForm myRightMarginForm;
public CodeStyleXmlPanel(CodeStyleSettings settings) {
super(settings);
@@ -83,6 +87,7 @@ public class CodeStyleXmlPanel extends CodeStyleAbstractPanel{
xmlSettings.XML_SPACE_INSIDE_EMPTY_TAG = myInEmptyTag.isSelected();
xmlSettings.XML_WHITE_SPACE_AROUND_CDATA = myWhiteSpaceAroundCDATA.getSelectedIndex();
xmlSettings.XML_KEEP_WHITE_SPACES_INSIDE_CDATA = myKeepWhitespaceInsideCDATACheckBox.isSelected();
+ myRightMarginForm.apply(settings);
}
private int getIntValue(JTextField keepBlankLines) {
@@ -109,6 +114,7 @@ public class CodeStyleXmlPanel extends CodeStyleAbstractPanel{
myWrapText.setSelected(wrapText(settings));
myWhiteSpaceAroundCDATA.setSelectedIndex(xmlSettings.XML_WHITE_SPACE_AROUND_CDATA);
myKeepWhitespaceInsideCDATACheckBox.setSelected(xmlSettings.XML_KEEP_WHITE_SPACES_INSIDE_CDATA);
+ myRightMarginForm.reset(settings);
}
@Override
@@ -156,7 +162,7 @@ public class CodeStyleXmlPanel extends CodeStyleAbstractPanel{
return true;
}
- return false;
+ return myRightMarginForm.isModified(settings);
}
private boolean wrapText(final CodeStyleSettings settings) {
@@ -193,5 +199,7 @@ public class CodeStyleXmlPanel extends CodeStyleAbstractPanel{
return new Dimension(prefSize.width + 15, prefSize.height);
}
};
+ myRightMarginForm = new RightMarginForm(StdFileTypes.XML.getLanguage(), getSettings());
+ myRightMarginPanel = myRightMarginForm.getTopPanel();
}
}
diff --git a/xml/impl/src/com/intellij/application/options/HtmlLanguageCodeStyleSettings.java b/xml/impl/src/com/intellij/application/options/HtmlLanguageCodeStyleSettings.java
index aa36d1b9aa60..d970ee5008cf 100644
--- a/xml/impl/src/com/intellij/application/options/HtmlLanguageCodeStyleSettings.java
+++ b/xml/impl/src/com/intellij/application/options/HtmlLanguageCodeStyleSettings.java
@@ -17,10 +17,13 @@ package com.intellij.application.options;
import com.intellij.lang.Language;
import com.intellij.lang.html.HTMLLanguage;
+import com.intellij.psi.codeStyle.CodeStyleSettingsCustomizable;
import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
import com.intellij.psi.codeStyle.LanguageCodeStyleSettingsProvider;
import org.jetbrains.annotations.NotNull;
+import java.util.Set;
+
/**
* @author Rustam Vishnyakov
*/
@@ -37,6 +40,14 @@ public class HtmlLanguageCodeStyleSettings extends LanguageCodeStyleSettingsProv
}
@Override
+ public void customizeSettings(@NotNull CodeStyleSettingsCustomizable consumer,
+ @NotNull SettingsType settingsType) {
+ if (settingsType == SettingsType.WRAPPING_AND_BRACES_SETTINGS) {
+ consumer.showStandardOptions("RIGHT_MARGIN");
+ }
+ }
+
+ @Override
public CommonCodeStyleSettings getDefaultCommonSettings() {
CommonCodeStyleSettings defaultSettings = new CommonCodeStyleSettings(HTMLLanguage.INSTANCE);
defaultSettings.initIndentOptions();
diff --git a/xml/impl/src/com/intellij/application/options/XmlLanguageCodeStyleSettingsProvider.java b/xml/impl/src/com/intellij/application/options/XmlLanguageCodeStyleSettingsProvider.java
index 651c71e7ee7d..89311331d59b 100644
--- a/xml/impl/src/com/intellij/application/options/XmlLanguageCodeStyleSettingsProvider.java
+++ b/xml/impl/src/com/intellij/application/options/XmlLanguageCodeStyleSettingsProvider.java
@@ -17,6 +17,7 @@ package com.intellij.application.options;
import com.intellij.lang.Language;
import com.intellij.lang.xml.XMLLanguage;
+import com.intellij.psi.codeStyle.CodeStyleSettingsCustomizable;
import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
import com.intellij.psi.codeStyle.LanguageCodeStyleSettingsProvider;
import com.intellij.util.PlatformUtils;
@@ -41,6 +42,14 @@ public class XmlLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSetti
}
@Override
+ public void customizeSettings(@NotNull CodeStyleSettingsCustomizable consumer,
+ @NotNull SettingsType settingsType) {
+ if (settingsType == SettingsType.WRAPPING_AND_BRACES_SETTINGS) {
+ consumer.showStandardOptions("RIGHT_MARGIN");
+ }
+ }
+
+ @Override
public CommonCodeStyleSettings getDefaultCommonSettings() {
CommonCodeStyleSettings xmlSettings = new CommonCodeStyleSettings(getLanguage());
CommonCodeStyleSettings.IndentOptions indentOptions = xmlSettings.initIndentOptions();
diff --git a/xml/impl/src/com/intellij/codeInsight/completion/HtmlTextCompletionConfidence.java b/xml/impl/src/com/intellij/codeInsight/completion/HtmlTextCompletionConfidence.java
index ec6c806ffa1f..6d95604dc077 100644
--- a/xml/impl/src/com/intellij/codeInsight/completion/HtmlTextCompletionConfidence.java
+++ b/xml/impl/src/com/intellij/codeInsight/completion/HtmlTextCompletionConfidence.java
@@ -33,7 +33,9 @@ public class HtmlTextCompletionConfidence extends CompletionConfidence {
if (node != null && node.getElementType() == XmlTokenType.XML_DATA_CHARACTERS) {
PsiElement parent = contextElement.getParent();
if (parent instanceof XmlText || parent instanceof XmlDocument) {
- String prefix = contextElement.getText().substring(0, offset - contextElement.getTextRange().getStartOffset());
+ String contextElementText = contextElement.getText();
+ int endOffset = offset - contextElement.getTextRange().getStartOffset();
+ String prefix = contextElementText.substring(0, Math.min(contextElementText.length(), endOffset));
if (!StringUtil.startsWithChar(prefix, '<') && !StringUtil.startsWithChar(prefix, '&')) {
return ThreeState.YES;
}
diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/TrimZenCodingFilter.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/TrimZenCodingFilter.java
index ceb0d1dd61b9..421fbdd46564 100644
--- a/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/TrimZenCodingFilter.java
+++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/TrimZenCodingFilter.java
@@ -18,6 +18,7 @@ package com.intellij.codeInsight.template.emmet.filters;
import com.intellij.codeInsight.template.emmet.nodes.GenerationNode;
import com.intellij.codeInsight.template.emmet.tokens.TemplateToken;
import com.intellij.lang.xml.XMLLanguage;
+import com.intellij.openapi.application.ApplicationManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.XmlElementVisitor;
import com.intellij.psi.xml.XmlDocument;
@@ -25,6 +26,7 @@ import com.intellij.psi.xml.XmlTag;
import com.intellij.psi.xml.XmlTagValue;
import org.jetbrains.annotations.NotNull;
+import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
@@ -57,18 +59,27 @@ public class TrimZenCodingFilter extends ZenCodingFilter {
if (document != null) {
XmlTag tag = document.getRootTag();
if (tag != null && !tag.getText().isEmpty()) {
- new XmlElementVisitor() {
+ tag.accept(new XmlElementVisitor() {
@Override
- public void visitXmlTag(XmlTag tag) {
- if(!tag.isEmpty()) {
- XmlTagValue tagValue = tag.getValue();
- tagValue.setText(PATTERN.matcher(tagValue.getText()).replaceAll(""));
+ public void visitXmlTag(final XmlTag tag) {
+ if (!tag.isEmpty()) {
+ final XmlTagValue tagValue = tag.getValue();
+ final Matcher matcher = PATTERN.matcher(tagValue.getText());
+ if (matcher.matches()) {
+ ApplicationManager.getApplication().runWriteAction(new Runnable() {
+ @Override
+ public void run() {
+ tagValue.setText(matcher.replaceAll(""));
+ }
+ });
+ }
}
tag.acceptChildren(this);
}
- }.visitXmlTag(tag);
+ });
return tag.getText();
- } else {
+ }
+ else {
return PATTERN.matcher(document.getText()).replaceAll("");
}
}
diff --git a/xml/impl/src/com/intellij/ide/browsers/BrowserLauncherImpl.java b/xml/impl/src/com/intellij/ide/browsers/BrowserLauncherImpl.java
index 86d2994c0e00..4f7f4efa5085 100644
--- a/xml/impl/src/com/intellij/ide/browsers/BrowserLauncherImpl.java
+++ b/xml/impl/src/com/intellij/ide/browsers/BrowserLauncherImpl.java
@@ -18,6 +18,7 @@ package com.intellij.ide.browsers;
import com.intellij.concurrency.JobScheduler;
import com.intellij.execution.configurations.GeneralCommandLine;
import com.intellij.execution.util.ExecUtil;
+import com.intellij.ide.GeneralSettings;
import com.intellij.ide.IdeBundle;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.options.ShowSettingsUtil;
@@ -25,14 +26,30 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.AppUIUtil;
+import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.net.URI;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
final class BrowserLauncherImpl extends BrowserLauncherAppless {
@Override
+ protected void browseUsingNotSystemDefaultBrowserPolicy(@NotNull URI uri, @NotNull GeneralSettings settings, @Nullable Project project) {
+ WebBrowserManager browserManager = WebBrowserManager.getInstance();
+ if (browserManager.getDefaultBrowserPolicy() == DefaultBrowserPolicy.FIRST) {
+ WebBrowser browser = browserManager.getFirstActiveBrowser();
+ if (browser != null) {
+ browseUsingPath(uri.toString(), null, browser, project, ArrayUtil.EMPTY_STRING_ARRAY);
+ return;
+ }
+ }
+
+ super.browseUsingNotSystemDefaultBrowserPolicy(uri, settings, project);
+ }
+
+ @Override
protected void doShowError(@Nullable final String error, @Nullable final WebBrowser browser, @Nullable final Project project, final String title, @Nullable final Runnable launchTask) {
AppUIUtil.invokeOnEdt(new Runnable() {
@Override
diff --git a/xml/impl/src/com/intellij/ide/browsers/BrowserSelector.java b/xml/impl/src/com/intellij/ide/browsers/BrowserSelector.java
index 3ae67def8424..af04e5896387 100644
--- a/xml/impl/src/com/intellij/ide/browsers/BrowserSelector.java
+++ b/xml/impl/src/com/intellij/ide/browsers/BrowserSelector.java
@@ -81,8 +81,8 @@ public class BrowserSelector {
boolean hasFocus) {
Icon baseIcon;
if (value == null) {
- WebBrowser defaultBrowser = WebBrowserManager.getInstance().getDefaultBrowser();
- baseIcon = defaultBrowser == null ? PlatformIcons.WEB_ICON : defaultBrowser.getIcon();
+ WebBrowser firstBrowser = WebBrowserManager.getInstance().getFirstActiveBrowser();
+ baseIcon = firstBrowser == null ? PlatformIcons.WEB_ICON : firstBrowser.getIcon();
}
else {
baseIcon = value.getIcon();
diff --git a/xml/impl/src/com/intellij/ide/browsers/BrowserSettingsPanel.form b/xml/impl/src/com/intellij/ide/browsers/BrowserSettingsPanel.form
index 52d074347bbc..23d7bf2ea873 100644
--- a/xml/impl/src/com/intellij/ide/browsers/BrowserSettingsPanel.form
+++ b/xml/impl/src/com/intellij/ide/browsers/BrowserSettingsPanel.form
@@ -22,7 +22,7 @@
</constraints>
<properties/>
</component>
- <component id="95daa" class="com.intellij.openapi.ui.ComboBox" binding="defaultBrowserComboBox">
+ <component id="95daa" class="com.intellij.openapi.ui.ComboBox" binding="defaultBrowserPolicyComboBox">
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
diff --git a/xml/impl/src/com/intellij/ide/browsers/BrowserSettingsPanel.java b/xml/impl/src/com/intellij/ide/browsers/BrowserSettingsPanel.java
index 477d527ecbac..f43c0f6f4929 100644
--- a/xml/impl/src/com/intellij/ide/browsers/BrowserSettingsPanel.java
+++ b/xml/impl/src/com/intellij/ide/browsers/BrowserSettingsPanel.java
@@ -23,7 +23,6 @@ import com.intellij.openapi.options.ShowSettingsUtil;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.Comparing;
-import com.intellij.ui.EnumComboBoxModel;
import com.intellij.ui.ListCellRendererWrapper;
import com.intellij.ui.TitledSeparator;
import com.intellij.util.Function;
@@ -34,6 +33,7 @@ import com.intellij.util.ui.LocalPathCellEditor;
import com.intellij.util.ui.UIUtil;
import com.intellij.util.ui.table.IconTableCellRenderer;
import com.intellij.util.ui.table.TableModelEditor;
+import org.jdesktop.swingx.combobox.ListComboBoxModel;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -46,9 +46,9 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
+import java.util.ArrayList;
import java.util.UUID;
-import static com.intellij.ide.browsers.WebBrowserManager.DefaultBrowser;
import static com.intellij.util.ui.table.TableModelEditor.EditableColumnInfo;
final class BrowserSettingsPanel {
@@ -73,7 +73,7 @@ final class BrowserSettingsPanel {
}
};
- private static final ColumnInfo[] COLUMNS = {new EditableColumnInfo<ConfigurableWebBrowser, Boolean>() {
+ private static final EditableColumnInfo<ConfigurableWebBrowser, Boolean> ACTIVE_COLUMN_INFO = new EditableColumnInfo<ConfigurableWebBrowser, Boolean>() {
@Override
public Class getColumnClass() {
return Boolean.class;
@@ -88,44 +88,49 @@ final class BrowserSettingsPanel {
public void setValue(ConfigurableWebBrowser item, Boolean value) {
item.setActive(value);
}
- }, new EditableColumnInfo<ConfigurableWebBrowser, String>("Name") {
- @Override
- public String valueOf(ConfigurableWebBrowser item) {
- return item.getName();
- }
+ };
- @Override
- public void setValue(ConfigurableWebBrowser item, String value) {
- item.setName(value);
- }
- }, new ColumnInfo<ConfigurableWebBrowser, BrowserFamily>("Family") {
- @Override
- public Class getColumnClass() {
- return BrowserFamily.class;
- }
+ private static final ColumnInfo[] COLUMNS = {ACTIVE_COLUMN_INFO,
+ new EditableColumnInfo<ConfigurableWebBrowser, String>("Name") {
+ @Override
+ public String valueOf(ConfigurableWebBrowser item) {
+ return item.getName();
+ }
- @Override
- public BrowserFamily valueOf(ConfigurableWebBrowser item) {
- return item.getFamily();
- }
+ @Override
+ public void setValue(ConfigurableWebBrowser item, String value) {
+ item.setName(value);
+ }
+ },
+ new ColumnInfo<ConfigurableWebBrowser, BrowserFamily>("Family") {
+ @Override
+ public Class getColumnClass() {
+ return BrowserFamily.class;
+ }
- @Override
- public void setValue(ConfigurableWebBrowser item, BrowserFamily value) {
- item.setFamily(value);
- item.setSpecificSettings(value.createBrowserSpecificSettings());
- }
+ @Override
+ public BrowserFamily valueOf(ConfigurableWebBrowser item) {
+ return item.getFamily();
+ }
- @Nullable
- @Override
- public TableCellRenderer getRenderer(ConfigurableWebBrowser item) {
- return IconTableCellRenderer.ICONABLE;
- }
+ @Override
+ public void setValue(ConfigurableWebBrowser item, BrowserFamily value) {
+ item.setFamily(value);
+ item.setSpecificSettings(value.createBrowserSpecificSettings());
+ }
- @Override
- public boolean isCellEditable(ConfigurableWebBrowser item) {
- return !WebBrowserManager.getInstance().isPredefinedBrowser(item);
- }
- }, PATH_COLUMN_INFO};
+ @Nullable
+ @Override
+ public TableCellRenderer getRenderer(ConfigurableWebBrowser item) {
+ return IconTableCellRenderer.ICONABLE;
+ }
+
+ @Override
+ public boolean isCellEditable(ConfigurableWebBrowser item) {
+ return !WebBrowserManager.getInstance().isPredefinedBrowser(item);
+ }
+ },
+ PATH_COLUMN_INFO};
private JPanel root;
@@ -138,7 +143,7 @@ final class BrowserSettingsPanel {
@SuppressWarnings("UnusedDeclaration")
private JComponent browsersTable;
- private ComboBox defaultBrowserComboBox;
+ private ComboBox defaultBrowserPolicyComboBox;
private TableModelEditor<ConfigurableWebBrowser> browsersEditor;
@@ -148,53 +153,55 @@ final class BrowserSettingsPanel {
alternativeBrowserPathField.addBrowseFolderListener(IdeBundle.message("title.select.path.to.browser"), null, null, APP_FILE_CHOOSER_DESCRIPTOR);
defaultBrowserPanel.setBorder(TitledSeparator.EMPTY_BORDER);
- //noinspection unchecked
- defaultBrowserComboBox.setModel(new EnumComboBoxModel<DefaultBrowser>(DefaultBrowser.class));
- if (BrowserLauncherAppless.canStartDefaultBrowser()) {
- defaultBrowserComboBox.addItemListener(new ItemListener() {
- @Override
- public void itemStateChanged(ItemEvent e) {
- boolean customPathEnabled = e.getItem() == DefaultBrowser.ALTERNATIVE;
- if (e.getStateChange() == ItemEvent.DESELECTED) {
- if (customPathEnabled) {
- customPathValue = alternativeBrowserPathField.getText();
- }
- }
- else if (e.getStateChange() == ItemEvent.SELECTED) {
- alternativeBrowserPathField.setEnabled(customPathEnabled);
- updateCustomPathTextFieldValue((DefaultBrowser)e.getItem());
- }
- }
- });
+ ArrayList<DefaultBrowserPolicy> defaultBrowserPolicies = new ArrayList<DefaultBrowserPolicy>();
+ if (BrowserLauncherAppless.canUseSystemDefaultBrowserPolicy()) {
+ defaultBrowserPolicies.add(DefaultBrowserPolicy.SYSTEM);
+ }
+ defaultBrowserPolicies.add(DefaultBrowserPolicy.FIRST);
+ defaultBrowserPolicies.add(DefaultBrowserPolicy.ALTERNATIVE);
- defaultBrowserComboBox.setRenderer(new ListCellRendererWrapper<DefaultBrowser>() {
- @Override
- public void customize(JList list, DefaultBrowser value, int index, boolean selected, boolean hasFocus) {
- String name;
- switch (value) {
- case SYSTEM:
- name = "System default";
- break;
- case FIRST:
- name = "First listed";
- break;
- case ALTERNATIVE:
- name = "Custom path";
- break;
- default:
- throw new IllegalStateException();
+ //noinspection Since15,unchecked
+ defaultBrowserPolicyComboBox.setModel(new ListComboBoxModel<DefaultBrowserPolicy>(defaultBrowserPolicies));
+ defaultBrowserPolicyComboBox.addItemListener(new ItemListener() {
+ @Override
+ public void itemStateChanged(ItemEvent e) {
+ boolean customPathEnabled = e.getItem() == DefaultBrowserPolicy.ALTERNATIVE;
+ if (e.getStateChange() == ItemEvent.DESELECTED) {
+ if (customPathEnabled) {
+ customPathValue = alternativeBrowserPathField.getText();
}
+ }
+ else if (e.getStateChange() == ItemEvent.SELECTED) {
+ alternativeBrowserPathField.setEnabled(customPathEnabled);
+ updateCustomPathTextFieldValue((DefaultBrowserPolicy)e.getItem());
+ }
+ }
+ });
- setText(name);
+ defaultBrowserPolicyComboBox.setRenderer(new ListCellRendererWrapper<DefaultBrowserPolicy>() {
+ @Override
+ public void customize(JList list, DefaultBrowserPolicy value, int index, boolean selected, boolean hasFocus) {
+ String name;
+ switch (value) {
+ case SYSTEM:
+ name = "System default";
+ break;
+ case FIRST:
+ name = "First listed";
+ break;
+ case ALTERNATIVE:
+ name = "Custom path";
+ break;
+ default:
+ throw new IllegalStateException();
}
- });
- if (UIUtil.isUnderAquaLookAndFeel()) {
- defaultBrowserComboBox.setBorder(new EmptyBorder(3, 0, 0, 0));
+ setText(name);
}
- }
- else {
- defaultBrowserComboBox.setVisible(false);
+ });
+
+ if (UIUtil.isUnderAquaLookAndFeel()) {
+ defaultBrowserPolicyComboBox.setBorder(new EmptyBorder(3, 0, 0, 0));
}
clearExtractedFiles.addActionListener(new ActionListener() {
@@ -205,11 +212,11 @@ final class BrowserSettingsPanel {
});
}
- private void updateCustomPathTextFieldValue(DefaultBrowser browser) {
- if (browser == DefaultBrowser.ALTERNATIVE) {
+ private void updateCustomPathTextFieldValue(@NotNull DefaultBrowserPolicy browser) {
+ if (browser == DefaultBrowserPolicy.ALTERNATIVE) {
alternativeBrowserPathField.setText(customPathValue);
}
- else if (browser == DefaultBrowser.FIRST) {
+ else if (browser == DefaultBrowserPolicy.FIRST) {
setCustomPathToFirstListed();
}
else {
@@ -272,18 +279,18 @@ final class BrowserSettingsPanel {
.modelListener(new TableModelEditor.DataChangedListener<ConfigurableWebBrowser>() {
@Override
public void tableChanged(TableModelEvent event) {
- update(event.getFirstRow());
+ update();
}
@Override
public void dataChanged(@NotNull ColumnInfo<ConfigurableWebBrowser, ?> columnInfo, int rowIndex) {
- if (columnInfo == PATH_COLUMN_INFO) {
- update(rowIndex);
+ if (columnInfo == PATH_COLUMN_INFO || columnInfo == ACTIVE_COLUMN_INFO) {
+ update();
}
}
- private void update(int rowIndex) {
- if (rowIndex == 0 && getDefaultBrowser() == DefaultBrowser.FIRST) {
+ private void update() {
+ if (getDefaultBrowser() == DefaultBrowserPolicy.FIRST) {
setCustomPathToFirstListed();
}
}
@@ -293,7 +300,15 @@ final class BrowserSettingsPanel {
private void setCustomPathToFirstListed() {
ListTableModel<ConfigurableWebBrowser> model = browsersEditor.getModel();
- alternativeBrowserPathField.setText(model.getRowCount() == 0 ? "" : model.getRowValue(0).getPath());
+ for (int i = 0, n = model.getRowCount(); i < n; i++) {
+ ConfigurableWebBrowser browser = model.getRowValue(i);
+ if (browser.isActive() && browser.getPath() != null) {
+ alternativeBrowserPathField.setText(browser.getPath());
+ return;
+ }
+ }
+
+ alternativeBrowserPathField.setText("");
}
@NotNull
@@ -305,12 +320,12 @@ final class BrowserSettingsPanel {
WebBrowserManager browserManager = WebBrowserManager.getInstance();
GeneralSettings generalSettings = GeneralSettings.getInstance();
- DefaultBrowser defaultBrowser = getDefaultBrowser();
- if (browserManager.getDefaultBrowserMode() != defaultBrowser || generalSettings.isConfirmExtractFiles() != confirmExtractFiles.isSelected()) {
+ DefaultBrowserPolicy defaultBrowserPolicy = getDefaultBrowser();
+ if (browserManager.getDefaultBrowserPolicy() != defaultBrowserPolicy || generalSettings.isConfirmExtractFiles() != confirmExtractFiles.isSelected()) {
return true;
}
- if (defaultBrowser == DefaultBrowser.ALTERNATIVE &&
+ if (defaultBrowserPolicy == DefaultBrowserPolicy.ALTERNATIVE &&
!Comparing.strEqual(generalSettings.getBrowserPath(), alternativeBrowserPathField.getText())) {
return true;
}
@@ -321,7 +336,7 @@ final class BrowserSettingsPanel {
public void apply() {
GeneralSettings settings = GeneralSettings.getInstance();
- settings.setUseDefaultBrowser(getDefaultBrowser() == DefaultBrowser.SYSTEM);
+ settings.setUseDefaultBrowser(getDefaultBrowser() == DefaultBrowserPolicy.SYSTEM);
if (alternativeBrowserPathField.isEnabled()) {
settings.setBrowserPath(alternativeBrowserPathField.getText());
@@ -330,26 +345,27 @@ final class BrowserSettingsPanel {
settings.setConfirmExtractFiles(confirmExtractFiles.isSelected());
WebBrowserManager browserManager = WebBrowserManager.getInstance();
- browserManager.defaultBrowser = getDefaultBrowser();
+ browserManager.defaultBrowserPolicy = getDefaultBrowser();
browserManager.setList(browsersEditor.apply());
}
- private DefaultBrowser getDefaultBrowser() {
- return (DefaultBrowser)defaultBrowserComboBox.getSelectedItem();
+ private DefaultBrowserPolicy getDefaultBrowser() {
+ return (DefaultBrowserPolicy)defaultBrowserPolicyComboBox.getSelectedItem();
}
public void reset() {
- GeneralSettings settings = GeneralSettings.getInstance();
-
- DefaultBrowser defaultBrowser = WebBrowserManager.getInstance().getDefaultBrowserMode();
- defaultBrowserComboBox.setSelectedItem(defaultBrowser);
+ DefaultBrowserPolicy defaultBrowserPolicy = WebBrowserManager.getInstance().getDefaultBrowserPolicy();
+ DefaultBrowserPolicy effectiveDefaultBrowserPolicy = defaultBrowserPolicy == DefaultBrowserPolicy.SYSTEM && !BrowserLauncherAppless.canUseSystemDefaultBrowserPolicy()
+ ? DefaultBrowserPolicy.ALTERNATIVE : defaultBrowserPolicy;
+ defaultBrowserPolicyComboBox.setSelectedItem(effectiveDefaultBrowserPolicy);
+ GeneralSettings settings = GeneralSettings.getInstance();
confirmExtractFiles.setSelected(settings.isConfirmExtractFiles());
browsersEditor.reset(WebBrowserManager.getInstance().getList());
customPathValue = settings.getBrowserPath();
- alternativeBrowserPathField.setEnabled(defaultBrowser == DefaultBrowser.ALTERNATIVE);
- updateCustomPathTextFieldValue(defaultBrowser);
+ alternativeBrowserPathField.setEnabled(effectiveDefaultBrowserPolicy == DefaultBrowserPolicy.ALTERNATIVE);
+ updateCustomPathTextFieldValue(effectiveDefaultBrowserPolicy);
}
public void selectBrowser(@NotNull WebBrowser browser) {
diff --git a/xml/impl/src/com/intellij/ide/browsers/ConfigurableWebBrowser.java b/xml/impl/src/com/intellij/ide/browsers/ConfigurableWebBrowser.java
index 11502b5119a9..9f48b35905ae 100644
--- a/xml/impl/src/com/intellij/ide/browsers/ConfigurableWebBrowser.java
+++ b/xml/impl/src/com/intellij/ide/browsers/ConfigurableWebBrowser.java
@@ -56,7 +56,7 @@ final class ConfigurableWebBrowser extends WebBrowser {
@Override
public Icon getIcon() {
if (family == BrowserFamily.CHROME) {
- if (checkNameAndPath("Yandex")) {
+ if (WebBrowserManager.isYandexBrowser(this)) {
return AllIcons.Xml.Browsers.Yandex16;
}
else if (checkNameAndPath("Dartium") || checkNameAndPath("Chromium")) {
@@ -76,14 +76,7 @@ final class ConfigurableWebBrowser extends WebBrowser {
}
private boolean checkNameAndPath(@NotNull String what) {
- if (StringUtil.containsIgnoreCase(name, what)) {
- return true;
- }
- if (path != null) {
- int index = path.lastIndexOf('/');
- return index > 0 ? path.indexOf(what, index + 1) != -1 : path.contains(what);
- }
- return false;
+ return WebBrowserManager.checkNameAndPath(what, this);
}
@Nullable
diff --git a/xml/impl/src/com/intellij/ide/browsers/DefaultBrowserPolicy.java b/xml/impl/src/com/intellij/ide/browsers/DefaultBrowserPolicy.java
new file mode 100644
index 000000000000..4e1f0b2e0dc2
--- /dev/null
+++ b/xml/impl/src/com/intellij/ide/browsers/DefaultBrowserPolicy.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.ide.browsers;
+
+public enum DefaultBrowserPolicy {
+ SYSTEM, FIRST, ALTERNATIVE
+} \ No newline at end of file
diff --git a/xml/impl/src/com/intellij/ide/browsers/WebBrowserManager.java b/xml/impl/src/com/intellij/ide/browsers/WebBrowserManager.java
index ce51ee07eebc..0b2ba6cb18c1 100644
--- a/xml/impl/src/com/intellij/ide/browsers/WebBrowserManager.java
+++ b/xml/impl/src/com/intellij/ide/browsers/WebBrowserManager.java
@@ -17,10 +17,7 @@ package com.intellij.ide.browsers;
import com.intellij.openapi.components.*;
import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.util.Condition;
-import com.intellij.openapi.util.Conditions;
-import com.intellij.openapi.util.JDOMUtil;
-import com.intellij.openapi.util.SimpleModificationTracker;
+import com.intellij.openapi.util.*;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.SmartList;
import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters;
@@ -36,53 +33,75 @@ public class WebBrowserManager extends SimpleModificationTracker implements Pers
private static final Logger LOG = Logger.getInstance(WebBrowserManager.class);
// default standard browser ID must be constant across all IDE versions on all machines for all users
- private static final UUID DEFAULT_CHROME_ID = UUID.fromString("98CA6316-2F89-46D9-A9E5-FA9E2B0625B3");
+ private static final UUID PREDEFINED_CHROME_ID = UUID.fromString("98CA6316-2F89-46D9-A9E5-FA9E2B0625B3");
// public, but only internal use
- public static final UUID DEFAULT_FIREFOX_ID = UUID.fromString("A7BB68E0-33C0-4D6F-A81A-AAC1FDB870C8");
- private static final UUID DEFAULT_SAFARI_ID = UUID.fromString("E5120D43-2C3F-47EF-9F26-65E539E05186");
- private static final UUID DEFAULT_OPERA_ID = UUID.fromString("53E2F627-B1A7-4DFA-BFA7-5B83CC034776");
- private static final UUID DEFAULT_EXPLORER_ID = UUID.fromString("16BF23D4-93E0-4FFC-BFD6-CB13575177B0");
+ public static final UUID PREDEFINED_FIREFOX_ID = UUID.fromString("A7BB68E0-33C0-4D6F-A81A-AAC1FDB870C8");
+ private static final UUID PREDEFINED_SAFARI_ID = UUID.fromString("E5120D43-2C3F-47EF-9F26-65E539E05186");
+ private static final UUID PREDEFINED_OPERA_ID = UUID.fromString("53E2F627-B1A7-4DFA-BFA7-5B83CC034776");
+ private static final UUID PREDEFINED_YANDEX_ID = UUID.fromString("B1B2EC2C-20BD-4EE2-89C4-616DB004BCD4");
+ private static final UUID PREDEFINED_EXPLORER_ID = UUID.fromString("16BF23D4-93E0-4FFC-BFD6-CB13575177B0");
+
+ private static final List<ConfigurableWebBrowser> PREDEFINED_BROWSERS = Arrays.asList(
+ new ConfigurableWebBrowser(PREDEFINED_CHROME_ID, BrowserFamily.CHROME),
+ new ConfigurableWebBrowser(PREDEFINED_FIREFOX_ID, BrowserFamily.FIREFOX),
+ new ConfigurableWebBrowser(PREDEFINED_SAFARI_ID, BrowserFamily.SAFARI),
+ new ConfigurableWebBrowser(PREDEFINED_OPERA_ID, BrowserFamily.OPERA),
+ new ConfigurableWebBrowser(PREDEFINED_YANDEX_ID, BrowserFamily.CHROME, "Yandex", SystemInfo.isWindows ? "browser" : (SystemInfo.isMac ? "Yandex" : "yandex"), false, BrowserFamily.CHROME.createBrowserSpecificSettings()),
+ new ConfigurableWebBrowser(PREDEFINED_EXPLORER_ID, BrowserFamily.EXPLORER)
+ );
private List<ConfigurableWebBrowser> browsers;
- DefaultBrowser defaultBrowser = DefaultBrowser.SYSTEM;
+ DefaultBrowserPolicy defaultBrowserPolicy = DefaultBrowserPolicy.SYSTEM;
public WebBrowserManager() {
- browsers = new ArrayList<ConfigurableWebBrowser>();
- browsers.add(new ConfigurableWebBrowser(DEFAULT_CHROME_ID, BrowserFamily.CHROME));
- browsers.add(new ConfigurableWebBrowser(DEFAULT_FIREFOX_ID, BrowserFamily.FIREFOX));
- browsers.add(new ConfigurableWebBrowser(DEFAULT_SAFARI_ID, BrowserFamily.SAFARI));
- browsers.add(new ConfigurableWebBrowser(DEFAULT_OPERA_ID, BrowserFamily.OPERA));
- browsers.add(new ConfigurableWebBrowser(DEFAULT_EXPLORER_ID, BrowserFamily.EXPLORER));
+ browsers = new ArrayList<ConfigurableWebBrowser>(PREDEFINED_BROWSERS);
}
public static WebBrowserManager getInstance() {
return ServiceManager.getService(WebBrowserManager.class);
}
- boolean isPredefinedBrowser(@NotNull ConfigurableWebBrowser browser) {
- UUID id = browser.getId();
- return id.equals(DEFAULT_CHROME_ID) ||
- id.equals(DEFAULT_FIREFOX_ID) ||
- id.equals(DEFAULT_SAFARI_ID) ||
- id.equals(DEFAULT_OPERA_ID) ||
- id.equals(DEFAULT_EXPLORER_ID);
+ public static boolean isYandexBrowser(@NotNull WebBrowser browser) {
+ return browser.getFamily().equals(BrowserFamily.CHROME) && (browser.getId().equals(PREDEFINED_YANDEX_ID) || checkNameAndPath("Yandex", browser));
+ }
+
+ public static boolean isDartium(@NotNull WebBrowser browser) {
+ return browser.getFamily().equals(BrowserFamily.CHROME) && checkNameAndPath("Dartium", browser);
+ }
+
+ static boolean checkNameAndPath(@NotNull String what, @NotNull WebBrowser browser) {
+ if (StringUtil.containsIgnoreCase(browser.getName(), what)) {
+ return true;
+ }
+ String path = browser.getPath();
+ if (path != null) {
+ int index = path.lastIndexOf('/');
+ return index > 0 ? path.indexOf(what, index + 1) != -1 : path.contains(what);
+ }
+ return false;
}
- public enum DefaultBrowser {
- SYSTEM, FIRST, ALTERNATIVE
+ boolean isPredefinedBrowser(@NotNull ConfigurableWebBrowser browser) {
+ UUID id = browser.getId();
+ for (ConfigurableWebBrowser predefinedBrowser : PREDEFINED_BROWSERS) {
+ if (id.equals(predefinedBrowser.getId())) {
+ return true;
+ }
+ }
+ return false;
}
@NotNull
- public DefaultBrowser getDefaultBrowserMode() {
- return defaultBrowser;
+ public DefaultBrowserPolicy getDefaultBrowserPolicy() {
+ return defaultBrowserPolicy;
}
@Override
public Element getState() {
Element state = new Element("state");
- if (defaultBrowser != DefaultBrowser.SYSTEM) {
- state.setAttribute("default", defaultBrowser.name().toLowerCase(Locale.ENGLISH));
+ if (defaultBrowserPolicy != DefaultBrowserPolicy.SYSTEM) {
+ state.setAttribute("default", defaultBrowserPolicy.name().toLowerCase(Locale.ENGLISH));
}
for (ConfigurableWebBrowser browser : browsers) {
@@ -137,19 +156,19 @@ public class WebBrowserManager extends SimpleModificationTracker implements Pers
UUID id;
switch (family) {
case CHROME:
- id = DEFAULT_CHROME_ID;
+ id = PREDEFINED_CHROME_ID;
break;
case EXPLORER:
- id = DEFAULT_EXPLORER_ID;
+ id = PREDEFINED_EXPLORER_ID;
break;
case FIREFOX:
- id = DEFAULT_FIREFOX_ID;
+ id = PREDEFINED_FIREFOX_ID;
break;
case OPERA:
- id = DEFAULT_OPERA_ID;
+ id = PREDEFINED_OPERA_ID;
break;
case SAFARI:
- id = DEFAULT_SAFARI_ID;
+ id = PREDEFINED_SAFARI_ID;
break;
default:
@@ -180,7 +199,7 @@ public class WebBrowserManager extends SimpleModificationTracker implements Pers
String defaultValue = element.getAttributeValue("default");
if (!StringUtil.isEmpty(defaultValue)) {
try {
- defaultBrowser = DefaultBrowser.valueOf(defaultValue.toUpperCase(Locale.ENGLISH));
+ defaultBrowserPolicy = DefaultBrowserPolicy.valueOf(defaultValue.toUpperCase(Locale.ENGLISH));
}
catch (IllegalArgumentException e) {
LOG.warn(e);
@@ -225,6 +244,18 @@ public class WebBrowserManager extends SimpleModificationTracker implements Pers
specificSettings));
}
+ // add removed/new predefined browsers
+ int n = list.size();
+ pb: for (ConfigurableWebBrowser predefinedBrowser : PREDEFINED_BROWSERS) {
+ //noinspection ForLoopReplaceableByForEach
+ for (int i = 0; i < n; i++) {
+ if (list.get(i).getId().equals(predefinedBrowser.getId())) {
+ continue pb;
+ }
+ }
+ list.add(predefinedBrowser);
+ }
+
setList(list);
}
@@ -349,9 +380,9 @@ public class WebBrowserManager extends SimpleModificationTracker implements Pers
}
@Nullable
- public WebBrowser getDefaultBrowser() {
+ public WebBrowser getFirstActiveBrowser() {
for (ConfigurableWebBrowser browser : browsers) {
- if (browser.isActive()) {
+ if (browser.isActive() && browser.getPath() != null) {
return browser;
}
}
diff --git a/xml/impl/src/com/intellij/ide/browsers/actions/BaseOpenInBrowserAction.java b/xml/impl/src/com/intellij/ide/browsers/actions/BaseOpenInBrowserAction.java
index 8ec2a2e55b67..e3bf3b5e6f6f 100644
--- a/xml/impl/src/com/intellij/ide/browsers/actions/BaseOpenInBrowserAction.java
+++ b/xml/impl/src/com/intellij/ide/browsers/actions/BaseOpenInBrowserAction.java
@@ -151,7 +151,7 @@ public abstract class BaseOpenInBrowserAction extends DumbAwareAction {
boolean applicable = false;
WebBrowserUrlProvider provider = null;
if (request != null) {
- applicable = HtmlUtil.isHtmlFile(request.getFile()) && !(request.getVirtualFile() instanceof LightVirtualFile);
+ applicable = WebBrowserServiceImpl.isHtmlOrXmlFile(request.getFile()) && !(request.getVirtualFile() instanceof LightVirtualFile);
if (!applicable) {
provider = WebBrowserServiceImpl.getProvider(request);
applicable = provider != null;
diff --git a/xml/impl/src/com/intellij/ide/browsers/actions/OpenFileInDefaultBrowserAction.java b/xml/impl/src/com/intellij/ide/browsers/actions/OpenFileInDefaultBrowserAction.java
index 45cf021bbef8..1ead1b6faeb4 100644
--- a/xml/impl/src/com/intellij/ide/browsers/actions/OpenFileInDefaultBrowserAction.java
+++ b/xml/impl/src/com/intellij/ide/browsers/actions/OpenFileInDefaultBrowserAction.java
@@ -16,10 +16,7 @@
package com.intellij.ide.browsers.actions;
import com.intellij.ide.GeneralSettings;
-import com.intellij.ide.browsers.OpenInBrowserRequest;
-import com.intellij.ide.browsers.WebBrowser;
-import com.intellij.ide.browsers.WebBrowserManager;
-import com.intellij.ide.browsers.WebBrowserUrlProvider;
+import com.intellij.ide.browsers.*;
import com.intellij.openapi.actionSystem.ActionPlaces;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.Presentation;
@@ -68,10 +65,11 @@ public class OpenFileInDefaultBrowserAction extends DumbAwareAction {
@Nullable
private static WebBrowser findUsingBrowser() {
WebBrowserManager browserManager = WebBrowserManager.getInstance();
- if (browserManager.getDefaultBrowserMode() == WebBrowserManager.DefaultBrowser.FIRST) {
- return browserManager.getDefaultBrowser();
+ DefaultBrowserPolicy defaultBrowserPolicy = browserManager.getDefaultBrowserPolicy();
+ if (defaultBrowserPolicy == DefaultBrowserPolicy.FIRST || (defaultBrowserPolicy == DefaultBrowserPolicy.SYSTEM && !BrowserLauncherAppless.canUseSystemDefaultBrowserPolicy())) {
+ return browserManager.getFirstActiveBrowser();
}
- else if (browserManager.getDefaultBrowserMode() == WebBrowserManager.DefaultBrowser.ALTERNATIVE) {
+ else if (defaultBrowserPolicy == DefaultBrowserPolicy.ALTERNATIVE) {
String path = GeneralSettings.getInstance().getBrowserPath();
if (!StringUtil.isEmpty(path)) {
WebBrowser browser = browserManager.findBrowserById(path);
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 5cd056f869d9..3d0451d71b3d 100644
--- a/xml/impl/src/com/intellij/ide/browsers/impl/WebBrowserServiceImpl.java
+++ b/xml/impl/src/com/intellij/ide/browsers/impl/WebBrowserServiceImpl.java
@@ -18,6 +18,10 @@ package com.intellij.ide.browsers.impl;
import com.intellij.ide.browsers.OpenInBrowserRequest;
import com.intellij.ide.browsers.WebBrowserService;
import com.intellij.ide.browsers.WebBrowserUrlProvider;
+import com.intellij.lang.Language;
+import com.intellij.lang.html.HTMLLanguage;
+import com.intellij.lang.xhtml.XHTMLLanguage;
+import com.intellij.lang.xml.XMLLanguage;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.impl.http.HttpVirtualFile;
@@ -34,6 +38,11 @@ import java.util.Collection;
import java.util.Collections;
public class WebBrowserServiceImpl extends WebBrowserService {
+ public static boolean isHtmlOrXmlFile(@NotNull PsiElement element) {
+ Language language = element.getLanguage();
+ return language == HTMLLanguage.INSTANCE || language == XHTMLLanguage.INSTANCE || language == XMLLanguage.INSTANCE;
+ }
+
@NotNull
@Override
public Collection<Url> getUrlsToOpen(@NotNull OpenInBrowserRequest request, boolean preferLocalUrl) throws WebBrowserUrlProvider.BrowserException {
@@ -42,7 +51,7 @@ public class WebBrowserServiceImpl extends WebBrowserService {
return Collections.singleton(Urls.newFromVirtualFile(virtualFile));
}
- if (!preferLocalUrl || !HtmlUtil.isHtmlFile(request.getFile())) {
+ if (!preferLocalUrl || !isHtmlOrXmlFile(request.getFile())) {
WebBrowserUrlProvider provider = getProvider(request);
if (provider != null) {
if (request.getResult() != null) {
diff --git a/xml/impl/src/com/intellij/psi/formatter/xml/AbstractXmlBlock.java b/xml/impl/src/com/intellij/psi/formatter/xml/AbstractXmlBlock.java
index 6e1b89912814..b2b5b5ff8eee 100644
--- a/xml/impl/src/com/intellij/psi/formatter/xml/AbstractXmlBlock.java
+++ b/xml/impl/src/com/intellij/psi/formatter/xml/AbstractXmlBlock.java
@@ -17,6 +17,7 @@ package com.intellij.psi.formatter.xml;
import com.intellij.formatting.*;
import com.intellij.lang.*;
+import com.intellij.lang.xml.XMLLanguage;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.util.TextRange;
@@ -464,11 +465,28 @@ public abstract class AbstractXmlBlock extends AbstractBlock {
return myNode.getElementType() == XmlTokenType.XML_CDATA_END;
}
- public static boolean containsWhiteSpacesOnly(ASTNode node) {
- WhiteSpaceFormattingStrategy strategy = WhiteSpaceFormattingStrategyFactory.getStrategy(node.getPsi().getLanguage());
- String nodeText = node.getText();
- int length = nodeText.length();
- return strategy.check(nodeText, 0, length) >= length;
+ public static boolean containsWhiteSpacesOnly(@NotNull ASTNode node) {
+ PsiElement psiElement = node.getPsi();
+ if (psiElement instanceof PsiWhiteSpace) return true;
+ Language nodeLang = psiElement.getLanguage();
+ if (!nodeLang.isKindOf(XMLLanguage.INSTANCE) ||
+ isTextOnlyNode(node) ||
+ node.getElementType() == XmlElementType.XML_PROLOG) {
+ WhiteSpaceFormattingStrategy strategy = WhiteSpaceFormattingStrategyFactory.getStrategy(nodeLang);
+ int length = node.getTextLength();
+ return strategy.check(node.getChars(), 0, length) >= length;
+ }
+ return false;
+ }
+
+ private static boolean isTextOnlyNode(@NotNull ASTNode node) {
+ if (node.getPsi() instanceof XmlText) return true;
+ ASTNode firstChild = node.getFirstChildNode();
+ ASTNode lastChild = node.getLastChildNode();
+ if (firstChild != null && firstChild == lastChild && firstChild.getPsi() instanceof XmlText) {
+ return true;
+ }
+ return false;
}
}