f54cae8988aba2e43ef683ab848c58b1d6061278
[idea/community.git] / java / compiler / impl / src / com / intellij / compiler / options / JavaCompilersTab.java
1 /*
2  * Copyright 2000-2012 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 package com.intellij.compiler.options;
17
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;
30
31 import javax.swing.*;
32 import java.awt.*;
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;
38
39 /**
40  * @author Eugene Zhuravlev
41  *         Date: Mar 30, 2004
42  */
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;
49
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;
56
57   public JavaCompilersTab(final Project project) {
58     this(project, ((CompilerConfigurationImpl)CompilerConfiguration.getInstance(project)).getRegisteredJavaCompilers(),
59          ((CompilerConfigurationImpl)CompilerConfiguration.getInstance(project)).getDefaultCompiler());
60   }
61
62   public JavaCompilersTab(final Project project, Collection<BackendCompiler> compilers, BackendCompiler defaultCompiler) {
63     myProject = project;
64     myDefaultCompiler = defaultCompiler;
65     myCompilerConfiguration = (CompilerConfigurationImpl)CompilerConfiguration.getInstance(project);
66     myConfigurables = new ArrayList<Configurable>(compilers.size());
67
68     myCardLayout = new CardLayout();
69     myContentPanel.setLayout(myCardLayout);
70
71     myTargetOptionsPanel.setLayout(new BorderLayout());
72     myTargetLevelComponent = new TargetOptionsComponent(project);
73     myTargetOptionsPanel.add(myTargetLevelComponent, BorderLayout.CENTER);
74
75     for (BackendCompiler compiler : compilers) {
76       Configurable configurable = compiler.createConfigurable();
77       myConfigurables.add(configurable);
78
79       myContentPanel.add(configurable.createComponent(), compiler.getId());
80     }
81     myCompiler.setModel(new DefaultComboBoxModel(new Vector(compilers)));
82     myCompiler.setRenderer(new ListCellRendererWrapper<BackendCompiler>() {
83       @Override
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() : "");
86       }
87     });
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);
93         }
94       }
95     });
96   }
97
98   public String getDisplayName() {
99     return CompilerBundle.message("java.compiler.description");
100   }
101
102   public String getHelpTopic() {
103     return "reference.projectsettings.compiler.javacompiler";
104   }
105
106   @NotNull
107   public String getId() {
108     return getHelpTopic();
109   }
110
111   public Runnable enableSearch(String option) {
112     return null;
113   }
114
115   public JComponent createComponent() {
116     return myPanel;
117   }
118
119   public boolean isModified() {
120     if (!Comparing.equal(mySelectedCompiler, myCompilerConfiguration.getDefaultCompiler())) {
121       return true;
122     }
123     for (Configurable configurable : myConfigurables) {
124       if (configurable.isModified()) {
125         return true;
126       }
127     }
128     if (!Comparing.equal(myTargetLevelComponent.getProjectBytecodeTarget(), myCompilerConfiguration.getProjectBytecodeTarget())) {
129       return true;
130     }
131     if (!Comparing.equal(myTargetLevelComponent.getModulesBytecodeTargetMap(), myCompilerConfiguration.getModulesBytecodeTargetMap())) {
132       return true;
133     }
134     return false;
135   }
136
137   public void apply() throws ConfigurationException {
138     boolean modified = false;
139     try {
140       for (Configurable configurable : myConfigurables) {
141         if (configurable.isModified()) {
142           modified = true;
143           configurable.apply();
144         }
145       }
146       myCompilerConfiguration.setDefaultCompiler(mySelectedCompiler);
147       myCompilerConfiguration.setProjectBytecodeTarget(myTargetLevelComponent.getProjectBytecodeTarget());
148       myCompilerConfiguration.setModulesBytecodeTargetMap(myTargetLevelComponent.getModulesBytecodeTargetMap());
149
150       myTargetLevelComponent.setProjectBytecodeTargetLevel(myCompilerConfiguration.getProjectBytecodeTarget());
151       myTargetLevelComponent.setModuleTargetLevels(myCompilerConfiguration.getModulesBytecodeTargetMap());
152     }
153     finally {
154       if (modified) {
155         BuildManager.getInstance().clearState(myProject);
156       }
157     }
158   }
159
160   public void reset() {
161     for (Configurable configurable : myConfigurables) {
162       configurable.reset();
163     }
164     selectCompiler(myCompilerConfiguration.getDefaultCompiler());
165     myTargetLevelComponent.setProjectBytecodeTargetLevel(myCompilerConfiguration.getProjectBytecodeTarget());
166     myTargetLevelComponent.setModuleTargetLevels(myCompilerConfiguration.getModulesBytecodeTargetMap());
167   }
168
169   public void disposeUIResources() {
170   }
171
172   private void selectCompiler(BackendCompiler compiler) {
173     if(compiler == null) {
174       compiler = myDefaultCompiler;
175     }
176     myCompiler.setSelectedItem(compiler);
177     mySelectedCompiler = compiler;
178     myCardLayout.show(myContentPanel, compiler.getId());
179     myContentPanel.revalidate();
180     myContentPanel.repaint();
181   }
182 }