diff --git a/platform/platform-api/src/com/intellij/ui/AbstractCollectionComboBoxModel.java b/platform/platform-api/src/com/intellij/ui/AbstractCollectionComboBoxModel.java index 21b24e8ac19b..c5413ccdf6e0 100644 --- a/platform/platform-api/src/com/intellij/ui/AbstractCollectionComboBoxModel.java +++ b/platform/platform-api/src/com/intellij/ui/AbstractCollectionComboBoxModel.java @@ -53,6 +53,11 @@ public abstract class AbstractCollectionComboBoxModel extends AbstractListMod return mySelection; } + @Nullable + public T getSelected() { + return mySelection; + } + public void update() { super.fireContentsChanged(this, -1, -1); } diff --git a/platform/platform-api/src/com/intellij/ui/MutableCollectionComboBoxModel.java b/platform/platform-api/src/com/intellij/ui/MutableCollectionComboBoxModel.java index 998970f5eaa6..92408f587360 100644 --- a/platform/platform-api/src/com/intellij/ui/MutableCollectionComboBoxModel.java +++ b/platform/platform-api/src/com/intellij/ui/MutableCollectionComboBoxModel.java @@ -47,4 +47,13 @@ public class MutableCollectionComboBoxModel extends AbstractCollectionComboBo myItems = items; super.update(); } + + public void addItem(T item) { + myItems.add(item); + + fireIntervalAdded(this, myItems.size() - 1, myItems.size() - 1); + if (myItems.size() == 1 && getSelectedItem() == null && item != null) { + setSelectedItem(item); + } + } } diff --git a/xml/impl/src/com/intellij/ide/browsers/BrowserSelector.java b/xml/impl/src/com/intellij/ide/browsers/BrowserSelector.java index 9bbadf3be254..b1881be553a5 100644 --- a/xml/impl/src/com/intellij/ide/browsers/BrowserSelector.java +++ b/xml/impl/src/com/intellij/ide/browsers/BrowserSelector.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * 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. @@ -17,11 +17,13 @@ package com.intellij.ide.browsers; import com.intellij.openapi.options.ShowSettingsUtil; import com.intellij.openapi.ui.ComboBox; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.IconLoader; import com.intellij.ui.ComboboxWithBrowseButton; import com.intellij.ui.ListCellRendererWrapper; +import com.intellij.ui.MutableCollectionComboBoxModel; import com.intellij.util.PlatformIcons; -import org.jdesktop.swingx.combobox.ListComboBoxModel; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -32,9 +34,20 @@ import java.util.List; public class BrowserSelector { private final ComboboxWithBrowseButton myBrowserComboWithBrowse; + private MutableCollectionComboBoxModel myModel; public BrowserSelector(final boolean allowDefaultBrowser) { - myBrowserComboWithBrowse = new ComboboxWithBrowseButton(new ComboBox(createBrowsersComboModel(allowDefaultBrowser))); + this(new Condition() { + @Override + public boolean value(WebBrowser browser) { + return allowDefaultBrowser || browser != null; + } + }); + } + + public BrowserSelector(@NotNull final Condition browserCondition) { + myModel = createBrowsersComboModel(browserCondition); + myBrowserComboWithBrowse = new ComboboxWithBrowseButton(new ComboBox(myModel)); myBrowserComboWithBrowse.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -44,8 +57,9 @@ public class BrowserSelector { WebBrowser selectedItem = getSelected(); if (modificationCount != browserManager.getModificationCount()) { + myModel = createBrowsersComboModel(browserCondition); //noinspection unchecked - myBrowserComboWithBrowse.getComboBox().setModel(createBrowsersComboModel(allowDefaultBrowser)); + myBrowserComboWithBrowse.getComboBox().setModel(myModel); } if (selectedItem != null) { setSelected(selectedItem); @@ -61,7 +75,14 @@ public class BrowserSelector { int index, boolean selected, boolean hasFocus) { - Icon baseIcon = value != null ? value.getIcon() : PlatformIcons.WEB_ICON; + Icon baseIcon; + if (value == null) { + WebBrowser defaultBrowser = WebBrowserManager.getInstance().getDefaultBrowser(); + baseIcon = defaultBrowser == null ? PlatformIcons.WEB_ICON : defaultBrowser.getIcon(); + } + else { + baseIcon = value.getIcon(); + } setIcon(myBrowserComboWithBrowse.isEnabled() ? baseIcon : IconLoader.getDisabledIcon(baseIcon)); setText(value != null ? value.getName() : "Default"); } @@ -72,30 +93,18 @@ public class BrowserSelector { return myBrowserComboWithBrowse; } - @SuppressWarnings("Since15") - private static ListComboBoxModel createBrowsersComboModel(boolean allowDefaultBrowser) { - List activeBrowsers = new ArrayList(); - if (allowDefaultBrowser) { - activeBrowsers.add(null); + private static MutableCollectionComboBoxModel createBrowsersComboModel(@NotNull Condition browserCondition) { + List list = new ArrayList(); + if (browserCondition.value(null)) { + list.add(null); } - activeBrowsers.addAll(WebBrowserManager.getInstance().getActiveBrowsers()); - return new ListComboBoxModel(activeBrowsers); - } - - @SuppressWarnings({"deprecation", "UnusedDeclaration"}) - @Nullable - @Deprecated - /** - * @deprecated to remove in IDEA 14 - */ - public BrowserFamily getSelectedBrowser() { - WebBrowser selected = getSelected(); - return selected == null ? null : selected.getFamily(); + list.addAll(WebBrowserManager.getInstance().getBrowsers(browserCondition)); + return new MutableCollectionComboBoxModel(list); } @Nullable public WebBrowser getSelected() { - return (WebBrowser)myBrowserComboWithBrowse.getComboBox().getSelectedItem(); + return myModel.getSelected(); } @Nullable @@ -104,16 +113,20 @@ public class BrowserSelector { return browser != null ? browser.getId().toString() : null; } - @SuppressWarnings("UnusedDeclaration") - @Deprecated - /** - * @deprecated to remove in IDEA 14 - */ - public void setSelectedBrowser(@SuppressWarnings("deprecation") @Nullable BrowserFamily selectedItem) { - setSelected(selectedItem == null ? null : WebBrowserManager.getInstance().findBrowser(selectedItem)); - } - public void setSelected(@Nullable WebBrowser selectedItem) { myBrowserComboWithBrowse.getComboBox().setSelectedItem(selectedItem); } + + public boolean addAndSelect(@NotNull WebBrowser browser) { + if (myModel.contains(browser)) { + return false; + } + + myModel.addItem(browser); + return true; + } + + public int getSize() { + return myModel.getSize(); + } } diff --git a/xml/impl/src/com/intellij/ide/browsers/BrowserSettingsPanel.java b/xml/impl/src/com/intellij/ide/browsers/BrowserSettingsPanel.java index 4ec344d1ee28..8b58a16b73f9 100644 --- a/xml/impl/src/com/intellij/ide/browsers/BrowserSettingsPanel.java +++ b/xml/impl/src/com/intellij/ide/browsers/BrowserSettingsPanel.java @@ -309,7 +309,7 @@ final class BrowserSettingsPanel { GeneralSettings generalSettings = GeneralSettings.getInstance(); DefaultBrowser defaultBrowser = getDefaultBrowser(); - if (browserManager.getDefaultBrowser() != defaultBrowser || generalSettings.isConfirmExtractFiles() != confirmExtractFiles.isSelected()) { + if (browserManager.getDefaultBrowserMode() != defaultBrowser || generalSettings.isConfirmExtractFiles() != confirmExtractFiles.isSelected()) { return true; } @@ -344,7 +344,7 @@ final class BrowserSettingsPanel { public void reset() { GeneralSettings settings = GeneralSettings.getInstance(); - DefaultBrowser defaultBrowser = WebBrowserManager.getInstance().getDefaultBrowser(); + DefaultBrowser defaultBrowser = WebBrowserManager.getInstance().getDefaultBrowserMode(); defaultBrowserComboBox.setSelectedItem(defaultBrowser); confirmExtractFiles.setSelected(settings.isConfirmExtractFiles()); diff --git a/xml/impl/src/com/intellij/ide/browsers/WebBrowserManager.java b/xml/impl/src/com/intellij/ide/browsers/WebBrowserManager.java index 8072c8185111..64cfda4e9882 100644 --- a/xml/impl/src/com/intellij/ide/browsers/WebBrowserManager.java +++ b/xml/impl/src/com/intellij/ide/browsers/WebBrowserManager.java @@ -17,6 +17,8 @@ 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.ModificationTracker; import com.intellij.openapi.util.text.StringUtil; @@ -75,7 +77,8 @@ public class WebBrowserManager implements PersistentStateComponent, Mod SYSTEM, FIRST, ALTERNATIVE } - public DefaultBrowser getDefaultBrowser() { + @NotNull + public DefaultBrowser getDefaultBrowserMode() { return defaultBrowser; } @@ -246,9 +249,19 @@ public class WebBrowserManager implements PersistentStateComponent, Mod @NotNull public List getActiveBrowsers() { + return getBrowsers(Conditions.alwaysTrue(), true); + } + + @NotNull + public List getBrowsers(@NotNull Condition condition) { + return getBrowsers(condition, true); + } + + @NotNull + public List getBrowsers(@NotNull Condition condition, boolean onlyActive) { List result = new SmartList(); for (ConfigurableWebBrowser browser : browsers) { - if (browser.isActive()) { + if ((!onlyActive || browser.isActive()) && condition.value(browser)) { result.add(browser); } } @@ -311,6 +324,12 @@ public class WebBrowserManager implements PersistentStateComponent, Mod @Nullable public WebBrowser findBrowser(@NotNull BrowserFamily family) { + for (ConfigurableWebBrowser browser : browsers) { + if (browser.isActive() && family.equals(browser.getFamily())) { + return browser; + } + } + for (ConfigurableWebBrowser browser : browsers) { if (family.equals(browser.getFamily())) { return browser; @@ -324,6 +343,16 @@ public class WebBrowserManager implements PersistentStateComponent, Mod return !(browser instanceof ConfigurableWebBrowser) || ((ConfigurableWebBrowser)browser).isActive(); } + @Nullable + public WebBrowser getDefaultBrowser() { + for (ConfigurableWebBrowser browser : browsers) { + if (browser.isActive()) { + return browser; + } + } + return null; + } + @Override public long getModificationCount() { return modificationCount; 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 80ddd286fe5c..45cf021bbef8 100644 --- a/xml/impl/src/com/intellij/ide/browsers/actions/OpenFileInDefaultBrowserAction.java +++ b/xml/impl/src/com/intellij/ide/browsers/actions/OpenFileInDefaultBrowserAction.java @@ -16,14 +16,16 @@ package com.intellij.ide.browsers.actions; import com.intellij.ide.GeneralSettings; -import com.intellij.ide.browsers.*; +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.openapi.actionSystem.ActionPlaces; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.util.containers.ContainerUtil; import com.intellij.xml.util.HtmlUtil; import org.jetbrains.annotations.Nullable; @@ -66,10 +68,10 @@ public class OpenFileInDefaultBrowserAction extends DumbAwareAction { @Nullable private static WebBrowser findUsingBrowser() { WebBrowserManager browserManager = WebBrowserManager.getInstance(); - if (browserManager.getDefaultBrowser() == WebBrowserManager.DefaultBrowser.FIRST) { - return ContainerUtil.getFirstItem(browserManager.getActiveBrowsers()); + if (browserManager.getDefaultBrowserMode() == WebBrowserManager.DefaultBrowser.FIRST) { + return browserManager.getDefaultBrowser(); } - else if (browserManager.getDefaultBrowser() == WebBrowserManager.DefaultBrowser.ALTERNATIVE) { + else if (browserManager.getDefaultBrowserMode() == WebBrowserManager.DefaultBrowser.ALTERNATIVE) { String path = GeneralSettings.getInstance().getBrowserPath(); if (!StringUtil.isEmpty(path)) { WebBrowser browser = browserManager.findBrowserById(path);