introduced new library type for libraries downloaded from Maven repository, 'Attach from repository' button in library editor is removed

This commit is contained in:
nik
2011-11-24 10:47:54 +04:00
parent 4daf50b3eb
commit 80b30ebcbe
35 changed files with 604 additions and 311 deletions
@@ -30,10 +30,10 @@ import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.impl.libraries.LibraryEx;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.NewLibraryConfiguration;
import com.intellij.openapi.roots.ui.OrderEntryAppearanceService;
import com.intellij.openapi.roots.ui.configuration.libraries.CustomLibraryDescription;
import com.intellij.openapi.roots.ui.configuration.libraries.LibraryPresentationManager;
import com.intellij.openapi.roots.ui.configuration.libraries.NewLibraryConfiguration;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.ExistingLibraryEditor;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditor;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.NewLibraryEditor;
@@ -15,12 +15,16 @@
*/
package com.intellij.framework.library;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.libraries.LibraryKind;
import com.intellij.openapi.roots.libraries.LibraryType;
import com.intellij.openapi.roots.libraries.NewLibraryConfiguration;
import com.intellij.openapi.roots.libraries.ui.LibraryEditorComponent;
import com.intellij.openapi.roots.libraries.ui.LibraryPropertiesEditor;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
@@ -43,6 +47,13 @@ public class DownloadableLibraryType extends LibraryType<LibraryVersionPropertie
return null;
}
@Override
public NewLibraryConfiguration createNewLibrary(@NotNull JComponent parentComponent,
@Nullable VirtualFile contextDirectory,
@NotNull Project project) {
return null;
}
@NotNull
public DownloadableLibraryDescription getLibraryDescription() {
return myLibraryDescription;
@@ -17,11 +17,14 @@ package com.intellij.framework.library.impl;
import com.intellij.facet.impl.ui.libraries.DownloadingOptionsDialog;
import com.intellij.facet.impl.ui.libraries.LibraryDownloadSettings;
import com.intellij.framework.library.*;
import com.intellij.framework.library.DownloadableLibraryDescription;
import com.intellij.framework.library.DownloadableLibraryType;
import com.intellij.framework.library.FrameworkLibraryVersion;
import com.intellij.framework.library.LibraryVersionProperties;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.roots.libraries.ui.LibraryEditorComponent;
import com.intellij.openapi.roots.libraries.ui.LibraryPropertiesEditor;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryPropertiesEditorBase;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditorBase;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.NewLibraryEditor;
import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainer;
@@ -29,46 +32,26 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.download.DownloadableFileSetVersions;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
/**
* @author nik
*/
public class DownloadableLibraryEditor extends LibraryPropertiesEditor {
private JPanel myMainPanel;
private JLabel myDescriptionLabel;
private JButton myChangeVersionButton;
private boolean myModified;
public class DownloadableLibraryPropertiesEditor extends LibraryPropertiesEditorBase<LibraryVersionProperties, DownloadableLibraryType> {
private final DownloadableLibraryDescription myDescription;
private final LibraryEditorComponent<LibraryVersionProperties> myEditorComponent;
private final DownloadableLibraryType myLibraryType;
private String myCurrentVersionString;
public DownloadableLibraryEditor(final DownloadableLibraryDescription description,
final LibraryEditorComponent<LibraryVersionProperties> editorComponent,
DownloadableLibraryType libraryType) {
public DownloadableLibraryPropertiesEditor(DownloadableLibraryDescription description,
LibraryEditorComponent<LibraryVersionProperties> editorComponent,
DownloadableLibraryType libraryType) {
super(editorComponent, libraryType, "Change &Version...");
myDescription = description;
myEditorComponent = editorComponent;
myLibraryType = libraryType;
updateDescription();
myCurrentVersionString = myEditorComponent.getProperties().getVersionString();
myChangeVersionButton.setVisible(!myEditorComponent.isNewLibrary());
myChangeVersionButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
changeVersion();
}
});
}
private void updateDescription() {
myDescriptionLabel.setText(myLibraryType.getDescription(myEditorComponent.getProperties()));
}
private void changeVersion() {
protected void edit() {
final ModalityState current = ModalityState.current();
myDescription.fetchVersions(new DownloadableFileSetVersions.FileSetVersionsCallback<FrameworkLibraryVersion>() {
@Override
@@ -90,9 +73,9 @@ public class DownloadableLibraryEditor extends LibraryPropertiesEditor {
final LibraryDownloadSettings initialSettings = new LibraryDownloadSettings(getCurrentVersion(versions), myLibraryType,
LibrariesContainer.LibraryLevel.PROJECT,
pathForDownloaded);
final LibraryDownloadSettings settings = DownloadingOptionsDialog.showDialog(myMainPanel, initialSettings, versions, false);
final LibraryDownloadSettings settings = DownloadingOptionsDialog.showDialog(getMainPanel(), initialSettings, versions, false);
if (settings != null) {
final NewLibraryEditor editor = settings.download(myMainPanel);
final NewLibraryEditor editor = settings.download(getMainPanel());
if (editor != null) {
final LibraryEditorBase target = (LibraryEditorBase)myEditorComponent.getLibraryEditor();
target.removeAllRoots();
@@ -101,8 +84,7 @@ public class DownloadableLibraryEditor extends LibraryPropertiesEditor {
editor.applyTo(target);
myEditorComponent.updateRootsTree();
myCurrentVersionString = settings.getVersion().getVersionString();
updateDescription();
myModified = true;
setModified();
}
}
}
@@ -120,24 +102,8 @@ public class DownloadableLibraryEditor extends LibraryPropertiesEditor {
return versions.get(0);
}
@NotNull
@Override
public JComponent createComponent() {
return myMainPanel;
}
@Override
public void apply() {
myEditorComponent.getProperties().setVersionString(myCurrentVersionString);
}
@Override
public boolean isModified() {
return myModified;
}
@Override
public void reset() {
updateDescription();
}
}
@@ -54,6 +54,6 @@ public class DownloadableLibraryServiceImpl extends DownloadableLibraryService {
public LibraryPropertiesEditor createDownloadableLibraryEditor(@NotNull DownloadableLibraryDescription description,
@NotNull LibraryEditorComponent<LibraryVersionProperties> editorComponent,
@NotNull DownloadableLibraryType libraryType) {
return new DownloadableLibraryEditor(description, editorComponent, libraryType);
return new DownloadableLibraryPropertiesEditor(description, editorComponent, libraryType);
}
}
@@ -22,10 +22,10 @@ import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.impl.libraries.LibraryTypeServiceImpl;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.ui.OrderRoot;
import com.intellij.openapi.roots.ui.configuration.ModulesCombobox;
import com.intellij.openapi.roots.ui.configuration.libraries.LibraryEditingUtil;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryNameAndLevelPanel;
import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainer;
import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainerFactory;
@@ -61,7 +61,7 @@ public class CreateLibraryFromFilesDialog extends DialogWrapper {
myProject = project;
myRoots = roots;
final FormBuilder builder = LibraryNameAndLevelPanel.createFormBuilder();
myDefaultName = LibrariesContainerFactory.createContainer(project).suggestUniqueLibraryName(LibraryEditingUtil.suggestLibraryName(roots));
myDefaultName = LibrariesContainerFactory.createContainer(project).suggestUniqueLibraryName(LibraryTypeServiceImpl.suggestLibraryName(roots));
myNameAndLevelPanel = new LibraryNameAndLevelPanel(builder, myDefaultName, Arrays.asList(LibrariesContainer.LibraryLevel.values()), LibrariesContainer.LibraryLevel.PROJECT);
myNameAndLevelPanel.setDefaultName(myDefaultName);
myModulesCombobox = new ModulesCombobox();
@@ -23,8 +23,8 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.roots.libraries.ui.OrderRoot;
import com.intellij.openapi.roots.libraries.ui.impl.RootDetectionUtil;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.DefaultLibraryRootsComponentDescriptor;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.RootDetectionUtil;
import com.intellij.openapi.vfs.JarFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
@@ -20,8 +20,8 @@ import com.intellij.ide.IdeBundle;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.libraries.NewLibraryConfiguration;
import com.intellij.openapi.roots.ui.configuration.libraries.CustomLibraryDescription;
import com.intellij.openapi.roots.ui.configuration.libraries.NewLibraryConfiguration;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditor;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
@@ -19,7 +19,7 @@ import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.libraries.ui.OrderRoot;
import com.intellij.openapi.roots.libraries.ui.RootDetector;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.RootDetectionUtil;
import com.intellij.openapi.roots.libraries.ui.impl.RootDetectionUtil;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
@@ -26,9 +26,9 @@ import com.intellij.openapi.roots.libraries.LibraryTable;
import com.intellij.openapi.roots.libraries.LibraryType;
import com.intellij.openapi.roots.libraries.ui.LibraryRootsComponentDescriptor;
import com.intellij.openapi.roots.libraries.ui.OrderRoot;
import com.intellij.openapi.roots.libraries.ui.impl.RootDetectionUtil;
import com.intellij.openapi.roots.ui.configuration.libraries.LibraryEditingUtil;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.DefaultLibraryRootsComponentDescriptor;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.RootDetectionUtil;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ArrayUtil;
@@ -20,10 +20,8 @@ import com.intellij.openapi.actionSystem.LangDataKeys;
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.libraries.LibraryTable;
import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar;
import com.intellij.openapi.roots.libraries.LibraryType;
import com.intellij.openapi.roots.libraries.*;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.CreateNewLibraryAction;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.CreateNewLibraryDialog;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.NewLibraryEditor;
import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext;
@@ -62,13 +60,12 @@ class NewLibraryChooser implements ClasspathElementChooser<Library> {
@Nullable
public Library createLibrary() {
final NewLibraryEditor libraryEditor;
if (myLibraryType == null) {
libraryEditor = new NewLibraryEditor();
}
else {
libraryEditor = new NewLibraryEditor(myLibraryType, myLibraryType.createDefaultProperties());
}
final NewLibraryConfiguration configuration = CreateNewLibraryAction.createNewLibraryConfiguration(myLibraryType, myParentComponent, myProject);
if (configuration == null) return null;
final NewLibraryEditor libraryEditor = new NewLibraryEditor(configuration.getLibraryType(), configuration.getProperties());
libraryEditor.setName(configuration.getDefaultLibraryName());
configuration.addRoots(libraryEditor);
final LibraryTablesRegistrar registrar = LibraryTablesRegistrar.getInstance();
List<LibraryTable> tables = Arrays.asList(myRootModel.getModuleLibraryTable(),
@@ -17,6 +17,7 @@ package com.intellij.openapi.roots.ui.configuration.libraries;
import com.intellij.framework.library.DownloadableLibraryType;
import com.intellij.openapi.roots.libraries.LibraryKind;
import com.intellij.openapi.roots.libraries.NewLibraryConfiguration;
import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainer;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
@@ -30,18 +30,15 @@ import com.intellij.openapi.roots.impl.libraries.LibraryEx;
import com.intellij.openapi.roots.impl.libraries.LibraryImpl;
import com.intellij.openapi.roots.impl.libraries.LibraryTableImplUtil;
import com.intellij.openapi.roots.libraries.*;
import com.intellij.openapi.roots.libraries.ui.OrderRoot;
import com.intellij.openapi.roots.ui.configuration.ChooseModulesDialog;
import com.intellij.openapi.roots.ui.configuration.classpath.ClasspathPanel;
import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesModifiableModel;
import com.intellij.openapi.roots.ui.configuration.projectRoot.ModuleStructureConfigurable;
import com.intellij.openapi.ui.popup.PopupStep;
import com.intellij.openapi.ui.popup.util.BaseListPopupStep;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.JarFileSystem;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.util.ParameterizedRunnable;
import com.intellij.util.PathUtil;
import com.intellij.util.PlatformIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -75,10 +72,6 @@ public class LibraryEditingUtil {
return false;
}
public static String suggestNewLibraryName(LibraryTable.ModifiableModel table, List<OrderRoot> roots) {
return suggestNewLibraryName(table, suggestLibraryName(roots));
}
public static String suggestNewLibraryName(LibraryTable.ModifiableModel table,
final String baseName) {
String candidateName = baseName;
@@ -89,13 +82,6 @@ public class LibraryEditingUtil {
return candidateName;
}
public static String suggestLibraryName(@NotNull List<OrderRoot> roots) {
if (roots.size() >= 1) {
return FileUtil.getNameWithoutExtension(PathUtil.getFileName(roots.get(0).getFile().getPath()));
}
return "Unnamed";
}
public static Predicate<Library> getNotAddedLibrariesCondition(final ModuleRootModel rootModel) {
final OrderEntry[] orderEntries = rootModel.getOrderEntries();
final Set<Library> result = new HashSet<Library>(orderEntries.length);
@@ -20,16 +20,13 @@ import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.impl.libraries.LibraryEx;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.LibraryType;
import com.intellij.openapi.roots.libraries.ui.LibraryRootsComponentDescriptor;
import com.intellij.openapi.roots.libraries.ui.OrderRoot;
import com.intellij.openapi.roots.libraries.ui.RootDetector;
import com.intellij.openapi.roots.libraries.LibraryTypeService;
import com.intellij.openapi.roots.libraries.NewLibraryConfiguration;
import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable;
import com.intellij.openapi.roots.ui.configuration.libraries.LibraryEditingUtil;
import com.intellij.openapi.roots.ui.configuration.projectRoot.BaseLibrariesConfigurable;
@@ -45,9 +42,7 @@ import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
import java.awt.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -81,38 +76,14 @@ public class CreateNewLibraryAction extends DumbAwareAction {
@Nullable
public static Library createLibrary(@Nullable final LibraryType type, @NotNull final Component parentComponent,
@NotNull final Project project, @NotNull final LibrariesModifiableModel modifiableModel) {
LibraryRootsComponentDescriptor componentDescriptor = null;
if (type != null) {
componentDescriptor = type.createLibraryRootsComponentDescriptor();
}
if (componentDescriptor == null) {
componentDescriptor = new DefaultLibraryRootsComponentDescriptor();
}
final List<? extends RootDetector> rootDetectors = componentDescriptor.getRootDetectors();
final List<OrderRoot> roots;
if (!rootDetectors.isEmpty()) {
final FileChooserDescriptor chooserDescriptor = componentDescriptor.createAttachFilesChooserDescriptor();
chooserDescriptor.setTitle("Select Library Files");
final VirtualFile[] rootCandidates = FileChooser.chooseFiles(parentComponent, chooserDescriptor, project.getBaseDir());
if (rootCandidates.length == 0) {
return null;
}
public static Library createLibrary(@Nullable final LibraryType type, @NotNull final JComponent parentComponent,
@NotNull final Project project, @NotNull final LibrariesModifiableModel modifiableModel) {
final NewLibraryConfiguration configuration = createNewLibraryConfiguration(type, parentComponent, project);
if (configuration == null) return null;
final Library library = modifiableModel.createLibrary(LibraryEditingUtil.suggestNewLibraryName(modifiableModel, configuration.getDefaultLibraryName()), configuration.getLibraryType());
roots = RootDetectionUtil
.detectRoots(Arrays.asList(rootCandidates), parentComponent, project, rootDetectors,
true);
if (roots.isEmpty()) return null;
}
else {
roots = Collections.emptyList();
}
final Library library = modifiableModel.createLibrary(LibraryEditingUtil.suggestNewLibraryName(modifiableModel, roots), type);
final NewLibraryEditor editor = new NewLibraryEditor(((LibraryEx)library).getType(), ((LibraryEx)library).getProperties());
editor.addRoots(roots);
final NewLibraryEditor editor = new NewLibraryEditor(configuration.getLibraryType(), configuration.getProperties());
configuration.addRoots(editor);
final Library.ModifiableModel model = library.getModifiableModel();
editor.applyTo((LibraryEx.ModifiableModelEx)model);
AccessToken token = WriteAction.start();
@@ -125,6 +96,21 @@ public class CreateNewLibraryAction extends DumbAwareAction {
return library;
}
@Nullable
public static NewLibraryConfiguration createNewLibraryConfiguration(@Nullable LibraryType type, @NotNull JComponent parentComponent, @NotNull Project project) {
final NewLibraryConfiguration configuration;
final VirtualFile baseDir = project.getBaseDir();
if (type != null) {
configuration = type.createNewLibrary(parentComponent, baseDir, project);
}
else {
configuration = LibraryTypeService
.getInstance().createLibraryFromFiles(new DefaultLibraryRootsComponentDescriptor(), parentComponent, baseDir, null, project);
}
if (configuration == null) return null;
return configuration;
}
public static AnAction[] createActionOrGroup(@NotNull String text, @NotNull BaseLibrariesConfigurable librariesConfigurable, final @NotNull Project project) {
final LibraryType<?>[] extensions = LibraryType.EP_NAME.getExtensions();
List<LibraryType<?>> suitableTypes = new ArrayList<LibraryType<?>>();
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.framework.library.impl.DownloadableLibraryEditor">
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryPropertiesEditorBase">
<grid id="27dc6" binding="myMainPanel" layout-manager="GridLayoutManager" row-count="1" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
@@ -21,12 +21,12 @@
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
</hspacer>
<component id="979f7" class="javax.swing.JButton" binding="myChangeVersionButton">
<component id="979f7" class="javax.swing.JButton" binding="myEditButton">
<constraints>
<grid row="0" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Change &amp;Version..."/>
<text value="&amp;Edit..."/>
</properties>
</component>
</children>
@@ -0,0 +1,87 @@
/*
* Copyright 2000-2011 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.LibraryProperties;
import com.intellij.openapi.roots.libraries.LibraryType;
import com.intellij.openapi.roots.libraries.ui.LibraryEditorComponent;
import com.intellij.openapi.roots.libraries.ui.LibraryPropertiesEditor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* @author nik
*/
public abstract class LibraryPropertiesEditorBase<P extends LibraryProperties, T extends LibraryType<P>> extends LibraryPropertiesEditor {
private JPanel myMainPanel;
private JLabel myDescriptionLabel;
private JButton myEditButton;
private boolean myModified;
protected final LibraryEditorComponent<P> myEditorComponent;
protected final T myLibraryType;
protected LibraryPropertiesEditorBase(final LibraryEditorComponent<P> editorComponent,
T libraryType, @Nullable String editButtonText) {
myEditorComponent = editorComponent;
myLibraryType = libraryType;
updateDescription();
if (editButtonText != null) {
myEditButton.setText(editButtonText);
}
myEditButton.setVisible(!myEditorComponent.isNewLibrary());
myEditButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
edit();
}
});
}
protected JPanel getMainPanel() {
return myMainPanel;
}
protected void updateDescription() {
myDescriptionLabel.setText(myLibraryType.getDescription(myEditorComponent.getProperties()));
}
protected abstract void edit();
protected void setModified() {
myModified = true;
updateDescription();
}
@NotNull
@Override
public JComponent createComponent() {
return myMainPanel;
}
@Override
public boolean isModified() {
return myModified;
}
@Override
public void reset() {
updateDescription();
}
}
@@ -29,6 +29,7 @@ import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.impl.libraries.LibraryImpl;
import com.intellij.openapi.roots.libraries.*;
import com.intellij.openapi.roots.libraries.ui.*;
import com.intellij.openapi.roots.libraries.ui.impl.RootDetectionUtil;
import com.intellij.openapi.roots.ui.configuration.ModuleEditor;
import com.intellij.openapi.roots.ui.configuration.libraries.LibraryPresentationManager;
import com.intellij.openapi.roots.ui.configuration.projectRoot.ModuleStructureConfigurable;
@@ -186,6 +187,12 @@ public class LibraryRootsComponent implements Disposable, LibraryEditorComponent
return myPanel;
}
@Override
@Nullable
public Project getProject() {
return myProject;
}
public void setContextModule(Module module) {
myContextModule = module;
}
@@ -257,7 +257,7 @@ public class LibraryImpl implements LibraryEx.ModifiableModelEx, LibraryEx {
final String typeId = element.getAttributeValue(LIBRARY_TYPE_ATTR);
if (typeId == null) return;
myType = LibraryTypeRegistry.getInstance().findTypeById(typeId);
myType = LibraryTypeService.getInstance().findTypeById(typeId);
if (myType == null) return;
myProperties = myType.createDefaultProperties();
@@ -1,37 +0,0 @@
/*
* Copyright 2000-2010 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.libraries;
import com.intellij.openapi.roots.libraries.LibraryType;
import com.intellij.openapi.roots.libraries.LibraryTypeRegistry;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author nik
*/
public class LibraryTypeRegistryImpl extends LibraryTypeRegistry {
@Nullable
public LibraryType<?> findTypeById(@NotNull String typeId) {
for (LibraryType type : LibraryType.EP_NAME.getExtensions()) {
if (type.getKind().getKindId().equals(typeId)) {
return type;
}
}
return null;
}
}
@@ -0,0 +1,97 @@
/*
* Copyright 2000-2010 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.libraries;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.libraries.LibraryProperties;
import com.intellij.openapi.roots.libraries.LibraryType;
import com.intellij.openapi.roots.libraries.LibraryTypeService;
import com.intellij.openapi.roots.libraries.NewLibraryConfiguration;
import com.intellij.openapi.roots.libraries.ui.LibraryRootsComponentDescriptor;
import com.intellij.openapi.roots.libraries.ui.OrderRoot;
import com.intellij.openapi.roots.libraries.ui.RootDetector;
import com.intellij.openapi.roots.libraries.ui.impl.RootDetectionUtil;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditor;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.PathUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* @author nik
*/
public class LibraryTypeServiceImpl extends LibraryTypeService {
@Nullable
public LibraryType<?> findTypeById(@NotNull String typeId) {
for (LibraryType type : LibraryType.EP_NAME.getExtensions()) {
if (type.getKind().getKindId().equals(typeId)) {
return type;
}
}
return null;
}
@Override
public NewLibraryConfiguration createLibraryFromFiles(@NotNull LibraryRootsComponentDescriptor descriptor,
@NotNull JComponent parentComponent,
@Nullable VirtualFile contextDirectory,
LibraryType<?> type,
final Project project) {
final List<? extends RootDetector> rootDetectors = descriptor.getRootDetectors();
final List<OrderRoot> roots;
if (!rootDetectors.isEmpty()) {
final FileChooserDescriptor chooserDescriptor = descriptor.createAttachFilesChooserDescriptor();
chooserDescriptor.setTitle("Select Library Files");
final VirtualFile[] rootCandidates = FileChooser.chooseFiles(parentComponent, chooserDescriptor, contextDirectory);
if (rootCandidates.length == 0) {
return null;
}
roots = RootDetectionUtil.detectRoots(Arrays.asList(rootCandidates), parentComponent, project, rootDetectors, true);
if (roots.isEmpty()) return null;
}
else {
roots = Collections.emptyList();
}
String name = suggestLibraryName(roots);
return doCreate(type, name, roots);
}
private static <P extends LibraryProperties<?>> NewLibraryConfiguration doCreate(final LibraryType<P> type, final String name, final List<OrderRoot> roots) {
return new NewLibraryConfiguration(name, type, type != null ? type.createDefaultProperties() : null) {
@Override
public void addRoots(@NotNull LibraryEditor editor) {
editor.addRoots(roots);
}
};
}
public static String suggestLibraryName(@NotNull List<OrderRoot> roots) {
if (roots.size() >= 1) {
return FileUtil.getNameWithoutExtension(PathUtil.getFileName(roots.get(0).getFile().getPath()));
}
return "Unnamed";
}
}
@@ -17,6 +17,7 @@ package com.intellij.openapi.roots.libraries;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.libraries.ui.LibraryEditorComponent;
import com.intellij.openapi.roots.libraries.ui.LibraryPropertiesEditor;
@@ -26,6 +27,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.List;
/**
@@ -47,11 +49,18 @@ public abstract class LibraryType<P extends LibraryProperties> extends LibraryPr
}
/**
* @return text to show in 'New Library' popup
* @return text to show in 'New Library' popup. Return {@code null} if the type should not be shown in the 'New Library' popup
*/
@Nullable
public abstract String getCreateActionName();
/**
* Called when a new library of this type is created in Project Structure dialog
*/
@Nullable
public abstract NewLibraryConfiguration createNewLibrary(@NotNull JComponent parentComponent, @Nullable VirtualFile contextDirectory,
@NotNull Project project);
@NotNull
public abstract P createDefaultProperties();
@@ -16,17 +16,29 @@
package com.intellij.openapi.roots.libraries;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.libraries.ui.LibraryRootsComponentDescriptor;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
/**
* @author nik
*/
public abstract class LibraryTypeRegistry {
public static LibraryTypeRegistry getInstance() {
return ServiceManager.getService(LibraryTypeRegistry.class);
public abstract class LibraryTypeService {
public static LibraryTypeService getInstance() {
return ServiceManager.getService(LibraryTypeService.class);
}
@Nullable
public abstract LibraryType<?> findTypeById(@NotNull String typeId);
@Nullable
public abstract NewLibraryConfiguration createLibraryFromFiles(@NotNull LibraryRootsComponentDescriptor descriptor,
@NotNull JComponent parentComponent,
@Nullable VirtualFile contextDirectory,
@Nullable LibraryType<?> type,
final @Nullable Project project);
}
@@ -13,10 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.openapi.roots.ui.configuration.libraries;
package com.intellij.openapi.roots.libraries;
import com.intellij.openapi.roots.libraries.LibraryProperties;
import com.intellij.openapi.roots.libraries.LibraryType;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -15,6 +15,7 @@
*/
package com.intellij.openapi.roots.libraries.ui;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.libraries.LibraryProperties;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditor;
import com.intellij.openapi.vfs.VirtualFile;
@@ -39,4 +40,7 @@ public interface LibraryEditorComponent<P extends LibraryProperties> {
VirtualFile getExistingRootDirectory();
void updateRootsTree();
@Nullable
Project getProject();
}
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.openapi.roots.ui.configuration.libraryEditor;
package com.intellij.openapi.roots.libraries.ui.impl;
import com.intellij.openapi.application.ApplicationNamesInfo;
import com.intellij.openapi.project.Project;
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.openapi.roots.ui.configuration.libraryEditor;
package com.intellij.openapi.roots.libraries.ui.impl;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.ProgressIndicator;
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.openapi.roots.ui.configuration.libraryEditor;
package com.intellij.openapi.roots.libraries.ui.impl;
import com.intellij.openapi.roots.libraries.ui.RootDetector;
import com.intellij.openapi.vfs.VirtualFile;
@@ -114,8 +114,8 @@
<applicationService serviceInterface="com.intellij.openapi.roots.libraries.LibraryDetectionManager"
serviceImplementation="com.intellij.openapi.roots.impl.libraries.LibraryDetectionManagerImpl"/>
<applicationService serviceInterface="com.intellij.openapi.roots.libraries.LibraryTypeRegistry"
serviceImplementation="com.intellij.openapi.roots.impl.libraries.LibraryTypeRegistryImpl"/>
<applicationService serviceInterface="com.intellij.openapi.roots.libraries.LibraryTypeService"
serviceImplementation="com.intellij.openapi.roots.impl.libraries.LibraryTypeServiceImpl"/>
<applicationService serviceInterface="com.intellij.usageView.UsageTreeColorsScheme"
serviceImplementation="com.intellij.usageView.UsageTreeColorsScheme"/>
@@ -19,8 +19,8 @@ import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.roots.libraries.LibraryKind;
import com.intellij.openapi.roots.libraries.LibraryPresentationProvider;
import com.intellij.openapi.roots.libraries.NewLibraryConfiguration;
import com.intellij.openapi.roots.ui.configuration.libraries.CustomLibraryDescription;
import com.intellij.openapi.roots.ui.configuration.libraries.NewLibraryConfiguration;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditor;
import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainer;
import com.intellij.openapi.util.SystemInfo;
@@ -36,7 +36,7 @@ import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.maven.model.MavenRepositoryInfo;
import org.jetbrains.idea.maven.services.MavenRepositoryServicesManager;
import org.jetbrains.idea.maven.utils.RepositoryAttachHandler;
import org.jetbrains.idea.maven.utils.library.RepositoryAttachHandler;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
@@ -19,7 +19,7 @@ import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.fileChooser.ex.FileChooserDialogImpl;
import com.intellij.openapi.fileChooser.FileChooserDialog;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectBundle;
import com.intellij.openapi.ui.DialogWrapper;
@@ -43,8 +43,10 @@ import com.intellij.util.ui.AsyncProcessIcon;
import gnu.trove.THashMap;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.model.MavenArtifactInfo;
import org.jetbrains.idea.maven.model.MavenRepositoryInfo;
import org.jetbrains.idea.maven.utils.library.RepositoryAttachHandler;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
@@ -81,7 +83,7 @@ public class RepositoryAttachDialog extends DialogWrapper {
private TextFieldWithBrowseButton myDirectoryField;
private String myFilterString;
public RepositoryAttachDialog(Project project, boolean managed) {
public RepositoryAttachDialog(Project project, boolean managed, final @Nullable String initialFilter) {
super(project, true);
myProject = project;
myManaged = managed;
@@ -107,6 +109,9 @@ public class RepositoryAttachDialog extends DialogWrapper {
myCombobox.setEditable(true);
final JTextField textField = (JTextField)myCombobox.getEditor().getEditorComponent();
textField.setColumns(50);
if (initialFilter != null) {
textField.setText(initialFilter);
}
textField.getDocument().addDocumentListener(new DocumentAdapter() {
@Override
protected void textChanged(DocumentEvent e) {
@@ -153,7 +158,7 @@ public class RepositoryAttachDialog extends DialogWrapper {
}
}
final FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor();
descriptor.putUserData(FileChooserDialogImpl.PREFER_LAST_OVER_TO_SELECT, Boolean.TRUE);
descriptor.putUserData(FileChooserDialog.PREFER_LAST_OVER_TO_SELECT, Boolean.TRUE);
myDirectoryField.addBrowseFolderListener(ProjectBundle.message("file.chooser.directory.for.downloaded.libraries.title"),
ProjectBundle.message("file.chooser.directory.for.downloaded.libraries.description"), null,
descriptor);
@@ -13,33 +13,33 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.idea.maven.utils;
package org.jetbrains.idea.maven.utils.library;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationType;
import com.intellij.notification.Notifications;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.progress.PerformInBackgroundOption;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.JavadocOrderRootType;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.NewLibraryConfiguration;
import com.intellij.openapi.roots.libraries.ui.OrderRoot;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditor;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryTableAttachHandler;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.*;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.util.PairProcessor;
import com.intellij.util.Processor;
import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.execution.SoutMavenConsole;
@@ -49,8 +49,11 @@ import org.jetbrains.idea.maven.project.MavenEmbeddersManager;
import org.jetbrains.idea.maven.project.MavenProjectsManager;
import org.jetbrains.idea.maven.server.MavenEmbedderWrapper;
import org.jetbrains.idea.maven.services.MavenRepositoryServicesManager;
import org.jetbrains.idea.maven.utils.MavenLog;
import org.jetbrains.idea.maven.utils.MavenProcessCanceledException;
import org.jetbrains.idea.maven.utils.MavenProgressIndicator;
import org.jetbrains.idea.maven.utils.RepositoryAttachDialog;
import javax.swing.*;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
@@ -59,93 +62,78 @@ import java.util.*;
/**
* @author Gregory.Shrago
*/
public class RepositoryAttachHandler implements LibraryTableAttachHandler {
public String getLongName() {
return "Attach Classes from Repository...";
}
public class RepositoryAttachHandler {
public String getShortName() {
return "Classes from Repository...";
}
public Icon getIcon() {
return MavenIcons.MAVEN_ICON;
}
public ActionCallback performAttach(final Project project,
final LibraryEditor libraryEditor,
final @Nullable NullableComputable<Library.ModifiableModel> modelProvider) {
final RepositoryAttachDialog dialog = new RepositoryAttachDialog(project, false);
dialog.setTitle(getLongName());
@Nullable
public static NewLibraryConfiguration chooseLibraryAndDownload(final @NotNull Project project, final @Nullable String initialFilter) {
final RepositoryAttachDialog dialog = new RepositoryAttachDialog(project, false, initialFilter);
dialog.setTitle("Attach Classes from Repository...");
dialog.show();
if (dialog.getExitCode() == DialogWrapper.OK_EXIT_CODE) {
final ActionCallback callback = new ActionCallback();
final String copyTo = dialog.getDirectoryPath();
final String coord = dialog.getCoordinateText();
final boolean attachJavaDoc = dialog.getAttachJavaDoc();
final boolean attachSources = dialog.getAttachSources();
final SmartList<MavenExtraArtifactType> extraTypes = new SmartList<MavenExtraArtifactType>();
if (attachSources) extraTypes.add(MavenExtraArtifactType.SOURCES);
if (attachJavaDoc) extraTypes.add(MavenExtraArtifactType.DOCS);
resolveLibrary(project, coord, extraTypes, dialog.getRepositories(), true, new Processor<List<MavenArtifact>>() {
public boolean process(final List<MavenArtifact> artifacts) {
if (dialog.getExitCode() != DialogWrapper.OK_EXIT_CODE) {
return null;
}
final String copyTo = dialog.getDirectoryPath();
final String coord = dialog.getCoordinateText();
final boolean attachJavaDoc = dialog.getAttachJavaDoc();
final boolean attachSources = dialog.getAttachSources();
final SmartList<MavenExtraArtifactType> extraTypes = new SmartList<MavenExtraArtifactType>();
if (attachSources) extraTypes.add(MavenExtraArtifactType.SOURCES);
if (attachJavaDoc) extraTypes.add(MavenExtraArtifactType.DOCS);
final Ref<NewLibraryConfiguration> result = Ref.create(null);
resolveLibrary(project, coord, extraTypes, dialog.getRepositories(), new Processor<List<MavenArtifact>>() {
public boolean process(final List<MavenArtifact> artifacts) {
final boolean nothingRetrieved = artifacts.isEmpty();
if (!nothingRetrieved) {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
public void run() {
replaceLibraryData(project, libraryEditor, artifacts, copyTo);
callback.setDone();
final List<OrderRoot> roots = createRoots(artifacts, copyTo);
result.set(new NewLibraryConfiguration(coord, RepositoryLibraryType.getInstance(), new RepositoryLibraryProperties(coord)) {
@Override
public void addRoots(@NotNull LibraryEditor editor) {
editor.addRoots(roots);
}
});
}
});
final boolean nothingRetrieved = artifacts.isEmpty();
final StringBuilder sb = new StringBuilder();
final String title;
if (nothingRetrieved) {
title = "No files were downloaded";
sb.append("for ").append(coord);
}
else {
title = "The following files were downloaded:";
sb.append("<ol>");
for (MavenArtifact each : artifacts) {
sb.append("<li>");
sb.append(each.getFile().getName());
final String scope = each.getScope();
if (scope != null) {
sb.append(" (");
sb.append(scope);
sb.append(")");
}
sb.append("</li>");
}
sb.append("</ol>");
}
if (nothingRetrieved && ModalityState.current().dominates(ModalityState.NON_MODAL)) {
Messages.showErrorDialog(project, sb.toString(), title);
}
else {
Notifications.Bus.notify(new Notification("Repository", title, sb.toString(),
nothingRetrieved ? NotificationType.WARNING : NotificationType.INFORMATION), project);
}
return true;
}
});
return callback;
}
return new ActionCallback.Rejected();
final StringBuilder sb = new StringBuilder();
final String title;
if (nothingRetrieved) {
title = "No files were downloaded";
sb.append("for ").append(coord);
}
else {
title = "The following files were downloaded:";
sb.append("<ol>");
for (MavenArtifact each : artifacts) {
sb.append("<li>");
sb.append(each.getFile().getName());
final String scope = each.getScope();
if (scope != null) {
sb.append(" (");
sb.append(scope);
sb.append(")");
}
sb.append("</li>");
}
sb.append("</ol>");
}
if (nothingRetrieved && ModalityState.current().dominates(ModalityState.NON_MODAL)) {
Messages.showErrorDialog(project, sb.toString(), title);
}
else {
Notifications.Bus.notify(new Notification("Repository", title, sb.toString(),
nothingRetrieved ? NotificationType.WARNING : NotificationType.INFORMATION), project);
}
return true;
}
});
return result.get();
}
private static void replaceLibraryData(Project project,
LibraryEditor libraryEditor,
Collection<MavenArtifact> artifacts,
String copyTo) {
final String repoUrl = getLocalRepositoryUrl(project);
for (OrderRootType type : OrderRootType.getAllTypes()) {
for (String url : libraryEditor.getUrls(type)) {
if (url.startsWith(repoUrl)) {
libraryEditor.removeRoot(url, type);
}
}
}
private static List<OrderRoot> createRoots(Collection<MavenArtifact> artifacts, String copyTo) {
final List<OrderRoot> result = new ArrayList<OrderRoot>();
final VirtualFileManager manager = VirtualFileManager.getInstance();
for (MavenArtifact each : artifacts) {
try {
@@ -158,15 +146,19 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler {
}
}
final String url = VfsUtil.getUrlForLibraryRoot(toFile);
manager.refreshAndFindFileByUrl(url);
if (MavenExtraArtifactType.DOCS.getDefaultClassifier().equals(each.getClassifier())) {
libraryEditor.addRoot(url, JavadocOrderRootType.getInstance());
}
else if (MavenExtraArtifactType.SOURCES.getDefaultClassifier().equals(each.getClassifier())) {
libraryEditor.addRoot(url, OrderRootType.SOURCES);
}
else {
libraryEditor.addRoot(url, OrderRootType.CLASSES);
final VirtualFile file = manager.refreshAndFindFileByUrl(url);
if (file != null) {
OrderRootType rootType;
if (MavenExtraArtifactType.DOCS.getDefaultClassifier().equals(each.getClassifier())) {
rootType = JavadocOrderRootType.getInstance();
}
else if (MavenExtraArtifactType.SOURCES.getDefaultClassifier().equals(each.getClassifier())) {
rootType = OrderRootType.SOURCES;
}
else {
rootType = OrderRootType.CLASSES;
}
result.add(new OrderRoot(file, rootType));
}
}
catch (MalformedURLException e) {
@@ -176,11 +168,7 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler {
MavenLog.LOG.warn(e);
}
}
}
private static String getLocalRepositoryUrl(Project project) {
File file = MavenProjectsManager.getInstance(project).getGeneralSettings().getEffectiveLocalRepository();
return VfsUtil.pathToUrl(FileUtil.toSystemIndependentName(file.getPath()));
return result;
}
public static void searchArtifacts(final Project project, String coord,
@@ -273,41 +261,17 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler {
});
}
private static MavenId getMavenId(final String coord) {
final String[] parts = coord.split(":");
return new MavenId(parts.length > 0 ? parts[0] : null,
parts.length > 1 ? parts[1] : null,
parts.length > 2 ? parts[2] : null);
}
public static void resolveLibrary(final Project project,
final String coord,
final List<MavenExtraArtifactType> extraTypes,
final Collection<MavenRepositoryInfo> repositories,
boolean modal,
final Processor<List<MavenArtifact>> resultProcessor) {
private static void resolveLibrary(final Project project,
final String coord,
final List<MavenExtraArtifactType> extraTypes,
final Collection<MavenRepositoryInfo> repositories,
final Processor<List<MavenArtifact>> resultProcessor) {
final MavenId mavenId = getMavenId(coord);
final Task task;
if (modal) {
task = new Task.Modal(project, "Maven", false) {
public void run(@NotNull ProgressIndicator indicator) {
doResolveInner(project, mavenId, extraTypes, repositories, resultProcessor, indicator);
}
};
}
else {
task = new Task.Backgroundable(project, "Maven", false, PerformInBackgroundOption.DEAF) {
public void run(@NotNull ProgressIndicator indicator) {
doResolveInner(project, mavenId, extraTypes, repositories, resultProcessor, indicator);
}
@Override
public boolean shouldStartInBackground() {
return false;
}
};
}
final Task task = new Task.Modal(project, "Maven", false) {
public void run(@NotNull ProgressIndicator indicator) {
doResolveInner(project, mavenId, extraTypes, repositories, resultProcessor, indicator);
}
};
ProgressManager.getInstance().run(task);
}
@@ -374,4 +338,11 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler {
}
return result;
}
public static MavenId getMavenId(final String coord) {
final String[] parts = coord.split(":");
return new MavenId(parts.length > 0 ? parts[0] : null,
parts.length > 1 ? parts[1] : null,
parts.length > 2 ? parts[2] : null);
}
}
@@ -0,0 +1,52 @@
/*
* Copyright 2000-2011 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 org.jetbrains.idea.maven.utils.library;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.libraries.NewLibraryConfiguration;
import com.intellij.openapi.roots.libraries.ui.LibraryEditorComponent;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditorBase;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryPropertiesEditorBase;
/**
* @author nik
*/
public class RepositoryLibraryEditor extends LibraryPropertiesEditorBase<RepositoryLibraryProperties, RepositoryLibraryType> {
public RepositoryLibraryEditor(LibraryEditorComponent<RepositoryLibraryProperties> component, RepositoryLibraryType libraryType) {
super(component, libraryType, null);
}
@Override
protected void edit() {
final Project project = myEditorComponent.getProject();
final NewLibraryConfiguration configuration = RepositoryAttachHandler.chooseLibraryAndDownload(project,
myEditorComponent.getProperties().getMavenId());
if (configuration == null) return;
final LibraryEditorBase target = (LibraryEditorBase)myEditorComponent.getLibraryEditor();
target.removeAllRoots();
target.setName(configuration.getDefaultLibraryName());
target.setType(myLibraryType);
target.setProperties(configuration.getProperties());
configuration.addRoots(target);
myEditorComponent.updateRootsTree();
setModified();
}
@Override
public void apply() {
}
}
@@ -0,0 +1,63 @@
/*
* Copyright 2000-2011 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 org.jetbrains.idea.maven.utils.library;
import com.intellij.openapi.roots.libraries.LibraryProperties;
import com.intellij.openapi.util.Comparing;
import com.intellij.util.xmlb.annotations.Attribute;
/**
* @author nik
*/
public class RepositoryLibraryProperties extends LibraryProperties<RepositoryLibraryProperties> {
private String myMavenId;
public RepositoryLibraryProperties() {
}
public RepositoryLibraryProperties(String mavenId) {
myMavenId = mavenId;
}
@Override
public boolean equals(Object obj) {
return obj instanceof RepositoryLibraryProperties && Comparing.equal(myMavenId, ((RepositoryLibraryProperties)obj).myMavenId);
}
@Override
public int hashCode() {
return Comparing.hashcode(myMavenId);
}
@Override
public RepositoryLibraryProperties getState() {
return this;
}
@Override
public void loadState(RepositoryLibraryProperties state) {
myMavenId = state.myMavenId;
}
@Attribute("maven-id")
public String getMavenId() {
return myMavenId;
}
public void setMavenId(String mavenId) {
myMavenId = mavenId;
}
}
@@ -0,0 +1,78 @@
/*
* Copyright 2000-2011 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 org.jetbrains.idea.maven.utils.library;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.libraries.LibraryKind;
import com.intellij.openapi.roots.libraries.LibraryType;
import com.intellij.openapi.roots.libraries.NewLibraryConfiguration;
import com.intellij.openapi.roots.libraries.ui.LibraryEditorComponent;
import com.intellij.openapi.roots.libraries.ui.LibraryPropertiesEditor;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.utils.MavenIcons;
import javax.swing.*;
/**
* @author nik
*/
public class RepositoryLibraryType extends LibraryType<RepositoryLibraryProperties> {
private static final LibraryKind<RepositoryLibraryProperties> LIBRARY_KIND = LibraryKind.create("repository");
public static RepositoryLibraryType getInstance() {
return EP_NAME.findExtension(RepositoryLibraryType.class);
}
public RepositoryLibraryType() {
super(LIBRARY_KIND);
}
@Override
public String getCreateActionName() {
return "From Maven...";
}
@Override
public NewLibraryConfiguration createNewLibrary(@NotNull JComponent parentComponent,
@Nullable VirtualFile contextDirectory,
@NotNull Project project) {
return RepositoryAttachHandler.chooseLibraryAndDownload(project, null);
}
@NotNull
@Override
public RepositoryLibraryProperties createDefaultProperties() {
return new RepositoryLibraryProperties();
}
@Override
public LibraryPropertiesEditor createPropertiesEditor(@NotNull LibraryEditorComponent<RepositoryLibraryProperties> component) {
return new RepositoryLibraryEditor(component, this);
}
@Override
public String getDescription(@NotNull RepositoryLibraryProperties properties) {
final String mavenIdKey = properties.getMavenId();
return "Library " + (mavenIdKey != null ? mavenIdKey + " " : "") + "from Maven repository";
}
@Override
public Icon getIcon() {
return MavenIcons.MAVEN_ICON;
}
}
@@ -92,7 +92,7 @@
<applicationService serviceImplementation="org.jetbrains.idea.maven.dom.converters.repositories.MavenRepositoriesProvider"/>
<typedHandler implementation="org.jetbrains.idea.maven.dom.code.MavenTypedHandlerDelegate"/>
<libraryTable.attachHandler implementation="org.jetbrains.idea.maven.utils.RepositoryAttachHandler"/>
<library.type implementation="org.jetbrains.idea.maven.utils.library.RepositoryLibraryType"/>
<backspaceHandlerDelegate implementation="org.jetbrains.idea.maven.dom.code.MavenBackspaceHandlerDelegate"/>
<intentionAction>