2 * Copyright 2000-2012 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.intellij.compiler.options;
18 import com.intellij.compiler.CompilerConfiguration;
19 import com.intellij.compiler.CompilerConfigurationImpl;
20 import com.intellij.compiler.impl.javaCompiler.BackendCompiler;
21 import com.intellij.compiler.server.BuildManager;
22 import com.intellij.openapi.compiler.CompilerBundle;
23 import com.intellij.openapi.options.Configurable;
24 import com.intellij.openapi.options.ConfigurationException;
25 import com.intellij.openapi.options.SearchableConfigurable;
26 import com.intellij.openapi.project.Project;
27 import com.intellij.openapi.util.Comparing;
28 import com.intellij.ui.ListCellRendererWrapper;
29 import org.jetbrains.annotations.NotNull;
33 import java.awt.event.ActionEvent;
34 import java.awt.event.ActionListener;
35 import java.util.ArrayList;
36 import java.util.Collection;
37 import java.util.Vector;
40 * @author Eugene Zhuravlev
43 public class JavaCompilersTab implements SearchableConfigurable, Configurable.NoScroll {
44 private JPanel myPanel;
45 private JPanel myContentPanel;
46 private JComboBox myCompiler;
47 private JPanel myTargetOptionsPanel;
48 private final CardLayout myCardLayout;
50 private final Project myProject;
51 private final BackendCompiler myDefaultCompiler;
52 private BackendCompiler mySelectedCompiler;
53 private final CompilerConfigurationImpl myCompilerConfiguration;
54 private final Collection<Configurable> myConfigurables;
55 private final TargetOptionsComponent myTargetLevelComponent;
57 public JavaCompilersTab(final Project project) {
58 this(project, ((CompilerConfigurationImpl)CompilerConfiguration.getInstance(project)).getRegisteredJavaCompilers(),
59 ((CompilerConfigurationImpl)CompilerConfiguration.getInstance(project)).getDefaultCompiler());
62 public JavaCompilersTab(final Project project, Collection<BackendCompiler> compilers, BackendCompiler defaultCompiler) {
64 myDefaultCompiler = defaultCompiler;
65 myCompilerConfiguration = (CompilerConfigurationImpl)CompilerConfiguration.getInstance(project);
66 myConfigurables = new ArrayList<Configurable>(compilers.size());
68 myCardLayout = new CardLayout();
69 myContentPanel.setLayout(myCardLayout);
71 myTargetOptionsPanel.setLayout(new BorderLayout());
72 myTargetLevelComponent = new TargetOptionsComponent(project);
73 myTargetOptionsPanel.add(myTargetLevelComponent, BorderLayout.CENTER);
75 for (BackendCompiler compiler : compilers) {
76 Configurable configurable = compiler.createConfigurable();
77 myConfigurables.add(configurable);
79 myContentPanel.add(configurable.createComponent(), compiler.getId());
81 myCompiler.setModel(new DefaultComboBoxModel(new Vector(compilers)));
82 myCompiler.setRenderer(new ListCellRendererWrapper<BackendCompiler>() {
84 public void customize(final JList list, final BackendCompiler value, final int index, final boolean selected, final boolean hasFocus) {
85 setText(value != null ? value.getPresentableName() : "");
88 myCompiler.addActionListener(new ActionListener() {
89 public void actionPerformed(ActionEvent e) {
90 final BackendCompiler compiler = (BackendCompiler)myCompiler.getSelectedItem();
91 if (compiler != null) {
92 selectCompiler(compiler);
98 public String getDisplayName() {
99 return CompilerBundle.message("java.compiler.description");
102 public String getHelpTopic() {
103 return "reference.projectsettings.compiler.javacompiler";
107 public String getId() {
108 return getHelpTopic();
111 public Runnable enableSearch(String option) {
115 public JComponent createComponent() {
119 public boolean isModified() {
120 if (!Comparing.equal(mySelectedCompiler, myCompilerConfiguration.getDefaultCompiler())) {
123 for (Configurable configurable : myConfigurables) {
124 if (configurable.isModified()) {
128 if (!Comparing.equal(myTargetLevelComponent.getProjectBytecodeTarget(), myCompilerConfiguration.getProjectBytecodeTarget())) {
131 if (!Comparing.equal(myTargetLevelComponent.getModulesBytecodeTargetMap(), myCompilerConfiguration.getModulesBytecodeTargetMap())) {
137 public void apply() throws ConfigurationException {
138 boolean modified = false;
140 for (Configurable configurable : myConfigurables) {
141 if (configurable.isModified()) {
143 configurable.apply();
146 myCompilerConfiguration.setDefaultCompiler(mySelectedCompiler);
147 myCompilerConfiguration.setProjectBytecodeTarget(myTargetLevelComponent.getProjectBytecodeTarget());
148 myCompilerConfiguration.setModulesBytecodeTargetMap(myTargetLevelComponent.getModulesBytecodeTargetMap());
150 myTargetLevelComponent.setProjectBytecodeTargetLevel(myCompilerConfiguration.getProjectBytecodeTarget());
151 myTargetLevelComponent.setModuleTargetLevels(myCompilerConfiguration.getModulesBytecodeTargetMap());
155 BuildManager.getInstance().clearState(myProject);
160 public void reset() {
161 for (Configurable configurable : myConfigurables) {
162 configurable.reset();
164 selectCompiler(myCompilerConfiguration.getDefaultCompiler());
165 myTargetLevelComponent.setProjectBytecodeTargetLevel(myCompilerConfiguration.getProjectBytecodeTarget());
166 myTargetLevelComponent.setModuleTargetLevels(myCompilerConfiguration.getModulesBytecodeTargetMap());
169 public void disposeUIResources() {
172 private void selectCompiler(BackendCompiler compiler) {
173 if(compiler == null) {
174 compiler = myDefaultCompiler;
176 myCompiler.setSelectedItem(compiler);
177 mySelectedCompiler = compiler;
178 myCardLayout.show(myContentPanel, compiler.getId());
179 myContentPanel.revalidate();
180 myContentPanel.repaint();