blob: 680e5a968d27b5fff8ed1b6da945f701bf5c79f8 [file] [log] [blame]
/*
* 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.ui.configuration.classpath;
import com.intellij.ide.projectView.PresentationData;
import com.intellij.ide.util.treeView.NodeDescriptor;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.project.Project;
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.ui.configuration.libraries.LibraryPresentationManager;
import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesModifiableModel;
import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.ui.SimpleTextAttributes;
import com.intellij.util.containers.Predicate;
import com.intellij.util.ui.classpath.ChooseLibrariesFromTablesDialog;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* @author nik
*/
public class ProjectStructureChooseLibrariesDialog extends ChooseLibrariesFromTablesDialog {
private final ClasspathPanel myClasspathPanel;
private final StructureConfigurableContext myContext;
private final Predicate<Library> myAcceptedLibraries;
private final List<Library> myCreatedModuleLibraries = new ArrayList<Library>();
private JButton myCreateLibraryButton;
public ProjectStructureChooseLibrariesDialog(ClasspathPanel classpathPanel,
StructureConfigurableContext context,
Predicate<Library> acceptedLibraries) {
super(classpathPanel.getComponent(), "Choose Libraries", classpathPanel.getProject(), true);
myClasspathPanel = classpathPanel;
myContext = context;
myAcceptedLibraries = acceptedLibraries;
setOKButtonText("Add Selected");
init();
}
@Override
protected void doOKAction() {
super.doOKAction();
removeCreatedModuleLibraries(getSelectedLibraries());
}
@Override
public void doCancelAction() {
super.doCancelAction();
removeCreatedModuleLibraries(Collections.<Library>emptyList());
}
private void removeCreatedModuleLibraries(Collection<Library> selected) {
for (Library library : myCreatedModuleLibraries) {
if (!selected.contains(library)) {
myClasspathPanel.getRootModel().getModuleLibraryTable().removeLibrary(library);
}
}
}
@Override
protected void collectChildren(Object element, List<Object> result) {
if (element instanceof Application && !myCreatedModuleLibraries.isEmpty()) {
result.add(myClasspathPanel.getRootModel().getModuleLibraryTable());
}
super.collectChildren(element, result);
}
@NotNull
@Override
protected Library[] getLibraries(@NotNull LibraryTable table) {
if (table.getTableLevel().equals(LibraryTableImplUtil.MODULE_LEVEL)) {
return myCreatedModuleLibraries.toArray(new Library[myCreatedModuleLibraries.size()]);
}
final LibrariesModifiableModel model = getLibrariesModifiableModel(table);
if (model == null) return Library.EMPTY_ARRAY;
return model.getLibraries();
}
@Nullable
private LibrariesModifiableModel getLibrariesModifiableModel(LibraryTable table) {
return table != null ? myContext.myLevel2Providers.get(table.getTableLevel()) : null;
}
@Override
protected boolean acceptsElement(Object element) {
if (element instanceof Library) {
final Library library = (Library)element;
return myAcceptedLibraries.apply(library);
}
return true;
}
@NotNull
private String getLibraryName(@NotNull Library library) {
final LibrariesModifiableModel model = getLibrariesModifiableModel(library.getTable());
if (model != null) {
if (model.hasLibraryEditor(library)) {
return model.getLibraryEditor(library).getName();
}
}
return library.getName();
}
@NotNull
@Override
protected Action[] createActions() {
if (SystemInfo.isMac) {
return new Action[]{getCancelAction(), new CreateNewLibraryAction(), getOKAction()};
}
return new Action[]{getOKAction(), new CreateNewLibraryAction(), getCancelAction()};
}
@Override
protected JButton createJButtonForAction(Action action) {
final JButton button = super.createJButtonForAction(action);
if (action instanceof CreateNewLibraryAction) {
myCreateLibraryButton = button;
}
return button;
}
@Override
protected LibrariesTreeNodeBase<Library> createLibraryDescriptor(NodeDescriptor parentDescriptor,
Library library) {
final String libraryName = getLibraryName(library);
return new LibraryEditorDescriptor(getProject(), parentDescriptor, library, libraryName, myContext);
}
private static class LibraryEditorDescriptor extends LibrariesTreeNodeBase<Library> {
protected LibraryEditorDescriptor(final Project project, final NodeDescriptor parentDescriptor, final Library element,
String libraryName, StructureConfigurableContext context) {
super(project, parentDescriptor, element);
final PresentationData templatePresentation = getTemplatePresentation();
Icon icon = LibraryPresentationManager.getInstance().getNamedLibraryIcon(element, context);
templatePresentation.setIcon(icon);
templatePresentation.addText(libraryName, SimpleTextAttributes.REGULAR_ATTRIBUTES);
}
}
private class CreateNewLibraryAction extends DialogWrapperAction {
private CreateNewLibraryAction() {
super("New Library...");
putValue(MNEMONIC_KEY, KeyEvent.VK_N);
}
@Override
protected void doAction(ActionEvent e) {
AddNewLibraryDependencyAction.chooseTypeAndCreate(myClasspathPanel, myContext, myCreateLibraryButton,
new AddNewLibraryDependencyAction.LibraryCreatedCallback() {
@Override
public void libraryCreated(@NotNull Library library) {
if (library.getTable() == null) {
myCreatedModuleLibraries.add(library);
}
queueUpdateAndSelect(library);
}
});
}
}
}