From d6a49c8ad07d2f406714523ff5cffdfa6dbbca08 Mon Sep 17 00:00:00 2001 From: nik Date: Thu, 14 Oct 2010 15:52:12 +0400 Subject: [PATCH 1/2] when library is deleted it is removed from artifacts --- .../elements/CompositePackagingElement.java | 10 +++++ .../artifacts/ArtifactEditorEx.java | 3 ++ .../artifacts/ArtifactEditorImpl.java | 39 +++++++++++++++++-- .../ArtifactProjectStructureElement.java | 15 ++++--- .../artifacts/ArtifactsEditorImpl.form | 4 +- .../artifacts/UsageInArtifact.java | 5 +++ .../BaseLibrariesConfigurable.java | 2 +- 7 files changed, 65 insertions(+), 13 deletions(-) diff --git a/java/compiler/openapi/src/com/intellij/packaging/elements/CompositePackagingElement.java b/java/compiler/openapi/src/com/intellij/packaging/elements/CompositePackagingElement.java index e24bafdc4774..fbfa5e00b784 100644 --- a/java/compiler/openapi/src/com/intellij/packaging/elements/CompositePackagingElement.java +++ b/java/compiler/openapi/src/com/intellij/packaging/elements/CompositePackagingElement.java @@ -127,4 +127,14 @@ public abstract class CompositePackagingElement extends PackagingElement i public void removeAllChildren() { myChildren.clear(); } + + @Nullable + public CompositePackagingElement findCompositeChild(@NotNull String name) { + for (PackagingElement child : myChildren) { + if (child instanceof CompositePackagingElement && name.equals(((CompositePackagingElement)child).getName())) { + return (CompositePackagingElement)child; + } + } + return null; + } } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorEx.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorEx.java index 1359a12bab1f..3b6ca1e4c661 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorEx.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorEx.java @@ -19,6 +19,7 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.DataKey; import com.intellij.packaging.artifacts.Artifact; import com.intellij.packaging.elements.CompositePackagingElement; +import com.intellij.packaging.elements.PackagingElement; import com.intellij.packaging.elements.PackagingElementType; import com.intellij.packaging.ui.ArtifactEditor; import com.intellij.packaging.ui.ArtifactEditorContext; @@ -37,6 +38,8 @@ public interface ArtifactEditorEx extends ArtifactEditor, Disposable { void removeSelectedElements(); + void removePackagingElement(@NotNull String pathToParent, @NotNull PackagingElement element); + LayoutTreeComponent getLayoutTreeComponent(); Artifact getArtifact(); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorImpl.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorImpl.java index 414ca3ea03f4..00ce9b0c40f4 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorImpl.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorImpl.java @@ -39,14 +39,12 @@ import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.packaging.artifacts.Artifact; import com.intellij.packaging.artifacts.ArtifactType; import com.intellij.packaging.artifacts.ModifiableArtifact; -import com.intellij.packaging.elements.ComplexPackagingElementType; -import com.intellij.packaging.elements.CompositePackagingElement; -import com.intellij.packaging.elements.PackagingElementFactory; -import com.intellij.packaging.elements.PackagingElementType; +import com.intellij.packaging.elements.*; import com.intellij.packaging.impl.artifacts.ArtifactUtil; import com.intellij.packaging.impl.elements.ArchivePackagingElement; import com.intellij.packaging.impl.elements.ManifestFileUtil; @@ -361,6 +359,34 @@ public class ArtifactEditorImpl implements ArtifactEditorEx { myLayoutTreeComponent.removeSelectedElements(); } + @Override + public void removePackagingElement(@NotNull final String pathToParent, @NotNull final PackagingElement element) { + myLayoutTreeComponent.editLayout(new Runnable() { + @Override + public void run() { + final CompositePackagingElement parent = findCompositeElementByPath(pathToParent); + if (parent == null) return; + for (PackagingElement child : parent.getChildren()) { + if (child.isEqualTo(element)) { + parent.removeChild(child); + break; + } + } + } + }); + myLayoutTreeComponent.rebuildTree(); + } + + @Nullable + private CompositePackagingElement findCompositeElementByPath(String pathToElement) { + CompositePackagingElement element = getRootElement(); + for (String name : StringUtil.split(pathToElement, "/")) { + element = element.findCompositeChild(name); + if (element == null) return null; + } + return element; + } + public boolean isModified() { return myBuildOnMakeCheckBox.isSelected() != myOriginalArtifact.isBuildOnMake() || !Comparing.equal(getConfiguredOutputPath(), myOriginalArtifact.getOutputPath()) @@ -451,6 +477,11 @@ public class ArtifactEditorImpl implements ArtifactEditorEx { return myValidationManager; } + private void createUIComponents() { + myShowContentCheckBox = new ThreeStateCheckBox(); + myShowSpecificContentOptionsButton = new FixedSizeButton(16); + } + private class MyDataProvider implements TypeSafeDataProvider { public void calcData(DataKey key, DataSink sink) { if (ARTIFACTS_EDITOR_KEY.equals(key)) { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProjectStructureElement.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProjectStructureElement.java index c8bc5adbc944..5d1dc1d32061 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProjectStructureElement.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProjectStructureElement.java @@ -67,23 +67,21 @@ public class ArtifactProjectStructureElement extends ProjectStructureElement { if (packagingElement instanceof ModuleOutputPackagingElement) { final Module module = ((ModuleOutputPackagingElement)packagingElement).findModule(myArtifactsStructureContext); if (module != null) { - usages.add(new UsageInArtifact(myOriginalArtifact, myArtifactsStructureContext, new ModuleProjectStructureElement(myContext, module), - ArtifactProjectStructureElement.this, path.getPathString(), packagingElement)); + usages.add(createUsage(packagingElement, path, new ModuleProjectStructureElement(myContext, module))); } } else if (packagingElement instanceof LibraryPackagingElement) { final Library library = ((LibraryPackagingElement)packagingElement).findLibrary(myArtifactsStructureContext); if (library != null) { - usages.add(new UsageInArtifact(myOriginalArtifact, myArtifactsStructureContext, new LibraryProjectStructureElement(myContext, library), - ArtifactProjectStructureElement.this, path.getPathString(), packagingElement)); + usages.add(createUsage(packagingElement, path, + new LibraryProjectStructureElement(ArtifactProjectStructureElement.this.myContext, library))); } } else if (packagingElement instanceof ArtifactPackagingElement) { final Artifact usedArtifact = ((ArtifactPackagingElement)packagingElement).findArtifact(myArtifactsStructureContext); if (usedArtifact != null) { final ArtifactProjectStructureElement artifactElement = myArtifactsStructureContext.getOrCreateArtifactElement(usedArtifact); - usages.add(new UsageInArtifact(myOriginalArtifact, myArtifactsStructureContext, artifactElement, - ArtifactProjectStructureElement.this, path.getPathString(), packagingElement)); + usages.add(createUsage(packagingElement, path, artifactElement)); } } return true; @@ -92,6 +90,11 @@ public class ArtifactProjectStructureElement extends ProjectStructureElement { return usages; } + private UsageInArtifact createUsage(PackagingElement packagingElement, PackagingElementPath path, + final ProjectStructureElement element) { + return new UsageInArtifact(myOriginalArtifact, myArtifactsStructureContext, element, this, path.getPathString(), packagingElement); + } + @Override public String toString() { return "artifact:" + myOriginalArtifact.getName(); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsEditorImpl.form b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsEditorImpl.form index cf81d109bd66..d3edac73dcf3 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsEditorImpl.form +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsEditorImpl.form @@ -81,7 +81,7 @@ - + @@ -89,7 +89,7 @@ - + diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/UsageInArtifact.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/UsageInArtifact.java index e790ee202c18..11f6715e1f16 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/UsageInArtifact.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/UsageInArtifact.java @@ -51,6 +51,11 @@ public class UsageInArtifact extends ProjectStructureElementUsage { }); } + public void removeElement() { + final ArtifactEditorEx editor = (ArtifactEditorEx)myContext.getOrCreateEditor(myOriginalArtifact); + editor.removePackagingElement(myParentPath, myPackagingElement); + } + @Override public String getPresentableName() { return myOriginalArtifact.getName(); 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 0a4674e705b4..74fa862494f4 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 @@ -233,7 +233,7 @@ public abstract class BaseLibrariesConfigurable extends BaseStructureConfigurabl if (usage instanceof UsageInModuleClasspath) { rootConfigurable.removeLibraryOrderEntry(((ModuleProjectStructureElement)usage.getContainingElement()).getModule(), library); } else if (usage instanceof UsageInArtifact) { - // TODO[nik] implement me + ((UsageInArtifact)usage).removeElement(); } } From 4f638cfb2aa281c4d873ca60a4afc74c9c0c3956 Mon Sep 17 00:00:00 2001 From: nik Date: Thu, 14 Oct 2010 16:09:14 +0400 Subject: [PATCH 2/2] fixed adding roots to library after pressing apply --- .../libraryEditor/LibraryRootsComponent.java | 17 +++++++++-------- .../projectRoot/LibraryConfigurable.java | 8 +++++++- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryRootsComponent.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryRootsComponent.java index a54195d43197..824b1cb9e00f 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryRootsComponent.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryRootsComponent.java @@ -42,10 +42,7 @@ import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.ui.popup.ListPopup; import com.intellij.openapi.ui.popup.PopupStep; import com.intellij.openapi.ui.popup.util.BaseListPopupStep; -import com.intellij.openapi.util.Disposer; -import com.intellij.openapi.util.IconLoader; -import com.intellij.openapi.util.NullableComputable; -import com.intellij.openapi.util.Ref; +import com.intellij.openapi.util.*; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.*; import com.intellij.openapi.vfs.ex.http.HttpFileSystem; @@ -100,9 +97,9 @@ public class LibraryRootsComponent implements Disposable { @Nullable private final Project myProject; private final Map myFileChooserUserData = new HashMap(); - private final LibraryEditor myLibraryEditor; + private final Computable myLibraryEditor; - private LibraryRootsComponent(@Nullable Project project, @NotNull LibraryEditor libraryEditor) { + private LibraryRootsComponent(@Nullable Project project, @NotNull Computable libraryEditor) { myProject = project; myLibraryEditor = libraryEditor; updateProperties(); @@ -110,7 +107,7 @@ public class LibraryRootsComponent implements Disposable { private void updateProperties() { StringBuilder text = new StringBuilder(); - for (String description : LibraryPresentationManager.getInstance().getDescriptions(myLibraryEditor.getFiles(OrderRootType.CLASSES))) { + for (String description : LibraryPresentationManager.getInstance().getDescriptions(getLibraryEditor().getFiles(OrderRootType.CLASSES))) { if (text.length() > 0) { text.append("\n"); } @@ -120,6 +117,10 @@ public class LibraryRootsComponent implements Disposable { } public static LibraryRootsComponent createComponent(final @Nullable Project project, @NotNull LibraryEditor libraryEditor) { + return createComponent(project, new Computable.PredefinedValueComputable(libraryEditor)); + } + + public static LibraryRootsComponent createComponent(final @Nullable Project project, @NotNull Computable libraryEditor) { LibraryRootsComponent rootsComponent = new LibraryRootsComponent(project, libraryEditor); rootsComponent.init(new LibraryTreeStructure(rootsComponent)); return rootsComponent; @@ -178,7 +179,7 @@ public class LibraryRootsComponent implements Disposable { } public LibraryEditor getLibraryEditor() { - return myLibraryEditor; + return myLibraryEditor.compute(); } public boolean hasChanges() { 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 34ba8050fd0b..9630f79dc96a 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 @@ -26,6 +26,7 @@ import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditor; import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryRootsComponent; import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.LibraryProjectStructureElement; import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ProjectStructureElement; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Disposer; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; @@ -58,7 +59,12 @@ public class LibraryConfigurable extends ProjectStructureElementConfigurable() { + @Override + public LibraryEditor compute() { + return myModel.getModifiableModel().getLibraryEditor(myLibrary); + } + }); final StructureConfigurableContext context = ModuleStructureConfigurable.getInstance(myProject).getContext(); myLibraryEditor.addListener(new Runnable() { public void run() {