find usages & validation in project structure reworked
[fedora-idea.git] / java / idea-ui / src / com / intellij / openapi / roots / ui / configuration / projectRoot / JdkListConfigurable.java
blob1204e297a5680dee7a230fbb03c2d33aed1ba4b2
1 /*
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;
42 import javax.swing.*;
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;
49 @State(
50 name = "JdkListConfigurable.UI",
51 storages = {
52 @Storage(
53 id ="other",
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) {
70 updateName();
73 public void sdkHomeSelected(Sdk sdk, String newSdkHome) {
74 updateName();
77 private void updateName() {
78 final TreePath path = myTree.getSelectionPath();
79 if (path != null) {
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) {
89 super(project);
90 myJdksTreeModel = root.getProjectJdksModel();
91 myJdksTreeModel.addListener(myListener);
93 protected void processRemovedItems() {
96 protected boolean wasObjectStored(final Object editableObject) {
97 return false;
100 @Nls
101 public String getDisplayName() {
102 return "SDKs";
105 @Nullable
106 public Icon getIcon() {
107 return null;
110 @Nullable
111 @NonNls
112 public String getHelpTopic() {
113 return "reference.settingsdialog.project.structure.jdk";
116 @NonNls
117 public String getId() {
118 return "jdk.list";
121 @Nullable
122 public Runnable enableSearch(final String option) {
123 return null;
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,
130 myProject);
131 addNode(new MyNode(configurable), myRoot);
135 @NotNull
136 @Override
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));
142 return result;
145 public boolean addJdkNode(final Sdk jdk, final boolean selectInTree) {
146 if (!myUiDisposed) {
147 myContext.getDaemonAnalyzer().queueUpdate(new SdkProjectStructureElement(myContext, jdk));
148 addNode(new MyNode(new JdkConfigurable((ProjectJdkImpl)jdk, myJdksTreeModel, TREE_UPDATER, myHistory, myProject)), myRoot);
149 if (selectInTree) {
150 selectNodeInTree(MasterDetailsComponent.findNodeByObject(myRoot, jdk));
152 return true;
154 return false;
157 public void dispose() {
158 myJdksTreeModel.removeListener(myListener);
159 myJdksTreeModel.disposeUIResources();
162 public ProjectJdksModel getJdksTreeModel() {
163 return myJdksTreeModel;
166 public void reset() {
167 super.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();
177 modifiedJdks = true;
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));
212 protected
213 @Nullable
214 String getEmptySelectionString() {
215 return "Select a JDK to view or edit its details here";