package com.igormaznitsa.ideamindmap.lang.refactoring.references.providers;
import com.igormaznitsa.ideamindmap.lang.psi.PsiExtraFile;
import com.igormaznitsa.ideamindmap.lang.refactoring.RefactoringUtils;
import com.igormaznitsa.mindmap.model.MMapURI;
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.util.TextRange;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileSystemItem;
import com.intellij.psi.PsiReferenceBase;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.util.IncorrectOperationException;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.io.IOException;
public class PsiExtraFileReference extends PsiReferenceBase<PsiExtraFile> {
private final PsiExtraFile extraFile;
private final TextRange range;
public PsiExtraFileReference (PsiExtraFile extraFile, TextRange range) {
super(extraFile, true);
this.extraFile = extraFile;
this.range = range;
}
@Override public TextRange getRangeInElement() {
return range;
}
@Nullable @Override public PsiElement resolve() {
final VirtualFile theFile = this.getElement().findTargetFile();
if (theFile == null) {
return null;
}
else {
return PsiManagerEx.getInstance(this.getElement().getProject()).findFile(theFile);
}
}
public void retargetToFile(final PsiFileSystemItem file) {
final MMapURI oldUri = extraFile.getMMapURI();
try {
final MMapURI newUri = RefactoringUtils.makeNewMMapUri(extraFile.getProject(),oldUri,file.getVirtualFile());
final String packedNewMindMap = RefactoringUtils.replaceMMUriToNewFile(extraFile, oldUri, newUri);
final PsiFile containingFile = extraFile.getContainingFile();
final Document document = FileDocumentManager.getInstance().getDocument(containingFile.getVirtualFile());
CommandProcessor.getInstance().executeCommand(containingFile.getProject(), new Runnable() {
@Override
public void run() {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
final String packedMindMap = packedNewMindMap;
document.setText(packedMindMap);
FileDocumentManager.getInstance().saveDocument(document);
}
});
}
}, null, null, document);
extraFile.setMMapURI(newUri);
}
catch (IOException ex) {
throw new IncorrectOperationException("Can't update links in mind map",(Throwable)ex);
}
}
@Override public PsiElement bindToElement(@Nonnull final PsiElement element) throws IncorrectOperationException {
return this.extraFile;
}
@Nonnull @Override public Object[] getVariants() {
return new Object[0];
}
}