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.
16 package com
.intellij
.openapi
.roots
.ui
.configuration
.projectRoot
;
18 import com
.intellij
.openapi
.actionSystem
.AnAction
;
19 import com
.intellij
.openapi
.actionSystem
.AnActionEvent
;
20 import com
.intellij
.openapi
.actionSystem
.DefaultActionGroup
;
21 import com
.intellij
.openapi
.components
.State
;
22 import com
.intellij
.openapi
.components
.Storage
;
23 import com
.intellij
.openapi
.options
.ConfigurationException
;
24 import com
.intellij
.openapi
.options
.ShowSettingsUtil
;
25 import com
.intellij
.openapi
.project
.Project
;
26 import com
.intellij
.openapi
.project
.ProjectBundle
;
27 import com
.intellij
.openapi
.projectRoots
.Sdk
;
28 import com
.intellij
.openapi
.projectRoots
.SdkModel
;
29 import com
.intellij
.openapi
.projectRoots
.impl
.ProjectJdkImpl
;
30 import com
.intellij
.openapi
.roots
.ProjectRootManager
;
31 import com
.intellij
.openapi
.roots
.ui
.configuration
.ProjectStructureConfigurable
;
32 import com
.intellij
.openapi
.roots
.ui
.configuration
.projectRoot
.daemon
.ProjectStructureElement
;
33 import com
.intellij
.openapi
.roots
.ui
.configuration
.projectRoot
.daemon
.SdkProjectStructureElement
;
34 import com
.intellij
.openapi
.ui
.MasterDetailsComponent
;
35 import com
.intellij
.openapi
.ui
.NamedConfigurable
;
36 import com
.intellij
.util
.Consumer
;
37 import org
.jetbrains
.annotations
.Nls
;
38 import org
.jetbrains
.annotations
.NonNls
;
39 import org
.jetbrains
.annotations
.NotNull
;
40 import org
.jetbrains
.annotations
.Nullable
;
43 import javax
.swing
.tree
.TreePath
;
44 import java
.util
.ArrayList
;
45 import java
.util
.Collection
;
46 import java
.util
.HashMap
;
47 import java
.util
.List
;
50 name
= "JdkListConfigurable.UI",
54 file
= "$WORKSPACE_FILE$"
57 public class JdkListConfigurable
extends BaseStructureConfigurable
{
59 private final ProjectJdksModel myJdksTreeModel
;
62 SdkModel
.Listener myListener
= new SdkModel
.Listener() {
63 public void sdkAdded(Sdk sdk
) {
66 public void beforeSdkRemove(Sdk sdk
) {
69 public void sdkChanged(Sdk sdk
, String previousName
) {
73 public void sdkHomeSelected(Sdk sdk
, String newSdkHome
) {
77 private void updateName() {
78 final TreePath path
= myTree
.getSelectionPath();
80 final NamedConfigurable configurable
= ((MyNode
)path
.getLastPathComponent()).getConfigurable();
81 if (configurable
!= null && configurable
instanceof JdkConfigurable
) {
82 configurable
.updateName();
88 public JdkListConfigurable(final Project project
, ProjectStructureConfigurable root
) {
90 myJdksTreeModel
= root
.getProjectJdksModel();
91 myJdksTreeModel
.addListener(myListener
);
93 protected void processRemovedItems() {
96 protected boolean wasObjectStored(final Object editableObject
) {
101 public String
getDisplayName() {
106 public Icon
getIcon() {
112 public String
getHelpTopic() {
113 return "reference.settingsdialog.project.structure.jdk";
117 public String
getId() {
122 public Runnable
enableSearch(final String option
) {
126 protected void loadTree() {
127 final HashMap
<Sdk
,Sdk
> sdks
= myJdksTreeModel
.getProjectJdks();
128 for (Sdk sdk
: sdks
.keySet()) {
129 final JdkConfigurable configurable
= new JdkConfigurable((ProjectJdkImpl
)sdks
.get(sdk
), myJdksTreeModel
, TREE_UPDATER
, myHistory
,
131 addNode(new MyNode(configurable
), myRoot
);
137 protected Collection
<?
extends ProjectStructureElement
> getProjectStructureElements() {
138 final List
<ProjectStructureElement
> result
= new ArrayList
<ProjectStructureElement
>();
139 for (Sdk sdk
: myJdksTreeModel
.getProjectJdks().values()) {
140 result
.add(new SdkProjectStructureElement(myContext
, sdk
));
145 public boolean addJdkNode(final Sdk jdk
, final boolean selectInTree
) {
147 myContext
.getDaemonAnalyzer().queueUpdate(new SdkProjectStructureElement(myContext
, jdk
));
148 addNode(new MyNode(new JdkConfigurable((ProjectJdkImpl
)jdk
, myJdksTreeModel
, TREE_UPDATER
, myHistory
, myProject
)), myRoot
);
150 selectNodeInTree(MasterDetailsComponent
.findNodeByObject(myRoot
, jdk
));
157 public void dispose() {
158 myJdksTreeModel
.removeListener(myListener
);
159 myJdksTreeModel
.disposeUIResources();
162 public ProjectJdksModel
getJdksTreeModel() {
163 return myJdksTreeModel
;
166 public void reset() {
168 myTree
.setRootVisible(false);
171 public void apply() throws ConfigurationException
{
172 boolean modifiedJdks
= false;
173 for (int i
= 0; i
< myRoot
.getChildCount(); i
++) {
174 final NamedConfigurable configurable
= ((MyNode
)myRoot
.getChildAt(i
)).getConfigurable();
175 if (configurable
.isModified()) {
176 configurable
.apply();
181 if (myJdksTreeModel
.isModified() || modifiedJdks
) myJdksTreeModel
.apply(this);
182 myJdksTreeModel
.setProjectJdk(ProjectRootManager
.getInstance(myProject
).getProjectJdk());
185 public boolean isModified() {
186 return super.isModified() || myJdksTreeModel
.isModified();
189 public static JdkListConfigurable
getInstance(Project project
) {
190 return ShowSettingsUtil
.getInstance().findProjectConfigurable(project
, JdkListConfigurable
.class);
193 public AbstractAddGroup
createAddAction() {
194 return new AbstractAddGroup(ProjectBundle
.message("add.new.jdk.text")) {
195 public AnAction
[] getChildren(@Nullable final AnActionEvent e
) {
196 DefaultActionGroup group
= new DefaultActionGroup(ProjectBundle
.message("add.new.jdk.text"), true);
197 myJdksTreeModel
.createAddActions(group
, myTree
, new Consumer
<Sdk
>() {
198 public void consume(final Sdk projectJdk
) {
199 addJdkNode(projectJdk
, true);
202 return group
.getChildren(null);
207 protected void removeJdk(final Sdk jdk
) {
208 myJdksTreeModel
.removeJdk(jdk
);
209 myContext
.getDaemonAnalyzer().removeElement(new SdkProjectStructureElement(myContext
, jdk
));
214 String
getEmptySelectionString() {
215 return "Select a JDK to view or edit its details here";