blob: a818b4b9495605fcf070be5d16c06c105dd304ac [file] [log] [blame]
package com.intellij.openapi.roots.ui.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.roots.ContentEntry;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
import javax.swing.*;
import java.awt.*;
import java.util.List;
/**
* @author yole
*/
public class PlatformContentEntriesConfigurable implements Configurable {
private final Module myModule;
private final JpsModuleSourceRootType<?>[] myRootTypes;
private final JPanel myTopPanel = new JPanel(new BorderLayout());
private ModifiableRootModel myModifiableModel;
private CommonContentEntriesEditor myEditor;
public PlatformContentEntriesConfigurable(final Module module, JpsModuleSourceRootType<?>... rootTypes) {
myModule = module;
myRootTypes = rootTypes;
}
@Override
public String getDisplayName() {
return "Project Structure";
}
@Override
public String getHelpTopic() {
return null;
}
@Override
public JComponent createComponent() {
createEditor();
return myTopPanel;
}
private void createEditor() {
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 = new CommonContentEntriesEditor(myModule.getName(), moduleConfigurationState, myRootTypes) {
@Override
protected List<ContentEntry> addContentEntries(VirtualFile[] files) {
List<ContentEntry> entries = super.addContentEntries(files);
addContentEntryPanels(entries.toArray(new ContentEntry[entries.size()]));
return entries;
}
};
JComponent component = ApplicationManager.getApplication().runReadAction(new Computable<JComponent>() {
@Override
public JComponent compute() {
return myEditor.createComponent();
}
});
myTopPanel.add(component, BorderLayout.CENTER);
}
@Override
public boolean isModified() {
return myEditor != null && myEditor.isModified();
}
@Override
public void apply() throws ConfigurationException {
myEditor.apply();
if (myModifiableModel.isChanged()) {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
myModifiableModel.commit();
}
});
myEditor.disposeUIResources();
myTopPanel.remove(myEditor.getComponent());
createEditor();
}
}
@Override
public void reset() {
myEditor.reset();
// TODO?
}
@Override
public void disposeUIResources() {
if (myEditor != null) {
myEditor.disposeUIResources();
myTopPanel.remove(myEditor.getComponent());
myEditor = null;
}
if (myModifiableModel != null) {
myModifiableModel.dispose();
myModifiableModel = null;
}
}
}