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
;
38 import java
.awt
.event
.ActionEvent
;
39 import java
.awt
.event
.ActionListener
;
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
) {
58 public void beforeSdkRemove(Sdk sdk
) {
62 public void sdkChanged(Sdk sdk
, String previousName
) {
66 public void sdkHomeSelected(Sdk sdk
, String newSdkHome
) {
71 public ModuleJdkConfigurable(ClasspathEditor moduleEditor
, ModifiableRootModel model
, ProjectJdksModel jdksModel
) {
72 myModuleEditor
= moduleEditor
;
74 myJdksModel
= jdksModel
;
75 myJdksModel
.addListener(myListener
);
80 * @return null if JDK should be inherited
83 public Sdk
getSelectedModuleJdk() {
84 return myJdksModel
.findSdk(mySelectedModuleJdk
);
87 public boolean isInheritJdk() {
88 return myCbModuleJdk
.getSelectedItem()instanceof JdkComboBox
.ProjectJdkComboBoxItem
;
91 public JComponent
createComponent() {
95 private void reloadModel() {
97 myCbModuleJdk
.reloadModel(new JdkComboBox
.ProjectJdkComboBoxItem(), myRootModel
.getModule().getProject());
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
);
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){
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
);
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
>() {
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() {
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
);
172 myCbModuleJdk
.setInvalidJdk(jdkName
);
173 clearCaches(null, null);
177 myCbModuleJdk
.setSelectedJdk(null);
182 public void dispose() {
183 myModuleEditor
= null;
184 myCbModuleJdk
= null;
186 myJdksModel
.removeListener(myListener
);