migrated to artifacts
[fedora-idea.git] / java / idea-ui / src / com / intellij / openapi / roots / ui / configuration / ProjectJdksConfigurable.java
bloba6b9004ef35d16b7966fc4cca9f9889c5e641bd6
1 /*
2 * Copyright (c) 2000-2006 JetBrains s.r.o. All Rights Reserved.
3 */
5 /*
6 * Created by IntelliJ IDEA.
7 * User: Anna.Kozlova
8 * Date: 16-Aug-2006
9 * Time: 16:56:21
11 package com.intellij.openapi.roots.ui.configuration;
13 import com.intellij.ide.util.PropertiesComponent;
14 import com.intellij.openapi.actionSystem.AnAction;
15 import com.intellij.openapi.actionSystem.DefaultActionGroup;
16 import com.intellij.openapi.components.ServiceManager;
17 import com.intellij.openapi.options.Configurable;
18 import com.intellij.openapi.options.ConfigurationException;
19 import com.intellij.openapi.project.Project;
20 import com.intellij.openapi.project.ProjectBundle;
21 import com.intellij.openapi.projectRoots.Sdk;
22 import com.intellij.openapi.projectRoots.impl.ProjectJdkImpl;
23 import com.intellij.openapi.roots.ui.configuration.projectRoot.JdkConfigurable;
24 import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectJdksModel;
25 import com.intellij.openapi.ui.MasterDetailsComponent;
26 import com.intellij.openapi.ui.MasterDetailsStateService;
27 import com.intellij.openapi.ui.NamedConfigurable;
28 import com.intellij.openapi.ui.Splitter;
29 import com.intellij.openapi.util.Conditions;
30 import com.intellij.ui.TreeSpeedSearch;
31 import com.intellij.util.Consumer;
32 import com.intellij.util.Icons;
33 import com.intellij.util.containers.Convertor;
34 import org.jetbrains.annotations.NonNls;
35 import org.jetbrains.annotations.Nullable;
37 import javax.swing.*;
38 import javax.swing.tree.DefaultMutableTreeNode;
39 import javax.swing.tree.TreePath;
40 import java.awt.*;
41 import java.util.ArrayList;
42 import java.util.HashMap;
43 import java.util.HashSet;
44 import java.util.Set;
46 public class ProjectJdksConfigurable extends MasterDetailsComponent implements Configurable.Assistant {
48 private final ProjectJdksModel myProjectJdksModel;
49 private final Project myProject;
50 @NonNls
51 private static final String SPLITTER_PROPORTION = "project.jdk.splitter";
53 public ProjectJdksConfigurable(Project project) {
54 super();
55 myProject = project;
56 myProjectJdksModel = ProjectJdksModel.getInstance(project);
57 ServiceManager.getService(project, MasterDetailsStateService.class).register("ProjectJDKs.UI", this);
58 initTree();
61 protected void initTree() {
62 super.initTree();
63 new TreeSpeedSearch(myTree, new Convertor<TreePath, String>() {
64 public String convert(final TreePath treePath) {
65 return ((MyNode)treePath.getLastPathComponent()).getDisplayName();
67 }, true);
69 myTree.setRootVisible(false);
72 public void reset() {
73 super.reset();
75 myProjectJdksModel.reset(myProject);
77 myRoot.removeAllChildren();
78 final HashMap<Sdk, Sdk> sdks = myProjectJdksModel.getProjectJdks();
79 for (Sdk sdk : sdks.keySet()) {
80 final JdkConfigurable configurable = new JdkConfigurable((ProjectJdkImpl)sdks.get(sdk), myProjectJdksModel, TREE_UPDATER, myHistory);
81 addNode(new MyNode(configurable), myRoot);
83 selectJdk(myProjectJdksModel.getProjectJdk()); //restore selection
84 final String value = PropertiesComponent.getInstance().getValue(SPLITTER_PROPORTION);
85 if (value != null) {
86 try {
87 final Splitter splitter = extractSplitter();
88 if (splitter != null) {
89 (splitter).setProportion(Float.parseFloat(value));
92 catch (NumberFormatException e) {
93 //do not set proportion
98 @Nullable
99 private Splitter extractSplitter() {
100 final Component[] components = myWholePanel.getComponents();
101 if (components.length == 1 && components[0] instanceof Splitter) {
102 return (Splitter)components[0];
104 return null;
107 public void apply() throws ConfigurationException {
108 super.apply();
109 boolean modifiedJdks = false;
110 for (int i = 0; i < myRoot.getChildCount(); i++) {
111 final NamedConfigurable configurable = ((MyNode)myRoot.getChildAt(i)).getConfigurable();
112 if (configurable.isModified()) {
113 configurable.apply();
114 modifiedJdks = true;
118 if (myProjectJdksModel.isModified() || modifiedJdks) myProjectJdksModel.apply(this);
119 myProjectJdksModel.setProjectJdk(getSelectedJdk());
123 public boolean isModified() {
124 return super.isModified() || myProjectJdksModel.isModified();
128 public void disposeUIResources() {
129 final Splitter splitter = extractSplitter();
130 if (splitter != null) {
131 PropertiesComponent.getInstance().setValue(SPLITTER_PROPORTION, String.valueOf(splitter.getProportion()));
133 myProjectJdksModel.disposeUIResources();
134 super.disposeUIResources();
137 @Nullable
138 protected ArrayList<AnAction> createActions(final boolean fromPopup) {
139 final ArrayList<AnAction> actions = new ArrayList<AnAction>();
140 DefaultActionGroup group = new DefaultActionGroup(ProjectBundle.message("add.new.jdk.text"), true);
141 group.getTemplatePresentation().setIcon(Icons.ADD_ICON);
142 myProjectJdksModel.createAddActions(group, myTree, new Consumer<Sdk>() {
143 public void consume(final Sdk projectJdk) {
144 addNode(new MyNode(new JdkConfigurable(((ProjectJdkImpl)projectJdk), myProjectJdksModel, TREE_UPDATER, myHistory), false), myRoot);
145 selectNodeInTree(findNodeByObject(myRoot, projectJdk));
148 actions.add(new MyActionGroupWrapper(group));
149 actions.add(new MyDeleteAction(Conditions.alwaysTrue()));
150 return actions;
153 protected void processRemovedItems() {
154 final Set<Sdk> jdks = new HashSet<Sdk>();
155 for(int i = 0; i < myRoot.getChildCount(); i++){
156 final DefaultMutableTreeNode node = (DefaultMutableTreeNode)myRoot.getChildAt(i);
157 final NamedConfigurable namedConfigurable = (NamedConfigurable)node.getUserObject();
158 jdks.add(((JdkConfigurable)namedConfigurable).getEditableObject());
160 final HashMap<Sdk, Sdk> sdks = new HashMap<Sdk, Sdk>(myProjectJdksModel.getProjectJdks());
161 for (Sdk sdk : sdks.values()) {
162 if (!jdks.contains(sdk)) {
163 myProjectJdksModel.removeJdk(sdk);
168 protected boolean wasObjectStored(Object editableObject) {
169 //noinspection RedundantCast
170 return myProjectJdksModel.getProjectJdks().containsKey((Sdk)editableObject);
173 @Nullable
174 public Sdk getSelectedJdk() {
175 return (Sdk)getSelectedObject();
178 public void selectJdk(final Sdk projectJdk) {
179 selectNodeInTree(projectJdk);
182 @Nullable
183 public String getDisplayName() {
184 return null;
187 @Nullable
188 public Icon getIcon() {
189 return null;
192 @Nullable
193 @NonNls
194 public String getHelpTopic() {
195 return null;
198 protected
199 @Nullable
200 String getEmptySelectionString() {
201 return "Select a JDK to view or edit its details here";