blob: ca00208c3c8885baa1aab47b30a89682a9b3991c [file] [log] [blame]
package com.jetbrains.python.configuration;
import com.intellij.facet.impl.DefaultFacetsProvider;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.impl.ModuleConfigurationStateImpl;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.ui.configuration.DefaultModulesProvider;
import com.intellij.openapi.roots.ui.configuration.FacetsProvider;
import com.intellij.openapi.util.Computable;
import com.jetbrains.python.module.PyContentEntriesEditor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.java.JavaSourceRootType;
import javax.swing.*;
import java.awt.*;
public class PyContentEntriesModuleConfigurable extends SearchableConfigurable.Parent.Abstract {
private final Module myModule;
private final JPanel myTopPanel = new JPanel(new BorderLayout());
protected ModifiableRootModel myModifiableModel;
protected PyContentEntriesEditor myEditor;
public PyContentEntriesModuleConfigurable(final Module module) {
myModule = module;
}
@Override
public String getDisplayName() {
return "Project Structure";
}
@Override
public String getHelpTopic() {
return "reference.settingsdialog.project.structure";
}
@Override
public JComponent createComponent() {
createEditor();
return myTopPanel;
}
private void createEditor() {
if (myModule == null) return;
myModifiableModel = ApplicationManager.getApplication().runReadAction(new Computable<ModifiableRootModel>() {
@Override
public ModifiableRootModel compute() {
return ModuleRootManager.getInstance(myModule).getModifiableModel();
}
});
final ModuleConfigurationStateImpl moduleConfigurationState =
new ModuleConfigurationStateImpl(myModule.getProject(), new DefaultModulesProvider(myModule.getProject())) {
@Override
public ModifiableRootModel getRootModel() {
return myModifiableModel;
}
@Override
public FacetsProvider getFacetsProvider() {
return DefaultFacetsProvider.INSTANCE;
}
};
myEditor = createEditor(myModule, moduleConfigurationState);
JComponent component = ApplicationManager.getApplication().runReadAction(new Computable<JComponent>() {
@Override
public JComponent compute() {
return myEditor.createComponent();
}
});
myTopPanel.add(component, BorderLayout.CENTER);
}
protected PyContentEntriesEditor createEditor(@NotNull Module module, @NotNull ModuleConfigurationStateImpl state) {
return new PyContentEntriesEditor(module, state, JavaSourceRootType.SOURCE);
}
@Override
public boolean isModified() {
return myEditor != null && myEditor.isModified();
}
@Override
public void apply() throws ConfigurationException {
if (myEditor == null) return;
myEditor.apply();
if (myModifiableModel.isChanged()) {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
myModifiableModel.commit();
}
});
resetEditor();
}
}
@Override
public void reset() {
if (myEditor == null) return;
if (myModifiableModel != null) {
myModifiableModel.dispose();
}
resetEditor();
}
private void resetEditor() {
myEditor.disposeUIResources();
myTopPanel.remove(myEditor.getComponent());
createEditor();
}
@Override
public void disposeUIResources() {
if (myEditor != null) {
myEditor.disposeUIResources();
myTopPanel.remove(myEditor.getComponent());
myEditor = null;
}
if (myModifiableModel != null) {
myModifiableModel.dispose();
myModifiableModel = null;
}
}
@Override
protected Configurable[] buildConfigurables() {
return new Configurable[0];
}
@Override
@NotNull
public String getId() {
return "python.project.structure";
}
}