/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.ide.actions;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.impl.NewProjectUtil;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.ide.util.newProjectWizard.AddModuleWizard;
import com.intellij.ide.util.projectWizard.WizardContext;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDialog;
import com.intellij.openapi.fileChooser.FileChooserFactory;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ui.configuration.actions.NewModuleAction;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.ContainerUtil;
import consulo.annotations.RequiredDispatchThread;
import consulo.annotations.RequiredReadAction;
import consulo.moduleImport.ModuleImportContext;
import consulo.moduleImport.ModuleImportProvider;
import consulo.moduleImport.ModuleImportProviders;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* @author Dmitry Avdeev
* Date: 10/31/12
*/
public class ImportModuleAction extends AnAction {
private static final String LAST_IMPORTED_LOCATION = "last.imported.location";
@RequiredDispatchThread
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
doImport(canCreateNewProject() ? null : e.getProject());
}
@RequiredReadAction
public static List<Module> doImport(Project project) {
AddModuleWizard wizard = selectFileAndCreateWizard(project, null);
if (wizard == null) {
return Collections.emptyList();
}
if (wizard.getStepCount() > 0 && !wizard.showAndGet()) {
NewProjectUtil.disposeContext(wizard);
return Collections.emptyList();
}
return createFromWizard(project, wizard);
}
@NotNull
@RequiredReadAction
@SuppressWarnings("unchecked")
public static List<Module> createFromWizard(Project project, @NotNull AddModuleWizard wizard) {
if (project == null && wizard.getStepCount() > 0) {
Project newProject = NewProjectUtil.createFromWizard(wizard, null);
return newProject == null ? Collections.emptyList() : Arrays.asList(ModuleManager.getInstance(newProject).getModules());
}
WizardContext wizardContext = wizard.getWizardContext();
ModuleImportProvider importProvider = wizard.getImportProvider();
try {
if (wizard.getStepCount() > 0) {
Module module = NewModuleAction.createModuleFromWizard(project, null, wizard);
return Collections.singletonList(module);
}
else {
ModuleImportContext moduleImportContext = wizardContext.getModuleImportContext(importProvider);
return importProvider.commit(moduleImportContext, project);
}
}
finally {
NewProjectUtil.disposeContext(wizard);
}
}
@Nullable
public static AddModuleWizard selectFileAndCreateWizard(final Project project, Component dialogParent) {
FileChooserDescriptor descriptor = new FileChooserDescriptor(true, true, true, true, false, false) {
FileChooserDescriptor myDelegate = new OpenProjectFileChooserDescriptor(true);
@Override
public Icon getIcon(VirtualFile file) {
for (ModuleImportProvider importProvider : ModuleImportProviders.getExtensions()) {
if (importProvider.canImport(file)) {
return importProvider.getIcon();
}
}
Icon icon = myDelegate.getIcon(file);
return icon == null ? super.getIcon(file) : icon;
}
};
descriptor.setHideIgnored(false);
descriptor.setTitle("Select File or Directory to Import");
List<ModuleImportProvider> providers = ModuleImportProviders.getExtensions();
String description = getFileChooserDescription(project);
descriptor.setDescription(description);
return selectFileAndCreateWizard(project, dialogParent, descriptor, providers);
}
@Nullable
public static AddModuleWizard selectFileAndCreateWizard(final Project project,
@Nullable Component dialogParent,
@NotNull FileChooserDescriptor descriptor,
@NotNull List<ModuleImportProvider> providers) {
FileChooserDialog chooser = FileChooserFactory.getInstance().createFileChooser(descriptor, project, dialogParent);
VirtualFile toSelect = null;
String lastLocation = PropertiesComponent.getInstance().getValue(LAST_IMPORTED_LOCATION);
if (lastLocation != null) {
toSelect = LocalFileSystem.getInstance().refreshAndFindFileByPath(lastLocation);
}
VirtualFile[] files = chooser.choose(project, toSelect == null ? VirtualFile.EMPTY_ARRAY : new VirtualFile[]{toSelect});
if (files.length == 0) {
return null;
}
final VirtualFile file = files[0];
PropertiesComponent.getInstance().setValue(LAST_IMPORTED_LOCATION, file.getPath());
return createImportWizard(project, dialogParent, file, providers);
}
public static String getFileChooserDescription(final Project project) {
List<ModuleImportProvider> providers = ModuleImportProviders.getExtensions();
return IdeBundle.message("import.project.chooser.header", StringUtil.join(providers, ModuleImportProvider::getFileSample, ", <br>"));
}
@Nullable
public static AddModuleWizard createImportWizard(final Project project,
@Nullable Component dialogParent,
final VirtualFile file,
List<ModuleImportProvider> providers) {
List<ModuleImportProvider> available = ContainerUtil.filter(providers, provider -> provider.canImport(file));
if (available.isEmpty()) {
Messages.showErrorDialog(project, "Cannot import anything from '" + FileUtil.toSystemDependentName(file.getPath()) + "'", "Cannot Import");
return null;
}
String path;
if (available.size() == 1) {
path = available.get(0).getPathToBeImported(file);
}
else {
path = ModuleImportProvider.getDefaultPath(file);
}
ModuleImportProvider[] availableProviders = available.toArray(new ModuleImportProvider[available.size()]);
return dialogParent == null ? new AddModuleWizard(project, path, availableProviders) : new AddModuleWizard(project, dialogParent, path, availableProviders);
}
@RequiredDispatchThread
@Override
public void update(@NotNull AnActionEvent e) {
Presentation presentation = e.getPresentation();
if (!canCreateNewProject() && e.getProject() == null) {
presentation.setEnabledAndVisible(false);
return;
}
presentation.setEnabledAndVisible(!ModuleImportProviders.getExtensions().isEmpty());
}
public boolean canCreateNewProject() {
return false;
}
@Override
public boolean isDumbAware() {
return true;
}
}