blob: b18e8b1c111c9a128f0829de1bc6778e5db7bdbc [file] [log] [blame]
/*
* Copyright 2000-2013 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.facet.impl.ui.libraries;
import com.intellij.framework.library.DownloadableLibraryFileDescription;
import com.intellij.framework.library.DownloadableLibraryType;
import com.intellij.framework.library.FrameworkLibraryVersion;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.project.ProjectBundle;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryNameAndLevelPanel;
import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainer;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.ui.CheckBoxList;
import com.intellij.ui.CheckBoxListListener;
import com.intellij.ui.CollectionListModel;
import com.intellij.ui.ListCellRendererWrapper;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.FormBuilder;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
/**
* @author Dmitry Avdeev
*/
public class DownloadingOptionsDialog extends DialogWrapper {
private static final Logger LOG = Logger.getInstance("#com.intellij.facet.impl.ui.libraries.DownloadingOptionsDialog");
private enum AdditionalDownloadType {SOURCES, DOCUMENTATION}
private JPanel myPanel;
private CheckBoxList myFilesList;
private TextFieldWithBrowseButton myDirectoryField;
private JCheckBox myDownloadSourcesCheckBox;
private JCheckBox myDownloadJavadocsCheckBox;
private JLabel myFilesToDownloadLabel;
private JLabel myCopyDownloadedFilesToLabel;
private JPanel myNameWrappingPanel;
private JComboBox myVersionComboBox;
private final LibraryNameAndLevelPanel myNameAndLevelPanel;
private DownloadableLibraryType myLibraryType;
private FrameworkLibraryVersion myLastSelectedVersion;
public DownloadingOptionsDialog(@NotNull Component parent, @NotNull final LibraryDownloadSettings settings, @NotNull List<? extends FrameworkLibraryVersion> versions,
final boolean showNameAndLevel) {
super(parent, true);
setTitle("Downloading Options");
myLibraryType = settings.getLibraryType();
LOG.assertTrue(!versions.isEmpty());
final FormBuilder builder = LibraryNameAndLevelPanel.createFormBuilder();
myVersionComboBox = new ComboBox();
for (FrameworkLibraryVersion version : versions) {
myVersionComboBox.addItem(version);
}
myVersionComboBox.setRenderer(new ListCellRendererWrapper<FrameworkLibraryVersion>() {
@Override
public void customize(JList list, FrameworkLibraryVersion value, int index, boolean selected, boolean hasFocus) {
setText(value.getDefaultLibraryName());
}
});
myVersionComboBox.setSelectedItem(settings.getVersion());
if (versions.size() > 1) {
builder.addLabeledComponent("&Version:", myVersionComboBox);
}
if (showNameAndLevel) {
myNameAndLevelPanel = new LibraryNameAndLevelPanel(builder, settings.getLibraryName(), settings.getLibraryLevel());
}
else {
myNameAndLevelPanel = null;
}
myNameWrappingPanel.add(builder.getPanel());
onVersionChanged(settings.getSelectedDownloads());
myVersionComboBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
onVersionChanged(null);
}
});
myFilesList.setBorder(null);
myFilesToDownloadLabel.setLabelFor(myFilesList);
myDirectoryField.addBrowseFolderListener(ProjectBundle.message("file.chooser.directory.for.downloaded.libraries.title"),
ProjectBundle.message("file.chooser.directory.for.downloaded.libraries.description"), null,
FileChooserDescriptorFactory.createSingleFolderDescriptor());
myCopyDownloadedFilesToLabel.setLabelFor(myDirectoryField);
myDirectoryField.setText(FileUtil.toSystemDependentName(settings.getDirectoryForDownloadedLibrariesPath()));
boolean sourcesCheckboxVisible = false;
boolean javadocCheckboxVisible = false;
for (FrameworkLibraryVersion version : versions) {
sourcesCheckboxVisible |= haveAdditionalDownloads(version.getFiles(), AdditionalDownloadType.SOURCES);
javadocCheckboxVisible |= haveAdditionalDownloads(version.getFiles(), AdditionalDownloadType.DOCUMENTATION);
}
myDownloadSourcesCheckBox.setVisible(sourcesCheckboxVisible);
myDownloadJavadocsCheckBox.setVisible(javadocCheckboxVisible);
myFilesList.setCheckBoxListListener(new CheckBoxListListener() {
@Override
public void checkBoxSelectionChanged(int index, boolean value) {
updateSourcesAndJavadocCheckboxes();
}
});
updateSourcesAndJavadocCheckboxes();
myDownloadSourcesCheckBox.setSelected(settings.isDownloadSources());
myDownloadJavadocsCheckBox.setSelected(settings.isDownloadJavaDocs());
init();
}
private void updateSourcesAndJavadocCheckboxes() {
final FrameworkLibraryVersion version = getSelectedVersion();
boolean sourcesCheckboxEnabled;
boolean javadocCheckboxEnabled;
if (version == null) {
sourcesCheckboxEnabled = javadocCheckboxEnabled = false;
}
else {
final List<DownloadableLibraryFileDescription> descriptions = getSelectedDownloads(version);
sourcesCheckboxEnabled = haveAdditionalDownloads(descriptions, AdditionalDownloadType.SOURCES);
javadocCheckboxEnabled = haveAdditionalDownloads(descriptions, AdditionalDownloadType.DOCUMENTATION);
}
setEnabled(myDownloadSourcesCheckBox, sourcesCheckboxEnabled);
setEnabled(myDownloadJavadocsCheckBox, javadocCheckboxEnabled);
}
private static void setEnabled(final JCheckBox checkBox, final boolean enabled) {
if (!enabled) {
checkBox.setSelected(false);
}
checkBox.setEnabled(enabled);
}
private static boolean haveAdditionalDownloads(final List<? extends DownloadableLibraryFileDescription> descriptions, AdditionalDownloadType type) {
for (DownloadableLibraryFileDescription description : descriptions) {
if (type == AdditionalDownloadType.SOURCES && description.getSourcesDescription() != null
|| type == AdditionalDownloadType.DOCUMENTATION && description.getDocumentationDescription() != null) {
return true;
}
}
return false;
}
private void onVersionChanged(final @Nullable List<? extends DownloadableLibraryFileDescription> selectedFiles) {
final FrameworkLibraryVersion version = getSelectedVersion();
if (Comparing.equal(myLastSelectedVersion, version)) return;
if (version != null) {
final List<? extends DownloadableLibraryFileDescription> downloads = version.getFiles();
myFilesList.setModel(new CollectionListModel<JCheckBox>(
ContainerUtil.map2Array(downloads, JCheckBox.class, new Function<DownloadableLibraryFileDescription, JCheckBox>() {
@Override
public JCheckBox fun(DownloadableLibraryFileDescription description) {
final boolean selected = selectedFiles != null ? selectedFiles.contains(description) : !description.isOptional();
return new JCheckBox(description.getPresentableFileName(), selected);
}
})));
if (myNameAndLevelPanel != null) {
myNameAndLevelPanel.setDefaultName(version.getDefaultLibraryName());
}
}
updateSourcesAndJavadocCheckboxes();
myLastSelectedVersion = version;
}
@Override
protected JComponent createCenterPanel() {
return myPanel;
}
@Override
public JComponent getPreferredFocusedComponent() {
return myFilesList;
}
@Nullable
public FrameworkLibraryVersion getSelectedVersion() {
return (FrameworkLibraryVersion)myVersionComboBox.getSelectedItem();
}
@Nullable
public static LibraryDownloadSettings showDialog(@NotNull JComponent parent,
@NotNull LibraryDownloadSettings settings,
List<? extends FrameworkLibraryVersion> versions,
boolean showNameAndLevel) {
final DownloadingOptionsDialog dialog = new DownloadingOptionsDialog(parent, settings, versions, showNameAndLevel);
dialog.show();
if (!dialog.isOK()) {
return null;
}
return dialog.createSettings();
}
private List<DownloadableLibraryFileDescription> getSelectedDownloads(FrameworkLibraryVersion version) {
List<DownloadableLibraryFileDescription> selected = new ArrayList<DownloadableLibraryFileDescription>();
List<? extends DownloadableLibraryFileDescription> downloads = version.getFiles();
for (int i = 0; i < downloads.size(); i++) {
if (myFilesList.isItemSelected(i)) {
selected.add(downloads.get(i));
}
}
return selected;
}
private LibraryDownloadSettings createSettings() {
final FrameworkLibraryVersion version = getSelectedVersion();
LOG.assertTrue(version != null);
String libraryName;
LibrariesContainer.LibraryLevel libraryLevel;
if (myNameAndLevelPanel != null) {
libraryName = myNameAndLevelPanel.getLibraryName();
libraryLevel = myNameAndLevelPanel.getLibraryLevel();
}
else {
libraryName = version.getDefaultLibraryName();
libraryLevel = LibrariesContainer.LibraryLevel.PROJECT;
}
final String path = FileUtil.toSystemIndependentName(myDirectoryField.getText());
List<DownloadableLibraryFileDescription> selected = getSelectedDownloads(version);
return new LibraryDownloadSettings(version, myLibraryType, path, libraryName, libraryLevel, selected,
myDownloadSourcesCheckBox.isSelected(), myDownloadJavadocsCheckBox.isSelected());
}
}