blob: 5f144461b74ee7a9a1929ad82c45614cca125bd8 [file] [log] [blame]
/*
* Copyright 2000-2012 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.util.scopeChooser;
import com.intellij.ui.ListCellRendererWrapper;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.ComponentWithBrowseButton;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.packageDependencies.DefaultScopesProvider;
import com.intellij.packageDependencies.DependencyValidationManager;
import com.intellij.psi.search.scope.packageSet.NamedScope;
import com.intellij.psi.search.scope.packageSet.PackageSet;
import com.intellij.ui.components.editors.JBComboBoxTableCellEditorComponent;
import com.intellij.util.Function;
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.Arrays;
import java.util.Collection;
import java.util.Map;
public class PackageSetChooserCombo extends ComponentWithBrowseButton<JComponent> {
private static final Logger LOG = Logger.getInstance("#" + PackageSetChooserCombo.class.getName());
private final Project myProject;
public PackageSetChooserCombo(final Project project, final String preselect) {
this(project, preselect, true, true);
}
public PackageSetChooserCombo(final Project project, @Nullable final String preselect, final boolean enableBrowseButton, final boolean useCombo) {
super(useCombo ? new JComboBox() : new JBComboBoxTableCellEditorComponent(), null);
myProject = project;
final JComponent component = getChildComponent();
if (component instanceof JComboBox) {
component.setBorder(null);
}
if (enableBrowseButton) {
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final NamedScope scope;
if (component instanceof JComboBox) {
scope = (NamedScope)((JComboBox)component).getSelectedItem();
}
else {
scope = (NamedScope)((JBComboBoxTableCellEditorComponent)component).getEditorValue();
}
if (scope instanceof NamedScope.UnnamedScope) {
@SuppressWarnings({"MismatchedQueryAndUpdateOfCollection"})
final Map<String, PackageSet> unnamedScopes = DependencyValidationManager.getInstance(myProject).getUnnamedScopes();
final EditUnnamedScopesDialog dlg = new EditUnnamedScopesDialog(scope);
dlg.show();
if (dlg.isOK()) {
final PackageSet packageSet = scope.getValue();
LOG.assertTrue(packageSet != null);
unnamedScopes.remove(packageSet.getText());
final PackageSet editedScope = dlg.getScope();
if (editedScope != null) {
unnamedScopes.put(editedScope.getText(), editedScope);
}
rebuild();
if (editedScope != null) {
selectScope(editedScope.getText());
}
}
}
else {
final EditScopesDialog dlg = EditScopesDialog.showDialog(myProject, scope.getName(), true);
if (dlg.isOK()) {
rebuild();
final NamedScope namedScope = dlg.getSelectedScope();
if (namedScope != null) {
selectScope(namedScope.getName());
}
}
}
}
});
} else {
getButton().setVisible(false);
}
if (component instanceof JComboBox) {
((JComboBox)component).setRenderer(new ListCellRendererWrapper<NamedScope>() {
@Override
public void customize(JList list, NamedScope value, int index, boolean selected, boolean hasFocus) {
setText(value == null ? "" : value.getName());
}
});
}
else {
((JBComboBoxTableCellEditorComponent)component).setToString(new Function<Object, String>() {
@Override public String fun(Object o) { return o == null ? "" : ((NamedScope)o).getName(); }
});
}
rebuild();
selectScope(preselect);
}
private void selectScope(final String preselect) {
final JComponent component = getChildComponent();
if (preselect != null) {
if (component instanceof JComboBox) {
final DefaultComboBoxModel model = (DefaultComboBoxModel)((JComboBox)component).getModel();
for (int i = 0; i < model.getSize(); i++) {
final NamedScope descriptor = (NamedScope)model.getElementAt(i);
if (preselect.equals(descriptor.getName())) {
((JComboBox)component).setSelectedIndex(i);
break;
}
}
}
else {
final Object[] options = ((JBComboBoxTableCellEditorComponent)component).getOptions();
for (Object option : options) {
final NamedScope descriptor = (NamedScope)option;
if (preselect.equals(descriptor.getName())) {
((JBComboBoxTableCellEditorComponent)component).setDefaultValue(descriptor);
break;
}
}
}
}
}
private void rebuild() {
final JComponent component = getChildComponent();
final NamedScope[] model = createModel();
if (component instanceof JComboBox) {
((JComboBox)component).setModel(new DefaultComboBoxModel(model));
}
else {
((JBComboBoxTableCellEditorComponent)component).setOptions(model);
}
}
protected NamedScope[] createModel() {
final Collection<NamedScope> model = new ArrayList<NamedScope>();
final DependencyValidationManager manager = DependencyValidationManager.getInstance(myProject);
model.addAll(Arrays.asList(manager.getScopes()));
for (PackageSet unnamedScope : manager.getUnnamedScopes().values()) {
model.add(new NamedScope.UnnamedScope(unnamedScope));
}
model.remove(DefaultScopesProvider.getInstance(myProject).getProblemsScope());
return model.toArray(new NamedScope[model.size()]);
}
@Nullable
public NamedScope getSelectedScope() {
final JComponent component = getChildComponent();
if (component instanceof JComboBox) {
int idx = ((JComboBox)component).getSelectedIndex();
if (idx < 0) return null;
return (NamedScope)((JComboBox)component).getSelectedItem();
}
else {
return (NamedScope)((JBComboBoxTableCellEditorComponent)component).getEditorValue();
}
}
private class EditUnnamedScopesDialog extends DialogWrapper {
private PackageSet myScope;
private final ScopeEditorPanel myPanel;
public EditUnnamedScopesDialog(final NamedScope scope) {
super(PackageSetChooserCombo.this, false);
myScope = scope.getValue();
myPanel = new ScopeEditorPanel(myProject, DependencyValidationManager.getInstance(myProject));
init();
myPanel.reset(myScope, null);
}
@Override
@Nullable
protected JComponent createCenterPanel() {
return myPanel.getPanel();
}
@Override
protected void doOKAction() {
myScope = myPanel.getCurrentScope();
super.doOKAction();
}
public PackageSet getScope() {
return myScope;
}
}
}