blob: af04e58963875e83f225c1118ce1dc05d215189d [file] [log] [blame]
/*
* 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;
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.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
public class BrowserSelector {
private final ComboboxWithBrowseButton myBrowserComboWithBrowse;
private MutableCollectionComboBoxModel<WebBrowser> myModel;
public BrowserSelector() {
this(true);
}
public BrowserSelector(final boolean allowDefaultBrowser) {
this(new Condition<WebBrowser>() {
@Override
public boolean value(WebBrowser browser) {
return allowDefaultBrowser || browser != null;
}
});
}
public BrowserSelector(@NotNull final Condition<WebBrowser> browserCondition) {
myModel = createBrowsersComboModel(browserCondition);
myBrowserComboWithBrowse = new ComboboxWithBrowseButton(new ComboBox(myModel));
myBrowserComboWithBrowse.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
WebBrowserManager browserManager = WebBrowserManager.getInstance();
long modificationCount = browserManager.getModificationCount();
ShowSettingsUtil.getInstance().editConfigurable(myBrowserComboWithBrowse, new BrowserSettings());
WebBrowser selectedItem = getSelected();
if (modificationCount != browserManager.getModificationCount()) {
myModel = createBrowsersComboModel(browserCondition);
//noinspection unchecked
myBrowserComboWithBrowse.getComboBox().setModel(myModel);
}
if (selectedItem != null) {
setSelected(selectedItem);
}
}
});
//noinspection unchecked
myBrowserComboWithBrowse.getComboBox().setRenderer(new ListCellRendererWrapper<WebBrowser>() {
@Override
public void customize(JList list,
WebBrowser value,
int index,
boolean selected,
boolean hasFocus) {
Icon baseIcon;
if (value == null) {
WebBrowser firstBrowser = WebBrowserManager.getInstance().getFirstActiveBrowser();
baseIcon = firstBrowser == null ? PlatformIcons.WEB_ICON : firstBrowser.getIcon();
}
else {
baseIcon = value.getIcon();
}
setIcon(myBrowserComboWithBrowse.isEnabled() ? baseIcon : IconLoader.getDisabledIcon(baseIcon));
setText(value != null ? value.getName() : "Default");
}
});
}
public JComponent getMainComponent() {
return myBrowserComboWithBrowse;
}
private static MutableCollectionComboBoxModel<WebBrowser> createBrowsersComboModel(@NotNull Condition<WebBrowser> browserCondition) {
List<WebBrowser> list = new ArrayList<WebBrowser>();
if (browserCondition.value(null)) {
list.add(null);
}
list.addAll(WebBrowserManager.getInstance().getBrowsers(browserCondition));
return new MutableCollectionComboBoxModel<WebBrowser>(list);
}
@Nullable
public WebBrowser getSelected() {
return myModel.getSelected();
}
@Nullable
public String getSelectedBrowserId() {
WebBrowser browser = getSelected();
return browser != null ? browser.getId().toString() : null;
}
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();
}
}