blob: d71e1840ff1b833c9a031abcc2422b7e5bf85a3f [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.facet.impl.ui.libraries;
import com.intellij.framework.library.FrameworkLibraryVersion;
import com.intellij.framework.library.FrameworkLibraryVersionFilter;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.roots.DependencyScope;
import com.intellij.openapi.roots.LibraryDependencyScopeSuggester;
import com.intellij.openapi.roots.LibraryOrderEntry;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.ui.configuration.libraries.CustomLibraryDescription;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.ExistingLibraryEditor;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.NewLibraryEditor;
import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainer;
import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainerFactory;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.NotNullComputable;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author nik
*/
public class LibraryCompositionSettings implements Disposable {
private final CustomLibraryDescription myLibraryDescription;
@NotNull private final NotNullComputable<String> myPathProvider;
private FrameworkLibraryVersionFilter myVersionFilter;
private final List<? extends FrameworkLibraryVersion> myAllVersions;
private LibrariesContainer.LibraryLevel myNewLibraryLevel;
private NewLibraryEditor myNewLibraryEditor;
private Library mySelectedLibrary;
private boolean myDownloadLibraries;
private LibraryDownloadSettings myDownloadSettings;
private Map<Library, ExistingLibraryEditor> myExistingLibraryEditors =
ContainerUtil.newIdentityTroveMap();
private FrameworkLibraryProvider myLibraryProvider;
public LibraryCompositionSettings(final @NotNull CustomLibraryDescription libraryDescription,
final @NotNull NotNullComputable<String> pathProvider,
@NotNull FrameworkLibraryVersionFilter versionFilter,
final List<? extends FrameworkLibraryVersion> allVersions) {
myLibraryDescription = libraryDescription;
myPathProvider = pathProvider;
myVersionFilter = versionFilter;
myNewLibraryLevel = libraryDescription.getDefaultLevel();
myAllVersions = allVersions;
final List<? extends FrameworkLibraryVersion> versions = getCompatibleVersions();
if (!versions.isEmpty()) {
myDownloadSettings = createDownloadSettings(versions.get(0));
}
}
private LibraryDownloadSettings createDownloadSettings(final FrameworkLibraryVersion version) {
return new LibraryDownloadSettings(version, myLibraryDescription.getDownloadableLibraryType(),
myNewLibraryLevel, getDefaultDownloadPath(getBaseDirectoryPath()));
}
public void setVersionFilter(@NotNull FrameworkLibraryVersionFilter versionFilter) {
myVersionFilter = versionFilter;
if (myDownloadSettings == null || !versionFilter.isAccepted(myDownloadSettings.getVersion())) {
final FrameworkLibraryVersion newLibraryVersion = ContainerUtil.getFirstItem(getCompatibleVersions());
if (newLibraryVersion != null) {
myDownloadSettings = createDownloadSettings(newLibraryVersion);
}
else {
myDownloadSettings = null;
}
}
}
public List<? extends FrameworkLibraryVersion> getCompatibleVersions() {
final List<FrameworkLibraryVersion> result = new ArrayList<FrameworkLibraryVersion>();
for (FrameworkLibraryVersion version : myAllVersions) {
if (myVersionFilter.isAccepted(version)) {
result.add(version);
}
}
return result;
}
private static String getDefaultDownloadPath(@NotNull String baseDirectoryPath) {
return baseDirectoryPath.isEmpty() ? "lib" : baseDirectoryPath + "/lib";
}
public void setDownloadSettings(LibraryDownloadSettings downloadSettings) {
myDownloadSettings = downloadSettings;
}
public ExistingLibraryEditor getOrCreateEditor(@NotNull Library library) {
ExistingLibraryEditor libraryEditor = myExistingLibraryEditors.get(library);
if (libraryEditor == null) {
libraryEditor = new ExistingLibraryEditor(library, null);
Disposer.register(this, libraryEditor);
myExistingLibraryEditors.put(library, libraryEditor);
}
return libraryEditor;
}
@NotNull
public CustomLibraryDescription getLibraryDescription() {
return myLibraryDescription;
}
@Nullable
public LibraryDownloadSettings getDownloadSettings() {
return myDownloadSettings;
}
@NotNull
public String getBaseDirectoryPath() {
return myPathProvider.compute();
}
public void setDownloadLibraries(final boolean downloadLibraries) {
myDownloadLibraries = downloadLibraries;
}
public void setSelectedExistingLibrary(@Nullable Library library) {
mySelectedLibrary = library;
}
public void setNewLibraryLevel(final LibrariesContainer.LibraryLevel newLibraryLevel) {
myNewLibraryLevel = newLibraryLevel;
}
public boolean downloadFiles(final @NotNull JComponent parent) {
if (myDownloadLibraries && myDownloadSettings != null) {
final NewLibraryEditor libraryEditor = myDownloadSettings.download(parent, getBaseDirectoryPath());
if (libraryEditor != null) {
myNewLibraryEditor = libraryEditor;
}
}
return true;
}
@Nullable
private Library createLibrary(final ModifiableRootModel rootModel, @Nullable LibrariesContainer additionalContainer) {
if (myNewLibraryEditor != null) {
return LibrariesContainerFactory.createLibrary(additionalContainer, LibrariesContainerFactory.createContainer(rootModel),
myNewLibraryEditor, getLibraryLevel());
}
return null;
}
private LibrariesContainer.LibraryLevel getLibraryLevel() {
return myDownloadLibraries ? myDownloadSettings.getLibraryLevel() : myNewLibraryLevel;
}
public LibrariesContainer.LibraryLevel getNewLibraryLevel() {
return myNewLibraryLevel;
}
@Nullable
public Library addLibraries(final @NotNull ModifiableRootModel rootModel, final @NotNull List<Library> addedLibraries,
final @Nullable LibrariesContainer librariesContainer) {
Library newLibrary = createLibrary(rootModel, librariesContainer);
if (newLibrary != null) {
addedLibraries.add(newLibrary);
DependencyScope scope = LibraryDependencyScopeSuggester.getDefaultScope(newLibrary);
if (getLibraryLevel() != LibrariesContainer.LibraryLevel.MODULE) {
rootModel.addLibraryEntry(newLibrary).setScope(scope);
}
else {
LibraryOrderEntry orderEntry = rootModel.findLibraryOrderEntry(newLibrary);
assert orderEntry != null;
orderEntry.setScope(scope);
}
}
if (mySelectedLibrary != null) {
addedLibraries.add(mySelectedLibrary);
rootModel.addLibraryEntry(mySelectedLibrary).setScope(LibraryDependencyScopeSuggester.getDefaultScope(mySelectedLibrary));
}
if (myLibraryProvider != null) {
Library library = myLibraryProvider.createLibrary(myLibraryDescription.getSuitableLibraryKinds());
addedLibraries.add(library);
rootModel.addLibraryEntry(library).setScope(LibraryDependencyScopeSuggester.getDefaultScope(library));
}
return newLibrary;
}
public void setNewLibraryEditor(@Nullable NewLibraryEditor libraryEditor) {
myNewLibraryEditor = libraryEditor;
}
public void setLibraryProvider(FrameworkLibraryProvider libraryProvider) {
myLibraryProvider = libraryProvider;
}
@Override
public void dispose() {
}
}