2 * Copyright (c) 2000-2006 JetBrains s.r.o. All Rights Reserved.
6 * Created by IntelliJ IDEA.
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
;
38 import javax
.swing
.tree
.DefaultMutableTreeNode
;
39 import javax
.swing
.tree
.TreePath
;
41 import java
.util
.ArrayList
;
42 import java
.util
.HashMap
;
43 import java
.util
.HashSet
;
46 public class ProjectJdksConfigurable
extends MasterDetailsComponent
implements Configurable
.Assistant
{
48 private final ProjectJdksModel myProjectJdksModel
;
49 private final Project myProject
;
51 private static final String SPLITTER_PROPORTION
= "project.jdk.splitter";
53 public ProjectJdksConfigurable(Project project
) {
56 myProjectJdksModel
= ProjectJdksModel
.getInstance(project
);
57 ServiceManager
.getService(project
, MasterDetailsStateService
.class).register("ProjectJDKs.UI", this);
61 protected void initTree() {
63 new TreeSpeedSearch(myTree
, new Convertor
<TreePath
, String
>() {
64 public String
convert(final TreePath treePath
) {
65 return ((MyNode
)treePath
.getLastPathComponent()).getDisplayName();
69 myTree
.setRootVisible(false);
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
);
87 final Splitter splitter
= extractSplitter();
88 if (splitter
!= null) {
89 (splitter
).setProportion(Float
.parseFloat(value
));
92 catch (NumberFormatException e
) {
93 //do not set proportion
99 private Splitter
extractSplitter() {
100 final Component
[] components
= myWholePanel
.getComponents();
101 if (components
.length
== 1 && components
[0] instanceof Splitter
) {
102 return (Splitter
)components
[0];
107 public void apply() throws ConfigurationException
{
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();
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();
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()));
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
);
174 public Sdk
getSelectedJdk() {
175 return (Sdk
)getSelectedObject();
178 public void selectJdk(final Sdk projectJdk
) {
179 selectNodeInTree(projectJdk
);
183 public String
getDisplayName() {
188 public Icon
getIcon() {
194 public String
getHelpTopic() {
200 String
getEmptySelectionString() {
201 return "Select a JDK to view or edit its details here";