blob: 09f6a3e054ee410a71e7e850b81b3b9cf3adb558 [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.openapi.roots.ui.configuration.projectRoot;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.module.ModifiableModuleModel;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.impl.libraries.LibraryTableImplUtil;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.LibraryTable;
import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar;
import com.intellij.openapi.roots.ui.configuration.ModulesConfigurator;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditorListener;
import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ProjectStructureDaemonAnalyzer;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.EventDispatcher;
import gnu.trove.THashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Map;
public class StructureConfigurableContext implements Disposable, LibraryEditorListener {
private final ProjectStructureDaemonAnalyzer myDaemonAnalyzer;
public final ModulesConfigurator myModulesConfigurator;
public final Map<String, LibrariesModifiableModel> myLevel2Providers = new THashMap<String, LibrariesModifiableModel>();
private final EventDispatcher<LibraryEditorListener> myLibraryEditorListeners = EventDispatcher.create(LibraryEditorListener.class);
private final Project myProject;
public StructureConfigurableContext(Project project, final ModulesConfigurator modulesConfigurator) {
myProject = project;
myModulesConfigurator = modulesConfigurator;
Disposer.register(project, this);
myDaemonAnalyzer = new ProjectStructureDaemonAnalyzer(this);
}
public VirtualFile[] getLibraryFiles(Library library, final OrderRootType type) {
final LibraryTable table = library.getTable();
if (table != null) {
final LibraryTable.ModifiableModel modifiableModel = getModifiableLibraryTable(table);
if (modifiableModel instanceof LibrariesModifiableModel) {
final LibrariesModifiableModel librariesModel = (LibrariesModifiableModel)modifiableModel;
if (librariesModel.hasLibraryEditor(library)) {
return librariesModel.getLibraryEditor(library).getFiles(type);
}
}
}
return library.getFiles(type);
}
public Project getProject() {
return myProject;
}
public ProjectStructureDaemonAnalyzer getDaemonAnalyzer() {
return myDaemonAnalyzer;
}
@Override
public void dispose() {
}
public ModulesConfigurator getModulesConfigurator() {
return myModulesConfigurator;
}
public Module[] getModules() {
return myModulesConfigurator.getModules();
}
public String getRealName(final Module module) {
final ModifiableModuleModel moduleModel = myModulesConfigurator.getModuleModel();
String newName = moduleModel.getNewName(module);
return newName != null ? newName : module.getName();
}
public void resetLibraries() {
final LibraryTablesRegistrar tablesRegistrar = LibraryTablesRegistrar.getInstance();
myLevel2Providers.clear();
myLevel2Providers.put(LibraryTablesRegistrar.APPLICATION_LEVEL, new LibrariesModifiableModel(tablesRegistrar.getLibraryTable(), myProject, this));
myLevel2Providers.put(LibraryTablesRegistrar.PROJECT_LEVEL, new LibrariesModifiableModel(tablesRegistrar.getLibraryTable(myProject), myProject, this));
for (final LibraryTable table : tablesRegistrar.getCustomLibraryTables()) {
myLevel2Providers.put(table.getTableLevel(), new LibrariesModifiableModel(table, myProject, this));
}
}
public void addLibraryEditorListener(LibraryEditorListener listener) {
myLibraryEditorListeners.addListener(listener);
}
public void addLibraryEditorListener(@NotNull LibraryEditorListener listener, @NotNull Disposable parentDisposable) {
myLibraryEditorListeners.addListener(listener, parentDisposable);
}
@Override
public void libraryRenamed(@NotNull Library library, String oldName, String newName) {
myLibraryEditorListeners.getMulticaster().libraryRenamed(library, oldName, newName);
}
public StructureLibraryTableModifiableModelProvider getGlobalLibrariesProvider() {
return createModifiableModelProvider(LibraryTablesRegistrar.APPLICATION_LEVEL);
}
public StructureLibraryTableModifiableModelProvider createModifiableModelProvider(final String level) {
return new StructureLibraryTableModifiableModelProvider(level, this);
}
public StructureLibraryTableModifiableModelProvider getProjectLibrariesProvider() {
return createModifiableModelProvider(LibraryTablesRegistrar.PROJECT_LEVEL);
}
public LibraryTable.ModifiableModel getModifiableLibraryTable(@NotNull LibraryTable table) {
final String tableLevel = table.getTableLevel();
if (tableLevel.equals(LibraryTableImplUtil.MODULE_LEVEL)) {
return table.getModifiableModel();
}
return myLevel2Providers.get(tableLevel);
}
@Nullable
public Library getLibrary(final String libraryName, final String libraryLevel) {
/* the null check is added only to prevent NPE when called from getLibrary */
final LibrariesModifiableModel model = myLevel2Providers.get(libraryLevel);
return model == null ? null : findLibraryModel(libraryName, model);
}
@Nullable
private static Library findLibraryModel(final @NotNull String libraryName, @NotNull LibrariesModifiableModel model) {
for (Library library : model.getLibraries()) {
final Library libraryModel = findLibraryModel(library, model);
if (libraryModel != null && libraryName.equals(libraryModel.getName())) {
return libraryModel;
}
}
return null;
}
@Nullable
public Library getLibraryModel(@NotNull Library library) {
final LibraryTable libraryTable = library.getTable();
if (libraryTable != null) {
return findLibraryModel(library, myLevel2Providers.get(libraryTable.getTableLevel()));
}
return library;
}
@Nullable
private static Library findLibraryModel(final Library library, LibrariesModifiableModel tableModel) {
if (tableModel == null) return library;
if (tableModel.wasLibraryRemoved(library)) return null;
return tableModel.hasLibraryEditor(library) ? (Library)tableModel.getLibraryEditor(library).getModel() : library;
}
public void reset() {
resetLibraries();
myModulesConfigurator.resetModuleEditors();
myDaemonAnalyzer.reset(); // should be called after resetLibraries!
}
public void clear() {
myLevel2Providers.clear();
}
}