1e8c8e24a247ee6afdc73848822a8ded32b18bdb
[idea/community.git] / python / ide / src / com / jetbrains / python / configuration / PyContentEntriesModuleConfigurable.java
1 /*
2  * Copyright 2000-2014 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.configuration;
17
18 import com.intellij.facet.impl.DefaultFacetsProvider;
19 import com.intellij.openapi.application.ApplicationManager;
20 import com.intellij.openapi.module.Module;
21 import com.intellij.openapi.module.impl.ModuleConfigurationStateImpl;
22 import com.intellij.openapi.options.Configurable;
23 import com.intellij.openapi.options.ConfigurationException;
24 import com.intellij.openapi.options.SearchableConfigurable;
25 import com.intellij.openapi.roots.ModifiableRootModel;
26 import com.intellij.openapi.roots.ModuleRootManager;
27 import com.intellij.openapi.roots.ui.configuration.DefaultModulesProvider;
28 import com.intellij.openapi.roots.ui.configuration.FacetsProvider;
29 import com.intellij.openapi.util.Computable;
30 import com.jetbrains.python.module.PyContentEntriesEditor;
31 import org.jetbrains.annotations.NotNull;
32 import org.jetbrains.jps.model.java.JavaSourceRootType;
33
34 import javax.swing.*;
35 import java.awt.*;
36
37 public class PyContentEntriesModuleConfigurable extends SearchableConfigurable.Parent.Abstract {
38   private final Module myModule;
39   private final JPanel myTopPanel = new JPanel(new BorderLayout());
40   protected ModifiableRootModel myModifiableModel;
41   protected PyContentEntriesEditor myEditor;
42
43   public PyContentEntriesModuleConfigurable(final Module module) {
44     myModule = module;
45   }
46
47   @Override
48   public String getDisplayName() {
49     return "Project Structure";
50   }
51
52   @Override
53   public String getHelpTopic() {
54     return "reference.settingsdialog.project.structure";
55   }
56
57   @Override
58   public JComponent createComponent() {
59     createEditor();
60     return myTopPanel;
61   }
62
63   private void createEditor() {
64     if (myModule == null) return;
65     myModifiableModel = ApplicationManager.getApplication().runReadAction(new Computable<ModifiableRootModel>() {
66       @Override
67       public ModifiableRootModel compute() {
68         return ModuleRootManager.getInstance(myModule).getModifiableModel();
69       }
70     });
71
72     final ModuleConfigurationStateImpl moduleConfigurationState =
73       new ModuleConfigurationStateImpl(myModule.getProject(), new DefaultModulesProvider(myModule.getProject())) {
74         @Override
75         public ModifiableRootModel getRootModel() {
76           return myModifiableModel;
77         }
78
79         @Override
80         public FacetsProvider getFacetsProvider() {
81           return DefaultFacetsProvider.INSTANCE;
82         }
83       };
84     myEditor = createEditor(myModule, moduleConfigurationState);
85
86     JComponent component = ApplicationManager.getApplication().runReadAction(new Computable<JComponent>() {
87       @Override
88       public JComponent compute() {
89         return myEditor.createComponent();
90       }
91     });
92     myTopPanel.add(component, BorderLayout.CENTER);
93   }
94
95   protected PyContentEntriesEditor createEditor(@NotNull Module module, @NotNull ModuleConfigurationStateImpl state) {
96     return new PyContentEntriesEditor(module, state, JavaSourceRootType.SOURCE);
97   }
98
99   @Override
100   public boolean isModified() {
101     return myEditor != null && myEditor.isModified();
102   }
103
104   @Override
105   public void apply() throws ConfigurationException {
106     if (myEditor == null) return;
107     final boolean editorWasModified = myEditor.isModified();
108     myEditor.apply();
109     if (editorWasModified) {
110       ApplicationManager.getApplication().runWriteAction(new Runnable() {
111         @Override
112         public void run() {
113           myModifiableModel.commit();
114         }
115       });
116       resetEditor();
117     }
118   }
119
120   @Override
121   public void reset() {
122     if (myEditor == null) return;
123     if (myModifiableModel != null) {
124       myModifiableModel.dispose();
125     }
126     resetEditor();
127   }
128
129   private void resetEditor() {
130     myEditor.disposeUIResources();
131     myTopPanel.remove(myEditor.getComponent());
132     createEditor();
133   }
134
135   @Override
136   public void disposeUIResources() {
137     if (myEditor != null) {
138       myEditor.disposeUIResources();
139       myTopPanel.remove(myEditor.getComponent());
140       myEditor = null;
141     }
142     if (myModifiableModel != null) {
143       myModifiableModel.dispose();
144       myModifiableModel = null;
145     }
146   }
147
148   @Override
149   protected Configurable[] buildConfigurables() {
150     return new Configurable[0];
151   }
152
153   @Override
154   @NotNull
155   public String getId() {
156     return "python.project.structure";
157   }
158
159 }