diff --git a/java/idea-ui/src/com/intellij/ide/projectView/actions/CreateLibraryFromFilesDialog.java b/java/idea-ui/src/com/intellij/ide/projectView/actions/CreateLibraryFromFilesDialog.java index 148a4102f3cd..eac8407abcaf 100644 --- a/java/idea-ui/src/com/intellij/ide/projectView/actions/CreateLibraryFromFilesDialog.java +++ b/java/idea-ui/src/com/intellij/ide/projectView/actions/CreateLibraryFromFilesDialog.java @@ -25,15 +25,14 @@ import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.libraries.ui.OrderRoot; import com.intellij.openapi.roots.ui.configuration.ModulesCombobox; +import com.intellij.openapi.roots.ui.configuration.libraries.LibraryEditingUtil; import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryNameAndLevelPanel; import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainer; import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainerFactory; import com.intellij.openapi.ui.DialogWrapper; -import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.DocumentAdapter; -import com.intellij.util.PathUtil; import com.intellij.util.ui.FormBuilder; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -72,7 +71,7 @@ public class CreateLibraryFromFilesDialog extends DialogWrapper { myModifiableModel = null; myLibrariesContainer = LibrariesContainerFactory.createContainer(project); } - myDefaultName = myLibrariesContainer.suggestUniqueLibraryName(suggestLibraryName(roots)); + myDefaultName = myLibrariesContainer.suggestUniqueLibraryName(LibraryEditingUtil.suggestLibraryName(roots)); myNameAndLevelPanel = new LibraryNameAndLevelPanel(builder, myDefaultName, myLibrariesContainer.getAvailableLevels(), LibrariesContainer.LibraryLevel.PROJECT); myNameAndLevelPanel.setDefaultName(myDefaultName); myModulesCombobox = new ModulesCombobox(); @@ -137,13 +136,6 @@ public class CreateLibraryFromFilesDialog extends DialogWrapper { return myNameAndLevelPanel.getLibraryNameField(); } - private static String suggestLibraryName(List roots) { - if (roots.size() >= 1) { - return FileUtil.getNameWithoutExtension(PathUtil.getFileName(roots.get(0).getFile().getPath())); - } - return "unnamed"; - } - @Override protected void doOKAction() { final LibrariesContainer.LibraryLevel level = myNameAndLevelPanel.getLibraryLevel(); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraries/LibraryEditingUtil.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraries/LibraryEditingUtil.java index bf929fb37872..34b53b334175 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraries/LibraryEditingUtil.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraries/LibraryEditingUtil.java @@ -30,15 +30,15 @@ import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.libraries.LibraryTable; import com.intellij.openapi.roots.libraries.LibraryTablePresentation; import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar; +import com.intellij.openapi.roots.libraries.ui.OrderRoot; import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesModifiableModel; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.util.PathUtil; import org.jetbrains.annotations.NotNull; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * @author nik @@ -66,8 +66,8 @@ public class LibraryEditingUtil { return false; } - public static String suggestNewLibraryName(LibraryTable.ModifiableModel table) { - return suggestNewLibraryName(table, "Unnamed"); + public static String suggestNewLibraryName(LibraryTable.ModifiableModel table, List roots) { + return suggestNewLibraryName(table, suggestLibraryName(roots)); } public static String suggestNewLibraryName(LibraryTable.ModifiableModel table, @@ -80,6 +80,13 @@ public class LibraryEditingUtil { return candidateName; } + public static String suggestLibraryName(@NotNull List roots) { + if (roots.size() >= 1) { + return FileUtil.getNameWithoutExtension(PathUtil.getFileName(roots.get(0).getFile().getPath())); + } + return "Unnamed"; + } + public static Predicate getNotAddedLibrariesCondition(final ModuleRootModel rootModel) { final OrderEntry[] orderEntries = rootModel.getOrderEntries(); final Set result = new HashSet(orderEntries.length); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/CreateNewLibraryAction.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/CreateNewLibraryAction.java index d4e161e2466b..b6edaeb3c411 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/CreateNewLibraryAction.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/CreateNewLibraryAction.java @@ -19,13 +19,15 @@ import com.intellij.ide.IdeBundle; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.fileChooser.FileChooser; +import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.libraries.LibraryType; -import com.intellij.openapi.roots.ui.configuration.ChooseModulesDialog; +import com.intellij.openapi.roots.libraries.ui.LibraryRootsComponentDescriptor; +import com.intellij.openapi.roots.libraries.ui.OrderRoot; import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable; import com.intellij.openapi.roots.ui.configuration.libraries.LibraryEditingUtil; import com.intellij.openapi.roots.ui.configuration.projectRoot.BaseLibrariesConfigurable; @@ -33,6 +35,7 @@ import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesModifiab import com.intellij.openapi.roots.ui.configuration.projectRoot.ModuleStructureConfigurable; import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectLibrariesConfigurable; import com.intellij.openapi.ui.MasterDetailsComponent; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.PlatformIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -41,6 +44,7 @@ import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeNode; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -49,10 +53,10 @@ import java.util.List; */ public class CreateNewLibraryAction extends DumbAwareAction { private final @Nullable LibraryType myType; - private BaseLibrariesConfigurable myLibrariesConfigurable; - private @Nullable Project myProject; + private final BaseLibrariesConfigurable myLibrariesConfigurable; + private final Project myProject; - private CreateNewLibraryAction(@NotNull String text, @Nullable Icon icon, @Nullable LibraryType type, @NotNull BaseLibrariesConfigurable librariesConfigurable, final @Nullable Project project) { + private CreateNewLibraryAction(@NotNull String text, @Nullable Icon icon, @Nullable LibraryType type, @NotNull BaseLibrariesConfigurable librariesConfigurable, final @NotNull Project project) { super(text, null, icon); myType = type; myLibrariesConfigurable = librariesConfigurable; @@ -61,39 +65,39 @@ public class CreateNewLibraryAction extends DumbAwareAction { @Override public void actionPerformed(AnActionEvent e) { - final LibrariesModifiableModel modifiableModel = myLibrariesConfigurable.getModelProvider().getModifiableModel(); - final Library library = modifiableModel.createLibrary(LibraryEditingUtil.suggestNewLibraryName(modifiableModel), myType); - if (myProject != null){ - final BaseLibrariesConfigurable rootConfigurable = ProjectStructureConfigurable.getInstance(myProject).getConfigurableFor(library); - final ExistingLibraryEditor libraryEditor = modifiableModel.getLibraryEditor(library); - if (libraryEditor.hasChanges()) { - ApplicationManager.getApplication().runWriteAction(new Runnable(){ - public void run() { - libraryEditor.commit(); //update lib node - } - }); - } - final DefaultMutableTreeNode - libraryNode = MasterDetailsComponent.findNodeByObject((TreeNode)rootConfigurable.getTree().getModel().getRoot(), library); - rootConfigurable.selectNodeInTree(libraryNode); - appendLibraryToModules(ModuleStructureConfigurable.getInstance(myProject), library); + LibraryRootsComponentDescriptor componentDescriptor = null; + if (myType != null) { + componentDescriptor = myType.createLibraryRootsComponentDescriptor(); + } + if (componentDescriptor == null) { + componentDescriptor = new DefaultLibraryRootsComponentDescriptor(); + } + final FileChooserDescriptor chooserDescriptor = componentDescriptor.createAttachFilesChooserDescriptor(); + chooserDescriptor.setTitle("Select Library Files"); + final VirtualFile[] rootCandidates = FileChooser.chooseFiles(myLibrariesConfigurable.getTree(), chooserDescriptor, myProject.getBaseDir()); + if (rootCandidates.length == 0) { + return; } - } - private void appendLibraryToModules(final ModuleStructureConfigurable rootConfigurable, final Library libraryToSelect) { - final List modules = getSuitableModules(rootConfigurable, myType); - if (modules.isEmpty()) return; - final ChooseModulesDialog dlg = new ChooseModulesDialog(myProject, - modules, ProjectBundle.message("choose.modules.dialog.title"), - ProjectBundle - .message("choose.modules.dialog.description", libraryToSelect.getName())); - dlg.show(); - if (dlg.isOK()) { - final List chosenModules = dlg.getChosenElements(); - for (Module module : chosenModules) { - rootConfigurable.addLibraryOrderEntry(module, libraryToSelect); - } + final List roots = RootDetectionUtil + .detectRoots(Arrays.asList(rootCandidates), myLibrariesConfigurable.getTree(), myProject, componentDescriptor.getRootDetectors(), + true); + final LibrariesModifiableModel modifiableModel = myLibrariesConfigurable.getModelProvider().getModifiableModel(); + final Library library = modifiableModel.createLibrary(LibraryEditingUtil.suggestNewLibraryName(modifiableModel, roots), myType); + + final BaseLibrariesConfigurable rootConfigurable = ProjectStructureConfigurable.getInstance(myProject).getConfigurableFor(library); + final ExistingLibraryEditor libraryEditor = modifiableModel.getLibraryEditor(library); + libraryEditor.addRoots(roots); + if (libraryEditor.hasChanges()) { + ApplicationManager.getApplication().runWriteAction(new Runnable(){ + public void run() { + libraryEditor.commit(); //update lib node + } + }); } + final DefaultMutableTreeNode + libraryNode = MasterDetailsComponent.findNodeByObject((TreeNode)rootConfigurable.getTree().getModel().getRoot(), library); + rootConfigurable.selectNodeInTree(libraryNode); } private static List getSuitableModules(@NotNull ModuleStructureConfigurable rootConfigurable, final @Nullable LibraryType type) { @@ -106,10 +110,10 @@ public class CreateNewLibraryAction extends DumbAwareAction { return modules; } - public static AnAction[] createActionOrGroup(@NotNull String text, @NotNull BaseLibrariesConfigurable librariesConfigurable, final @Nullable Project project) { + public static AnAction[] createActionOrGroup(@NotNull String text, @NotNull BaseLibrariesConfigurable librariesConfigurable, final @NotNull Project project) { final LibraryType[] extensions = LibraryType.EP_NAME.getExtensions(); List> suitableTypes = new ArrayList>(); - if (project != null && librariesConfigurable instanceof ProjectLibrariesConfigurable) { + if (librariesConfigurable instanceof ProjectLibrariesConfigurable) { final ModuleStructureConfigurable configurable = ModuleStructureConfigurable.getInstance(project); for (LibraryType extension : extensions) { if (!getSuitableModules(configurable, extension).isEmpty()) { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryRootsComponent.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryRootsComponent.java index 7857470d4ed8..c434969765ca 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryRootsComponent.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryRootsComponent.java @@ -311,7 +311,7 @@ public class LibraryRootsComponent implements Disposable, LibraryEditorComponent @Override protected List selectRoots(@Nullable VirtualFile initialSelection) { - final FileChooserDescriptor chooserDescriptor = new FileChooserDescriptor(true, true, true, false, true, true); + final FileChooserDescriptor chooserDescriptor = myDescriptor.createAttachFilesChooserDescriptor(); final String name = getLibraryEditor().getName(); chooserDescriptor.setTitle(StringUtil.isEmpty(name) ? ProjectBundle.message("library.attach.files.action") : ProjectBundle.message("library.attach.files.to.library.action", name)); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseLibrariesConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseLibrariesConfigurable.java index c6a3e76dbf97..56efdfc8766d 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseLibrariesConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseLibrariesConfigurable.java @@ -47,7 +47,7 @@ import java.util.*; public abstract class BaseLibrariesConfigurable extends BaseStructureConfigurable { protected String myLevel; - protected BaseLibrariesConfigurable(final Project project) { + protected BaseLibrariesConfigurable(final @NotNull Project project) { super(project); } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/LibraryRootsComponentDescriptor.java b/platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/LibraryRootsComponentDescriptor.java index 345caa0500ff..52d88002a885 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/LibraryRootsComponentDescriptor.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/LibraryRootsComponentDescriptor.java @@ -12,6 +12,8 @@ */ package com.intellij.openapi.roots.libraries.ui; +import com.intellij.openapi.fileChooser.FileChooserDescriptor; +import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.roots.OrderRootType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -35,6 +37,11 @@ public abstract class LibraryRootsComponentDescriptor { return Collections.emptyList(); } + @NotNull + public FileChooserDescriptor createAttachFilesChooserDescriptor() { + return FileChooserDescriptorFactory.createMultipleJavaPathDescriptor(); + } + /** * @return descriptors for 'Attach' buttons in the library roots editor */ diff --git a/platform/platform-resources-en/src/messages/ProjectBundle.properties b/platform/platform-resources-en/src/messages/ProjectBundle.properties index 6b592aaa1bd8..64f212124017 100644 --- a/platform/platform-resources-en/src/messages/ProjectBundle.properties +++ b/platform/platform-resources-en/src/messages/ProjectBundle.properties @@ -313,8 +313,6 @@ project.roots.tooltip.library.misconfigured=Library ''{0}'' has broken paths. project.roots.tooltip.unused=''{0}'' is unused. project.roots.javadoc.tab.description=Manage external JavaDocs attached to this module. External JavaDoc override JavaDoc annotations you might have in your module. project.roots.output.compiler.title=Compiler output -choose.modules.dialog.title=Choose modules -choose.modules.dialog.description=Library '' {0}'' will be added to the selected modules. project.roots.module.jdk.problem.message=Module SDK is not defined. project.roots.module.duplicate.name.message=Duplicate module name project.roots.library.problem.message=Classpath entry is invalid: {0}