update copyrights
[idea/community.git] / platform / lang-api / src / com / intellij / openapi / projectRoots / SdkType.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 package com.intellij.openapi.projectRoots;
17
18 import com.intellij.openapi.application.ApplicationManager;
19 import com.intellij.openapi.extensions.ExtensionPointName;
20 import com.intellij.openapi.extensions.Extensions;
21 import com.intellij.openapi.util.IconLoader;
22 import com.intellij.openapi.util.SystemInfo;
23 import com.intellij.openapi.fileChooser.FileChooserDescriptor;
24 import com.intellij.openapi.vfs.VirtualFile;
25 import com.intellij.openapi.project.ProjectBundle;
26 import com.intellij.openapi.roots.OrderRootType;
27 import org.jdom.Element;
28 import org.jetbrains.annotations.NonNls;
29 import org.jetbrains.annotations.Nullable;
30
31 import javax.swing.*;
32 import java.util.ArrayList;
33 import java.util.Collections;
34 import java.util.List;
35
36 public abstract class SdkType {
37   public static ExtensionPointName<SdkType> EP_NAME = ExtensionPointName.create("com.intellij.sdkType");
38
39   private final String myName;
40
41   @NonNls public static final String MAC_HOME_PATH = "/Home";
42
43   /**
44    * @return path to set up filechooser to or null if not applicable
45    */
46   @Nullable
47   public abstract String suggestHomePath();
48
49   public abstract boolean isValidSdkHome(String path);
50
51
52   @Nullable
53   public String getVersionString(Sdk sdk) {
54     return getVersionString(sdk.getHomePath());
55   }
56
57   @Nullable
58   public String getVersionString(String sdkHome){
59     return null;
60   }
61
62   public abstract String suggestSdkName(String currentSdkName, String sdkHome);
63
64   public void setupSdkPaths(Sdk sdk) {}
65
66   public boolean setupSdkPaths(final Sdk sdk, final SdkModel sdkModel) {
67     setupSdkPaths(sdk);
68     return true;
69   }
70
71   /**
72    * @return Configurable object for the sdk's additional data or null if not applicable
73    * @param sdkModel
74    * @param sdkModificator
75    */
76   public abstract AdditionalDataConfigurable createAdditionalDataConfigurable(SdkModel sdkModel, SdkModificator sdkModificator);
77
78   public abstract void saveAdditionalData(SdkAdditionalData additionalData, Element additional);
79
80   @Nullable
81   public SdkAdditionalData loadAdditionalData(Element additional) {
82     return null;
83   }
84
85   @Nullable
86   public SdkAdditionalData loadAdditionalData(Sdk currentSdk, Element additional) {
87     return loadAdditionalData(additional);
88   }
89
90
91   public SdkType(@NonNls String name) {
92     myName = name;
93   }
94
95   public String getName() {
96     return myName;
97   }
98
99   public abstract String getPresentableName();
100
101   public Icon getIcon() {
102     return null;
103   }
104
105   public Icon getIconForExpandedTreeNode() {
106     return getIcon();
107   }
108
109   public Icon getIconForAddAction() {
110     return IconLoader.getIcon("/general/add.png");
111   }
112
113   public boolean equals(Object o) {
114     if (this == o) return true;
115     if (!(o instanceof SdkType)) return false;
116
117     final SdkType sdkType = (SdkType)o;
118
119     if (!myName.equals(sdkType.myName)) return false;
120
121     return true;
122   }
123
124   public int hashCode() {
125     return myName.hashCode();
126   }
127
128   public String toString() {
129     return getName();
130   }
131
132   public FileChooserDescriptor getHomeChooserDescriptor() {
133     final FileChooserDescriptor descriptor = new FileChooserDescriptor(false, true, false, false, false, false) {
134       public void validateSelectedFiles(VirtualFile[] files) throws Exception {
135         if (files.length != 0){
136           boolean valid = isValidSdkHome(files[0].getPath());
137           if (!valid){
138             if (SystemInfo.isMac) {
139               valid = isValidSdkHome(files[0].getPath() + MAC_HOME_PATH);
140             }
141             if (!valid) {
142               String message = files[0].isDirectory()
143                                ? ProjectBundle.message("sdk.configure.home.invalid.error", getPresentableName())
144                                : ProjectBundle.message("sdk.configure.home.file.invalid.error", getPresentableName());
145               throw new Exception(message);
146             }
147           }
148         }
149       }
150     };
151     descriptor.setTitle(ProjectBundle.message("sdk.configure.home.title", getPresentableName()));
152     return descriptor;
153   }
154
155
156   public String getHomeFieldLabel() {
157     return ProjectBundle.message("sdk.configure.type.home.path", getPresentableName());
158   }
159
160   public static SdkType[] getAllTypes() {
161     List<SdkType> allTypes = new ArrayList<SdkType>();
162     Collections.addAll(allTypes, ApplicationManager.getApplication().getComponents(SdkType.class));
163     Collections.addAll(allTypes, Extensions.getExtensions(EP_NAME));
164     return allTypes.toArray(new SdkType[allTypes.size()]);
165   }
166
167   public static <T extends SdkType> T findInstance(final Class<T> sdkTypeClass) {
168     for (SdkType sdkType : Extensions.getExtensions(EP_NAME)) {
169       if (sdkTypeClass.equals(sdkType.getClass())) {
170         //noinspection unchecked
171         return (T)sdkType;
172       }
173     }
174     assert false;
175     return null;
176   }
177
178   public boolean isRootTypeApplicable(final OrderRootType type) {
179     return true;
180   }
181 }