7251f701a0b987926c1db9a8bf30e28f5e5c75bb
[idea/community.git] / platform / lang-impl / src / com / intellij / openapi / roots / ui / configuration / PlatformContentEntriesConfigurable.java
1 package com.intellij.openapi.roots.ui.configuration;
2
3 import com.intellij.facet.impl.DefaultFacetsProvider;
4 import com.intellij.openapi.application.ApplicationManager;
5 import com.intellij.openapi.module.Module;
6 import com.intellij.openapi.module.impl.ModuleConfigurationStateImpl;
7 import com.intellij.openapi.options.Configurable;
8 import com.intellij.openapi.options.ConfigurationException;
9 import com.intellij.openapi.roots.ContentEntry;
10 import com.intellij.openapi.roots.ModifiableRootModel;
11 import com.intellij.openapi.roots.ModuleRootManager;
12 import com.intellij.openapi.util.Computable;
13 import com.intellij.openapi.vfs.VirtualFile;
14
15 import javax.swing.*;
16 import java.awt.*;
17 import java.util.List;
18
19 /**
20  * @author yole
21  */
22 public class PlatformContentEntriesConfigurable implements Configurable {
23   private final Module myModule;
24   private final boolean myCanMarkSources;
25   private final boolean myCanMarkTestSources;
26   private final JPanel myTopPanel = new JPanel(new BorderLayout());
27   private ModifiableRootModel myModifiableModel;
28   private CommonContentEntriesEditor myEditor;
29
30   public PlatformContentEntriesConfigurable(final Module module, boolean canMarkSources, boolean canMarkTestSources) {
31     myModule = module;
32     myCanMarkSources = canMarkSources;
33     myCanMarkTestSources = canMarkTestSources;
34   }
35
36   public String getDisplayName() {
37     return "Project Structure";
38   }
39
40   public Icon getIcon() {
41     return null;
42   }
43
44   public String getHelpTopic() {
45     return null;
46   }
47
48   public JComponent createComponent() {
49     createEditor();
50     return myTopPanel;
51   }
52
53   private void createEditor() {
54     myModifiableModel = ApplicationManager.getApplication().runReadAction(new Computable<ModifiableRootModel>() {
55       public ModifiableRootModel compute() {
56         return ModuleRootManager.getInstance(myModule).getModifiableModel();
57       }
58     });
59
60     final ModuleConfigurationStateImpl moduleConfigurationState =
61       new ModuleConfigurationStateImpl(myModule.getProject(), new DefaultModulesProvider(myModule.getProject())) {
62         @Override
63         public ModifiableRootModel getRootModel() {
64           return myModifiableModel;
65         }
66
67         @Override
68         public FacetsProvider getFacetsProvider() {
69           return DefaultFacetsProvider.INSTANCE;
70         }
71       };
72     myEditor = new CommonContentEntriesEditor(myModule.getName(), moduleConfigurationState, myCanMarkSources, myCanMarkTestSources) {
73       @Override
74       protected List<ContentEntry> addContentEntries(VirtualFile[] files) {
75         List<ContentEntry> entries = super.addContentEntries(files);
76         addContentEntryPanels(entries.toArray(new ContentEntry[entries.size()]));
77         return entries;
78       }
79     };
80     JComponent component = ApplicationManager.getApplication().runReadAction(new Computable<JComponent>() {
81       public JComponent compute() {
82         return myEditor.createComponent();
83       }
84     });
85     myTopPanel.add(component, BorderLayout.CENTER);
86   }
87
88   public boolean isModified() {
89     return myEditor.isModified();
90   }
91
92   public void apply() throws ConfigurationException {
93     myEditor.apply();
94     if (myModifiableModel.isChanged()) {
95       ApplicationManager.getApplication().runWriteAction(new Runnable() {
96         public void run() {
97           myModifiableModel.commit();
98         }
99       });
100       myEditor.disposeUIResources();
101       myTopPanel.remove(myEditor.getComponent());
102       createEditor();
103     }
104   }
105
106   public void reset() {
107     myEditor.reset();
108     // TODO?
109   }
110
111   public void disposeUIResources() {
112     if (myEditor != null) {
113       myEditor.disposeUIResources();
114       myTopPanel.remove(myEditor.getComponent());
115       myEditor = null;
116     }
117     if (myModifiableModel != null) {
118       myModifiableModel.dispose();
119       myModifiableModel = null;
120     }
121   }
122 }