Add dots to the action name
[idea/community.git] / platform / platform-impl / src / com / intellij / platform / AttachProjectAction.kt
1 /*
2  * Copyright 2000-2016 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.GeneralSettings
19 import com.intellij.ide.actions.OpenProjectFileChooserDescriptor
20 import com.intellij.openapi.actionSystem.AnAction
21 import com.intellij.openapi.actionSystem.AnActionEvent
22 import com.intellij.openapi.actionSystem.CommonDataKeys
23 import com.intellij.openapi.fileChooser.FileChooser
24 import com.intellij.openapi.project.DumbAware
25 import com.intellij.openapi.project.Project
26 import com.intellij.openapi.ui.Messages
27 import com.intellij.openapi.util.io.FileUtil
28 import com.intellij.openapi.vfs.VirtualFile
29 import com.intellij.project.isProjectDirectoryExistsUsingIo
30 import com.intellij.projectImport.ProjectAttachProcessor
31 import java.nio.file.Paths
32
33 /**
34  * This action is enabled when confirmOpenNewProject option is set in settings to either OPEN_PROJECT_NEW_WINDOW or
35  * OPEN_PROJECT_SAME_WINDOW, so there is no dialog shown on open directory action, which makes attaching a new project impossible.
36  * This action provides a way to do that in this case.
37  *
38  * @author traff
39  */
40 class AttachProjectAction : AnAction("Attach project..."), DumbAware {
41   override fun update(e: AnActionEvent?) {
42     e?.presentation?.isEnabledAndVisible = ProjectAttachProcessor.canAttachToProject() &&
43                                            GeneralSettings.getInstance().confirmOpenNewProject != GeneralSettings.OPEN_PROJECT_ASK
44   }
45
46   override fun actionPerformed(e: AnActionEvent?) {
47     val descriptor = OpenProjectFileChooserDescriptor(true)
48     val project = e?.getData(CommonDataKeys.PROJECT)
49
50
51     FileChooser.chooseFiles(descriptor, project, null) { files ->
52       attachProject(files[0], project)
53     }
54   }
55 }
56
57
58 fun attachProject(virtualFile: VirtualFile, project: Project?) {
59   var baseDir: VirtualFile? = virtualFile
60
61   if (!baseDir!!.isDirectory) {
62     baseDir = virtualFile.parent
63     while (baseDir != null) {
64       if (isProjectDirectoryExistsUsingIo(baseDir)) {
65         break
66       }
67       baseDir = baseDir.parent
68     }
69   }
70
71   if (baseDir != null) {
72     PlatformProjectOpenProcessor.attachToProject(project, Paths.get(FileUtil.toSystemDependentName(baseDir.getPath())), null)
73   } else {
74     Messages.showErrorDialog("Project not found in ${virtualFile.path}", "Can't Attach Project")
75   }
76 }