/* * Copyright 2010-2015 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.kotlin.idea.framework.ui; import com.google.common.collect.ImmutableMap; import com.intellij.ide.util.projectWizard.ProjectWizardUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.PathUtil; import kotlin.collections.CollectionsKt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.io.File; import java.io.IOException; import java.util.*; public class FileUIUtils { private FileUIUtils() { } @Nullable public static File copyWithOverwriteDialog( @NotNull String messagesTitle, @NotNull String destinationFolder, @NotNull File file ) { Map<File, File> copiedFiles = copyWithOverwriteDialog(messagesTitle, ImmutableMap.of(file, destinationFolder)); if (copiedFiles == null) { return null; } File copy = copiedFiles.get(file); assert copy != null; return copy; } @Nullable public static Map<File, File> copyWithOverwriteDialog( @NotNull String messagesTitle, @NotNull Map<File, String> filesWithDestinations ) { Set<String> fileNames = new HashSet<String>(); Map<File, File> targetFiles = new LinkedHashMap<File, File>(filesWithDestinations.size()); for (Map.Entry<File, String> sourceToDestination : filesWithDestinations.entrySet()) { File file = sourceToDestination.getKey(); String destinationPath = sourceToDestination.getValue(); String fileName = file.getName(); if (!fileNames.add(fileName)) { throw new IllegalArgumentException("There are several files with the same name: " + fileName); } targetFiles.put(file, new File(destinationPath, fileName)); } Collection<Map.Entry<File, File>> existentFiles = CollectionsKt.filter(targetFiles.entrySet(), sourceToTarget -> sourceToTarget.getValue().exists()); if (!existentFiles.isEmpty()) { String message; if (existentFiles.size() == 1) { File conflictingFile = existentFiles.iterator().next().getValue(); message = String.format("File \"%s\" already exists in %s.\nDo you want to overwrite it?", conflictingFile.getName(), conflictingFile.getParentFile().getAbsolutePath()); } else { Collection<File> conflictFiles = CollectionsKt.map(existentFiles, Map.Entry::getValue); message = String.format("Files already exist:\n%s\nDo you want to overwrite them?", StringUtil.join(conflictFiles, "\n")); } int replaceIfExist = Messages.showYesNoDialog( null, message, messagesTitle + ". Replace File", "Overwrite", "Cancel", Messages.getWarningIcon()); if (replaceIfExist != JOptionPane.YES_OPTION) { return null; } } for (Map.Entry<File, File> sourceToTarget : targetFiles.entrySet()) { try { String destinationPath = sourceToTarget.getValue().getParentFile().getAbsolutePath(); if (!ProjectWizardUtil.createDirectoryIfNotExists("Destination folder", destinationPath, false)) { Messages.showErrorDialog(String.format("Error during folder creating '%s'", destinationPath), messagesTitle + ". Error"); return null; } FileUtil.copy(sourceToTarget.getKey(), sourceToTarget.getValue()); LocalFileSystem.getInstance().refreshAndFindFileByIoFile(sourceToTarget.getValue()); } catch (IOException e) { Messages.showErrorDialog("Error with copy file " + sourceToTarget.getKey().getName(), messagesTitle + ". Error"); return null; } } return targetFiles; } @NotNull public static String createRelativePath(@Nullable Project project, @Nullable VirtualFile contextDirectory, String relativePath) { String path = null; if (contextDirectory != null) { path = PathUtil.getLocalPath(contextDirectory); } else if (project != null) { path = PathUtil.getLocalPath(project.getBaseDir()); } if (path != null) { path = new File(path, relativePath).getAbsolutePath(); } else { path = ""; } return path; } }