diff --git a/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/ChooseLibrariesDialog.java b/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/ChooseLibrariesDialog.java index 2ff0bd8765be..1e54e93103c6 100644 --- a/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/ChooseLibrariesDialog.java +++ b/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/ChooseLibrariesDialog.java @@ -56,8 +56,8 @@ public class ChooseLibrariesDialog extends DialogWrapper { return myChooser.getMarkedElements(); } - private static class LibraryElementChooser extends ElementsChooser { - private LibraryElementChooser(final List elements) { + static class LibraryElementChooser extends ElementsChooser { + LibraryElementChooser(final List elements) { super(elements, false); } diff --git a/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryOptionsPanel.form b/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryOptionsPanel.form index f9f3a65c530a..9fafa7145819 100644 --- a/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryOptionsPanel.form +++ b/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryOptionsPanel.form @@ -1,25 +1,16 @@
- + - + - - - - - - - - - - + @@ -30,37 +21,17 @@ - - - - - - - - + - + - - - - - - - - - - - - - - + @@ -68,14 +39,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + diff --git a/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryOptionsPanel.java b/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryOptionsPanel.java index 15be376a25c7..3238e3efc19e 100644 --- a/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryOptionsPanel.java +++ b/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryOptionsPanel.java @@ -15,15 +15,19 @@ */ package com.intellij.facet.impl.ui.libraries; +import com.intellij.facet.ui.libraries.LibraryInfo; import com.intellij.ide.IdeBundle; +import com.intellij.ide.util.ElementsChooser; import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.libraries.Library; +import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainer; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.util.Computable; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.ui.RadioButtonEnumModel; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -31,6 +35,8 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.List; /** * @author Dmitry Avdeev @@ -39,42 +45,67 @@ public class LibraryOptionsPanel { private JLabel myMessage; private JPanel myPanel; - private JRadioButton myDownloadFromMavenButton; - private JRadioButton myDoNotCreateButton; private JButton myConfigureButton; - private JRadioButton myLocateOnDiskButton; + private JPanel myExistingLibrariesPanel; + private JLabel myExistingLibrariesLabel; + private ButtonGroup myButtonGroup; + private ElementsChooser myLibrariesChooser; private LibraryCompositionSettings myLibraryCompositionSettings; + private LibrariesContainer myLibrariesContainer; + + + private enum Choice { + DOWNLOAD, + PICK_FILES, + DO_NOT_CREATE + } + + private RadioButtonEnumModel myButtonEnumModel; + + public LibraryOptionsPanel(LibraryCompositionSettings libraryCompositionSettings, LibrariesContainer librariesContainer) { - public LibraryOptionsPanel(LibraryCompositionSettings libraryCompositionSettings) { myLibraryCompositionSettings = libraryCompositionSettings; + myLibrariesContainer = librariesContainer; + + List suitableLibraries = calculateSuitableLibraries(); + if (!suitableLibraries.isEmpty()) { + myLibraryCompositionSettings.setUsedLibraries(suitableLibraries); + } + + myLibrariesChooser = new ChooseLibrariesDialog.LibraryElementChooser(suitableLibraries); + myLibrariesChooser.getComponents()[0].setPreferredSize(new Dimension(10, 10)); // this makes scrollbars to work + myExistingLibrariesPanel.add(myLibrariesChooser); + myExistingLibrariesLabel.setLabelFor(myLibrariesChooser.getComponent()); + + myButtonEnumModel = RadioButtonEnumModel.bindEnum(Choice.class, myButtonGroup); ActionListener listener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateState(); } }; - myDownloadFromMavenButton.addActionListener(listener); - myLocateOnDiskButton.addActionListener(listener); - myDoNotCreateButton.addActionListener(listener); + myButtonEnumModel.addActionListener(listener); myConfigureButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { - if (myLocateOnDiskButton.isSelected()) { - EditLibraryDialog dialog = new EditLibraryDialog(myConfigureButton, myLibraryCompositionSettings); - if (myLibraryCompositionSettings.getAddedJars().isEmpty()) { - VirtualFile[] files = showFileChooser(); - Library.ModifiableModel modifiableModel = dialog.getLibrary().getModifiableModel(); - for (VirtualFile file : files) { - modifiableModel.addRoot(file, OrderRootType.CLASSES); + switch (myButtonEnumModel.getSelected()) { + case DOWNLOAD: + showDialog(new DownloadingOptionsDialog(myConfigureButton, myLibraryCompositionSettings)); + break; + case PICK_FILES: + EditLibraryDialog dialog = new EditLibraryDialog(myConfigureButton, myLibraryCompositionSettings); + if (myLibraryCompositionSettings.getAddedJars().isEmpty()) { + VirtualFile[] files = showFileChooser(); + Library.ModifiableModel modifiableModel = dialog.getLibrary().getModifiableModel(); + for (VirtualFile file : files) { + modifiableModel.addRoot(file, OrderRootType.CLASSES); + } } - modifiableModel.commit(); - } - showDialog(dialog); - } - else { - DownloadingOptionsDialog dialog = new DownloadingOptionsDialog(myConfigureButton, myLibraryCompositionSettings); - showDialog(dialog); + showDialog(dialog); + break; + case DO_NOT_CREATE: + break; } updateState(); } @@ -88,13 +119,28 @@ public class LibraryOptionsPanel { @Override public Point compute() { Point point = myConfigureButton.getLocationOnScreen(); - point.translate(- 50, - dialog.getSize().height); + point.translate(- 50, - dialog.getSize().height - 20); return point; } }); dialog.show(); } + private List calculateSuitableLibraries() { + LibraryInfo[] libraryInfos = myLibraryCompositionSettings.getLibraryInfos(); + RequiredLibrariesInfo requiredLibraries = new RequiredLibrariesInfo(libraryInfos); + List suitableLibraries = new ArrayList(); + Library[] libraries = myLibrariesContainer.getAllLibraries(); + for (Library library : libraries) { + RequiredLibrariesInfo.RequiredClassesNotFoundInfo info = + requiredLibraries.checkLibraries(myLibrariesContainer.getLibraryFiles(library, OrderRootType.CLASSES), false); + if (info == null || info.getLibraryInfos().length < libraryInfos.length) { + suitableLibraries.add(library); + } + } + return suitableLibraries; + } + private VirtualFile[] showFileChooser() { final FileChooserDescriptor descriptor = new FileChooserDescriptor(false, false, true, false, false, true); descriptor.setTitle(IdeBundle.message("file.chooser.select.paths.title")); @@ -112,41 +158,46 @@ public class LibraryOptionsPanel { } return dir; } - + private void updateState() { if (myMessage.isEnabled()) { myMessage.setForeground(Color.black); } myConfigureButton.setEnabled(true); - if (myDownloadFromMavenButton.isSelected()) { - String path = myLibraryCompositionSettings.getDirectoryForDownloadedLibrariesPath().substring(myLibraryCompositionSettings.getBaseDirectoryForDownloadedFiles().length()); - String message = MessageFormat.format("{0} jar(s) will be downloaded into {1} directory
" + - "{2} library {3} will be created", - myLibraryCompositionSettings.getLibraryInfos().length, - path, - myLibraryCompositionSettings.getLibraryLevel(), - myLibraryCompositionSettings.getLibraryName()); - myMessage.setText(message); - } - else if (myLocateOnDiskButton.isSelected()) { - if (myLibraryCompositionSettings.getAddedJars().isEmpty()) { - myMessage.setForeground(Color.red); - myMessage.setText("Press Configure button to add classes to the library"); - } - else { - String message = MessageFormat.format("{0} level library {1}
" + - "with {2} file(s) will be created", - myLibraryCompositionSettings.getLibraryLevel(), - myLibraryCompositionSettings.getLibraryName(), - myLibraryCompositionSettings.getAddedJars().size()); - myMessage.setText(message); - } - } - else { - myMessage.setText("No library will be created
" + - "You can add it later manually"); - myConfigureButton.setEnabled(false); + + String message = ""; + + switch (myButtonEnumModel.getSelected()) { + case DOWNLOAD: + String path = myLibraryCompositionSettings.getDirectoryForDownloadedLibrariesPath() + .substring(myLibraryCompositionSettings.getBaseDirectoryForDownloadedFiles().length()); + message = MessageFormat.format("{0} jar(s) will be downloaded into {1} directory
" + + "{2} library {3} will be created", + myLibraryCompositionSettings.getLibraryInfos().length, + path, + myLibraryCompositionSettings.getLibraryLevel(), + myLibraryCompositionSettings.getLibraryName()); + break; + case PICK_FILES: + if (myLibraryCompositionSettings.getAddedJars().isEmpty()) { + myMessage.setForeground(Color.red); + message = "Press Configure button to add classes to the library"; + } + else { + message = MessageFormat.format("{0} level library {1}" + + "with {2} file(s) will be created", + myLibraryCompositionSettings.getLibraryLevel(), + myLibraryCompositionSettings.getLibraryName(), + myLibraryCompositionSettings.getAddedJars().size()); + } + break; + case DO_NOT_CREATE: + message = "No new library will be created"; + myConfigureButton.setEnabled(false); + break; } + + myMessage.setText("" + message + ""); } public LibraryCompositionSettings getLibraryCompositionSettings() { @@ -155,7 +206,7 @@ public class LibraryOptionsPanel { public void apply() { - + myLibraryCompositionSettings.setUsedLibraries(myLibrariesChooser.getMarkedElements()); } public JComponent getMainPanel() { diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportNode.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportNode.java index e49fffbe98c1..bf9e8a1f3fe3 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportNode.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportNode.java @@ -80,7 +80,7 @@ public class FrameworkSupportNode extends CheckedTreeNode { final LibraryCompositionSettings libraryCompositionSettings = getLibraryCompositionSettings(); if (myLibraryCompositionOptionsPanel == null || !myLibraryCompositionOptionsPanel.getLibraryCompositionSettings().equals(libraryCompositionSettings)) { if (libraryCompositionSettings != null) { - myLibraryCompositionOptionsPanel = new LibraryOptionsPanel(libraryCompositionSettings); + myLibraryCompositionOptionsPanel = new LibraryOptionsPanel(libraryCompositionSettings, librariesContainer); } else { myLibraryCompositionOptionsPanel = null;