blob: 84816f8220f8bab1c40ef59be06681c5526de340 [file] [log] [blame]
/*
* Copyright 2000-2013 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.framework.addSupport.impl;
import com.intellij.CommonBundle;
import com.intellij.facet.impl.DefaultFacetsProvider;
import com.intellij.facet.impl.ui.libraries.LibraryCompositionSettings;
import com.intellij.framework.FrameworkTypeEx;
import com.intellij.framework.addSupport.FrameworkSupportInModuleConfigurable;
import com.intellij.framework.addSupport.FrameworkSupportInModuleProvider;
import com.intellij.ide.util.frameworkSupport.FrameworkSupportModelImpl;
import com.intellij.ide.util.frameworkSupport.FrameworkSupportUtil;
import com.intellij.ide.util.newProjectWizard.FrameworkSupportOptionsComponent;
import com.intellij.ide.util.newProjectWizard.impl.FrameworkSupportModelBase;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.ProjectBundle;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.roots.libraries.Library;
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.projectRoot.LibrariesContainer;
import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainerFactory;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author nik
*/
public class AddSupportForSingleFrameworkDialog extends DialogWrapper {
private final Module myModule;
private final FrameworkSupportInModuleConfigurable myConfigurable;
private final FrameworkSupportModelBase myModel;
private final FrameworkSupportOptionsComponent myComponent;
private final FrameworkTypeEx myFrameworkType;
private final ModifiableModelsProvider myModifiableModelsProvider;
public AddSupportForSingleFrameworkDialog(@NotNull Module module,
FrameworkTypeEx frameworkType, @NotNull FrameworkSupportInModuleProvider provider,
@NotNull LibrariesContainer librariesContainer,
ModifiableModelsProvider modifiableModelsProvider) {
super(module.getProject(), true);
VirtualFile[] roots = ModuleRootManager.getInstance(module).getContentRoots();
final VirtualFile baseDir = roots.length > 0 ? roots[0] : module.getProject().getBaseDir();
final String baseDirectoryForLibraries = baseDir != null ? baseDir.getPath() : "";
myFrameworkType = frameworkType;
myModifiableModelsProvider = modifiableModelsProvider;
setTitle(ProjectBundle.message("dialog.title.add.framework.0.support", frameworkType.getPresentableName()));
myModule = module;
myModel = new FrameworkSupportModelImpl(module.getProject(), baseDirectoryForLibraries, librariesContainer);
myConfigurable = provider.createConfigurable(myModel);
myComponent = new FrameworkSupportOptionsComponent(myModel, myModel.getLibrariesContainer(), myDisposable, provider, myConfigurable);
Disposer.register(myDisposable, myConfigurable);
init();
}
public static AddSupportForSingleFrameworkDialog createDialog(@NotNull Module module,
@NotNull FrameworkSupportInModuleProvider provider) {
List<FrameworkSupportInModuleProvider> providers = FrameworkSupportUtil.getProviders(module, DefaultFacetsProvider.INSTANCE);
if (providers.isEmpty()) return null;
IdeaModifiableModelsProvider modifiableModelsProvider = new IdeaModifiableModelsProvider();
LibrariesContainer container = LibrariesContainerFactory.createContainer(modifiableModelsProvider.getModuleModifiableModel(module));
return new AddSupportForSingleFrameworkDialog(module, provider.getFrameworkType(), provider, container, modifiableModelsProvider);
}
protected void doOKAction() {
final LibraryCompositionSettings librarySettings = myComponent.getLibraryCompositionSettings();
if (librarySettings != null) {
final ModifiableRootModel modifiableModel = myModifiableModelsProvider.getModuleModifiableModel(myModule);
if (!askAndRemoveDuplicatedLibraryEntry(modifiableModel, librarySettings.getLibraryDescription())) {
if (myConfigurable.isOnlyLibraryAdded()) {
myModifiableModelsProvider.disposeModuleModifiableModel(modifiableModel);
return;
}
return;
}
new WriteAction() {
protected void run(final Result result) {
myModifiableModelsProvider.commitModuleModifiableModel(modifiableModel);
}
}.execute();
final boolean downloaded = librarySettings.downloadFiles(getRootPane());
if (!downloaded) {
int answer = Messages.showYesNoDialog(getRootPane(),
ProjectBundle.message("warning.message.some.required.libraries.wasn.t.downloaded"),
CommonBundle.getWarningTitle(), Messages.getWarningIcon());
if (answer != Messages.YES) {
return;
}
}
}
new WriteAction() {
protected void run(final Result result) {
final ModifiableRootModel rootModel = myModifiableModelsProvider.getModuleModifiableModel(myModule);
if (librarySettings != null) {
librarySettings.addLibraries(rootModel, new ArrayList<Library>(), myModel.getLibrariesContainer());
}
myConfigurable.addSupport(myModule, rootModel, myModifiableModelsProvider);
myModifiableModelsProvider.commitModuleModifiableModel(rootModel);
}
}.execute();
super.doOKAction();
}
@Override
protected String getDimensionServiceKey() {
return "#com.intellij.framework.addSupport.AddSupportForSingleFrameworkDialog";
}
@Override
protected String getHelpId() {
return "reference.frameworks.support.dialog";//todo[nik]
}
protected JComponent createCenterPanel() {
return myComponent.getMainPanel();
}
private boolean askAndRemoveDuplicatedLibraryEntry(@NotNull ModifiableRootModel rootModel, @NotNull CustomLibraryDescription description) {
List<OrderEntry> existingEntries = new ArrayList<OrderEntry>();
final LibrariesContainer container = myModel.getLibrariesContainer();
for (OrderEntry entry : rootModel.getOrderEntries()) {
if (!(entry instanceof LibraryOrderEntry)) continue;
final Library library = ((LibraryOrderEntry)entry).getLibrary();
if (library == null) continue;
if (LibraryPresentationManager.getInstance().isLibraryOfKind(library, container, description.getSuitableLibraryKinds())) {
existingEntries.add(entry);
}
}
if (!existingEntries.isEmpty()) {
String message;
if (existingEntries.size() > 1) {
message = "There are already " + existingEntries.size() + " " + myFrameworkType.getPresentableName() + " libraries.\n Do you want to replace them?";
}
else {
final String name = existingEntries.get(0).getPresentableName();
message = "There is already a " + myFrameworkType.getPresentableName() + " library '" + name + "'.\n Do you want to replace it?";
}
final int result = Messages.showYesNoCancelDialog(rootModel.getProject(), message, "Library Already Exists",
"&Replace", "&Add", "&Cancel", null);
if (result == Messages.YES) {
for (OrderEntry entry : existingEntries) {
rootModel.removeOrderEntry(entry);
}
}
else if (result != Messages.NO) {
return false;
}
}
return true;
}
}