Platform: Already Disposed from Deferred icon
[idea/community.git] / platform / platform-impl / src / com / intellij / platform / PlatformProjectOpenProcessor.java
1 /*
2  * Copyright 2000-2009 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.platform;
17
18 import com.intellij.ide.impl.ProjectUtil;
19 import com.intellij.openapi.diagnostic.Logger;
20 import com.intellij.openapi.extensions.Extensions;
21 import com.intellij.openapi.fileEditor.OpenFileDescriptor;
22 import com.intellij.openapi.project.DumbAwareRunnable;
23 import com.intellij.openapi.project.Project;
24 import com.intellij.openapi.project.ProjectManager;
25 import com.intellij.openapi.project.ex.ProjectManagerEx;
26 import com.intellij.openapi.project.impl.ProjectManagerImpl;
27 import com.intellij.openapi.startup.StartupManager;
28 import com.intellij.openapi.util.Ref;
29 import com.intellij.openapi.vfs.VirtualFile;
30 import com.intellij.openapi.wm.ToolWindowManager;
31 import com.intellij.projectImport.ProjectOpenProcessor;
32 import org.jetbrains.annotations.NotNull;
33 import org.jetbrains.annotations.Nullable;
34
35 import javax.swing.*;
36 import java.io.File;
37
38 /**
39  * @author max
40  */
41 public class PlatformProjectOpenProcessor extends ProjectOpenProcessor {
42   private static final Logger LOG = Logger.getInstance("#com.intellij.platform.PlatformProjectOpenProcessor");
43
44   public static PlatformProjectOpenProcessor getInstance() {
45     PlatformProjectOpenProcessor projectOpenProcessor = getInstanceIfItExists();
46     assert projectOpenProcessor != null;
47     return projectOpenProcessor;
48   }
49
50   public static PlatformProjectOpenProcessor getInstanceIfItExists() {
51     ProjectOpenProcessor[] processors = Extensions.getExtensions(EXTENSION_POINT_NAME);
52     for(ProjectOpenProcessor processor: processors) {
53       if (processor instanceof PlatformProjectOpenProcessor) {
54         return (PlatformProjectOpenProcessor) processor;
55       }
56     }
57     return null;
58   }
59
60   public boolean canOpenProject(final VirtualFile file) {
61     return file.isDirectory();
62   }
63
64   @Override
65   public boolean isProjectFile(VirtualFile file) {
66     return false;
67   }
68
69   @Override
70   public boolean lookForProjectsInDirectory() {
71     return false;
72   }
73
74   @Nullable
75   public Project doOpenProject(@NotNull final VirtualFile virtualFile, @Nullable final Project projectToClose, final boolean forceOpenInNewFrame) {
76     return doOpenProject(virtualFile, projectToClose, forceOpenInNewFrame, -1);
77   }
78
79   @Nullable
80   public static Project doOpenProject(@NotNull final VirtualFile virtualFile,
81                                       final Project projectToClose,
82                                       final boolean forceOpenInNewFrame,
83                                       final int line) {
84     VirtualFile baseDir = virtualFile;
85     if (!baseDir.isDirectory()) {
86       baseDir = virtualFile.getParent();
87       while (baseDir != null) {
88         if (new File(baseDir.getPath(), ".idea").exists()) {
89           break;
90         }
91         baseDir = baseDir.getParent();
92       }
93       if (baseDir == null) {
94         baseDir = virtualFile.getParent();
95       }
96     }
97
98     final File projectDir = new File(baseDir.getPath(), ".idea");
99
100     Project[] openProjects = ProjectManager.getInstance().getOpenProjects();
101     if (!forceOpenInNewFrame && openProjects.length > 0) {
102       int exitCode = ProjectUtil.confirmOpenNewProject(false);
103       if (exitCode == 0) { // this window option
104         if (!ProjectUtil.closeAndDispose(projectToClose != null ? projectToClose : openProjects[openProjects.length - 1])) return null;
105       }
106       else if (exitCode != 1) { // not in a new window
107         return null;
108       }
109     }
110     
111     final ProjectManagerEx projectManager = ProjectManagerEx.getInstanceEx();
112     Project project = null;
113     Ref<Boolean> cancelled = new Ref<Boolean>();
114     if (projectDir.exists()) {
115       try {
116         for (ProjectOpenProcessor processor : ProjectOpenProcessor.EXTENSION_POINT_NAME.getExtensions()) {
117           processor.refreshProjectFiles(projectDir);
118         }
119
120         project = ((ProjectManagerImpl) projectManager).convertAndLoadProject(baseDir.getPath(), cancelled);
121       }
122       catch (Exception e) {
123         // ignore
124       }
125     }
126     else {
127       projectDir.mkdirs();
128     }
129     if (project == null && cancelled.isNull()) {
130       project = projectManager.newProject(projectDir.getParentFile().getName(), projectDir.getParent(), true, false);
131     }
132     if (project == null) return null;
133     ProjectBaseDirectory.getInstance(project).setBaseDir(baseDir);
134     for(DirectoryProjectConfigurator configurator: Extensions.getExtensions(DirectoryProjectConfigurator.EP_NAME)) {
135       try {
136         configurator.configureProject(project, baseDir);
137       }
138       catch (Exception e) {
139         LOG.error(e);
140       }
141     }
142
143     openFileFromCommandLine(project, virtualFile, line);
144     projectManager.openProject(project);
145
146     return project;
147   }
148
149   private static void openFileFromCommandLine(final Project project, final VirtualFile virtualFile, final int line) {
150     StartupManager.getInstance(project).registerPostStartupActivity(new DumbAwareRunnable() {
151       public void run() {
152         ToolWindowManager.getInstance(project).invokeLater(new Runnable() {
153           public void run() {
154             ToolWindowManager.getInstance(project).invokeLater(new Runnable() {
155               public void run() {
156                 if (!virtualFile.isDirectory()) {
157                   if (line > 0) {
158                     new OpenFileDescriptor(project, virtualFile, line-1, 0).navigate(true);
159                   }
160                   else {
161                     new OpenFileDescriptor(project, virtualFile).navigate(true);
162                   }
163                 }
164               }
165             });
166           }
167         });
168       }
169     });
170   }
171
172   @Nullable
173   public Icon getIcon() {
174     return null;
175   }
176
177   public String getName() {
178     return "text editor";
179   }
180 }