| /* |
| * 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.impl; |
| |
| import com.intellij.openapi.Disposable; |
| import com.intellij.openapi.module.Module; |
| import com.intellij.openapi.project.ProjectBundle; |
| import com.intellij.openapi.roots.LibraryOrderEntry; |
| import com.intellij.openapi.roots.OrderEntry; |
| import com.intellij.openapi.roots.impl.libraries.LibraryTableBase; |
| import com.intellij.openapi.roots.impl.libraries.LibraryTableImplUtil; |
| import com.intellij.openapi.roots.libraries.*; |
| import com.intellij.openapi.util.Condition; |
| import com.intellij.util.containers.ContainerUtil; |
| import com.intellij.util.containers.ConvertingIterator; |
| import com.intellij.util.containers.Convertor; |
| import com.intellij.util.containers.FilteringIterator; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| |
| /** |
| * @author dsl |
| */ |
| public class ModuleLibraryTable implements LibraryTable, LibraryTableBase.ModifiableModelEx { |
| private static final ModuleLibraryOrderEntryCondition MODULE_LIBRARY_ORDER_ENTRY_FILTER = new ModuleLibraryOrderEntryCondition(); |
| private static final OrderEntryToLibraryConvertor ORDER_ENTRY_TO_LIBRARY_CONVERTOR = new OrderEntryToLibraryConvertor(); |
| private final RootModelImpl myRootModel; |
| private final ProjectRootManagerImpl myProjectRootManager; |
| public static final LibraryTablePresentation MODULE_LIBRARY_TABLE_PRESENTATION = new LibraryTablePresentation() { |
| @Override |
| public String getDisplayName(boolean plural) { |
| return ProjectBundle.message("module.library.display.name", plural ? 2 : 1); |
| } |
| |
| @Override |
| public String getDescription() { |
| return ProjectBundle.message("libraries.node.text.module"); |
| } |
| |
| @Override |
| public String getLibraryTableEditorTitle() { |
| return ProjectBundle.message("library.configure.module.title"); |
| } |
| }; |
| |
| ModuleLibraryTable(RootModelImpl rootModel, ProjectRootManagerImpl projectRootManager) { |
| myRootModel = rootModel; |
| myProjectRootManager = projectRootManager; |
| } |
| |
| @Override |
| @NotNull |
| public Library[] getLibraries() { |
| final ArrayList<Library> result = new ArrayList<Library>(); |
| final Iterator<Library> libraryIterator = getLibraryIterator(); |
| ContainerUtil.addAll(result, libraryIterator); |
| return result.toArray(new Library[result.size()]); |
| } |
| |
| @Override |
| public Library createLibrary() { |
| return createLibrary(null); |
| } |
| |
| @Override |
| public Library createLibrary(String name) { |
| return createLibrary(name, null); |
| } |
| |
| @Override |
| public Library createLibrary(String name, @Nullable PersistentLibraryKind kind) { |
| final ModuleLibraryOrderEntryImpl orderEntry = new ModuleLibraryOrderEntryImpl(name, kind, myRootModel, myProjectRootManager); |
| myRootModel.addOrderEntry(orderEntry); |
| return orderEntry.getLibrary(); |
| } |
| |
| @Override |
| public void removeLibrary(@NotNull Library library) { |
| final Iterator<OrderEntry> orderIterator = myRootModel.getOrderIterator(); |
| while (orderIterator.hasNext()) { |
| OrderEntry orderEntry = orderIterator.next(); |
| if (orderEntry instanceof LibraryOrderEntry) { |
| final LibraryOrderEntry libraryOrderEntry = (LibraryOrderEntry) orderEntry; |
| if (libraryOrderEntry.isModuleLevel()) { |
| if (library.equals(libraryOrderEntry.getLibrary())) { |
| myRootModel.removeOrderEntry(orderEntry); |
| //Disposer.dispose(library); |
| return; |
| } |
| } |
| } |
| } |
| } |
| |
| @Override |
| @NotNull |
| public Iterator<Library> getLibraryIterator() { |
| FilteringIterator<OrderEntry, LibraryOrderEntry> filteringIterator = |
| new FilteringIterator<OrderEntry, LibraryOrderEntry>(myRootModel.getOrderIterator(), MODULE_LIBRARY_ORDER_ENTRY_FILTER); |
| return new ConvertingIterator<LibraryOrderEntry, Library>(filteringIterator, ORDER_ENTRY_TO_LIBRARY_CONVERTOR); |
| } |
| |
| @Override |
| public String getTableLevel() { |
| return LibraryTableImplUtil.MODULE_LEVEL; |
| } |
| |
| @Override |
| public LibraryTablePresentation getPresentation() { |
| return MODULE_LIBRARY_TABLE_PRESENTATION; |
| } |
| |
| @Override |
| public boolean isEditable() { |
| return true; |
| } |
| |
| @Override |
| @Nullable |
| public Library getLibraryByName(@NotNull String name) { |
| final Iterator<Library> libraryIterator = getLibraryIterator(); |
| while (libraryIterator.hasNext()) { |
| Library library = libraryIterator.next(); |
| if (name.equals(library.getName())) return library; |
| } |
| return null; |
| } |
| |
| @Override |
| public void addListener(Listener listener) { |
| throw new UnsupportedOperationException(); |
| } |
| |
| @Override |
| public void addListener(Listener listener, Disposable parentDisposable) { |
| throw new UnsupportedOperationException("Method addListener is not yet implemented in " + getClass().getName()); |
| } |
| |
| @Override |
| public void removeListener(Listener listener) { |
| throw new UnsupportedOperationException(); |
| } |
| |
| public Module getModule() { |
| return myRootModel.getModule(); |
| } |
| |
| |
| private static class ModuleLibraryOrderEntryCondition implements Condition<OrderEntry> { |
| @Override |
| public boolean value(OrderEntry entry) { |
| return entry instanceof LibraryOrderEntry && ((LibraryOrderEntry)entry).isModuleLevel() && ((LibraryOrderEntry)entry).getLibrary() != null; |
| } |
| } |
| |
| private static class OrderEntryToLibraryConvertor implements Convertor<LibraryOrderEntry, Library> { |
| @Override |
| public Library convert(LibraryOrderEntry o) { |
| return o.getLibrary(); |
| } |
| } |
| |
| @Override |
| public void commit() { |
| } |
| |
| @Override |
| public boolean isChanged() { |
| return myRootModel.isChanged(); |
| } |
| |
| @Override |
| public ModifiableModel getModifiableModel() { |
| return this; |
| } |
| } |