/*
* Copyright 2003-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 jetbrains.mps.ide.projectPane.fileSystem.actions;
import com.intellij.ide.DeleteProvider;
import com.intellij.ide.actions.DeleteAction;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vfs.VirtualFile;
import jetbrains.mps.logging.Logger;
import org.apache.log4j.LogManager;
import jetbrains.mps.smodel.ModelAccess;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;
public class FileDeleteActionFixed extends DeleteAction {
@Override
@Nullable
protected DeleteProvider getDeleteProvider(DataContext dataContext) {
return new MyDeleteProvider();
}
private static class MyDeleteProvider implements DeleteProvider {
private final static Logger LOG = Logger.wrap(LogManager.getLogger(MyDeleteProvider.class));
@Override
public boolean canDeleteElement(DataContext dataContext) {
final VirtualFile[] files = PlatformDataKeys.VIRTUAL_FILE_ARRAY.getData(dataContext);
return files != null && files.length > 0;
}
@Override
public void deleteElement(DataContext dataContext) {
final VirtualFile[] files = PlatformDataKeys.VIRTUAL_FILE_ARRAY.getData(dataContext);
if (files == null || files.length == 0) return;
String message = createConfirmationMessage(files);
int returnValue = Messages.showYesNoDialog(message, "Delete", Messages.getQuestionIcon());
if (returnValue != 0) return;
Arrays.sort(files, FileComparator.getInstance());
ModelAccess.instance().runWriteAction(new Runnable() {
@Override
public void run() {
for (final VirtualFile file : files) {
try {
file.delete(this);
}
catch (IOException e) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
Messages.showMessageDialog("Could not erase file or folder: " + file.getName(),
"Error", Messages.getErrorIcon());
}
});
}
}
}
});
}
private final static class FileComparator implements Comparator<VirtualFile> {
private static final FileComparator ourInstance = new FileComparator();
public static FileComparator getInstance() {
return ourInstance;
}
@Override
public int compare(final VirtualFile o1, final VirtualFile o2) {
// files first
return o2.getPath().compareTo(o1.getPath());
}
}
private static String createConfirmationMessage(VirtualFile[] filesToDelete) {
if (filesToDelete.length == 1) {
if (filesToDelete[0].isDirectory())
return "Are you sure you want to delete this folder?\n" + filesToDelete[0];
else return "Are you sure you want to delete this file?\n" + filesToDelete[0];
} else {
boolean hasFiles = false;
boolean hasFolders = false;
for (VirtualFile file : filesToDelete) {
boolean isDirectory = file.isDirectory();
hasFiles |= !isDirectory;
hasFolders |= isDirectory;
}
LOG.assertLog(hasFiles || hasFolders, "Assertion failed.");
if (hasFiles && hasFolders) return "Are you sure you want to delete selected files and directories?";
else if (hasFolders)
return "Are you sure you want to delete selected directories?";
else return "Are you sure you want to delete selected files?";
}
}
}
}