From 7fe7a7adf19c1bd580afa594fde64bf5efd9d9fc Mon Sep 17 00:00:00 2001 From: nik Date: Thu, 26 Nov 2009 12:44:55 +0300 Subject: [PATCH] artifacts editor: handle renaming of library --- ...faultPackagingElementResolvingContext.java | 30 ++++++--- .../elements/LibraryPackagingElement.java | 26 +------- .../PackagingElementResolvingContext.java | 9 ++- .../artifacts/ArtifactEditorContextImpl.java | 4 ++ .../artifacts/ArtifactErrorPanel.java | 2 +- .../ArtifactsStructureConfigurable.java | 62 +++++++++++++++++++ ...factsStructureConfigurableContextImpl.java | 12 ++++ .../libraryEditor/LibraryEditor.java | 7 ++- .../libraryEditor/LibraryEditorListener.java | 26 ++++++++ .../libraryEditor/LibraryTableEditor.java | 40 +++++------- .../BaseLibrariesConfigurable.java | 1 + .../projectRoot/LibrariesModifiableModel.java | 7 ++- .../projectRoot/LibraryConfigurable.java | 21 ++++++- .../StructureConfigurableContext.java | 36 ++++++++--- .../MavenBaseModifiableModelsProvider.java | 10 +++ 15 files changed, 220 insertions(+), 73 deletions(-) create mode 100644 java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryEditorListener.java diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/DefaultPackagingElementResolvingContext.java b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/DefaultPackagingElementResolvingContext.java index 9771ae7b0693..8c3d162e6b52 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/DefaultPackagingElementResolvingContext.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/DefaultPackagingElementResolvingContext.java @@ -15,20 +15,24 @@ */ package com.intellij.packaging.impl.artifacts; -import com.intellij.packaging.elements.PackagingElementResolvingContext; -import com.intellij.packaging.artifacts.ArtifactModel; -import com.intellij.packaging.artifacts.ArtifactManager; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ui.configuration.DefaultModulesProvider; -import com.intellij.openapi.roots.ui.configuration.ModulesProvider; -import com.intellij.openapi.roots.ui.configuration.FacetsProvider; import com.intellij.facet.impl.DefaultFacetsProvider; +import com.intellij.openapi.project.Project; +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.DefaultModulesProvider; +import com.intellij.openapi.roots.ui.configuration.FacetsProvider; +import com.intellij.openapi.roots.ui.configuration.ModulesProvider; +import com.intellij.packaging.artifacts.ArtifactManager; +import com.intellij.packaging.artifacts.ArtifactModel; +import com.intellij.packaging.elements.PackagingElementResolvingContext; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author nik */ -class DefaultPackagingElementResolvingContext implements PackagingElementResolvingContext { +public class DefaultPackagingElementResolvingContext implements PackagingElementResolvingContext { private final Project myProject; private final DefaultModulesProvider myModulesProvider; @@ -56,4 +60,14 @@ class DefaultPackagingElementResolvingContext implements PackagingElementResolvi public FacetsProvider getFacetsProvider() { return DefaultFacetsProvider.INSTANCE; } + + public Library findLibrary(@NotNull String level, @NotNull String libraryName) { + return findLibrary(myProject, level, libraryName); + } + + @Nullable + public static Library findLibrary(Project project, String level, String libraryName) { + LibraryTable table = LibraryTablesRegistrar.getInstance().getLibraryTableByLevel(level, project); + return table != null ? table.getLibraryByName(libraryName) : null; + } } diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/elements/LibraryPackagingElement.java b/java/compiler/impl/src/com/intellij/packaging/impl/elements/LibraryPackagingElement.java index 97ee281d6087..b8ed003f5213 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/elements/LibraryPackagingElement.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/elements/LibraryPackagingElement.java @@ -148,7 +148,7 @@ public class LibraryPackagingElement extends ComplexPackagingElement() { + @Override + public boolean process(@NotNull LibraryPackagingElement element, + @NotNull PackagingElementPath path) { + return !isResolvedToLibrary(element, library, oldName); + } + }, myPackagingEditorContext, false, artifact.getArtifactType())) { + return; + } + myPackagingEditorContext.editLayout(artifact, new Runnable() { + public void run() { + final ModifiableArtifact modifiableArtifact = myPackagingEditorContext.getOrCreateModifiableArtifactModel().getOrCreateModifiableArtifact(artifact); + ArtifactUtil.processPackagingElements(modifiableArtifact, LibraryElementType.LIBRARY_ELEMENT_TYPE, new PackagingElementProcessor() { + @Override + public boolean process(@NotNull LibraryPackagingElement element, @NotNull PackagingElementPath path) { + if (isResolvedToLibrary(element, library, oldName)) { + element.setLibraryName(newName); + } + return true; + } + }, myPackagingEditorContext, false); + } + }); + final ArtifactEditorImpl artifactEditor = myPackagingEditorContext.getArtifactEditor(artifact); + if (artifactEditor != null) { + artifactEditor.rebuildTries(); + } + } + + private static boolean isResolvedToLibrary(LibraryPackagingElement element, Library library, String name) { + if (!element.getLibraryName().equals(name)) { + return false; + } + + final LibraryTable table = library.getTable(); + if (table != null) { + return table.getTableLevel().equals(element.getLevel()); + } + return element.getLevel().equals(LibraryTableImplUtil.MODULE_LEVEL); } private void onElementDeleted() { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContextImpl.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContextImpl.java index 3e88bd9ce1b6..5b6a2d2faafb 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContextImpl.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContextImpl.java @@ -21,6 +21,7 @@ import com.intellij.openapi.module.ModifiableModuleModel; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModifiableRootModel; +import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.ui.configuration.FacetsProvider; import com.intellij.openapi.roots.ui.configuration.ModuleEditor; import com.intellij.openapi.roots.ui.configuration.ModulesProvider; @@ -32,6 +33,7 @@ import com.intellij.openapi.util.Disposer; import com.intellij.packaging.artifacts.*; import com.intellij.packaging.elements.CompositePackagingElement; import com.intellij.packaging.impl.artifacts.ArtifactUtil; +import com.intellij.packaging.impl.artifacts.DefaultPackagingElementResolvingContext; import com.intellij.packaging.ui.ManifestFileConfiguration; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -152,6 +154,11 @@ public class ArtifactsStructureConfigurableContextImpl implements ArtifactsStruc myContext.getDaemonAnalyzer().queueUpdate(getOrCreateArtifactElement(originalArtifact)); } + @Nullable + public ArtifactEditorImpl getArtifactEditor(Artifact artifact) { + return myArtifactEditors.get(getOriginalArtifact(artifact)); + } + public ArtifactEditorImpl getOrCreateEditor(Artifact artifact) { artifact = getOriginalArtifact(artifact); ArtifactEditorImpl artifactEditor = myArtifactEditors.get(artifact); @@ -191,6 +198,11 @@ public class ArtifactsStructureConfigurableContextImpl implements ArtifactsStruc return myContext.getModulesConfigurator().getFacetsConfigurator(); } + public Library findLibrary(@NotNull String level, @NotNull String libraryName) { + final Library library = DefaultPackagingElementResolvingContext.findLibrary(myProject, level, libraryName); + return library != null ? myContext.getLibraryModel(library) : myContext.getLibrary(libraryName, level); + } + public ManifestFileConfiguration getManifestFile(CompositePackagingElement element, ArtifactType artifactType) { return myManifestFilesInfo.getManifestFile(element, artifactType, this); } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryEditor.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryEditor.java index b26495327972..90126587152f 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryEditor.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryEditor.java @@ -21,14 +21,17 @@ import com.intellij.openapi.roots.impl.libraries.LibraryEx; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; public class LibraryEditor implements Disposable { private final Library myLibrary; + private final LibraryEditorListener myListener; private String myLibraryName = null; private Library.ModifiableModel myModel = null; - public LibraryEditor(Library library) { + public LibraryEditor(Library library, @NotNull LibraryEditorListener listener) { myLibrary = library; + myListener = listener; } public String getName() { @@ -56,8 +59,10 @@ public class LibraryEditor implements Disposable { } public void setName(String name) { + String oldName = getModel().getName(); myLibraryName = name; getModel().setName(name); + myListener.libraryRenamed(myLibrary, oldName, name); } public void addRoot(String url, OrderRootType rootType) { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryEditorListener.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryEditorListener.java new file mode 100644 index 000000000000..0cf90dbc452b --- /dev/null +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryEditorListener.java @@ -0,0 +1,26 @@ +/* + * 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.libraryEditor; + +import com.intellij.openapi.roots.libraries.Library; +import org.jetbrains.annotations.NotNull; + +/** + * @author nik + */ +public interface LibraryEditorListener { + void libraryRenamed(@NotNull Library library, String oldName, String newName); +} diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryTableEditor.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryTableEditor.java index 6ffcb5fab817..45f8960ccd97 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryTableEditor.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryTableEditor.java @@ -34,7 +34,6 @@ 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.LibraryTablePresentation; import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar; import com.intellij.openapi.roots.ui.configuration.LibraryTableModifiableModelProvider; import com.intellij.openapi.roots.ui.configuration.PathUIUtils; @@ -57,6 +56,7 @@ import com.intellij.ui.treeStructure.Tree; import com.intellij.util.ArrayUtil; import com.intellij.util.Icons; import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -77,7 +77,7 @@ import java.util.List; * @author Eugene Zhuravlev * Date: Jan 11, 2004 */ -public class LibraryTableEditor implements Disposable { +public class LibraryTableEditor implements Disposable, LibraryEditorListener { static final UrlComparator ourUrlComparator = new UrlComparator(); private JPanel myPanel; @@ -102,31 +102,11 @@ public class LibraryTableEditor implements Disposable { private static final Icon JAR_DIRECTORY_ICON = IconLoader.getIcon("/nodes/jarDirectory.png"); private final Collection myListeners = new ArrayList(); + private final List myLibraryEditorListeners = new ArrayList(); @Nullable private final Project myProject; private final Map myFileChooserUserData = new HashMap(); - private LibraryTableEditor(final LibraryTable libraryTableProvider, Project project) { - this(new LibraryTableModifiableModelProvider() { - public LibraryTable.ModifiableModel getModifiableModel() { - return libraryTableProvider.getModifiableModel(); - } - - public String getTableLevel() { - return libraryTableProvider.getTableLevel(); - } - - public LibraryTablePresentation getLibraryTablePresentation() { - return libraryTableProvider.getPresentation(); - } - - public boolean isLibraryTableEditable() { - return libraryTableProvider.isEditable(); - } - }, project); - } - - private LibraryTableEditor(LibraryTableModifiableModelProvider provider, Project project){ myProject = project; myLibraryTableProvider = provider; @@ -139,7 +119,7 @@ public class LibraryTableEditor implements Disposable { } } - public static LibraryTableEditor editLibraryTable(LibraryTableModifiableModelProvider provider, Project project){ + public static LibraryTableEditor editLibraryTable(LibraryTableModifiableModelProvider provider, Project project) { LibraryTableEditor result = new LibraryTableEditor(provider,project); result.init(new LibraryTableTreeStructure(result)); return result; @@ -229,7 +209,7 @@ public class LibraryTableEditor implements Disposable { } LibraryEditor libraryEditor = myLibraryToEditorMap.get(library); if (libraryEditor == null) { - libraryEditor = new LibraryEditor(library); + libraryEditor = new LibraryEditor(library, this); myLibraryToEditorMap.put(library, libraryEditor); } return libraryEditor; @@ -282,6 +262,16 @@ public class LibraryTableEditor implements Disposable { return false; } + public void addLibraryEditorListener(@NotNull LibraryEditorListener listener) { + myLibraryEditorListeners.add(listener); + } + + public void libraryRenamed(@NotNull Library library, String oldName, String newName) { + for (LibraryEditorListener listener : myLibraryEditorListeners) { + listener.libraryRenamed(library, oldName, newName); + } + } + public Library[] getLibraries() { return myTableModifiableModel.getLibraries(); } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseLibrariesConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseLibrariesConfigurable.java index 2e7c32429506..7d4f51e5a047 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseLibrariesConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseLibrariesConfigurable.java @@ -179,6 +179,7 @@ public abstract class BaseLibrariesConfigurable extends BaseStructureConfigurabl return new AnAction[]{new AnAction(getAddText()) { public void actionPerformed(AnActionEvent e) { final LibraryTableEditor editor = LibraryTableEditor.editLibraryTable(getModelProvider(false), myProject); + editor.addLibraryEditorListener(myContext); editor.createAddLibraryAction(true).actionPerformed(null); Disposer.dispose(editor); } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/LibrariesModifiableModel.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/LibrariesModifiableModel.java index b539864d8e75..b5afb62b3a62 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/LibrariesModifiableModel.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/LibrariesModifiableModel.java @@ -22,6 +22,7 @@ import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.libraries.LibraryTable; import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable; import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditor; +import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditorListener; import com.intellij.openapi.util.Disposer; import org.jetbrains.annotations.NotNull; @@ -39,10 +40,12 @@ public class LibrariesModifiableModel implements LibraryTable.ModifiableModel { private LibraryTable.ModifiableModel myLibrariesModifiableModel; private final Project myProject; private LibraryTable myTable; + private final LibraryEditorListener myLibraryEditorListener; - public LibrariesModifiableModel(final LibraryTable table, final Project project) { + public LibrariesModifiableModel(final LibraryTable table, final Project project, LibraryEditorListener libraryEditorListener) { myProject = project; myTable = table; + myLibraryEditorListener = libraryEditorListener; } public Library createLibrary(String name) { @@ -126,7 +129,7 @@ public class LibrariesModifiableModel implements LibraryTable.ModifiableModel { } private LibraryEditor createLibraryEditor(final Library library) { - final LibraryEditor libraryEditor = new LibraryEditor(library); + final LibraryEditor libraryEditor = new LibraryEditor(library, myLibraryEditorListener); myLibrary2EditorMap.put(library, libraryEditor); return libraryEditor; } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/LibraryConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/LibraryConfigurable.java index ef49eb2026b9..d4f78dfd237f 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/LibraryConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/LibraryConfigurable.java @@ -45,6 +45,7 @@ public class LibraryConfigurable extends ProjectStructureElementConfigurable myLevel2Providers = new THashMap(); + private List myLibraryEditorListeners = new ArrayList(); private final Project myProject; @@ -79,10 +82,24 @@ public class StructureConfigurableContext implements Disposable { final LibraryTablesRegistrar tablesRegistrar = LibraryTablesRegistrar.getInstance(); myLevel2Providers.clear(); - myLevel2Providers.put(LibraryTablesRegistrar.APPLICATION_LEVEL, new LibrariesModifiableModel(tablesRegistrar.getLibraryTable(), myProject)); - myLevel2Providers.put(LibraryTablesRegistrar.PROJECT_LEVEL, new LibrariesModifiableModel(tablesRegistrar.getLibraryTable(myProject), myProject)); + 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)); + myLevel2Providers.put(table.getTableLevel(), new LibrariesModifiableModel(table, myProject, this)); + } + } + + public void addLibraryEditorListener(LibraryEditorListener listener) { + myLibraryEditorListeners.add(listener); + } + + public void removeLibraryEditorListener(LibraryEditorListener listener) { + myLibraryEditorListeners.remove(listener); + } + + public void libraryRenamed(@NotNull Library library, String oldName, String newName) { + for (LibraryEditorListener listener : myLibraryEditorListeners) { + listener.libraryRenamed(library, oldName, newName); } } @@ -134,9 +151,14 @@ public class StructureConfigurableContext implements Disposable { } @Nullable - private static Library findLibraryModel(final String libraryName, @NotNull LibrariesModifiableModel model) { - final Library library = model.getLibraryByName(libraryName); - return findLibraryModel(library, model); + 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 diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenBaseModifiableModelsProvider.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenBaseModifiableModelsProvider.java index 36d3dbcbba9e..dc56d9dc29cb 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenBaseModifiableModelsProvider.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenBaseModifiableModelsProvider.java @@ -25,6 +25,8 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.ModuleRootModel; 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.FacetsProvider; import com.intellij.openapi.roots.ui.configuration.ModulesProvider; import com.intellij.openapi.vfs.VirtualFile; @@ -150,6 +152,14 @@ public abstract class MavenBaseModifiableModelsProvider implements MavenModifiab return myFacetsProvider; } + public Library findLibrary(@NotNull String level, @NotNull String libraryName) { + if (level.equals(LibraryTablesRegistrar.PROJECT_LEVEL)) { + return getLibraryByName(libraryName); + } + final LibraryTable table = LibraryTablesRegistrar.getInstance().getLibraryTableByLevel(level, myProject); + return table != null ? table.getLibraryByName(libraryName) : null; + } + } private class MavenModulesProvider implements ModulesProvider {