package com.thoughtworks.gauge.undo;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.openapi.vfs.encoding.EncodingManager;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.intellij.openapi.vfs.LocalFileSystem.getInstance;
public class UndoHandler {
private final List<String> fileNames;
private final Project project;
private final String name;
public UndoHandler(List<String> fileNames, Project project, String name) {
this.fileNames = fileNames;
this.project = project;
this.name = name;
}
public void handle() {
refreshFiles();
runWriteAction();
}
private void refreshFiles() {
final Map<Document, String> documentTextMap = new HashMap<>();
for (String fileName : fileNames) {
VirtualFile fileByIoFile = LocalFileSystem.getInstance().findFileByIoFile(new File(fileName));
if (fileByIoFile != null) {
Document document = FileDocumentManager.getInstance().getDocument(fileByIoFile);
if (document != null) documentTextMap.put(document, document.getText());
}
}
VirtualFileManager.getInstance().refreshWithoutFileWatcher(false);
ApplicationManager.getApplication().runWriteAction(() -> {
for (Document document : documentTextMap.keySet())
document.setText(documentTextMap.get(document));
});
}
private void runWriteAction() {
ApplicationManager.getApplication().runWriteAction(() -> {
CommandProcessor.getInstance().executeCommand(project, () -> performUndoableAction(fileNames), name, name);
});
}
private void performUndoableAction(List<String> filesChangedList) {
for (String fileName : filesChangedList)
try {
VirtualFile virtualFile = getInstance().findFileByIoFile(new File(fileName));
if (virtualFile != null) {
Document document = FileDocumentManager.getInstance().getDocument(virtualFile);
getInstance().refreshAndFindFileByIoFile(new File(fileName));
if (document != null)
document.setText(StringUtils.join(FileUtils.readLines(new File(fileName), EncodingManager.getInstance().getEncoding(virtualFile, true)).toArray(), "\n"));
}
} catch (Exception ignored) {
}
}
}