cleanup: remove useless '@author nik' from javadoc comments
[idea/community.git] / java / idea-ui / src / com / intellij / openapi / roots / ui / configuration / libraryEditor / CreateNewLibraryAction.java
1 /*
2  * Copyright 2000-2012 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.roots.ui.configuration.libraryEditor;
17
18 import com.intellij.ide.IdeBundle;
19 import com.intellij.openapi.actionSystem.AnAction;
20 import com.intellij.openapi.actionSystem.AnActionEvent;
21 import com.intellij.openapi.application.WriteAction;
22 import com.intellij.openapi.project.DumbAwareAction;
23 import com.intellij.openapi.project.Project;
24 import com.intellij.openapi.roots.impl.libraries.LibraryEx;
25 import com.intellij.openapi.roots.libraries.Library;
26 import com.intellij.openapi.roots.libraries.LibraryType;
27 import com.intellij.openapi.roots.libraries.LibraryTypeService;
28 import com.intellij.openapi.roots.libraries.NewLibraryConfiguration;
29 import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable;
30 import com.intellij.openapi.roots.ui.configuration.libraries.LibraryEditingUtil;
31 import com.intellij.openapi.roots.ui.configuration.projectRoot.BaseLibrariesConfigurable;
32 import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesModifiableModel;
33 import com.intellij.openapi.roots.ui.configuration.projectRoot.ModuleStructureConfigurable;
34 import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectLibrariesConfigurable;
35 import com.intellij.openapi.ui.MasterDetailsComponent;
36 import com.intellij.openapi.vfs.VirtualFile;
37 import com.intellij.util.PlatformIcons;
38 import org.jetbrains.annotations.NotNull;
39 import org.jetbrains.annotations.Nullable;
40
41 import javax.swing.*;
42 import javax.swing.tree.DefaultMutableTreeNode;
43 import javax.swing.tree.TreeNode;
44 import java.util.ArrayList;
45 import java.util.Collections;
46 import java.util.List;
47
48 public class CreateNewLibraryAction extends DumbAwareAction {
49   private final @Nullable LibraryType myType;
50   private final BaseLibrariesConfigurable myLibrariesConfigurable;
51   private final Project myProject;
52
53   private CreateNewLibraryAction(@NotNull String text, @Nullable Icon icon, @Nullable LibraryType type, @NotNull BaseLibrariesConfigurable librariesConfigurable, final @NotNull Project project) {
54     super(text, null, icon);
55     myType = type;
56     myLibrariesConfigurable = librariesConfigurable;
57     myProject = project;
58   }
59
60   @Nullable
61   public static Library createLibrary(@Nullable final LibraryType type, @NotNull final JComponent parentComponent,
62                                       @NotNull final Project project, @NotNull final LibrariesModifiableModel modifiableModel) {
63     final NewLibraryConfiguration configuration = createNewLibraryConfiguration(type, parentComponent, project);
64     if (configuration == null) return null;
65     final LibraryType<?> libraryType = configuration.getLibraryType();
66     final Library library = modifiableModel.createLibrary(
67       LibraryEditingUtil.suggestNewLibraryName(modifiableModel, configuration.getDefaultLibraryName()),
68       libraryType != null ? libraryType.getKind() : null);
69
70     final NewLibraryEditor editor = new NewLibraryEditor(libraryType, configuration.getProperties());
71     configuration.addRoots(editor);
72     final Library.ModifiableModel model = library.getModifiableModel();
73     editor.applyTo((LibraryEx.ModifiableModelEx)model);
74     WriteAction.run(() -> model.commit());
75     return library;
76   }
77
78   @Nullable
79   public static NewLibraryConfiguration createNewLibraryConfiguration(@Nullable LibraryType type, @NotNull JComponent parentComponent, @NotNull Project project) {
80     final NewLibraryConfiguration configuration;
81     final VirtualFile baseDir = project.getBaseDir();
82     if (type != null) {
83       configuration = type.createNewLibrary(parentComponent, baseDir, project);
84     }
85     else {
86       configuration = LibraryTypeService
87         .getInstance().createLibraryFromFiles(new DefaultLibraryRootsComponentDescriptor(), parentComponent, baseDir, null, project);
88     }
89     if (configuration == null) return null;
90     return configuration;
91   }
92
93   public static AnAction[] createActionOrGroup(@NotNull String text, @NotNull BaseLibrariesConfigurable librariesConfigurable, final @NotNull Project project) {
94     final LibraryType<?>[] extensions = LibraryType.EP_NAME.getExtensions();
95     List<LibraryType<?>> suitableTypes = new ArrayList<>();
96     if (librariesConfigurable instanceof ProjectLibrariesConfigurable || !project.isDefault()) {
97       final ModuleStructureConfigurable configurable = ModuleStructureConfigurable.getInstance(project);
98       for (LibraryType<?> extension : extensions) {
99         if (!LibraryEditingUtil.getSuitableModules(configurable, extension.getKind(), null).isEmpty()) {
100           suitableTypes.add(extension);
101         }
102       }
103     }
104     else {
105       Collections.addAll(suitableTypes, extensions);
106     }
107
108     if (suitableTypes.isEmpty()) {
109       return new AnAction[]{new CreateNewLibraryAction(text, PlatformIcons.LIBRARY_ICON, null, librariesConfigurable, project)};
110     }
111     List<AnAction> actions = new ArrayList<>();
112     actions.add(new CreateNewLibraryAction(IdeBundle.message("create.default.library.type.action.name"), PlatformIcons.LIBRARY_ICON, null, librariesConfigurable, project));
113     for (LibraryType<?> type : suitableTypes) {
114       final String actionName = type.getCreateActionName();
115       if (actionName != null) {
116         actions.add(new CreateNewLibraryAction(actionName, type.getIcon(null), type, librariesConfigurable, project));
117       }
118     }
119     return actions.toArray(AnAction.EMPTY_ARRAY);
120   }
121
122   @Override
123   public void actionPerformed(@NotNull AnActionEvent e) {
124     Library library =
125       createLibrary(myType, myLibrariesConfigurable.getTree(), myProject, myLibrariesConfigurable.getModelProvider().getModifiableModel());
126     if (library == null) return;
127
128     final BaseLibrariesConfigurable rootConfigurable = ProjectStructureConfigurable.getInstance(myProject).getConfigurableFor(library);
129     final DefaultMutableTreeNode
130       libraryNode = MasterDetailsComponent.findNodeByObject((TreeNode)rootConfigurable.getTree().getModel().getRoot(), library);
131     rootConfigurable.selectNodeInTree(libraryNode);
132     LibraryEditingUtil.showDialogAndAddLibraryToDependencies(library, myProject, true);
133   }
134 }