package com.igormaznitsa.ideamindmap.lang.refactoring; import com.igormaznitsa.ideamindmap.lang.psi.PsiExtraFile; import com.igormaznitsa.ideamindmap.utils.IdeaUtils; import com.igormaznitsa.mindmap.model.MMapURI; import com.igormaznitsa.mindmap.model.MindMap; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.util.FileContentUtil; import javax.annotation.Nonnull; import java.io.File; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.net.URI; import java.util.Collections; public final class RefactoringUtils { private RefactoringUtils(){ } public static MMapURI makeNewMMapUri(@Nonnull final Project project, @Nonnull final MMapURI oldFile, @Nonnull VirtualFile newFile){ final File projectFolder = IdeaUtils.findProjectFolder(project); if (projectFolder == null) throw new NullPointerException("Project folder is not found for "+project); URI baseURI = VfsUtil.toUri(newFile); if (baseURI.isAbsolute()) { final URI projectURI = VfsUtil.toUri(projectFolder); baseURI = projectURI.relativize(baseURI); } return MMapURI.makeFromFilePath(projectFolder, baseURI.toString(), oldFile.getParameters()); } @Nonnull public static String replaceMMUriToNewFile(@Nonnull final PsiExtraFile mindMapFile, @Nonnull final MMapURI oldFile, @Nonnull final MMapURI newFile) throws IOException { final File projectFolder = IdeaUtils.findProjectFolder(mindMapFile); if (projectFolder == null) throw new NullPointerException("Project folder is not found for "+mindMapFile); final MindMap parsedMap = new MindMap(null,new StringReader(mindMapFile.getContainingFile().getText())); parsedMap.replaceAllLinksToFile(projectFolder, oldFile, newFile); return parsedMap.write(new StringWriter(16384)).toString(); } public static void reparseFile (final PsiFile file) { ApplicationManager.getApplication().runReadAction(new Runnable() { @Override public void run() { FileContentUtil.reparseFiles(file.getProject(), Collections.singletonList(file.getVirtualFile()), true); } }); } }