cleanup
[idea/community.git] / platform / projectModel-api / src / com / intellij / openapi / project / ProjectManager.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.openapi.project;
3
4 import com.intellij.openapi.Disposable;
5 import com.intellij.openapi.application.ApplicationManager;
6 import com.intellij.util.messages.Topic;
7 import org.jdom.JDOMException;
8 import org.jetbrains.annotations.ApiStatus;
9 import org.jetbrains.annotations.NotNull;
10 import org.jetbrains.annotations.Nullable;
11 import org.jetbrains.annotations.TestOnly;
12
13 import java.io.File;
14 import java.io.IOException;
15 import java.nio.file.Path;
16
17 /**
18  * Provides project management.
19  */
20 @ApiStatus.NonExtendable
21 public abstract class ProjectManager {
22   public static final Topic<ProjectManagerListener> TOPIC = new Topic<>(ProjectManagerListener.class);
23
24   /**
25    * @return {@code ProjectManager} instance
26    */
27   public static ProjectManager getInstance() {
28     return ApplicationManager.getApplication().getService(ProjectManager.class);
29   }
30
31   public static @Nullable ProjectManager getInstanceIfCreated() {
32     return ApplicationManager.getApplication().getServiceIfCreated(ProjectManager.class);
33   }
34
35   /**
36    * @deprecated Use {@link #TOPIC} instead
37    */
38   @Deprecated
39   public abstract void addProjectManagerListener(@NotNull ProjectManagerListener listener);
40
41   public abstract void addProjectManagerListener(@NotNull VetoableProjectManagerListener listener);
42
43   /**
44    * @deprecated Use {@link #TOPIC} instead
45    */
46   @Deprecated
47   public abstract void addProjectManagerListener(@NotNull ProjectManagerListener listener, @NotNull Disposable parentDisposable);
48
49   /**
50    * @deprecated Use {@link #TOPIC} instead
51    */
52   @Deprecated
53   public abstract void removeProjectManagerListener(@NotNull ProjectManagerListener listener);
54
55   public abstract void removeProjectManagerListener(@NotNull VetoableProjectManagerListener listener);
56
57   /**
58    * Adds listener to the specified project.
59    *
60    * @param project  project to add listener to
61    * @param listener listener to add
62    */
63   public abstract void addProjectManagerListener(@NotNull Project project, @NotNull ProjectManagerListener listener);
64
65   /**
66    * Removes listener from the specified project.
67    *
68    * @param project  project to remove listener from
69    * @param listener listener to remove
70    */
71   public abstract void removeProjectManagerListener(@NotNull Project project, @NotNull ProjectManagerListener listener);
72
73   /**
74    * Returns the list of currently opened projects.
75    * {@link Project#isDisposed()} must be checked for each project before use (if the whole operation is not under read action).
76    */
77   public abstract @NotNull Project @NotNull [] getOpenProjects();
78
79   /**
80    * Returns the project which is used as a template for new projects. The template project
81    * is always available, even when no other project is open. This {@link Project} instance is not
82    * supposed to be used for anything except template settings storage.<p/>
83    *
84    * NB: default project can be lazy loaded
85    *
86    * @return the template project instance.
87    */
88   public abstract @NotNull Project getDefaultProject();
89
90   /**
91    * Loads and opens a project with the specified path. If the project file is from an older IDEA
92    * version, prompts the user to convert it to the latest version. If the project file is from a
93    * newer version, shows a message box telling the user that the load failed.
94    *
95    * @param filePath the .ipr file path
96    * @return the opened project file, or null if the project failed to load because of version mismatch
97    *         or because the project is already open.
98    * @throws IOException          if the project file was not found or failed to read
99    * @throws JDOMException        if the project file contained invalid XML
100    */
101   public abstract @Nullable Project loadAndOpenProject(@NotNull String filePath) throws IOException, JDOMException;
102
103   @ApiStatus.Experimental
104   @TestOnly
105   public @Nullable Project loadAndOpenProject(@NotNull File file) throws IOException, JDOMException {
106     return loadAndOpenProject(file.toPath());
107   }
108
109   @ApiStatus.Experimental
110   public abstract @Nullable Project loadAndOpenProject(@NotNull Path file) throws IOException, JDOMException;
111
112   /**
113    * Closes the specified project, but does not dispose it.
114    *
115    * @param project the project to close.
116    * @return true if the project was closed successfully, false if the closing was disallowed by the close listeners.
117    */
118   public abstract boolean closeProject(@NotNull Project project);
119
120   /**
121    * Asynchronously reloads the specified project.
122    *
123    * @param project the project to reload.
124    */
125   @SuppressWarnings("unused")
126   public abstract void reloadProject(@NotNull Project project);
127
128   /**
129    * Create new project in given location.
130    *
131    * @param name project name
132    * @param path project location
133    *
134    * @return newly crated project
135    */
136   public abstract @Nullable Project createProject(@Nullable String name, @NotNull String path);
137 }