delete some deprecated stuff
[idea/community.git] / java / idea-ui / src / com / intellij / ide / actions / ImportModuleAction.java
1 /*
2  * Copyright 2000-2015 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.ide.actions;
17
18 import com.intellij.ide.impl.NewProjectUtil;
19 import com.intellij.ide.impl.ProjectUtil;
20 import com.intellij.ide.util.PropertiesComponent;
21 import com.intellij.ide.util.newProjectWizard.AbstractProjectWizard;
22 import com.intellij.ide.util.newProjectWizard.AddModuleWizard;
23 import com.intellij.ide.util.projectWizard.ProjectBuilder;
24 import com.intellij.openapi.actionSystem.AnAction;
25 import com.intellij.openapi.actionSystem.AnActionEvent;
26 import com.intellij.openapi.actionSystem.Presentation;
27 import com.intellij.openapi.application.TransactionGuard;
28 import com.intellij.openapi.fileChooser.FileChooserDescriptor;
29 import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
30 import com.intellij.openapi.fileChooser.FileChooserDialog;
31 import com.intellij.openapi.fileChooser.FileChooserFactory;
32 import com.intellij.openapi.module.Module;
33 import com.intellij.openapi.module.ModuleManager;
34 import com.intellij.openapi.project.Project;
35 import com.intellij.openapi.project.ProjectManager;
36 import com.intellij.openapi.roots.ui.configuration.actions.NewModuleAction;
37 import com.intellij.openapi.ui.Messages;
38 import com.intellij.openapi.util.Ref;
39 import com.intellij.openapi.vfs.LocalFileSystem;
40 import com.intellij.openapi.vfs.VirtualFile;
41 import com.intellij.projectImport.ProjectImportProvider;
42 import com.intellij.util.containers.ContainerUtil;
43 import org.jetbrains.annotations.NotNull;
44 import org.jetbrains.annotations.Nullable;
45
46 import java.awt.*;
47 import java.util.Arrays;
48 import java.util.Collections;
49 import java.util.List;
50
51 import static com.intellij.util.ArrayUtil.toObjectArray;
52
53 /**
54  * @author Dmitry Avdeev
55  *         Date: 10/31/12
56  */
57 public class ImportModuleAction extends AnAction {
58
59   private static final String LAST_IMPORTED_LOCATION = "last.imported.location";
60
61   @Override
62   public void actionPerformed(AnActionEvent e) {
63     doImport(getEventProject(e));
64   }
65
66   @Override
67   public void update(AnActionEvent e) {
68     Presentation presentation = e.getPresentation();
69     presentation.setEnabled(getEventProject(e) != null);
70   }
71
72   @Override
73   public boolean isDumbAware() {
74     return true;
75   }
76
77   public static List<Module> doImport(@Nullable Project project) {
78     AddModuleWizard wizard = selectFileAndCreateWizard(project, null);
79
80     if (wizard == null || wizard.getStepCount() > 0 && !wizard.showAndGet()) {
81       return Collections.emptyList();
82     }
83
84     return createFromWizard(project, wizard);
85   }
86
87   public static List<Module> createFromWizard(@Nullable Project project, AbstractProjectWizard wizard) {
88     Ref<List<Module>> result = Ref.create();
89     TransactionGuard.getInstance().submitTransactionAndWait(() -> result.set(doCreateFromWizard(project, wizard)));
90     return result.get();
91   }
92
93   private static List<Module> doCreateFromWizard(@Nullable Project project, AbstractProjectWizard wizard) {
94     if (project == null) {
95       Project newProject = NewProjectUtil.createFromWizard(wizard, null);
96       return newProject == null ? Collections.emptyList() : Arrays.asList(ModuleManager.getInstance(newProject).getModules());
97     }
98
99     final ProjectBuilder projectBuilder = wizard.getProjectBuilder();
100     try {
101       if (wizard.getStepCount() > 0) {
102         Module module = new NewModuleAction().createModuleFromWizard(project, null, wizard);
103         return Collections.singletonList(module);
104       }
105       else {
106         return projectBuilder.commit(project);
107       }
108     }
109     finally {
110       if (projectBuilder != null) {
111         projectBuilder.cleanup();
112       }
113     }
114   }
115
116   @Nullable
117   public static AddModuleWizard selectFileAndCreateWizard(@Nullable Project project, @Nullable Component dialogParent) {
118     FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleLocalFileDescriptor();
119     descriptor.setHideIgnored(false);
120     descriptor.setTitle("Select File or Directory to Import");
121     List<ProjectImportProvider> providers = getProviders(project);
122     String description = getFileChooserDescription(providers);
123     descriptor.setDescription(description);
124     return selectFileAndCreateWizard(project, dialogParent, descriptor, toObjectArray(providers, ProjectImportProvider.class));
125   }
126
127   @Nullable
128   public static AddModuleWizard selectFileAndCreateWizard(@Nullable Project project,
129                                                           @Nullable Component dialogParent,
130                                                           @NotNull FileChooserDescriptor descriptor,
131                                                           ProjectImportProvider[] providers) {
132     FileChooserDialog chooser = FileChooserFactory.getInstance().createFileChooser(descriptor, project, dialogParent);
133     VirtualFile toSelect = null;
134     String lastLocation = PropertiesComponent.getInstance().getValue(LAST_IMPORTED_LOCATION);
135     if (lastLocation != null) {
136       toSelect = LocalFileSystem.getInstance().refreshAndFindFileByPath(lastLocation);
137     }
138     VirtualFile[] files = chooser.choose(project, toSelect);
139     if (files.length == 0) {
140       return null;
141     }
142
143     final VirtualFile file = files[0];
144     if (project == null) { // wizard will create a new project
145       for (Project p : ProjectManager.getInstance().getOpenProjects()) {
146         if (ProjectUtil.isSameProject(file.getPath(), p)) {
147           ProjectUtil.focusProjectWindow(p, false);
148           return null;
149         }
150       }
151     }
152     PropertiesComponent.getInstance().setValue(LAST_IMPORTED_LOCATION, file.getPath());
153     return createImportWizard(project, dialogParent, file, providers);
154   }
155
156   private static String getFileChooserDescription(List<ProjectImportProvider> providers) {
157     StringBuilder builder = new StringBuilder("<html>Select ");
158     boolean first = true;
159     if (providers.size() > 0) {
160       for (ProjectImportProvider provider : providers) {
161         String sample = provider.getFileSample();
162         if (sample != null) {
163           if (!first) {
164             builder.append(", <br>");
165           }
166           else {
167             first = false;
168           }
169           builder.append(sample);
170         }
171       }
172     }
173     builder.append(".</html>");
174     return builder.toString();
175   }
176
177   @NotNull
178   public static List<ProjectImportProvider> getProviders(@Nullable final Project project) {
179     ProjectImportProvider[] providers = ProjectImportProvider.PROJECT_IMPORT_PROVIDER.getExtensions();
180     return ContainerUtil.filter(providers, provider -> project == null ? provider.canCreateNewProject() : provider.canImportModule());
181   }
182
183   @Nullable
184   public static AddModuleWizard createImportWizard(@Nullable final Project project,
185                                                    @Nullable Component dialogParent,
186                                                    @NotNull final VirtualFile file,
187                                                    ProjectImportProvider... providers) {
188     List<ProjectImportProvider> available = ContainerUtil.filter(providers, provider -> provider.canImport(file, project));
189     if (available.isEmpty()) {
190       Messages.showInfoMessage(project, "Cannot import anything from " + file.getPath(), "Cannot Import");
191       return null;
192     }
193
194     String path;
195     if (available.size() == 1) {
196       path = available.get(0).getPathToBeImported(file);
197     }
198     else {
199       path = ProjectImportProvider.getDefaultPath(file);
200     }
201
202     ProjectImportProvider[] availableProviders = available.toArray(new ProjectImportProvider[available.size()]);
203
204     return dialogParent == null
205            ? new AddModuleWizard(project, path, availableProviders)
206            : new AddModuleWizard(project, dialogParent, path, availableProviders);
207   }
208 }