find usages & validation in project structure reworked
[fedora-idea.git] / java / idea-ui / src / com / intellij / openapi / roots / ui / configuration / ModuleJdkConfigurable.java
blob17d23aa97954a62b041f4ba9797d0365c3b6482a
1 /*
2 * Copyright 2000-2009 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.
17 package com.intellij.openapi.roots.ui.configuration;
19 import com.intellij.openapi.Disposable;
20 import com.intellij.openapi.module.Module;
21 import com.intellij.openapi.project.Project;
22 import com.intellij.openapi.project.ProjectBundle;
23 import com.intellij.openapi.projectRoots.Sdk;
24 import com.intellij.openapi.projectRoots.SdkModel;
25 import com.intellij.openapi.roots.ModifiableRootModel;
26 import com.intellij.openapi.roots.ui.configuration.projectRoot.ModuleStructureConfigurable;
27 import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectJdksModel;
28 import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext;
29 import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ModuleProjectStructureElement;
30 import com.intellij.openapi.ui.DialogWrapper;
31 import com.intellij.openapi.ui.Messages;
32 import com.intellij.openapi.util.Computable;
33 import com.intellij.openapi.util.Condition;
34 import org.jetbrains.annotations.Nullable;
36 import javax.swing.*;
37 import java.awt.*;
38 import java.awt.event.ActionEvent;
39 import java.awt.event.ActionListener;
41 /**
42 * User: anna
43 * Date: 05-Jun-2006
45 public class ModuleJdkConfigurable implements Disposable {
46 private JdkComboBox myCbModuleJdk;
47 private Sdk mySelectedModuleJdk = null;
48 private final ModifiableRootModel myRootModel;
49 private JPanel myJdkPanel;
50 private ClasspathEditor myModuleEditor;
51 private final ProjectJdksModel myJdksModel;
52 private boolean myFreeze = false;
53 private final SdkModel.Listener myListener = new SdkModel.Listener() {
54 public void sdkAdded(Sdk sdk) {
55 reloadModel();
58 public void beforeSdkRemove(Sdk sdk) {
59 reloadModel();
62 public void sdkChanged(Sdk sdk, String previousName) {
63 reloadModel();
66 public void sdkHomeSelected(Sdk sdk, String newSdkHome) {
67 reloadModel();
71 public ModuleJdkConfigurable(ClasspathEditor moduleEditor, ModifiableRootModel model, ProjectJdksModel jdksModel) {
72 myModuleEditor = moduleEditor;
73 myRootModel = model;
74 myJdksModel = jdksModel;
75 myJdksModel.addListener(myListener);
76 init();
79 /**
80 * @return null if JDK should be inherited
82 @Nullable
83 public Sdk getSelectedModuleJdk() {
84 return myJdksModel.findSdk(mySelectedModuleJdk);
87 public boolean isInheritJdk() {
88 return myCbModuleJdk.getSelectedItem()instanceof JdkComboBox.ProjectJdkComboBoxItem;
91 public JComponent createComponent() {
92 return myJdkPanel;
95 private void reloadModel() {
96 myFreeze = true;
97 myCbModuleJdk.reloadModel(new JdkComboBox.ProjectJdkComboBoxItem(), myRootModel.getModule().getProject());
98 reset();
99 myFreeze = false;
102 private void init() {
103 myJdkPanel = new JPanel(new GridBagLayout());
104 myCbModuleJdk = new JdkComboBox(myJdksModel);
105 myCbModuleJdk.insertItemAt(new JdkComboBox.ProjectJdkComboBoxItem(), 0);
106 myCbModuleJdk.addActionListener(new ActionListener() {
107 public void actionPerformed(ActionEvent e) {
108 if (myFreeze) return;
109 final Sdk oldJdk = myRootModel.getSdk();
110 mySelectedModuleJdk = myCbModuleJdk.getSelectedJdk();
111 final Sdk selectedModuleJdk = getSelectedModuleJdk();
112 if (selectedModuleJdk != null) {
113 myRootModel.setSdk(selectedModuleJdk);
115 else {
116 myRootModel.inheritSdk();
118 clearCaches(oldJdk, selectedModuleJdk);
119 myModuleEditor.flushChangesToModel();
122 myJdkPanel.add(new JLabel(ProjectBundle.message("module.libraries.target.jdk.module.radio")),
123 new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(12, 6, 12, 0), 0, 0));
124 myJdkPanel.add(myCbModuleJdk, new GridBagConstraints(1, 0, 1, 1, 0, 1.0,
125 GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,
126 new Insets(6, 6, 12, 0), 0, 0));
127 final Project project = myRootModel.getModule().getProject();
128 final JButton setUpButton = myCbModuleJdk
129 .createSetupButton(project, myJdksModel, new JdkComboBox.ProjectJdkComboBoxItem(), new Condition<Sdk>(){
130 public boolean value(Sdk jdk) {
131 final Sdk projectJdk = myJdksModel.getProjectJdk();
132 if (projectJdk == null){
133 final int res =
134 Messages.showYesNoDialog(myJdkPanel,
135 ProjectBundle.message("project.roots.no.jdk.on.project.message"),
136 ProjectBundle.message("project.roots.no.jdk.on.projecct.title"),
137 Messages.getInformationIcon());
138 if (res == DialogWrapper.OK_EXIT_CODE){
139 myJdksModel.setProjectJdk(jdk);
140 return true;
143 return false;
145 }, true);
146 myJdkPanel.add(setUpButton, new GridBagConstraints(2, 0, 1, 1, 0, 0,
147 GridBagConstraints.WEST, GridBagConstraints.NONE,
148 new Insets(0, 4, 7, 0), 0, 0));
149 myCbModuleJdk.appendEditButton(myRootModel.getModule().getProject(), myJdkPanel, new GridBagConstraints(GridBagConstraints.RELATIVE, 0, 1, 1, 1.0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 4, 7, 0), 0, 0) , new Computable<Sdk>() {
150 @Nullable
151 public Sdk compute() {
152 return myRootModel.getSdk();
157 private void clearCaches(final Sdk oldJdk, final Sdk selectedModuleJdk) {
158 final Module module = myRootModel.getModule();
159 final Project project = module.getProject();
160 final StructureConfigurableContext context = ModuleStructureConfigurable.getInstance(project).getContext();
161 context.getDaemonAnalyzer().queueUpdate(new ModuleProjectStructureElement(context, module));
164 public void reset() {
165 myFreeze = true;
166 final String jdkName = myRootModel.getSdkName();
167 if (jdkName != null && !myRootModel.isSdkInherited()) {
168 mySelectedModuleJdk = myJdksModel.findSdk(jdkName);
169 if (mySelectedModuleJdk != null) {
170 myCbModuleJdk.setSelectedJdk(mySelectedModuleJdk);
171 } else {
172 myCbModuleJdk.setInvalidJdk(jdkName);
173 clearCaches(null, null);
176 else {
177 myCbModuleJdk.setSelectedJdk(null);
179 myFreeze = false;
182 public void dispose() {
183 myModuleEditor = null;
184 myCbModuleJdk = null;
185 myJdkPanel = null;
186 myJdksModel.removeListener(myListener);