package com.thoughtworks.gauge.extract;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.thoughtworks.gauge.extract.stepBuilder.StepsBuilder;
import com.thoughtworks.gauge.undo.UndoHandler;
import gauge.messages.Api;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class ExtractConceptHandler {
private StepsBuilder builder;
private PsiFile psiFile;
private Editor editor;
public void invoke(@NotNull final Project project, @NotNull final Editor editor, @NotNull final PsiFile psiFile) {
this.psiFile = psiFile;
this.editor = editor;
try {
List<PsiElement> steps = getSteps(this.editor, this.psiFile);
if (steps.size() == 0)
throw new RuntimeException("Cannot Extract to Concept, selected text contains invalid elements");
ExtractConceptInfoCollector collector = new ExtractConceptInfoCollector(editor, builder.getTextToTableMap(), steps, project);
ExtractConceptInfo info = collector.getAllInfo();
if (!info.cancelled) {
VirtualFileManager.getInstance().refreshWithoutFileWatcher(false);
FileDocumentManager.getInstance().saveAllDocuments();
Api.ExtractConceptResponse response = makeExtractConceptRequest(steps, info.fileName, info.conceptName, false, psiFile);
if (!response.getIsSuccess()) throw new RuntimeException(response.getError());
new UndoHandler(response.getFilesChangedList(), project, "Extract Concept").handle();
}
} catch (Exception e) {
Messages.showErrorDialog(e.getMessage(), "Extract To Concept");
}
}
private Api.ExtractConceptResponse makeExtractConceptRequest(List<PsiElement> specSteps, String fileName, String concept, boolean refactorOtherUsages, final PsiFile element) {
PsiElement firstStep = specSteps.get(0);
int startLine = StringUtil.offsetToLineNumber(psiFile.getText(), firstStep.getTextOffset()) + 1;
PsiElement lastStep = specSteps.get(specSteps.size() - 1);
int endLine = StringUtil.offsetToLineNumber(psiFile.getText(), lastStep.getTextOffset() + lastStep.getTextLength());
Api.textInfo textInfo = gauge.messages.Api.textInfo.newBuilder().setFileName(psiFile.getVirtualFile().getPath()).setStartingLineNo(startLine).setEndLineNo(endLine).build();
ExtractConceptRequest request = new ExtractConceptRequest(fileName, concept, refactorOtherUsages, textInfo);
request.convertToSteps(specSteps, builder.getTableMap());
return request.makeExtractConceptRequest(element);
}
private List<PsiElement> getSteps(Editor editor, PsiFile psiFile) {
builder = StepsBuilder.getBuilder(editor, psiFile);
return builder.build();
}
}