Fix Python plugin to work with CLion as well as Python plugin for CLion
[idea/community.git] / python / pluginMinor / com / jetbrains / python / minor / facet / PythonFacetType.java
1 /*
2  * Copyright 2000-2017 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.jetbrains.python.minor.facet;
17
18 import com.intellij.facet.Facet;
19 import com.intellij.facet.FacetConfiguration;
20 import com.intellij.facet.FacetType;
21 import com.intellij.facet.ui.FacetEditorContext;
22 import com.intellij.facet.ui.FacetEditorTab;
23 import com.intellij.facet.ui.FacetValidatorsManager;
24 import com.intellij.openapi.application.ApplicationManager;
25 import com.intellij.openapi.module.Module;
26 import com.intellij.openapi.module.ModuleType;
27 import com.intellij.openapi.projectRoots.ProjectJdkTable;
28 import com.intellij.openapi.projectRoots.Sdk;
29 import com.intellij.openapi.util.InvalidDataException;
30 import com.intellij.openapi.util.WriteExternalException;
31 import com.intellij.openapi.util.text.StringUtil;
32 import com.jetbrains.python.facet.PythonFacetSettings;
33 import com.jetbrains.python.sdk.PythonSdkType;
34 import icons.PythonIcons;
35 import org.jdom.Element;
36 import org.jetbrains.annotations.NonNls;
37 import org.jetbrains.annotations.NotNull;
38 import org.jetbrains.annotations.Nullable;
39
40 import javax.swing.*;
41 import java.util.List;
42
43 import static com.jetbrains.python.PythonModuleTypeBase.PYTHON_MODULE;
44
45 /**
46  * @author traff
47  */
48 public class PythonFacetType extends FacetType<PythonFacet, PythonFacetType.PythonFacetConfiguration> {
49
50   @NonNls
51   private static final String ID = "Python";
52
53   public static PythonFacetType getInstance() {
54     return findInstance(PythonFacetType.class);
55   }
56
57   public PythonFacetType() {
58     super(PythonFacet.ID, ID, "Python");
59   }
60
61   public PythonFacetConfiguration createDefaultConfiguration() {
62     PythonFacetConfiguration result = new PythonFacetConfiguration();
63     List<Sdk> sdks = ProjectJdkTable.getInstance().getSdksOfType(PythonSdkType.getInstance());
64     if (sdks.size() > 0) {
65       result.setSdk(sdks.get(0));
66     }
67     return result;
68   }
69
70   public PythonFacet createFacet(@NotNull Module module,
71                                  String name,
72                                  @NotNull PythonFacetConfiguration configuration,
73                                  @Nullable Facet underlyingFacet) {
74     return new PythonFacet(this, module, name, configuration, underlyingFacet);
75   }
76
77   public boolean isSuitableModuleType(ModuleType moduleType) {
78     return !(moduleType.getId().equals(PYTHON_MODULE));
79   }
80
81   @Override
82   public Icon getIcon() {
83     return PythonIcons.Python.Python;
84   }
85
86   public static class PythonFacetConfiguration extends PythonFacetSettings implements FacetConfiguration {
87     private static final String SDK_NAME = "sdkName";
88
89     public FacetEditorTab[] createEditorTabs(FacetEditorContext editorContext, FacetValidatorsManager validatorsManager) {
90       return new FacetEditorTab[]{};
91     }
92
93     public void readExternal(Element element) throws InvalidDataException {
94       String sdkName = element.getAttributeValue(SDK_NAME);
95       mySdk = StringUtil.isEmpty(sdkName) ? null : ProjectJdkTable.getInstance().findJdk(sdkName, PythonSdkType.getInstance().getName());
96
97       if (mySdk != null) {
98         ApplicationManager.getApplication().getMessageBus().syncPublisher(ProjectJdkTable.JDK_TABLE_TOPIC).jdkAdded(mySdk);
99       }
100     }
101
102     public void writeExternal(Element element) throws WriteExternalException {
103       element.setAttribute(SDK_NAME, mySdk == null ? "" : mySdk.getName());
104     }
105   }
106 }