mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
show file chooser to choose library files when 'create new library' action is invoked in Project Structure dialog
This commit is contained in:
+2
-10
@@ -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();
|
||||
|
||||
+13
-6
@@ -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);
|
||||
|
||||
+41
-37
@@ -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()) {
|
||||
|
||||
+1
-1
@@ -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));
|
||||
|
||||
+1
-1
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user