support configscript in groovy compilation (IDEA-103342)
[idea/community.git] / plugins / groovy / src / org / jetbrains / plugins / groovy / compiler / GroovyCompilerConfigurable.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
17 package org.jetbrains.plugins.groovy.compiler;
18
19 import com.intellij.openapi.compiler.options.ExcludedEntriesConfigurable;
20 import com.intellij.openapi.compiler.options.ExcludesConfiguration;
21 import com.intellij.openapi.fileChooser.FileChooserDescriptor;
22 import com.intellij.openapi.module.Module;
23 import com.intellij.openapi.module.ModuleManager;
24 import com.intellij.openapi.options.Configurable;
25 import com.intellij.openapi.options.ConfigurationException;
26 import com.intellij.openapi.options.SearchableConfigurable;
27 import com.intellij.openapi.project.Project;
28 import com.intellij.openapi.roots.ModuleRootManager;
29 import com.intellij.openapi.roots.ProjectFileIndex;
30 import com.intellij.openapi.roots.ProjectRootManager;
31 import com.intellij.openapi.ui.TextFieldWithBrowseButton;
32 import com.intellij.openapi.util.Comparing;
33 import com.intellij.openapi.util.io.FileUtil;
34 import com.intellij.openapi.vfs.VirtualFile;
35 import com.intellij.ui.components.JBCheckBox;
36 import com.intellij.util.Function;
37 import com.intellij.util.containers.ContainerUtil;
38 import org.jetbrains.annotations.Nls;
39 import org.jetbrains.annotations.NotNull;
40 import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
41
42 import javax.swing.*;
43 import java.util.List;
44
45 /**
46  * @author peter
47  */
48 public class GroovyCompilerConfigurable implements SearchableConfigurable, Configurable.NoScroll {
49   private JTextField myHeapSize;
50   private JPanel myMainPanel;
51   private JPanel myExcludesPanel;
52   private JBCheckBox myInvokeDynamicSupportCB;
53   private TextFieldWithBrowseButton myConfigScriptPath;
54
55   private final ExcludedEntriesConfigurable myExcludes;
56   private final GroovyCompilerConfiguration myConfig;
57
58   public GroovyCompilerConfigurable(Project project) {
59     myConfig = GroovyCompilerConfiguration.getInstance(project);
60     myExcludes = createExcludedConfigurable(project);
61
62     FileChooserDescriptor descriptor = new FileChooserDescriptor(true, false, false, false, false, false);
63     myConfigScriptPath.addBrowseFolderListener(null, "Select path to Groovy compiler configscript", null, descriptor);
64   }
65
66   public ExcludedEntriesConfigurable getExcludes() {
67     return myExcludes;
68   }
69
70   private ExcludedEntriesConfigurable createExcludedConfigurable(final Project project) {
71     final ExcludesConfiguration configuration = myConfig.getExcludeFromStubGeneration();
72     final ProjectFileIndex index = ProjectRootManager.getInstance(project).getFileIndex();
73     final FileChooserDescriptor descriptor = new FileChooserDescriptor(true, true, false, false, false, true) {
74       @Override
75       public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) {
76         return super.isFileVisible(file, showHiddenFiles) && !index.isExcluded(file);
77       }
78     };
79     descriptor.setRoots(ContainerUtil.concat(
80       ContainerUtil.map(ModuleManager.getInstance(project).getModules(), new Function<Module, List<VirtualFile>>() {
81         @Override
82         public List<VirtualFile> fun(final Module module) {
83           return ModuleRootManager.getInstance(module).getSourceRoots(JavaModuleSourceRootTypes.SOURCES);
84         }
85       })));
86     return new ExcludedEntriesConfigurable(project, descriptor, configuration);
87   }
88
89
90   @Override
91   @NotNull
92   public String getId() {
93     return "Groovy compiler";
94   }
95
96   @Override
97   public Runnable enableSearch(String option) {
98     return null;
99   }
100
101   @Override
102   @Nls
103   public String getDisplayName() {
104     return "Groovy Compiler";
105   }
106
107   @Override
108   public String getHelpTopic() {
109     return "reference.projectsettings.compiler.groovy";
110   }
111
112   @Override
113   public JComponent createComponent() {
114     myExcludesPanel.add(myExcludes.createComponent());
115     return myMainPanel;
116   }
117
118   @Override
119   public boolean isModified() {
120     return !Comparing.equal(myConfig.getHeapSize(), myHeapSize.getText()) ||
121            !Comparing.equal(myConfig.getConfigScript(), getExternalizableConfigScript()) ||
122            myInvokeDynamicSupportCB.isSelected() != myConfig.isInvokeDynamic() ||
123            myExcludes.isModified();
124   }
125
126   @Override
127   public void apply() throws ConfigurationException {
128     myExcludes.apply();
129     myConfig.setHeapSize(myHeapSize.getText());
130     myConfig.setInvokeDynamic(myInvokeDynamicSupportCB.isSelected());
131     myConfig.setConfigScript(getExternalizableConfigScript());
132   }
133
134   @Override
135   public void reset() {
136     myHeapSize.setText(myConfig.getHeapSize());
137     myConfigScriptPath.setText(FileUtil.toSystemDependentName(myConfig.getConfigScript()));
138     myInvokeDynamicSupportCB.setSelected(myConfig.isInvokeDynamic());
139     myExcludes.reset();
140   }
141
142   @Override
143   public void disposeUIResources() {
144     myExcludes.disposeUIResources();
145   }
146
147   @NotNull
148   private String getExternalizableConfigScript() {
149     return FileUtil.toSystemIndependentName(myConfigScriptPath.getText());
150   }
151
152 }