blob: 66931e49de158b8de4d0efcf80070d1b6c18baed [file] [log] [blame]
/*
* Copyright 2000-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.openapi.roots.ui.configuration;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationBundle;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectBundle;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.SdkModel;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.ui.configuration.projectRoot.ModuleStructureConfigurable;
import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel;
import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext;
import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ModuleProjectStructureElement;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Condition;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* User: anna
* Date: 05-Jun-2006
*/
public abstract class ModuleJdkConfigurable implements Disposable {
private JdkComboBox myCbModuleJdk;
private Sdk mySelectedModuleJdk = null;
private JPanel myJdkPanel;
private ClasspathEditor myModuleEditor;
private final ProjectSdksModel myJdksModel;
private boolean myFreeze = false;
private final SdkModel.Listener myListener = new SdkModel.Listener() {
@Override
public void sdkAdded(Sdk sdk) {
reloadModel();
}
@Override
public void beforeSdkRemove(Sdk sdk) {
reloadModel();
}
@Override
public void sdkChanged(Sdk sdk, String previousName) {
reloadModel();
}
@Override
public void sdkHomeSelected(Sdk sdk, String newSdkHome) {
reloadModel();
}
};
public ModuleJdkConfigurable(ClasspathEditor moduleEditor, ProjectSdksModel jdksModel) {
myModuleEditor = moduleEditor;
myJdksModel = jdksModel;
myJdksModel.addListener(myListener);
init();
}
/**
* @return null if JDK should be inherited
*/
@Nullable
public Sdk getSelectedModuleJdk() {
return myJdksModel.findSdk(mySelectedModuleJdk);
}
public boolean isInheritJdk() {
return myCbModuleJdk.getSelectedItem()instanceof JdkComboBox.ProjectJdkComboBoxItem;
}
public JComponent createComponent() {
return myJdkPanel;
}
private void reloadModel() {
myFreeze = true;
myCbModuleJdk.reloadModel(new JdkComboBox.ProjectJdkComboBoxItem(), getRootModel().getModule().getProject());
reset();
myFreeze = false;
}
protected abstract ModifiableRootModel getRootModel();
private void init() {
myJdkPanel = new JPanel(new GridBagLayout());
myCbModuleJdk = new JdkComboBox(myJdksModel);
myCbModuleJdk.insertItemAt(new JdkComboBox.ProjectJdkComboBoxItem(), 0);
myCbModuleJdk.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (myFreeze) return;
final Sdk newJdk = myCbModuleJdk.getSelectedJdk();
myModuleEditor.setSdk(newJdk);
clearCaches();
}
});
myJdkPanel.add(new JLabel(ProjectBundle.message("module.libraries.target.jdk.module.radio")),
new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(12, 6, 12, 0), 0, 0));
myJdkPanel.add(myCbModuleJdk, new GridBagConstraints(1, 0, 1, 1, 0, 1.0,
GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,
new Insets(6, 6, 12, 0), 0, 0));
final Project project = getRootModel().getModule().getProject();
final JButton setUpButton = new JButton(ApplicationBundle.message("button.new"));
myCbModuleJdk
.setSetupButton(setUpButton, project, myJdksModel, new JdkComboBox.ProjectJdkComboBoxItem(), new Condition<Sdk>() {
@Override
public boolean value(Sdk jdk) {
final Sdk projectJdk = myJdksModel.getProjectSdk();
if (projectJdk == null) {
final int res =
Messages.showYesNoDialog(myJdkPanel,
ProjectBundle.message("project.roots.no.jdk.on.project.message"),
ProjectBundle.message("project.roots.no.jdk.on.project.title"),
Messages.getInformationIcon());
if (res == Messages.YES) {
myJdksModel.setProjectSdk(jdk);
return true;
}
}
return false;
}
}, true);
myJdkPanel.add(setUpButton, new GridBagConstraints(2, 0, 1, 1, 0, 0,
GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(0, 4, 7, 0), 0, 0));
final JButton editButton = new JButton(ApplicationBundle.message("button.edit"));
myCbModuleJdk.setEditButton(editButton, getRootModel().getModule().getProject(), new Computable<Sdk>() {
@Override
@Nullable
public Sdk compute() {
return getRootModel().getSdk();
}
});
myJdkPanel.add(editButton,
new GridBagConstraints(GridBagConstraints.RELATIVE, 0, 1, 1, 1.0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(0, 4, 7, 0), 0, 0));
}
private void clearCaches() {
final Module module = getRootModel().getModule();
final Project project = module.getProject();
final StructureConfigurableContext context = ModuleStructureConfigurable.getInstance(project).getContext();
context.getDaemonAnalyzer().queueUpdate(new ModuleProjectStructureElement(context, module));
}
public void reset() {
myFreeze = true;
final String jdkName = getRootModel().getSdkName();
if (jdkName != null && !getRootModel().isSdkInherited()) {
mySelectedModuleJdk = myJdksModel.findSdk(jdkName);
if (mySelectedModuleJdk != null) {
myCbModuleJdk.setSelectedJdk(mySelectedModuleJdk);
} else {
myCbModuleJdk.setInvalidJdk(jdkName);
clearCaches();
}
}
else {
myCbModuleJdk.setSelectedJdk(null);
}
myFreeze = false;
}
@Override
public void dispose() {
myModuleEditor = null;
myCbModuleJdk = null;
myJdkPanel = null;
myJdksModel.removeListener(myListener);
}
}