2 * Copyright 2000-2014 JetBrains s.r.o.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package com.jetbrains.python.configuration;
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.project.DumbService;
26 import com.intellij.openapi.roots.ModifiableRootModel;
27 import com.intellij.openapi.roots.ModuleRootManager;
28 import com.intellij.openapi.roots.ui.configuration.DefaultModulesProvider;
29 import com.intellij.openapi.roots.ui.configuration.FacetsProvider;
30 import com.intellij.openapi.util.Computable;
31 import com.jetbrains.python.module.PyContentEntriesEditor;
32 import org.jetbrains.annotations.NotNull;
33 import org.jetbrains.jps.model.java.JavaSourceRootType;
38 import static com.intellij.openapi.project.DumbModePermission.MAY_START_BACKGROUND;
40 public class PyContentEntriesModuleConfigurable extends SearchableConfigurable.Parent.Abstract {
41 private final Module myModule;
42 private final JPanel myTopPanel = new JPanel(new BorderLayout());
43 protected ModifiableRootModel myModifiableModel;
44 protected PyContentEntriesEditor myEditor;
46 public PyContentEntriesModuleConfigurable(final Module module) {
51 public String getDisplayName() {
52 return "Project Structure";
56 public String getHelpTopic() {
57 return "reference.settingsdialog.project.structure";
61 public JComponent createComponent() {
66 private void createEditor() {
67 if (myModule == null) return;
68 myModifiableModel = ApplicationManager.getApplication().runReadAction(new Computable<ModifiableRootModel>() {
70 public ModifiableRootModel compute() {
71 return ModuleRootManager.getInstance(myModule).getModifiableModel();
75 final ModuleConfigurationStateImpl moduleConfigurationState =
76 new ModuleConfigurationStateImpl(myModule.getProject(), new DefaultModulesProvider(myModule.getProject())) {
78 public ModifiableRootModel getRootModel() {
79 return myModifiableModel;
83 public FacetsProvider getFacetsProvider() {
84 return DefaultFacetsProvider.INSTANCE;
87 myEditor = createEditor(myModule, moduleConfigurationState);
89 JComponent component = ApplicationManager.getApplication().runReadAction(new Computable<JComponent>() {
91 public JComponent compute() {
92 return myEditor.createComponent();
95 myTopPanel.add(component, BorderLayout.CENTER);
98 protected PyContentEntriesEditor createEditor(@NotNull Module module, @NotNull ModuleConfigurationStateImpl state) {
99 return new PyContentEntriesEditor(module, state, JavaSourceRootType.SOURCE);
103 public boolean isModified() {
104 return myEditor != null && myEditor.isModified();
108 public void apply() throws ConfigurationException {
109 if (myEditor == null) return;
110 final boolean editorWasModified = myEditor.isModified();
112 if (editorWasModified) {
113 DumbService.getInstance(myModifiableModel.getProject()).allowStartingDumbModeInside(MAY_START_BACKGROUND, new Runnable() {
116 ApplicationManager.getApplication().runWriteAction(new Runnable() {
119 myModifiableModel.commit();
129 public void reset() {
130 if (myEditor == null) return;
131 if (myModifiableModel != null) {
132 myModifiableModel.dispose();
137 private void resetEditor() {
138 myEditor.disposeUIResources();
139 myTopPanel.remove(myEditor.getComponent());
144 public void disposeUIResources() {
145 if (myEditor != null) {
146 myEditor.disposeUIResources();
147 myTopPanel.remove(myEditor.getComponent());
150 if (myModifiableModel != null) {
151 myModifiableModel.dispose();
152 myModifiableModel = null;
157 protected Configurable[] buildConfigurables() {
158 return new Configurable[0];
163 public String getId() {
164 return "python.project.structure";