show file chooser to choose library files when 'create new library' action is invoked in Project Structure dialog

This commit is contained in:
nik
2011-08-24 12:04:14 +04:00
parent 2245053ca5
commit 123d98a1be
7 changed files with 65 additions and 57 deletions
@@ -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<OrderRoot> 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();
@@ -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<OrderRoot> 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<OrderRoot> roots) {
if (roots.size() >= 1) {
return FileUtil.getNameWithoutExtension(PathUtil.getFileName(roots.get(0).getFile().getPath()));
}
return "Unnamed";
}
public static Predicate<Library> getNotAddedLibrariesCondition(final ModuleRootModel rootModel) {
final OrderEntry[] orderEntries = rootModel.getOrderEntries();
final Set<Library> result = new HashSet<Library>(orderEntries.length);
@@ -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<Module> 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<Module> chosenModules = dlg.getChosenElements();
for (Module module : chosenModules) {
rootConfigurable.addLibraryOrderEntry(module, libraryToSelect);
}
final List<OrderRoot> 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<Module> 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<LibraryType<?>> suitableTypes = new ArrayList<LibraryType<?>>();
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()) {
@@ -311,7 +311,7 @@ public class LibraryRootsComponent implements Disposable, LibraryEditorComponent
@Override
protected List<OrderRoot> 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));
@@ -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);
}