/* * Copyright 2000-2013 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. */ /* * @author max */ package com.intellij.ide.impl; import com.intellij.ide.impl.util.NewProjectUtilPlatform; import com.intellij.ide.util.newProjectWizard.AddModuleWizard; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.project.ex.ProjectManagerEx; import com.intellij.openapi.roots.ui.configuration.ModulesConfigurator; import com.intellij.openapi.roots.ui.configuration.ModulesProvider; import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.wm.*; import com.intellij.openapi.wm.ex.IdeFrameEx; import com.intellij.openapi.wm.impl.IdeFrameImpl; import com.intellij.util.ui.UIUtil; import consulo.compiler.CompilerConfiguration; import consulo.moduleImport.ModuleImportContext; import consulo.moduleImport.ModuleImportProvider; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.io.File; import java.io.IOException; public class NewProjectUtil extends NewProjectUtilPlatform { public static final Logger LOGGER = Logger.getInstance(NewProjectUtil.class); private NewProjectUtil() { } public static void createNewProject(Project projectToClose, @Nullable final String defaultPath) { final boolean proceed = ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() { @Override public void run() { ProjectManager.getInstance().getDefaultProject(); //warm up components } }, ProjectBundle.message("project.new.wizard.progress.title"), true, null); if (!proceed) return; final AddModuleWizard dialog = new AddModuleWizard(null, ModulesProvider.EMPTY_MODULES_PROVIDER, defaultPath); dialog.show(); if (!dialog.isOK()) { return; } createFromWizard(dialog, projectToClose); } @Nullable public static Project createFromWizard(AddModuleWizard dialog, Project projectToClose) { return createFromWizard(dialog, projectToClose, true); } @Nullable public static Project createFromWizard(AddModuleWizard dialog, Project projectToClose, boolean openAfter) { try { return doCreate(dialog, projectToClose, openAfter); } catch (final IOException e) { UIUtil.invokeLaterIfNeeded(() -> Messages.showErrorDialog(e.getMessage(), "Project Initialization Failed")); return null; } } @Nullable @SuppressWarnings("unchecked") private static Project doCreate(final AddModuleWizard wizard, @Nullable Project projectToClose, boolean openAfter) throws IOException { final ProjectManagerEx projectManager = ProjectManagerEx.getInstanceEx(); final String projectFilePath = wizard.getNewProjectFilePath(); final ModuleImportProvider importProvider = wizard.getImportProvider(); ModuleImportContext importContext = importProvider == null ? null : wizard.getWizardContext().getModuleImportContext(importProvider); try { File projectDir = new File(projectFilePath).getParentFile(); LOGGER.assertTrue(projectDir != null, "Cannot create project in '" + projectFilePath + "': no parent file exists"); FileUtil.ensureExists(projectDir); final File ideaDir = new File(projectFilePath, Project.DIRECTORY_STORE_FOLDER); FileUtil.ensureExists(ideaDir); final Project newProject; if (importContext == null || !importContext.isUpdate()) { String name = wizard.getProjectName(); newProject = importProvider == null ? projectManager.newProject(name, projectFilePath, true, false) : projectManager.createProject(name, projectFilePath); } else { newProject = projectToClose; } if (newProject == null) return projectToClose; final String compileOutput = wizard.getNewCompileOutput(); CommandProcessor.getInstance().executeCommand(newProject, new Runnable() { @Override public void run() { ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { String canonicalPath = compileOutput; try { canonicalPath = FileUtil.resolveShortWindowsName(compileOutput); } catch (IOException e) { //file doesn't exist } canonicalPath = FileUtil.toSystemIndependentName(canonicalPath); CompilerConfiguration.getInstance(newProject).setCompilerOutputUrl(VfsUtilCore.pathToUrl(canonicalPath)); } }); } }, null, null); if (!ApplicationManager.getApplication().isUnitTestMode()) { newProject.save(); } if (importProvider != null && !importProvider.validate(projectToClose, newProject)) { return projectToClose; } if (newProject != projectToClose && !ApplicationManager.getApplication().isUnitTestMode()) { closePreviousProject(projectToClose); } if (importProvider != null) { importProvider.commit(importContext, newProject, null, ModulesProvider.EMPTY_MODULES_PROVIDER, null); } final boolean need2OpenProjectStructure = importContext == null || importContext.isOpenProjectSettingsAfter(); StartupManager.getInstance(newProject).registerPostStartupActivity(new Runnable() { @Override public void run() { // ensure the dialog is shown after all startup activities are done //noinspection SSBasedInspection SwingUtilities.invokeLater(new Runnable() { @Override public void run() { if (newProject.isDisposed() || ApplicationManager.getApplication().isUnitTestMode()) return; if (need2OpenProjectStructure) { ModulesConfigurator.showDialog(newProject, null, null); } ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { if (newProject.isDisposed()) return; final ToolWindow toolWindow = ToolWindowManager.getInstance(newProject).getToolWindow(ToolWindowId.PROJECT_VIEW); if (toolWindow != null) { toolWindow.activate(null); } } }, ModalityState.NON_MODAL); } }); } }); if(openAfter) { if (newProject != projectToClose) { ProjectUtil.updateLastProjectLocation(projectFilePath); if (WindowManager.getInstance().isFullScreenSupportedInCurrentOS()) { IdeFocusManager instance = IdeFocusManager.findInstance(); IdeFrame lastFocusedFrame = instance.getLastFocusedFrame(); if (lastFocusedFrame instanceof IdeFrameEx) { boolean fullScreen = ((IdeFrameEx)lastFocusedFrame).isInFullScreen(); if (fullScreen) { newProject.putUserData(IdeFrameImpl.SHOULD_OPEN_IN_FULL_SCREEN, Boolean.TRUE); } } } projectManager.openProject(newProject); } } if (!ApplicationManager.getApplication().isUnitTestMode()) { newProject.save(); } return newProject; } finally { disposeContext(wizard); } } public static void disposeContext(@NotNull AddModuleWizard wizard) { Disposer.dispose(wizard.getWizardContext()); } }