'RIDER-47575 Design for Plist Editor -- icon for the button to toggle localized/raw...
[idea/community.git] / java / idea-ui / src / com / intellij / framework / library / DownloadableLibraryType.java
1 /*
2  * Copyright 2000-2012 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.framework.library;
17
18 import com.intellij.diagnostic.PluginException;
19 import com.intellij.ide.JavaUiBundle;
20 import com.intellij.openapi.project.Project;
21 import com.intellij.openapi.roots.libraries.*;
22 import com.intellij.openapi.roots.libraries.ui.LibraryEditorComponent;
23 import com.intellij.openapi.roots.libraries.ui.LibraryPropertiesEditor;
24 import com.intellij.openapi.vfs.VirtualFile;
25 import org.jetbrains.annotations.Nls;
26 import org.jetbrains.annotations.NotNull;
27 import org.jetbrains.annotations.Nullable;
28
29 import javax.swing.*;
30 import java.net.URL;
31 import java.util.List;
32
33 public abstract class DownloadableLibraryType extends LibraryType<LibraryVersionProperties> {
34   private final Icon myIcon;
35   private final @Nls(capitalization = Nls.Capitalization.Title) String myLibraryCategoryName;
36   private final DownloadableLibraryDescription myLibraryDescription;
37
38   /**
39    * Creates instance of library type. You also <strong>must</strong> override {@link #getLibraryTypeIcon()} method and return non-null value
40    * from it.
41    * @param libraryCategoryName presentable description of the library type
42    * @param libraryTypeId unique id of the library type, used for serialization
43    * @param groupId name of directory on https://frameworks.jetbrains.com site which contains information about available library versions
44    * @param localUrls URLs of xml files containing information about the library versions (see /contrib/osmorc/src/org/osmorc/facet/osgi.core.xml for example)
45    */
46   protected DownloadableLibraryType(@NotNull @Nls(capitalization = Nls.Capitalization.Title) String libraryCategoryName,
47                                @NotNull String libraryTypeId,
48                                @NotNull String groupId,
49                                URL @NotNull ... localUrls) {
50     this(libraryCategoryName, libraryTypeId, groupId, null, localUrls);
51   }
52
53   /**
54    * @deprecated use {@link #DownloadableLibraryType(String, String, String, URL...)} instead and override {@link #getLibraryTypeIcon()}
55    */
56   @Deprecated
57   public DownloadableLibraryType(@NotNull @Nls(capitalization = Nls.Capitalization.Title) String libraryCategoryName,
58                                  @NotNull String libraryTypeId,
59                                  @NotNull String groupId,
60                                  @Nullable Icon icon,
61                                  URL @NotNull ... localUrls) {
62     super(new PersistentLibraryKind<LibraryVersionProperties>(libraryTypeId) {
63       @NotNull
64       @Override
65       public LibraryVersionProperties createDefaultProperties() {
66         return new LibraryVersionProperties();
67       }
68     });
69     myLibraryCategoryName = libraryCategoryName;
70     myLibraryDescription = DownloadableLibraryService.getInstance().createLibraryDescription(groupId, localUrls);
71     myIcon = icon;
72   }
73
74   @Nullable
75   private static LibraryVersionProperties detectVersion(List<? extends VirtualFile> classesRoots, String detectionClass) {
76     if (!LibraryUtil.isClassAvailableInLibrary(classesRoots, detectionClass)) {
77       return null;
78     }
79     final String version = JarVersionDetectionUtil.detectJarVersion(detectionClass, classesRoots);
80     return new LibraryVersionProperties(version);
81   }
82
83   @Override
84   public String getCreateActionName() {
85     return null;
86   }
87
88   @Override
89   public NewLibraryConfiguration createNewLibrary(@NotNull JComponent parentComponent,
90                                                   @Nullable VirtualFile contextDirectory,
91                                                   @NotNull Project project) {
92     return null;
93   }
94
95   @NotNull
96   public DownloadableLibraryDescription getLibraryDescription() {
97     return myLibraryDescription;
98   }
99
100   public String getLibraryCategoryName() {
101     return myLibraryCategoryName;
102   }
103
104   @Override
105   public @Nls String getDescription(@NotNull LibraryVersionProperties properties) {
106     final String versionString = properties.getVersionString();
107     final int versionStringPresent = versionString != null ? 0 : 1;
108     return JavaUiBundle.message("downloadable.library.type.description", myLibraryCategoryName, versionString, versionStringPresent);
109   }
110
111   @Override
112   public LibraryPropertiesEditor createPropertiesEditor(@NotNull LibraryEditorComponent<LibraryVersionProperties> editorComponent) {
113     return DownloadableLibraryService.getInstance().createDownloadableLibraryEditor(myLibraryDescription, editorComponent, this);
114   }
115
116   @NotNull
117   public Icon getLibraryTypeIcon() {
118     if (myIcon == null) {
119       throw PluginException.createByClass("'DownloadableLibraryType::getLibraryTypeIcon' isn't overriden or returns 'null' in " + getClass().getName(), null, getClass());
120     }
121     return myIcon;
122   }
123
124   @Override
125   @NotNull
126   public Icon getIcon(LibraryVersionProperties properties) {
127     return getLibraryTypeIcon();
128   }
129
130   protected abstract String @NotNull [] getDetectionClassNames();
131
132   @Override
133   public LibraryVersionProperties detect(@NotNull List<VirtualFile> classesRoots) {
134     for (String className : getDetectionClassNames()) {
135       final LibraryVersionProperties versionProperties = detectVersion(classesRoots, className);
136       if (versionProperties != null) return versionProperties;
137     }
138     return null;
139   }
140 }