diff options
Diffstat (limited to 'xml/impl/src/com/intellij')
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; } } |